# Active Information Gathering

## HTTP Headers

Mediante los headers de las respuestas HTTP podemos obtener información de la infraestructura del sistema.

Mediante el siguiente comando, podemos obtener los headers:

```bash
export TARGET="target.com"
curl -I "http://${TARGET}"
```

Con esta consulta podríamos obtener los siguientes headers:

* `X-Powered-By` es un header HTTP opcional y no oficial, que se utiliza para indicar la pila de tecnología utilizada en el lado del servidor
* `Server` contiene la información acerca del software usado por el servidor original encargado de la solicitud

Junto con esto, nos pueden enviar el header `Set-Cookie`, el cual, se usa para enviar cookies desde el servidor al agente de usuario, así el agente de usuario puede enviarlos de vuelta al servidor.

En este caso, los nombres de las cookies nos pueden indicar la tecnología usada:

* `ASPSESSIONID<random>=<cookie_value>` especifica .NET
* `PHPSESSID=<cookie_value>` usado por PHP
* `JSESSION=<cookie_value>` implementado por Java

## WhatWeb

Podemos automatizar esta tarea con la herramienta [WhatWeb](https://github.com/urbanadventurer/WhatWeb):

```bash
export TARGET="target.com"
whatweb -a3 "http://${TARGET}" -v
```

* `-a3` nivel de aggression, donde, 1 es por defecto (Stealthy), 3 es para realizar requests adicionales (Aggressive), y 4 es para realizar muchos más requests (Heavy)
* `-v` verbose

## Wappalyzer

[Wappalyzer](https://www.wappalyzer.com/) es un plugin de navegador que permite obtener información del sitio web (similar a WhatWeb):

<figure><img src="/files/bitonN3ot3Zo7fewLs6l" alt=""><figcaption><p>Wappalyzer</p></figcaption></figure>

## WafW00f

[WafW00f](https://github.com/EnableSecurity/wafw00f) permite detectar la utilización de WAF. Para poder instalar esta herramienta en Kali, podemos usar el siguiente comando:

```bash
sudo apt install wafw00f -y
```

Para ejecutarlo, podemos usar los siguientes comandos:

```bash
export TARGET="target.com"
wafw00f -v "http://${TARGET}"
wafw00f -v "http://${TARGET}" -p http://proxy:8080
wafw00f -i domains.txt
```

* `-v` verbose
* `-p` indicamos un proxy para redireccionar el tráfico
* `-i` archivo con dominios a validar

## Aquatone

[Aquaton](https://github.com/michenriksen/aquatone) es una herramienta que permite tomar screenshots de sitios web para poder realizar una inspección visual.

Para instalar aquatone, usamos los siguientes comandos:

> La versión del binario puede cambiar.

```bash
sudo apt install golang chromium-driver
wget https://github.com/michenriksen/aquatone/releases/download/v1.7.0/aquatone_linux_amd64_1.7.0.zip
unzip aquatone_linux_amd64_1.7.0.zip
mv aquatone /usr/bin/
```

Para usar aquatone, podemos ejecutar lo siguiente:

```bash
cat targets.txt | aquatone -ports 80,443,3000,3001
cat targets.txt | aquatone -out ./aquatone -screenshot-timeout 1000
```

* `-ports` especificamos los puertos a revisar de las URL
* `-out` directorio donde guardará los archivos a crear (por defecto, es el directorio local)
* `-screenshot-timeout` timeout en milisegundos (por defecto es 30000)

## Enumeración activa de subdominios

### Transferencia de zona

Para validar si se puede realizar una transferencia de zona, se puede hacer mediante el sitio web [Hacker Target](https://hackertarget.com/zone-transfer/), o mediante CLI.

Con el sitio web, podemos obtener un resultado como el siguiente:

<figure><img src="/files/azl2UhANq95Hsr7JM6rf" alt=""><figcaption><p>Zone Transfer Online</p></figcaption></figure>

Y mediante CLI, podemos usar los siguientes comandos:

* Linux:

```bash
# Obtención de servidores NS
nslookup -type=NS zonetransfer.me
# Transferencia de zona
nslookup -type=any -query=AXFR zonetransfer.me nsztm1.digi.ninja
dig axfr @nsztm1.digi.ninja zonetransfer.me
dig axfr @nsztm1.digi.ninja zonetransfer.me +nocookie
```

* Windows:

```batch
nslookup
server nsztm1.digi.ninja
ls -d zonetransfer.me
```

### DNSEnum

* [DNSEnum](https://github.com/SparrowOchon/dnsenum2)

```bash
dnsenum google.com
dnsenum google.com -f subdomains_wordlist.txt
```

### Gobuster

[Gobuster](https://github.com/OJ/gobuster) permite enumerar subdominios mediante la opción `dns`:

```bash
export TARGET="target.com"
export NS="ns.target.com"
export WORDLIST="wordlist.txt"
gobuster dns -q -r "${NS}" -d "${TARGET}" -w "${WORDLIST}" -p patterns.txt -o "gobuster_${TARGET}.txt"
gobuster dns -q -r "${NS}" -d "${TARGET}" -w "${WORDLIST}" -o "gobuster_${TARGET}.txt"
```

* `dns` ejecutamos el módulo DNS
* `-q` no imprime el banner del programa
* `-r` especificamos el servidor NS a quien consultar
* `-d` dominio a revisar
* `-p` archivo con patrones
* `-w` diccionario a usar para la enumeración
* `-o` archivo de salida

Ejemplo de archivo de patrones:

```
lert-api-shv-{GOBUSTER}-sin6
atlas-pp-shv-{GOBUSTER}-sin6
```

## Virtual Hosts

vHost es una característica que permite alojar múltiples sitios en un único servidor.

Existen dos modos de configurar vHost:

* **Basado en IP:** en este caso, un servidor puede obtener múltiples interfaces de red o múltiples direcciones IP. Diferentes sitios pueden estar asociados a diferentes direcciones IP.
* **Basado en nombre:** para este caso, múltiples dominios se encuentran asociados a la misma dirección IP.

{% tabs %}
{% tab title="cURL" %}
Mediante cURL podemos enumerar vHosts:

```bash
cat vhosts.txt | while read vhost;do echo "\n********\nFUZZING: ${vhost}\n********";curl -s -I http://192.168.10.10 -H "HOST: ${vhost}.target.com" | grep "Content-Length: ";done
```

Si vemos un `Content-Length` distinto, podemos asumir que tenemos un vHost.
{% endtab %}

{% tab title="FFUF" %}
Usando el siguiente comando, podemos enumerar vHosts:

```bash
ffuf -w vhosts.txt -u http://192.168.10.10 -H "HOST: FUZZ.target.com"
ffuf -w vhosts.txt -u http://192.168.10.10 -H "HOST: FUZZ.target.com" -fs 612
```

* `-w` diccionario a usar
* `-u` URL a la cual se le realizará fuzzing
* `-H "HOST: FUZZ.randomtarget.com"` especificamos que usaremos el `Host Header`, y la palabra `FUZZ` será reemplazada por la palabra del diccionario
* `-fs 612` filtrar las respuestas que tengan un size de 612 (size por defecto de las respuestas de este ejemplo)
  {% endtab %}
  {% endtabs %}

## Crawling

Realizar crawling a un sitio es un proceso que permite listar los recursos de este.

{% tabs %}
{% tab title="Burp Suite" %}
Para poder usar crawling en Burp Suite en las últimas versiones de este, se debe tener la versión [Professional](https://portswigger.net/burp/pro).

Cuando vemos en `Target > Site map` el sitio al cual le queremos hacer el crawling, le damos click derecho a este, y seleccionamos `Scan`:

<figure><img src="/files/lzNW7kxpx6OkNBeYyQMn" alt=""><figcaption><p>Burp Suite Scan</p></figcaption></figure>

Luego, seleccionamos `Crawl` y le damos click en `OK`:

<figure><img src="/files/exxOhlbS2I7dQ2zmC9La" alt=""><figcaption><p>Burp Suite Crawl</p></figcaption></figure>
{% endtab %}

{% tab title="FFUF" %}
Mediante el siguiente comando, podemos realizar el crawling usando ffuf

```bash
ffuf -recursion -recursion-depth 1 -u http://192.168.10.10/FUZZ -w wordlist.txt
ffuf -u http://192.168.10.10/blog/indexFUZZ -w web-extensions.txt:FUZZ
ffuf -u http://192.168.10.10/blog/FUZZ.php -w wordlist.txt
ffuf -recursion -recursion-depth 1 -u http://192.168.10.10/FUZZ -w wordlist.txt -e .php -v
```

* `-recursion` indica que se realizará un escáner recursivo
* `-recursion-depth 1` especifica el máximo de profundidad de la recursión, por defecto es 0, y en este caso, es 1
* `-u` URL a la cual se le realizará fuzzing
* `-w` diccionario a usar
* `-e` especificamos las extensiones a validar
* `-v` ver la URL completa
  {% endtab %}
  {% endtabs %}

## Fuzzing de parámetros

{% tabs %}
{% tab title="Fuzzing de parámetros GET usando FFUF" %}
Con ffuf es posible enumerar parámetros GET usando el siguiente comando:

```bash
ffuf -w wordlist.txt:FUZZ -u http://target.com/admin.php?FUZZ=key
ffuf -w wordlist.txt:FUZZ -u http://target.com/admin.php?FUZZ=key -fs 123
```

{% endtab %}

{% tab title="Fuzzing de parámetros POST usando FFUF" %}
Con ffuf es posible enumerar parámetros POST usando el siguiente comando:

```bash
ffuf -w wordlist.txt:FUZZ -u http://target.com/admin.php -X POST -d 'FUZZ=key' -H 'Content-Type: application/x-www-form-urlencoded'
ffuf -w wordlist.txt:FUZZ -u http://target.com/admin.php -X POST -d 'FUZZ=key' -H 'Content-Type: application/x-www-form-urlencoded' -fs 123
```

> En algunos servidores, debemos especificar el header `Content-Type` para que acepten la data enviada.
> {% endtab %}
> {% endtabs %}

{% tabs %}
{% tab title="Fuzzing de valores usando FFUF" %}
Con ffuf es posible enumerar valores usando el siguiente comando:

```bash
ffuf -w ids.txt:FUZZ -u http://target.com/admin.php -X POST -d 'id=FUZZ' -H 'Content-Type: application/x-www-form-urlencoded'
ffuf -w ids.txt:FUZZ -u http://target.com/admin.php -X POST -d 'id=FUZZ' -H 'Content-Type: application/x-www-form-urlencoded' -fs 123
```

> Podemos crear valores con el siguiente comando: `for i in $(seq 1 1000); do echo $i >> ids.txt; done` Para comprobar el contenido, podemos usar el siguiente comando: `curl http://target.com/admin.php -X POST -d 'id=73' -H 'Content-Type: application/x-www-form-urlencoded'`
> {% endtab %}
> {% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://w0lf-f4ng.gitbook.io/cheat-sheet/pentesting-web/information-gathering/active-information-gathering.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
