样本分析
解密C2
PE文件是32位的exe可执行程序,为了规避检测和静态扫描,该程序有经过部分加密处理,执行后会使用SSE指令按字节异或Key(byte_422918)解密出域名:
解密部分代码相对比较固定,可以总结出Python解密C2的脚本:
解密代码的反汇编和十六进制数据:
红色部分从上到下分别是,密文VA,密钥VA,明文长度;
紫色部分是正则使用的匹配数据
地址 | Hex | 反汇编代码 |
---|---|---|
402B89 | 8D8424 A8000000 | LEA EAX,DWORD PTR SS:[ESP+0xA8] |
402B90 | 6A 37 | PUSH 0x37 |
402B92 | 68 9E284200 | PUSH 0042289E |
402B97 | 50 | PUSH EAX |
402B98 | E8 13120000 | CALL 00403DB0 |
402B9D | 0F108424 B4000000 | MOVUPS XMM0,DQWORD PTR SS:[ESP+0xB4] |
402BA5 | 83C4 0C | ADD ESP,0xC |
402BA8 | 33C9 | XOR ECX,ECX |
402BAA | 0F100D 18294200 | MOVUPS XMM1,DQWORD PTR DS:[0x422918] |
402BB1 | BA 17000000 | MOV EDX,0x17 |
402BB6 | 66:0FEFC8 | PXOR MM1,MM0 |
从VA地址422918处获取加密前数据:
0x7A, 0xE0, 0x75, 0x76, 0xEB, 0x83, 0x81, 0x6E, 0x3C, 0xEB, 0xDE, 0x4C, 0x6D, 0x9F, 0xD0, 0x5A, 0x4F, 0x51, 0x10, 0x50, 0x80, 0xD3, 0xCF, 0x59
从VA地址42289E处获取解密C2的Key:
0x18, 0x92, 0x1A, 0x01, 0x98, 0xE6, 0xF3, 0x00, 0x59, 0x9F, 0xF0, 0x25, 0x19, 0xEC, 0xB1, 0x35, 0x23, 0x7F, 0x73, 0x3F, 0xED, 0xD3, 0xF7, 0x69
使用SSE指令(_mm_xor_si128)异或后,前0x18字节为C2的域名和端口号:
上线
解密出C2后,尝试与C2服务器建立连接,成功后向C2服务器发送数据包:
数据包的内容为0xA字节的00:
对比返回的数据是否是“AUgO”,是则进入通过注册表获取信息(计算机(ProductName)和安装软件(Uninstall))的函数。
发送计算机信息
首先获取系统版本信息(如:Windows 7 Professional),将获取的宽字节数据按2位一步异或210(0xD2)长度的Key(byte_420708)后发送:
接着通过“SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”遍历注册表中的软件安装信息,同样加密后发送:
流量特征
Key值如下,本次报警的4个PE除了ImpHash一致之外,Key值也是相同的,可以作为文件特征。
发送的数据是明文异或Key加密后的密文,如若从流量中捕获加密数据,可以通过异或Key值还原:
5D C6 6F 73 E9 C4 2E AA 59 A9 35 04 D1 A4 19 AF 66 B7 83 45 95 89 3A 90 F2 06 2B BF DA 91 64 A6 88 91 A7 E1 E8 98 4F 3E 68 78 C4 AB CA AE 29 4C 25 56 3B 2C 13 33 12 BD 84 33 3F AF BD A1 C0 29 2E 7A 7C B3 F2 1F 91 EF 22 8C F6 B7 B2 7A EC 25 47 59 7A 1B 46 0E 51 8F 6F 35 50 93 C1 FC 36 50 56 1A 95 36 A1 A3 12 D9 AA EE 26 AB 36 B0 7C 08 E7 10 16 47 E3 E9 CE C6 73 60 78 2A B0 3A 57 B2 20 DB 01 93 32 0C E3 AF 7A 17 D9 44 9B 04 76 A6 1F 7E D5 A7 02 96 73 AC 54 B0 D9 96 A3 42 1D 7F 6E 4D 27 D1 A4 2E 9F AC ED B7 1F 91 EF B0 0C E3 AF 7A 04 D1 A4 2E 15 5D EB 9B 1F 91 EF B0 85 92 2D 65 DB 01 F5 64 A4 B7 91 EF B0 0C E3 AF E7 5C 8D D5
多次发送数据时,均使用这一Key对数据进行异或处理,但长度均大于原数据长度,超出的部分会与空数据(0x00)进行异或,保留了原始的Key值(任何数和0x00 做异或运算,结果仍然是原来的数):
0A C6 06 73 87 C4 4A AA 36 A9 42 04 A2 A4 39 AF 51 B7 A3 45 C5 89 48 90 9D 06 4D BF BF 91 17 A6 FB 91 CE E1 87 98 21 3E 09 78 A8 AB CA AE 29 4C 25 56 3B 2C 13 33 12 BD 84 33 3F AF BD A1 C0 29 2E 7A 7C B3 F2 1F 91 EF 22 8C F6 B7 B2 7A EC 25 47 59 7A 1B 46 0E 51 8F 6F 35 50 93 C1 FC 36 50 56 1A 95 36 A1 A3 12 D9 AA EE 26 AB 36 B0 7C 08 E7 10 16 47 E3 E9 CE C6 73 60 78 2A B0 3A 57 B2 20 DB 01 93 32 0C E3 AF 7A 17 D9 44 9B 04 76 A6 1F 7E D5 A7 02 96 73 AC 54 B0 D9 96 A3 42 1D 7F 6E 4D 27 D1 A4 2E 9F AC ED B7 1F 91 EF B0 0C E3 AF 7A 04 D1 A4 2E 15 5D EB 9B 1F 91 EF B0 85 92 2D 65 DB 01 F5 64 A4 B7 91 EF B0 0C E3 AF E7 5C 8D D5 5D C6 6F 73 E9 C4 2E AA 59 A9 35 04 D1 A4 19 AF 66 B7 83 45 95 89 3A 90 F2 06 2B BF DA 91 64 A6 88 91 A7 E1 E8 98 4F 3E 68 78 C4 AB CA AE 29 4C 25 56 3B 2C 13 33 12 BD 84 33 3F AF BD A1 C0 29 2E 7A 7C B3 F2 1F 91 EF 22 8C F6 B7 B2 7A EC 25 47 59 7A 1B 46 0E 51 8F 6F 35 50 93 C1 FC 36 50 56 1A 95 36 A1 A3 12 D9 AA EE 26 AB 36 B0 7C 08 E7 10 16 47 E3 E9 CE C6 73 60 78 2A B0 3A 57 B2 20 DB 01 93 32 0C E3 AF 7A 17 D9 44 9B 04 76 A6 1F 7E D5 A7 02 96 73 AC 54 B0 D9 96 A3 42 1D 7F 6E 4D 27 D1 A4 2E 9F AC ED B7 1F 91 EF B0 0C E3 AF 7A 04 D1 A4 2E 15 5D EB 9B 1F 91 EF B0 85 92 2D 65 DB 01 F5 64 A4 B7 91 EF B0 0C E3 AF E7 5C 8D D5 5D C6 6F 73 E9 C4 2E AA 59 A9 35 04 D1 A4 19 AF 66 B7 83 45 95 89 3A 90 F2 06 2B BF DA 91 64 A6 88 91 A7 E1 E8 98 4F 3E 68 78 C4 AB CA AE 29 4C 25 56 3B 2C 13 33 12 BD 84 33 3F AF BD A1 C0 29 2E 7A 7C B3 F2 1F 91 EF 22 8C F6 B7 B2 7A EC 25 47 59 7A 1B 46 0E 51 8F 6F 35 50 93 C1 FC 36 50 56 1A 95 36
可能是由于开发者的粗心,往往发送的数据字节固定为260(0x104)字节,在多处小于260大小的明文(如)加密后发送时,带有大量的Key值:
因为Key和密文每个奇数(下标从0开始算)字节会重复,超出明文部分的长度则和Key完全相同,故Key值除了能用来还原流量中的加密数据之外,也可以作为捕获密文的流量规则使用:
*明文数据为(“Windows 7 Professional”)
特殊字符串
由于捕获的这几个样本并没有大幅度的更新功能,运行过程中需要使用的字符串在PE数据中也相同。部分具有非通用的特质,如特殊字符串,或者常见字符串的特殊组合,可以作为单一条件的强特征:
还有部分特殊字符串虽没有强烈的证据证明其有特殊含义,但是在每个信息获取后,均会有不明含义的字符串发送代码。由于其位置的相对固定,功能上获取可以认为是不同数据之间的分隔符:
窃取指定类型文件
遍历驱动盘A-Z并记录其驱动类型:
遍历驱动盘文件寻找指定类型文件:
但不包括一些特殊的路径,如安装目录,程序目录和系统目录:
\\AppData\\Roaming
\\AppData\\LocalLow
\\AppData\\Local
C:\\Windows
C:\\PerfLogs
C:\\Program Files
C:\\Program Files (x86)
C:\\ProgramData
C:\\Windows10Upgrade
C:\\Intel
C:\\inetpub
指定的文件类型是.doc、.docx、.csv和.lnk:
遍历到指定类型的文件后,进入发送文件信息和文件数据的函数:
发送文件数据
先获取到的文件名和文件大小(字节)处理为宽字节字符串“LatsRo Beta:[文件名]\ BiSm:[文件大小]”,如“LatsRo Beta:FileName\ BiSm:333”:
加密方式依旧是隔字节异或Key,最终发送的数据大小为1022(0x3FE)字节:
接着读取文件数据:
将读取到的文件内容以1022为一个单位,使用另一个0xC的Key(byte_4207DC)进行按字节异或处理后发送:
清理
所有目标文件遍历并发送完成后,最后会进行清理操作:
- 创建并写入文件“%TEMP%/system.bat”,用于删除EXE文件和bat脚本本身:
(但此处写入的EXE路径竟然是%TEMP%+自身文件名,是rtf文件释放exe时使用的路径)
del "%temp%\[exeNAME].exe"
del "C:\Users\ADMINI~1\AppData\Local\Temp\system.bat"
- 创建并写入文件“%TEMP%/system.vbs”,用于执行bat脚本文件,删除vbs脚本本身:
- 最后解密出“ShellExecuteA”的函数地址,执行“%TEMP%/system.vbs”脚本:
On Error Resume Next
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "C:\Users\ADMINI~1\AppData\Local\Temp\system.bat",0
set fso = CreateObject("Scripting.FileSystemObject")
f = fso.DeleteFile("C:\Users\ADMINI~1\AppData\Local\Temp\system.vbs")
回溯一下此步的操作:
ShellExecuteA执行vbs脚本删除自身,执行bat脚本
bat脚本删除自身,和exe文件
至此释放的样本都被消除,完成了一次没有遗留文件痕迹的敏感类型文件窃取。
相同点分析和规则提取
文件内的可见字符串和PE的ImpHash相同,Key有部分相同。
Key值总共有三个,均通过异或的方式使用,分别用于解密C2,隔字节加密字符串,加密文件数据。其中解密C2的Key值各不相同,加密数据的Key值均相同。
这很好理解,对于解密操作,只需要执行一次并且不需要进行逆操作,故解密C2使用的是一次性即抛的Key。
而加密后的文件需要解密,如果每个载荷使用不同的Key值进行加密,对于攻击者来说,还需要对加密后的数据进行Key值的判断,使用不同的Key进行解密。相对而言会麻烦但更隐蔽一些,所以加密的Key攻击者往往更偏向使用同一个。
IOC-Key
字符串加密Key | |
---|---|
5D C6 6F 73 E9 C4 2E AA 59 A9 35 04 D1 A4 19 AF 66 B7 83 45 95 89 3A 90 F2 06 2B BF DA 91 64 A6 88 91 A7 E1 E8 98 4F 3E 68 78 C4 AB CA AE 29 4C 25 56 3B 2C 13 33 12 BD 84 33 3F AF BD A1 C0 29 2E 7A 7C B3 F2 1F 91 EF 22 8C F6 B7 B2 7A EC 25 47 59 7A 1B 46 0E 51 8F 6F 35 50 93 C1 FC 36 50 56 1A 95 36 A1 A3 12 D9 AA EE 26 AB 36 B0 7C 08 E7 10 16 47 E3 E9 CE C6 73 60 78 2A B0 3A 57 B2 20 DB 01 93 32 0C E3 AF 7A 17 D9 44 9B 04 76 A6 1F 7E D5 A7 02 96 73 AC 54 B0 D9 96 A3 42 1D 7F 6E 4D 27 D1 A4 2E 9F AC ED B7 1F 91 EF B0 0C E3 AF 7A 04 D1 A4 2E 15 5D EB 9B 1F 91 EF B0 85 92 2D 65 DB 01 F5 64 A4 B7 91 EF B0 0C E3 AF E7 5C 8D D5 | |
文件内容加密Key | A2 5E 75 B6 74 3D FA EB 90 2A 3B 59 |
总结
通过绿斑PE文件规则报警,发现4个样本,分析后确认均属于绿斑组织。利用多个文件的相似点,对规则进行扩展和多维度总结。
发现由于其对窃取的文件加密处理的方式比较特殊,而且加密的Key值相同,认为Key值不仅可以用于流量报警,流量还原,还可以对其攻击载荷进行固定。