生存報告

主に情報セキュリティ関連のエントリをたまに書いて、存命であることを報告するページ。

3DESの扱いが変わってきた

3DESに関して最近確認したことなどを記述します。

システムを運用する方、脆弱性を調査する方などに参考にしていただければ。

背景

2016年8月に、3DESおよび64ビットのブロック暗号に対するSWEET32攻撃が報告されました。 このOpenSSLのブログでは、3DESの強度の評価を“HIGH”から“MEDIUM”に下げるとアナウンスされています。

脆弱性スキャナの対応

脆弱性スキャナの1つであるNessusでも評価の変更があったようで、2016年12月頃から3DESを中程度の強度の暗号として挙げるようになりました。

f:id:tosebro:20161226011450p:plain

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  

結果

結果は以下のようになりました。

  • PCは、IEは最新版のみ、その他のブラウザは問題なさそう。
  • スマホは、iOSは問題なさそう、Androidは4.4未満は接続不可。
  • ガラケーは接続不可。そもそもTLSv1.0までしか対応していない。

サイズが大きいですが結果のスクリーンショットを貼っておきます。

f:id:tosebro:20161226020444p:plain:w300

条件をゆるくしてTLSv1.0を有効にして試すと、IEAndroidの古いバージョンでも接続可能という結果になりました。 でもTLSの1.0は1.0でPCI DSSで引っかかったりしているので、また別の問題が……

まとめ

3DESに関する暗号強度の評価の変化、脆弱性スキャナによる評価について調査しました。また、無効化した場合の影響範囲について調査しました。

暗号アルゴリズムの危殆化はずっとついて回る問題なので、面倒ですが継続的に追っていくしかないですね。

その他

CRYPTRECはそろそろ更新されるんだろうか。

Burp Suiteの文字化け対策(試作2)

この前HDDを片付けていたら、昔作ったBurp SuiteのExtensionを発掘したのでアップしました。

github.com

概要

Proxy HistoryのComment列にタイトルを表示する拡張です。


Burp SuiteのUIはLatin1(ISO 8859-1)で作られているようで、日本語などは文字化けします。
この拡張ではワークアラウンドとして、Proxy History内のページのタイトルをComment列に表示しています。

スクリーンショット

https://raw.githubusercontent.com/tosebro/JPtitle/master/screenshots/JPtitle-01.png

まあ、これで少しでも使いやすくなれば。

Burp suiteからsqlmapコマンドを生成する拡張

タイトルの通りのものを作ったので公開しておきます。
すでにGithubに上げているので、ここでは簡単な説明だけ。

概要

タイトルの通り、Burp suiteからsqlmapコマンドを生成する拡張です。

少ない手順でsqlmapを実行できます。
Burp suiteにはSQLiPyなど優秀な拡張があるんですが、どうしてもBurpが重い&不安定になるので、コマンドラインでsqlmapしたいという人向けです。

きょうびSQLインジェクションなんか持ってるサイトはすかさずこいつで・・・

使い方

Burp suiteのコンテキストメニューから「Copy sqlmap PoC to Clipboard」を選択します。
以下のスクリーンショット参考。

https://raw.githubusercontent.com/tosebro/SqlPoC/master/screenshots/sqlpoc_01.png

操作中の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のディレクトリ上でコマンドラインから実行してください。

ダウンロード

Githubに置きました。

github.com

その他

素直に sqlmap -r を使うのもいいと思います。

Burp Suiteとnghttpxを使ってHTTP2のWebアプリに接続してみよう

2015年2月にHTTP2がRFC化された。これから普及が進むことが期待される。既にいくつかのクライアントやサーバはHTTP2に対応しており、対応アプリケーションは、以下のGitHubでまとめられている。*1


github.com


HTTP2では、バイナリプロトコル、サーバープッシュ、多重化など新要素がある。これに伴うセキュリティ面ではOWASP等で議論が重ねられているところだけど、ここでは置くとして、さしあたり僕が気になるのは、従来型のWebアプリケーションのテストはどうなるんだろうという点。

テストのためにはフォワードプロキシが欲しい。が、あいにくBurp SuiteやFiddlerなどはまだ対応していない模様。上のGitHubを見てもフォワードプロキシはあまりなく、すぐ利用できるものもなさそう。
HTTP2はバイナリプロトコルなので、HTTPリクエストをそのままガシガシ編集することもできない。

いざ「HTTP2でアプリケーション作ったのでテストよろしくね」的な無茶振りがきた場合、途方に暮れるおそれがある。*2 *3

そこで今回は実験的に、Burp Suiteとnghttpxを組み合わせてHTTP2のWebアプリケーションにアクセスしてみたい。

nghttpxについて

HTTP2のリバースプロキシである。なんか使い方によってはフォワードプロキシのようにも使えるみたい。以下リンクを参照。

qiita.com

今回は、フォワード/リバース両方使う。

検証環境

検証環境のイメージ

以下のイメージ。

f:id:tosebro:20150422063700p:plain

ざっくり流れを説明すると、

・ブラウザからBurp Suiteを通して接続する。ここはHTTP1。

・クライアント側のフォワードプロキシ(nghttpx)でHTTP1→HTTP2にアップグレード

・サーバ側のリバースプロキシ(nghttpx)でHTTP2→HTTP1にダウングレードしてApacheに転送*4

アプリケーション

検証用に、入力値(名前)を受け取ってようこそというメッセージを出すだけのシンプルな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アプリケーションに接続できることを確認した。

アクセスの様子

f:id:tosebro:20150420232333p:plain
ブラウザから、サーバのURL「http://192.168.120.128:8443/hello.php」にアクセスしたところ。


f:id:tosebro:20150420232338p:plain
フォームをSubmitしたときのHTTPリクエスト


f:id:tosebro:20150420232343p:plain
POSTパラメータ「name」の値を改変


f:id:tosebro:20150420232345p:plain
HTTPレスポンス。改変後の値で処理されている。


f:id:tosebro:20150420232349p:plain
結果表示。

ログでの確認

フォワードプロキシのログを見ると、リクエストが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

課題

アクセス自体はできたものの、いま分かっている課題を挙げる。

  • フォワードプロキシ側で、サーバアドレスが決め打ちになってしまっている。複数ドメインにわたる場合などが問題。
  • サーバアドレスを実在のドメインに変えると動作しない場合があった。*6
  • TLS関連のテストができない。(別でnmapとかsslscanでやる?)
  • アップグレード/ダウングレードがあってロスする情報があるかもしれない。

まとめ

HTTP1→HTTP2にアップグレードできるフォワードプロキシ(nghttpx)を使って、Burp SuiteでHTTP2サイトにアクセスしてみた。Burp Suiteはテストに使えそうだけど、実用を考えるとまだクリアする課題がある。やはりBurp SuiteなどのテストツールがHTTP2に対応するのを期待したい。

*1:メジャーなところではTwitterがHTTP2に対応している。

*2:特に、NOと言うことが許されない体育会系の組織にいる現場の人(僕のような)には酷な話だ。

*3:Twitterはどうやってるんだろう。ソースコードレビュー?

*4:環境構築を簡単にするためApache利用

*5:脆弱性あったらごめんなさい。

*6:手元で見た限りではnghttp2.orgは接続可能、twitter.comは不可だった