> For the complete documentation index, see [llms.txt](https://b4zh.gitbook.io/b4zh/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://b4zh.gitbook.io/b4zh/nmap-a.md).

# NMAP A

## LAB

* Máquina atacante con nmap
* Ubuntu con snort (IDS)
* Metsploitable3

Las 3 máquinas en la misma RED NAT.

***

## Instalar snort en ubunut

```bash
sudo apt install snort -y
```

## Configurar de firewall empresarial (snort)

* Activar modo promiscuo desde la configuración de vbox
* Activar modo promiscuo desde el emulador de terminal.

```bash
sudo ip link set dev enp0s3 up
sudo ip link set dev enp0s3 promisco on
ip -d link show enp0s3 | grep -E 'promisc|promiscuity'
```

* Configurar el fichero de configuración **snort.conf**.
* Pero antes hacer un backup del fichero.

```bash
sudo cp /etc/snort/snort.conf /etc/snort/snort.conf.original
```

```bash
sudo vim /etc/snort/snort.conf
```

* Dentro del fichero modificar la variable HOME\_NET con la dirección de red.

```yaml
ipvar HOME_NET 10.0.33.3/24
```

* Comprobar que las variables **RULE\_PATH**, **SO\_RULE\_PATH** y **PREPROC\_RULE\_PATH** tengan las siguientes rutas.

```yaml
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
```

Y verificar que la variable **RULE\_PATH** se incluyen para las reglas que usara snort para detectar intrusos **local.rules**.

```yaml
include $RULE_PATH/local.rules
```

Dentro del fichero local.rules, agregar las siguientes reglas:

```yaml
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"HIXEC IDS: posible escaneo TCP SYN (múltiples puertos en poco tiempo)"; flags:S; threshold:type both, track by_src, count 20, seconds 33; classtype:attempted-recon; sid:1000001; rev:2;)

alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"HIXEC IDS: posible escaneo UDP (múltiples puertos en poco tiempo)"; threshold:type both, track by_src, count 20, seconds 60; classtype:attempted-recon; sid:1000002; rev:2;)

alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:"HIXEC IDS: fragmentos IP muy pequeños (posible DoS/DDoS o evasión)"; fragbits:M; dsize:<16; classtype:bad-unknown; sid:1000003; rev:2;)

alert tcp $HOME_NET any -> $HOME_NET any (msg:"HIXEC IDS: posible escaneo de puertos interno (origen dentro de HOME_NET)"; flags:S; threshold:type both, track by_src, count 20, seconds 60; classtype:attempted-recon; sid:1000008; rev:2;)

alert tcp $EXTERNAL_NET any -> $HOME_NET 445 (msg:"HIXEC IDS: conexión SMB externa hacia servidor interno"; flow:to_server,established; classtype:policy-violation; sid:1100010; rev:2;)

alert tcp $HOME_NET any -> $EXTERNAL_NET $FTP_PORTS (msg:"HIXEC IDS: subida de ejecutable por FTP (STOR .exe)"; flow:to_server,established; content:"STOR "; nocase; content:".exe"; nocase; distance:0; within:40; classtype:misc-activity; sid:1100009; rev:2;)

alert tcp $EXTERNAL_NET any -> $HOME_NET 110 (msg:"HIXEC IDS: tráfico POP3 con posible adjunto ejecutable (.exe)"; flow:to_client,established; content:".exe"; nocase; classtype:misc-activity; sid:1100008; rev:2;)

alert tcp $EXTERNAL_NET any -> $HOME_NET 25 (msg:"HIXEC IDS: tráfico SMTP con posible adjunto ejecutable (.exe)"; flow:to_client,established; content:".exe"; nocase; classtype:misc-activity; sid:1100007; rev:2;)

alert udp $HOME_NET any -> $EXTERNAL_NET 53 (msg:"HIXEC IDS: consulta DNS a dominio sospechoso (hixec.com)"; content:"hixec.com"; nocase; classtype:bad-unknown; sid:1100006; rev:2;)

alert icmp any any -> any any (msg:"HIXEC NETMON: ICMP echo request observado"; itype:8; sid:2000001; rev:2;)

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"HIXEC IDS: acceso HTTP a panel WordPress (/wp-admin)"; flow:to_server,established; content:"GET "; http_method; content:"https://hixec.com/wp-admin"; http_uri; classtype:web-application-activity; sid:1100011; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"HIXEC IDS: acceso HTTP a phpMyAdmin (/phpMyAdmin)"; flow:to_server,established; content:"GET "; http_method; content:"/phpMyAdmin"; http_uri; classtype:web-application-activity; sid:1100012; rev:1;)

alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"HIXEC IDS: recepción de cookie de sesión HTTP desde exterior"; flow:to_client,established; content:"Set-Cookie:"; http_header; classtype:web-application-activity; sid:1100013; rev:1;)

alert udp $HOME_NET any -> $EXTERNAL_NET 53 (msg:"HIXEC IDS: resolución DNS a dominio interno update.hixec-internal.local"; content:"update.hixec-internal.local"; nocase; classtype:bad-unknown; sid:1100014; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET 25 (msg:"HIXEC IDS: correo saliente con cabecera DLP corporativa"; flow:to_server,established; content:"X-HIXEC-DLP:"; nocase; classtype:misc-activity; sid:1100015; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET [143,993,110,995] (msg:"HIXEC IDS: intento de autenticación a buzón de correo externo"; flow:to_server,established; content:" LOGIN "; nocase; classtype:misc-activity; sid:1100016; rev:1;)

alert tcp $EXTERNAL_NET 22 -> $HOME_NET any (msg:"HIXEC IDS: banner SSH recibido desde servidor externo"; flow:to_client,established; content:"SSH-"; depth:4; classtype:misc-activity; sid:1100017; rev:1;)

alert tcp $EXTERNAL_NET 443 -> $HOME_NET any (msg:"HIXEC IDS: posible acceso a portal VPN HIXEC sobre TLS"; flow:to_client,established; content:"hixec-vpn"; nocase; classtype:misc-activity; sid:1100018; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET 3389 (msg:"HIXEC IDS: conexión RDP saliente hacia host externo"; flow:to_server,established; classtype:policy-violation; sid:1100019; rev:1;)

alert tcp $HOME_NET any -> $EXTERNAL_NET 6667 (msg:"HIXEC IDS: posible conexión IRC saliente"; flow:to_server,established; content:"NICK "; nocase; classtype:policy-violation; sid:1100020; rev:1;)

```

* Validar la configuración de snort

```bash
sudo snort -T -i enp0s3 -c /etc/snort/snort.conf
```

* Ejecutar snort en modo IDS (alertas en consola), para que escuche la interfaz en modo promiscuo y muestre alertas en consola.

```bash
sudo snort -i enp0s3 -c /etc/snort/snort.conf -A console -k none
```

* Hacer un ping desde la máquina atacante hacia ms3 para ver como snort nos detecta.

```bash
ping 10.0.33.x
```

***

## Evasión de snort con nmap

### Descubrimiento de host empresarial

* Detectable por snort. Porque se hace un escaneo masivo de puertos.

```bash
nmap -n 10.0.33.0/24
```

* Para pasar desapercibidos al escanear los hosts desactivamos el escaneo de puertos. Por lo que el descubrimiento de hosts se hara a traves del protocolo ARP.

```bash
nmap -n -sn 10.0.33.0/24
```

* Pero si queremos seguir usando el protocolo TCP, lo hacemos haciendo un TCP SYNC PING a cualquier puerto. OJO: en esta fase que es la del descubrimiento de hosts nos da igual el estado del puerto. Ya que este abierto o cerrado si la máquina está activa, recibiremos una respuesta.

```bash
nmap -n -sn -PS80 10.0.33.0/24
```

***

### Escaneo de puertos empresarial

Detectable por snort, porque aunque hagamos un escaneo de tipo TPC SYN, estamos enviando muchos paquetes desde una misma dirección IP hacia una misma dirección IP en un tiempo muy corto.

```bash
sudo nmap -sS 10.0.33.4
```

Para evadir a snort, limitamos los puertos a escanear. Porque al escanerar menos puertos es evidente que van a ver menos paquetes TCP en la red, y nuestro tráfico será visto como algo legítimo.

```bash
sudo nmap -sS --top-ports 5 10.0.33.4
```

```bash
sudo nmap -sS -p80 10.0.33.4
```

***

### Uso de fragmentación y camuflaje de paquetes para evasión de firewall

Dividir los paquetes a enviar en trozos más pequeños, pero si envias paquetes muy pequeños, snort detectará eso como un posible ataque Dos/DDoS.

Con el parámetro -f enviamos paquetes de 8 bytes.

```bash
sudo nmap -sS -p80 -f 10.0.33.4
```

Sin embargo si enviamos paquete de 16 bytes con el parámetro -ff, a snort no le dará ansiedad.

```bash
sudo nmap -sS -p80 -ff 10.0.33.4
```

Con el parámetro --mtu podemos definir el peso en bytes de cada paquete a enviar, por lo que usamos números que son múltiplos de 8, siendo 8 el mínimo.

```bash
sudo nmap -sS -p80 --mtu 8 10.0.33.4 # Snort lo detecta
sudo nmap -sS -p80 --mtu 16 10.0.33.4 # Snort no lo detecta
```

***

### Escaneo con señuelos

Mezclar nuestro rastro con rastro falso, a través de direcciones IP falsas.

Snort detecta nuestro escaneo pero en principio no sabe cual es la dirección del atacante, ya que se estarían haciendo x cantidad de peticiones simúltaneamente.

Las respuesta TCP del objetivo serán enviadas a nuestra máquina a pesar de que no seamos el equipo con la IP señuelo.

ME = Mi IP

```bash
sudo nmap -sS -D 10.0.3.100,ME 10.0.33.4
```

***

### Manipulación de dirección IP y puerto de origen

A través de un IP spoofing cambiaremos la dirección IP que envía las peticiones a la máquina víctima.

Con el parámetro -S especificamos la IP por la que vamos a suplanter, y este parámetro siempre debe ir acompañado del parámetro -Pn para que no se haga el reconocimiento por ping (saltar el host discovery).

Además con el parámetro -e debemos especificar nuestra interfaz de red para que nmap sepa cuál es nuestra dirección MAC, y que así las respuestas del objetivo lleguen a nosotros y no a la máquina con la dirección IP que estamos suplantando. En una red local la comunciación se hace a través del protocolo ARP, no IP.

Pero antes debemos añadir la dirección IP a suplantar en nuestra interfaz de red, para no haiga conflicto cuando nmap pregunte al kernel que dirección tomaría el paquete si sale con esa dirección de origen.

Los paquetes enviados en su cabecera van a tener como dirección IP  de origen la IP falsa.

```bash
sudo ip addr add 10.0.33.200/24 dev enp0s3
```

```bash
sudo nmap -sS -p80-800 -S 10.0.33.200 -e enp0s3 -Pn 10.0.33.4
```

Y con el parámetro --source-port cambiamos el puerto desde el cual se envían nuestras peticiones.

```bash
sudo nmap -sS -p80-800 -S 10.0.33.200 -e enp0s3 -Pn --source-port 443 10.0.33.4
```

***

## NSE

```lua
# 1 Metadatos

description = [[Elrompecraneos]]
author = "Yo"
license = "Pa todo el mundo"
categories = {"safe"}

# 2 Imports
# Importar mÃ³dulos

local shortport = require "shortport"
local http = require "http"
local stdnse = require "stdnse"

# 3 Reglas: filtro que decice si el script debe correr o no

# Reglas a nivel del puerto

portrule = function(host, port)
	return port.protocol == "tcp" and port.state == "open" and port.number == 80
end

# Reglas a nivel del host
# Actua sobre cada host a escanear
hostrule function(host)
	return host and host.ip ~= nil

# 4 Acciones: que va a realizar el script

action = function(host, port)
	return "Puerto 80 abierto"
end 

action = function(host)
	return "Analizando host " .. (host.ip or "?")
end

```

### Script de Hixec.

```lua
description = [[
Detector de comentarios TODO/FIXME/DEBUG/HACK/XXX en la raíz HTTP (/).
]]
author = "La Cabra"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"safe", "discovery"}

local http = require "http"

portrule = function(host, port)
  return port.protocol == "tcp" and port.state == "open" and port.number == 80
end

action = function(host, port)
  local resp = http.get(host, port, "/")
  if not resp or not resp.status or not resp.body then
    return nil
  end

  local status    = resp.status
  local body      = resp.body
  local body_len  = #body

  local total_comments = 0
  local hits           = {}
  local patterns       = {"TODO", "FIXME", "DEBUG", "HACK", "XXX"}

  for line in body:gmatch("[^\r\n]+") do
    if line:find("<!--", 1, true) then
      total_comments = total_comments + 1
      local up = line:upper()
      for _, p in ipairs(patterns) do
        if up:find(p, 1, true) then
          local clean = line:gsub("%s+", " ")
          if #clean > 120 then
            clean = clean:sub(1,117) .. "..."
          end
          hits[#hits + 1] = clean
          break
        end
      end
    end
  end

  if #hits == 0 then
    return nil
  end

  local msg = string.format(
    "HTTP %s, BODY_LEN=%d, COMENTARIOS=%d, ENCONTRADOS=%d",
    tostring(status), body_len, total_comments, #hits
  )
  msg = msg .. "\n" .. table.concat(hits, "\n")
  return msg
end
```

### Implementación del script

* Desde el directorio en donde esta el script .nse.

```
nmap -p80 --script ./script.nse 10.0.33.4
```

* Copiamos el script en el directorio /usr/share/nmap/scripts.

```
sudo cp script.nse /usr/share/nmap/scripts
nmap -p80 --script script.nse 10.0.33.4
```

* Actualizamos la base de datos de scripts de nmap.

```
sudo nmap --script-updatedb
```
