どうも、のみぞうです。
TryHackMeのUpload Vulnerabilities(ファイルアップロード機能の脆弱性)Roomには解説の後にChallenge問題があるのですが、CTFとかでありそうなポイントが凝縮されていて勉強になったので自分用のメモを残します。
TryHackMeをまだやったことない、という方はこちら
Task11 Challenge
ルーム内で学んだことを駆使してフラグをとるチャレンジです(わりと説明されてないこともあるような気がするけど…)
Download Task Filesから辞書ファイルがダウンロードできるのでこれを使ってファイルアップロードの脆弱性を探していきます。

探索
まず説明書きのとおり http://jewel.uploadvulns.thm
に接続します(要hostsの設定)
なんだかおしゃれなサイト。宝石の画像をスライドに追加して!だそうです。

とりあえずどんなディレクトリがあるか探す。
gobuster dir -u http://jewel.uploadvulns.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt | tee directory.memo
結果が出るまでしばし待つ(思ったより時間かかったので途中で止めちゃった)

adminページを発見。Top Secret!てどういうことなの。
このフォームを使うと/modulesディレクトリからモジュールをアクティべートできるぜ。だそうです(そんな都合の良い事あります…?)ファイルのアップロードができたらここからリバースシェルをとるんだろうなあという感じ。

サイトに戻って開発者ツールでソースを見ると、/content/アルファベット3文字.jpg の画像が順番に読み込まれるしくみなんだなーということがわかる。
最初にダウンロードした辞書ファイルはアルファベット3文字のリストだったので、content以下で使うんやろなあとなんとなく察する。
background: url(“/content/ABH.jpg”) no-repeat center center fixed;

Wappalyzerを使うとNode.jsが使われていることがわかる

画像をいくつか適当にアップロードしてみる。jpgファイル以外はファイル形式のエラーでアップロードを弾くしくみになっていることがわかる。(スクショとりわすれた)
調査はだいたいこんなもんかな。
Reverse Shellの準備
「reverse shell node.js」でぐぐったら一番上に出てきたのを使わせていただく
- URL=
6行めを自分のIPアドレスに書き換えることを忘れずに。ポート番号もついでに変えた。
拡張子をjpgにして保存しておく。

ファイルのバイパス
JSのバイパスをするためにBurpSuiteを立ち上げる。
ProxyタブのOptions>Intercept Client Requests のところで、File extensionにチェックが入っている状態でEditを押す。
Match conditionのところで |^js$
を削除してOKを押す。

これをやっとかないとjsファイルの改ざんができない。
ブラウザに戻って、キャッシュを消しておく(この時点ですでにアップロードファイルのチェックjsがキャッシュされているはず)
※FireFoxなら右上の三本線から履歴>最近の履歴を消去>キャッシュにチェックを入れてOKを押す。

BurpSuiteを通した状態でIntercept onになっていることを確認してブラウザをリロードする。
何回かForwardをクリックして upload.js が出てくるまで待つ。

この画面で右クリックして Do Intercept > Responce to this request をクリック。特に画面に変化はないけどまた何回かForwardをクリックする。
するとupload.jsの中身が表示されるので、ファイルチェックのところをまるっと削除してまたForwardをぽちぽちする。

これでファイルチェックがなくなったので、先ほど作成したshell.jpgがアップロードできるようになっている。(なんか表示が変だけど…)

Reverce Shellのアクティべート
アップロードしたファイルはリネームされてしまうので最初にダウンロードした辞書を使って探す。
gobuster dir -u http://jewel.uploadvulns.thm/content/ -x jpg -w UploadVulnsWordlist.txt | tee content.memo
結果より。1個だけ明らかにサイズが小さいのがあるので、さっき自分でアップロードしたファイルはこれだろうとアタリがつく。

ローカルでshellを待ち受けとく(ポート番号は自分で決めたやつ)
nc -lnvp 1234
さっきのadminページの表現でまさかと思ったけど何も考えずにディレクトリトラバーサルができる。

shellがとれた

/var/wwwにフラグがおいてある。
まとめ
こんな都合のいいことがあるかーーーい!という感じもしますが。BurpSuiteの使い方とかよくわかってなかったので勉強になった。
では今回はこのへんで。