简述
一封恶意电子邮件,内含Snake Keylogger。Snake Keylogger是一种用 .NET 编程语言编写的信息窃取恶意软件,它于 2020 年 11 月被发现,也被称为 404 Keylogger、404KeyLogger 和 Snake。它专注于从受害者的设备窃取敏感信息,包括已保存的凭据、受害者的击键、受害者的屏幕截图以及剪贴板数据。
电子邮件
IOC
Hash | 值 |
---|---|
MD5 | 60D00C17D3EA15910893EEF868DE7A65 |
SHA1 | 1D17DD1688A903CBE423D8DE58F8A7AB7ECE1EA5 |
SHA256 | D13A7EAAF07C924159EA7BB8F297DAB1D8DA0F9AF46E82E24052D6A9BF5E4087 |
邮件分析
打开后邮件内含一个pago.4094.r09。
如何分析一封电子邮件是否是恶意钓鱼邮件?
- 使用通用问候语,而非名字
- 邮件未通过SPF、DKIM或DMARC检查
- 有时间限制或非同寻常的急迫感(想要用户及时采取行动)
- 正文消息漏洞百出
- 正文消息中的连接与发件人的域不一致
- 等等...
看电子邮件,开头的问候语是尊敬的先生;邮件最下方是宝马和某机构的徽标,发件人试图使用熟悉度,熟悉度利用是一种社会工程策略,攻击者假装成目标熟悉的实体。
分析SPF和DKIM信息:
- SPF(发件人政策框架)是一个电子邮件认证协议,旨在检测电子邮件欺骗行为,并防止未经授权的发件人代表特定的域名发送邮件。
- DKIM(域名密钥识别邮件)是一种标准的电子邮件身份验证方法,它会在外发邮件中添加数字签名。 邮件接收服务器在收到DKIM 签名的邮件后,可验证邮件是否确实来自发件人,而非冒充发件人的其他人。 DKIM 还会执行检查,以确保邮件内容在邮件发送后未发生变化。
同样的,该邮件既无DKIM记录也没用DMARC。邮件也未签名。
附件分析
pago.4094.r09:IOC
Hash | 值 |
---|---|
MD5 | a448bda0002ecd968b6ae9526617c974 |
SHA1 | cf13df73eff74b9ceb6d837c1d7cc9d01fe918db |
SHA256 | ad24b345eac9876a65fb6b0d2eda0da669c3b23aaa969db9ce913f8a63c0a5f1 |
该文件是一个rar压缩包。解压后会得到一个pago 4094.exe的应用程序
pago 4094.exe:IOC
Hash | 值 |
---|---|
MD5 | 1a0f4cc0513f1b56fef01c815410c6ea |
SHA1 | cf13df73eff74b9ceb6d837c1d7cc9d01fe918db |
SHA256 | d483d48c15f797c92c89d2eafcc9fc7cbe0c02cabe1d9130bb9069e8c897c94c |
沙箱分析
双击运行后,大约三十秒后,pago4094.exe从桌面上消失。
创建子进程“C:\Users\admin\Desktop\pago 4094.exe”,并释放可执行文件“C:\Users\admin\AppData\Local\Temp\tmpG484.tmp”。释放 .tmp 文件是为了确保在受害机器上的持久性。
1112进程
可以观察它创建文件或文件夹、查询注册表、执行系统信息发现、检查LSA保护、放弃一个应用程序手动执行其它恶意文件。
在路径“C:\Users\admin\AppData\Local\Microsoft\CLR_v4.0_32\UsageLogs\”下创建了一个text文件,命名为"pago 4094.exe.log",内容如下:
上述log是一个记录.NET程序集加载的日志文件,包含了与.NET API相关的System.Windows.Forms、Ststem.Drawing等的引用。它还包含PublicKeyToken值。
查看修改的注册表:
子进程3868
该进程从287.76s运行一直持续到进程结束。它进行了诸多恶意行为,包括但不限于删除可执行文件、窃取个人数据、类似于垃圾邮件的行为。
进程转储 不明;
从web浏览器窃取凭证:
该恶意行为涉及俩个MITRE ATT&CK技术,分别是T1552.001(不安全的凭证:文件中的凭证)和T1555.003(来自密码存储的凭据:来自 Web 浏览器的凭据)。这里访问了一个本地路径,而Login Data文件用于存储用户的登录信息和密码数据。
T1518:软件发现:
进程3686尝试发现已安装的软件,该恶意行为进行了多次,推测子进程3686先遍历计算机上存在哪些Web浏览器,之后依次遍历这些可能存在的本地路径,窃取登录凭证。
连接SMTP端口、检查外部IP:
检测到Snake Keylogger,目标ip是158.101.44.242,端口是80。
查看威胁,发现该进程试图使用checkip.dyndns.org检索外部IP地址。
可以发现它连接到了158.101.44.242的80端口。
进程3868还有一个网络木马,这是一个通过SMTP发起的Snake Keylogger EXil,其目标IP为208.91.199.225,目标端口是587。端口587通常被用于电子邮件传输,它于TLS或SSL加密一起使用,以确保电子邮件传输过程中的数据安全。
总结
该Snake Keylogger从一封电子邮件开始,下载解压得到exe,用户手动执行后启动进程1112,其子进程3868执行主要的恶意操作,尝试发现已安装的软件,之后窃取Web浏览器凭证;尝试检查外部IP,使用SMTP传输协议向服务器发送包含被盗信息的电子邮件。
静态分析(pago 4094.exe)
.NET恶意软件,使用dnSpy32进行分析。定位到程序入口点,发现一个名为From1
的构造函数。
跳到From1,大量代码都无用,下面发现一处解密,使用函数GetObject
调用资源Grab
。
Grab
的内容如下:
解密前:
解密后:
可以发现很明显的DOS头MZ,之后程序使用Assembly.Load(data2)
将二进制数据作为程序集加载到当前应用程序域中。Activator.CreateInstance (type, args)
创建实例并开始执行加载的程序集。
将内存dump出来,重命名为Aads.dll 。方便分析
阶段二 Aads.dll
IOC
Hash | 值 |
---|---|
MD5 | 2b5c78f544d9939869b6f1095d247efa |
SHA1 | 4f0b6b32e03e6c0a710fb80e9191758d721558fb |
SHA256 | 6bdcfdc224a08b68553021a44f2f8597d239488eb2e71064502a28aa098b4996 |
静态分析
代码经过了混淆,基于上一阶段使用GetObject
获取资源中的数据,在这一阶段通过搜索GetObject
定位到了HeapSort
中,这行代码表示从资源管理其获取了一个图像对象,之后将其转换为Bitmap
类型。
动态调试
回到exe中,下断点在解密后,让Aads加载进当前应用程序域中,之后直接在模块处找到Aads选择跳转到模块去。下断点,接着运行。可以发现x10的值变成了 ivmsL。
这对应的是pago 4094.exe中的资源:
在内存中查看:
之后经过解密(字节数组搜索和各种排序算法(堆排序、快速排序)),得到:
可以在模块选项卡里面找到这个dll,Tyrone。
dump出来重命名为Tyrone.dll
阶段三 Tyrone.dll
IOC
Hash | 值 |
---|---|
MD5 | f922482d9fd6a17de937403ad3136f09 |
SHA1 | 301633fb60c784c14cb7174a3089cf7f2829b2be |
SHA256 | de8d4787465c79b3d6175ed18dffd96d4fb7f7fb551f659e2c62d44ab2e0f3de |
静态分析
存在大量混淆。
使用.NET Reactor slayer进行反混淆:
反混淆后的代码相对好阅读,但还是存在大量无用的代码,且至今为止,我都没有在代码中发现曾在沙箱分析中体现出来的恶意行为,因此可以尝试继续寻找GetObject
,猜测还有下一阶段。
一个函数一个函数搜索,发现:
这里从资源文件中读取一个,之后进行解密(动调找)因此可以回到pago 4094.exe中了。
动态调试
同上一阶段一样,跳转到模块,按照程序集资源后的@0200002C找到这一处GetObject,下断点:
上面混淆代码的UmHYCAPJIp
和\u0020
分别对应原来的smethod_0
和string_0
;运行一下:
运行解密后:
同上一下,明显的DOS头(MZ)、DOS stub以及PE头,dump出来。
第四阶段 pago.exe
DIE分析可以知道,这是一个PE32,GUI文件。使用.NET编写。
IOC
Hash | 值 |
---|---|
MD5 | bdef67c31299a3d0c10e3608c7ee2bdb |
SHA1 | 86be2a34eacbc0806dbd61d41b9d83a65aef69c5 |
SHA256 | ec3023ecf592a4f637e7c99b009466aa38ba90b9f9c7fbb550f129bca285bd6e |
静态分析
该pago.exe同第三阶段一样,被严重混淆,使用.NET Reactor Slayer反混淆,得到:
尝试从入口点Main函数开始分析。前面蛮多点进去都是空的。
smethod_7() 移动文件
这里移动当前可执行文件到临时文件夹中去,使用时间命名。
信息收集1
smethod_0():
开始信息收集,从某个来源中(例如Outlook)中收集用户的URL,用户名和密码信息。这些信息被存储到一个全局字符串Class6.string_0
中。
smethod_3():
同样是信息收集(Foxmail),不过对比上一个多了许多操作;
- 首先获取并终止所有Foxmail进程,这一步是为了释放Foxmail的资源文件
- 读取注册表获取Foxmail的安装路径
- 遍历存储目录获取账户文件
- 对账户文件进行解析,将窃取的信息存入
Class.string_0
中。
窃取Yandex浏览器的登陆凭证。
除了通过直接遍历文件,遍历注册表的方式,Snake还可以从Discord收集身份验证令牌,Discord 将其 LevelDB 数据库文件存储在“\discord\Local Storage\leveldb”中,并且可能包含用户的身份验证令牌。借助身份验证令牌,攻击者无需密码即可未经授权访问受害者的 Discord 帐户。
如下:
其它也都通通是信息收集,具体就不一一分析了。
泄露信息
在Main函数的最后面,Snake窃取完消息后应该干什么?当然是泄露信息啊。
这里72是空的,分析71:Snake会通过FTP、SMTP或Telegram泄露信息。
这里是负责使用FTP进行窃取的代码,创建一个FTP请求,FTP凭据被硬编码到Snake Keylogger代码中。之后使用FTP上传到服务器。
这里是负责使用SMTP进行泄露的代码,使用MailMessage构造一封电子邮件,并准备电子邮件发件人地址、收件人地址、主题、正文和被盗数据作为文本附件。然后,它使用恶意软件配置中硬编码的 SMTP 凭据通过 smtpClient.Send() 通过 SMTP 进行身份验证和数据泄露。
这里是负责使用 Telegram 进行数据泄露的代码。它会创建 Telegram API 请求 URL,其中包含机器人令牌和聊天ID,数据将发送到该 URL。
恶意软件配置
分析一下解密函数smethod_15():
它使用key的MD5哈希的前八个字节作为解密密钥,即“6fc98cd68a1aab8b”;解密方法是DES(ECB模式)。还有一个base64解码。Python解密代码如下:
from Crypto.Cipher import DES
from Crypto.Hash import MD5
import base64
def lena_decrypt_snake(text, key_string):
try:
# 生成 DES 密钥。MD5 哈希后的前 8 个字节被用作密钥。
key = MD5.new(key_string.encode('ascii')).digest()[:8]
# 使用密钥创建一个新的 DES 加密对象,模式为 ECB。
cipher = DES.new(key, DES.MODE_ECB)
# 解码 base64 编码的密文并解密数据。
decrypted_data = cipher.decrypt(base64.b64decode(text))
# 尝试将解密的数据解码为 ASCII 文本,忽略解码错误。
decrypted_text = decrypted_data.decode('ascii', errors='ignore')
# 处理 PKCS#5 或 PKCS#7 填充,获取填充的长度。
padding_len = decrypted_data[-1]
# 去除填充并返回解密后的文本。
if padding_len < len(decrypted_data):
return decrypted_text[:-padding_len]
return decrypted_text
except Exception as e:
# 如果发生异常,返回异常信息。
return str(e)
# lena_key 用于解密的密钥字符串。
lena_key = "BsrOkyiChvpfhAkipZAxnnChkMGkLnAiZhGMyrnJfULiDGkfTkrTELinhfkLkJrkDExMvkEUCxUkUGr"
# 使用 lena_decrypt_snake 函数解密并打印结果。
print("lena_sender_email_addr: ", lena_decrypt_snake("I22WW+qzjWDd9uzIPosYRadxnZcjebFO", lena_key))
print("lena_sender_email_pw: ", lena_decrypt_snake("MrZp4p9eSu2QFqjr3GQpbw==", lena_key))
print("lena_SMTP_server: ", lena_decrypt_snake("XHGvc06cCeeEGUtcErhxrCgs7X5wecJ1Yx74dJ0TP3M=", lena_key))
print("lena_receiver_email_addr: ", lena_decrypt_snake("I22WW+qzjWDd9uzIPosYRadxnZcjebFO", lena_key))
print("lena_SMTP_port: ", lena_decrypt_snake("oXrxxBiV5W8=", lena_key))
print("lena_padding: ", lena_decrypt_snake("Yx74dJ0TP3M=", lena_key))
解密结果:
规避检测
该代码段,搜索并终止所有与安全监控相关的进程。
屏幕截图
此代码负责截取屏幕截图。它使用Graphics对象捕获整个屏幕,将其作为 PNG 保存在“SnakeKeylogger”文件夹中,然后上传到FTP服务器,并进行一些后续处理。
监听剪贴板
监听剪贴板数据并通过FTP,SMTP或Telegram泄露
键盘记录器Keylogger
使用KeyDown和KeyUp事件处理程序来监视击键。
还可以识别按键,并检查特殊键,如 Backspace、Tab、Enter、Space、End、Delete 等。
参考链接:
anyrun沙箱链接
https://app.any.run/tasks/4b3a6bbc-e8fa-4ec6-9d35-9f779b715131?utm_source=anyrunblog&utm_medium=article_bottom&utm_campaign=snakekeylogger&utm_content=task&_gl=1%2A5m3qiq%2A_gcl_au%2AOTQ3ODU4OTI4LjE3MTg4NzU2NzM.%2A_ga%2ANTkzMjI3NzI4LjE3MTg4NzU2NzY.%2A_ga_53KB74YDZR%2AMTcxOTQ0ODA2Ni45LjEuMTcxOTQ1MzU3Ni4wLjAuMTY4NDA1MjI0MQ..%2F/
https://any.run/cybersecurity-blog/reverse-engineering-snake-keylogger/#introduction-7372
https://x-junior.github.io/malware%20analysis/2022/06/24/Snakekeylogger.html
https://www.splunk.com/en_us/blog/security/under-the-hood-of-snakekeylogger-analyzing-its-loader-and-its-tactics-techniques-and-procedures.html