ストライプCTF-SHA-1アルゴリズム解析

会社のStripeがCapture the Flagコンテストを開催しているという投稿がハブで公開されたとき、私はすぐに参加者として登録しました。



9つのレベルのそれぞれは、システムをハッキングし、次のレベルへのパスワードを取得するタスクを表しています。 パスワードは、データベースとファイルの両方、およびメモリに保存できます。 ちなみに、すべてのコードはオープンであったため、タスクは脆弱性のコードを分析するために削減され、盲目的に突く必要はありませんでした。



レベル0から6は難しくありませんでした-標準のSQLおよびJavaScriptインジェクション、画像の代わりにサーバーにPHPスクリプトをアップロードするなど。



そして、ここに私が私の頭を壊すようにする7レベルがあります...



TacoCopterサービスに触発されたStripe プログラマーは、特定のWaffleCopterをモデル化しました。これは、ラジコン(または完全に自動化された)ヘリコプターを使用して指定されたポイントにウェーハを配送するサービスです。



このサービスは、ワッフルを注文するためのAPIを提供します。 データベースには、ユーザーおよび注文可能なウェーハの種類に関する情報が含まれています。 プレミアムアカウントのみに注文できるタイプがいくつかあります。



CTFメンバーには通常のアカウントが提供され、タスクは特定の種類のプレミアムワッフル、リエージュワッフルを注文することでした。 ボーナスとして、クエリログが公開されたため、誰が何をいつ注文したかを確認できます。



各要求は、次の原則に従ってSHA-1アルゴリズムを使用して署名する必要があります。

= sha1 ( + )





+= "|sig:" +







次に、メッセージはPOSTメソッドを使用してサーバーに送信されます。



ログに次のクエリが見つかりました。

user_id=1&lat=26.629166676667&long=-70.883611121111&count=1

&waffle=dream|sig:439ca26828fb91eb8525274ecb9ef241f0487c88






(残念ながら、サーバーは使用できなくなっているため、リクエスト本文の値を置き換えました)



ここで、user_idはユーザーID、latとlongは注文が配達される場所の座標、countは数量、waffleは実際の注文タイプです。 もちろん、ワッフルの外観は注文しなければならないものと一致しません。



目の前にプレミアムユーザーからのリクエストのログがあったので、頭に浮かんだ最初の考えは「2つのメッセージと2つのハッシュを使用して秘密を理解できますか?」

もちろん、SHA-1はそれほど単純なアルゴリズムではないため、このオプションはすぐに消えました。



Wikipediaを読んでSHA-1について少しグーグルで調べた後、この方法で署名を作成することはお勧めできないことがわかりました。この方法は信頼性が低いため、 sha1 ( + )



です。 同時に、私はアメリカ人の友人からヒントを受け取りました。彼はその時点ですでにこのクエストを首尾よく完了していました。長さ延長、またはウィキペディアにも記載されているメッセージを長くすることによる攻撃。 まあまあ...しかし、私はSHA-1がそれほど脆弱だとは思わなかった。



メインのSHA-1ループは、元のメッセージが分割された512ビットブロックを繰り返し処理します。 各反復の出力でのブロック内の計算と順列により、5つの32ビットワードが形成されます。これは次の反復の入力パラメーターです。 最後の反復の後、これらのパラメーターは結合されて160ビットのハッシュになります。



アルゴリズムの仕組みのビデオを見る


メッセージを長くすることによる攻撃の本質は次のとおりです。 別の512ビットブロックが初期化されます。これは、別のユーザーに代わってサーバーに転送する追加のメッセージ、およびサービス情報、特にメッセージのゼロと長さを補完する単位で構成されます。 既知の元のメッセージの160ビットハッシュは5つの32ビットワードに分割され、計算されたワードが入力パラメーターである追加の反復が実行されます。 必要な操作がブロックに対して実行され、出力で5つの新しい単語が取得されます。これが新しい160ビットハッシュになります。



元のメッセージを私たちのメッセージで補完し、元のハッシュを計算されたものに置き換えます。そして、サーバーはリクエストを受け入れました。

この場合、サーバーは次のようなものを受け取ります

user_id=1&lat=26.629166676667&long=-70.883611121111&count=1

&waffle=dream%01%00%00%00%00%00P&waffle=liege








元のメッセージに必要な種類のワッフルを追加しました。 リクエストに応じて、リエージュワッフルの注文の場合、次のレベルのパスワードとなる確認コードを受け取ります。



このタイプの攻撃に対抗する手段として、ダブルハッシュが推奨されます。



All Articles