RedLine
RedLine 样本分析
1. 前言
根据unpacme
结果,逐个查看可知恶意载荷的SHA256
为:b1d6c8d2b9498001f50dab84090b9caf31f864871cfc995ffea41c22d2da9d28
2. 恶意程序分析
2.1. CC交互
从函数入口开始分析,可以看到样本载入了配置文件:
后面会有动态解密过程,获取C&C服务器地址端口:45.9.20.182:52236
请求报文header
格式如下:
{<Authorization xmlns="ns1">a272f3a2850ec3dccdaed97234b7c40e</Authorization>}
发送链接请求后等待服务器响应:
实例化参数列表如下:
实例化本地规则列表如下:
2.2. 主要功能
当服务器响应后,从报文中获取参数,并根据参数内容执行对应的功能函数,但作者在实例化函数列表时,对函数名混淆了:
不过好在每个函数的功能很明确,逐个函数进行功能确认后,可以得出真实的功能函数列表如下:
2.2.1. 获取硬件信息
2.2.2. 获取浏览器信息
会读取注册表已获取默认浏览器的信息
SOFTWARE\\WOW6432Node\\Clients\\StartMenuInternet
SOFTWARE\\Clients\\StartMenuInternet
2.2.3. 获取软件列表
通过查看注册表:SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall
获取软件列表,再通过DisplayName
获取软件名;DisplayVersion
获取软件列表:
2.2.4. 获取杀毒防护软件列表
通过SystemInfoHelper.GetVs()
函数已 WMI
查询SELECT * FROM AntivirusProduct|AntiSpyWareProduct|FirewallProduct
,并将获取到的杀软防护软件存放在ROOT\\SecurityCenter
和ROOT\\SecurityCenter2
的 WMI
命名空间中
2.2.5. 获取进程列表
通过执行SELSystem.Text.RegularExpressionsECT * FRSystem.Text.RegularExpressionsOM Win32_PSystem.Text.RegularExpressionsrocess WSystem.Text.RegularExpressionshere SessSystem.Text.RegularExpressionsionId=''
语句获取系统进程列表信息并按照ID
、ProcessID
、Name
、CommandLine
形式存储
2.2.6. 获取本地安装的语言
2.2.7. 查询Telegram文件
如果配置文件中要求扫描Telegram
,那么将对Telegram
文件夹进行扫描
2.2.8. 扫描浏览器数据
如果配置文件中要求扫描浏览器,那么将执行Chrome
、Gecko
浏览器的数据扫描
其中Chrome
浏览器将会查找Login Data
、Web Data
、Cookies
路径,窃取Opera GX Stable
、Opera GX
、AppData\\Roaming\\
中的浏览器数据
Gecko
浏览器则是窃取cookies.sqlite
、%USERPROFILE%\\AppData\\Roaming
目录下的浏览器数据
2.2.9. 窃取文件数据
如果配置文件中设置了扫描文件选项,那么当接收到文件路径时,将对文件进行扫描
其中GetFiles
函数覆盖了系统文件内容:\\Windows\\
、\\Program Files\\
、\\Program Files (x86)\\
、\\Program Data\\
2.2.10. 窃取FTP数据
如果配置文件中要求扫描FTP
,则进行FileZilla
文件扫描
扫描的路径是:{0}\\FileZilla\\recentservers.xml
、{0}\\FileZilla\\sitemanager.xml
窃密函数如下:
2.2.11. 窃取加密钱包
如果配置文件中要求窃取加密钱包,则会对BrEx.Init
中已加密的钱包进行扫描
BrEx.Init
中存储的是采用了base64
编码的钱包字符串:
ZmZuYmVsZmRvZWlvaGVua2ppYm5tYWRqaWVoamhhamJ8WW9yb2lXYWxsZXQKaWJuZWpkZmptbWtwY25scGVia2xtbmtvZW9paG9mZWN8VHJvbmxpbmsKamJkYW9jbmVpaWlubWpiamxnYWxoY2VsZ2Jlam1uaWR8TmlmdHlXYWxsZXQKbmtiaWhmYmVvZ2FlYW9laGxlZm5rb2RiZWZncGdrbm58TWV0YW1hc2sKYWZiY2JqcGJwZmFkbGttaG1jbGhrZWVvZG1hbWNmbGN8TWF0aFdhbGxldApobmZhbmtub2NmZW9mYmRkZ2Npam5taG5mbmtkbmFhZHxDb2luYmFzZQpmaGJvaGltYWVsYm9ocGpiYmxkY25nY25hcG5kb2RqcHxCaW5hbmNlQ2hhaW4Kb2RiZnBlZWloZGtiaWhtb3BrYmptb29uZmFubGJmY2x8QnJhdmVXYWxsZXQKaHBnbGZoZ2ZuaGJncGpkZW5qZ21kZ29laWFwcGFmbG58R3VhcmRhV2FsbGV0CmJsbmllaWlmZmJvaWxsa25qbmVwb2dqaGtnbm9hcGFjfEVxdWFsV2FsbGV0CmNqZWxmcGxwbGViZGpqZW5sbHBqY2JsbWprZmNmZm5lfEpheHh4TGliZXJ0eQpmaWhrYWtmb2JrbWtqb2pwY2hwZmdjbWhmam5tbmZwaXxCaXRBcHBXYWxsZXQKa25jY2hkaWdvYmdoZW5iYmFkZG9qam5uYW9nZnBwZmp8aVdhbGxldAphbWttamptbWZsZGRvZ21ocGpsb2ltaXBib2ZuZmppaHxXb21iYXQKZmhpbGFoZWltZ2xpZ25kZGtqZ29ma2NiZ2VraGVuYmh8QXRvbWljV2FsbGV0Cm5sYm1ubmlqY25sZWdrampwY2ZqY2xtY2ZnZ2ZlZmRtfE1ld0N4Cm5hbmptZGtuaGtpbmlmbmtnZGNnZ2NmbmhkYWFtbW1qfEd1aWxkV2FsbGV0Cm5rZGRnbmNkamdqZmNkZGFtZmdjbWZubGhjY25pbWlnfFNhdHVybldhbGxldApmbmpobWtoaG1rYmpra2FibmRjbm5vZ2Fnb2dibmVlY3xSb25pbldhbGxldAphaWlmYm5iZm9icG1lZWtpcGhlZWlqaW1kcG5scGdwcHxUZXJyYVN0YXRpb24KZm5uZWdwaGxvYmpkcGtoZWNhcGtpampka2djamhraWJ8SGFybW9ueVdhbGxldAphZWFjaGtubWVmcGhlcGNjaW9uYm9vaGNrb25vZWVtZ3xDb2luOThXYWxsZXQKY2dlZW9kcGZhZ2pjZWVmaWVmbG1kZnBocGxrZW5sZmt8VG9uQ3J5c3RhbApwZGFkamtma2djYWZnYmNlaW1jcGJrYWxuZm5lcGJua3xLYXJkaWFDaGFpbg==
解码后的数据如下:
ffnbelfdoeiohenkjibnmadjiehjhajb|YoroiWallet
ibnejdfjmmkpcnlpebklmnkoeoihofec|Tronlink
jbdaocneiiinmjbjlgalhcelgbejmnid|NiftyWallet
nkbihfbeogaeaoehlefnkodbefgpgknn|Metamask
afbcbjpbpfadlkmhmclhkeeodmamcflc|MathWallet
hnfanknocfeofbddgcijnmhnfnkdnaad|Coinbase
fhbohimaelbohpjbbldcngcnapndodjp|BinanceChain
odbfpeeihdkbihmopkbjmoonfanlbfcl|BraveWallet
hpglfhgfnhbgpjdenjgmdgoeiappafln|GuardaWallet
blnieiiffboillknjnepogjhkgnoapac|EqualWallet
cjelfplplebdjjenllpjcblmjkfcffne|JaxxxLiberty
fihkakfobkmkjojpchpfgcmhfjnmnfpi|BitAppWallet
kncchdigobghenbbaddojjnnaogfppfj|iWallet
amkmjjmmflddogmhpjloimipbofnfjih|Wombat
fhilaheimglignddkjgofkcbgekhenbh|AtomicWallet
nlbmnnijcnlegkjjpcfjclmcfggfefdm|MewCx
nanjmdknhkinifnkgdcggcfnhdaammmj|GuildWallet
nkddgncdjgjfcddamfgcmfnlhccnimig|SaturnWallet
fnjhmkhhmkbjkkabndcnnogagogbneec|RoninWallet
aiifbnbfobpmeekipheeijimdpnlpgpp|TerraStation
fnnegphlobjdpkhecapkijjdkgcjhkib|HarmonyWallet
aeachknmefphepccionboohckonoeemg|Coin98Wallet
cgeeodpfagjceefieflmdfphplkenlfk|TonCrystal
pdadjkfkgcafgbceimcpbkalnfnepbnk|KardiaChain
2.2.12. 窃取Discord数据
如果配置文件中要求扫描Discord
,则会扫描Discord
文件,GetTokens()
函数则是获取Tokens.txt
。
2.2.13. 窃取Steam数据
如果配置文件中要求扫描Steam
,则会调用GameLauncher()
窃取Steam
登录凭证
GameLauncher()
函数会扫描注册表Software\\Valve\\Steam
中的SteamPath
值获取安装路径,然后窃取*ssfn*
、config
、*.vdf
文件。
2.2.14. 窃取VPN数据
如果配置文件中要求扫描VPN
,则会对NordVPN
、OpenVPN
和ProtonVPN
进行文件窃取
针对NordVPN
,首先从%USERPROFILE%\\AppData\\Local
路径扫描NordVPN
文件夹,获取user.config
,然后再xml
文件中匹配//setting[@name=\\Username\\]/value
和//setting[@name=\\Password\\]/value
窃取用户密码,然后采用内置的解密函数CryptoHelper.DecryptBlob
进行解密:
针对OpenVPN
,首先从%USERPROFILE%\\AppData\\Roaming
路径扫描OpenVPN Connect
文件夹,进入profiles
文件夹,然后扫描npvo*
文件;
针对ProtonVPN
,首先从%USERPROFILE%\\AppData\\Local
路径扫描ProtonVPN
文件夹,然后扫描npvo*
文件。
2.2.15. 截取屏幕
如果配置中要求截取屏幕,则调用GdiHelper.GetImageBase()
函数截取屏幕
2.2.16. 获取用户名
直接调用系统API
获取用户名
2.2.17. 获取显示器大小
调用GdiHelper.MonitorSize()
函数以获取显示器长宽大小
2.2.18. 获取系统版本
调用SystemInfoHelper.GetWindowsVersion()
函数查询注册表:SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion
,以获取用户系统版本信息
2.2.19. 获取自身路径
调用系统API
获取当前运行路径
2.2.20. 获取硬件ID
根据当前用户关联的网络域名、当前线程相关联的用户名和Win32_DiskDrive
对象信息计算MD5
生成HardwareID
2.2.21. 获取时区
调用系统API
获取主机所在的时区信息
2.3. 发送详情
当获取到上述数据后,会调用Send()
函数,将扫描的详情进行填充,
其中PartsSender.GetLocalInfo()
函数,会在主机上访问http://733s.komawai.ru/
,该链接将返回主机的相关信息:
{"city":"***","country_code":"***","postal":null,"ip":"*.*.*.*"}
解析上述json
文件,填充到发送请求中:
2.4. 远程下载
当上述的发送请求结束,将会调用TaskResolver()
函数
该函数有四个方法:CommandLineUpdate()
、DownloadUpdate()
、DownloadAndExecuteUpdate()
、OpenUpdate()
DownloadAndExecuteUpdate()
函数采用WebClient().DownloadFile()
下载文件,并使用System.Diagnostics.Process.Start()
运行