はじめに
これは、Hack The Box二十五番勝負 Advent Calendar 2020 9日目の記事です。
サマリ
- 対戦相手:Help
- 対戦日時:2020年12月10日 18:00 - 23:59
- 結果:敗北
- 主な敗因:
- GraphQLのエッセンスを時間中に習得できなかった
- エクスプロイトの中身を理解できなかった
- 通算成績:9戦1勝8敗
対戦相手
今回の対戦相手は「Help」です。 www.hackthebox.eu
Walkthrough
※以下、解法に関するネタバレです。
自分でやったこと
情報収集
- nmap
- Dirbuster
侵入
- HelpDeskZ
Writeupの冒頭を確認 - 1
やはりポート3000はGraphQLでした。しかし /graphql
に対してクエリを投げなければならず、これは事前のディレクトリ列挙で見つかりませんでした。パラメータのキーも含め、常識なのか、guessingなのか……。とりあえず、以下のリクエストを投げることでユーザー情報が1件返ってきました。
curl -s -G http://10.10.10.121:3000/graphql --data-urlencode 'query={user{username, password}}'
memo: -G
と -XGET
の違い
これらは同じ挙動をするのだと思っていましたが、どうやら以下の違いがあるみたいです。 man
の記述と、WireSharkで実際に両パターンのパケットをみて確認しました。
-G
:--data-urlencode
で指定したデータを、 クエリストリングとして 送信する。-XGET
:--data-urlencode
で指定したデータを、 ボディとして(ポストパラメータのように) 送信する。
侵入
- GraphQLで手に入ったクレデンシャルで、HelpDeskZにログインした。
searchsploit
で出てきたもうひとつのエクスプロイト((Authenticated) SQL Injection / Unauthorized File Download
)を実行するも発動せず。
Writeupの冒頭を確認 - 2
Writeupでも同じ脆弱性を利用していて、エクスプロイトのコードに誤りがあったようです。微調整を重ねてようやく成功。admin
という管理者名とそのパスワードハッシュを入手し、ハッシュはCrackStationで平文を見つけました。
これまで入手したクレデンシャルを組み合わせてSSHログインを試みましたがどれも失敗。再びWriteupを確認すると、ユーザー名が help
……。サーバー名がヒントになっていることはあれど、こういうケースもあるんですね。この時点でown userです。
memo: ブラインドSQLインジェクション
SQLの結果をそのまま受け取れないまでも、アプリケーションの挙動からクエリ結果の判定ができる場合(HelpDeskZの場合、クエリの結果がtrueの場合200が、falseの場合404が返ってくる)、それを利用してDB内の情報を知ることができます。
権限昇格
/home/help/.bash_history
にrootのパスワードらしき痕跡があったが、昇格できず。linpeas.sh
をローカルから持ってきて実行すると、/usr/lib/s-nail-s-nail-privsep
という見慣れないファイルがリストアップされていることを確認した。searchsploit
で調べると、1件だけLCEのエクスプロイトを発見した。- 上記をローカルから持ってきて実行するとrootに権限昇格できた。own root。
KPT(Keep-Problem-Try)
Keep
- 列挙がうまくいってよかった。列挙モチベーションが維持できた。
- ブラインドSQLインジェクションの仕組みが理解できてよかった。
- curlの
-G
と-XGET
の違いが分かってよかった(Keepは果たしてよかったことを書くんだったか)。
Problem
- 時間内に新技術を要領良く学ぶことができなかった。
- 「GraphQLを知らない」ことは大した問題ではなくて、戦闘中に見知った技術を短時間でラーニングしなければならない。
- とはいえ、それが苦手だからこそ、事前に数こなしてそういうシチュエーションを減らそうとしている、というのもある。
- サーバー名を甘くみていた。最大のヒント。
Try
- 知らない技術に出くわしたら、Qiitaでもなんでもいいからざっと読んで動かしてみる。
- サーバー名 = ユーザー名の可能性は常にあるものと心得る。