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()运行
