3DESの扱いが変わってきた
3DESに関して最近確認したことなどを記述します。
システムを運用する方、脆弱性を調査する方などに参考にしていただければ。
背景
2016年8月に、3DESおよび64ビットのブロック暗号に対するSWEET32攻撃が報告されました。 このOpenSSLのブログでは、3DESの強度の評価を“HIGH”から“MEDIUM”に下げるとアナウンスされています。
脆弱性スキャナの対応
脆弱性スキャナの1つであるNessusでも評価の変更があったようで、2016年12月頃から3DESを中程度の強度の暗号として挙げるようになりました。
Here is the list of medium strength SSL ciphers supported by the remote server : Medium Strength Ciphers (> 64-bit and < 112-bit key) TLSv1 EDH-RSA-DES-CBC3-SHA Kx=DH Au=RSA Enc=3DES-CBC(168) Mac=SHA1 ECDHE-RSA-DES-CBC3-SHA Kx=ECDH Au=RSA Enc=3DES-CBC(168) Mac=SHA1 DES-CBC3-SHA Kx=RSA Au=RSA Enc=3DES-CBC(168) Mac=SHA1
上記のように3DESがMedium Strength Ciphers(CVSS 4.3)として検出されています。 説明文では「< 112-bit」と書いているのに3DESが挙がってきたので、ロジックが変わったのか、それとも誤検知?と思って調べてみると、3DESを決め打ちでMEDIUMとしていました。 以下、該当ファイル(ssl_funcs.inc)の抜粋です。
# 3DES to Medium because of CVE-2016-2183. if ("Enc=3DES-CBC" >< desc) return CIPHER_STRENGTH_MEDIUM;
CVE-2016-2183はSWEET32のCVEなので、これを受けての変更であることが分かります。 なおNessusの該当プラグインの更新日付は2015年だったので、脆弱性の検出ロジック自体に変更はありませんでした。
その他のスキャナはというと、よくSSL/TLSのチェックに使われるQualysのSSL Server Testでは、本エントリの執筆時点で脆弱とはしていませんでした(適当なサーバのスキャン結果を見て確認)。sslscanでは3DESがハイライトされるようになりました。
他に影響しそうなものとしてはASV Scanなどがあります。一概には言えませんが、仮に現時点でPass判定でも近い将来はFail判定になるでしょう。
なので、現行のシステムは、計画的に3DESからAES等への移行をすすめる必要があると考えています。
3DESを無効化したときの影響
暗号スイートを無効化すると気になるのは影響範囲です。古いブラウザだと接続できなくなる可能性があります。 手元の環境と前述のQualys SSL Server Testでシミュレーションしてみました。
環境
設定ファイルも抜粋しておきます。
SSLProtocol TLSv1.2 SSLCipherSuite HIGH:!DH:!3DES
この状態で、有効な暗号スイートを確認しました。
Supported Server Cipher(s): Preferred TLSv1.2 256 bits ECDHE-RSA-AES256-GCM-SHA384 Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-RSA-AES256-SHA384 Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-RSA-AES256-SHA Curve P-256 DHE 256 Accepted TLSv1.2 256 bits AES256-GCM-SHA384 Accepted TLSv1.2 256 bits AES256-SHA256 Accepted TLSv1.2 256 bits AES256-SHA Accepted TLSv1.2 256 bits CAMELLIA256-SHA Accepted TLSv1.2 128 bits ECDHE-RSA-AES128-GCM-SHA256 Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-RSA-AES128-SHA256 Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-RSA-AES128-SHA Curve P-256 DHE 256 Accepted TLSv1.2 128 bits AES128-GCM-SHA256 Accepted TLSv1.2 128 bits AES128-SHA256 Accepted TLSv1.2 128 bits AES128-SHA Accepted TLSv1.2 128 bits CAMELLIA128-SHA
結果
結果は以下のようになりました。
サイズが大きいですが結果のスクリーンショットを貼っておきます。
条件をゆるくしてTLSv1.0を有効にして試すと、IEやAndroidの古いバージョンでも接続可能という結果になりました。 でもTLSの1.0は1.0でPCI DSSで引っかかったりしているので、また別の問題が……
まとめ
3DESに関する暗号強度の評価の変化、脆弱性スキャナによる評価について調査しました。また、無効化した場合の影響範囲について調査しました。
暗号アルゴリズムの危殆化はずっとついて回る問題なので、面倒ですが継続的に追っていくしかないですね。
その他
CRYPTRECはそろそろ更新されるんだろうか。
Burp Suiteの文字化け対策(試作2)
この前HDDを片付けていたら、昔作ったBurp SuiteのExtensionを発掘したのでアップしました。
概要
Proxy HistoryのComment列にタイトルを表示する拡張です。
Burp SuiteのUIはLatin1(ISO 8859-1)で作られているようで、日本語などは文字化けします。
この拡張ではワークアラウンドとして、Proxy History内のページのタイトルをComment列に表示しています。
Burp suiteからsqlmapコマンドを生成する拡張
タイトルの通りのものを作ったので公開しておきます。
すでにGithubに上げているので、ここでは簡単な説明だけ。
概要
タイトルの通り、Burp suiteからsqlmapコマンドを生成する拡張です。
少ない手順でsqlmapを実行できます。
Burp suiteにはSQLiPyなど優秀な拡張があるんですが、どうしてもBurpが重い&不安定になるので、コマンドラインでsqlmapしたいという人向けです。
きょうびSQLインジェクションなんか持ってるサイトはすかさずこいつで・・・
使い方
Burp suiteのコンテキストメニューから「Copy sqlmap PoC to Clipboard」を選択します。
以下のスクリーンショット参考。
操作中のHTTPリクエストに対応するsqlmapコマンドがクリップボードにコピーされます。
例として、リクエストとコマンドを載せます。
HTTPリクエスト:
POST /sqli/sqlitest.php HTTP/1.1 Host: victim.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://victim.example.com/sqli/sqlitest.php Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 7 id=mob1
コマンド:
python sqlmap.py -u "http://victim.example.com:80/sqli/sqlitest.php" --cookie="" --referer="http://victim.example.com/sqli/sqlitest.php" --headers="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: ja,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: close\r\nContent-Type: application/x-www-form-urlencoded" --host="victim.example.com" --user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0" --all --data="id=mob1"
テストするパラメータを指定したい場合は、リクエストのパラメータ名部分を選択した上でコマンドを生成します。
たとえばパラメータ'id'なら以下のようになります。( -p オプションが付く)
python sqlmap.py -u "http://victim.example.com:80/sqli/sqlitest.php" --cookie="" --referer="http://victim.example.com/sqli/sqlitest.php" --headers="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: ja,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: close\r\nContent-Type: application/x-www-form-urlencoded" --host="victim.example.com" --user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0" --all --data="id=mob1" -p id
コピーしたら、sqlmapのディレクトリ上でコマンドラインから実行してください。
その他
素直に sqlmap -r を使うのもいいと思います。
Burp Suiteとnghttpxを使ってHTTP2のWebアプリに接続してみよう
2015年2月にHTTP2がRFC化された。これから普及が進むことが期待される。既にいくつかのクライアントやサーバはHTTP2に対応しており、対応アプリケーションは、以下のGitHubでまとめられている。*1
HTTP2では、バイナリプロトコル、サーバープッシュ、多重化など新要素がある。これに伴うセキュリティ面ではOWASP等で議論が重ねられているところだけど、ここでは置くとして、さしあたり僕が気になるのは、従来型のWebアプリケーションのテストはどうなるんだろうという点。
テストのためにはフォワードプロキシが欲しい。が、あいにくBurp SuiteやFiddlerなどはまだ対応していない模様。上のGitHubを見てもフォワードプロキシはあまりなく、すぐ利用できるものもなさそう。
HTTP2はバイナリプロトコルなので、HTTPリクエストをそのままガシガシ編集することもできない。
いざ「HTTP2でアプリケーション作ったのでテストよろしくね」的な無茶振りがきた場合、途方に暮れるおそれがある。*2 *3
そこで今回は実験的に、Burp Suiteとnghttpxを組み合わせてHTTP2のWebアプリケーションにアクセスしてみたい。
検証環境
検証環境のイメージ
以下のイメージ。
ざっくり流れを説明すると、
・ブラウザからBurp Suiteを通して接続する。ここはHTTP1。
・クライアント側のフォワードプロキシ(nghttpx)でHTTP1→HTTP2にアップグレード
アプリケーション
検証用に、入力値(名前)を受け取ってようこそというメッセージを出すだけのシンプルなphpスクリプトを用意。*5
hello.php
<?php $name = $_POST["name"]; if($name=="") { $name = "guest"; } ?> <html> <head> <title>greeting</title> </head> <body> <h1>greeting</h1> Hello, <?php echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); ?> !<br /> <br /> <?php if($name=="guest") { ?> Input your name.<br> <form action="./hello.php" method="post"> Name: <input type="text" name="name" size="24" value="" /> <input type="submit" /> </form> <?php } ?> <a href="./hello.php">back</a><br /> <br /> </body> </html>
手順
- ブラウザとかBurpとかApacheはテキトーに起動する。
- ブラウザのプロキシ設定をBurpに、Burpのプロキシ設定をフォワードプロキシのnghttpxに設定する。
- フォワードプロキシのnghttpxを以下のコマンドで起動する。
nghttpx -p -k -LINFO -f0.0.0.0,8090 -b192.168.120.128,8443
- リバースプロキシのnghttpxを以下のコマンドで起動する。
nghttpx -LINFO -f0.0.0.0,8443 -b127.0.0.1,80 /root/cert/server.key /root/cert/server.crt
- ブラウザからサーバのURLにアクセスする。
結果
ブラウザから、フォワードプロキシを経由してWebアプリケーションに接続できることを確認した。
アクセスの様子
ブラウザから、サーバのURL「http://192.168.120.128:8443/hello.php」にアクセスしたところ。
フォームをSubmitしたときのHTTPリクエスト
POSTパラメータ「name」の値を改変
HTTPレスポンス。改変後の値で処理されている。
結果表示。
ログでの確認
フォワードプロキシのログを見ると、リクエストがHTTP1→HTTP2にアップグレードされていることがわかる。
(前半がBurpから受け取ったHTTPリクエスト、後半がサーバに送るHTTPリクエスト)
20/Apr/2015:23:06:57 +0900 PID25573 [INFO] shrpx_https_upstream.cc:153 [UPSTREAM:0x7ffc3b84e060] HTTP request headers POST http://192.168.120.128:8443/hello.php HTTP/1.1 Host: 192.168.120.128:8443 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://192.168.120.128:8443/hello.php Connection: keep-alive Cache-Control: max-age=0 Content-Type: application/x-www-form-urlencoded Content-Length: 35 (中略) 20/Apr/2015:23:06:57 +0900 PID25573 [INFO] shrpx_http2_session.cc:1279 [DHTTP2:0x7ffc3b836780] Negotiated next protocol: h2-14 20/Apr/2015:23:06:57 +0900 PID25573 [INFO] shrpx_http2_downstream_connection.cc:438 [DCONN:0x7ffc3b8216c0] HTTP request headers :scheme: http :path: /hello.php :authority: 192.168.120.128:8443 :method: POST accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 accept-encoding: gzip, deflate accept-language: en-US,en;q=0.5 cache-control: max-age=0 content-length: 35 content-type: application/x-www-form-urlencoded host: 192.168.120.128:8443 referer: http://192.168.120.128:8443/hello.php user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.5.0 via: 1.1 nghttpx
課題
アクセス自体はできたものの、いま分かっている課題を挙げる。
まとめ
HTTP1→HTTP2にアップグレードできるフォワードプロキシ(nghttpx)を使って、Burp SuiteでHTTP2サイトにアクセスしてみた。Burp Suiteはテストに使えそうだけど、実用を考えるとまだクリアする課題がある。やはりBurp SuiteなどのテストツールがHTTP2に対応するのを期待したい。