Xloader 是一个接棒 Formbook 的、旨在信息窃密的恶意软件。自从 2016 年来,Formbook 就一直通过黑客论坛进行贩售。2020 年 10 月,Formbook 正式升级为 Xloader,引入了一些重大的功能改进,尤其是 C&C 加密通信。
在 Formbook 时代,攻击者随恶意软件一同出售的还有控制面板。2017 年,Formbook 控制面板的源代码被泄露后,攻击者就转向了不同的商业模式。在 Xloader 时代,攻击者不再出售全套基础设施,而是出租给用户。
Xloader 的主要功能包括:
通过浏览器或其他应用程序窃取凭据
记录用户击键
屏幕截图
下载并执行其他二进制文件
远程命令执行
Xloader 是跨平台的,支持 Windows 与 MacOS,本文针对 Windows 平台的 Xloader 开展分析。
技术分析
C&C 通信
C&C 服务器
push ebp
和 mov ebp, esp
混淆反汇编程序和分析人员。
PUSHEBP 代码块
PUSHEBP
代码块,且使用基于 RC4+编码+自定义虚拟机进行加密保护。
解密代码
RC4_based_Decryptor
函数由 RC4 加密算法(0x14 字节密钥)和另外两层编码组成,如下所示:
def decrypt_PUSHEBP_encrypted_function_block(self, rc4_key, encdata):
encdata = self.decrypt_PUSHEBP_backward_forward_sub_layers(encdata)
encdata = self.rc4(encdata, rc4_key)
encdata = self.decrypt_PUSHEBP_backward_forward_sub_layers(encdata)
return encdata
def decrypt_PUSHEBP_backward_forward_sub_layers(self, encdata):
encdata = list(encdata)
lencdata = len(encdata)
p1 = lencdata - 2
counter = lencdata - 1
while True:
encdata[p1] = chr(0xff&(ord(encdata[p1]) - ord(encdata[p1 + 1])))
p1 -= 1
counter -= 1
if not counter: break p1 = 0
counter = lencdata - 1
while True:
encdata[p1] = chr(0xff&(ord(encdata[p1]) - ord(encdata[p1 + 1])))
p1 += 1
counter -= 1
if not counter: break
return ''.join(encdata)
VM_Decryptor
函数实现了自定义虚拟机,以下代码为 Xloader 解密真实 C&C 服务器的步骤:
# 获取加密字符串
b1 = GetPUSHEBPBlock(1)
enc_strings_block = VM_Decryptor(b1)
# 获取 RC4 Key1
b8 = GetPUSHEBPBlock(8)
key_rc4_1 = VM_Decryptor(b8)
# 获取 RC4 Key2
b2 = GetPUSHEBPBlock(2)
key_rc4_2 = VM_Decryptor(b2)
# 获取加密数据块
b11 = GetPUSHEBPBlock(11)
enc_real_c2 = VM_Decryptor(b11)
# 第一层解密
enc_real_c2 = RC4_based_Decryptor(enc_real_c2, SHA1(enc_strings_block))
# 第二层解密
enc_real_c2 = RC4_based_Decryptor(enc_real_c2, key_rc4_1)
dec_real_c2 = RC4_based_Decryptor(enc_real_c2, key_rc4_2)
# 验证是否正确
b_ok = is_www(dec_real_c2)
www.domain.tld/botnet_id/
。FormBook 加密通信
① 使用真实的 C&C 域名和路径,通过 Reverse_DWORDs(SHA1(<domain>/<cncpath>/)) 计算 RC4 加密密钥
② 使用加密密钥加密数据
③ 将加密后的数据进行 base64 编码
④ 进行字符替换后再发送 POST 请求
原始字符 | 替换字符 |
---|---|
+ | - |
/ | _ |
= | . |
+ | ~ |
/ | ( |
= | ) |
+ | 空格 |
在已知 C&C 域名和路径的情况下,FormBook 的 C&C 加密通信可以轻松解密。
Xloader 加密通信
Key0Comm
密钥
Key0Comm 密钥生成
Key0Comm
为:Key0Comm = RC4_based_Decryptor(decPushebpBlock7Key[:0x14], decSwitchBasedPushebpBlock)
样本比较
Switch 语句映射关系
Key1Comm
密钥:Key1Comm = Reverse_DWORDs(SHA1(<domain>/<cncpath>/))
Key2Comm
密钥:Key2Comm = RC4based_Decryptor(Key0Comm, Key1Comm)
Key0Comm = <…from binary…>
c2 = "www.pc6888.com"
c2path = "htbn"
get1="xPeDUfwp=X/0PTsm65bsB0xA5p5tU+UuBoyxUJvYd1eRdC0qFrd+bv9rqN9yTTECZJTYp88Jb6QhjuA=="
Key1Comm = Reverse_DWORDs(SHA1(f"{c2}/{path}/"))
fake_var, encrypted_params = get1.split('=', 1)
sdec0 = b64_trans(encrypted_params)
sdec1 = base64.b64decode(sdec0)
Key2Comm = RC4_based_Decryptor(Key0Comm, Key1Comm)
sdec2 = rc4(sdec1, Key2Comm)
# 标准 RC4 加密层
sdec3 = rc4(sdec2, Key1Comm)
print(sdec3)
当然,Xloader 也会使用 base64 编码与字符替换。
结论
IOC
c60a64f8910005f98f6cd8c5787e4fe8c6580751a43bdbbd6a14af1ef6999b8f
2c78fa1d90fe76c14f0a642af43c560875054e342bbb144aa9ff8f0fdbb0670f
f3c3c0c49c037e7efa2fbef61995c1dc97cfe2887281ba4b687bdd6aa0a44e0a
efd1897cf1232815bb1f1fbe8496804186d7c48c6bfa05b2dea6bd3bb0b67ed0
http://www.finetipster.com/pvxz/
http://www.go2payme.com/snec/
http://www.pochi-owarai.com/hr8n/
http://www.hosotructiep.online/bsz6/