01.png

对于用户来说,勒索软件是网络攻击者使用的最可怕的一种武器。据估计,仅在美国,因勒索软件造成的损失就达到了75亿美元,而在加拿大,因勒索软件造成的损失就也达到了23亿美元,毫无疑问,全球都能感受到勒索软件的存在,而造成的损失更是难以估量。

但除了直接和间接的经济损失外,勒索软件还运用了深层的心理犯罪机制来攫取最大利益,这让它区别于其他形式的网络攻击。与其他所有类型的恶意软件相比,勒索软件在发起攻击时并不会隐藏其活动,而是向受害者说明他们已经被攻击,并强迫受害者采取行动(比如支付赎金)。

勒索软件在攻击时准确地利用了受害人的恐惧、认知、是否交赎金的动机和被锁定的资料价值,这些因素都会随着时间的流逝而发生变化,比如有的受害者据直接选择不付赎金,也有受害人会选择安全商,进行异地备份并创建解密器。在本文中,我们将探讨勒索软件的攻击者所使用的心理机制是如何随着时间而发展的,从而攫取最大利益。

使用勒索软件的攻击者要发起心理攻击需要具备什么条件?

勒索软件的基本功能包括初始感染、快速加密和受害者通知,在这种情况下,受害者被告知他们失去了访问数据的权限,为了访问这些数据,受害者必须支付赎金。从心理上讲,罪犯如果要达成目的,需要确保的是:

1. 勒索软件锁定的是受害者的关键数据,且短期内不可破解;

2. 对受害者施加影响,让受害者觉得支付赎金是他们唯一可行的选择;

3. 营造紧迫感:为了最大程度地提高利润,支付赎金的速度至关重要,以免出现破解软件。

自从1989年第一个勒索软件出现以来,索取赎金的方法就在不断的“试验和错误”中不断演变,试图最大限度地提高利润,减少相关的风险。

早期勒索软件索取赎金的方法

第一款勒索软件出现于1989年,哈佛大学毕业的Joseph L.Popp创建,名为“艾滋病信息木马”(AIDS Trojan)。这款勒索软件使用对称加密,解密工具没花多少时间就修复了文件名,但这一举动激发了随后近乎30年的勒索软件工具。据 Popp 本人回忆,1989 年,他设计勒索软件的初衷是为了抗击艾滋病。为了募集抗艾资金,他弄巧成拙,给世界卫生组织论坛的与会代表发送了 20,000 份病毒加密磁盘。当代表们运行磁盘文件时,电脑被冻结,屏幕信息要求汇钱之后才能打开磁盘,取回电脑里的文件。当时,受害者一旦执行恶意软件,该恶意软件就会隐藏文件目录,如果受害者希望解密数据,则需要支付189美元。有报道称,一些医疗机构在遭到AIDS Trojan攻击后,长达10年的研究资料瞬间化为乌有。

像现在的许多勒索软件一样,Popp当时也使用了多种通知受害者的方式,并吓唬和恐吓受害者:

1.jpg

目前勒索软件索取赎金的方法

勒索软件在经历了许多年之后才开始流行,并开始采用其他心理机制。首先被引入的是一种计时器,它倒计时到不久的将来的某一时刻(例如,从感染开始的48小时内),之后文件将被删除,并且完全无法恢复,不管受害者随后是否想要支付赎金。

其实这种倒计时心理机制在营销界已被广泛运用,其目的就是用于营造紧迫感。但是,这种营造的紧迫感往往也会给攻击者自己挖坑,比如许多勒索软件受害者无法在给定的时间内付款,或者因为受害者不知道在这期间该怎么做,或者因和攻击者沟通而浪费了截止日期,以致他们中的许多人错过了截止日期,迫使攻击者执行删除文件或锁定文件的操作。如上所述,虽然倒数计时方法有助于达成攻击的成功率,但对攻击者来说也有不利的一面:就最大限度地攫取利润而言,这并不是很有效,往往无法收取到赎金。现在,新形式的勒索软件现在常常试图通过提供更低的赎金价格来激励受害者,只要受害者支付赎金的速度快,则所交的赎金也越少,反之时间耗的越长,则交的赎金越多。

使用令人害怕的声音和图像来吓唬受害者

虽然利用倒计时和赎金数量会促使受害者采取行动,但使用令人害怕的声音和图像来吓唬受害者也是攻击者使用的重要手段。因为融合了恐怖的视觉效果和令人震惊的声音,会增加攻击效果和赎金的收回概率。

2.jpg

对比其他勒索软件,Cerber勒索软件增加了新的功能。首先,Cerber通过电子邮件附件的形式进入受害者计算机。一旦被打开,就像其他勒索软件一样加密文件并向受害者索要赎金。同时,它会进一步确认计算机联网状态,并将受感染的计算机用于其他目的。例如,实施分布式拒绝服务攻击或作为垃圾邮件程序使用。

Cerber因为其独特的赎金索要通知方式而著称。多数勒索软件通过文字讯息索要赎金,而Cerber却独树一帜,通过语音通知受害人。Cerber勒索软件使用VBScript播放音频消息,并反复声明“注意!你的文档、照片、数据库和其他重要文件已加密!”。

3.jpg

在上图所示的Cerber赎金说明的底部,请注意拉丁文的格言,“默默地向我报价”,翻译成更熟悉的“不会杀死我的东西,会使我变得更坚强”。攻击者为什么选择包含这种坚毅的格言仍然是一个谜。

但是就确保和加快付款速度而言,这种恐吓方法的结果尚无定论。要深入研究勒索软件启动画面中使用的心理机制,请参阅此文

同理心策略

当威胁和恐吓技术不足以促使人们采取行动或至少不够快时,勒索软件攻击者便改变了他们的心理策略。勒索软件的最新示例采用了多种方法,从最初表现出的更大的侵略性(旨在说服人们全额支付而不是进行谈判)到现在充满同情心的“软销售”。

表现出的更大的侵略性的一个很好的例子是Megacotex的赎金记录,它警告受害者不要试图发送部分付款或协商折扣,否则他们将再也看不到他们的数据。2019年5月,发,一种名为MegaCortex的新勒索软件被发现,根据当时的监测情况,MegaCortex已在美国、加拿大等多地区传播,该病毒攻击目标为大型企业,其通过域控服务器下发勒索病毒。

4.png

不过勒索软件的开发者也明白,不同的受害者可能需要不同的心理攻击机制,因此他们会选择同理心已达到目的。例如,Snake勒索软件试图以合理的方式提醒受害者,并以问答的形式和令人放心的语言表示关注,例如“别担心”和“你可以立即启动并运行”。2020年,出现了一款新的勒索软件Snake(也被称为EKANS,是“snake单词”从后往前的字母组成)。EKANS的主要目标是工业控制系统(ICS)环境,针对的不是单个设备,而是整个网络,它能够终止与工业控制系统(ICS)操作相关的许多流程应用程序。EKANS是一种用Go编程语言编写的混淆勒索软件变体,于2019年12月下旬首次在商业恶意软件存储库中观察到。它旨在终止受影响计算机上的特定进程,包括与ICS操作相关的多个项,以及删除卷影副本以消除Windows备份。

5.jpg

值得注意的是,攻击者的赎金手段已经从原来的暴力恐吓转向了更为“人性”的同理心策略,比如“如果你有兴趣购买……”。

流氓手段

在2013年或2014年前后的某个时候,一些更有组织的攻击者开始在加密之前悄悄窃取受害者的数据。Cerber勒索软件可能就是其中之一,但最近,我们发现直接使用被窃取的数据作为强制支付赎金的手段的趋势越来越明显。这项技术最初可能被Maze勒索软件使用,现在也被DoppelPaymer(BitPaymer勒索软件的一类新变种,自2019年6月以来,DoppelPaymer涉及了一系列恶意勒索活动,其中就包括美国德克萨斯州埃德库奇市和智利的农业部的袭击事件。)、Sodinokibi(自2019年4月被发现以来,Sodinokibi开始被大量使用,并迅速出现许多变体。)和Nemty(NEMTY勒索病毒是一款新型流行勒索病毒,首次发现于2019年8月21号)利用。这一新的转变包括建立一个可公开访问的网站,暴露不合作的受害者的数据。

6.jpg

如果受害者不支付赎金,攻击者就威胁公布他们的敏感数据,这种技术其实会打击受害者支付赎金的积极性,从而使情况变得更加糟糕。因为受害者认为,即使支付了赎金,他们的数据也会被暴露。

人身威胁:不要赎金只要裸照

最后但并非最不重要的一点是,在某些情况下可能是最危险的,最近的一个变体将勒索软件与色情行为结合在一起,并要求使用裸照而不是比特币来支付赎金。该恶意软件显示一条消息,要求受害者将裸照发送到特定的电子邮件地址以恢复其文件。比如2017年出现的“nRansomware”勒索软件需发送最少10张裸照给他们,而黑客还会核查裸照是否属于受害者本人,只有审核通过后黑客才会给受害者解锁密码。而受害者发送给黑客的裸照,则会在Deep Web深网上出售。

7.jpg

总结

网络攻击,特别是以勒索软件为代表,已经由原来的单纯物理攻击转向了心理攻击,这种攻击影响是深远的,已经等同于犯罪。对于许多受害者而言,这会导致忧虑、痛苦、难以置信和无助感。通常,那些经历过此类网络攻击的受害者说,这种影响会持续好几个月。不幸的是,运用心理攻击展开攻击将是勒索软件未来继续使用的手段。

01.png

对于用户来说,勒索软件是网络攻击者使用的最可怕的一种武器。据估计,仅在美国,因勒索软件造成的损失就达到了75亿美元,而在加拿大,因勒索软件造成的损失就也达到了23亿美元,毫无疑问,全球都能感受到勒索软件的存在,而造成的损失更是难以估量。

但除了直接和间接的经济损失外,勒索软件还运用了深层的心理犯罪机制来攫取最大利益,这让它区别于其他形式的网络攻击。与其他所有类型的恶意软件相比,勒索软件在发起攻击时并不会隐藏其活动,而是向受害者说明他们已经被攻击,并强迫受害者采取行动(比如支付赎金)。

