cocuh's note

type(あうとぷっと) -> 駄文

HTTPSをProxy経由させて復号化したい!

大学のオープンキャンパスで高校生に大学の計算機環境を体験してもらうんですが、
RSA暗号Mathematicaで解いてもらおう」と最初考えてました。

ですが、途中で見事に脱線して「秘密鍵のわかってるHTTPS通信を復号化したいな」と。
その試行錯誤がこれになります。

大学の環境なので、一部権限の必要なtcpdumpwiresharkでのキャプチャができず、
proxy経由でどうにかしたいなと思いまして四苦八苦しました。


とりあえず、自環境にhttpsサーバー*1を立ち上げ、
同じく自環境にhttps proxy*2を書いて立ち上げます。
ここまではまぁなんとかできるのですが、この後の復号化がつらいものでした。


proxyが取ってこれるデータはアプリケーション層のデータになります。
パケットならwiresharkなどの既存のアプリケーションを利用できるのですが、
アプリケーション層だけのデータを復号化するプログラムが見つかりませんでした。
(もしかしたらできる方法があるのかもしれないですが…知っている方がいらっしゃいましたらおしえてください…)

最初にwiresharkhttpsを復号化できるので、「pcap形式に偽装しよう」と考えました。
下の層のヘッダをできる限り偽装したのですが、
TCPあたりが自分の知識不足でうまくできなかったようで、
wiresharkに食わせると「このパケットおかしいよ」と怒られて復号化できませんでした。


ここまでやって疲れたので、
「自分でTLSの復号しよう」というアプローチで挑戦してみました。
まだこの時私は、TLS実装はそこまで難しくないだろうと甘く考えていました。

TLSの仕様書をみながら実装しつつ、
「handshakeとかkeyexchengeとかをして鍵生成するから面倒じゃん!」
と途中で気づいてぐぬぬ…

proxyから取得したデータでは、handshakeとkeyexchangeは確認できたので、
原理的にはできるはずですが、そこからの気力と時間がなかったのであきらめました。



オープンキャンパスには情報系じゃない人もいるので、プロキシのデータをターミナルに流して
「暗号化してないと普通に読めるよ!」
「ターミナルに流れる無数の文字列…おれハッカーっぽい!!!!」
を体験してもらおうかなと…

興味持った人にはwiresharkなどのggrワードと参考になるリンクを貼って、
自分でやってもらうことにしました。


見事な脱線でしたが考えるのが楽しかったですし、
自分がパケットなどの知識が全くないのがわかった上に、多少なり勉強もできてよかったです。
気づいたら朝のことを除けば…

*1:PythonのBaseHTTPServerのsocketをsslのwrap_socketで包んで実装できます。http://www.piware.de/2011/01/creating-an-https-server-in-python/

*2:ちょうどいいのがなかったので適当に実装しました、そのうちgithubにあげると思います自作のだとたまに謎の挙動をしたのでproxpyを使いました