wakatonoの戯れメモ

はてなダイアリーから引っ越してきました。

PoCから読み解くMS15-034

MS15-034については,まとめがPiyokangoさんのところにあるので,そういうまとめ的な話を読みたい方はそちらへどうぞという感じ.

この脆弱性に関連する情報でオレが面白いなぁと思ったのは,PoC(PastebinGhostbinExploit-DB)のPoCで書かれた検証リクエストの内容と,「パッチされている」と判断されているメッセージが以下のようなものである,というくだり.
要は


Range: byte=ほにゃらら
というヘッダを伴うリクエストをぶん投げると,修正がされている環境であれば,

The request has an invalid header name
というレスポンスが帰ってくる.

これは結構興味深くて,要はIISで『Rangeヘッダの処理をしない』ように変更した」=「MS15-034の修正が適用された」と判断しているということを意味する.

これと同等の効果を期待するのであれば,脆弱性のあるWebサーバに対し,Rangeヘッダが送られないようにすればよい,ということになる.

こんなんできるProxyはあるんけ?と思ったら,DeleGate 8.9の設定にあるというのがわかった.
具体的には,DeleGate 8.9をリバースプロキシとして使い,脆弱性のあるWebサーバの手前に配置して,設定に以下のようなものを追加すればよい,ということになる.


HTTPCONF=kill-qhead:Range

RFC7230の"3.2 Header Fields"の記述によると,ヘッダ名は以下のとおり,大文字小文字は無視される(case-insensitive)ため,RangeがrAngeになったり,RANGEになったりrangeになったりすると,いかにもexact matchな感じのフィルタは役に立たないわけだがw,参考にはなるはずだ.


Each header field consists of a case-insensitive field name followed by a colon (":"),
もうちょい激しい手合が,Squidのrequest_header_access設定
これは,指定したヘッダを伴うリクエストを許可/拒否するというものだ.Rangeヘッダを伴うリクエストを拒否することも可能になる(っぽい).


request_header_access Range deny all

他にも,リクエストから特定のヘッダを削除するためのモジュールは,(オレはよく知らないけど)ありそうなモンだし,なかったとしても作れるたぐいのモンではないか?とか考えたりする.

…もちろん,修正ファイル適用しておけというのが本質的な対処になるわけだけど,もし出来ない場合にどうするか?という(通り一遍の)対処以外にも,PoCから見える攻撃手法を読み解くとこういう考え方もできるかなということで.