証明書ベースのセキュリティの調査(utm5)

この記事では、クラックやキー生成の方法については説明しません。 ここでは、かなり高価なソフトウェア製品の保護に関する簡単な研究を行います。



そのため、utm5が選択されました。

目標は、このソフトウェア製品が使用する保護方法の種類を理解することでした。特に、この複雑なプログラムは、Windowsとlinux / freebsdの両方で利用できるためです。



UNIX版を使用しました。これは、Windows以外でプログラムを研究した最初の経験だったからです。

そして、ワインの下から打ち上げられた同じIDAを使用します。



utm5がロードされ、デモキーがあり、すべてが構成されており、機能しているとしましょう。 さあ、始めましょう:



システムのカーネル(utm5_core)を取得し、IDAを提供します。 飲んでコンピュータに戻りましょう。IDAはファイルを完全に分析したことを喜んで報告します。



reg.sqlファイルを見て、システムのカーネルがmysqlからライセンスを読み取ると結論付けます。

データを注意深く見て、「hash1、hash2、data」フィールドに興味があると判断します。



文字列のhash1行を検索すると、次のことがわかります。

画像



さて、これはデータベース内のクエリなので、この行が使用されている場所、つまりUTM :: DBAccess :: get_license_infoに移動します( そのような名前はUNIXバージョンにのみあり、Windowsバージョンにはそのようなアメニティはなく、抽象的な名前のみがあります機能



UTM :: DBAccess :: get_license_infoを前後にスクロールすると、テーブルのデータがここで読み取られ、最終的にすべてが正常であるか、すべてが不良であることがわかります。



画像



したがって、メイン+ ABCのレベルを1つ上げます。



画像



そして、私たちは非常に興味深いことに出会います-"CirtificationCenterImpl":



画像



UTM :: CertificationCenterImpl ::インスタンス(void)には興味深いものは何もないので、UTM :: CertificationCenterImpl :: initに進み、内部で何が面白いか見てみましょう。



画像



「_d2i_X509」と「_X509_get_pubkey」が表示されます。 すばやく検索すると、これらの関数がX.509で動作するために必要であるという事実につながります。



ここで、_d2i_X509に入力されるデータに注意しましょう。



すぐ上に「UTM :: HiddenData :: get_data(void)」と「UTM :: HiddenData :: size(void)」という2つの関数があります。



UTMを開く:: HiddenData :: get_data(void):

画像



開発者は、単にデータを実行可能ファイルに「入れ」たくないだけでなく、多くのmov'ovの助けを借りてそれをしたことは明らかです。



2番目の関数は、単にこのデータのサイズを返します。

画像



GDBのブレークポイントを次の場所に配置します。

画像



この場所で停止した後、eaxにあるアドレスのメモリから0x49B文字をダンプできます。



gcr-viewerまたはコンソールopenssl x509のいずれかを見て、以下を確認します。

画像



さて、何らかの証明書があります。次に、次に何が起こるかを調べてみましょう。

画像



次に、プログラムはこの証明書から公開鍵を受け取り、それをすべて「_ZN3UTM23CertificationCenterImpl23CertificateFromKeyStoreEi」に転送します。その下では、エラーメッセージがすでに送信されていることがわかります。

画像



mysqlでは、データフィールドにpkcs12形式の別の証明書があるという結論に達することができます。



このデータをreg.sqlファイルから抽出し、バイナリ形式に変換します。 これはascii-hexエントリです。



「キー」ファイルにデータを保存したら、コマンドを使用して多くの証明書を抽出します。

openssl pkcs12 -in key -out key.pem







Opensslはパスワードを要求します。 reg.sqlのキーと一緒に行ったパスワードを彼女に入力します。 asmのリストには、同様の明示的なものは見られませんでした。



key.pemを取得するためにパスワードを数回入力します。



同じgcr-viewerを使用して、このkey.pemを見て、以下を確認します。



utm5_core

信頼性:utm5_core

検証済み:UTM5 SUB CA

有効期限:01/03/2012



utm5_dealer

真正性:utm5_dealer

検証済み:UTM5 SUB CA

有効期限:01/03/2012



utm5_dynashape

真正性:utm5_dynashape

検証済み:UTM5 SUB CA

有効期限:01/03/2012



utm5_hotspot

信頼性:utm5_hotspot

検証済み:UTM5 SUB CA

有効期限:01/03/2012



utm5_radius

真正性:utm5_radius

検証済み:UTM5 SUB CA

有効期限:01/03/2012



utm5_tel

真正性:utm5_tel

検証済み:UTM5 SUB CA

有効期限:01/03/2012



キー

RSAシークレットキー

信頼性:1024ビット



「認証局の作成に関する実践ガイド」を読んだ後、utm5のライセンスは証明書を使用して作成されたことが明らかになり、ライセンス証明書+プログラムから証明書を引き出して、ライセンス証明書の信頼性を検証しています。



別のファイルのkey.pemファイルから各証明書を選択すると、特定のモジュールの制限を示す同じコンソールユーティリティ「openssl x509」から追加のフィールドを表示できます。



NetUPだけが持つ秘密キーがないと、必要なライセンス証明書を生成できないことは完全に明らかであるため、このステップで調査を完了することができます。



実際、保護にはさらに非常に大きな脆弱性がありますが、まったく同じ制限が読み取られると、通常の行の形式でプログラムに転送され、非常に大きな値または「-1」でも簡単に置き換えられます。



ライセンスの有効期間も証明書の有効期間によって制限されているため、この場所にパッチを適用することもでき、プログラムは証明書の有効期限が切れた後でも動作します。



しかし、よりエレガントな方法は、必要な値を使用して独自の証明書を作成することです。 検証証明書を取得してプログラムに詰め込み、機能コード「UTM :: HiddenData :: get_data(void)」および「UTM :: HiddenData :: size(void)」で置き換えるため、プログラムはそれらを受け入れることができます私の場合、utm5は少なくとも2050年まで機能しますが、必要ですか?



All Articles