【Tutorial】Wifipumpkin3 によるおとり AP の実行【ハッキングラボ】

# はじめに：本記事に関する注意事項と免責事項

本記事は情報セキュリティにおける攻撃の理解、防衛のスキル向上、情報セキュリティ
意識の啓発を目的としたハッキングに関する内容が含まれます。本記事の内容を使用し
発生した如何なる損害や損失について、当記事作成者は一切の責任を負いません。

本記事の内容を実際に悪用して、自分以外の個人や組織などを攻撃した場合は
法律により罰せられる可能性があります。必ず自身が所有している機器のみを
実験対象とし、他人や組織が所有している機器は決して実験対象としないよう
お願い致します。

また、Wi-Fi に関する実験となり USB の無線 LAN アダプタが必要となりますが、
技適マークの表記がない無線機器の使用は電波法への違反、および刑罰の対象と
なる可能性があります。

技術基準適合証明等を受けた機器の検索
https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=js01

参考までに、無線の規格や周波数帯などが指定の要件を満たす場合は、届け出を
行うことで一定期間の間、特例として技適マークの表記がない無線機器も使用が
可能になっています。

技適未取得機器を用いた実験等の特例制度
https://exp-sp.denpa.soumu.go.jp/public/

ただし、上述の総務省の Web サイトにも記載の通り、使用予定機器が特例制度の
対象となるかどうかはご自身の自己責任で十分な確認をお願いいたします。また、
当記事作成者は各種法律や特例制度等に関する質問は一切受け付けておりません。
予めご了承ください。

上記の注意および免責を理解し合意頂ける方のみ、記事の内容へお進みください。

# 背景：何でやってみようと思ったのか？

書籍「ハッキング・ラボのつくりかた」の無線 LAN 周りの実験を試している中で、
現在 WiFi-Pumpkin の GitHub リポジトリはカレントのブランチ名が "deprecated"
となっており、この中身が README しかないことに気づきました。

GitHub - P0cL4bs/WiFi-Pumpkin-deprecate
https://github.com/P0cL4bs/WiFi-Pumpkin-deprecated

git clone を実施した後に git checkout で過去のブランチに戻せばインストールが
可能なようでしたが、私の環境とスキルではパッケージ依存関係の解決に至らず、
Kali Linux の中身を汚染したくないことから断念しました。

ただ、Python2 版は廃止になったようですが、その代わり Wifipumpkin3 という
Python3 バージョンが新しくリリースされていました。せっかくなのでこちらを
インストールして使ってみることにします。

GitHub - P0cL4bs/wifipumpkin3: Powerful framework
for rogue access point attack.
https://github.com/P0cL4bs/wifipumpkin3

# システム構成：実験に使用した環境

私が実験に使用した Kali Linux ゲストの環境は大まかには以下の通りです。

- ハードウェア： VMware Workstation Pro 仮想マシン (HW14)
- OS： Kali Linux 2020.2 x64
- WiFiアダプタ： PLANEX GW-USEco300 (Chipset: RealTek RTL8192CU)

なお、記事作成者の信条により Oracle VM VirtualBox ではなく
VMware Workstation Pro を使用していますが、WiFi アダプタの
USB パススルーは特に VirtualBox でも問題ないとは思われます。

ただし、WiFi アダプタは環境によって相性問題があるようですので、
うまく動かない場合は別の種類／チップセットのアダプタを試すなど
ハードウェア側の切り分けも必要になるかもしれません。

参考情報として、私の上記 Kali ゲスト環境では、Ralink RT2870/RT3070 の
チップセットの Wifi アダプタは USB パススルーで軒並み動きませんでした。
※たまにちゃんと Monitor モードになりますが基本ダメな感じでした。
　ホスト側が適当なパーツ集めて作った自作 PC なのもあるかもですが・・・

ただ、同アダプタを Raspberry Pi 3B で実行中の Kali に挿したところ
ある程度は動くようでしたが、どこまで使えるかなど、詳しい検証は
行っていません。

※物理マシン上の Kali Linux なら行けそうな雰囲気もありましたが
　生贄に捧げられる x86/x64 のハードウェアが手元になかったです。

---

# 実践：Wifipumpkin3 によるおとり AP の実行

インストールから実行までの作業手順を以下、順番に見ていきます。
なお、現状は GUI が存在していないため CLI での操作になります。

注:
　以降は root で操作しています。kali など通常のユーザーの場合には
　スーパーユーザー権限の必要に応じて sudo なり su なりしてください。

## 手順１：Wifipumpkin3 のインストール

以下の Getting Started のマニュアルに沿って、各種ソフトウェア要件の確認、
パッケージの依存関係の解決、Wifipumpkin3 のインストールを行っていきます。
どんなソフトウェアもハードウェアも、まず使う前に取扱説明書を読みましょう。

Getting Started
https://wifipumpkin3.github.io/docs/getting-started

はじめに Requirements に記載があるパッケージをインストールします。
私の環境では hostapd 以外はインストール済みでした。

