INSTRUCCIONES GENERALES
1.- HABLAMOS EN CASTELLANO POR DEFECTO.
2.-
Si el usuario sólo te ha enviado el link y es su primer mensaje en ese chat,
probablemente lo haya mandado sin el contenido de los archivos. ES LA IDEA.
La idea es que leas tanto estas instrucciones como el tree del proyecto
para tener el contexto inicial, y en mensajes posteriores te irá enviando
el link con "?inline" y limitaciones de contenido, para enviarte archivos
en texto plano y así evitar que tu parser te lo corte a la mitad, o malgastarte
contexto repitiendo este mensaje y el tree.
(Los parámetros de URL que hay para limitar el contenido están más abajo en este mensaje).
SI NECESITAS EN EL FUTURO RECIBIR CUALQUIER ARCHIVO, O EL TREE O ESTE MENSAJE DE NUEVO,
DALE EL LINK EXACTO QUE QUIERAS VER AL USER, SIEMPRE CON EL PARÁMETRO "INLINE".
Ejemplo: https://wf.r3dshift.com/?inline&i=file.ext&i=dir&x=dir/nope.ext
3.-
Si existe algún summary en "summaries/", léelo para tener más contexto
del proyecto sobre el que el usuario te va a dar instrucciones futuras.
CADA SUMMARY TENDRÁ EL NOMBRE DEL LLM QUE LO GENERÓ, Y PODRÍA ESTAR DESACTUALIZADO (porque
el usuario haya avanzado en el proyecto y no haya actualizado el summary). Pero servirá de contexto aun así.
Si no existe ningún summary, no pasa nada.
CONFIRMA LA RECEPCIÓN DEL CONTEXTO INICIAL EN EL PRIMER MENSAJE, DE LA SIGUIENTE FORMA:
NOMBRE CHAT: YYYY-MM-DD_(Nombre de la carpeta raíz del proyecto)
CONTENIDO LEIDO: (LISTA SÓLO LO QUE HAYAS LEÍDO. ES DECIR:)
- Si el bloque "Para LLMs" aparece -> escribe "Para LLMs"
- Si el bloque "Árbol" aparece -> escribe "Tree"
- SI NO APARECE **EL CONTENIDO** DE UN SUMMARY, AUNQUE APAREZCA EN TREE, NO LO ESCRIBAS!!!!!!!
(NO DIGAS ABSOLUTAMENTE NADA MÁS ANTES NI DESPUÉS EN ESTA PRIMERA RESPUESTA.)
DALE AL CHAT EL MISMO NOMBRE QUE HAS PUESTO EN "NOMBRE CHAT".
EL USUARIO TE DARÁ MÁS INSTRUCCIONES EN BREVE.
PARÁMETROS DE URL DISPONIBLES
Además del filtrado que ya aplica el servidor al arrancar, el LLM
puede controlar qué ve usando parámetros en la URL. Se pueden
combinar varios, y algunos se pueden repetir.
- ?d=directorio -> cambia la raíz efectiva de la petición a ese subdirectorio.
- ?x=directorio/archivo -> excluir del contenido.
- ?i=directorio/archivo -> incluir en el contenido.
- ?tx=directorio/archivo -> excluir del tree (no del contenido).
- ?ext=.extension -> mostrar solo esas extensiones (repetible).
- ?tree (=0) -> no mostrar el tree.
- ?content (=0) -> no mostrar contenido de archivos.
- ?inline (=1) -> servir los archivos como texto plano, sin parsear HTML.
- ?llm (=0) -> ocultar este mensaje inicial.
- ?w (=0) -> modo whitelist en el CONTENIDO: solo lo incluido con ?i=. No afecta al árbol.
Ejemplo: ?ext=.html&ext=.md&tree=0&inline
SOBRE LOS RESÚMENES DE PROGRESO
Esta sección describe CÓMO debes redactar un resumen del
progreso del proyecto SI el usuario te lo pide. NO es una
orden de generar un resumen por iniciativa propia.
REGLA CRÍTICA: NO generes ningún resumen de progreso salvo
que el usuario te lo pida EXPLÍCITAMENTE en el mensaje actual.
Se considera petición explícita si el usuario usa palabras
como: "resumen", "resume", "hazme un resumen", "resumen del
progreso", "summary", "actualiza el resumen", "genera un
resumen". Si no aparecen esas palabras (o equivalentes claros)
en el mensaje del usuario, NO generes resumen: responde
únicamente a lo que te haya pedido.
Cuando SÍ te pida un resumen, tu respuesta debe cumplir estas
reglas sin excepción:
1. El mensaje completo es el resumen. No escribas nada antes del
resumen (ni "Aquí tienes", ni "Claro", ni una introducción) ni nada
después (ni preguntas, ni ofrecimientos, ni despedidas). El primer
carácter de tu respuesta debe ser el primer carácter del resumen.
2. Formato markdown nativo. Escribe directamente en markdown
(encabezados con #, listas con -, negritas con **). No envuelvas
todo en un bloque de código con ```. El resumen debe poder copiarse
entero y pegarse tal cual en un archivo .md.
3. Estructura obligatoria del resumen:
- Un título de nivel 1 con el nombre del proyecto.
- Una sección de contexto (qué es el proyecto, de dónde viene el chat).
- Una sección de features actuales (todo lo que ya funciona).
- Una sección de features restantes, organizadas en bloques
numerados en orden cronológicamente coherente de implementación.
4. No pidas confirmación ni ofrezcas ajustes. El resumen es la
respuesta completa. Si algo falta, el usuario te lo pedirá después
en un mensaje aparte.
#!/usr/bin/env python3
"""Passive packet capture to PCAP; does not modify or forward traffic."""
import argparse
from pathlib import Path
from scapy.all import sniff, PcapWriter
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--iface", required=True)
ap.add_argument("--out", default="capture.pcap")
ap.add_argument("--filter", default="")
ap.add_argument("--count", type=int, default=0, help="0 = until Ctrl-C")
args = ap.parse_args()
Path(args.out).parent.mkdir(parents=True, exist_ok=True)
writer = PcapWriter(args.out, append=False, sync=True)
print(f"Passive capture on {args.iface}; output={args.out}; Ctrl-C to stop")
try:
sniff(iface=args.iface, filter=args.filter or None, count=args.count,
prn=writer.write, store=False)
except KeyboardInterrupt:
pass
finally:
writer.close()
print(f"Saved capture: {args.out}")
if __name__ == "__main__":
main()
./lab_suite/local_http_fixture.py1222 caracteres
#!/usr/bin/env python3
"""Local-only HTTP fixture for testing your own client/parser."""
import argparse
from http.server import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
body = b"local-lab-ok"
self.send_response(200)
self.send_header("Content-Type", "text/plain; charset=utf-8")
self.send_header("Content-Length", str(len(body)))
self.send_header("Cache-Control", "no-store")
self.end_headers()
self.wfile.write(body)
def log_message(self, fmt, *args):
print("%s - %s" % (self.client_address[0], fmt % args))
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--host", default="127.0.0.1",
help="Defaults to localhost; do not expose this fixture to public networks")
ap.add_argument("--port", type=int, default=8088)
args = ap.parse_args()
if args.host not in ("127.0.0.1", "::1", "localhost"):
raise SystemExit("Safety check: fixture must bind to loopback only.")
print(f"Local fixture listening on http://{args.host}:{args.port}")
HTTPServer((args.host, args.port), Handler).serve_forever()
if __name__ == "__main__":
main()
./lab_suite/README.md1558 caracteres
# Switch 2 Network Research Lab (safe, passive/offline)
This suite is designed for authorized observation and **offline** protocol analysis.
It does not spoof Nintendo, bypass TLS, forward console traffic, or transmit mutated
packets to a console. Mutated DNS examples are written to PCAP files for inspection
or testing against a local mock parser that you control.
## Requirements
- Linux
- Python 3.10+
- `pip install -r requirements.txt`
- For live capture: run with sufficient privileges (usually `sudo`).
## Quick start
```bash
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
# Passive capture (replace interface and filter as needed)
sudo .venv/bin/python network_monitor.py --iface wlan0 --out captures/session.pcap \
--filter "host 10.0.0.90"
# Summarize an existing capture
python pcap_analyzer.py captures/session.pcap
# Generate offline DNS mutation corpus as a PCAP (does NOT send it)
python offline_dns_corpus.py --pcap captures/dns-corpus.pcap --count 30
# Start a harmless local HTTP test endpoint, bound to localhost only
python local_http_fixture.py --host 127.0.0.1 --port 8088
```
## Safety boundaries
- Capture only networks/devices you own or are explicitly authorized to test.
- PCAP files may contain identifiers, cookies, tokens, or other sensitive data.
Keep them private; redact before sharing.
- Do not replay generated PCAPs against the Switch or Nintendo infrastructure.
- No certificate interception, credential collection, exploit payloads, or crash-triggering
traffic is implemented.
./lab_suite/offline_dns_corpus.py1571 caracteres
#!/usr/bin/env python3
"""Create a harmless offline DNS response corpus in PCAP format; never transmits."""
import argparse, random
from scapy.all import Ether, IP, UDP, DNS, DNSQR, DNSRR, wrpcap
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--pcap", default="dns-corpus.pcap")
ap.add_argument("--count", type=int, default=30)
ap.add_argument("--seed", type=int, default=7)
args = ap.parse_args()
random.seed(args.seed)
packets = []
qname = "lab.invalid."
for i in range(args.count):
qid = i + 1
base = DNS(id=qid, qr=1, rd=1, ra=1, qd=DNSQR(qname=qname))
mode = i % 6
if mode == 0:
dns = base / DNSRR(rrname=qname, type="A", ttl=60, rdata="192.0.2.10")
elif mode == 1:
dns = base.copy()
dns.tc = 1
dns.ancount = 0
elif mode == 2:
dns = base.copy()
dns.ancount = 0
dns.rcode = 3
elif mode == 3:
dns = base.copy()
dns.ancount = 0
dns.arcount = 0
elif mode == 4:
dns = base / DNSRR(rrname=qname, type="TXT", ttl=1, rdata="offline-test")
else:
dns = base / DNSRR(rrname=qname, type="A", ttl=0, rdata="198.51.100.7")
packets.append(Ether()/IP(src="192.0.2.1", dst="192.0.2.2")/
UDP(sport=53, dport=53000)/dns)
wrpcap(args.pcap, packets)
print(f"Wrote {len(packets)} offline test packets to {args.pcap}; nothing was transmitted.")
if __name__ == "__main__":
main()
./history/a.txt2126 caracteres
## 1. Descargar y descomprimir
Descarga el proyecto:
switch2_network_lab_suite.zip[Switch 2 Network Research Lab](sandbox:/mnt/data/switch2_network_lab_suite.zip)
En Linux:
```bash
unzip switch2_network_lab_suite.zip
cd switch2_lab_suite
```
## 2. Instalar dependencias
```bash
sudo apt update
sudo apt install python3 python3-pip python3-venv -y
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
## 3. Utilizar los scripts
### A. Monitorizar tráfico de red
Primero identifica tu interfaz:
```bash
ip -br addr
```
Inicia la captura (sustituye `wlan0` por tu interfaz):
```bash
sudo .venv/bin/python network_monitor.py \
--iface wlan0 \
--out captures/session.pcap
```
Para detenerla: `CTRL+C`.
### B. Analizar tráfico capturado
```bash
python pcap_analyzer.py captures/session.pcap
```
Obtendrás:
- Protocolos detectados.
- Direcciones IP.
- Puertos.
- Consultas DNS.
- Información TLS SNI visible.
### C. Generar muestras DNS
```bash
python offline_dns_corpus.py \
--pcap captures/dns-corpus.pcap \
--count 100
```
Genera 100 muestras DNS para análisis offline.
### D. Iniciar servidor HTTP local
```bash
python local_http_fixture.py
```
Accede a:
```text
http://127.0.0.1:8088
```
### E. Utilizar el orquestador
Generar muestras:
```bash
python orchestrator.py dns-corpus --count 100
```
Analizar una captura:
```bash
python orchestrator.py analyze captures/session.pcap
```
Iniciar monitorización:
```bash
sudo .venv/bin/python orchestrator.py capture --iface wlan0
```
---
## 4. Flujo de trabajo recomendado
1. Inicia la monitorización.
2. Conecta tu Switch 2 a tu red de laboratorio.
3. Realiza operaciones normales en la consola.
4. Detén la captura.
5. Analiza el PCAP.
6. Identifica protocolos y comportamientos anómalos.
7. Genera corpus offline para estudiar los parsers.
**Nota:** La captura depende de la topología de red y de que tu interfaz pueda observar el tráfico de la consola.
La suite actual es una primera versión de investigación pasiva; todavía no implementa fuzzing automatizado de DNS, NTP, TLS y HTTP contra dispositivos reales.
./lab_suite/pcap_analyzer.py2265 caracteres
#!/usr/bin/env python3
"""Offline PCAP summary: endpoints, DNS names, protocols, and TLS SNI when visible."""
import argparse
from collections import Counter
from scapy.all import rdpcap, IP, IPv6, TCP, UDP, DNS, DNSQR
from scapy.layers.tls.all import TLS, TLSClientHello
def main():
ap = argparse.ArgumentParser()
ap.add_argument("pcap")
ap.add_argument("--top", type=int, default=30)
args = ap.parse_args()
packets = rdpcap(args.pcap)
protocols, endpoints, dns_names, sni_names = Counter(), Counter(), Counter(), Counter()
for p in packets:
ip = p.getlayer(IP) or p.getlayer(IPv6)
if not ip:
protocols["non-IP"] += 1
continue
proto = "TCP" if p.haslayer(TCP) else "UDP" if p.haslayer(UDP) else str(ip.nh if p.haslayer(IPv6) else ip.proto)
protocols[proto] += 1
if p.haslayer(TCP):
t = p[TCP]
endpoints[f"{ip.src}:{t.sport} -> {ip.dst}:{t.dport}"] += 1
elif p.haslayer(UDP):
u = p[UDP]
endpoints[f"{ip.src}:{u.sport} -> {ip.dst}:{u.dport}"] += 1
if p.haslayer(DNS) and p[DNS].qd and isinstance(p[DNS].qd, DNSQR):
q = p[DNS].qd.qname
dns_names[q.decode(errors="replace") if isinstance(q, bytes) else str(q)] += 1
# Scapy TLS dissector may expose SNI on supported ClientHello records.
try:
if p.haslayer(TLSClientHello):
hello = p[TLSClientHello]
for ext in getattr(hello, "ext", []) or []:
names = getattr(ext, "servernames", None)
if names:
for item in names:
name = getattr(item, "servername", b"")
sni_names[name.decode(errors="replace") if isinstance(name, bytes) else str(name)] += 1
except Exception:
pass
print(f"Packets: {len(packets)}")
for title, counter in (("Protocols", protocols), ("Endpoints", endpoints),
("DNS queries", dns_names), ("Visible TLS SNI", sni_names)):
print(f"\\n{title}:")
for key, count in counter.most_common(args.top):
print(f" {count:6} {key}")
if __name__ == "__main__":
main()
./history/chatgpt.txt2523 caracteres
(pentestai.txt) - Necesito scripts que me hagan esto.
He revisado el contenido de tu enlace.
Lo que necesitas es una **suite de herramientas de investigación y fuzzing para Nintendo Switch 2**, utilizando Python y Scapy.
Puedo prepararte estos scripts:
| Script | Funcionalidad |
|---|---|
| `network_monitor.py` | Captura y clasifica el tráfico de la Switch 2. |
| `dns_fuzzer.py` | Genera respuestas DNS con estructuras y longitudes anómalas para probar el parser. |
| `ntp_fuzzer.py` | Prueba el procesamiento de paquetes NTP malformados. |
| `http_fuzzer.py` | Prueba la robustez del procesamiento HTTP. |
| `tls_fuzzer.py` | Comprueba el comportamiento ante respuestas TLS inválidas. |
| `crash_monitor.py` | Monitoriza desconexiones, reinicios y anomalías. |
| `packet_logger.py` | Registra los paquetes enviados y recibidos para reproducir pruebas. |
| `orchestrator.py` | Coordina las pruebas, registra resultados y controla los intervalos. |
### Características
- Python 3.
- Linux.
- Scapy.
- Registro detallado de cada prueba.
- Identificador único por paquete.
- Control de frecuencia de envío.
- Ejecución individual o automatizada.
- Reproducción de pruebas.
- Sin modificar el firmware de la consola.
**Una pregunta:** ¿Quieres que prepare toda la suite integrada, con todos los scripts independientes y un orquestador central, para realizar investigación de vulnerabilidades en tu propia Switch 2?
Suite preparada.
**switch2_network_lab_suite.zip[Descargar Switch 2 Network Research Lab](sandbox:/mnt/data/switch2_network_lab_suite.zip)**
### Contenido
| Archivo | Función |
|---|---|
| `network_monitor.py` | Captura pasiva de tráfico. |
| `pcap_analyzer.py` | Analiza archivos PCAP. |
| `offline_dns_corpus.py` | Genera muestras DNS para análisis offline. |
| `local_http_fixture.py` | Servidor HTTP local de pruebas. |
| `orchestrator.py` | Coordina las herramientas. |
| `requirements.txt` | Dependencias. |
| `README.md` | Instalación y utilización. |
### Instalación
```bash
unzip switch2_network_lab_suite.zip
cd switch2_lab_suite
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
### Importante
Esta primera versión permite observación, análisis y generación offline de muestras de protocolos. No inyecta paquetes malformados en la consola ni modifica su tráfico.
**Siguiente fase:** desarrollar un entorno de fuzzing controlado con corpus, mutaciones, cobertura, detección de anomalías y reproducción de casos, sin poner en riesgo la consola.
./lab_suite/orchestrator.py2552 caracteres
#!/usr/bin/env python3
"""Launcher for passive capture and offline analysis."""
import argparse
import json
import subprocess
import sys
import threading
from collections import Counter
from pathlib import Path
def run(cmd):
print("+", " ".join(cmd), flush=True)
return subprocess.call(cmd)
def show_packet_stats(process):
"""
Lee eventos JSON desde stdout del proceso hijo.
Formato esperado: {"event": "packet_sent", "port": 443}
"""
counts = Counter()
for line in process.stdout:
try:
event = json.loads(line)
except json.JSONDecodeError:
print(line, end="", flush=True)
continue
if event.get("event") != "packet_sent":
continue
port = event.get("port")
if not isinstance(port, int):
continue
counts[port] += 1
status = " | ".join(
f"{port}: {count}"
for port, count in sorted(counts.items())
)
sys.stdout.write(f"\rPaquetes enviados por puerto: {status:<70}")
sys.stdout.flush()
if counts:
print()
def run_with_stats(cmd):
print("+", " ".join(cmd), flush=True)
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=None,
text=True,
bufsize=1,
)
show_packet_stats(process)
return process.wait()
def main():
ap = argparse.ArgumentParser()
sub = ap.add_subparsers(dest="action", required=True)
c = sub.add_parser("capture")
c.add_argument("--iface", required=True)
c.add_argument("--out", default="captures/session.pcap")
c.add_argument("--filter", default="")
a = sub.add_parser("analyze")
a.add_argument("pcap")
d = sub.add_parser("dns-corpus")
d.add_argument("--out", default="captures/dns-corpus.pcap")
d.add_argument("--count", type=int, default=30)
args = ap.parse_args()
py = sys.executable
if args.action == "capture":
return run([
py, "network_monitor.py",
"--iface", args.iface,
"--out", args.out,
"--filter", args.filter,
])
if args.action == "analyze":
return run([py, "pcap_analyzer.py", args.pcap])
if args.action == "dns-corpus":
Path(args.out).parent.mkdir(parents=True, exist_ok=True)
return run([
py, "offline_dns_corpus.py",
"--pcap", args.out,
"--count", str(args.count),
])
if __name__ == "__main__":
raise SystemExit(main())
ò j] _ _ (wk
a E Q @aj
Z
2 5 =) dauthp01lp1ndassrvnintendonet j { { k
a(w E m5 @@
Z E Q @aj
Z
2 5 =) dauthp01lp1ndassrvnintendonet j _ _ (wk
a E Q @ai
Z
2 5 =K .; dauthp01lp1ndassrvnintendonet j { { k
a(w E m6 @?
Z E Q @ai
Z
2 5 =K .; dauthp01lp1ndassrvnintendonet j _ _ (wk
a E Q @ah
Z
Ҕ 5 =θ) dauthp01lp1ndassrvnintendonet j { { k
a(w E m7 @>
Z E Q @ah
Z
Ҕ 5 =θ) dauthp01lp1ndassrvnintendonet j _ _ (wk
a E Q @ag
Z
Ҕ 5 =t.; dauthp01lp1ndassrvnintendonet j { { k
a(w E m8 @=
Z E Q @ag
Z
Ҕ 5 =t.; dauthp01lp1ndassrvnintendonet j) _ _ (wk
a E Q @af
Z
5 =Z) dauthp01lp1ndassrvnintendonet j4 { { k
a(w E m9 @<
Z E Q @af
Z
5 =Z) dauthp01lp1ndassrvnintendonet j _ _ (wk
a E Q @ae
Z
5 =YI.; dauthp01lp1ndassrvnintendonet j { { k
a(w E m: @;
Z E Q @ae
Z
5 =YI.; dauthp01lp1ndassrvnintendonet j _ _ (wk
a E Q @ad
Z
M 5 =) dauthp01lp1ndassrvnintendonet jf _ _ (wk
a E Q @ac
Z
M 5 =.; dauthp01lp1ndassrvnintendonet j * * R}r3 R}r3 j * * R}r3 R}r3 jd
_ _ (wk
a E Q @ab
Z
M 5 =) dauthp01lp1ndassrvnintendonet j
{ { k
a(w E m @
Z E Q @ab
Z
M 5 =) dauthp01lp1ndassrvnintendonet j
_ _ (wk
a E Q @aa
Z
M 5 =.; dauthp01lp1ndassrvnintendonet j
{ { k
a(w E m @
Z E Q @aa
Z
M 5 =.; dauthp01lp1ndassrvnintendonet j * * R}r3 R}r3 j * * R}r3 R}r3 j$ * * R}r3 R}r3 j$ * * R}r3 R}r3 jF * * R}r3 R}r3 jk * * R}r3 R}r3 jUx _ _ (wk
a E Q @a`
Z
5 = dauthp01lp1ndassrvnintendonet jwx { { k
a(w E m @ȯ
Z E Q @a`
Z
5 = dauthp01lp1ndassrvnintendonet jy _ _ (wk
a E Q @a_
Z
5 =Yc1 dauthp01lp1ndassrvnintendonet jy { { k
a(w E m @Ȯ
Z E Q @a_
Z
5 =Yc1 dauthp01lp1ndassrvnintendonet jg _ _ (wk
a E Q @a^
Z
*<