httpプロクシによるペネトレーションテストを行う際に、対象となるアドレスが不定であったりOSのプロクシ設定に従わないようなクライアントがあるとする。 この場合でも全ての対象ドメインが数え上げられる場合はDNSスプーフィングによって介入することが出来るが、透過型プロクシを使うのがより確実な方法である。 ここではOSX上のmitmproxyをプロクシサーバーとして使用し、任意のドメインとポートを対象としたhttp(s)通信へ介入する手法について説明する。 前提として、対象クライアントは既にプロクシの証明書を信用済みであるとする。
- WiFiをポートにしてOSXのインターネット共有機能を有効にする。
- ipフォワーディングを有効にして端末側のネットワークデバイス間でのパケット転送が行えるようにする。
$ sudo sysctl -w net.inet.ip.forwarding=1
/etc/pf.conf
をコピーして、追加設定を行う。
$ cp /etc/pf.conf pf.conf
$ cat pf.conf
... (省略) ...
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "dev" # <------ 追加した行
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "dev" from "/tmp/pf.conf" # <------ 追加した行
/tmp/pf.conf
の内容は以下のように設定する。
$ cat /tmp/pf.conf
rdr on bridge100 inet proto tcp to any -> 127.0.0.1 port 8080
ここでbridge100
はインターネット共有を行った際に新たに出現したネットワークデバイスである。
- システム環境設定からファイアウォール機能を有効にする。
- 変更したpf.confをリロードする。
$ sudo pfctl -ef pf.conf
/etc/sudoer
にsudo pfctl -s state
を全てのユーザーが実行できるように設定を追記する。
ALL ALL=NOPASSWD: /sbin/pfctl -s state
- mitmproxyまたはmitmdumpをTransparent Proxyモードで起動する。デフォルトポート8080でプロクシサーバーが立ち上がる。
$ mitmproxy -T --host
- インターネット共有のAPをWiFi接続先として設定した端末からのhttp(s)トラフィックがmitmproxyへリダイレクトされるのを確認する。