# Nmap

## Nmap <a href="#nmap-1" id="nmap-1"></a>

### Servicios de nmap <a href="#servicios-de-nmap" id="servicios-de-nmap"></a>

La lista de servicios de nmap se encuentra en: `/usr/share/nmap/nmap-services`

**Top 1000 de servicios:**

* TCP: `nmap -sT --top-ports 1000 -v -oG -`
* UDP: `nmap -sU --top-ports 1000 -v -oG -`
* Puertos ordenados por frecuencia: `sort -r -k3 /usr/share/nmap/nmap-services`

### Información de scripts <a href="#informacion-de-scripts" id="informacion-de-scripts"></a>

```bash
nmap --script-help <script nse>			# Información de scripts
ls -1 /usr/share/nmap/scripts/smb*		# Scripts de smb
```

## Comandos básicos <a href="#mis-basicos" id="mis-basicos"></a>

Obtención de todos los puertos del sistema, filtrado de los puertos obtenidos, y lanzar scripts únicamente contra los puertos encontrados. Hacer esto aumenta la velocidad de la obtención de resultados. Realizar el escáner tanto por TCP como por UDP (empezar por TCP, para no morir esperando los resultados por UDP).

{% code overflow="wrap" %}

```bash
cd ~/xtormin/$red/$ip/nmap
nmap -v -p- -oA quick-full-tcp -iL ../ip.txt # Obtener sólo todos los puertos abiertos
nmap -v -Pn -p- -oA quick-full-tcp -iL ../ip.txt # Si parece no responder, este hace lo mismo, pero usando la opción `-Pn`, que permite realizar el escáner sin usar peticiones ICMP
```

{% endcode %}