勒索软件在攻击时准确地利用了受害人的恐惧、认知、是否交赎金的动机和被锁定的资料价值,这些因素都会随着时间的流逝而发生变化,比如有的受害者据直接选择不付赎金,也有受害人会选择安全商,进行异地备份并创建解密器。在本文中,我们将探讨勒索软件的攻击者所使用的心理机制是如何随着时间而发展的,从而攫取最大利益。

使用勒索软件的攻击者要发起心理攻击需要具备什么条件?

勒索软件的基本功能包括初始感染、快速加密和受害者通知,在这种情况下,受害者被告知他们失去了访问数据的权限,为了访问这些数据,受害者必须支付赎金。从心理上讲,罪犯如果要达成目的,需要确保的是:

1. 勒索软件锁定的是受害者的关键数据,且短期内不可破解;

2. 对受害者施加影响,让受害者觉得支付赎金是他们唯一可行的选择;

3. 营造紧迫感:为了最大程度地提高利润,支付赎金的速度至关重要,以免出现破解软件。

自从1989年第一个勒索软件出现以来,索取赎金的方法就在不断的“试验和错误”中不断演变,试图最大限度地提高利润,减少相关的风险。

早期勒索软件索取赎金的方法

第一款勒索软件出现于1989年,哈佛大学毕业的Joseph L.Popp创建,名为“艾滋病信息木马”(AIDS Trojan)。这款勒索软件使用对称加密,解密工具没花多少时间就修复了文件名,但这一举动激发了随后近乎30年的勒索软件工具。据 Popp 本人回忆,1989 年,他设计勒索软件的初衷是为了抗击艾滋病。为了募集抗艾资金,他弄巧成拙,给世界卫生组织论坛的与会代表发送了 20,000 份病毒加密磁盘。当代表们运行磁盘文件时,电脑被冻结,屏幕信息要求汇钱之后才能打开磁盘,取回电脑里的文件。当时,受害者一旦执行恶意软件,该恶意软件就会隐藏文件目录,如果受害者希望解密数据,则需要支付189美元。有报道称,一些医疗机构在遭到AIDS Trojan攻击后,长达10年的研究资料瞬间化为乌有。

像现在的许多勒索软件一样,Popp当时也使用了多种通知受害者的方式,并吓唬和恐吓受害者:

1.jpg

目前勒索软件索取赎金的方法

勒索软件在经历了许多年之后才开始流行,并开始采用其他心理机制。首先被引入的是一种计时器,它倒计时到不久的将来的某一时刻(例如,从感染开始的48小时内),之后文件将被删除,并且完全无法恢复,不管受害者随后是否想要支付赎金。

其实这种倒计时心理机制在营销界已被广泛运用,其目的就是用于营造紧迫感。但是,这种营造的紧迫感往往也会给攻击者自己挖坑,比如许多勒索软件受害者无法在给定的时间内付款,或者因为受害者不知道在这期间该怎么做,或者因和攻击者沟通而浪费了截止日期,以致他们中的许多人错过了截止日期,迫使攻击者执行删除文件或锁定文件的操作。如上所述,虽然倒数计时方法有助于达成攻击的成功率,但对攻击者来说也有不利的一面:就最大限度地攫取利润而言,这并不是很有效,往往无法收取到赎金。现在,新形式的勒索软件现在常常试图通过提供更低的赎金价格来激励受害者,只要受害者支付赎金的速度快,则所交的赎金也越少,反之时间耗的越长,则交的赎金越多。

使用令人害怕的声音和图像来吓唬受害者

虽然利用倒计时和赎金数量会促使受害者采取行动,但使用令人害怕的声音和图像来吓唬受害者也是攻击者使用的重要手段。因为融合了恐怖的视觉效果和令人震惊的声音,会增加攻击效果和赎金的收回概率。

2.jpg

对比其他勒索软件,Cerber勒索软件增加了新的功能。首先,Cerber通过电子邮件附件的形式进入受害者计算机。一旦被打开,就像其他勒索软件一样加密文件并向受害者索要赎金。同时,它会进一步确认计算机联网状态,并将受感染的计算机用于其他目的。例如,实施分布式拒绝服务攻击或作为垃圾邮件程序使用。

Cerber因为其独特的赎金索要通知方式而著称。多数勒索软件通过文字讯息索要赎金,而Cerber却独树一帜,通过语音通知受害人。Cerber勒索软件使用VBScript播放音频消息,并反复声明“注意!你的文档、照片、数据库和其他重要文件已加密!”。

3.jpg

在上图所示的Cerber赎金说明的底部,请注意拉丁文的格言,“默默地向我报价”,翻译成更熟悉的“不会杀死我的东西,会使我变得更坚强”。攻击者为什么选择包含这种坚毅的格言仍然是一个谜。

但是就确保和加快付款速度而言,这种恐吓方法的结果尚无定论。要深入研究勒索软件启动画面中使用的心理机制,请参阅此文

同理心策略

当威胁和恐吓技术不足以促使人们采取行动或至少不够快时,勒索软件攻击者便改变了他们的心理策略。勒索软件的最新示例采用了多种方法,从最初表现出的更大的侵略性(旨在说服人们全额支付而不是进行谈判)到现在充满同情心的“软销售”。

表现出的更大的侵略性的一个很好的例子是Megacotex的赎金记录,它警告受害者不要试图发送部分付款或协商折扣,否则他们将再也看不到他们的数据。2019年5月,发,一种名为MegaCortex的新勒索软件被发现,根据当时的监测情况,MegaCortex已在美国、加拿大等多地区传播,该病毒攻击目标为大型企业,其通过域控服务器下发勒索病毒。

4.png

不过勒索软件的开发者也明白,不同的受害者可能需要不同的心理攻击机制,因此他们会选择同理心已达到目的。例如,Snake勒索软件试图以合理的方式提醒受害者,并以问答的形式和令人放心的语言表示关注,例如“别担心”和“你可以立即启动并运行”。2020年,出现了一款新的勒索软件Snake(也被称为EKANS,是“snake单词”从后往前的字母组成)。EKANS的主要目标是工业控制系统(ICS)环境,针对的不是单个设备,而是整个网络,它能够终止与工业控制系统(ICS)操作相关的许多流程应用程序。EKANS是一种用Go编程语言编写的混淆勒索软件变体,于2019年12月下旬首次在商业恶意软件存储库中观察到。它旨在终止受影响计算机上的特定进程,包括与ICS操作相关的多个项,以及删除卷影副本以消除Windows备份。

5.jpg

值得注意的是,攻击者的赎金手段已经从原来的暴力恐吓转向了更为“人性”的同理心策略,比如“如果你有兴趣购买……”。

流氓手段

在2013年或2014年前后的某个时候,一些更有组织的攻击者开始在加密之前悄悄窃取受害者的数据。Cerber勒索软件可能就是其中之一,但最近,我们发现直接使用被窃取的数据作为强制支付赎金的手段的趋势越来越明显。这项技术最初可能被Maze勒索软件使用,现在也被DoppelPaymer(BitPaymer勒索软件的一类新变种,自2019年6月以来,DoppelPaymer涉及了一系列恶意勒索活动,其中就包括美国德克萨斯州埃德库奇市和智利的农业部的袭击事件。)、Sodinokibi(自2019年4月被发现以来,Sodinokibi开始被大量使用,并迅速出现许多变体。)和Nemty(NEMTY勒索病毒是一款新型流行勒索病毒,首次发现于2019年8月21号)利用。这一新的转变包括建立一个可公开访问的网站,暴露不合作的受害者的数据。

6.jpg

如果受害者不支付赎金,攻击者就威胁公布他们的敏感数据,这种技术其实会打击受害者支付赎金的积极性,从而使情况变得更加糟糕。因为受害者认为,即使支付了赎金,他们的数据也会被暴露。

人身威胁:不要赎金只要裸照

最后但并非最不重要的一点是,在某些情况下可能是最危险的,最近的一个变体将勒索软件与色情行为结合在一起,并要求使用裸照而不是比特币来支付赎金。该恶意软件显示一条消息,要求受害者将裸照发送到特定的电子邮件地址以恢复其文件。比如2017年出现的“nRansomware”勒索软件需发送最少10张裸照给他们,而黑客还会核查裸照是否属于受害者本人,只有审核通过后黑客才会给受害者解锁密码。而受害者发送给黑客的裸照,则会在Deep Web深网上出售。

7.jpg

总结

网络攻击,特别是以勒索软件为代表,已经由原来的单纯物理攻击转向了心理攻击,这种攻击影响是深远的,已经等同于犯罪。对于许多受害者而言,这会导致忧虑、痛苦、难以置信和无助感。通常,那些经历过此类网络攻击的受害者说,这种影响会持续好几个月。不幸的是,运用心理攻击展开攻击将是勒索软件未来继续使用的手段。

01.png

AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它的设计用于Windows GUI(图形用户界面)中进行自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的(例如VBScript和SendKeys)。

Autoit3 Decompiler是一款功能强大的AutoIt3反编译工具,可以反编译由AutoIt编译的exe程序,直接反编译出源代码!还带有右键关联功能,非常方便。
在Autoit3 Decompiler中,按“反编译选中”或“反编译当前”按钮,还可以提取exe中的资源(图片、exe等等)到文件夹。
Autoit3 Decompiler 主要功能简介如下:
1. 支持全系列autoit3,包括v3.0.100.0 - v3.3.7.18,后续版本没验证是否支持,理论上是都支持的
2. 支持EXE及A3X文件反编译 ;
3. 支持X86及X64格式反编译 ;
4. 支持ANSI及UNICODE反编译 ;
5. 支持带密码编译,对于3.2.6.0之前版本可以读取原始密码,后续版本无法显示密码但可正常反编译 ;
6. 支持代码混淆,混淆程序反编译后可读性欠佳,但不影响重编译及执行; 
7. 支持反编译后文件项信息即时预览 ;
8. 支持反编译后文件内容即时预览 ;
9. 支持批量反编译 ;
10. 支持命令行及图形界面操作 ;
11. 支持鼠标右键菜单集成。

在分析AutoIT编译的恶意软件样本期间,会弹出一个消息框,指示在使用Exe2Aut反编译器时可能执行的样本。这引起了我对反编译程序如何工作以及如何首先编译AutoIt脚本的兴趣。在本文中,我将解释两个最常见的AutoIT反编译程序(Exe2Aut和myAut2Exe)是如何工作的,以及它们是如何被骗去反编译一个诱饵脚本而不是真正的脚本。

