异常处理程序覆盖曾经是利用堆栈缓冲区溢出的一种非常流行的技术,但在新程序中不再那么常见,因为它们很可能是用SafeSEH编译的。有一点,即使在启用了SafeSEH的情况下,仍然有可能通过堆喷来滥用异常处理程序,但是当然,内存保护并不止于此。DEP/ASLR最终来拯救,所以几乎结束了SEH漏洞的辉煌岁月。您可能仍然可以找到不利用SafeSEH编译的易受攻击的应用程序,但是该应用程序可能已经过时,不再维护,或者它更像是开发人员的学习实验。哦,这可能已经是一个漏洞了。尽管如此,利用异常处理来利用堆栈缓冲区溢出还是有趣的,所以如果你遇到它,使用`Seh` mixin
### 要求
为了能够使用SEH mixin,必须满足一些可利用的需求:
* 易受攻击的程序没有SafeSEH
* 没有DEP(数据执行保护)。mixin使用短暂的跳转来执行有效载荷,这意味着内存必须是可执行的。正如名字所暗示的,DEP阻止了这一点。
### 示例
首先,确保你在你的模块的`Metasploit3`类的范围内包含了 `Seh` mixin
~~~
include Msf::Exploit::Seh
~~~
接下来,您需要`Ret`来为SE处理程序设置一个地址。这个地址应该放在你的模块的元数据中,具体在下面的`Targets`。在Metasploit中,每个目标实际上是一个由两个元素组成的数组。第一个元素只是目标的名称(目前没有严格的命名风格),第二个元素实际上是一个字典,其中包含特定于该目标的信息,例如目标地址。以下是设置Ret地址的示例:
~~~
'Targets' =>
[
[ 'Windows XP', {'Ret' => 0x75022ac4 } ] # p/p/r in ws2help.dll
]
~~~
正如你所看到的,记录Ret地址的作用以及指向那个DLL 也是一个好习惯。
Ret实际上是一种特殊的key,因为它可以通过`target.ret`在模块中使用。在我们的下一个例子中,你会看到`target.ret`被用来代替原始目标地址的编码。
如果您需要一个工具来为ret地址 查找POP/POP/RET,你能使用metasploit的`msfbinscan`工具,它位于tools目录下.
好的,现在我们来看看这些方法。`Seh` mixin 提供了两种方法:
* `generate_seh_payload` - 生成一个虚假的SEH记录,并在之后附上有效载荷。这是一个例子:
~~~
buffer = ''
buffer << "A" * 1024 # 1024 bytes of padding
buffer << generate_seh_payload(target.ret) # SE record overwritten after 1024 bytes
~~~
buffer内存中的实际布局应该是这样的:
~~~
[ 1024 bytes of 'A' ][ A short jump ][ target.ret ][ Payload ]
~~~
* `generate_seh_record` - 在没有有效载荷的情况下生成假SEH记录,以防您想将有效载荷放置在其他地方。代码示例:
~~~
buffer = ''
buffer << "A" * 1024 # 1024 bytes of padding
buffer << generate_seh_payload(target.ret)
buffer << "B" * 1024 # More padding
~~~
内存布局应该是这样的:
~~~
[ 1024 bytes of 'A' ][ A short jump ][ target.ret ][ Padding ]
~~~
### 参考
https://www.corelan.be/index.php/2009/07/25/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-3-seh/
https://github.com/rapid7/metasploit-framework/blob/master/lib/rex/exploitation/seh.rb
https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/exploit/seh.rb
- Home
- 开始使用
- 安装metasploit开发环境
- 使用metasploit
- 使用git
- 报告一个bug
- 贡献代码
- 贡献给metasploit
- 创建一个loginscans Metasploit模块
- 接受模块和增强功能的指导
- 常见的Metasploit模块代码错误
- 样式提示
- metasploit提交者
- metasploit开发
- 为什么是ruby
- 样式提示
- 如何开始写一个exploit
- 如何开始写一个辅助模块
- 如何开始写一个post模块
- 如何开始写一个Meterpreter脚本
- 载入外部模块
- exploit rank
- Metasploit模块引用标识符
- 怎么在你的exploit中确认window补丁程序级别
- 如何使用filedropper清理文件
- 如何弃用metasploit模块
- 如何在模块开发中报告或储存数据
- 在metasploit如何使用日志
- 如何在metasploit对JavaScript进行混淆
- 如何解析一个http响应
- 如何使用HTTPClient发送HTTP请求
- 如何使用命令阶段
- 如何使用数据储存选项
- 如何在window后期开发中使用railgun
- 如何在exploit中使用powershell
- 如何使用PhpEXE来利用任意文件上传漏洞
- 如何使用FILEFORMAT mixin创建一个文件格式exploit
- 如何使用BrowserExploitServer编写一个浏览器exploit
- 如何使用HttpServer编写浏览器exploit
- 如何编写一个check()方法
- 如何使用Seh mixin来利用异常处理程序
- 如何在Windows上使用WbemExec进行写入权限攻击
- 如何使用httpserver和httpclient编写一个模块
- payloads如何工作
- 如何免杀
- 如何正确使用metasploit模块