ShellWasp利用系统调用创建shellcode工具

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/Bw3ll/ShellWasp

ShellWasp

ShellWasp是一个新的工具,可以方便地利用系统调用创建shellcode,在2022年8月12日的DEF CON 30上发布。它也将很快在2022年11月的中东和非洲黑帽大会上进行介绍。它可能会在那时或不久之后发布一些更多的系统调用shellcodes样本。

ShellWasp可以自动构建系统调用shellcode的模板。模板的目的仅仅是--一个模板。用户仍然必须确定使用什么参数值以及如何生成它们。其目的是为了简化那些需要手工创建系统调用shellcode的人的过程。支持几乎所有的用户模式系统调用,包括我可以找到的所有函数原型。ShellWasp还解决了syscall的可移植性问题。它使用32位PEB来识别操作系统的构建。ShellWasp创建了一个系统调用数组,允许在运行时找到当前的系统调用值(SSN),而不是硬编码,这可能会限制你在不同的操作系统构建中使用它们。ShellWasp负责管理系统调用数组,因此如果一个系统调用被多次使用,在系统调用数组中就只有一个条目。因此,ShellWasp将允许动态地获得系统调用值(SSN)。

ShellWasp支持Windows 7/10/11。它既使用现有的系统调用表,也为较新版本的Windows 10和11新创建的系统调用表。这些都是通过一个原始过程创建的,解析WinDbg结果。值得注意的是,我的研究表明,在较新的操作系统构建中,一些系统调用不再以1递增,因此ShellWasp利用了JSON格式的预计算系统调用表。

ShellWasp创建的shellcode大小相对较小。用户可以选择支持的操作系统构建,建议也许只使用Windows 7/10/11中的一些最新的构建,而不是所有可能的构建。这可以帮助保持规模更易于管理。此外,调用系统调用的方式与Windows 7和Windows 10/11不同。ShellWasp会根据用户的选择自动处理这些问题。使用我们的技术,我们已经创建了能在所有三个操作系统上工作的系统调用shellcode。

使用ShellWasp

ShellWasp生成的汇编大小紧凑。此外,由于许多人有自动的Windows更新,它可能只选择较新的操作系统构建,而不是每个可能的构建,这也有助于减少尺寸。用户可以轻松快速地重新安排syscalls在shellcode中。

ShellWasp目前只支持Windows 7/10/11,这是一个设计上的选择。通过配置文件或用户界面来选择所需的Windows版本是很容易的。更改也可以被保存到配置中。

f64701b472212408

628ddbcb9b212420

用法

通过 GitHub 下载并在命令行上运行,例如py shellWasp.py

可以将所选操作系统构建/发布以及 Windows 系统调用的所需设置添加到配置文件中。它们也可以在 UI 中添加或更改。

更新

2022 年 11 月 1 日,添加了对 Windows 10 22H2 和 Windows 11 22H2 的支持。这些是最新的 Windows 版本。注意:我们不支持 Insider 预览版本,也不支持服务器。

2022 年 11 月 1 日,保存指向系统调用数组的指针的机制已更改。在使用多个 Windows 系统调用链测试 shellcode 时,注意到堆栈上的值存在一些稳定性问题。为了避免这些问题,决定将堆栈清理 ( add esp, 0xXX) 和pop edi, 更改为mov edi, [esp+0xYY]- YY 是从堆栈中“清理”的字节数。这push edi下面的内容被保留。ShellWasp 在 edi 维护一个指向 syscall 数组的指针,并且由于实际的 syscall 本身会破坏 edi 中包含的值,因此在从远跳转返回到内核模式之后,需要有一种方法来恢复它。人们认为这个新的大会将是实现这一目标的更稳定的方式。当然,另一种选择可能是将指向系统调用数组的指针存储在 ebp 或其他内存的某个位置,然后可用于恢复 EDI。这在某些方面会更简单,因为可以避免需要计算返回的字节数。不过,当时感觉mov edi, [esp+0xYY]对新手来说会更安全。如果它存储在内存中某个固定位置的其他位置(例如堆栈),则可能会意外覆盖它。这两种方法都需要最少的时间和精力。

安装

提供了一个安装文件以帮助确保安装正确的库。要设置 ShellWasp,只需使用以下命令:py setup.py install

您可以根据需要将py替换为python 。这将确保安装了 Colorama 和 keystone-engine。Keystone 用于编译程序集,确保它是有效的程序集。但是,当前不显示生成的字节,因为 ShellWasp 旨在生成模板,其参数需要自定义。这可能会在将来作为可选设置启用。

如果您不想使用 setup.py 文件,您也可以手动安装它们。pip install keystone-engine并可pip install colorama用于该目的。

快来了

我将发布一个脚本,它可以在 WinDbg 中用于确定给定版本的 SSN(系统调用值)。支持脚本可用于将其转换为 Python 字典/json。总而言之,这需要几分钟的努力,尽管您必须在尝试从中提取值的操作系统上安装 WinDbg,并且它不应受到 EDR 的影响。这些脚本需要在发布之前进行清理。请注意,我发现系统调用值 (SSN) 在排序后不再是可预测的,这使得一些领先的系统调用技术背后的一些基本概念并不总是可靠的,正如 DEFCON 所解释的那样。这是一个相对较新的发展,我没有看到任何讨论。许多 SSN 确实是可预测的,但也有许多是绝对不可预测的,有些则以相当具有欺骗性的方式(如果截断它可能看起来是可预测的!)。同样,这将导致一些流行的技术并不总是按预期工作。在我看来,这似乎是微软的一项缓解工作。因此,使用预先计算的值似乎最可靠。在查看一些解析 NTDLL 的工具时,我注意到产生的结果不准确。我确定原因是它截断了 SSN。它会将其从 DWORD 截断为 WORD,从而截断部分值。这似乎也是一种可能的缓解措施。是的,一些 SSN 现在有几位数长。解决方案相对简单 - 使用调试器,如 WinDbg,并编写过程脚本,这样可以避免错误。我没有对这些只解析 NTDLL 的系统调用工具进行详尽的研究。我只是注意到我正在使用的一个结果不准确,我知道我可以很快写出一些东西,这将保证没有错误。Ultimatley,我创建的只是一个快速脚本,用于帮助为 ShellWasp 的新版本获取准确的 SSN。如果他们希望将其用于自己的系统调用工具或与系统调用相关的目的,欢迎其他人自己使用它。

标签:工具分享, 主机安全, shellcode生成工具