什么是“已编译” AutoIT可执行文件?

编译后的AutoIT可执行文件基本上由两部分组成:一个独立的AutoIT解释程序和作为PE文件中资源显示的编译脚本字节码。AutoIT的创建者已经采取了一些措施来防止简单的反编译,并对字节码应用了一种压缩和加密的形式。字节码的解压缩由编译的AutoIT二进制文件执行,然后再解释和执行。

现在,让我们分析一下Exe2Aut反编译程序。

如果要在反编译期间动态分析Exe2Aut,则会注意到以下内容:

1. 将.tmp文件写入%TEMP%文件夹;

2. 目标二进制文件作为Exe2Aut的子进程加载;

3. .tmp文件被注入目标二进制文件中;

4. 目标二进制文件会将反编译的autoIT脚本写入当前工作目录。

因此,我们可以得出结论,Exe2Aut利用嵌入式解释程序对脚本字节码进行解密和解压缩,然后通过将动态链接库(DLL)注入目标二进制文件来提取该字节码。这样就钩住了将执行字节码的函数,并将字节码解码回函数名称,从而使其成为一种动态方法。因此,可以添加代码来检测注入并更改其行为。这样,我们可以欺骗Exe2Aut来反编译诱饵脚本,而不是在运行应用程序时执行的真实脚本。

2.png

Exe2Aut注入模块

那MyAut2Exe呢?

与Exe2Aut不同,MyAut2Exe无需嵌入式解释程序就可以提取字节码资源并解压缩和解码。使其成为完整的静态反编译程序,因此没有意外执行任何内容的风险。

MyAut2Exe比Exe2Aut更高级,它支持AutoIT和AutoHotkey编译脚本的多个版本。因此,它具有更多设置来调整已编译脚本代码的提取和解压缩。为了减少正确配置的麻烦,它提供了一个称为“自动化”的功能。该暴力破解将强制反编译程序设置,直到脚本成功反编译为止。当使用“自动”功能时,MyAut2Exe解析可执行文件中的AutoIT魔术字节码签名。一旦找到,它将提取并反编译代码。由于解析和反编译会在魔术字节码序列首次出现时就停止了,因此只要将MyAut2Exe放置在比真实编译脚本资源低的偏移量处,就可以很容易地诱使MyAut2Exe进行反编译。

演示过程

虽然理论知识层面我们已经讲得更清楚了,但是在网络安全领域,概念证明(POC)的价值远远超过任何理论。

这个想法是要使用三个不同的字节码来编译AutoIt可执行文件,一旦被Exe2Aut或MyAut2Exe反编译,其中一个诱饵脚本就会被反编译,而不是真正的代码。

如前所述,MyAut2Exe的诱饵脚本位于真实字节码之前。对于Exe2Aut,诱饵和真实脚本的脚本资源名称将在运行时重命名,以使其反编译错误的代码。

我已经编译了三种不同的AutoIt脚本,并将它们作为资源添加到.rsrc部分。其中两个是诱饵脚本,而第三个是真实的脚本。然后,我将.rsrc部分的权限设置为读取/写入可移植可执行文件(PE)头。

3.png

真实和诱骗的脚本资源

接下来,我编写了一个小的程序集shellcode来遍历进程环境块中的PEB_LDR_DATA结构,以检查Exe2Aut注入的DLL是否存在。还可以在磁盘上搜索(UPX压缩)DLL,因为在注入之前,它位于Windows%TEMP%目录下的随机文件名下。我之所以选择这种方法,是因为它更可靠且更难检测。遍历进程环境块以检查所有已加载模块中是否存在节名称为.UPX0的已加载模块,这是一种识别Exe2Aut注入模块的更简便的方法,因为其他所有DLL通常都不会被UPX压缩。这个方法甚至可以检测到各种各样的Exe2Aut版本,而不仅仅是我使用的那个,甚至还有一些自定义的反编译器。

创建了shellcode之后,我需要在准备好的可执行文件中找到一个位置,将我的shellcode注入其中。我在.text部分的末尾找到了一个大约210字节的编解码器,此时我的shellcode可以很容易地放入其中。为了执行我的shellcode,我决定在调用IsDebuggerPresent之后立即跳转到它,并在执行完成后返回正常执行流程。

saveRegisters:
     push ecx
     push ebx
     push edx
 
checkInjected:
     mov ebx, fs:[0x30]                                        ; Get PEB address
     mov ebx, [ebx+0xC]                                        ; Get LDR Table address
     mov ebx, [ebx+0x14]                                       ; first entry of LDR table. (the first entry is the that of the executable)
     mov edx, [ebx+0x10]                                       ; Store the offset in edx
                                                               ;   I need this later to calculate the offsets
                                                               ;   of the resource names
 
     nextModule:
 
          mov ebx, [ebx]                                       ; Get address of next LDR entry
          mov ecx, dword ptr ds:[ebx+0x28]                     ; Pointer of the module name
          test ecx, ecx                                        ; If the pointer is OxO it means we have reached
                                                               ;   the end of our LDR table and we want to
          je restoreRegisers                                   ;   continue normal execution
          mov ecx,dword ptr ds:[ebx+0x10]                      ; Get the modules base offset
          mov ecx, dword ptr ds:[ecx+0x178]                    ; load a dword from the modules base offset+0x178
          cmp ecx,0x30585055                                   ;   and check if it is "UPX0"
          je swapResouces
          jmp nextModule
 
swapResouces:
     mov byte ptr ds:[edx+ 0xc7656], 0x49                      ; Replace the '1' for a 'I' in "SCR1PT"
     mov byte ptr ds:[edx+ 0xc765e] , 0x35                     ; Replace the 'S' for a '5' in "SCRIPT"
 
restoreRegisers:
     pop edx
     pop ebx
     pop ecx
     test eax, eax                                            ; Restore the instructions that were overwritten by
     jnz debugerIsPresent                                     ;   the jump to the codecave
     jmp debugerNotPresent                                    ; Return to the normal program flow

程序集shellcode(70字节)

演示视频可以点击这里,从以上POC中我们可以学到的是,我们不应该总是盲目地相信我们使用的工具。逆向工程师应该意识到他们的工具是如何工作的,以及他们如何可能被欺骗而返回具有误导性的输出结果。虽然这里介绍的技巧可能会误导两个反编译器,但它们不会影响沙箱中的动态分析结果。 

01.png

AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它的设计用于Windows GUI(图形用户界面)中进行自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的(例如VBScript和SendKeys)。

Autoit3 Decompiler是一款功能强大的AutoIt3反编译工具,可以反编译由AutoIt编译的exe程序,直接反编译出源代码!还带有右键关联功能,非常方便。 

在Autoit3 Decompiler中,按“反编译选中”或“反编译当前”按钮,还可以提取exe中的资源(图片、exe等等)到文件夹。 

Autoit3 Decompiler 主要功能简介如下: 

1. 支持全系列autoit3,包括v3.0.100.0 - v3.3.7.18,后续版本没验证是否支持,理论上是都支持的 

2. 支持EXE及A3X文件反编译 ;

3. 支持X86及X64格式反编译 ;

4. 支持ANSI及UNICODE反编译 ;

5. 支持带密码编译,对于3.2.6.0之前版本可以读取原始密码,后续版本无法显示密码但可正常反编译 ;

6. 支持代码混淆,混淆程序反编译后可读性欠佳,但不影响重编译及执行; 

7. 支持反编译后文件项信息即时预览 ;

8. 支持反编译后文件内容即时预览 ;

9. 支持批量反编译 ;

10. 支持命令行及图形界面操作 ;

11. 支持鼠标右键菜单集成。

在分析AutoIT编译的恶意软件样本期间,会弹出一个消息框,指示在使用Exe2Aut反编译器时可能执行的样本。这引起了我对反编译程序如何工作以及如何首先编译AutoIt脚本的兴趣。在本文中,我将解释两个最常见的AutoIT反编译程序(Exe2Aut和myAut2Exe)是如何工作的,以及它们是如何被骗去反编译一个诱饵脚本而不是真正的脚本。

什么是“已编译” AutoIT可执行文件?

编译后的AutoIT可执行文件基本上由两部分组成:一个独立的AutoIT解释程序和作为PE文件中资源显示的编译脚本字节码。AutoIT的创建者已经采取了一些措施来防止简单的反编译,并对字节码应用了一种压缩和加密的形式。字节码的解压缩由编译的AutoIT二进制文件执行,然后再解释和执行。

现在,让我们分析一下Exe2Aut反编译程序。

如果要在反编译期间动态分析Exe2Aut,则会注意到以下内容:

1. 将.tmp文件写入%TEMP%文件夹;

2. 目标二进制文件作为Exe2Aut的子进程加载;

3. .tmp文件被注入目标二进制文件中;

4. 目标二进制文件会将反编译的autoIT脚本写入当前工作目录。

因此,我们可以得出结论,Exe2Aut利用嵌入式解释程序对脚本字节码进行解密和解压缩,然后通过将动态链接库(DLL)注入目标二进制文件来提取该字节码。这样就钩住了将执行字节码的函数,并将字节码解码回函数名称,从而使其成为一种动态方法。因此,可以添加代码来检测注入并更改其行为。这样,我们可以欺骗Exe2Aut来反编译诱饵脚本,而不是在运行应用程序时执行的真实脚本。

2.png

Exe2Aut注入模块

那MyAut2Exe呢?

与Exe2Aut不同,MyAut2Exe无需嵌入式解释程序就可以提取字节码资源并解压缩和解码。使其成为完整的静态反编译程序,因此没有意外执行任何内容的风险。

MyAut2Exe比Exe2Aut更高级,它支持AutoIT和AutoHotkey编译脚本的多个版本。因此,它具有更多设置来调整已编译脚本代码的提取和解压缩。为了减少正确配置的麻烦,它提供了一个称为“自动化”的功能。该暴力破解将强制反编译程序设置,直到脚本成功反编译为止。当使用“自动”功能时,MyAut2Exe解析可执行文件中的AutoIT魔术字节码签名。一旦找到,它将提取并反编译代码。由于解析和反编译会在魔术字节码序列首次出现时就停止了,因此只要将MyAut2Exe放置在比真实编译脚本资源低的偏移量处,就可以很容易地诱使MyAut2Exe进行反编译。

