Tutoriales

Armamento oxidado de la participación del equipo rojo

Ó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.

Ejemplos en este repositorio

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

LEER  Identifica los bytes en los que se marca Microsoft Defender

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 proyecto
cargo 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.

compilación cruzada

La compilación cruzada debe seguir las instrucciones aquí instalando una cadena de herramientas diferente, puede usar el siguiente comando para compilar de forma cruzada
cargo 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

Seguridad operativa

  • 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ón
    cargo build --release -Z build-std=std,panic_abort -Z build-std-features=panic_immediate_abort --target x86_64-pc-windows-msvc

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba