1つの「壊れた」テストケースの話、またはOpenSSLバージョンに注意してください...

免責事項。私は「本物の溶接工」ではありませんが、情報セキュリティの分野で興味深い仕事を探しているため、最近、HackTheBoxでさまざまなCTFやマシンを定期的に解決しています。そのため、CTFスタイルのテスト項目の1つへのリンクが送信されたとき、通過できませんでした...







テスト項目の意味は非常に単純です。暗号化キー、一部のガベージ、および暗号化されたフラグを含むトラフィックダンプが提供されます。それらを抽出し、フラグを解読する必要があります。このフラグが暗号化されたOpenSSLコマンドも示されています。トラフィックは非常に興味深いものですが、10行のpythonコードの後、暗号化キー、ゴミ、暗号化されたフラグが目の前にありました。何がうまくいかないのでしょうか?



割り当ては、フラグがほぼ次のコマンドで暗号化されたことを示しています(いくつかの重要でないパラメーターを省略し、暗号化アルゴリズムを変更しました)。



echo "FLAG_xxxx…xxxxxx" | openssl enc -e -base64 -aes-256-cbc -nosalt -k $password 
      
      





トラフィックから取得したパラメータをコマンドに挿入して起動すると...ゴミが出ました!もう一度やり直しました。再びゴミ。さまざまな方法でトラフィックを再構築しようとしました。いいえ、明らかに、トラフィックは明確に収集することしかできません。しかし、暗号化の出力は再びゴミです!!! 同時に、OpenSSLは、1回のパスでパスワードからキーを取得することは悪い考えであると正直に警告しています...



echo "ENCRYPTED_FLAG" | openssl enc -d -base64 -aes-256-cbc -nosalt -k $key 
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
      
      





次の日は、この狂気を解こうとして費やされました。私は、条件に示されている「ゴミ」を誤って分離し、結果の文字列を「パスワード」と「暗号化されたフラグ」に分割して後続の「ブルートフォース」にするためのいくつかのオプションを記述したようだと合理的に推論しました。それは役に立ちませんでした...私は各パラメーターを深く理解し始めました。



ご存知のとおり、AESが機能するには、暗号化キーとIV(初期化ベクトル)が必要です。 -kオプションを使用すると、OpenSSL自体が必要なキーとIVを取得するテキストフレーズを使用できます。 -pパラメーターを使用してそれらを表示できます。



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
key=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8
iv =3B02902846FFD32E92FF168B3F5D16B0
C11kA+GcqkU4ocOvZAVr3g==
      
      





この知識も私に何も与えませんでした。それにもかかわらず、私は思いついた最もクレイジーなアイデアに戻ることにしました。つまり、問題は私にはありませんが、OpenSSLで何かが変更されました...

トラフィックの日付は2016年だったので、Ubuntu 14.04を使用し、成功の見込みがあまりないまま、初期データを挿入しました。そして突然、ゴミの代わりにFLAGを手に入れました!夕方はだらしなくなりました...さらに、同じパスワードと-pパラメータを使用した同じコマンドは、完全に異なる暗号化キーとIVを生成しました!



新しいシステム(openssl 1.1.1h)



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
key=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8
iv =3B02902846FFD32E92FF168B3F5D16B0
C11kA+GcqkU4ocOvZAVr3g==

      
      





古いシステム(openssl 1.0.1f)



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
key=5F4DCC3B5AA765D61D8327DEB882CF992B95990A9151374ABD8FF8C5A7A0FE08
iv =B7B4372CDFBCB3D16A2631B59B509E94
R3N+5v3zOz9QcNt08cwqcA==
      
      





恐れが確認されたことが明らかになった。パスフレーズからキーとIVを生成するためのアルゴリズムが変更され、OpenSSLの最新バージョンでCTFを正面から解決する機能が完全に破壊されました。実装のニュアンスを探す過程で、非常に興味深い作品「キー派生プロトコルのパスワードベースのOpenSSL暗号化分析」に出くわし、 すべてがうまくいきました。つまり、バージョン1.1.0では、パスワードPBKDF2からキーを生成するための新しいプロトコルが追加されましたが、さらに重要なことに、古いPBKDF1アルゴリズムにより、デフォルトのハッシュアルゴリズムがMD5からSHA-256に変更されました。したがって、同じパスワードでも異なるキーとIVが生成されます。以前に暗号化されたものを復号化するには、新しいバージョンでは-mdmd5パラメーターを使用する必要があります



「-mdmessagedigest:md2、md5、sha、またはsha1からのキー派生に使用されるメッセージダイジェストを指定します



このパラメーターを追加すると、新しいOpenSSLでフラグを取得できるようになりました。この「ニュアンス」がテストタスクの開発者によって実際に考慮されたのか、それとも単に最新のシステムでテストしなかったのかはわかりませんが、OpenSSLの微妙な点のいくつかを深く掘り下げなければならなかったという事実は残っています。



PS私の知人を通して、私はすでに私が見つけた問題についてテストテストの開発者に知らせました、さもなければ彼らは彼らが彼らに行かない人々であることに突然非常に驚いています...



All Articles