Room: biteme
Difficulty: Medium
Show: Free
CTF形式でマシン攻略しフラグを取得するタイプのRoomになります。
列挙
nmapを実行したところ、22/tcp(ssh)と80/tcp(http)が稼働していることがわかりました。
nmap -v -Pn -T4 -sV -sC --version-all -A --osscan-guess 10.10.167.12
22/tcp(ssh)はひとまず置いておいて、80/tcp(http)にアクセスしてみると以下通りApache2 Ubuntu Default Pageが出力されました。
残念ながら当該ページには有用な情報が無さそうなので、隠しディレクトリがないかgobuster
を使用して確認していきます。
gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -u http://10.10.167.12/ -t 50
/consoleという怪しげなディレクトリを見つけたのでアクセスしてみます。
ログインページが出てきましたが、キャプチャがあるため辞書攻撃やブルートフォース攻撃は難しそうです。
ソースコードを確認していたところ、怪しげなスクリプトを発見しました。
難読化されているようですが、ログイン試行を一度行うと解除されたものを読むことが出来ました。
JasonからFredへのメッセージであり、PHPのsyntax highlightingが有効になっているとのことです。
Microsoftのドキュメントを確認したところ、syntax highlightingは他のチームメンバがソースコードに素早くアクセスできるようにするための機能とのことです。
ソースコードへのアクセス(/console/index.phpsへのアクセス)を行います。
どういう認証方法になっているのか確認できそうです。
また、functions.phpを読み込んでいるようなので、こちらのソースコード(/console/functions.phps)へもアクセスしてみます。
具体的なユーザ名とパスワードのチェック方法が見れました。
どうやら、ユーザ名は入力値をbin2hex化したものが/console/config.php内の「LOGIN_USER」と一致しているかで確認しているようです。
また、パスワードは入力値をmd5でハッシュ化したものの末尾3文字が「001」と一致しているかで確認しているようです。
以下の通り、ユーザ名とパスワードの解読を行いました。
ユーザ名
console/config.phpsへアクセスし、LOGIN_USERの値を取得。
取得した値「6a61736f6e5f746573745f6163636f756e74」をデコード。
以上より、ユーザ名は「jason_test_account」であることがわかりました。
パスワード
md5のレインボーテーブルから末尾3文字が「001」であるものを確認
※末尾3文字が「001」であればどれでも大丈夫です。
以上より、「violet」がパスワードに当てはまりそうです。
※これはかなり脆弱なチェック機構です。
取得したユーザ名とパスワードを使用してログインします。
すると、今度はMFAの入力を求められました。
MFAなので、入力制限がかかっていると思い、ヒントになるものはないかと探していたところ、またソースコード内に難読化されている部分を発見しました。
先ほどと同様に、一度適当に入力してContinueボタンを押すと内容が解読され、ブルートフォースの防御機構が無いことがわかりました。
ブルートフォースができることがわかったのでhydraを使用してMFAコードを取得します。
hydra -l none -P list.txt -s 80 10.10.167.12 http-post-form "/console/mfa.php:code=^PASS^:F=Incorrect code:H=Cookie: PHPSESSID=kc5t1bkroqus5ah97n56k4uo9s; user=jason_test_account; pwd=violet" -t 64
※list.txtは0000~9999のリストです。
※form認証ではありませんが、MFAコードを^PASS^として見立ててます。
上記より、MFAコードが「1494」であることがわかりました。
MFA突破後は上記ページが現れました。
「File browser」と「File viewer」とのことなので、なんとなくbrowserがlinuxコマンドの「ls」コマンド、viewerが「cat」コマンドのように想像がつきます。
試しにbrowserで現ディレクトリを参照したところ、予想通りの結果になりました。
この機能を使えばマシン内部の探索が行えそうです。
しばらく探索を行ったところ、/home/jason/.ssh/にてSSH接続用の秘密鍵を取得することが出来ました。
ただ、単純に秘密鍵を使用してSSH接続を行うことはできませんでした。
そこで、秘密鍵からパスフレーズを解読します。
解読にはssh2john
とjohn the ripper
を使用します。
まずはssh2johnを使用し、秘密鍵からパスフレーズのハッシュ値を取得します。
続いて取得したハッシュ値をjohn the ripperで解読します。
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
上記よりパスフレーズが取得できましたのでSSH接続を行います。
/home/jasonにてuser.txtを取得しました。
権限昇格
権限昇格①
sudo -l
の結果、パスワード無しでfredの権限ですべてのコマンドを実行できることがわかりました。
sudo -u fred /bin/bash
にてfred権限のシェルを取得します。
権限昇格②
sudo -l
の結果、パスワード無しでrootの権限で/bin/systemctl restart fail2ban
を実行できることがわかりました。
fail2banは使用したことがありませんが、qiita記事より、振る舞い検知型のIPSソフトウェアであることがわかりました。
また、当該記事より、fail2banにはアクセス違反時の動作にOSコマンドを設定することができ、これを悪用して権限昇格できることがわかりました。
具体的には以下のステップで権限昇格を行います。
- IPアドレスがiptablesの拒否リストに追加された時に実行されるコマンドを変更する。(シェル取得用コマンドにする)
- root権限でfail2banをリスタートする。(
sudo /bin/systemctl restart fail2ban
の実行)- 自身のIPアドレスがiptablesの拒否リストに入るよう、SSHにブルートフォース攻撃を行う。
上記を実施するために、まずはアクセス違反時の動作を定義する「iptables-multiport.conf」を捜索します。
find / -maxdepth 4 -name iptables-multiport.conf 2>/dev/null
にて捜索した結果、/etc/fail2ban/action.d/に存在することがわかりました。
また、当該ファイルの所有者はfredであり、書き込み権限があることもわかりました。
では、実際にアクセス違反時の動作を権限昇格用のコマンドに変更します。
アクセス違反時の動作は「actionban」と「actionunban」によって定義されているので、ここへシェル取得用のコマンドを記載します。
次に、sudo /bin/systemctl restart fail2ban
にてfail2banをリスタートします。
最後に、自身のマシンで接続を待ち受け、hydraを使用してSSHに対してブルートフォース攻撃を行います。
無事、root権限のシェルを取得することが出来ました。
/root/root.txtにてfragを取得し、マシン攻略完了です。