Jump ESP, jump!: 恶意软件持久化的多种方式(那些你一直不敢问的技术)
TL;DR:
如果你是红队成员?需要持久化?这篇文章不长,读一下吧!
如果你是蓝队成员?需要找出那些讨厌的后门?这篇文章不长,读一下吧!
在上一篇文章中,我列出了Windows域/林被后门化的不同方式。在这篇新文章中,我将深入探讨,列出恶意软件仅利用受感染Windows系统的本地资源在重启后存活的最常见/已知方式。这个列表远非完整,我鼓励大家评论这里尚未列出的新方法。
从事件响应的角度来看,在可疑系统上查找恶意软件的最佳策略之一是搜索随系统启动的可疑条目。在过去,你只需检查2-3个位置就能覆盖99%的感染。如今,恶意软件的启动方式有上千种。常见的方式是在Windows启动时(或用户登录时)自动启动,但一些狡猾的方式是由其他事件触发的。
Autoruns
在恶意软件持久化方面,我最喜欢的选择是Sysinternals工具Autoruns。在本段中,我主要引用官方的内置帮助,但请耐心听我说,它仍然很有趣。
顺便说一下,Autoruns工具有一些问题:它只能在实时系统上运行。(编辑:这是不正确的,Autoruns也可以分析离线系统!感谢Justin的评论。)通常情况并非如此——我通常有dd镜像。虽然VBoxManage可以将dd镜像转换为VirtualBox磁盘镜像格式,但通常我没有时间和存储空间来做这件事。这时xmount的强大功能就来拯救这一天了。它可以将dd和Encase镜像即时在内存中转换为Virtualbox格式。只需将磁盘镜像作为主启动硬盘附加到新的Virtualbox机器上,修改CPU/磁盘/控制器设置,直到Windows启动而不是崩溃,瞧,你就可以启动你的取证镜像了——而无需对原始证据dd文件进行任何修改。在实时系统上进行恶意软件分析的另一个问题是,一个好的rootkit可以轻易欺骗分析员。
为了快速取胜,我通常过滤掉Microsoft条目,只查看每用户位置,并检查未验证(缺少或无效的Authenticode)可执行文件。这通常有助于轻松找到90%的恶意软件。特别是如果它有紫色或粉红色的颜色,那就非常可疑。要找到其余的,嗯,必须深入挖掘。
宙斯“隐藏”在通常的随机目录中——检查伪造的时间戳
要实现“穷人监控”,定期保存Autoruns的输出,在事件响应期间,这将非常有价值。操作方法指南在这里。
登录
“此条目导致扫描标准自动启动位置,例如当前用户和所有用户的启动文件夹、运行注册表键和标准应用程序启动位置。”
目前Autoruns中有42个注册表键/文件夹可用于自动启动恶意软件。最常见的方式是HKCU\Software\Microsoft\Windows\CurrentVersion\Run和C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup文件夹。
关于这个主题,我最喜欢的是无文件的Poweliks恶意软件,100%纯awesome。典型的ring 3代码执行。
资源管理器
“选择此条目以查看资源管理器shell扩展、浏览器帮助对象、资源管理器工具栏、活动设置执行和shell执行钩子”。71个注册表键,OMG。通常这不是关于自动恶意软件执行,但其中一些可能是隐藏恶意软件的好地方。
Internet Explorer
“此条目显示浏览器帮助对象(BHO)、Internet Explorer工具栏和扩展”。这里有13个注册表键。如果恶意的BHO安装到你的浏览器中,你就完蛋了。
计划任务
“配置为在启动或登录时启动的任务计划程序任务。”不常用,但查看这一点很重要。
我一直认为自动启动条目的这一部分相当无聊,但如今,我认为它是隐藏恶意软件的最佳方式之一。这里默认有这么多条目,其中一些可以使用相当好的技巧来触发启动。
你知道你可以创建自定义事件在Windows事件日志上触发吗?
你知道你可以仅使用Windows工具如bitsadmin和计划任务来创建恶意软件持久化吗?
旧日的调度程序
新日的调度程序
服务
HKLM\System\CurrentControlSet\Services是一个非常常见的地方来隐藏恶意软件,尤其是rootkit。特别仔细地检查所有条目。
驱动程序
与服务相同。rootkit非常常见的地方。不幸的是,为64位系统签署驱动程序不再有趣,因为它必须由可以链接回“软件发布者证书”的证书签署。Ring 0 rootkit的典型启动位置。
从Windows 10开始,甚至这一点也会改变,所有驱动程序都必须由“Windows硬件开发者中心门户”和EV证书签署。
编解码器
22个注册表键。不常见,但可能代码执行。
启动执行
“在本机映像(与Windows映像相对)在启动过程早期运行。”这里有5个注册表键。隐藏rootkit的好地方。
映像劫持
“映像文件执行选项和命令提示符自动启动。”这里有13个注册表键。我相信这最初是为了调试目的。
这就是老式的粘滞键技巧隐藏的地方。它与其他方式有点不同,因为它提供了后门访问,但你只能从本地网络(通常)使用它。技巧是在有人登录RDP之前多次按下SHIFT键时执行你的代码。旧的方法是替换sethc.exe,新的乐趣是在sethc上设置调试程序。
如果你看到这个,你就有麻烦了
AppInit
“这有Autoruns显示注册为应用程序初始化DLL的DLL。”这里只有3个注册表键。这是将恶意DLL注入资源管理器、浏览器等的旧方法。幸运的是,它很快就会被弃用。
已知DLL
“报告Windows加载到引用它们的应用程序中的DLL的位置。”只有1个注册表键。这可能用于劫持一些系统DLL。
Winlogon
“显示注册用于Winlogon登录事件通知的DLL。”7个注册表键。有时被恶意软件使用。
Winsock提供程序
“显示注册的Winsock协议,包括Winsock服务提供程序。恶意软件通常将自己安装为Winsock服务提供程序,因为很少有工具可以删除它们。Autoruns可以禁用它们,但不能删除它们。”4个注册表键。AFAIK这曾经很流行。但仍然,是隐藏恶意软件的好地方。
打印监视器
“显示加载到打印假脱机服务中的DLL。恶意软件曾使用此支持自动启动自身。”1个注册表键。一些恶意软件作者在隐藏其持久化模块时非常有创意。
LSA提供程序
“显示注册本地安全机构(LSA)身份验证、通知和安全包。”5个注册表键。隐藏你的密码窃取器的好地方。
网络提供程序
“缺少文档”。如果你有好的1句文档,请评论。
WMI过滤器
“缺少文档”。查看Mandiant获取详细信息。
边栏小工具
感谢上帝MS不久前禁用了这个:)
我们都想念你,你这糟糕的资源吞噬噩梦
常见方式 - 不在autoruns中
现在,让我们看看启动恶意软件的其他可能性,这些不会在Sysinternals Autoruns中列出。
后门化可执行文件/DLL
只需更改要么自动启动要么用户通常启动的可执行文件的代码。为避免低级错误,禁用文件的更新…后门工厂是此任务的好来源。但如果你后门化一个已经在Autoruns中列出的可执行文件/DLL,你将破坏文件上的数字签名。建议签署你的可执行文件,如果你负担不起窃取受信任证书的费用,你仍然可以将自己的CA导入用户的受信任证书存储(具有用户权限),它将看起来像受信任的。专业提示:使用“Microsoft Windows”作为代码签名CA,你的可执行文件将融入其中。
看,rootkit.exe看起来完全合法,当有人过滤“隐藏Windows条目”时它会被过滤掉。
劫持DLL加载顺序
只需将你的DLL放入在找到原始DLL之前搜索的目录中,然后获利!但再次,为避免低级检测,确保将合法函数调用代理到原始DLL。关于此主题的好来源来自Mandiant和DLL劫持检测器。
在这里你可以看到PlugX如何运作,通过删除合法的卡巴斯基可执行文件,并用他们的DLL劫持DLL调用。
劫持桌面/开始菜单的快捷方式
永远不要低估低级技巧的力量。只需创建一个调用原始可执行文件的可执行文件,同时启动你的后门。替换链接,获利!不要做脚本小子,检查图标;)我在广告软件劫持浏览器中多次看到这个技巧。
IE被劫持以http://tinyurl.com/2fcpre6启动
文件关联劫持
选择用户最喜欢的文件类型,用类似前一节中描述的程序替换处理打开的程序,瞧!
COM对象劫持
主要思想是,一些COM对象被扫描是否在系统上,当它注册时,它会自动加载。有关详细信息,请参见COMpfun。
Windows应用程序兼容性 - SHIM
没有多少人熟悉Windows应用程序兼容性及其工作原理。将其视为应用程序和操作系统之间的附加层。如果应用程序匹配某个条件(例如文件名),将发生某些操作。例如,目录模拟、注册表条目、DLL注入等。在我的安装中,有367种不同的兼容性修复(兼容性类型“模拟”),其中一些可以自定义。
每次IE启动时,将DLL注入IE
启动工具包
尽管这里显示的启动工具包最终可能出现在Autoruns的驱动程序部分(因为它们可能最终需要驱动程序),我仍然认为它值得一个不同的部分。
MBR - 主引导记录
恶意软件可以覆盖主引导记录,用自己的代码启动引导过程,并继续使用原始引导过程。rootkit伪造MBR记录的内容并显示原始内容是很常见的。这意味着只需将受感染的硬盘连接到干净的系统,并将前512字节(或在某些情况下更多)与已知的干净状态进行比较,或与从受感染操作系统显示的内容进行比较。SecureBoot可用于防止此类恶意软件感染。
从受感染操作系统查看MBR与从干净操作系统查看有轻微差异
VBR - 卷引导记录
这是恶意软件可以启动其过程的下一步逻辑步骤,一些恶意软件/rootkit更喜欢将其启动代码隐藏在这里。有关详细信息,请查看GrayFish。SecureBoot可用于防止此类恶意软件感染。
BIOS/UEFI恶意软件
旧的BIOS和新的UEFI都可以以恶意软件在操作系统有机会运行之前启动的方式修改。尽管UEFI旨在比BIOS更安全,但实现和设计错误会发生。有关详细信息,请查看Computrace反盗窃rootkit。
虚拟机监控程序 - Ring -1 rootkit
这有些特殊,因为我相信尽管rootkit可以在此层运行,但它不能仅在此层在平均物理机器上持久化,因为它无法在重启后存活。参见Rutkowska 2006年的演示。但由于虚拟机监控程序可以拦截重启事件,它可以将其自身写入其他层之一(例如安装公共内核驱动程序),并在重启后完全功能后简单地删除它。更新:Igor Korkin有一篇关于虚拟机监控程序检测的好论文在这里。
SMM(系统管理模式)恶意软件 - Ring -2 rootkit
某种程度上与前一类型的攻击相关,但没有多少人知道系统管理模式可用于将代码注入操作系统。有关更多详细信息,请查看DEITYBOUNCE恶意软件;)此外,滥用Intel双监视器模式(DMM)可能导致不受信任的代码执行,这基本上监视SMM模式。
Intel®主动管理技术 - Ring -3 rootkit
根据维基百科,“Intel主动管理技术(AMT)是一种用于个人计算机远程带外管理的硬件和固件技术,以便监控、维护、更新、升级和修复它们”。你可能会问,可能出什么问题?参见Alexander Tereshkin和Rafal Wojtczuk关于此的伟大研究,或Vassilios Ververis关于AMT的论文。
由于没有多少人点击链接,让我引用关于AMT的可怕内容:
- 独立于主CPU
- 可以通过DMA访问主机内存(有限制)
- 专用链接到NIC及其过滤功能
- 可以随时强制主机操作系统重启(并从模拟的CDROM引导系统)
- 在S3睡眠中仍然活动!
其他东西
创建新用户,更新现有用户,隐藏管理员
有时甚至不需要向系统添加恶意代码,因为有效的用户凭据就足够了。要么现有用户可以用于此目的,要么可以创建新用户。例如,一个好技巧是使用具有500 RID的支持帐户 - 参见这里,Metasploit工具这里。
深奥的固件恶意软件
计算机中几乎任何组件都运行固件,通过用恶意固件替换固件,可以启动恶意软件。例如,硬盘固件(再次参见GrayFish)、显卡等。
隐藏的启动设备
恶意软件可以隐藏在被检查的启动设备之一中,在平均操作系统加载之前,并在恶意软件加载后,它可以加载受害者操作系统。
网络级后门
考虑以下场景:每次操作系统启动时,它从网络加载附加数据。它可以检查新的软件更新、配置更新等。每当有漏洞的软件/配置更新时,恶意软件将自身注入响应中,并被执行。我知道,这种级别的持久性并非万无一失,但仍然可能。想想最近发现的GPO MiTM攻击、Evilgrade工具,甚至当我们在谈论VM迁移时的Xensploit工具。
软件漏洞
几乎任何类型的软件漏洞都可以用作持久后门。特别是,如果漏洞可以通过网络远程访问,无需任何用户交互。老好的MS08-067…
硬件恶意软件,内置到芯片组中
我不确定在这里写什么。向你当地的间谍机构询问更多信息。祝你好运找到那些!
更多链接
我强烈推荐的工具:
- Sysinternals Autoruns
- GMER
- DLL劫持检测器
- PCHunter
- Mandiant Redline
- Volatility
- Kansa
有关更多信息,请查看此博客文章,第1部分,第2部分
更新2017-04-29:一个非常好的Office持久化列表:https://labs.mwrinfosecurity.com/blog/add-in-opportunities-for-office-persistence/
更新2017-10-23:通过安全描述符和ACL的持久化:https://www.youtube.com/watch?v=SeR4QJbaNRg
更新2018-07-25:后门化LAPS https://rastamouse.me/2018/03/laps---part-1/ https://rastamouse.me/2018/03/laps---part-2/
我要感谢CrySyS Lab的Gabor Pek审阅和完成这篇文章。