Comencemos con lo basico "reconocimiento/information gathering"

La informacion es poder

Information Gathering tmb es conocida como reconnaissance o footprinting. Reconnaissance es en si el proceso de recopilar información (tanto del sistema como de la empresa), y footprinting es una parte de Reconnaissance, que recopilar información sobre el objetivo y las entidades asociadas con el.

En este caso veremos el uso de arp-scan

¿Qué es arp-scan?

Arp-scan es una herramienta de línea de comandos diseñada para escanear redes locales utilizando el protocolo ARP (Address Resolution Protocol), que es un mecanismo fundamental en las redes informáticas para asociar direcciones IP (como 192.168.1.1) con direcciones MAC (direcciones físicas únicas de los dispositivos de red, como tarjetas de red o adaptadores Wi-Fi). Esta herramienta, desarrollada bajo licencia GPLv3, está disponible para sistemas operativos como Linux, BSD, macOS y Solaris. Su funcionamiento se basa en el envío de paquetes ARP de solicitud a rangos de direcciones IP en una red local, y luego en la recepción de respuestas ARP que revelan los dispositivos activos conectados.En esencia, arp-scan actúa como un "explorador" de la red, identificando no solo qué dispositivos están presentes, sino también detalles como sus fabricantes de hardware a través de bases de datos de identificadores únicos (OUI, por sus siglas en inglés). Incluye utilidades complementarias, como arp-fingerprint, que ayuda a "huellar" o identificar el tipo de sistema operativo o dispositivo basado en patrones de direcciones MAC, y get-oui, que consulta bases de datos para mapear prefijos MAC a vendors como Cisco o Apple. A diferencia de otras herramientas de escaneo de red que dependen de protocolos de nivel superior (como ICMP para ping o TCP para conexiones), arp-scan opera en la capa de enlace de datos, lo que lo hace más eficiente y discreto para redes locales, ya que ARP es un protocolo inherente a las comunicaciones Ethernet o Wi-Fi dentro de la misma subred (el segmento de red donde los dispositivos se comunican directamente sin routers intermedios).

¿Para qué sirve?

Arp-scan se utiliza principalmente para el descubrimiento y análisis de hosts en una red local IPv4. Su propósito clave es mapear la topología de la red, es decir, crear un inventario de los dispositivos conectados, lo que resulta invaluable en entornos de administración de redes.

  • Tareas de inventario y monitoreo: En contextos profesionales, como en empresas o laboratorios, ayuda a los administradores de red a verificar la presencia de dispositivos autorizados, detectar posibles intrusiones (como dispositivos no reconocidos) o simplemente mantener un registro actualizado de la red.
  • Eficiencia en redes locales: Dado que ARP solo funciona dentro del mismo dominio de broadcast (la red local), arp-scan es ideal para escaneos rápidos y precisos sin necesidad de configuraciones complejas o permisos remotos. No puede usarse para redes remotas, lo que lo limita a entornos locales, pero lo hace más seguro y focalizado.

¿Cómo se usa?

Bueno, voy asumir que tenes kali linux instalado asi que en el caso que no lo tengas instalado:

sudo apt update
sudo apt install arp-scan
arp-scan -I eth0 - localnet

tambien se puede utilizar solo la IP

arp-scan 192.168.0.1/24

Cuando lanzamos el escaneo y el resultado aparace como unknown, las maquinas virtuales comienzan con la mac 08:00 (voy a estar usando maquinas virtuales)

None

para identificar dispositivos especificos con el numero de mac

arp-fingerprint 00:11:22:33:44:55

En los resultados del escaneo nos pueden aparecer varias IP, le hacemos un ping a cada una con el parametro -c 1 192.168.0.1

None

el ttl =128 resultante indica que es microsoft y si el ttl=64 es linux (los parametros pueden variar [xq? ni idea])

Tambien podemos usar "netdiscover"

netdiscover -i wlan0 -r 192.168.0.1/24
None

Lo mismo sucede con "nmap"

nmap -sn 192.168.0.1/24
None

En resumen, estas tools son para hacer reconocimiento sobre dispositivos locales. Para eso debes estar dentro de la red que vas a auditar

arp-scan -I waln0 --localnet --outfile=archivo.txt

netdiscover -i wlan0 -r 192.168.0.0/24

nmap -sn 192.168.0.0/24 > -oN text.txt

Es recomendable usar al menos 3 herramientas, para eso le pedi al amigo grok que haga un script en python para usar estas mismas herramientas

import subprocess
import re
import os
import sys

# Script en Python mejorado para escanear la red local usando arp-scan, netdiscover y nmap
# Requiere que las herramientas estén instaladas. Ejecuta con: sudo python3 script.py
# Agregado verbose, logging y captura de errores para depuración

def list_interfaces():
    """Lista interfaces de red disponibles (excluyendo loopback)"""
    try:
        output = subprocess.check_output(["ip", "link", "show"]).decode()
        interfaces = re.findall(r'^\d+: ([^:]+):', output, re.MULTILINE)
        return [iface for iface in interfaces if iface != 'lo']
    except subprocess.CalledProcessError as e:
        print(f"Error al listar interfaces: {e}")
        sys.exit(1)

def get_local_ip(iface):
    """Obtiene la IP local de una interfaz"""
    try:
        output = subprocess.check_output(["ip", "addr", "show", iface]).decode()
        match = re.search(r'inet (\d+\.\d+\.\d+\.\d+)', output)
        return match.group(1) if match else None
    except subprocess.CalledProcessError as e:
        print(f"Error al obtener IP: {e}")
        return None

