0x00概要
ターゲットサイトはhttp://www.example.comです。公式ウェブサイトはAPIの使用文書を提供していますが、テスト後に脆弱性は見つかりませんでした。ディレクトリ、ポートスキャンなどで利用可能なポイントは見つかりませんでした。後で、公式ウェブサイトがクライアントのダウンロードを提供したことがわかりました。
0x01情報収集
最初にクライアントのパッケージをつかみました。 FiddlerとBurpsuiteを使用してキャッチできませんでした。私はそれがHTTPプロトコルではないと疑った。 Wiresharkを使用して、実際にHTTPプロトコルを使用していることを確認しましたが、データパケットは簡単に再生できませんでした。最後に、WSEXPlorerを使用して、指定されたプロセスのパケットをキャプチャし、通信データを正常にキャプチャしました。キャプチャされたデータは次のとおり、緑色はリクエストパケットであり、赤いものは応答パケットでした。
データパケットは2つの部分に分割されます。1つはリクエストラインとリクエストヘッダーです。
1つはリクエスト本体です。
それを一緒にスプライシングすることは、データパケットをリプレイするために強盗に配置できます
0x03テストプロセス
リクエストパケットが暗号化されてから送信され、返された応答パケットも暗号化されていることがわかります。ただし、暗号化と復号化は常にクライアントで実行されるため、クライアントを分析することから始めることができます。
Exeinfo PEを使用してシェルを確認すると、NETフレームワークC#によって開発されたプログラムが使用されていることがわかります。
DNSPYを使用して、NETプログラムにリバースエンジニアリングツールを使用して、クライアントの暗号化と復号化を分析できます。開いた後、クラスとメソッドの命名はすべて不規則な数値文字であり、コードが難読化されていることがわかりました。
難読化されたコードは読み取り分析を使用せず、DE4DOTを使用して防1障害を試みることができ、多くの難解性暗号化ツールをサポートしてソースコードを難読化できます。
de4dot-x64.exe origin.exe
耐性のあるプログラムOrigin-Cleaned.exe を入手できます
溶け防止プログラムをDNSPYにドラッグして表示すると、復元されて読みやすくなります。
その通信はHTTPプロトコルを使用しているため、httphelperという名前のクラスがあることがわかりました。分析のフォローアップ。コードには、図に示すように、データを暗号化してPOSTリクエストを開始する方法であると疑われるPOST機能は表示されません。
M.Encrypt()は、要求されたパラメーターを暗号化するために呼び出され、メソッドをフォローアップし、MMクラスの下でキー暗号化関数がtest05関数である必要があることがわかりました。
ブレークポイントを設定して、プログラムが暗号化と送信用にこの関数を呼び出すかどうかを確認します。プレーンテキストと暗号文にブレークポイントを設定します。
F5はプログラムを開始し、アカウントパスワードTest123456を入力し、ログイン
プログラムはブレークポイントで停止し、プレーンテキストには、Test123456とMD5が入力したアカウントによって暗号化されたパスワードが含まれていました。
暗号化されたコンテンツをリリースして取得すると、ここの暗号化関数が呼び出されていることを確認できます。
後に、応答パッケージの復号化がMMクラスのTest06関数を呼び出し、リクエストパッケージの暗号化関数Test05と応答パッケージ復号化関数Test06がDLLの対応する関数を呼び出すことが後に確認されました。
ここでの暗号化と復号化は、2つのセットのメソッドを呼び出します。これを使用して、リクエストパケットの暗号化されたデータを復号化することはできません。テストを容易にし、迅速に暗号化および復号化するために、暗号化と復号化関数が差し引かれ、DLLの関数が独立したプログラムにコンパイルするために呼び出されるため、アルゴリズムを分析する必要はありません。
ここでは、SharpDeveloped Compiledを使用しています。VisualStudioを使用すると、常にエラーが報告されます.
public static string decryptresponse(string cipher){
byte [] bytes=encoding.utf8.getBytes(cipher);
byte [] array=new byte [bytes.length + 128];
int count=program.test06(ref bytes [0]、ref array [0]);
string text=encoding.utf8.getString(array、0、count);
テキストを返します。
}
public static string encryptrequest(string plain){
byte [] bytes=encoding.utf8.getBytes(plain);
int num=bytes.length * 2 + 128;
if(num32){
num=64;
}
byte [] array=new byte [num];
int num2=0;
num2=test05(ref bytes [0]、ref array [0]);
文字列result=encoding.utf8.getString(array、0、num2);
返品結果;
}
暗号化
復号化
次に、PythonのFlask Frameworkを使用して、プロキシ転送プログラムをローカルに作成して、Burpsuiteでのリプレイテストを促進します。
プロセスは次のとおりです。
Plantextデータパケットをローカルにプロキシエージェントに送信します。リクエストパケットを受信します。発信者はリクエストパケットを暗号化します。暗号化されたデータパケットは、サーバー発信者に転送されます。サーバーによって返されたコンテンツは復号化され、プレーンテキストデータに戻り、Flask Import Request、Flaskからローカルに戻ります
urllib.parseインポート見積もりから
リクエストをインポートします
OSをインポートします
ヘッダー={
'user-agent':' mozilla '、
'content-type':'アプリケーション/x-www-form-urlencoded '、
'Accept-Encoding':' gzip、deflate '、
}
app=flask( 'example')
@app.route( '/example'、method=['post'])
def proxy():
form=request.form
request_plain=''
フォーム:のキーの場合
request_plain +='{}={}'。フォーマット(key、form [key])
Response_Plain=test(request_plain)
RESONSE_PLAINを返します
def encrypt(filename):
encrypt_cmd='crypto.exe -encrypt {}'。フォーマット(filename)#暗号化されるコンテンツはファイルから読み取ります
result=os.popen(encrypt_cmd)#exe exeを実行します
request_cipher=quote(result.read())#encryptedコンテンツURLエンコード後、 +サインを%2Bサーバーに変換して認識します
request_cipherを返します
def decrypt(filename):
decrypt_cmd='crypto.exe -decrypt {}'。フォーマット(filename)#decryptedのコンテンツはファイルから読み取ります
result=os.popen(decrypt_cmd)#exe exeを実行します
response_plain=result.read()#復号化されたコンテンツを読み取ります
RESONSE_PLAINを返します
def test(request_plain):
url='http://example.com/api/'
plain_txt='plain.txt'
f1:としてopen(plain_txt、 'w')
f1.writeLines(request_plain)#plaintextをplain.txtに保存します
request_cipher=encrypt(plain_txt)#encrypt plantext
response=requests.post(url=url、data=request_cipher、headers=headers)#send request
cipher_txt='cipher.txt'
f2:として開いている(cipher_txt、 'w')
f2.writeLines(response.text)#storage ciphertext in cipher.txt
Response_plain=decrypt(cipher_txt)#decrypt ciphertext
RESONSE_PLAINを返します
__name__=='__main __' :の場合
app.run(host='0.0.0.0'、port=9999、debug=true)
ここでリクエストされるインターフェイスは毎回同じであり、唯一の変更はリクエスト本体のパラメーターです。 CodeServiceにはすべてのインターフェイスのすべてのプレーンテキストがあり、すべてが抽出されます。
Burpsuite〜で通常テストできます
最後に、SQL注入はインターフェイスで正常に発見されました。
0x04要約
1。指定されたプロセスのパッケージをWSEXPlorerを介してつかみ、HTTPプロトコルのデータパケットが暗号化されていることを発見します。アンチオブスケートを試すために、多くの難解な暗号化ツールDE4DOT-X64.EXE ORIGIN.EXE5によって難読化されたソースコードをサポートします。 DNSPYを使用してプログラムを再コンパイルし、プログラムの暗号化、ブレークポイントの関数メソッドを表示し、F5を押して実行します。プログラムはブレークポイントで停止し、プレーンテキストには、私が入力したアカウントTest123456とMD5によって暗号化されたパスワードが含まれています。 6.プログラムの暗号化と復号化関数セグメントを見つけ、メインコードを切り取り、Python 7に記述します。次に、PythonのFlask Frameworkを使用して、プロキシ転送プログラムをローカルに書き込み、Burpsuiteでのリプレイテストを促進します。プロセスは次のとおりです。Plantextデータパケットをプロキシエージェントにローカルに送信します。リクエストパケットが受信されます。発信者はリクエストパケットを暗号化します。暗号化されたデータパケットは、サーバー発信者に転送されます。サーバーによって返されるコンテンツは復号化され、プレーンテキストデータにローカルに返されます。
元の接続:https://Blog.csdn.net/qq_32727277/article/details/102783316