
Contorne códigos de status de resposta HTTP 4xx e muito mais. A ferramenta é baseada em Python Requests, PycURL e HTTP Client.
# Forbidden
Ignore códigos de status de resposta HTTP 4xx e mais.
A ferramenta é baseada em `Python Requests`, `PycURL` e `HTTP Client`.
Testado no Kali Linux v2024.2 (64-bit).
Feito para fins educacionais. Espero que ajude!
**Future plans:**
* Adicionar a opção `silent` para suprimir a saída do console.
* Adicionar a opção `no color` para desabilitar a saída colorida do console.
* Adicionar testes para cabeçalhos de requisição HTTP `hop-by-hop`.
* Adicionar testes para o cabeçalho de requisição HTTP `User-Agent`.
* Adicionar testes para cookies HTTP.
* Adicionar testes para contrabando HTTP.
* Adicionar testes para CRLF.
* Adicionar testes para Log4j.
* Adicionar testes para SSRF de metadados AWS.
## Table of Contents
* [How to Install](#how-to-install)
* [Install PycURL](#install-pycurl)
* [Standard Install](#standard-install)
* [Build and Install From the Source](#build-and-install-from-the-source)
* [How to Use](#how-to-use)
* [Tests](#tests)
* [HTTP Methods](#http-methods)
* [HTTP Request Headers](#http-request-headers)
* [Results](#results)
* [Usage](#usage)
* [Images](#images)
## How to Install
### Install PycURL
No Kali Linux, isso deve funcionar sem problemas; caso contrário, execute:
```bash
apt-get -y install libcurl4-gnutls-dev librtmp-dev
pip3 install --upgrade pycurl
```
---
PycURL no sistema operacional Windows não é suportado.
---
No macOS, execute:
```bash
brew uninstall curl
brew uninstall openssl
brew install curl
brew install openssl
echo 'export PATH="/opt/homebrew/opt/curl/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
export LDFLAGS="-L/opt/homebrew/opt/curl/lib"
export CPPFLAGS="-I/opt/homebrew/opt/curl/include"
export PYCURL_SSL_LIBRARY=openssl
pip3 install --no-cache-dir --compile --ignore-installed --config-setting="--with-openssl=" --config-setting="--openssl-dir=/opt/homebrew/opt/openssl@3" pycurl
```
Alternativamente, instale usando [Homebrew](https://formulae.brew.sh/formula/forbidden) (não mantido por mim):
```fundamental
brew install forbidden
```
### Standard Install
```bash
pip3 install --upgrade forbidden
```
### Build and Install From the Source
```bash
git clone https://github.com/ivan-sincek/forbidden && cd forbidden
python3 -m pip install --upgrade build
python3 -m build
python3 -m pip install dist/forbidden-13.4-py3-none-any.whl
```
## How to Use
Ignorar o código de status de resposta HTTP `403 Forbidden`:
```fundamental
forbidden -u https://example.com/admin -t protocols,methods,uploads,overrides,headers,paths-ram,encodings -f GET -l initial,path -o forbidden_403_results.json
```
Ignorar o código de status de resposta HTTP `403 Forbidden` com teste de estresse:
```fundamental
mkdir stresser_403_results
stresser -u https://example.com/admin -r 1000 -th 200 -f GET -l initial -dir stresser_403_results -o stresser_403_results.json
```
Ignorar o código de status de resposta HTTP `401 Unauthorized`:
```fundamental
forbidden -u https://example.com/admin -t auths -f GET -l initial -o forbidden_401_results.json
```
Testar redirecionamentos abertos e analisadores de URL quebrados, ou seja, testar interações fora da banda (OOB):
```fundamental
forbidden -u https://example.com/admin -t redirects,parsers -f GET -l initial -e xyz.interact.sh -o forbidden_oob_results.json
```
## Tests
**`protocols`**
* Testar os protocolos HTTP e HTTPS usando um endereço IP e nome de domínio.
* Testar um downgrade de protocolo HTTP/1.0 sem o cabeçalho de requisição HTTP `Host`, usando um endereço IP e nome de domínio.
**`methods`**
* Testar os métodos HTTP permitidos, também usando o cabeçalho de requisição HTTP `Content-Length: 0`.
* Testar Cross-Site Tracing (XST) usando os métodos HTTP TRACE e TRACK.
**`uploads`**
* Testar o upload de um arquivo de texto recursivamente para cada diretório no caminho da URL usando o método HTTP PUT.
**`overrides`**
* Testar substituições de método HTTP usando parâmetros de string de consulta de URL, cabeçalhos de requisição HTTP e corpos de requisição HTTP.
* Testar substituições de esquema de URL usando cabeçalhos de requisição HTTP, de HTTPS para HTTP e de HTTP para HTTPS.
* Testar substituições de porta usando cabeçalhos de requisição HTTP.
* Testar substituições de host HTTP usando cabeçalhos de requisição HTTP, também usando dois cabeçalhos de requisição HTTP `Host`.
* Testar substituições de caminho de URL usando cabeçalhos de requisição HTTP com caminhos de URL relativos, usando as seguintes URLs: uma URL acessível, URL raiz e URL completa.
**`headers`**
* Testar cabeçalhos de requisição HTTP com endereços IP, endereços IP separados por vírgula, nomes de domínio, URLs raiz, URLs completas e mais.
**`values`**
* Testar cabeçalhos de requisição HTTP com endereços IP, nomes de domínio, URLs raiz e URLs completas fornecidos pelo usuário.
**`paths`**
* Testar bypasses de caminho de URL.
**`encodings`**
* Testar transformações e codificações de host e caminho de URL.
**`auths`**
* Testar autenticação/autorização básica usando cabeçalhos de requisição HTTP com valores nulos e credenciais pré-definidas codificadas em Base64.
* Testar autenticação/autorização bearer usando cabeçalhos de requisição HTTP com valores nulos, JWTs malformados e JWTs pré-definidos.
**`redirects`**
* Testar redirecionamentos abertos usando cabeçalhos de requisição HTTP com endereços IP de redirecionamento, nomes de domínio, URLs raiz e URLs completas.
**`parsers`**
* Testar analisadores de URL quebrados usando cabeçalhos de requisição HTTP com endereços IP quebrados, nomes de domínio, URLs raiz e URLs completas.
---
Se você estiver interessado em mais detalhes, veja:
* [/src/forbidden/utils/forbidden.py](https://github.com/ivan-sincek/forbidden/blob/main/src/forbidden/utils/forbidden.py#L601)
* [/src/forbidden/utils/test.py](https://github.com/ivan-sincek/forbidden/blob/main/src/forbidden/utils/test.py)
* [/src/forbidden/utils/value.py](https://github.com/ivan-sincek/forbidden/blob/main/src/forbidden/utils/value.py)
---
**Observações:**
* Todos os testes são baseados em relatos públicos de infosec e bug bounty.
* Alguns dos testes se sobrepõem; no entanto, um `filtro único` é aplicado antes de qualquer envio.
* Todos os cabeçalhos de requisição HTTP, parâmetros de string de consulta de URL, etc., foram validados com base na documentação oficial.
* Por padrão, tanto `Forbidden` quanto `Stresser` usam o motor `Python Requests`.
* O teste de downgrade de protocolo HTTP/1.0 sem o cabeçalho de requisição HTTP `Host` está bloqueado para o motor `HTTP Client`. Além disso, o comando cURL fornecido não funcionará corretamente porque o cURL não permite remover o cabeçalho de requisição HTTP `Host`.
* O teste de substituição de host HTTP usando dois cabeçalhos de requisição HTTP `Host` está bloqueado para o motor `Python Requests`. Além disso, o comando cURL fornecido não funcionará corretamente porque o cURL não permite usar dois cabeçalhos de requisição HTTP `Host`.
* O teste de transformações e codificações de host e caminho de URL está bloqueado para o motor `PycURL`.
* Alguns proxies da web podem `normalizar` URLs (por exemplo, ao testar `encodings`), modificar requisições HTTP ou descartar requisições HTTP completamente.
* Alguns sites podem exigir um cabeçalho de requisição HTTP `User-Agent` válido ou muito específico.
* Cross-Site Tracing (XST) não é mais considerado uma vulnerabilidade.
* Cuidado com `limitação de taxa` e outras proteções antibot semelhantes; espere um tempo antes de executar a ferramenta novamente no mesmo domínio.
### HTTP Methods
_Esta é apenas uma visão geral rápida do que é usado, mas não de como é usado._
```fundamental
ACL
ARBITRARY
BASELINE-CONTROL
BIND
CHECKIN
CHECKOUT
CONNECT
COPY
DELETE
GET
HEAD
INDEX
LABEL
LINK
LOCK
MERGE
MKACTIVITY
MKCALENDAR
MKCOL
MKREDIRECTREF
MKWORKSPACE
MOVE
OPTIONS
ORDERPATCH
PATCH
POST
PRI
PROPFIND
PROPPATCH
PUT
REBIND
REPORT
SEARCH
SHOWMETHOD
SPACEJUMP
TEXTSEARCH
TRACE
TRACK
UNBIND
UNCHECKOUT
UNLINK
UNLOCK
UPDATE
UPDATEREDIRECTREF
VERSION-CONTROL
```
### HTTP Request Headers
_Esta é apenas uma visão geral rápida do que é usado, mas não de como é usado._
```fundamental
19-Profile
Accept
Base-URL
CF-Connecting-IP
Client-IP
Cluster-Client-IP
Destination
Forwarded-For
Forwarded-For-IP
From
Front-End-HTTPS
Host
Incap-Client-IP
Origin
Profile
Proxy
Proxy-Client-IP
Redirect
Referer
Remote-Addr
Request-URI
True-Client-IP
URI
URL
WAP-Profile
WL-Proxy-Client-IP
X-Client-IP
X-Cluster-Client-IP
X-Forward
X-Forward-For
X-Forwarded
X-Forwarded-By
X-Forwarded-For
X-Forwarded-For-IP
X-Forwarded-For-Original
X-Forwarded-Host
X-Forwarded-Path
X-Forwarded-Port
X-Forwarded-Proto
X-Forwarded-Protocol
X-Forwarded-SSL
X-Forwarded-Scheme
X-Forwarded-Server
X-HTTP-DestinationURL
X-HTTP-Host-Override
X-HTTP-Method
X-HTTP-Method-Override
X-Host
X-Host-Override
X-Method
X-Method-Override
X-Original-Forwarded-For
X-Original-Remote-Addr
X-Original-URL
X-Originally-Forwarded-For
X-Originating-IP
X-Override-URL
X-Proxy-Host
X-Proxy-URL
X-ProxyUser-IP
X-Real-IP
X-Referer
X-Remote-Addr
X-Remote-IP
X-Rewrite-URL
X-Scheme
X-Server-IP
X-True-Client-IP
X-True-IP
X-URL-Scheme
X-Wap-Profile
```
## Results
**Observações:**
* Os resultados serão ordenados por código de status de resposta HTTP `crescente`, comprimento do corpo da resposta HTTP `decrescente` e ID do teste `crescente`.
* Por padrão, apenas códigos de status de resposta HTTP `2xx` e `3xx` são incluídos nos resultados e exibidos na saída do console.
* O atributo `length` nos resultados refere-se ao comprimento do corpo da resposta HTTP.
* Para filtrar manualmente resultados `falso positivo`, para cada comprimento de conteúdo de resposta HTTP único, execute o comando cURL fornecido e verifique se a resposta HTTP resulta em bypass; caso contrário, simplesmente ignore todos os resultados com o mesmo comprimento de conteúdo.
```json
[
{
"id":"595-HOST-OVERRIDES-1",
"url":"https://example.com:443/admin",
"method":"GET",
"headers":[
"Host: 127.0.0.1"
],
"cookies":[],
"body":"",
"user_agent":"Forbidden/13.4",
"command":"curl --path-as-is -iskL -A 'Forbidden/13.4' -H 'Host: 127.0.0.1' -X 'GET' 'https://example.com:443/admin'",
"status":200,
"length":14301
},
{
"id":"596-HOST-OVERRIDES-1",
"url":"https://example.com:443/admin",
"method":"GET",
"headers":[
"Host: 127.0.0.1:443"
],
"cookies":[],
"body":"",
"user_agent":"Forbidden/13.4",
"command":"curl --path-as-is -iskL -A 'Forbidden/13.4' -H 'Host: 127.0.0.1:443' -X 'GET' 'https://example.com:443/admin'",
"status":200,
"length":14301
}
]
```
## Usage
```fundamental
Forbidden v13.4 ( github.com/ivan-sincek/forbidden )
Uso: forbidden -u url -t tests [-f force] [-o out ]
Exemplo: forbidden -u https://example.com/admin -t all [-f GET ] [-o results.json]
DESCRIÇÃO
Ignorar códigos de status de resposta HTTP 4xx e mais
URL
URL inacessível
-u, --url = https://example.com/admin | etc.
IGNORAR PARÂMETROS
Ignorar string de consulta de URL e fragmento
-ip, --ignore-parameters
IGNORAR REQUISIÇÕES
Quando aplicável, usar PycURL em vez do motor padrão Python Requests
-ir, --ignore-requests
TESTES
Testes a executar
Especifique '[ip-|host-|url-]values' para testar cabeçalhos de requisição HTTP usando apenas valores fornecidos pelo usuário passados com a opção '-v'
Especifique 'paths-ram' para usar o ataque de aríete ou 'paths' para usar o ataque de bombardeio em cluster padrão
Use valores separados por vírgula
-t, --tests = protocols | methods | uploads | [method-|scheme-|port-|host-|path-]overrides | headers | [ip-|host-|url-]values | paths[-ram] | encodings | [basic-|bearer-]auths | redirects | parsers | all
VALORES
Arquivo contendo valores de cabeçalho de requisição HTTP ou um único valor, ex.: IP interno, etc.
Testes: all-values
-v, --values = values.txt | 10.10.15.20 | example.local | https://example.local | etc.
FORÇAR
Forçar um método HTTP para todos os testes não específicos
-f, --force = GET | POST | CUSTOM | etc.
CAMINHO
Caminho de URL acessível para testar substituições de caminho de URL
Testes: path-overrides
Padrão: /robots.txt, /index.html, /sitemap.xml, /README.txt
-p, --path = /home | etc.
MALICIOSA
URL maliciosa ou serviço de colaborador
Testes: host-overrides, headers, bearer-auths, redirects, parsers
Padrão: https://github.com
-e, --evil = https://xyz.interact.sh | https://xyz.burpcollaborator.net | etc.
CABEÇALHO
Qualquer número de cabeçalhos de requisição HTTP extras
Cabeçalhos de requisição HTTP extras não substituirão cabeçalhos de requisição HTTP específicos do teste
Ponto e vírgula, ex.: 'Content-Type;' se expandirá para um cabeçalho de requisição HTTP vazio
-H, --header = "Authorization: Bearer ey..." | Content-Type; | etc.
COOKIE
Qualquer número de cookies HTTP extras
Cookies HTTP extras não substituirão cookies HTTP específicos do teste
-b, --cookie = PHPSESSIONID=3301 | etc.
IGNORAR
RegEx para filtrar resultados falsos positivos de 200 OK
-i, --ignore = Inaccessible | "Access Denied" | "Error: .+" | etc.
COMPRIMENTOS DE CONTEÚDO
Comprimentos de conteúdo de resposta HTTP para filtrar resultados falsos positivos de 200 OK
Especifique 'initial' para ignorar o comprimento de conteúdo da resposta HTTP inicial
Especifique 'path' para ignorar o comprimento de conteúdo da resposta da URL acessível
Use valores separados por vírgula
-l, --content-lengths = 12 | initial | path | etc.
TEMPO LIMITE DE REQUISIÇÃO
Tempo limite de requisição em segundos
Padrão: 60
-rt, --request-timeout = 30 | 90 | etc.
THREADS
Número de threads paralelas para executar
Padrão: 5
-th, --threads = 20 | etc.
ESPERA
Tempo de espera em milissegundos antes de enviar uma requisição HTTP
Destinado ao uso de thread única
-s, --sleep = 500 | etc.
USER AGENT
User agent a usar
Padrão: Forbidden/13.4
-a, --user-agent = random[-all] | curl/3.30.1 | etc.
PROXY
Proxy da web a usar
-x, --proxy = http://127.0.0.1:8080 | etc.
CÓDIGOS DE STATUS DE RESPOSTA HTTP
Incluir apenas códigos de status de resposta HTTP específicos nos resultados
Padrão: 2xx, 3xx
Use valores separados por vírgula
-sc, --status-codes = 1xx | 2xx | 3xx | 4xx | 5xx | all
MOSTRAR TABELA
Exibir os resultados em formato de tabela em vez de formato JSON
Destinado ao uso em tela larga
-st, --show-table
SAÍDA
Arquivo de saída
-o, --out = results.json | etc.
DESPEJAR
Despejar todos os registros de teste no arquivo de saída sem executar nenhum
-dmp, --dump
DEPURAÇÃO
Habilitar saída de depuração
-dbg, --debug
```
```fundamental
Stresser v13.4 ( github.com/ivan-sincek/forbidden )
Uso: stresser -u url -r repeat -th threads -dir directory [-f force] [-o out ]
Exemplo: stresser -u https://example.com/admin -r 1000 -th 200 -dir results [-f GET ] [-o results.json]
DESCRIÇÃO
Ignorar códigos de status de resposta HTTP 4xx com teste de estresse
URL
URL inacessível
-u, --url = https://example.com/admin | etc.
IGNORAR PARÂMETROS
Ignorar string de consulta de URL e fragmento
-ip, --ignore-parameters
IGNORAR REQUISIÇÕES
Quando aplicável, usar PycURL em vez do motor padrão Python Requests
-ir, --ignore-requests
FORÇAR
Forçar um método HTTP para todos os testes não específicos
-f, --force = GET | POST | CUSTOM | etc.
CABEÇALHO
Qualquer número de cabeçalhos de requisição HTTP extras
Cabeçalhos de requisição HTTP extras não substituirão cabeçalhos de requisição HTTP específicos do teste
Ponto e vírgula, ex.: 'Content-Type;' se expandirá para um cabeçalho de requisição HTTP vazio
-H, --header = "Authorization: Bearer ey..." | Content-Type; | etc.
COOKIE
Qualquer número de cookies HTTP extras
Cookies HTTP extras não substituirão cookies HTTP específicos do teste
-b, --cookie = PHPSESSIONID=3301 | etc.
IGNORAR
RegEx para filtrar resultados falsos positivos de 200 OK
-i, --ignore = Inaccessible | "Access Denied" | "Error: .+" | etc.
COMPRIMENTOS DE CONTEÚDO
Comprimentos de conteúdo de resposta HTTP para filtrar resultados falsos positivos de 200 OK
Especifique 'initial' para ignorar o comprimento de conteúdo da resposta HTTP inicial
Use valores separados por vírgula
-l, --content-lengths = 12 | initial | etc.
TEMPO LIMITE DE REQUISIÇÃO
Tempo limite de requisição em segundos
Padrão: 60
-rt, --request-timeout = 30 | 90 | etc.
REPETIR
Número de requisições HTTP por teste
-r, --repeat = 1000 | etc.
THREADS
Número de threads paralelas para executar
-th, --threads = 20 | etc.
USER AGENT
User agent a usar
Padrão: Stresser/13.4
-a, --user-agent = random[-all] | curl/3.30.1 | etc.
PROXY
Proxy da web a usar
-x, --proxy = http://127.0.0.1:8080 | etc.
CÓDIGOS DE STATUS DE RESPOSTA HTTP
Incluir apenas códigos de status de resposta HTTP específicos nos resultados
Padrão: 2xx, 3xx
Use valores separados por vírgula
-sc, --status-codes = 1xx | 2xx | 3xx | 4xx | 5xx | all
MOSTRAR TABELA
Exibir os resultados em formato de tabela em vez de formato JSON
Destinado ao uso em tela larga
-st, --show-table
SAÍDA
Arquivo de saída
-o, --out = results.json | etc.
DIRETÓRIO
Diretório de saída
Todas as respostas HTTP válidas e únicas serão salvas neste diretório
-dir, --directory = results | etc.
DESPEJAR
Despejar todos os registros de teste no arquivo de saída sem executar nenhum
-dmp, --dump
DEPURAÇÃO
Habilitar saída de depuração
-dbg, --debug
```
## Images
<p align="center"><img src="https://assets.kitploit.com/production/public/readmes/4920/79066f51066e4f83e1a6a180069eb9bd213a16775d3906d7256a0262c040ddc4.png" alt="Exemplo Real"></p>
<p align="center">Figura 1 - Exemplo Real</p>
<p align="center"><img src="https://assets.kitploit.com/production/public/readmes/4920/c0ab26b4413f9b7014f21da8a4b458ba7385baf3198a80db1a9e4303ec123d30.png" alt="Exemplo Simples"></p>
<p align="center">Figura 2 - Exemplo Simples</p>
<p align="center"><img src="https://assets.kitploit.com/production/public/readmes/4920/c015d3d41d2f6f56a71e2af5a38bd539942a5f24cbbe712381bb2221cc2593ae.png" alt="Exemplo Simples (Saída em Tabela)"></p>
<p align="center">Figura 3 - Exemplo Simples (Saída em Tabela)</p>