Raspberry Pi / Banana Pi / Orange Pi / NanoPi などの Pi 系ボードで ニセアクセスポイントをつくる
ニセアクセスポイント
- Linuxベースでhostapd でアクセスポイント化
- dnsmasq で特定のサイトをアレする
Pi系ボード
Raspberry Pi、およびRaspberry Piのように使えるLinuxシングルボードコンピュータ。
以下のような感じで使うことができる。
- Debian系のLinuxが使える
- GPIOの並び、機能はRaspberry Piとよく似ている
- GPIOの操作ライブラリとしてWiringPiが使える
「オープンハードセキュリティ #3」のセミナー資料です。
セミナーでは、講師のNanoPiのアドレスが192.168.100.38でした。sshでログインしてscreenを共有しましょう。
screenのセッションは「hogehoge」(root)です
以下はスーパーユーザ権限で作業して下さい
WiFiアダプタに何が使えるか調べる
インストール、ログインなどは「Piで遊ぼう」を参照して済ましておいて下さい。
http://qiita.com/nanbuwks/items/11cba54cdc209db48f28
Raspberry Piで実験に使い、使いふるしのWi-Fiインターフェースをつなげてみた。
実験したのは以下の4つ。
RaspberryPiである程度放熱とか電波の到達とか入手性とかが良さそうなものということで選んでいたもの。
Buffalo WLI-UC-GNHP
Buffalo WLI-UC-G300HP
IODATA WN-G300U
NEC Aterm WL300NU-GS
このうち、Aterm WL300NU-GSのみRaspberryPiで使えなかった。他はアクセスポイントも含めて使えることは確認してある。
WLI-UC-GNHP
dmesg で確認してみる
device descriptor read/64, error -62
デバイス不良かな?
WLI-UC-G300HP
・・・
usbcore: registered new interface driver rt2800usb
認識したっぽい
WN-G300U
・・・
Registered led device: rt2800usb-phy1::radio
[ 1388.386306] Registered led device: rt2800usb-phy1::assoc
[ 1388.386509] Registered led device: rt2800usb-phy1::quality
認識した
Aterm WL300NU-GS
[ 1469.698505] ehci_irq: highspeed device connect
[ 1469.960080] usb 4-1: new high-speed USB device number 21 using sunxi-ehci
残念!!
以下IODATA WN-G300U で試していく。
wifi設定
まず、普通に無線LANの子機として設定してみる。
ifconfig -a で認識していることを確認
・・・
wlan0 Link encap:Ethernet HWaddr 34:76:c5:4e:0a:46
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ip コマンドでも確認できる
root@FriendlyARM:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 46:c4:17:89:48:ed brd ff:ff:ff:ff:ff:ff
inet 192.168.11.5/24 brd 192.168.11.255 scope global eth0
inet6 fe80::44c4:17ff:fe89:48ed/64 scope link
valid_lft forever preferred_lft forever
3: tunl0: <NOARP> mtu 1480 qdisc noop state DOWN group default
link/ipip 0.0.0.0 brd 0.0.0.0
4: gre0: <NOARP> mtu 1476 qdisc noop state DOWN group default
link/gre 0.0.0.0 brd 0.0.0.0
5: sit0: <NOARP> mtu 1480 qdisc noop state DOWN group default
link/sit 0.0.0.0 brd 0.0.0.0
6: ip6tnl0: <NOARP> mtu 1452 qdisc noop state DOWN group default
link/tunnel6 :: brd ::
11: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 34:76:c5:4e:0a:46 brd ff:ff:ff:ff:ff:ff
試験環境のESSIDがcnccafe、passphaseがfreebeerです。このようにして設定します。
wpa_passphrase cnccafe freebeer >> /etc/wpa_supplicant/wpa_supplicant.conf
cat /etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="cnccafe"
#psk="freebeer"
psk=b82b457e95ddee0bcb9dc242fb10403257083e430b7402ab795738e8037d5590
}
設定終わったら再起動。
認識しました。
wlan0 Link encap:Ethernet HWaddr 34:76:c5:4e:0a:46
inet addr:192.168.11.6 Bcast:192.168.11.255 Mask:255.255.255.0
inet6 addr: fe80::3676:c5ff:fe4e:a46/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:526 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:34028 (34.0 KB) TX bytes:1128 (1.1 KB)
もし通信できなかったら、シリアルアダプタをつなげて診断してみる。
CH340Gのシリアルアダプタを使う場合の配線例
- CH340G側配線 赤(ジャンパー・ジャンパー)白青黒
- NanoPi Neo側配線 黒赤青白
- ボーレート115200
- 改行コードLF
hostapd
うまくいったら、hostapd導入してみる
NanoPi-Neoのレポジトリにhostapdが無いので
http://w1.fi/hostapd/
で確認すると
Latest release:
hostapd-2.6.tar.gz (PGP sign)
ということなので取ってくる
wget http://w1.fi/releases/hostapd-2.6.tar.gz
tar xzvf hostapd-2.6.tar.gz
cd hostapd-2.6
apt-get install libnl-genl-3-dev libssl-dev pkg-config
cd hostapd
defconfigを.configとしてコピーし、.configにCONFIG_LIBNL32=yを追加します。
cp defconfig .config
echo CONFIG_LIBNL32=y >> .config
make
make install
mkdir /etc/hostapd
vim /etc/hostapd/hostapd.conf
interface=wlan0
ssid=badwifi
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=badwifi
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
~
固定アドレスにする
/etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
allow-hotplug eth0
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
↓
...
#allow-hotplug wlan0
#iface wlan0 inet manual
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
address 192.168.91.1
netmask 255.255.255.0
gateway 192.168.91.0
...
として、再起動します。
root@FriendlyARM:~# hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
Using interface wlan0 with hwaddr 34:76:c5:4e:0a:46 and ssid "badwifi"
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
のように、
hostapd /etc/hostapd/hostapd.conf
で起動します。
ところが、IPアドレスが割り振られてません。
root@FriendlyARM:~# ifconfig
wlan0 Link encap:Ethernet HWaddr 34:76:c5:4e:0a:46
inet6 addr: fe80::3676:c5ff:fe4e:a46/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5189 errors:0 dropped:0 overruns:0 frame:0
TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:430582 (430.5 KB) TX bytes:2505 (2.5 KB)
手動で割り振ります。
root@FriendlyARM:~# ifconfig wlan0 192.168.91.1
root@FriendlyARM:~# ifconfig
eth0 Link encap:Ethernet HWaddr 46:c4:17:89:48:ed
inet addr:192.168.11.5 Bcast:192.168.11.255 Mask:255.255.255.0
inet6 addr: fe80::44c4:17ff:fe89:48ed/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20660 errors:0 dropped:0 overruns:0 frame:0
TX packets:9654 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:17091425 (17.0 MB) TX bytes:954276 (954.2 KB)
Interrupt:114
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
wlan0 Link encap:Ethernet HWaddr 34:76:c5:4e:0a:46
inet addr:192.168.91.1 Bcast:192.168.91.255 Mask:255.255.255.0
inet6 addr: fe80::3676:c5ff:fe4e:a46/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5189 errors:0 dropped:0 overruns:0 frame:0
TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:430582 (430.5 KB) TX bytes:2505 (2.5 KB)
PCからつないでみる
PCから、UbuntuだとWiFiが新たに出現してもすぐ見えないので
root@LATITUDE:~# iwlist wlp2s0 scan | grep freewifi
とすると見えるようになります。
ネットワークマネジャでつなげてから
root@LATITUDE:~# ifconfig
wlp2s0 Link encap:イーサネット ハードウェアアドレス e8:39:df:6c:03:18
inet6アドレス: fe80::ff4b:583:a298:c4ae/64 範囲:リンク
UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1
RXパケット:1085979 エラー:0 損失:0 オーバラン:0 フレーム:0
TXパケット:739004 エラー:0 損失:0 オーバラン:0 キャリア:0
衝突(Collisions):0 TXキュー長:1000
RXバイト:1179110025 (1.1 GB) TXバイト:109834456 (109.8 MB)
となるので、明示的にIPアドレスを割り振ります。
root@LATITUDE:~# ifconfig wlp2s0 192.168.91.2
PINGを飛ばすと
root@LATITUDE:~# ping 192.168.91.1
PING 192.168.91.1 (192.168.91.1) 56(84) bytes of data.
64 bytes from 192.168.91.1: icmp_seq=1 ttl=64 time=999 ms
64 bytes from 192.168.91.1: icmp_seq=2 ttl=64 time=1.03 ms
64 bytes from 192.168.91.1: icmp_seq=3 ttl=64 time=0.926 ms
^C
--- 192.168.91.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.926/333.655/999.007/470.474 ms
OKですね。
isc-dhcp-server
DHCPサーバをインストールします。
apt-get install isc-dhcp-server
vim /etc/dhcp/dhcpd.conf
末尾に以下の内容を加えます。
subnet 192.168.91.0 netmask 255.255.255.0 {
range 192.168.91.2 192.168.0.99;
option routers 192.168.91.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.91.255;
option domain-name-servers 192.168.91;
default-lease-time 600;
max-lease-time 7200;
}
# vim /etc/default/isc-dhcp-server
INTERFACES=""
↓
INTERFACES="wlan0"
/etc/init.d/isc-dhcp-server start
syslogの設定
NanoPI-Neoはそのままではsyslogに何も書き込まれないので作っておきます。
# cat /etc/syslog.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
IPフォワード
vim /etc/sysctl.conf
#net.ipv4.ip_forward=1
↓
net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
apt-get install iptables
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables-save > iptables-router
として保存しておきます。
iptables-restore < iptables-router
で復元します。
ここまでで、badwifiに接続するとルーティングできるようになります。名前解決はまだできません。
## DNSMASQ
wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.76.tar.gz
tar xzvf dnsmasq-2.76.tar.gz
cd dnsmasq-2.76
make
make install
dnsmasq
これで、名前解決もできるようになります。
だましてみよう!
さあ、エントリを書いてだましてみよう!
ローカルにHTTPサーバを入れて、何かをの代わりにローカルを表示するようにしてみます。
apt-get install apache2
ここに何かかけば・・・
vim /etc/hosts