def get_network_range(ip):
    """Calcula el rango /24 basado en la IP local"""
    return f"{'.'.join(ip.split('.')[:3])}.0/24"

# Mostrar interfaces disponibles
interfaces = list_interfaces()
if not interfaces:
    print("No se encontraron interfaces de red.")
    sys.exit(1)

print("Interfaces de red disponibles:")
for i, iface in enumerate(interfaces, 1):
    print(f"{i}) {iface}")

# Preguntar por la interfaz
try:
    choice = int(input("Selecciona el número de la interfaz que deseas usar: "))
    iface = interfaces[choice - 1]
except (ValueError, IndexError):
    print("Interfaz no válida. Saliendo.")
    sys.exit(1)

# Mostrar IP local
local_ip = get_local_ip(iface)
if not local_ip:
    print(f"No se pudo obtener la IP local para {iface}. Asegúrate de que esté conectada.")
    sys.exit(1)
print(f"Interfaz seleccionada: {iface}")
print(f"Dirección IP local: {local_ip}")

# Calcular rango /24
network_range = get_network_range(local_ip)
print(f"Rango de red a escanear: {network_range}")

# Preguntar si guardar salida en archivo
save_output = input("¿Deseas guardar la salida en un archivo .txt? (s/n): ").lower()
if save_output == 's':
    filename = input("Ingresa el nombre del archivo (sin extensión, se agregará .txt): ")
    outfile = f"{filename}.txt"
    print(f"La salida se guardará en {outfile}")
else:
    outfile = None

# Preparar parámetros para guardar salida
arp_out = f"--outfile={outfile}.arp" if outfile else ""
net_out_file = f"{outfile}.netdiscover" if outfile else None
nmap_out = f"-oN {outfile}.nmap" if outfile else ""

# Función para ejecutar comando con sudo y capturar salida/errores
def run_sudo_cmd(cmd, outfile=None):
    full_cmd = ["sudo"] + cmd
    print(f"Ejecutando: {' '.join(full_cmd)}")
    try:
        if outfile:
            with open(outfile, 'w') as f:
                process = subprocess.run(full_cmd, stdout=f, stderr=subprocess.PIPE, text=True, check=True)
        else:
            process = subprocess.run(full_cmd, capture_output=True, text=True, check=True)
            print(process.stdout)
        if process.stderr:
            print(f"Errores/Warnings: {process.stderr}")
    except subprocess.CalledProcessError as e:
        print(f"Error al ejecutar: {e}")
        print(f"Salida: {e.stdout}")
        print(f"Errores: {e.stderr}")

# Ejecutar arp-scan con verbose
print("\nEjecutando arp-scan...")
arp_cmd = ["arp-scan", "-I", iface, "--localnet", "--verbose"]
if arp_out:
    arp_cmd.append(arp_out)
run_sudo_cmd(arp_cmd, outfile=f"{outfile}.arp" if outfile else None)

# Ejecutar netdiscover
print("\nEjecutando netdiscover...")
net_cmd = ["netdiscover", "-i", iface, "-r", network_range]
run_sudo_cmd(net_cmd, outfile=net_out_file)

# Ejecutar nmap
print("\nEjecutando nmap...")
nmap_cmd = ["nmap", "-sn", network_range]
if nmap_out:
    nmap_cmd.append(nmap_out)
run_sudo_cmd(nmap_cmd, outfile=f"{outfile}.nmap" if outfile else None)

# Si se guardó en archivos separados, combinarlos
if outfile:
    print(f"Combinando salidas en {outfile}...")
    with open(outfile, 'w') as combined:
        combined.write("=== Salida de arp-scan ===\n")
        if os.path.exists(f"{outfile}.arp"):
            with open(f"{outfile}.arp", 'r') as arp_file:
                combined.write(arp_file.read())
        combined.write("\n\n=== Salida de netdiscover ===\n")
        if os.path.exists(f"{outfile}.netdiscover"):
            with open(f"{outfile}.netdiscover", 'r') as net_file:
                combined.write(net_file.read())
        combined.write("\n\n=== Salida de nmap ===\n")
        if os.path.exists(f"{outfile}.nmap"):
            with open(f"{outfile}.nmap", 'r') as nmap_file:
                combined.write(nmap_file.read())
    
    # Eliminar archivos temporales si existen
    for temp in [f"{outfile}.arp", f"{outfile}.netdiscover", f"{outfile}.nmap"]:
        if os.path.exists(temp):
            os.remove(temp)
    print(f"Escaneo completado. Resultados guardados en {outfile}")
else:
    print("Escaneo completado. Resultados mostrados en pantalla.")

print("\nConsejos de depuración:")
print("- Asegúrate de ejecutar el script con 'sudo python3 nombre_script.py' para privilegios completos.")
print("- Si no ves hosts en arp-scan/netdiscover, pero sí en nmap: Prueba manualmente los comandos mostrados arriba.")
print("- Posibles causas: Aislamiento de clientes en Wi-Fi, VPN activa, interfaz en modo no promiscuo (en VMs).")
print("- Para netdiscover, déjalo correr 30-60 segundos si no ves output inmediato.")

Funciono muy bien y esta todo re piola. Ahora se podrian agregar mas herramientas o mas parametros a nmap pero eso es para otro articulo.

fuentes:

(tmb mis apuntes)