
Óxido ofensivo, estoy experimentando con el armamento de Rust para el desarrollo de implantes y operaciones ofensivas generales.
¿Por qué se oxida?
- Es más rápido que lenguajes como C/C++
- Es un lenguaje polivalente con una gran comunidad.
- Tiene una increíble gestión de compilación de dependencias integrada llamada Cargo
- Se basa en LLVM, lo que lo convierte en un muy buen candidato para eludir la detección de AV estático.
- Compilación cruzada súper fácil de *nix/MacOS a Windows, simplemente instálelo
mingw
cadena de herramientas, aunque algunas bibliotecas no se compilan correctamente en otros sistemas operativos.
documento | describir |
---|---|
Asignar_con_llamadas al sistema | Utiliza funciones NTDLL directamente con la biblioteca ntapi |
crear_DLL | Cree la DLL y abra un msgbox, Rust no es totalmente compatible con esto, por lo que las cosas pueden ponerse raras ya que las DLL de Rust no tienen una función principal |
Dispositivo IoControl | Abra el identificador del controlador y ejecute DeviceIoControl |
Habilitar privilegios de depuración | Habilite SeDebugPrivilege en el proceso actual |
Shellcode_Local_injectTonelada | Ejecute shellcode directamente en el proceso local convirtiendo el puntero |
Ejecutar_con_CMD | Ejecute cmd pasando comandos a través de Rust |
llamada de función de importación | Importa minidump desde dbghelp y lo ejecuta |
Kernel_Driver_Exploit | El controlador del kernel aprovecha el desbordamiento de búfer simple |
Cliente_de_tubería_nombrado | Cliente de canalizaciones con nombre |
Named_Pipe_Server | servidor de canalización con nombre |
Process_Injection_CreateThread | Inyección de procesos en un proceso remoto usando CreateRemoteThread |
desacoplamiento | descolgar la llamada |
asm_syscall | Obtenga la dirección PEB a través de asm |
base64_system_enum | Cadena de codificación/decodificación Base64 |
http-https-solicitud | Solicitudes HTTP/S a través de comprobaciones de certificados ignorando GET/POST |
patch_etw | Parche ETW |
ppid_spoof | Falsificación del padre de un proceso ya creado |
tcp_ssl_cliente | Cliente TCP con SSL que ignora las comprobaciones de certificados (requiere que se instalen openssl y perl para la compilación) |
servidor_tcp_ssl | Servidor TCP con parámetro de puerto (necesita instalar openssl y perl para compilar) |
wmi_ejecutar | Realice una consulta WMI para obtener AV/EDR en el host |
Enlaces de Windows.h+ | Este archivo contiene la estructura de Windows.h y LDR, PEB, etc. personalizados completos. No documentado oficialmente por Microsoft, agregue include!(«../bindings.rs»); en la parte superior del archivo |
UUID_Shellcode_Ejecución | Rellene el espacio de almacenamiento dinámico con el shellcode en la matriz UUID y use EnumSystemLocalesA Devolución de llamada para ejecutar shellcode. |
Compile los ejemplos en este repositorio
Este repositorio no proporciona binarios, debe compilarlos usted mismo.
Instalar óxido
Simplemente descargue los binarios e instálelos.
Este repositorio está compilado en Windows 10, así que me quedaré con él. Como se mencionó anteriormente, los archivos binarios de OpenSSL tienen problemas de dependencia que requieren la instalación de OpenSSL y perl. Para el cliente/servidor TCP SSL, recomiendo usar una compilación estática debido a la dependencia del host en el que ejecutará el binario. Para crear un proyecto, ejecute:cargo new
Esto creará automáticamente carpetas de proyectos estructurados:
proyecto
├── Cargo.toml
└── fuente
└── principal.rs
Cargo.toml es el archivo que contiene las dependencias y la configuración de compilación. main.rs es el archivo principal que se compilará con cualquier directorio potencial que contenga la biblioteca.
Para compilar el proyecto, vaya al directorio del proyecto y ejecute:cargo build
Esto utilizará su cadena de herramientas predeterminada. Si desea compilar la versión final de «lanzamiento», ejecute:cargo build --release
Para binarios estáticos, antes de ejecutar el comando de compilación en la terminal:"C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryBuildvcvars64.bat"
set RUSTFLAGS=-C target-feature=+crt-static
En caso de que no creas que es fácil leer mi código de la forma en que lo escribo,
También puede formatearlo de una mejor manera usando el siguiente comando en el directorio de su proyectocargo fmt
Es posible que algunos ejemplos no se compilen y le den algunos errores, ya que puede requerir todas las noches.
Cree Rust con las funciones más recientes. Para instalarlo, solo haz lo siguiente:rustup default nightly
El lugar más fácil para encontrar dependencias o cajas.
La compilación cruzada debe seguir las instrucciones aquí instalando una cadena de herramientas diferente, puede usar el siguiente comando para compilar de forma cruzadacargo build --target
Para ver las cadenas de herramientas instaladas en su sistema:rustup toolchain list
Para verificar todas las cadenas de herramientas disponibles que puede instalar en su sistema:rustup target list
Para instalar una nueva cadena de herramientas:rustup target add
Optimizar el tamaño del ejecutable
Este repositorio contiene muchas opciones de configuración e ideas para reducir el tamaño del archivo. Los binarios estáticos suelen ser grandes.
La trampa en la que me encontré
Tenga cuidado con bytes, no los olvide como cadenas en la memoria, me llevó mucho tiempo, pero windbg siempre me ayuda.
Interesante biblioteca de Rust
- WINAPI
- WINAPI2
- Windows: esto es oficial de Microsoft, no juego mucho
- Si bien Rust tiene grandes ventajas, es difícil acostumbrarse y no es muy intuitivo.
- La generación de Shellcode es otro problema debido a LLVM. Encontré algunas formas de resolver este problema.
Donut a veces genera shellcode válido, pero dependiendo de cómo se hizo el proyecto, es posible que no lo sea.
En general, para la generación de shellcode, las herramientas están diseñadas para alojar todo el código en la sección .text, lo que lleva a este increíble repositorio. Hay un ejemplo de shellcode en el proyecto que le muestra cómo compilar el código para generar shellcode con éxito.
Además, este proyecto tiene un generador de shellcode que toma la sección .text del binario y descarga el shellcode después de realizar algunos parches.
El proyecto obtiene los archivos binarios de una ubicación específica, así que creé una rama donde recibo la ruta a los archivos binarios como parámetro. - Incluso si elimina todos los símbolos de depuración, el óxido aún puede mantener una referencia a su directorio de inicio en el binario. La única forma que he encontrado para eliminarlo es pasar las siguientes banderas:
--remap-path-prefix {your home directory}={some random identifier}
Puede usar una variable bash para obtener su directorio de inicio y generar un marcador de posición aleatorio:--remap-path-prefix "$HOME"="$RANDOM"
(por Shankardi) - Aunque para lo anterior, hay otra forma de eliminar la información sobre el directorio de inicio agregando en la parte superior de Cargo.toml
cargo-features = ["strip"]
. - Dado que Rust deja muchas cosas como cadenas en el binario de forma predeterminada, principalmente uso este cargo.toml para evitarlas y reducir el tamaño.
Usar el comando de compilacióncargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc