导语:没有任何逆转、取证,漏洞利用是不能通过分析源代码完成的。所以,如果你想找到新的持久性技巧,就需要分析有可能利用的任何代码,并找出其中的工作原理。

在我使用Process Monitor(Procmon)系统监测工具分析VB应用程序时,我总是看到HKLM\SOFTWARE\Microsoft\VBA\Monitors输入的内容。由于缺乏经验,我无法解释这些是什么内容,谷歌搜索也没有带来任何答案。最后,我开始分析触发该行为的实际代码

很明显,其中有一些代码是手动操作的结果,这样代码分析时就非常的耗时。有时我几个月都找不到我想要的内容。这使我经常怀疑我提出的问题是不是有瑕疵,不过最近的一个案例,让我又重新找回了信心。在查看kernel32.dll中的一些不相关的内容时,我偶然发现了加载回调DLL的位。虽然kernel32.dll是电脑中非常重要的动态链接库文件,大家都在用,但我仍然认为其中还有可以利用的漏洞。另外,还有许多其他案例,例如,我描述的许多持久性机制依赖于我持之以恒的研究,才最终发现某些程序或组件加载了许多DLL,这些DLL在它们被列在注册表中的某个位置之后逐个执行。此类活动需要依赖Registry枚举API。如果你可以找到使用这些函数的程序或DLL,你很可能会找到可能的持久性机制!

然后还可以利用例如'providers'的关键字,这是一种非常流行的方法,用来命名注册表中的位置,许多插件都是从这里加载的。以下是一些包含关键字' provider '的输入项可能枚举的示例:

· SYSTEM\CurrentControlSet\Control\Cryptography\Providers

· System\CurrentControlSet\Control\SecurityProviders\SSI\Providers

· SYSTEM\CurrentControlSet\Services\LanmanServer\ShareProviders

· System\CurrentControlSet\Services\RemoteAccess\Accounting\Providers

· System\CurrentControlSet\Services\RemoteAccess\Authentication\Providers

· SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders

· SYSTEM\CurrentControlSet\Services\WbioSrvc\Service Providers

· SYSTEM\CurrentControlSet\Services\Winsock\Setup Migration\Providers

· System\CurrentControlSet\Services\WinTrust\TrustProviders

· System\CurrentControlSet\Services\WlanSvc\Parameters\ComInterfaceProviders

· System\CurrentControlSet\Services\WlanSvc\Parameters\VendorSpecificIEProviders

还有就是利用Microsoft文档来寻找可持续攻击的方式,它就像一个用于Windows编程的RFC。目前,我为Windows编程了10多年,关于DDE、WM_HTML_GETOBJECT和Propagate trick (SetProp)的一些技巧和经验,也积攒了不少。这为我寻找可持续攻击的方式,提供了大量资源。

最后就是仔细分析API,如果你阅读代码并查看对ShellExecute,WinExec,CreateProcess,LoadLibrary,CoCreateInstance及其众多变体和包装器的引用,你很快就会发现Windows生态系统几乎不会重复使用代码;或者更准确地说,它虽然不会重复使用代码,但确实重复使用了很多相关数据,比如依赖于添加到它的许多自定义路径。老实说,你遇到的大量代码片段看起来像是编程人员的自定义编程工作,编写该部分程序只是为了测试某个想法而已。在这样的代码海洋中,它实际上是一种正常的,甚至是预期的行为。但是坦率的说,我真的要感谢微软程序员提供的所有测试和调试代码以及操作系统附带的错误消息或字符串,在寻找持久化攻击方式时这有很大帮助!

所有这些意想不到的或可能是私有的及只针对实验室的代码路径都提供了许多有趣的攻击机会,特别是对于持久性攻击来说,任何一个敢于去寻找的人最终都会找到一些有价值的东西。

在发现漏洞的过程中,其实找到持久性攻击方式只是顺带的事情,即使有时有些技术非常奇特,但对我来说真正的快乐来自于以下这三件事:

1.有机会阅读别人的代码,提高我的逆向工程技能;

2.了解系统的工作原理;

3.在取证分析方面处于优势地位;

在阅读像内存取证或Windows内部结构控制这样的书籍时,这些作者所依赖的大部分信息都是直接或间接操作实际系统内部的。而这些操作之所以能成功,很大一部分原因是因为,许多开发这些系统的工作人员自己转身成了安全研究员,这其中就有利用已知的源代码之嫌,或者也可以称之为源代码泄露。所以就会出现,他们只有在程序运行的某个阶段中才可以访问源代码,并且在某个时间段内它们是可以利用他们以前的特权所带来的好处的。但我想说,大多数发现都是在很多会议上发表的,其中一些书籍和博客上介绍的技术都是30年以前的了。 

目前有许多开发人员会习惯性的抱怨某些API有着不可预测的漏洞,但却往往无法解释这种行为背后的确切原因。在我看来,就是要抛弃原有的代码认知,重新挖掘代码,这个能力是任何一个合格程序员的核心技能。没有任何逆转、取证,漏洞利用是不能通过分析源代码完成的。

所以,如果你想找到新的持久性技巧,就需要分析有可能利用的任何代码,并找出其中的工作原理。

源链接

Hacking more

...