MITMするにあたってわかったこととか調べたことのメモ

MITM (man-in-the-middle attack) は中間者攻撃とも呼ばれ、通信内容を盗聴したり改竄したりするのに使われる攻撃
特に、HTTP 通信は暗号化されていないため余裕で盗聴できるし改竄できる
でも、HTTPS 通信は証明書とかの問題でいい感じになってるので、サーバー側の秘密鍵が漏れたり、デバイスで不審な証明書を信頼したりしなければ盗聴、改竄されるということはない
(サーバーで証明書のピン留めをしていると、不審な証明書を信頼していても通信できなくすることができる)
なので、MITM を脆弱性とかなしで利用するにはデバイス側で MITM サーバーの証明書を信頼してあげる必要がある

MITM はデバッグ用途にも便利なため、古来より重宝されてきた
GitHub で mitm
などのワードで検索するとたくさんヒットする
mitmproxy は Python 製の MITM ツールで、Star 数は27.9k とすごい
通信内容をCLIで見たり、Web UI 付きで見たりもできて、ついでに通信をフックして色々操作できたりもする
やはり MITM のツールは Python で作られたものが多い
Go 製のものも結構多い
ただ、
kr/mitm
は最終更新が 7年前、bettercap
はイベントのフックに JS を使う、lqqyt2423/go-mitmproxy
は新しいけど情報が少ない
という感じで色々と大変
個人的には、Python の環境を整えたりするのが面倒かったり、補完がうまく効かないことが多いので Python のものはあんまり使いたくないなーっていう感じなので、Go 製のものをいくつか試していこうと思ってる
Go で進めるなら、できれば初めから最後まで全部 Go で済ましたいので JS をインジェクションするものはあんまり使いたくなっていう感じ
Go 製のツールで面白いものが、
という、広告ブロッカーの AdGuard が作った MITM ツールがあって、これは若干古いけども使いやすそうな雰囲気がある

AdguardTeam/gomitmproxy
で紹介されている代替ツールには、 elazarl/goproxy
と Google 製の google/martian
がある
Google の Martian は AdGuard のと同じくらいの古さだけど、制作が Google なのである程度信頼できる
elazarl/goproxy
の方は、同じく若干古く情報が少ないが、使いやすそうには見える

よく出てくるけどよくわからん単語
- 透過型プロキシ (Transparent proxy)
- Shadowsocks
- SOCKS
- リバースプロキシ (Reverse proxy)

リバースプロキシ
リバースプロキシ(英: reverse proxy)または逆プロキシは、特定のサーバへのリクエストが必ず通過するように設置されたプロキシサーバである。一般的なプロキシとは逆で、不特定多数のクライアントのアクセスに備えて特定のサーバー専用に設けられる。クライアントに取ってはサービスの窓口として機能し、普通はクライアントがリバースプロキシを意識することはない。

Shadowsocks
Shadowsocks(シャドーソックス)はSocks5プロキシに基づく暗号化通信を可能とするオープンソースソフトウェア。
SOCKS5に基づいて通信を暗号化することができるらしい
おそらく検閲ができなくなるせいなのだろうが、2015 年に中国政府によってこのプロジェクトが GitHub から削除されたらしい
現在のプロジェクトは新しく作られたやつなのかな?
shadowsocks is a fast tunnel proxy that helps you bypass firewalls
Swift、Rust、Kotlin、C# とかいろんな言語のためのクライアントが書かれてる

