样本分析

解密C2

PE文件是32位的exe可执行程序,为了规避检测和静态扫描,该程序有经过部分加密处理,执行后会使用SSE指令按字节异或Key(byte_422918)解密出域名:
image.png
解密部分代码相对比较固定,可以总结出Python解密C2的脚本:
image.png
解密代码的反汇编和十六进制数据:
红色部分从上到下分别是,密文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处获取加密前数据:

  1. 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:

  1. 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的域名和端口号:
image.png

上线

解密出C2后,尝试与C2服务器建立连接,成功后向C2服务器发送数据包:
image.png
数据包的内容为0xA字节的00:
image.png
对比返回的数据是否是“AUgO”,是则进入通过注册表获取信息(计算机(ProductName)和安装软件(Uninstall))的函数。

发送计算机信息

首先获取系统版本信息(如:Windows 7 Professional),将获取的宽字节数据按2位一步异或210(0xD2)长度的Key(byte_420708)后发送:
image.png
接着通过“SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”遍历注册表中的软件安装信息,同样加密后发送:
image.png

流量特征

Key值如下,本次报警的4个PE除了ImpHash一致之外,Key值也是相同的,可以作为文件特征。
发送的数据是明文异或Key加密后的密文,如若从流量中捕获加密数据,可以通过异或Key值还原:

  1. 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 做异或运算,结果仍然是原来的数):
100.png

  1. 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值:
image.png
因为Key和密文每个奇数(下标从0开始算)字节会重复,超出明文部分的长度则和Key完全相同,故Key值除了能用来还原流量中的加密数据之外,也可以作为捕获密文的流量规则使用:
*明文数据为(“Windows 7 Professional”)
image.png

特殊字符串

由于捕获的这几个样本并没有大幅度的更新功能,运行过程中需要使用的字符串在PE数据中也相同。部分具有非通用的特质,如特殊字符串,或者常见字符串的特殊组合,可以作为单一条件的强特征:
image.png
还有部分特殊字符串虽没有强烈的证据证明其有特殊含义,但是在每个信息获取后,均会有不明含义的字符串发送代码。由于其位置的相对固定,功能上获取可以认为是不同数据之间的分隔符:
image.png

窃取指定类型文件

遍历驱动盘A-Z并记录其驱动类型:
image.png
遍历驱动盘文件寻找指定类型文件:
image.png
但不包括一些特殊的路径,如安装目录,程序目录和系统目录:

  1. \\AppData\\Roaming
  2. \\AppData\\LocalLow
  3. \\AppData\\Local
  4. C:\\Windows
  5. C:\\PerfLogs
  6. C:\\Program Files
  7. C:\\Program Files (x86)
  8. C:\\ProgramData
  9. C:\\Windows10Upgrade
  10. C:\\Intel
  11. C:\\inetpub

指定的文件类型是.doc、.docx、.csv和.lnk:
image.png
遍历到指定类型的文件后,进入发送文件信息和文件数据的函数:
image.png

发送文件数据

先获取到的文件名和文件大小(字节)处理为宽字节字符串“LatsRo Beta:[文件名]\ BiSm:[文件大小]”,如“LatsRo Beta:FileName\ BiSm:333”:
image.png
加密方式依旧是隔字节异或Key,最终发送的数据大小为1022(0x3FE)字节:
image.png
image.png
接着读取文件数据:
image.png
将读取到的文件内容以1022为一个单位,使用另一个0xC的Key(byte_4207DC)进行按字节异或处理后发送:
image.png
image.png

清理

所有目标文件遍历并发送完成后,最后会进行清理操作:

  1. 创建并写入文件“%TEMP%/system.bat”,用于删除EXE文件和bat脚本本身:

(但此处写入的EXE路径竟然是%TEMP%+自身文件名,是rtf文件释放exe时使用的路径)
image.png

  1. del "%temp%\[exeNAME].exe"
  2. del "C:\Users\ADMINI~1\AppData\Local\Temp\system.bat"
  1. 创建并写入文件“%TEMP%/system.vbs”,用于执行bat脚本文件,删除vbs脚本本身:

image.png

  1. 最后解密出“ShellExecuteA”的函数地址,执行“%TEMP%/system.vbs”脚本:

image.png

  1. On Error Resume Next
  2. set ws=WScript.CreateObject("WScript.Shell")
  3. ws.Run "C:\Users\ADMINI~1\AppData\Local\Temp\system.bat",0
  4. set fso = CreateObject("Scripting.FileSystemObject")
  5. f = fso.DeleteFile("C:\Users\ADMINI~1\AppData\Local\Temp\system.vbs")

回溯一下此步的操作:

  1. ShellExecuteA执行vbs脚本删除自身,执行bat脚本
  2. 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值不仅可以用于流量报警,流量还原,还可以对其攻击载荷进行固定。

解密脚本

C2

解密-APT-绿斑-C2

流量

解密-APT-绿斑-流量