九维团队-青队(处置)| 恶意软件的混淆技术(二)

渗透技巧 2个月前 admin
187 0 0

九维团队-青队(处置)| 恶意软件的混淆技术(二)


写在前边

1.本文原文为K A, Monnappa. 2018年发表的《Learning Malware Analysis》,本文的相关内容均为笔者对相关内容的翻译及实践记录,仅供各位学术交流使用。另出于易读性考虑,对部分字句有所删改。 
2.如各位需要引用,请做原文引用,格式如下所示: 
[序号]K A, Monnappa. LearningMalware Analysis[M]. 2018.06. Published by Packt Publishing Ltd. Livery Place 35 Livery Street Birmingham B3 2PB, UK. 
3.因文章整体内容较长,完整内容将会在本公众号拆分为多篇内容分别发出。本文为该系列的第二篇。
往期内容请参见合集《Learning Malware Analysis》





02

Base64编码


使用凯撒密码,攻击者可以对字母进行加密,但对二进制数据的加密还不够好,因此攻击者通常会使用其他各种编码/加密算法来加密二进制数据。Base64编码允许攻击者将二进制数据编码为ASCII字符串格式。由于这个原因,你会经常看到攻击者在HTTP等纯文本协议中使用Base64编码的数据。


2.1 将数据转换为Base64

标准的Base64编码通常由以下64个字符集组成。要编码的二进制数据的每3个字节(24位)被翻译成该字符集的四个字符。每个翻译的字符大小为6比特。除了以下字符外,=字符用于填充。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

*左右滑动查看更多


为了了解数据如何被翻译成Base64编码,首先需要建立Base64索引表,将索引0到63分配给字符集中的字母,如下图所示。按照下表,索引0对应于字母A,索引62对应于+,以此类推。

九维团队-青队(处置)| 恶意软件的混淆技术(二)


现在,假设我们想对文本 "One "进行Base64编码。要做到这一点,我们需要将字母转换为其相应的比特值,如下所示。

o -> 0x4f -> 01001111n -> 0x6e -> 01101110e -> 0x65 -> 01100101

  

Base64算法一次处理3个字节(6比特)(24位);在这种情况下,我们正好有24个比特,它们彼此相邻放置,如下所示。

010011110110111001100101

随后,这24位被分成四部分,每部分由6位组成,并转换为其等效的十进制值。然后十进制值被用作索引,以便在Base64索引表中找到相应的值,因此该文本最终被编码为T25l。

010011 -> 19 -> base64 table lookup -> T110110 -> 54 -> base64 table lookup -> 2111001 -> 57 -> base64 table lookup -> 5100101 -> 37 -> base64 table lookup -> l

*左右滑动查看更多


解码Base64是一个反向的过程,但理解Base64编码或解码的工作原理并不是必须的,因为有一些python模块和工具可以让你在不了解算法的情况下解码Base64编码的数据。在攻击者使用自定义版本的Base64编码的情况下,了解它将有所帮助。


2.2 编码和解码 Base64

要在Python(2.x)中使用Base64对数据进行编码,请使用以下代码:

>>> import base64>>> plain_text = "One">>> encoded = base64.b64encode(plain_text)>>> print encodedT25l

*左右滑动查看更多


要在python中解码base64数据,请使用以下代码:

>>> import base64>>> encoded = "T25l">>> decoded = base64.b64decode(encoded) >>> print decodedOne

*左右滑动查看更多


GCHQ的CyberChef是一个伟大的web应用程序,它允许你在浏览器中进行各种编码/解码、加密/解密、压缩/解压和数据分析操作。

CyberChef访问网址:https://gchq.github.io/CyberChef/更多细节请参阅:https://github.com/gchq/CyberChef


你也可以使用诸如ConverterNET这样的工具对base64数据进行编码/解码。ConvertNET提供各种功能,允许你将数据转换为/从许多不同的格式。

ConverterNET访问网址:http://www.kahusecurity.com/tools/

要进行编码,只需在输入栏中输入要编码的文本,然后点击Text to Base64按钮。要解码,在输入栏中输入要编码的数据,然后点击Base64到文本按钮即可。下面的截图显示了使用ConverterNET对字符串Hi进行的Base64编码。

九维团队-青队(处置)| 恶意软件的混淆技术(二)


编码后的字符串末尾的=字符是填充字符。如果你还记得,该算法将三个字节的输入转换为四个字符,由于Hi只有两个字符,它被填充成三个字符;只要使用了填充,你就会在Base64编码的字符串的末尾看到=字符。这意味着一个有效的Base64编码的字符串的长度总是4的倍数。


2.3 解码自定义的Base64

攻击者使用不同的Base64编码变化,其目的是阻止Base64解码工具成功解码数据。在本节中,你将了解到部分相关技术。


一些恶意软件样本将填充字符(=)从末端移除。这里显示了一个恶意软件样本(Trojan Qidmorks)进行的C2通信。下图中有效载荷看起来是用base64编码的。

九维团队-青队(处置)| 恶意软件的混淆技术(二)

当我们试图解码POST有效载荷时,将会得到不正确的填充错误,如下所示。