演示过程

虽然理论知识层面我们已经讲得更清楚了,但是在网络安全领域,概念证明(POC)的价值远远超过任何理论。

这个想法是要使用三个不同的字节码来编译AutoIt可执行文件,一旦被Exe2Aut或MyAut2Exe反编译,其中一个诱饵脚本就会被反编译,而不是真正的代码。

如前所述,MyAut2Exe的诱饵脚本位于真实字节码之前。对于Exe2Aut,诱饵和真实脚本的脚本资源名称将在运行时重命名,以使其反编译错误的代码。

我已经编译了三种不同的AutoIt脚本,并将它们作为资源添加到.rsrc部分。其中两个是诱饵脚本,而第三个是真实的脚本。然后,我将.rsrc部分的权限设置为读取/写入可移植可执行文件(PE)头。

3.png

真实和诱骗的脚本资源

接下来,我编写了一个小的程序集shellcode来遍历进程环境块中的PEB_LDR_DATA结构,以检查Exe2Aut注入的DLL是否存在。还可以在磁盘上搜索(UPX压缩)DLL,因为在注入之前,它位于Windows%TEMP%目录下的随机文件名下。我之所以选择这种方法,是因为它更可靠且更难检测。遍历进程环境块以检查所有已加载模块中是否存在节名称为.UPX0的已加载模块,这是一种识别Exe2Aut注入模块的更简便的方法,因为其他所有DLL通常都不会被UPX压缩。这个方法甚至可以检测到各种各样的Exe2Aut版本,而不仅仅是我使用的那个,甚至还有一些自定义的反编译器。

创建了shellcode之后,我需要在准备好的可执行文件中找到一个位置,将我的shellcode注入其中。我在.text部分的末尾找到了一个大约210字节的编解码器,此时我的shellcode可以很容易地放入其中。为了执行我的shellcode,我决定在调用IsDebuggerPresent之后立即跳转到它,并在执行完成后返回正常执行流程。

saveRegisters:
     push ecx
     push ebx
     push edx
 
checkInjected:
     mov ebx, fs:[0x30]                                        ; Get PEB address
     mov ebx, [ebx+0xC]                                        ; Get LDR Table address
     mov ebx, [ebx+0x14]                                       ; first entry of LDR table. (the first entry is the that of the executable)
     mov edx, [ebx+0x10]                                       ; Store the offset in edx
                                                               ;   I need this later to calculate the offsets
                                                               ;   of the resource names
 
     nextModule:
 
          mov ebx, [ebx]                                       ; Get address of next LDR entry
          mov ecx, dword ptr ds:[ebx+0x28]                     ; Pointer of the module name
          test ecx, ecx                                        ; If the pointer is OxO it means we have reached
                                                               ;   the end of our LDR table and we want to
          je restoreRegisers                                   ;   continue normal execution
          mov ecx,dword ptr ds:[ebx+0x10]                      ; Get the modules base offset
          mov ecx, dword ptr ds:[ecx+0x178]                    ; load a dword from the modules base offset+0x178
          cmp ecx,0x30585055                                   ;   and check if it is "UPX0"
          je swapResouces
          jmp nextModule
 
swapResouces:
     mov byte ptr ds:[edx+ 0xc7656], 0x49                      ; Replace the '1' for a 'I' in "SCR1PT"
     mov byte ptr ds:[edx+ 0xc765e] , 0x35                     ; Replace the 'S' for a '5' in "SCRIPT"
 
restoreRegisers:
     pop edx
     pop ebx
     pop ecx
     test eax, eax                                            ; Restore the instructions that were overwritten by
     jnz debugerIsPresent                                     ;   the jump to the codecave
     jmp debugerNotPresent                                    ; Return to the normal program flow

程序集shellcode(70字节)

演示视频可以点击这里,从以上POC中我们可以学到的是,我们不应该总是盲目地相信我们使用的工具。逆向工程师应该意识到他们的工具是如何工作的,以及他们如何可能被欺骗而返回具有误导性的输出结果。虽然这里介绍的技巧可能会误导两个反编译器,但它们不会影响沙箱中的动态分析结果。 

SysmonTools存储库包含以下内容:

1.Sysmon View:离线Sysmon日志可视化工具;

2.Sysmon Shell:Sysmon配置实用程序;

3.Sysmon Box:Sysmon和网络捕获日志实用程序;

背景介绍

1.Sysmon View:3.1版可以导入网络跟踪捕获并将其与Sysmon网络事件相关联;

2.Sysmon Box:用于捕获Sysmon和网络事件(v1.0)的新命令行实用程序;

3.Sysmon Shell:添加了将配置文件升级到V9.0的命令;

Sysmon View

Sysmon View通过使用现有事件数据(例如可执行文件名称,会话GUID,事件创建时间等)将各种Sysmon事件进行逻辑分组和关联在一起,从而帮助跟踪和可视化Sysmon日志,然后该工具重新排列该数据以进行显示进入多个视图。

1.png

首先,使用内置的WEVTUtil将Sysmon事件导出到XML文件,此文件稍后将由Sysmon View导入:

WEVTUtil query-events "Microsoft-Windows-Sysmon/Operational" /format:xml /e:sysmonview > eventlog.xml

导出后,运行Sysmon View并导入生成的文件“eventlog.xml”(不过你也可以自定义名称),请注意,这可能需要一些时间,具体取决于日志文件的大小。该文件只需要导入一次,随后的Sysmon View运行不需要再次导入数据,只需使用文件菜单文件->加载现有数据即可再次加载以前导入的数据。

所有数据都将导入到名为SysmonViewDB的SQLite数据库文件中,该文件与Sysmon View可执行文件位于同一位置。如果需要,可以与其他人共享此文件,只需将该文件与Sysmon View放在同一位置,然后使用命令文件->加载现有数据即可。

每次导入新的XML文件时,数据库文件都将删除并重新创建。要保留以前导入的任何数据,请将数据库文件复制到另一个位置或简单地重命名。

该数据库也可以直接在自己的应用程序中使用,该数据库包含哈希,可执行文件、IP地址、地理映射的摘要,并且所有这些文件都通过文件名或会话(可执行GUID)进行逻辑链接。

你可以使用任何SQLite管理软件直接查询数据库文件,而无需使用Sysmon View,例如,生成报告或分析数据。

Sysmon View

Sysmon View仅有助于重点关注“运行会话”的摘要,例如,分析人员可以从可执行文件名称(例如cmd.exe)或事件类型(例如Network event)开始,然后可以进行进一步过滤。例如,应用程序查找源自相同二进制文件但来自不同位置的运行会话。该视图利用进程GUID过滤每个会话“运行”的事件,选择任何正在运行的会话(从GUID列表中)将在简单的类似于数据流的视图中显示所有其他相关(相关)事件,并使用时间排序事件。注意:如果要从Elasticsearch实例而不是每台计算机导入数据,则可以为每台计算机的每个可执行文件安排事件。

68747470733a2f2f6e6f736563757265636f64652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031382f30372f315f352e706e67.png

只需双击视图中的任何事件即可访问Sysmon事件详细信息,例如,上一个截屏显示了进程创建事件的详细信息(事件ID 1),该工具还可以根据需要与VirusTotal集成,以进行进一步的处理哈希和IP查找(需要API密钥注册)。

map view:在事件导入过程中,有一个用于地理定位IP地址的选项,如果设置了该选项,则Sysmon View将尝试使用https://ipstack.com/服务对网络目标进行地理映射。

2.png

在map view中,通过使用网络事件作为起点很容易在相关(相关)事件之间导航,该工具也可以使用正在运行的进程会话GUID来实现此目的。要浏览相关事件,请使用会话GUID的超链接,将在一个包含所有相关会话事件的新窗口中显示一个类似于流程视图的新视图:

4.png

所有事件视图(All Events View)还可以用于对所有Sysmon收集的事件数据进行完整搜索,它还有助于查看与其他事件不相关的事件,例如“ Driver Loaded”事件类型。通过单击FID链接,除事件详细信息外,仍使用流程GUID提供相关事件之间的导航

5.png

此外,“所有事件”视图支持按计算机名称,事件类型或GUID进行数据透视(分组)的安排,如下所示:

6.png

也可以使用多个分组级别:

7.png

Sysmon Shell

Sysmon Shell可以通过简单的GUI界面帮助编写和应用Sysmon XML配置。

8.png

简而言之,除了导出Sysmon事件日志外,Sysmon Shell还可以用于探索Sysmon可用的各种配置选项,轻松地应用和更新XML配置:

1.Sysmon Shell可以加载Sysmon XML配置文件:当前版本支持所有Sysmon模式。该工具不会直接从注册表中直接加载任何配置,而仅从XML文件中加载。

2.它可以将最终的XML导出/保存到文件中;

3.它可以通过直接调用Sysmon.exe -c命令(在安装Sysmon的同一文件夹中创建一个临时XML文件)直接应用生成的XML配置文件,因此,如果使用此功能,则Sysmon Shell将需要提升的特权(此需求是从Sysmon进程本身继承的),应用配置的输出将显示在预览窗格中(这是Sysmon生成的输出)

4.在保存到预览窗格之前,可以预览XML配置。

5.最后一个选项卡(标记为“Logs Export”)可以方便地将Sysmon事件日志快速导出到XML,以后可以与“ Sysmon View”一起使用以进行事件分析。注意:导出具有三个选项:

5.1仅导出;

5.2导出并清除Sysmon事件日志;

5.3导出、备份evtx文件并清除事件日志;

该实用程序具有从Sysmon Sysinternals主页中获取的所有事件类型的描述。

Sysmon Shell捆绑了由其他安全专家创建的许多Sysmon配置模板

9.png

它会警告你有关“包含/排除”冲突或尝试验证规则本身,但是,一旦应用了配置,预览窗格将显示在应用配置时从Sysmon.exe捕获的输出( Sysmon -c命令),从中可以识别错误。

Sysmon Box

Sysmon Box是一个小型实用程序,可以帮助构建捕获的Sysmon和网络流量的数据库。

10.png

