¿Cómo funciona el proceso de migración en Meterpreter [cerrado]

13

¿Alguien intentó averiguar cómo funciona la migración de procesos en Meterpreter en Windows? Quiero hacer mi propio script para aprender eso, pero no consigo encontrar un punto de partida para eso. Bueno, tengo una idea de usar la biblioteca NtQuerySystemInformation y su función SystemHandleInformation , ya que puede devolver el manejo de un subproceso en el sistema operativo y usar esos puedo cambiar su padre, pero dudo que vaya a funcionar (debido a TEB). Y tengo la sensación de que debería haber una manera más fácil que NtQuerySystemInformation . ¿Alguien podría sugerir una DLL o un algoritmo para usar?

    
pregunta Artur Korobeynyk 01.06.2015 - 10:45
fuente

2 respuestas

14

Así es como funciona la migración en meterpreter:

  1. Obtenga el PID al que el usuario desea migrar. Este es el objetivo proceso.
  2. Compruebe la arquitectura del proceso de destino si es de 32 bits o 64 bits. Es importante para la alineación de la memoria.
  3. Verifique si el proceso de meterpreter tiene el SeDebugPrivilege. Esto es Se utiliza para obtener un identificador para el proceso de destino. Más detalles en      enlace
  4. obtener la carga útil real de     el controlador que se va a inyectar en el proceso de destino.     Calcula su longitud también.
  5. Llame a la API OpenProcess () para obtener     acceso a la memoria virtual del proceso objetivo.
  6. llama al     API VirtualAllocEx () para asignar un RWX (lectura, escritura, ejecución)     memoria en el proceso objetivo
  7. Llame a la API WriteProcessMemory () para     escriba la carga útil en el espacio de memoria virtual de destino.
  8. llamar     la API CreateRemoteThread () para ejecutar la memoria recién creada     talón que tiene la carga útil inyectada en un nuevo hilo.
  9. apagar el     hilo anterior que tiene el meterpreter inicial corriendo en el antiguo     proceso.
respondido por el void_in 01.07.2015 - 20:46
fuente
1

En algún lugar en lugares más profundos de github, he encontrado este código que hace todo el cosas necesarias, para que aquellos que buscan esta información puedan encontrar una respuesta en las siguientes funciones de la 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
                                    )
    
respondido por el Artur Korobeynyk 01.06.2015 - 16:25
fuente

Lea otras preguntas en las etiquetas