私はスローロリス攻撃をキャッチするルールを書こうとしています、これは私が持っているものです-
alert tcp any any -> any any (msg:"Possible Slow Loris attack"; classtype: denial-of-service; flow: to_server, established; pcre: !"/\x0D\x0A\x0D\x0A$/H"; threshold: type threshold, track by_dst, count 10, seconds 5; sid 3000009; rev:1;)
(私は構文を少し台無しにしたかもしれませんが、それはここでそれをフォーマットしようとするからです、私は構文が私の側で大丈夫であると確信しています)
REを少しいじってみたところ、"/\x0D\x0A$/H"
も試してみましたが、うまくいきませんでした
自分で書いたSlow-LorisとどこかからダウンロードしたSlow Lorisはどちらも「不完全な」HTTPヘッダーを持つパケットを送信するため、完成したヘッダーのように\r\n\r\n
で終わっていません。しかし、私はどちらかを捕まえることができません。
Wiresharkのパケットを見て、それらは0D 0A
で終わります
ダウンロードされた.rulesを調べましたが、ルールがありません。 snort.confの末尾にあり、エラーはありません。 service nsm status
は、サービス自体が正常に起動しなかった可能性があることを確認しましたが、すべてOK
です。編集-:
がありませんでした。修正しましたが、downloaded.rulesに表示されます。まだ捕まらない
私が何を間違っているのか本当にわからない、いくつかの助けをいただければ幸いです。
署名に機能しないものがいくつかあるようです:
PCREで/H
オプションを使用すると、HTTPプリプロセッサが使用され、コンテンツをhttp_header
と照合する必要があることが通知されます。 GET要求がプリプロセッサーによって解析されるとき、|0d 0a 0d 0a|
はヘッダーの終わりを示します。つまり、ヘッダー内では検索できません。
flow
または任意のHTTPプリプロセッサを使用すると、TCPストリームが再構成されます(特に指定のない限り、デフォルトで)。これは、ヘッダーのコンテンツを照合するために、 HTTPリクエストを構成するパケットを監視する必要があり、プリプロセッサがリクエストを構成するすべてのパーツを解析できるようになる前にリクエストを終了する必要があります(例:http_method
、http_uri
、http_header
)。
正直なところ、Snortが検出するように設計された通常の範囲を超えているため、このアクティビティを検出するためのシグネチャを記述することは、一般的にはどのアプローチが最善かわかりません。
ただし、この状況で私がお勧めするのは、SlowLorisの公開されているすべてのツールを見つけることです( https://github.com/gkbrk/slowloris.git で始まります)-pip3からインストールできます)、それらをテスト環境で実行し、ネットワーク上で実際に発生することを分析します。
私はそれをしました、そしてこれはそれが生成するトラフィックです:
GET /?1153 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0
Accept-language: en-US,en,q=0.5
X-a: 1350
X-a: 210
X-a: 518
X-a: 4622
X-a: 2951
X-a: 2666
X-a: 149
X-a: 1756
X-a: 4994
X-a: 2688
これは、指定されたソケットの最大数(デフォルトでは150)までの複数の接続で発生します。各接続は、追加のX-a
ヘッダーフィールドを時々送信することにより、不完全なHTTP GETリクエストで維持されます。
このアクティビティを検出するための署名を書く方法は次のとおりです。
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"SlowLoris.py DoS attempt"; \
flow:established,to_server,no_stream; content:"X-a:"; dsize:<15; \
detection_filter:track by_dst, count 3, seconds 30; \
classtype:denial-of-service; sid:1; rev:1; )
event_filter gen_id 1, sig_id 1, type limit, track by_src, count 1, seconds 5
このルールに関する重要なこと:
flow
オプションにno_stream
を追加しました。これにより、Stream5プリプロセッサは、再構成されたストリームのコンテキストでコンテンツがどのように関連しているかをチェックする手間を省くことができます。基本的にはパケット自体を調べます。 dsize
オプションを使用する場合は重要です。dsize:<15
を追加しました。 X-a
ヘッダーを含む行は、単一のパケットで送信されます。次のような典型的なパケットを観察しました。
0000 58 2d 61 3a 20 32 36 38 38 0d 0a X-a: 2688..
値にランダムな4桁を使用すると、コンテンツの長さは11バイトになります。念のため<15
と言うことにしました。
detection_filter
を追加しました。ルールのdetection_filter
とevent_filter
を組み合わせると、アラートレートの制限としきい値の制御が向上することがわかりました。私が指定したdetection_filter
オプションは、3
の2番目のウィンドウ内で同じソースから30
以上が発生した場合にのみアラートを発生させるようにします。event_filter
に達したときに発生するアラートの数を制限するdetection_filter
を追加しました。アラートを1
に5
秒ごとに制限することにより、アラートは、外部のアラートで溢れることなく、何かが起こっていることを知らせるのに十分な量になります。SlowLoris.py
(Python3) λ slowloris -p 80 192.168.126.128
[05-12-2017 13:45:01] Attacking 192.168.126.128 with 150 sockets.
[05-12-2017 13:45:01] Creating sockets...
[05-12-2017 13:45:05] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:45:24] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:45:43] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:46:02] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:46:21] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:46:40] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:46:59] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:47:18] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:47:37] Sending keep-alive headers... Socket count: 7
[05-12-2017 13:47:56] Sending keep-alive headers... Socket count: 7
^C
HTTPサーバーログ
user@Host:~$ Sudo python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...
192.168.126.1 - - [05/Dec/2017 13:48:01] "GET /?1061 HTTP/1.1" 200 -
192.168.126.1 - - [05/Dec/2017 13:48:01] "GET /?524 HTTP/1.1" 200 -
192.168.126.1 - - [05/Dec/2017 13:48:01] "GET /?1171 HTTP/1.1" 200 -
192.168.126.1 - - [05/Dec/2017 13:48:01] "GET /?984 HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('192.168.126.1', 61831)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 654, in __init__
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 713, in finish
self.wfile.close()
File "/usr/lib/python2.7/socket.py", line 283, in close
self.flush()
File "/usr/lib/python2.7/socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
192.168.126.1 - - [05/Dec/2017 13:48:01] "GET /?634 HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('192.168.126.1', 61832)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 654, in __init__
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 713, in finish
self.wfile.close()
File "/usr/lib/python2.7/socket.py", line 283, in close
self.flush()
File "/usr/lib/python2.7/socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
192.168.126.1 - - [05/Dec/2017 13:48:01] "GET /?296 HTTP/1.1" 200 -
192.168.126.1 - - [05/Dec/2017 13:48:01] "GET /?640 HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('192.168.126.1', 61834)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 654, in __init__
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 713, in finish
self.wfile.close()
File "/usr/lib/python2.7/socket.py", line 283, in close
self.flush()
File "/usr/lib/python2.7/socket.py", line 307, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
Snortアラート
12/05-13:45:05.348446 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61831 -> 192.168.126.128:80
12/05-13:45:24.351347 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:45:43.355735 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:46:02.358688 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:46:21.363346 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:46:40.365834 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:46:59.369221 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:47:18.372293 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:47:37.374814 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
12/05-13:47:56.378355 [**] [1:1:1] SlowLoris.py DoS attempt [**] [Priority: 0] {TCP} 192.168.126.1:61828 -> 192.168.126.128:80
お役に立てれば!