要运行Sysmon Box,请使用以下命令(Sysmon需要与tshark一起启动并运行):

位于Wi-Fi中的SysmonBox情况

然后,该工具将执行以下操作:

1.开始捕获流量(在后台使用tshark,这就是为什么必须指定捕获接口的原因),完成后,按CTRL + C结束会话;

2.然后,Sysmon Box将停止流量捕获,将所有捕获的数据包转储到文件中,并使用EVT实用程序导出在会话的开始和结束时间之间记录的Sysmon日志;

3.使用从Sysmon导入的日志和捕获的流量构建Sysmon View数据库文件(现有备份),你要做的就是从同一文件夹中运行Sysmon View或将数据库文件(SysmonViewDB)与Sysmon View放在同一文件夹中(保持数据包在同一位置被捕获)

其他资源

1.你可以在https://nosecurecode.com/上了解有关Sysmon View&Sysmon Shell的更多信息。

2.这是有关Sysmon和Sysmon View的详细概述。

软件协议

Copyright 2018 Nader Shallabi. All rights reserved.

SYSMON TOOLS CAN BE COPIED AND/OR DISTRIBUTED WITHOUT ANY EXPRESS PERMISSION OF NADER SHALLABI.

THIS SOFTWARE IS PROVIDED BY NADER SHALLABI ''AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NADER SHALLABI
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Nader Shallabi


SysmonTools存储库包含以下内容:

1.Sysmon View:离线Sysmon日志可视化工具;

2.Sysmon Shell:Sysmon配置实用程序;

3.Sysmon Box:Sysmon和网络捕获日志实用程序;

背景介绍

1.Sysmon View:3.1版可以导入网络跟踪捕获并将其与Sysmon网络事件相关联;

2.Sysmon Box:用于捕获Sysmon和网络事件(v1.0)的新命令行实用程序;

3.Sysmon Shell:添加了将配置文件升级到V9.0的命令;

Sysmon View

Sysmon View通过使用现有事件数据(例如可执行文件名称,会话GUID,事件创建时间等)将各种Sysmon事件进行逻辑分组和关联在一起,从而帮助跟踪和可视化Sysmon日志,然后该工具重新排列该数据以进行显示进入多个视图。

1.png

首先,使用内置的WEVTUtil将Sysmon事件导出到XML文件,此文件稍后将由Sysmon View导入:

WEVTUtil query-events "Microsoft-Windows-Sysmon/Operational" /format:xml /e:sysmonview > eventlog.xml

导出后,运行Sysmon View并导入生成的文件“eventlog.xml”(不过你也可以自定义名称),请注意,这可能需要一些时间,具体取决于日志文件的大小。该文件只需要导入一次,随后的Sysmon View运行不需要再次导入数据,只需使用文件菜单文件->加载现有数据即可再次加载以前导入的数据。

所有数据都将导入到名为SysmonViewDB的SQLite数据库文件中,该文件与Sysmon View可执行文件位于同一位置。如果需要,可以与其他人共享此文件,只需将该文件与Sysmon View放在同一位置,然后使用命令文件->加载现有数据即可。

每次导入新的XML文件时,数据库文件都将删除并重新创建。要保留以前导入的任何数据,请将数据库文件复制到另一个位置或简单地重命名。

该数据库也可以直接在自己的应用程序中使用,该数据库包含哈希,可执行文件、IP地址、地理映射的摘要,并且所有这些文件都通过文件名或会话(可执行GUID)进行逻辑链接。

你可以使用任何SQLite管理软件直接查询数据库文件,而无需使用Sysmon View,例如,生成报告或分析数据。

Sysmon View

Sysmon View仅有助于重点关注“运行会话”的摘要,例如,分析人员可以从可执行文件名称(例如cmd.exe)或事件类型(例如Network event)开始,然后可以进行进一步过滤。例如,应用程序查找源自相同二进制文件但来自不同位置的运行会话。该视图利用进程GUID过滤每个会话“运行”的事件,选择任何正在运行的会话(从GUID列表中)将在简单的类似于数据流的视图中显示所有其他相关(相关)事件,并使用时间排序事件。注意:如果要从Elasticsearch实例而不是每台计算机导入数据,则可以为每台计算机的每个可执行文件安排事件。

68747470733a2f2f6e6f736563757265636f64652e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031382f30372f315f352e706e67.png

只需双击视图中的任何事件即可访问Sysmon事件详细信息,例如,上一个截屏显示了进程创建事件的详细信息(事件ID 1),该工具还可以根据需要与VirusTotal集成,以进行进一步的处理哈希和IP查找(需要API密钥注册)。

map view:在事件导入过程中,有一个用于地理定位IP地址的选项,如果设置了该选项,则Sysmon View将尝试使用https://ipstack.com/服务对网络目标进行地理映射。

2.png

在map view中,通过使用网络事件作为起点很容易在相关(相关)事件之间导航,该工具也可以使用正在运行的进程会话GUID来实现此目的。要浏览相关事件,请使用会话GUID的超链接,将在一个包含所有相关会话事件的新窗口中显示一个类似于流程视图的新视图:

4.png

所有事件视图(All Events View)还可以用于对所有Sysmon收集的事件数据进行完整搜索,它还有助于查看与其他事件不相关的事件,例如“ Driver Loaded”事件类型。通过单击FID链接,除事件详细信息外,仍使用流程GUID提供相关事件之间的导航

5.png

此外,“所有事件”视图支持按计算机名称,事件类型或GUID进行数据透视(分组)的安排,如下所示:

6.png

也可以使用多个分组级别:

7.png

Sysmon Shell

Sysmon Shell可以通过简单的GUI界面帮助编写和应用Sysmon XML配置。

8.png

简而言之,除了导出Sysmon事件日志外,Sysmon Shell还可以用于探索Sysmon可用的各种配置选项,轻松地应用和更新XML配置:

1.Sysmon Shell可以加载Sysmon XML配置文件:当前版本支持所有Sysmon模式。该工具不会直接从注册表中直接加载任何配置,而仅从XML文件中加载。

2.它可以将最终的XML导出/保存到文件中;

3.它可以通过直接调用Sysmon.exe -c命令(在安装Sysmon的同一文件夹中创建一个临时XML文件)直接应用生成的XML配置文件,因此,如果使用此功能,则Sysmon Shell将需要提升的特权(此需求是从Sysmon进程本身继承的),应用配置的输出将显示在预览窗格中(这是Sysmon生成的输出)

4.在保存到预览窗格之前,可以预览XML配置。

5.最后一个选项卡(标记为“Logs Export”)可以方便地将Sysmon事件日志快速导出到XML,以后可以与“ Sysmon View”一起使用以进行事件分析。注意:导出具有三个选项:

5.1仅导出;

5.2导出并清除Sysmon事件日志;

5.3导出、备份evtx文件并清除事件日志;

该实用程序具有从Sysmon Sysinternals主页中获取的所有事件类型的描述。

Sysmon Shell捆绑了由其他安全专家创建的许多Sysmon配置模板

9.png

它会警告你有关“包含/排除”冲突或尝试验证规则本身,但是,一旦应用了配置,预览窗格将显示在应用配置时从Sysmon.exe捕获的输出( Sysmon -c命令),从中可以识别错误。

Sysmon Box

Sysmon Box是一个小型实用程序,可以帮助构建捕获的Sysmon和网络流量的数据库。

10.png

要运行Sysmon Box,请使用以下命令(Sysmon需要与tshark一起启动并运行):

位于Wi-Fi中的SysmonBox情况

然后,该工具将执行以下操作:

1.开始捕获流量(在后台使用tshark,这就是为什么必须指定捕获接口的原因),完成后,按CTRL + C结束会话;

2.然后,Sysmon Box将停止流量捕获,将所有捕获的数据包转储到文件中,并使用EVT实用程序导出在会话的开始和结束时间之间记录的Sysmon日志;

3.使用从Sysmon导入的日志和捕获的流量构建Sysmon View数据库文件(现有备份),你要做的就是从同一文件夹中运行Sysmon View或将数据库文件(SysmonViewDB)与Sysmon View放在同一文件夹中(保持数据包在同一位置被捕获)

其他资源

1.你可以在https://nosecurecode.com/上了解有关Sysmon View&Sysmon Shell的更多信息。

2.这是有关Sysmon和Sysmon View的详细概述。

软件协议

Copyright 2018 Nader Shallabi. All rights reserved.

SYSMON TOOLS CAN BE COPIED AND/OR DISTRIBUTED WITHOUT ANY EXPRESS PERMISSION OF NADER SHALLABI.

THIS SOFTWARE IS PROVIDED BY NADER SHALLABI ''AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NADER SHALLABI
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Nader Shallabi


vm1.exe实现了一个简单的8位虚拟机(VM)来尝试和阻止逆向工程师检索攻击标记。VM的RAM包含加密的标志和一些字节码来解密它。你能弄清楚虚拟机如何工作并编写自己的虚拟机来解密标志吗? ram.bin中提供了VM RAM的副本,该副本与执行前恶意软件VM的RAM内容相同,包含自定义汇编代码和加密标志。

规则是:

1. 你不需要运行vm1.exe,此挑战仅是静态分析。

2. 不要使用调试器或转储程序从内存中检索解密的标志,这是作弊行为。

3. 可以使用免费版本的IDA Pro(无需调试器)进行分析。

在这种情况下,我将使用IDA Pro分析二进制文件,尽管诸如Cutter或Ghidra之类的工具也可以正常工作。我还将使用Python3编写脚本。查看下载的ZIP文件,我们有2个文件: vm1.exe和ram.bin,其中ram.bin包含字节码和加密标志。

对于那些不知道在恶意软件/软件打包程序的情况下虚拟机实际上是什么的人,让我简要地总结一下;样本中的虚拟机是一种混淆实际恶意软件或打包程序正在执行的操作的方法,例如,样本中将包含大量字节码,这些字节码不是有效的程序集,因此无法自行进行分析。此时,样本中将内置一个解释器,负责获取并执行字节码。该字节码可能用在切换情况下,在这种情况下,有大量没有交叉引用的功能,并且通过字节码进行调用,这意味着需要一个解释器来了解示例的工作方式。虚拟机实现的一个极为常见的示例是Python,执行时,脚本将转换为字节码,而python解释器是唯一可以理解并执行该字节码的东西。如果你有兴趣,这是一篇有关用Python编写Python解释器的精彩文章!

在IDA中打开vm1.exe,我们可以看到一些API调用,一些与MD5相关的函数调用以及对sub_4022E0的调用。首先,我对memcpy()调用很感兴趣,因为它将数据从unk_404040复制到新分配的内存区域dword_40423C,然后将其作为参数传递给MD5::DigestString()。因此,让我们看一下unk_404040,看看我们在那里能看到什么。

查看IDA中的数据,在30个空字节之后似乎有25个字节的数据,然后是更多的空字节,然后到达0x40413F处的更多数据,似乎每3个字节具有类似的结构,地址0x40413F依次为0x01、0x1D和0xBD。在这前3个字节之后,分别是0x01、0x05、0x53和0x01。在多次浏览数据后,似乎第一个字节是0x01、0x02、0x03或0x04,其余数据似乎是随机的。此时,我假设unk_404040上的数据是字节码,当我们将其与ram.bin中的数据进行比较时,这一点变得很清楚,它们是相同的。

现在知道了字节码的位置,让我们看一下函数sub_4022E0()。这个函数看起来很复杂,但实际上很简单。首先,将var_1设置为0,并移动到ecx中。指向VM字节码的指针被移动到edx中,然后[edx+ecx+0xFF]的一个字节被移动到eax中。再往下看,我们可以看到var_1在每个循环中增加了3,所以在本例中,var_1显然用作计数器。因此,[edx+ecx+0xFF]基本上是字节码[counter+255],这意味着实际的VM代码从偏移255开始。无论如何,第一个字节被移动到eax中,然后eax又被移动到var_10中。然后var_1增加1,并移动到edx中。VM字节码的地址被移动到eax中,并使用类似的[eax+edx+0xFF],现在edx不但是计数器,更是数据。字节存储在ecx中,ecx被移动到var_C中。以上过程重复一次,计数器var_1增加1,并执行类似的操作,下一个字节存储在var_8中。在循环中最后一次增加var_1,然后将var_8、var_C和var_10作为参数推入sub_402270()。测试它的返回值,然后函数返回或循环。通过分析,我们已经可以为这个函数创建伪代码。

counter = 0
while result:
    byte_1 = bytecode[counter + 255]
    counter += 1
    byte_2 = bytecode[counter + 255]
    counter += 1
    byte_3 = bytecode[counter + 255]
    counter += 1
    decode_and_execute(byte_1, byte_2, byte_3)

我已经将sub_402270() decode_and_execute()命名为sub_402270(),这是基于将字节码传递给sub_402270()并且没有其他函数处理这个字节码这一事实,所以让我们来看看它是如何工作的。首先,它将把byte_1移动到var_4中,var_4在一个值为1、2、3和4的switch语句中使用。此时,我们可以将byte_1定义为操作码,因为它决定了程序的执行,而byte_2和byte_3是操作数(byte_2 = operand1, byte_3 = operand2)。

如果var_4等于1,则将vm_bytecode的地址移入ecx,然后将其添加到byte_2的值中。将byte_3移到dl中,然后将其写入ecx指向的存储区域。然后函数返回,此函数的伪代码非常简单:

bytecode[operand1] = operand2

如果var_4等于2,则将vm_bytecode的地址移入eax,然后将其添加到byte_2中的值。该地址指向的字节被移入cl,然后被移入byte_404240。然后函数返回。同样,此函数的伪代码很简单:

byte_404240 = bytecode[operand1]

最后,如果var_4等于3,则将byte_404240中的值移入edx,并将vm_bytecode的地址移入eax,然后将其加到byte_2中的值。指向该地址的值将移入ecx,并与edx中的值进行异或。然后将其移至vm_bytecode [byte_2]。然后,该函数将返回。该块的伪代码如下:

vm_bytecode[operand1] ^= byte_404240

如果var_4等于其他任何值,则在返回之前将al设置为0。对于所有其他块,将al设置为1。

因此,现在我们首先知道字节码(opcode | operand1 | operand2)的布局以及可以执行的函数(mov,store,xor,exit),因此现在就可以开始编写脚本了!

脚本解释器

查看解析器功能与基于字节码执行的功能之间的区别,可以很清楚地看到ram.bin文件中有2个部分;数据部分([:255])和代码部分([255:])。因此,我将把文件分成2个部分,以防止任何可能的覆盖问题。我还将使用类来包含代码,所以这些都将保存在VM()类中。首先,我们希望创建_init__()函数,因此让我们使用它来初始化vm_data和vm_instructions变量。另外,我们知道每个字节码指令都是3字节长,所以让我们将数据[255:]分割成3字节长的字符串并将其存储在一个列表中。我们还可以将vm_data设置为字节数组,以简化执行过程。我们还将变量xor_byte初始化为0,即我们在IDA中看到的byte_404240。

接下来,我们需要创建基于字节码执行的实际函数,因此让我们采用前面的伪代码并将其放入脚本中。

调用就绪后,现在只需创建一个函数来解析字节码并调用对应于操作码的函数。虽然我们不能创建一个确切的switch语句,但是我们可以使用字典,遍历每个指令,使用opcode来确定执行哪个函数,并确保在调用VM函数之前设置了self.operand1和self.operand2。

最后,让我们添加一个main()函数,该函数将打开ram.bin,读取它,并将数据传递到VM类,然后在它输出标记之前(使用分隔符 “}” 分割它,并以一种非常符合python风格的方式将它添加回字符串)。在添加了所有内容之后,我们就得到了最后的脚本。执行脚本将输出后,把这个结果输入到标记检查器,我们就得到相应的结果。

我们有正确的标志!但是,目前我们正在从内存转储中获取标志。如果我们没有给定的内存转储,而必须解析主可执行文件以首先找到字节码的地址,然后转储并解析,该怎么办?好吧,让我们看看是否可以做到!

首先,我们需要编写一个YARA规则来检测和定位将指向VM字节码的memcpy()调用。如果这是一个真正的恶意软件样本,这个方法会很不切实际的,因为它依赖于存在只有一个二进制memcpy()调用,因为YARA只是用来检测恶意软件样本,而不查找地址。

现在,让我们开始编写规则mwt_vm_rule.yar。 YARA根据给定的规则在样本中搜索字符串,十六进制模式等。我们需要找到对memcpy()的调用的十六进制字节,并使用该字节创建规则,因此让我们快速跳回IDA,并查看我们正在处理的内容。

因此,查看这个函数,将值0x1FB推入,将偏移量推入,将dword推入,然后调用memcpy()。我们希望在本例中获得偏移量,但是我们不能简单地搜索push offset 0x404040,因为重新编译可能会改变这个偏移量,所以不是0x404040,而是0x404010,这将导致YARA在检测模式方面出现问题。这对于被推送的dword和对memcpy()地址的调用是相同的。因此,我们必须在规则中使用几个通配符。通配符表示为??,表示该位置可能有值。由于通配符相当多,因此增加了误报的机会。因此,我们将使用大小0x1FB作为常量来保持低误报。

因此,我们的YARA规则(基于上面的十六进制视图)如下所示:

{A3 ?? ?? ?? ?? 68 FB 01 00 00 68 ?? ?? ?? ?? A1 ?? ?? ?? ?? 50 E8 ?? ?? ?? ??}

将其放入.yar文件中,就形成了完整的规则:

在终端上使用yara mwt_vm_rule.yar vm1.exe运行此命令,将返回mwt_vm_rule vm1.exe,这意味着规则有效,并且字节模式位于二进制文件中!现在,我们只需要将此端口移植到Python3,从全字节模式解析地址,将虚拟地址转换为文件偏移量,然后提取数据即可!现在开始吧。

同样,我们将使用类,这次是类YARA()。对于_init__()函数,我们将接受文件名作为参数,并使用yara.compile()初始化规则。

这样,我们可以创建一个find_rule()函数,该函数使用YARA的.match()函数在二进制文件中搜索字节模式。然后,我们解析实际字节匹配返回的内容(它将包含我们需要的地址)并将其返回,我将其放在try语句中,因为该匹配可能在相似的示例中不存在,因此我们可以解决此问题。

到目前为止,执行此代码(在返回值上使用binascii.hexlify())将返回此值字符串,该字符串已由|分割。显示重要字节:

A33c42400068fb010000 | 6840404000 | a13c42400050e84a000000

0x68是用于推送的操作码,而404040是VM字节码的地址。但是,它是字节码的虚拟地址,这意味着它只有在程序被映射到内存时才有用。我们在这里处理静态二进制文件,因此我们需要将此值转换为文件偏移量。为此,我们从字节码的地址中减去该节的虚拟地址,然后将指向原始数据的指针添加到该值。因此,“等式”如下所示:

Address - VirtualAddress + PointerToRawData

这非常简单,我们将使用pefile进行计算。首先,我们从VM字节码地址中减去图像的基本地址,剩下的是0x4040。然后我们循环遍历每个可执行部分,直到找到一个虚拟地址大于字节码地址的部分。一旦找到它,我们就从上一节获取虚拟地址和PointerToRawData并从循环中断开。把这些放在一起,我们就得到文件偏移量0x1E40,然后返回它。

在此基础上,让我们使用一个“main”函数get_address()将所有内容绑定在一起。这将调用每个函数,并最终将文件偏移量返回给调用函数。

我们还可以稍微修改main()函数,所以现在我们调用YARA(filename).get_address(data),然后在打开的文件中查找偏移量,读取字节码,然后将其传递给VM()类。就这样!现在,我们可以获取二进制文件,从中解析字节码,然后对其进行解释!尽管YARA并不是很实用,但我的主要目标是展示如何使用它以及如何基于函数实际编写基本规则,所以希望你从中学到一些东西!

vm1.exe实现了一个简单的8位虚拟机(VM)来尝试和阻止逆向工程师检索攻击标记。VM的RAM包含加密的标志和一些字节码来解密它。你能弄清楚虚拟机如何工作并编写自己的虚拟机来解密标志吗? ram.bin中提供了VM RAM的副本,该副本与执行前恶意软件VM的RAM内容相同,包含自定义汇编代码和加密标志。

规则是:

1. 你不需要运行vm1.exe,此挑战仅是静态分析。

