内角540°

セキュリティ。SIEMとかIPSとか統計とかクラウドとか。数学以外で。

Snortルール作ってみる(Heartbleed編)

Heartbleed (CVE-2014-0160) の検知ルールを作ってみる
f:id:gokaxtukei:20151228221931p:plain

あまりに有名すぎる攻撃なので、情報多い!
公式のルールを見ずに作れるかな…

<目標!>
・Heartbleedの検知ルールをつくる
・公式のルールと比較して答え合わせ



与えられている情報
攻撃パケットはここで拾った(・o・)
blog.didierstevens.com
かなり詳しい!
OpenSSLのHeartbleed脆弱性(CVE-2014-0160)で送信されるHeartbeat Request - Web Application Security Memo


まとめると…
①小さすぎる情報を大きく見せて送信(Heartbeat Request)通常4bit?
②もらった情報を自分の秘密情報で膨らまして(Heartbeat Response)65535bitまで行そう?

①と②どちらも検知できそうだけど、攻撃影響が確定している②を検知させたい!


制作

ルールの全体は自明かな

alert tcp $HOME_NET 443 -> any any 

(msg:"Local OpenSSL Heartbleed response";
 **オプション**
 sid:1000001;
 )


・オプション部
検査したいのは40 00のところかな
f:id:gokaxtukei:20151228222112p:plain

明確な位置を指定するdepthオプションをつかう

40 00 は4byte目に出てくるから

depth 3; (0から数え上げ)

しきい値検査はbyte_testを使う…!

・2byte検査:2
・大きなレスポンス:>
・通常4bit:16
・オフセット値はなんでもいいや:0

byte_test:2,>,16,0;

alert tcp $HOME_NET 443 -> any any 

(msg:"Local OpenSSL Heartbleed response";
 depth 3;
 byte_test:2,>,16,0;
 sid:1000001;
 )

素人感丸出しだけど、
とりあえずこれで検知試験したい…!

公式ルールの出番(・へ・)つよいぞー

alert tcp $HOME_NET [21,25,443,465,636,992,993,995,2484] -> $EXTERNAL_NET any 

(msg:"SERVER-OTHER OpenSSL TLSv1.1 large heartbeat response - possible ssl heartbleed attempt";
 flow:to_client,established;
 content:"|18 03 02|";
 depth:3;
 byte_test:2,>,128,0,relative;
 sid:30516;
 )

なかなか似てるけど、FP回避技術が凄い!
①flow:to_client,established;
OpenSSLサーバからクライアントへの通信だから、to_client
TCP接続後のやり取りなので、established

② content:"|18 03 02|";
18 :Heartbeat通信を示してる
03 02:TLS1.1を示してる

③ byte_test:2,>,128,0,relative;
ここでrelative設定する意味あるのかな?わからず…(;O;)

プロは流石です(・o・)