feat(recon): grupo de reconocimiento de red + servicios + fingerprint web
Añade el capability group `recon` (dominio cybersecurity + pipelines, Python),
con la política de archivado OSINT y página madre docs/capabilities/recon.md.
Lookups y sondeo (wrappers de CLI):
- whois_lookup, rdap_lookup, dns_records, ping_host, traceroute_host, nmap_scan
- save_scan_to_osint (sink común) + recon_osint (pipeline one-shot scan+archivado)
Escaneo de puertos/servicios nativo (stdlib, sin nmap ni sudo):
- scan_tcp_ports: connect-scan TCP concurrente (open/closed/filtered)
- grab_service_banner: banner grab + identificación de servicio/versión real
- identify_port_service: puro, puerto -> servicio IANA esperado (~120 puertos)
- scan_port_services: pipeline one-shot (scan -> identify + banner por puerto abierto)
Fingerprint de tecnología web (estilo Wappalyzer), patrón pura/impura:
- fetch_http_fingerprint: GET stdlib, recoge headers/html/cookies (solo nombres)
- detect_web_tech: puro, matchea ~50 firmas regex -> tecnologías por categoría
- fingerprint_web_stack: pipeline one-shot url -> tecnologías
Todas devuelven dict {status} sin lanzar. Tests: 43 verdes, sin red externa.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
---
|
||||
name: ping_host
|
||||
kind: function
|
||||
lang: py
|
||||
domain: cybersecurity
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "def ping_host(host: str, count: int = 4, timeout_s: int = 30) -> dict"
|
||||
description: "Sondeo de disponibilidad ICMP de un host ejecutando `ping -c <count> -w <timeout_s> <host>` (Linux) por subprocess y parseando el resumen: paquetes enviados/recibidos, % de perdida y rtt min/avg/max. Devuelve dict de estado sin lanzar; host inalcanzable o ICMP filtrado es status ok con loss_pct=100 y rtt None. `raw` siempre presente con el stdout."
|
||||
tags: [recon, ping, cybersecurity, icmp, network]
|
||||
params:
|
||||
- name: host
|
||||
desc: "Hostname o IP a sondear, ej. 1.1.1.1 o google.com. Vacio devuelve status error."
|
||||
- name: count
|
||||
desc: "Numero de echo requests ICMP a enviar (ping -c). Default 4."
|
||||
- name: timeout_s
|
||||
desc: "Deadline total del ping en segundos (ping -w); tambien fija el timeout duro del subprocess (con +5s de margen). Default 30."
|
||||
output: "dict de estado. En exito {status:'ok', host, packets_sent:int|None, packets_recv:int|None, loss_pct:float, rtt_avg_ms:float|None, rtt_min_ms:float|None, rtt_max_ms:float|None, raw:str}; un host inalcanzable da loss_pct=100 y rtts None pero sigue status ok. En fallo {status:'error', error:str, host, raw:str}."
|
||||
uses_functions: []
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_py_core"
|
||||
imports: []
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
file_path: "python/functions/cybersecurity/ping_host.py"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```python
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.join("python", "functions"))
|
||||
from cybersecurity import ping_host
|
||||
|
||||
res = ping_host("1.1.1.1", count=4, timeout_s=10)
|
||||
print(res["status"]) # "ok"
|
||||
print(res["loss_pct"]) # 0.0
|
||||
print(res["rtt_avg_ms"]) # 12.3
|
||||
print(res["raw"]) # stdout crudo de ping para el vault
|
||||
```
|
||||
|
||||
## Cuando usarla
|
||||
|
||||
Usala para comprobar rapidamente si un host responde a ICMP y medir su latencia
|
||||
antes de un escaneo mas pesado (traceroute, port scan). Util para verificar
|
||||
conectividad y caracterizar la red de un objetivo en una fase de recon. Guarda
|
||||
`raw` como evidencia en la nota OSINT.
|
||||
|
||||
## Gotchas
|
||||
|
||||
- Funcion impura: envia trafico ICMP a la red. No determinista (latencia varia).
|
||||
- Linux-only: usa la sintaxis `ping -c N -w S` de iputils. En BSD/macOS los
|
||||
flags difieren (`-t` en vez de `-w`) y el parseo podria fallar.
|
||||
- ICMP suele estar **filtrado por firewalls**: un host que SI existe puede no
|
||||
responder a ping. Eso es `status:"ok"` con `loss_pct=100` y rtt None, NO un
|
||||
error. No concluyas "host caido" solo por perdida total.
|
||||
- Requiere el binario `ping` en PATH (paquete `iputils-ping`). Si falta,
|
||||
devuelve `{"status":"error",...}` (no lanza). En algunos sistemas ping
|
||||
necesita capacidad `cap_net_raw` o setuid; si no la tiene puede fallar.
|
||||
- Nunca lanza: errores en `status`. El timeout duro del subprocess es
|
||||
`timeout_s + 5s`; si se alcanza, es `status:"error"`.
|
||||
- `packets_sent`/`packets_recv` pueden ser None si la version de ping emite un
|
||||
resumen con formato inesperado; en ese caso revisa `raw`.
|
||||
Reference in New Issue
Block a user