九维团队-青队(处置)| 恶意软件的混淆技术(二)

这个错误的原因是,编码字符串的长度(150)不是4的倍数。换句话说,Base64编码的数据中缺少两个字符,这很可能是填充字符(==)。

>>> encoded = "Q3VycmVudFZlcnNpb246IDYuMQ0KVXNlciBwcml2aWxlZ2llcyBsZXZlbDogMg0KUGFyZW50IH Byb2Nlc3M6IFxEZXZpY2VcSGFyZGRpc2tWb2x1bWUxXFdpbmRvd3NcZXhwbG9yZXIuZXhlDQoNC g">>> len(encoded)150

*左右滑动查看更多


将两个填充字符(==)附加到编码的字符串中,成功地解码了数据,如下图所示。从解码后的数据可以看出,恶意软件向C2服务器发送了操作系统版本(6.1代表Windows 7)、用户的权限级别和父进程。

九维团队-青队(处置)| 恶意软件的混淆技术(二)


有时,恶意软件作者使用base64编码的轻微变化。例如,攻击者可以使用一个字符集,其中字符-和_被用来代替+和/(第63和64个字符),如下所示。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

*左右滑动查看更多


一旦确定了在原始字符集中被替换的字符来对数据进行编码,那么我们就可以使用如下所示的代码。此处的意思是将修改后的字符替换回标准字符集中的原始字符,然后再进行解码。

>>> import base64>>> encoded = "cGFzc3dvcmQxMjM0IUA_PUB-">>> encoded = encoded.replace("-","+").replace("_","/") >>> decoded = base64.b64decode(encoded)>>> print decodedpassword1234!@?=@~

*左右滑动查看更多


有时,恶意软件作者会改变字符集中的字符顺序。例如,他们可能使用以下字符集而不是标准字符集。

0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

*左右滑动查看更多


当攻击者使用非标准的Base64字符集时,我们可以用以下代码对数据进行解码。注意,在下面的代码中,除了64个字符外,变量chr_set和non_chr_set还包括填充字符=(第65个字符),这是正确解码所需要的。

>>> import base64>>> chr_set = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" >>> non_chr_set = "0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=">>> encoded = "G6JgP6w=" >>> re_encoded = "">>> for en_ch in encoded:            re_encoded += en_ch.replace(en_ch,   chr_set[non_chr_set.find(en_ch)])>>> decoded = base64.b64decode(re_encoded) >>> print decodedHello

*左右滑动查看更多


你也可以使用ConverterNET工具,通过选择转换自定义Base64来执行自定义Base64解码。只要在Alphabet字段中输入自定义的Base64字符集,然后在Input字段中输入要解码的数据,并按下Decode按钮,如下图所示。

九维团队-青队(处置)| 恶意软件的混淆技术(二)


2.4 识别Base64


我们可以通过寻找一个由Base64字符集(字母数字字符、+和/)组成的长字符串来识别一个使用Base64编码的二进制文件。下面的截图显示了恶意二进制文件中的Base64字符集,表明恶意软件可能使用了Base64编码。

九维团队-青队(处置)| 恶意软件的混淆技术(二)


你可以使用字符串交叉引用功能来定位使用Base64字符集的代码,如以下截图所示。即使没有必要知道代码中哪里使用了Base64字符集来解码Base64数据,但有时,定位它是有用的。


例如在恶意软件作者使用Base64编码和其他加密算法的情况下。又或者如果恶意软件用某种加密算法对C2网络流量进行加密,然后使用Base64编码;在这种情况下,定位Base64字符集可能会使你进入Base64函数。然后就可以分析Base64函数或确定调用Base64函数的函数(使用Xrefs功能),这可能会令你找到加密函数。

九维团队-青队(处置)| 恶意软件的混淆技术(二)


我们可以在x64dbg中使用字符串交叉引用;要做到这一点,需要确保调试器在模块内任何地方暂停,然后在反汇编窗口(CPU窗口)上点击右键,选择搜索|当前模块|字符串引用。


另一种检测二进制文件中是否存在Base64字符集的方法是使用YARA规则,如下所示。

 rule base64   {   strings:       $a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"       $b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"   condition:$a or $b }

*左右滑动查看更多



—  往期回顾  —


九维团队-青队(处置)| 恶意软件的混淆技术(二)

九维团队-青队(处置)| 恶意软件的混淆技术(二)

九维团队-青队(处置)| 恶意软件的混淆技术(二)

九维团队-青队(处置)| 恶意软件的混淆技术(二)

九维团队-青队(处置)| 恶意软件的混淆技术(二)



关于安恒信息安全服务团队
安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。

九维团队-青队(处置)| 恶意软件的混淆技术(二)

九维团队-青队(处置)| 恶意软件的混淆技术(二)

九维团队-青队(处置)| 恶意软件的混淆技术(二)

原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 恶意软件的混淆技术(二)

版权声明:admin 发表于 2022年12月2日 上午9:27。
转载请注明:九维团队-青队(处置)| 恶意软件的混淆技术(二) | CTF导航

相关文章

暂无评论

暂无评论...