Skip to content

Instantly share code, notes, and snippets.

@ykst
Last active September 27, 2022 17:57
Show Gist options
  • Save ykst/6fbdfe81d75a0a690559f2a405aec6a6 to your computer and use it in GitHub Desktop.
Save ykst/6fbdfe81d75a0a690559f2a405aec6a6 to your computer and use it in GitHub Desktop.
mitmproxyでOSX上に透過型プロクシを立てる方法

mitmproxyでOSX上に透過型プロクシを立てる方法

概要

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/sudoersudo pfctl -s stateを全てのユーザーが実行できるように設定を追記する。
ALL ALL=NOPASSWD: /sbin/pfctl -s state
  • mitmproxyまたはmitmdumpをTransparent Proxyモードで起動する。デフォルトポート8080でプロクシサーバーが立ち上がる。
$ mitmproxy -T --host
  • インターネット共有のAPをWiFi接続先として設定した端末からのhttp(s)トラフィックがmitmproxyへリダイレクトされるのを確認する。

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment