logo
code:Haemophilus influenzae

ここに書かれていることは無保証です。同じことを行って問題が発生しても、 龍義は責任をとりません。

2006年8月3日

戻る

ssldump を使う Ver 1.6

インストール

ssldump を使うには、 libpcap を使用しているので、 ssldump を インストールする前に、 libpcap がインストールされているか 確認する。もちろん、暗号化の解読を行うには、 OpenSSL がインストール されている必要がある。インストール方法については、書かれている ページがいっぱいあるので、別途検索してもらって、そのページを 見てもらいたい。時間があれば、ここにも書くかもしれないけど。

参考:
ssldump
http://www.rtfm.com/ssldump/

ssldump の不具合等

ssldump は最新版の 0.9b3 でも 2002年8月のものなので、 かなり古い状態。最新のバージョンをダウンロードしただけでは、 AES の暗号化などが Unknown となり、解読できないので、 解読させる場合は、FreeBSD の Ports などに入っている patch など 適用する必要がある。

参考:
FreeBSD の Ports の patch(AES の追加など)
http://www.freebsd.org/cgi/cvsweb.cgi/ports/net/ssldump/files/
バグ情報(SourceForge)
http://sourceforge.net/tracker/?atid=523055&group_id=68993&func=browse

起動オプション

オプションの簡単な説明。まずは、デバイスの指定を行う。

ssldump -i eth0

と、デバイス名を指定する。
https の暗号化された通信を解読を行うには、鍵の指定をする。

ssldump -k /usr/local/apache/conf/server.key

のようになる。この鍵にパスワードを設定している場合は、

ssldump -k /usr/local/apache/conf/server.key -p foobar

というように、パスワードを指定する。この2つの設定を正しく行えば、 https での暗号化の通信を解読できる。

鍵のオプションだけでは、交換している鍵の方式や、 SSL のプロトコルの バージョンは表示するが、実際に通信している内容までは表示されない。 実際に、暗号化されたデータを表示するには、 -d オプションをつける。

ssldump -d -k /usr/local/apache/conf/server.key

同様に、16進数のダンプデータを表示するには -x オプションをつける。

ssldump -x -k /usr/local/apache/conf/server.key

オプションの後につける expression の部分は、 tcpdump の expression と 同じ、というか pcap と同じになる。 http と https のダンプを行うには、

ssldump port 80 or port 443

とする。

ssldump dst port 80

とすると、 http のクライアントからの通信のみをダンプできる。しかし、

ssldump -k /usr/local/apache/conf/server.key dst port 443

とした場合は、クライアントからの暗号化通信をダンプできる、 はずなのだけど、実際には鍵周りの交換が解析できないので、暗号化の 解読ができない。
その他のオプションについては、 man page などを参考にする。

参考:
Manual Page
http://www.rtfm.com/ssldump/Ssldump.html

解読できない!

解読できる暗号化方式にに制限がある。基本的に、 DH と呼ばれる Diffie-Hellman 方式の暗号化が含まれている場合は、解読できない。 手元の apache を使って、 Firefox や lynx, w3m で試してみたが、 この DH 暗号化方式を使うので、解読できなかった。 IE の場合は解読ができた。この通信を、どうにかして解読したい 場合は、 web サーバの設定を変更する必要がある。 以下は、手元の Apache の設定。

# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

実は、この設定は Apache が握っているのではなく、そのまま OpenSSL に 引き渡している。なので、Apache のドキュメントよりも、OpenSSL の ドキュメントを読む方が、ある意味正しい。
以下は、 手元の OpenSSL の source を拾ったものである。

#define SSL_kDHr 0x00000002L /* DH cert RSA CA cert */
#define SSL_kDHd 0x00000004L /* DH cert DSA CA cert */
#define SSL_kEDH 0x00000010L /* tmp DH key no DH cert */
#define SSL_kECDH 0x00000040L /* ECDH w/ long-term keys */
#define SSL_kECDHE 0x00000080L /* ephemeral ECDH */
#define SSL_EDH (SSL_kEDH|(SSL_AUTH_MASK^SSL_aNULL))

#define SSL_AUTH_MASK 0x00007F00L
#define SSL_aNULL 0x00000800L /* no Authenticate, ADH */
#define SSL_aDH 0x00001000L /* no Authenticate, ADH */

#define SSL_ADH (SSL_kEDH|SSL_aNULL)
#define SSL_DH (SSL_kDHr|SSL_kDHd|SSL_kEDH)
#define SSL_ECDH (SSL_kECDH|SSL_kECDHE)

なので、全てを試したわけではないが、

SSLCipherSuite ALL:!aDH:!DH:!ECDH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

の設定にすれば、 DH での暗号化が行われずに、 ssldump で 解読ができるようになると思う。

フィルタが多いと出るエラー
2006.8.28 追加

ssldump でフィルタを多数つけると、

Warning: Kernel filter failed: Cannot allocate memory

というエラーが出る。これは、 libpcap が出しているものである。このメッセージが 出た場合、フィルタが正しく設定されていない状態で動作している可能性がある。 このソフトウェアの性格上、 src net で絞るのではなく、 net での絞り方になるので、 余計にこのメッセージが出ることが多いと思われる。
tcpdump で -O オプションを付けて、同じフィルタ設定で起動すると、この エラーが出て、 -O オプションをつけないで、同じフィルタ設定で起動すると、 このエラーが出ない場合は、エラーを消すことができる。 base/pcap-snoop.c のpcap_compile 関数の4番目の 引数を 0 から 1 にしてコンパイルし直すとエラーがなくなる。

ssltap
2006.8.28 追加

ssldump では秘密鍵がないと解読できないのだけど、どのような鍵の種類を使って いるか、などの最低限のやり取りは見ることができる。やり取りを見るだけの動作 だったら、ssltap というツールを使う方法もある。
利用環境は Solaris, NT と書かれているが、 Linux 等でも問題なくコンパイルできる ようである。ssldump よりも新しく、メンテナンスされているみたいなので、 ssltap を使うという選択もある。

参考:
ssltap
http://lxr.mozilla.org/mozilla/source/security/nss/cmd/ssltap/
ssltap 参考文献
http://www.mozilla-japan.org/projects/security/pki/nss/tools/ssltap.html

cygwin でのコンパイル
2006.10.17 追加

cygwin でも動作が確認できた。別ページに作成したので、参考にしたもらいたい。

cygwin で動作

Windows 環境しかない人には、便利かもしれない。

突然終了
2006.10.17 追加

ssldump をポート番号 80 や 443 で絞らずに、長時間使っていると、落ちる場合がある。 原因は sslprint.c の ssl_decode_switch 関数で不正なテーブルを読みに行こうと するからである。この修正の patch を作成した。検索しても、世の中に出回って ないようなので、ここにおいて置く。

dtable.patch

自由に使ってもらいたい。

ethereal で解読
2006.10.28 追加

そう言えば、 ethereal をコンパイルできる環境にあれば、 ethereal でも解読が できる。昔書いたページでまとめてないのだけど、何かの参考に。

参考:
Tatsuyoshi Tech diary(2006年7月7日〜)
http://www.tatsuyoshi.net/toyota/tech/200607.html

IP がないインタフェース
2007.3.5 追加

IP をつけていないインタフェースを指定してキャプチャをすると、

PCAP: eth0: no IPv4 address assigned

と出力して終了する。
tcpdump だと、同じエラーを出力するが、キャプチャ動作自体は行ってくれる。 このエラーは pcap_lookupnet の返りが負値になるためである。もし、この状態で キャプチャしたい場合は、 base/pcap-snoop.c の 294行目あたりを修正する。

if (pcap_lookupnet(interface_name, &localnet, &netmask, errbuf) < 0)
verr_exit("PCAP: %s¥n",errbuf);

となっている部分を

if (pcap_lookupnet(interface_name, &localnet, &netmask, errbuf) < 0);

とする。これで、キャプチャを行ってくれるようになる。

CentOS 5 でのコンパイル
2008.1.18 追加

[toyota@centos5]$ uname -o -v
#1 SMP Mon Nov 12 02:14:55 EST 2007 GNU/Linux
[toyota@centos5]$ cat /etc/redhat-release
CentOS release 5 (Final)

な環境でコンパイルをすると、いくつか新しいエラーが出たので、ちょっと直してみた。 /usr/lib64 の対応と、アーキテクチャの x86_64 の追加、 新しい OpenSSL の関数への対応の最低限の patch を作成。
上の方に書いた FreeBSD の patch などを組み合わせて使うと完璧。

centos5.patch

他のディストリビューションでも使えたりするかもしれない。自由に使ってもらいたい。

Wireshark を使う
2008.5.1 追加

久しぶりに Windows 版の Wireshark を使ったら、標準で https の解読ができるようになっていた。 2008年4月11日にも書いたが、 設定方法は、Edit -> Preferences -> Protocols -> SSL で、RSA keys list にファイルの指定をする。 例えば、以下のような感じである。

192.168.0.89,443,http,C:¥keys¥tnet.key;192.168.0.92,443,http,C:¥keys¥195.key

これは、
192.168.0.89 の場合はポート 443 番で、キーファイルは C:¥keys¥tnet.key を使う、
192.168.0.92 の場合はポート 443 番で、キーファイルは C:¥keys¥195.key を使う、
という設定である。 Windows 環境では、実質 Wireshark ぐらいしか解析ソフトがないので、 Wireshark を使うしかないでしょう。

by Tatsuyoshi
since 2003