2. 不要使用调试器或转储程序从内存中检索解密的标志,这是作弊行为。

3. 可以使用免费版本的IDA Pro(无需调试器)进行分析。

在这种情况下,我将使用IDA Pro分析二进制文件,尽管诸如Cutter或Ghidra之类的工具也可以正常工作。我还将使用Python3编写脚本。查看下载的ZIP文件,我们有2个文件: vm1.exe和ram.bin,其中ram.bin包含字节码和加密标志。

对于那些不知道在恶意软件/软件打包程序的情况下虚拟机实际上是什么的人,让我简要地总结一下;样本中的虚拟机是一种混淆实际恶意软件或打包程序正在执行的操作的方法,例如,样本中将包含大量字节码,这些字节码不是有效的程序集,因此无法自行进行分析。此时,样本中将内置一个解释器,负责获取并执行字节码。该字节码可能用在切换情况下,在这种情况下,有大量没有交叉引用的功能,并且通过字节码进行调用,这意味着需要一个解释器来了解示例的工作方式。虚拟机实现的一个极为常见的示例是Python,执行时,脚本将转换为字节码,而python解释器是唯一可以理解并执行该字节码的东西。如果你有兴趣,这是一篇有关用Python编写Python解释器的精彩文章!

在IDA中打开vm1.exe,我们可以看到一些API调用,一些与MD5相关的函数调用以及对sub_4022E0的调用。首先,我对memcpy()调用很感兴趣,因为它将数据从unk_404040复制到新分配的内存区域dword_40423C,然后将其作为参数传递给MD5::DigestString()。因此,让我们看一下unk_404040,看看我们在那里能看到什么。

查看IDA中的数据,在30个空字节之后似乎有25个字节的数据,然后是更多的空字节,然后到达0x40413F处的更多数据,似乎每3个字节具有类似的结构,地址0x40413F依次为0x01、0x1D和0xBD。在这前3个字节之后,分别是0x01、0x05、0x53和0x01。在多次浏览数据后,似乎第一个字节是0x01、0x02、0x03或0x04,其余数据似乎是随机的。此时,我假设unk_404040上的数据是字节码,当我们将其与ram.bin中的数据进行比较时,这一点变得很清楚,它们是相同的。

现在知道了字节码的位置,让我们看一下函数sub_4022E0()。这个函数看起来很复杂,但实际上很简单。首先,将var_1设置为0,并移动到ecx中。指向VM字节码的指针被移动到edx中,然后[edx+ecx+0xFF]的一个字节被移动到eax中。再往下看,我们可以看到var_1在每个循环中增加了3,所以在本例中,var_1显然用作计数器。因此,[edx+ecx+0xFF]基本上是字节码[counter+255],这意味着实际的VM代码从偏移255开始。无论如何,第一个字节被移动到eax中,然后eax又被移动到var_10中。然后var_1增加1,并移动到edx中。VM字节码的地址被移动到eax中,并使用类似的[eax+edx+0xFF],现在edx不但是计数器,更是数据。字节存储在ecx中,ecx被移动到var_C中。以上过程重复一次,计数器var_1增加1,并执行类似的操作,下一个字节存储在var_8中。在循环中最后一次增加var_1,然后将var_8、var_C和var_10作为参数推入sub_402270()。测试它的返回值,然后函数返回或循环。通过分析,我们已经可以为这个函数创建伪代码。

counter = 0
while result:
    byte_1 = bytecode[counter + 255]
    counter += 1
    byte_2 = bytecode[counter + 255]
    counter += 1
    byte_3 = bytecode[counter + 255]
    counter += 1
    decode_and_execute(byte_1, byte_2, byte_3)

我已经将sub_402270() decode_and_execute()命名为sub_402270(),这是基于将字节码传递给sub_402270()并且没有其他函数处理这个字节码这一事实,所以让我们来看看它是如何工作的。首先,它将把byte_1移动到var_4中,var_4在一个值为1、2、3和4的switch语句中使用。此时,我们可以将byte_1定义为操作码,因为它决定了程序的执行,而byte_2和byte_3是操作数(byte_2 = operand1, byte_3 = operand2)。

如果var_4等于1,则将vm_bytecode的地址移入ecx,然后将其添加到byte_2的值中。将byte_3移到dl中,然后将其写入ecx指向的存储区域。然后函数返回,此函数的伪代码非常简单:

bytecode[operand1] = operand2

如果var_4等于2,则将vm_bytecode的地址移入eax,然后将其添加到byte_2中的值。该地址指向的字节被移入cl,然后被移入byte_404240。然后函数返回。同样,此函数的伪代码很简单:

byte_404240 = bytecode[operand1]

最后,如果var_4等于3,则将byte_404240中的值移入edx,并将vm_bytecode的地址移入eax,然后将其加到byte_2中的值。指向该地址的值将移入ecx,并与edx中的值进行异或。然后将其移至vm_bytecode [byte_2]。然后,该函数将返回。该块的伪代码如下:

vm_bytecode[operand1] ^= byte_404240

如果var_4等于其他任何值,则在返回之前将al设置为0。对于所有其他块,将al设置为1。

因此,现在我们首先知道字节码(opcode | operand1 | operand2)的布局以及可以执行的函数(mov,store,xor,exit),因此现在就可以开始编写脚本了!

脚本解释器

查看解析器功能与基于字节码执行的功能之间的区别,可以很清楚地看到ram.bin文件中有2个部分;数据部分([:255])和代码部分([255:])。因此,我将把文件分成2个部分,以防止任何可能的覆盖问题。我还将使用类来包含代码,所以这些都将保存在VM()类中。首先,我们希望创建_init__()函数,因此让我们使用它来初始化vm_data和vm_instructions变量。另外,我们知道每个字节码指令都是3字节长,所以让我们将数据[255:]分割成3字节长的字符串并将其存储在一个列表中。我们还可以将vm_data设置为字节数组,以简化执行过程。我们还将变量xor_byte初始化为0,即我们在IDA中看到的byte_404240。

接下来,我们需要创建基于字节码执行的实际函数,因此让我们采用前面的伪代码并将其放入脚本中。

调用就绪后,现在只需创建一个函数来解析字节码并调用对应于操作码的函数。虽然我们不能创建一个确切的switch语句,但是我们可以使用字典,遍历每个指令,使用opcode来确定执行哪个函数,并确保在调用VM函数之前设置了self.operand1和self.operand2。

最后,让我们添加一个main()函数,该函数将打开ram.bin,读取它,并将数据传递到VM类,然后在它输出标记之前(使用分隔符 “}” 分割它,并以一种非常符合python风格的方式将它添加回字符串)。在添加了所有内容之后,我们就得到了最后的脚本。执行脚本将输出后,把这个结果输入到标记检查器,我们就得到相应的结果。

我们有正确的标志!但是,目前我们正在从内存转储中获取标志。如果我们没有给定的内存转储,而必须解析主可执行文件以首先找到字节码的地址,然后转储并解析,该怎么办?好吧,让我们看看是否可以做到!

首先,我们需要编写一个YARA规则来检测和定位将指向VM字节码的memcpy()调用。如果这是一个真正的恶意软件样本,这个方法会很不切实际的,因为它依赖于存在只有一个二进制memcpy()调用,因为YARA只是用来检测恶意软件样本,而不查找地址。

现在,让我们开始编写规则mwt_vm_rule.yar。 YARA根据给定的规则在样本中搜索字符串,十六进制模式等。我们需要找到对memcpy()的调用的十六进制字节,并使用该字节创建规则,因此让我们快速跳回IDA,并查看我们正在处理的内容。

因此,查看这个函数,将值0x1FB推入,将偏移量推入,将dword推入,然后调用memcpy()。我们希望在本例中获得偏移量,但是我们不能简单地搜索push offset 0x404040,因为重新编译可能会改变这个偏移量,所以不是0x404040,而是0x404010,这将导致YARA在检测模式方面出现问题。这对于被推送的dword和对memcpy()地址的调用是相同的。因此,我们必须在规则中使用几个通配符。通配符表示为??,表示该位置可能有值。由于通配符相当多,因此增加了误报的机会。因此,我们将使用大小0x1FB作为常量来保持低误报。

因此,我们的YARA规则(基于上面的十六进制视图)如下所示:

{A3 ?? ?? ?? ?? 68 FB 01 00 00 68 ?? ?? ?? ?? A1 ?? ?? ?? ?? 50 E8 ?? ?? ?? ??}

将其放入.yar文件中,就形成了完整的规则:

在终端上使用yara mwt_vm_rule.yar vm1.exe运行此命令,将返回mwt_vm_rule vm1.exe,这意味着规则有效,并且字节模式位于二进制文件中!现在,我们只需要将此端口移植到Python3,从全字节模式解析地址,将虚拟地址转换为文件偏移量,然后提取数据即可!现在开始吧。

同样,我们将使用类,这次是类YARA()。对于_init__()函数,我们将接受文件名作为参数,并使用yara.compile()初始化规则。

这样,我们可以创建一个find_rule()函数,该函数使用YARA的.match()函数在二进制文件中搜索字节模式。然后,我们解析实际字节匹配返回的内容(它将包含我们需要的地址)并将其返回,我将其放在try语句中,因为该匹配可能在相似的示例中不存在,因此我们可以解决此问题。

到目前为止,执行此代码(在返回值上使用binascii.hexlify())将返回此值字符串,该字符串已由|分割。显示重要字节:

A33c42400068fb010000 | 6840404000 | a13c42400050e84a000000

0x68是用于推送的操作码,而404040是VM字节码的地址。但是,它是字节码的虚拟地址,这意味着它只有在程序被映射到内存时才有用。我们在这里处理静态二进制文件,因此我们需要将此值转换为文件偏移量。为此,我们从字节码的地址中减去该节的虚拟地址,然后将指向原始数据的指针添加到该值。因此,“等式”如下所示:

Address - VirtualAddress + PointerToRawData

这非常简单,我们将使用pefile进行计算。首先,我们从VM字节码地址中减去图像的基本地址,剩下的是0x4040。然后我们循环遍历每个可执行部分,直到找到一个虚拟地址大于字节码地址的部分。一旦找到它,我们就从上一节获取虚拟地址和PointerToRawData并从循环中断开。把这些放在一起,我们就得到文件偏移量0x1E40,然后返回它。