SOCKS
そもそも SOCKS とはなんぞやっていう
SOCKSは、インターネット・プロトコル・スイートにおいて、Transmission Control Protocol(TCP)および User Datagram Protocol(UDP)による通信を代理するプロキシのプロトコルである。
謎
主にTCPのために設計されている。認証の機能の規定もあるため、それが実装されていれば認証にもとづき、認可された接続のみ接続を許可するような設定もできる。DARPAモデルの観点からは、3番めの層にあるTCP及びUDPによる通信を代理するものであり、使い方にも依るが通常は4番目のアプリケーション層からは透過ではない。例えばウェブブラウザのようなアプリケーションから利用する場合は、ネットワーク接続に関する設定として明示的にプロキシとして指定が必要である。ポート番号には1080がよく使われている[1][2]。
色々とよくわからない
- インターネット・プロトコル・スイート
https://ja.wikipedia.org/wiki/インターネット・プロトコル・スイート
インターネット・プロトコル・スイート(英: Internet protocol suite)は、インターネットを含む多くのコンピュータネットワークにおいて、標準的に利用されている通信プロトコルのセットである。TCP/IP(Transmission Control Protocol / Internet Protocol)とも呼ばれる。従来のインターネットワーキングの手法は、このTCP/IPプロトコルに基づいている[1]。
TCP/IP のことらしい
TCP/IP モデルと同じっぽい
Wikipedia の図のスクショ
SOCKSはトランスポート層で本来行う通信を代わりに行うっていうことかな
「透過ではない」っていうのはどういうことなのだろうか
そもそも「透過」って何
電子計算機の世界では、機能のモジュール化などにより、ある部分(の存在や動作)が、他の部分(の存在や動作)に対して透過的であり、それを意識しないで良い状態のことをいう。
こういった状態を、透明である、トランスペアレントである、と表現する。
通信、特にOSI参照モデルやそれに類するモデルにおいては、機能は物理的なところから、アプリケーションに近い所まで、幾つかの層を持った階層構造となっている。
各層はそれぞれ独立しており、他の層に依存したり影響を与えたりしない。層が受け取ったデータは、改変はもちろん、覗き見すらすることなく、そのまま次の層へと受け渡される。
この様子を、透明である、トランスペアレントである、と表現する。
つまり、上層で下層の処理を意識して何かをする必要がないことや、途中で通信を覗き見されたり改竄されたりしないということを透過というのかな
ということは、文脈的に SOCKS は4番目のアプリケーション層において、下層の処理を意識して何かの操作をする必要が場面によっては存在するということかな
SOCKS はなぜ、どういう場合に使われるのか?
SOCKSは迂回のためのツールとしても使用されることがある。たとえば、政府、職場、学校、特定の国限定のウェブサービスなどで、インターネットのコンテンツへのアクセスフィルタやブロッキングが行われている場合に、それらを回避することができる[9]。
SOCKS#使用例 - Wikipedia
Tor に使われたりするらしい
確かに Tor Browser を使ったときに SOCKS という言葉を見かけた覚えがある
SOCKSは、ネットワーク・ファイアウォール越えやアクセス制御等を目的として、クライアントサーバ型のプロトコルが、透過的に使用できるよう設計されたプロキシ(proxy)のプロトコル、及びシステム(の一つ)である。"SOCKetS" [16] の略。
SOCKS#解説 - WIkipedia
つまり、SOCKS はファイアウォールを越えるために使う、透過的なプロキシのプロトコル、ということかな
具体的なことはあんまりわからんないけど、雰囲気はわかったような気がする...?

AdGuard の gomitmproxy を使ってみた例
HTTPS の盗聴もできる
証明書の作り方も公式のページで解説されていて優しい
openssl genrsa -out demo.key 2048
openssl req -new -x509 -key demo.key -out demo.crt
上のコマンドで秘密鍵を生成して、下の方でサーバー証明書を作ってる感じっぽい
(.csr
を生成せずに直接サーバ証明書を作れるんだな...)
これで作った demo.key
と demo.crt
をプロジェクトルートに配置しておく
これを実行してプロキシに通すと、そのデバイスで http://simple.proxy/cert/crt
から証明書がダウンロードできるようになる。ここで何が起きているのかはいまいちよくわからない。
こんな感じで、リクエストを送るときやレスポンスが来たときのイベントをフックして、中身を表示したり、別の HTML を差し込んだりできる
ただ、仕様なのかバグなのかはよくわからないけど、ポートを指定された通信 (https://exampl.com:1234
とか) がうまく取得できなくて、CONNECT メソッドの通信しか取得できない
CONNECT した後にされる、GET とか POST の通信が全くハンドルできないという事態
Python の mitmproxy を使ったときはそんなこと全くなかったので、ちょっと変

iOS に証明書をインストールするやつ、あれってキーチェーンアクセスとか Apple Configurator でプロファイル作る必要があるんだと思ってたけど、.crt
とか .pem
系の証明書ファイルを直接インストールできるの知らなかった
こういうのってどこに書いてあるものなんだろうか...

google/martian
を使ってみようと思ったが、公式レポの説明がちょっと何言ってるのかわからない上に、サンプルとか使用例がなくていまいち使い方がわからん
後回しにする