```
# apt install iptables iw net-tools wireless-tools hostapd
```

次に、マニュアルの [Installation procedure] > [Install on Kali Linux] を参照して
各種依存関係の解決、および Wifipumpkin3 のインストールを行っていきます。
私は /opt 配下にリポジトリをクローンしましたが特に指定はありません。

```
# apt install libssl-dev libffi-dev build-essential
# apt install python3-pyqt5
# cd /opt
# git clone https://github.com/P0cL4bs/wifipumpkin3.git
# cd wifipumpkin3
# python3 setup.py install
```

なお、Debian/Ubuntu の場合は make install で Deb パッケージを作成し
dpkg でインストールするようですが、Kali Linux でこの操作をやると Python
のバージョンの違い (3.7 / 3.8) のせいか良い感じに動いてくれませんでした。
環境依存かもしれませんが OS の種別に合わせてマニュアルに従いましょう。

## 手順２：Wifipumpkin3 の起動

インストール完了後、wifipumpkin3 と入力して実行すると起動します。
パッと見は Metasploit 風味な感じでバナーも起動の度に変わるようです。
かぼちゃかわいい(?????)

```
# wifipumpkin3 

                            .,'
                        .''.'
                        .' .'
            .    ' . ~,'  `.~ . `    .
        . '  .  '   .`:_. . _:'.   `  .  ` .
    .'   .'     ,     .'^'.    .     `.   `.
    .    .       .A.  .     . .A.       .    .
                .d000b.      .d000b.
    '    '    .d0000000b.  .d0000000b.    `    `
    .    .      .      . db  .     .      .    .
                        d00b
    `    `?0o.  `     `     '    '  .o0P'    '
        .    `?00   ooooo.  .ooooo   00P' .   .
        ` .   `?00000P ?0bd0P ?00000P' .' . '
            . . `~~   ~~~~  .~~'  . .
                ~     - ~~ -    ~
                                  codename: nidavellir
Made by: @mh4x0f - P0cL4bs Team | 1.0.0 dev
[*] Session id: 94b0b394-a027-11ea-83a7-8fd43a962e56 
Starting prompt...
wp3 > 
```

## 手順３：Wifipumpkin3 の設定変更

設定は "set <設定名> <値>" のコマンドで変更します。インターフェースと
SSID を指定する場合には以下のように入力します。自身の環境に応じて適宜
インターフェース名などは修正してください。

```
wp3 > set interface wlan0 ※既定は None
wp3 > set ssid TestRogueAP ※既定は "WiFi Pumpkin 3"
```

exit コマンドで wifipumpkin3 を終了できます。

```
wp3 > exit
# 
```

なお、設定内容は ~/.config/wifipumpkin3/config/app/config.ini に
保存されます。上述の set コマンドの代わりにこの設定ファイルを
事前に編集しておく方法でも問題はなさそうでした。

Configuration structure
https://wifipumpkin3.github.io/docs/configuration/configuration-file

set コマンドの場合は半角スペースを正しく認識しなかったため、
SSID 等は必要に応じてファイルの編集で対応することになるかも
しれません。

## 手順４：アクセスポイント起動前の確認事項

WPA2-PSK のアクセスポイントを起動してみますが事前準備を行います。
まずハッキングラボの書籍の内容と同様、無線 LAN インターフェースが
Managed モードになっていることを確認します。

```
# iwconfig wlan0
wlan0     IEEE 802.11  ESSID:off/any                                                                                                        
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm                                                                      
          Retry short limit:7   RTS thr=2347 B   Fragment thr:off                                                                           
          Encryption key:off                                                                                                                
          Power Management:off  
```

また、念のため IP フォワードを有効化しておき、別のインターフェース
がアップしてインターネット接続も可能であることを確認しておきます。

```
# sysctl -w net.ipv4.ip_forward=1
```

```
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.44.133  netmask 255.255.255.0  broadcast 192.168.44.255
```

```
# ping -c 5 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=4.11 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=4.01 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=3.93 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=3.70 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=128 time=3.65 ms

--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 3.647/3.878/4.110/0.177 ms
```

次に、クローンしてきた wifipunpkin3 の Git リポジトリ直下の
scripts ディレクトリを見てみるとサンプルスクリプトがあります。

```
# ls /opt/wifipumpkin3/scripts
demo.pulp               enable_security_wep.pulp   noproxy.pulp
enable_responder3.pulp  enable_security_wpa2.pulp  wifi_auto_scanner.pulp
```

以下は enable_security_wpa2.pulp の内容です。WPA2-PSK の
設定を行ってからアクセスポイントとして起動するものです。

```
set security true
# set auth WPA2 
set security.wpa_type 2
set security.wpa_algorithms CCMP
# congure password of AP
set security.wpa_sharedkey 0123456789
start
```

以下のように --pulp オプションを指定すると、wifipumpkin3 の実行時に
上述のようなスクリプト (Pulps と呼ぶらしい) を実行することができます。

```
# wifipumpkin3 --pulp /opt/wifipumpkin3/scripts/enable_security_wpa2.pulp
```

## 手順５：WPA2 のアクセスポイントを起動

直前に記載したコマンドを実行すると、以下のような表示とともに
指定したスクリプトが実行され、アクセスポイントが起動します。

```
# wifipumpkin3 --pulp /opt/wifipumpkin3/scripts/enable_security_wpa2.pulp
＊バナーは省略＊
Made by: @mh4x0f - P0cL4bs Team | 1.0.0 dev
[*] Session id: 4fd19480-a73b-11ea-9541-cd299889904a 

[*] mode: script

[*] plugin: enable_security_wpa2.pulp
=====================================

[+] enable forwarding in iptables...
[*] enable security authentication wireless
[*] sharing internet connection with NAT...
[+] starting hostpad pid: [21208]
[*] starting pydhcp_server
[*] starting pydns_server
Starting prompt...
[*] starting sniffkin3 port: [80, 8080]
[+] sniffkin3 -> httpCap    activated
[+] sniffkin3 -> emails     activated
[+] sniffkin3 -> ftp        activated
[+] sniffkin3 -> kerberos   activated
[+] sniffkin3 -> hexdump    activated


wp3 >  [  pydns_server  ] 10:46:26  - loading zone file "/root/.config/wifipumpkin3/config/app/dns_hosts.ini": 
 [  pydns_server  ] 10:46:26  -   1: example.com.            300     IN      A       10.0.0.1 
 [  pydns_server  ] 10:46:26  -   2: example.com.            300     IN      CNAME   whatever.com. 
 [  pydns_server  ] 10:46:26  -   3: example.com.            300     IN      MX      5 whatever.com. 
 [  pydns_server  ] 10:46:26  -   4: example.com.            300     IN      MX      10 mx2.whatever.com. 
 [  pydns_server  ] 10:46:26  -   5: example.com.            300     IN      MX      20 mx3.whatever.com. 
 [  pydns_server  ] 10:46:26  -   6: example.com.            86400   IN      NS      ns1.whatever.com. 
 [  pydns_server  ] 10:46:26  -   7: example.com.            86400   IN      NS      ns2.whatever.com. 
 [  pydns_server  ] 10:46:26  -   8: example.com.            300     IN      TXT     "hello this is some text" 
 [  pydns_server  ] 10:46:26  -   9: example.com.            86400   IN      SOA     ns1.example.com. dns.example.com. 1591368377 3600 10800 86400 3600 
 [  pydns_server  ] 10:46:26  -  10: testing.com.            300     IN      TXT     "one long value: IICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgFWZUed1qcBziAsqZ/LzT2ASxJYuJ5sko1CzWFhFuxiluNnwKjSknSjanyYnm0vro4dhAtyiQ7OPVROOaNy9Iyklvu91KuhbYi6l80Rrdnuq1yjM//xjaB6DGx8+m1ENML8PEdSFbKQbh9akm2bkNw5DC5a8Slp7j+eEVHkgV3k3oRhkPcrKyoPVvniDNH+Ln7DnSGC" "+Aw5Sp+fhu5aZmoODhhX5/1mANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA26JaFWZUed1qcBziAsqZ/LzTF2ASxJYuJ5sk" 
 [  pydns_server  ] 10:46:27  - 10 zone resource records generated from zone file 
```

アクセスポイントが起動したら、別の WiFi 端末から指定の SSID を探して
接続してみましょう。WPA2-PSK の事前共有鍵 (今回は 0123456789) を入力
して接続し、端末のブラウザなどからインターネット接続が行えれば成功です。

ここまで来れば Kali Linux が Man In The Middle な状態になったはずなので、
tcpdump や Wireshark で端末からのパケットをキャプチャ出来るかなどなど
いろいろと試してみましょう！

なお、今回アドレスクラスは既定から変えておらずクラスAの IP アドレスが
使用されます。既定の設定では 10.0.0.1 が アクセスポイントの IP アドレス、
10.0.0.20～10.0.0.50 が端末に割り当てる DHCP 範囲になるようです。

最後に、wifipumpkin3 のアクセスポイントを終了する場合には
プロンプトがないので Ctrl+C で終了します。

# おわりに

いかがだったでしょうか。今回、Wifipumpkin3 によるアクセスポイントの
起動方法について説明していきました。

実際に試してみるとポイントを掴めば無線 LAN のアクセスポイントは
簡単に作れてしまうため、不特定多数の人がいる場所などにおいては
無線 LAN の使用に注意を払う必要があります。

Wifipumpkin3 のマニュアルや config.ini、GitHub のソースを見ていると、
その他に様々な設定やプラグインがあるようなので、無線 LAN における
セキュリティをより学びたい方は悪用にならない範囲で実験してみるのも
良いと思います。

なお、ハッキングラボの書籍では driftnet による画像の抽出も同時に実施
していますが、試したところ driftnet は無線 LAN に特化したわけではない
異なるツールだったので、本記事の続きとして別記事を書く予定です。