Haciendo uso de uno de los scripts del repositorio [hackingpotions](https://github.com/xtormin/hackingpotions).

{% code overflow="wrap" %}

```bash
nmap -v -p $(bash ~/xtormin/tools/hackingpotions/gnmap-open-ports.sh quick-full-tcp.gnmap) -T4 -A --script=default,vuln -oA scripts-full-tcp -iL ../ip.txt
nmap -v -Pn -p $(bash ~/xtormin/tools/hackingpotions/gnmap-open-ports.sh quick-full-tcp.gnmap) -T4 -A --script=default,vuln -oA scripts-full-tcp -iL ../ip.txt # Versión sin ICMP
```

{% endcode %}

Repetir lo mismo vía UDP.

## Escáneres <a href="#escaneres" id="escaneres"></a>

### Tipos de escáneres <a href="#tipos-de-escaneres" id="tipos-de-escaneres"></a>

{% code overflow="wrap" %}

```bash
nmap -sS 192.168.1.100 # Por defecto sin root, no completa la comunicación TCP, es más rápido que '-sT'
nmap -sT 192.168.1.100 # Por defecto con root, completa la comunicación TCP, por lo que, es más lento
nmap -sU 192.168.1.100 # Escáner UDP
```

{% endcode %}

### Formas de establecer los hosts <a href="#formas-de-establecer-los-hosts" id="formas-de-establecer-los-hosts"></a>

{% code overflow="wrap" %}

```bash
nmap 192.168.1.100
nmap 192.168.1.100-150
nmap 192.168.1.0/24
nmap xtormin.com
nmap 192.168.1.0/24 --exclude 192.168.1.100
nmap -iL ips.txt # Lista de IPs objetivo
```

{% endcode %}

### Descubrimiento de puertos <a href="#descubrimiento-de-puertos" id="descubrimiento-de-puertos"></a>

{% code overflow="wrap" %}

```bash
nmap -sL 192.168.1.100 	# Lista los hosts y obtiene el hostname
nmap -sn 192.168.1.100 	# Sólo descubre puertos, no escanea
nmap -Pn 192.168.1.100 	# Deshabilita el descubrimiento, sólo escanea, es útil cuando el firewall no permite las peticiones ICMP (ping)
nmap 192.168.1.100 -n 	# Deshabilita la resolución DNS
```

{% endcode %}

### Gestión del tiempo <a href="#gestion-del-tiempo" id="gestion-del-tiempo"></a>

{% code overflow="wrap" %}

```bash
nmap 192.168.1.100 -F # Escáner rápido
nmap 192.168.1.100 -O --osscan-limit # Deshabilita la detección del sistema operativo si se encuentra al menos un puerto abierto
nmap 192.168.1.100 --host-timeout 10s
nmap 192.168.1.100 --scan-delay 2s
nmap 192.168.1.100 --max-scan-delay 5s
nmap 192.168.1.100 --max-retries 3
nmap 192.168.1.100 --min-rate 100 # Mínimo de paquetes por segundo
nmap 192.168.1.100 --max-rate 110 # Máximo de paquetes por segundo
```

{% endcode %}

### Velocidad del escáner <a href="#velocidad-del-escaner" id="velocidad-del-escaner"></a>

| Modo  | Descripción                                                         |
| ----- | ------------------------------------------------------------------- |
| T0-T1 | Lento, pero útil ante IDS (Intrusion Detection Systems)             |
| T2-T3 | Normal                                                              |
| T4-5  | Agresivo, adecuado para redes que soporten bastante tráfico, o CTFs |

### Evasión de IDS <a href="#evasion-de-ids" id="evasion-de-ids"></a>

{% code overflow="wrap" %}

```bash
nmap 192.168.1.100 -f # Fragmentar los paquetes
nmap 192.168.1.100 -mtu 30 # Determinar el tamaño del offset
nmap 192.168.1.100 -D 192.168.1.101 # Escaner desde IP falsa
nmap -S domainone.com domaintwo.com # Realizar un escaner a un dominio (domaintwo.com) desde otro (domainone.com)
nmap 192.168.1.100 -g 53 # Usar un puerto origen específico
nmap 192.168.1.100 --proxies http://X.X.X.X:8080 # Utilizar un proxy
nmap 192.168.1.100 --data-length 150 # Enviar paquetes con datos aleatorios
```

{% endcode %}

### Resultados del escáner <a href="#resultados-del-escaner" id="resultados-del-escaner"></a>

{% code overflow="wrap" %}

```bash
nmap 192.168.1.100 -oX scan.xml # Salida xml
nmap 192.168.1.100 -oA scan # Todas las salidas (normal (oN), xml (oX), grep (oG))
```

{% endcode %}

#### Convertir de XML a HTML <a href="#convertir-de-xml-a-html" id="convertir-de-xml-a-html"></a>

{% code overflow="wrap" %}

```bash
xsltproc scan.xml -o scan.html
```

{% endcode %}

**Automatizar la conversión de múltiples XML**

El siguiente comando en bash convierte todos los ficheros XML de la carpeta *nmap* en HTML (manteniendo el XML original):

{% code overflow="wrap" %}

```bash
for xml_file in $(ls nmap/*.xml); do xsltproc $xml_file -o $(echo $xml_file | sed 's/xml/html/'); done
```

{% endcode %}

#### Ejemplos de escáneres <a href="#ejemplos-de-escaneres" id="ejemplos-de-escaneres"></a>

{% code overflow="wrap" %}

```bash
nmap -sP 192.168.0.0/24 # Escáner Ping
nmap -T4 -F 192.168.1.100 -vvv # Escáner rápido
nmap -sV -T4 -O -F –version-light 192.168.1.100 -vvv # Escáner rápido más agresivo y que obtiene más información
nmap -sS -sU -PN -p T:80,T:445,U:161 192.168.1.100 # Escáner TCP Syn y UDP
nmap -v -Pn -n -T4 -sT -sV --version-intensity=5 --reason 192.168.1.100
nmap -v -Pn -n -T4 -sT -p- --reason 192.168.1.100 # Escáner completo
nmap -v -Pn -T4 -A -p- --script=default,vuln -oA full-tcp 192.168.1.100 # Full TCP + scrips + output (mi fav)
nmap -v -T4 -sU -A -p- --script=default,vuln -oA full-udp 192.168.1.100 # Full UDP + scrips + output (mi fav)
sudo nmap -sn 10.11.1.1-254
sudo nmap -v -sn 10.11.1.1-254 -oG ping-sweep.txt
sudo nmap 10.11.0.128 -p- -sV -vv --open --reason
sudo nmap -O 10.11.1.220
sudo nmap -sT -A --top-ports=20 10.11.1.1-254 -oG top-port-sweep.txt
sudo nmap -sV -sT -A 10.11.1.220
```

{% endcode %}

### Escáneres específicos en servicios <a href="#escaneres-especificos-en-servicios" id="escaneres-especificos-en-servicios"></a>

#### TCP <a href="#tcp" id="tcp"></a>

<table><thead><tr><th>Servicio</th><th>Puerto</th><th data-hidden>Escáner</th></tr></thead><tbody><tr><td>SMB</td><td>445</td><td></td></tr></tbody></table>

**21, 20 - FTP**

* **21**. Puerto común de acceso.
* **20**. Puerto para transferencia de datos.

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p21 --script=default,vuln -oA ftp-scan 192.168.1.0/24
```

{% endcode %}

**Inicio de sesión como anonymous** Comprobar si el servidor FTP permite iniciar sesión como anonymous.

{% code overflow="wrap" %}

```bash
nmap -sV --script ftp-anon -p 21 <ip>
```

{% endcode %}

**Fuerza bruta**

{% code overflow="wrap" %}

```bash
nmap -sV --script ftp-brute -p 21 <ip>
```

{% endcode %}

**Bounce**

{% code overflow="wrap" %}

```bash
nmap -sV --script ftp-bounce -p 21 <ip>
```

{% endcode %}

**22 - SSH**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p22 --script=default,vuln -oA ssh-scan 192.168.1.0/24
```

{% endcode %}

**Métodos de autenticación**

{% code overflow="wrap" %}

```bash
nmap -p 22 -n -v -sV -Pn --script ssh-auth-methods --script-args ssh.user=root 192.168.1.100
```

{% endcode %}

**SSH hostkeys**

{% code overflow="wrap" %}

```bash
nmap -p 22 -n -v -sV -Pn --script ssh-hostkey 192.168.1.100
nmap --script ssh-hostkey -p 22 -n --script-args ssh_hostkey=full <ip>
```

{% endcode %}

**Algoritmos utilizados**

{% code overflow="wrap" %}

```bash
nmap --script ssh2-enum-algos -p 22 -n <ip>
```

{% endcode %}

**Protocolo SSH v1**

{% code overflow="wrap" %}

```bash
nmap --script sshv1 -p 22 -n <ip>
```

{% endcode %}

**23 - TELNET**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p23 --script=default,vuln -oA telnet-scan 192.168.1.0/24
```

{% endcode %}

**110 - POP3**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p110 --script=default,vuln -oA pop3-scan 192.168.1.0/24
```

{% endcode %}

**Otros escáneres**

{% code overflow="wrap" %}

```bash
nmap -v -sV --version-intensity=5 --script pop3-capabilities -p 110 <IP> # S (CAPA, TOP, USER, SASL, RESP-CODES, LOGIN-DELAY, PIPELINING, EXPIRE, UIDL, IMPLEMENTATION)
nmap --script pop3-brute --script-args pop3loginmethod=SASL-LOGIN -p 110 <IP> # POP3 Accounts bruteforce
nmap --script pop3-brute --script-args pop3loginmethod=SASL-CRAM-MD5 -p 110 <IP>
nmap --script pop3-brute --script-args pop3loginmethod=APOP -p 110 <IP>
```

{% endcode %}

**111 - NFS**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p111 --script=default,vuln -oA pop3-scan 192.168.1.0/24
```

{% endcode %}

**Otros escáneres**

```bash
nmap -v -p 111 10.11.1.1-254			# Enumerar todas las máquinas con el puerto 111 abierto.
nmap -sV -p 111 --script=rpcinfo 10.11.1.1-254	# Enumerar información vía RPC.
ls -1 /usr/share/nmap/scripts/nfs*		# Mostrar scripts para el servicio NFS.
nmap -p 111 --script nfs* <ip>			# Lanzar escáner con todos los scripts contra una máquina con NFS.
```

**143 - IMAP**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p143 --script=default,vuln -oA pop3-scan 192.168.1.0/24
```

{% endcode %}

**Otros escáneres**

{% code overflow="wrap" %}

```bash
sudo nmap -v -sV --version-intensity=5 --script=imap-capabilities
```

{% endcode %}

**445 - SMB**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p445 --script=default,vuln -oA smb-scan 192.168.1.0/24
```

{% endcode %}

**636, 389 - LDAP**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -p636,389 --script=default,vuln -oA ldap-scan 192.168.1.0/24
```

{% endcode %}

**Otros escáneres**

```bash
sudo nmap -v -p636,389 -sV --script=ldap-search  -oA ldap-search-scan <TARGET>
```

#### UDP <a href="#udp" id="udp"></a>

{% code overflow="wrap" %}

```bash
sudo nmap -sU 10.11.1.115
sudo nmap -sS -sU 10.11.1.115
```

{% endcode %}

**53 - DNS**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -sU -p53 --script=default,vuln -oA dns-scan 192.168.1.0/24
```

{% endcode %}

**Transferencia de zona**

{% code overflow="wrap" %}

```bash
nmap --script=dns-zone-transfer -p 53 ns2.xtormin.com
```

{% endcode %}

**161, 162, 10161, 10162 - SNMP**

**Escáner general**

{% code overflow="wrap" %}

```bash
sudo nmap -v -sU -p161,162,10161,10162 --script=default,vuln -oA snmp-scan 192.168.1.0/24
```

{% endcode %}

## Automatización de escáneres

Para la automatización de escáneres de redes internas o externas, es posible hacer uso de un *script* que realiza lo siguiente:

* Escáner de una lista de IP's.
* Crea una estructura jerárquica de carpetas.
* Almacena la salida en todos los formatos de fichero posibles en nmap.
* Crea un fichero de logs donde se indica el inicio y fin del escáner (muy útil para identificar el último host escaneado, por si la red o servidor deja de funcionar)
* Cuenta con escáneres pre-configurados comunes.

{% hint style="info" %}
Si se quiere continuar el escáner desde el último hosts escaneado, tan solo hay que editar el fichero hosts.txt con la lista de hosts objetivos y eliminar los hosts que hayan sido escaneados o no se deseen volver a escanear.
{% endhint %}

### Script en powershell

{% @github-files/github-code-block url="<https://github.com/xtormin/PowerPentest/blob/main/network_scan_logger.ps1>" %}

```powershell
.\network_scan_logger.ps1 -HostFile .\hosts.txt -ScanType tcp-1000
```

### Script en bash

{% @github-files/github-code-block url="<https://github.com/xtormin/CyberSnippets/blob/main/scripts/network_scan_logger.sh>" %}

```bash
bash network_scan_logger.sh hosts.txt tcp-1000
```

## Referencias

* <https://nullsec.us/top-1-000-tcp-and-udp-ports-nmap-default/>