在此基础上,让我们使用一个“main”函数get_address()将所有内容绑定在一起。这将调用每个函数,并最终将文件偏移量返回给调用函数。

我们还可以稍微修改main()函数,所以现在我们调用YARA(filename).get_address(data),然后在打开的文件中查找偏移量,读取字节码,然后将其传递给VM()类。就这样!现在,我们可以获取二进制文件,从中解析字节码,然后对其进行解释!尽管YARA并不是很实用,但我的主要目标是展示如何使用它以及如何基于函数实际编写基本规则,所以希望你从中学到一些东西!

MITRE最近在其正在进行的年度Endpoint Security Eficacy测试和评估系列中进行了第二次ATT&CK反攻击仿真,此次仿真侧重于评估多个端点安全供应商针对模拟攻击者的行为能力,该测试基于详细记录的真实攻击参与者。预防不是这次测试的重点,因此假定的攻击和了解攻击者在被利用后活动的能力是主要的重点。MITR每年都会选择一个新的攻击角色,并根据公众对攻击者的了解尽可能紧密地进行模拟。

在2019年的ATT&CK评估中,臭名昭著的APT29被选为模拟组。他们是来自俄罗斯独的攻击者,最出名的是2015年夏天开始的对民主党全国委员会的攻击,该组织已经活跃了近十年,并有许多别名,如YTTRIUM、The Dukes、Cozy Bear和CozyDuke。他们的战术根据获取访问的目标和方法有很大的不同:从低速度和慢速的目标技术到全面攻击和获取,经常利用自定义的恶意软件,并依赖于PowerShell的  Living off the Land Binaries and Scripts (LOLBas) 。

考虑到主要依赖于PowerShell和相关技术,我已经将APT29最广泛使用的技术集合编译成一个PowerShell脚本,这样其他人就可以快速、轻松、安全地模拟大多数与MITRE ATT&CK相关的这种攻击者技术。该脚本主要由Red Canary Atomic Red Team框架中包含的技术组成,尽管许多技术已经被设置为和APT29相同的技术。VMware Carbon Black攻击分析单元(TAU)在准备最新的MITER ATT&CK评估回合时开发的自定义攻击场景和技术对此进行了补充:

下载地址

要开始使用脚本,只需将脚本作为模块导入,然后使用-help标志调用Invoke-APT29函数,以显示使用说明和基本信息。

1.png

显示Invoke-APT29的可用选项

2.png

显示来自MITRE ATT&CK网站的APT29上的信息

要查看(MITRE网站上)记录的有关APT29的高级信息,请调用带有-about标志的Invoke-APT29。

此时,你可以开始启动模拟攻击。这些模块由MITRE TID组成,可以通过-listTechniques标记列出。

3.png

显示可用的MITRE ATT&CK技术

4.png

使用搜索查找和启动UAC绕过技术的示例

你也可以搜索术语/工具等,通过搜索标志,找到要模拟的攻击后,将TID作为一个标志发送,以查看有关技术和执行指令的信息。将-listVariants附加到该函数将突出显示模拟攻击活动的不同方法,一旦选择了所需的攻击,通过发送-attack和-variant #标志来执行模拟攻击。

大多数模拟可以在管理权限内执行,有些模拟旨在提升权限,如上面的UAC示例。但是,某些攻击将需要管理访问权限才能成功。这些技术也可能被你的端点安全解决方案所阻止,因为所使用的技术在业界是众所周知的。

5.png

Invoke-Mimikatz sekurlsa转储攻击模拟

有些攻击会对系统进行更改,如修改注册表、创建计划任务等。因此,在合适的情况下,攻击带有-cleanup选项,允许你删除与模拟相关的任何持久数据。

6_stickykeys.png

粘滞键持久性攻击和删除示例

虽然此脚本主要关注跨单个端点的模拟,但可以跨远程主机执行攻击,并强调横向移动如何影响端点安全解决方案的遥测。首先,你可以通过发送-enablePSRemoting标志来启用PowerShell remoting,还有一个-disablePSRemoting来关闭这个功能。

7.png

PSRemoting自动化(不安全)配置

启用了PSRemoting后,现在可以在目标主机上远程执行PowerShell命令。默认情况下,“远程”攻击的目标是本地主机,因此,为了更准确地模拟此活动,建议使用惟一的域信息修改脚本。

8.png

通过psremoting在远程系统上运行Invoke-Mimikatz

为了更进一步,该脚本实现了多种方法来获得流行命令和控制工具的反向shell,如Metasploit和Empire,以及一些更流行的LOLBas选项,如Rundll32和MSHTA。要利用它们,请设置-shell标志和所需的选项。

默认情况下,这些都不是武器化/配置的,因为这些必须自定义到你自己的C2。但是,提供了攻击示例,这些示例有待进一步扩展。

9_shell.png

远程Shell示例

建立shell程序后,就可以通过将脚本导入到信标中来继续利用Invoke-APT29.ps1。例如,在Cobalt Strike中,可以使用PowerShell-Import和Powerpick完成此操作,这可以通过各种方式在类似的平台上实现。

10_cobaltstrike.png

Cobalt Strike powershell-import和powerpick示例

最重要的是,在执行各种攻击模拟之后,你将需要检查端点安全解决方案,以度量总体安全性,并确保能够检测所执行的活动。

利用Invoke-APT29,你可以模拟一个流行的、有文档记录的攻击者,并了解端点保护解决方案的安全性。

MITRE最近在其正在进行的年度Endpoint Security Eficacy测试和评估系列中进行了第二次ATT&CK反攻击仿真,此次仿真侧重于评估多个端点安全供应商针对模拟攻击者的行为能力,该测试基于详细记录的真实攻击参与者。预防不是这次测试的重点,因此假定的攻击和了解攻击者在被利用后活动的能力是主要的重点。MITR每年都会选择一个新的攻击角色,并根据公众对攻击者的了解尽可能紧密地进行模拟。

在2019年的ATT&CK评估中,臭名昭著的APT29被选为模拟组。他们是来自俄罗斯独的攻击者,最出名的是2015年夏天开始的对民主党全国委员会的攻击,该组织已经活跃了近十年,并有许多别名,如YTTRIUM、The Dukes、Cozy Bear和CozyDuke。他们的战术根据获取访问的目标和方法有很大的不同:从低速度和慢速的目标技术到全面攻击和获取,经常利用自定义的恶意软件,并依赖于PowerShell的  Living off the Land Binaries and Scripts (LOLBas) 。

考虑到主要依赖于PowerShell和相关技术,我已经将APT29最广泛使用的技术集合编译成一个PowerShell脚本,这样其他人就可以快速、轻松、安全地模拟大多数与MITRE ATT&CK相关的这种攻击者技术。该脚本主要由Red Canary Atomic Red Team框架中包含的技术组成,尽管许多技术已经被设置为和APT29相同的技术。VMware Carbon Black攻击分析单元(TAU)在准备最新的MITER ATT&CK评估回合时开发的自定义攻击场景和技术对此进行了补充:

下载地址

要开始使用脚本,只需将脚本作为模块导入,然后使用-help标志调用Invoke-APT29函数,以显示使用说明和基本信息。

1.png

显示Invoke-APT29的可用选项

2.png

显示来自MITRE ATT&CK网站的APT29上的信息

要查看(MITRE网站上)记录的有关APT29的高级信息,请调用带有-about标志的Invoke-APT29。

此时,你可以开始启动模拟攻击。这些模块由MITRE TID组成,可以通过-listTechniques标记列出。

3.png

显示可用的MITRE ATT&CK技术

4.png

使用搜索查找和启动UAC绕过技术的示例

你也可以搜索术语/工具等,通过搜索标志,找到要模拟的攻击后,将TID作为一个标志发送,以查看有关技术和执行指令的信息。将-listVariants附加到该函数将突出显示模拟攻击活动的不同方法,一旦选择了所需的攻击,通过发送-attack和-variant #标志来执行模拟攻击。

大多数模拟可以在管理权限内执行,有些模拟旨在提升权限,如上面的UAC示例。但是,某些攻击将需要管理访问权限才能成功。这些技术也可能被你的端点安全解决方案所阻止,因为所使用的技术在业界是众所周知的。

5.png

Invoke-Mimikatz sekurlsa转储攻击模拟

有些攻击会对系统进行更改,如修改注册表、创建计划任务等。因此,在合适的情况下,攻击带有-cleanup选项,允许你删除与模拟相关的任何持久数据。

6_stickykeys.png

粘滞键持久性攻击和删除示例

虽然此脚本主要关注跨单个端点的模拟,但可以跨远程主机执行攻击,并强调横向移动如何影响端点安全解决方案的遥测。首先,你可以通过发送-enablePSRemoting标志来启用PowerShell remoting,还有一个-disablePSRemoting来关闭这个功能。

7.png

PSRemoting自动化(不安全)配置

启用了PSRemoting后,现在可以在目标主机上远程执行PowerShell命令。默认情况下,“远程”攻击的目标是本地主机,因此,为了更准确地模拟此活动,建议使用惟一的域信息修改脚本。

8.png

通过psremoting在远程系统上运行Invoke-Mimikatz

为了更进一步,该脚本实现了多种方法来获得流行命令和控制工具的反向shell,如Metasploit和Empire,以及一些更流行的LOLBas选项,如Rundll32和MSHTA。要利用它们,请设置-shell标志和所需的选项。

默认情况下,这些都不是武器化/配置的,因为这些必须自定义到你自己的C2。但是,提供了攻击示例,这些示例有待进一步扩展。

9_shell.png

远程Shell示例

建立shell程序后,就可以通过将脚本导入到信标中来继续利用Invoke-APT29.ps1。例如,在Cobalt Strike中,可以使用PowerShell-Import和Powerpick完成此操作,这可以通过各种方式在类似的平台上实现。

10_cobaltstrike.png

Cobalt Strike powershell-import和powerpick示例

最重要的是,在执行各种攻击模拟之后,你将需要检查端点安全解决方案,以度量总体安全性,并确保能够检测所执行的活动。

利用Invoke-APT29,你可以模拟一个流行的、有文档记录的攻击者,并了解端点保护解决方案的安全性。