saber: manuales cosechados e indice publico pre-construido
- manuales.py cosecha el --help de las herramientas que no traen man page (ffuf, sqlmap, suite impacket, netexec, hydra...) y lo escribe como markdown en conocimiento/09 - Manuales/. Es la referencia de opciones que la man page no da; complementa el cheatsheet de invocaciones comunes. - indexa.py --publico construye saber-publico.jsonl: glosario + pack de conocimiento con los vectores ya calculados, 100% publico y portable. - busca.py usa ese indice publico como fallback cuando no hay indice personal, asi un clon recien hecho consulta al instante sin reindexar nada. - .gitignore deja pasar saber-publico.jsonl; el personal (saber.jsonl) sigue fuera. - docs/rag.md y el README del pack documentan ambas cosas.
This commit is contained in:
parent
1dfb3513e6
commit
9fa0a40edf
12 changed files with 1206 additions and 45 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -32,6 +32,10 @@ voz/comparativa/
|
||||||
# hacer el asistente, no son datos personales)
|
# hacer el asistente, no son datos personales)
|
||||||
!nucleo/datos/acciones.json
|
!nucleo/datos/acciones.json
|
||||||
!nucleo/datos/_generar.py
|
!nucleo/datos/_generar.py
|
||||||
|
# Excepcion: el indice PUBLICO pre-construido (glosario + pack de conocimiento,
|
||||||
|
# con vectores ya calculados). Es 100 % publico y portable; se sube para que un
|
||||||
|
# clon consulte al instante sin reindexar. El personal (saber.jsonl) sigue fuera.
|
||||||
|
!nucleo/datos/saber-publico.jsonl
|
||||||
|
|
||||||
# Registros y temporales
|
# Registros y temporales
|
||||||
*.log
|
*.log
|
||||||
|
|
|
||||||
30
docs/rag.md
30
docs/rag.md
|
|
@ -2,9 +2,12 @@
|
||||||
|
|
||||||
JARVIS responde desde los apuntes del usuario, no desde lo que el modelo
|
JARVIS responde desde los apuntes del usuario, no desde lo que el modelo
|
||||||
recuerde. Para 668 herramientas de pentesting, recordar sería inventar. Este
|
recuerde. Para 668 herramientas de pentesting, recordar sería inventar. Este
|
||||||
documento explica el método y los resultados; el índice en sí no se publica
|
documento explica el método y los resultados. El índice **personal** (los
|
||||||
—contiene los apuntes, que son privados—, pero el código que lo construye sí
|
apuntes de cada quien) no se publica; sí se publica un índice **público
|
||||||
(`nucleo/saber/`).
|
pre-construido** —glosario de Linux más el pack de metodología y manuales, con
|
||||||
|
los vectores ya calculados (`nucleo/datos/saber-publico.jsonl`)— para que un clon
|
||||||
|
recién hecho consulte al instante, sin repetir el trabajo de indexar. El código
|
||||||
|
que lo construye está entero en `nucleo/saber/`.
|
||||||
|
|
||||||
## Cómo funciona
|
## Cómo funciona
|
||||||
|
|
||||||
|
|
@ -85,17 +88,20 @@ forma de medirlo— sí está; el corpus lo pone cada quien con sus notas.
|
||||||
|
|
||||||
| | En el repo |
|
| | En el repo |
|
||||||
|---|---|
|
|---|---|
|
||||||
| El código: `indexa`, `busca`, `glosario`, `sistema`, `enriquece/` | **sí** |
|
| El código: `indexa`, `busca`, `glosario`, `sistema`, `manuales`, `enriquece/` | **sí** |
|
||||||
| El eval (`enriquece/eval_set.jsonl`) | **sí** |
|
| El eval (`enriquece/eval_set.jsonl`) | **sí** |
|
||||||
| El glosario de tareas de Linux en castellano (`glosario.py`) | **sí** (genérico) |
|
| El glosario de tareas de Linux en castellano (`glosario.py`) | **sí** (genérico) |
|
||||||
| **El pack de metodología** (`saber/conocimiento/`, ~73 docs) | **sí** — limpio y genérico |
|
| **El pack de metodología y manuales** (`saber/conocimiento/`) | **sí** — limpio y genérico |
|
||||||
| El índice (`saber.jsonl`) y sus copias | **no** — los apuntes indexados |
|
| **El índice público pre-construido** (`datos/saber-publico.jsonl`) | **sí** — glosario + pack, con vectores |
|
||||||
|
| El índice personal (`saber.jsonl`) y sus copias | **no** — los apuntes indexados |
|
||||||
| El diario (`diario.jsonl`) | **no** — las conversaciones |
|
| El diario (`diario.jsonl`) | **no** — las conversaciones |
|
||||||
| Lo derivado (`cosecha.jsonl`, `sintesis.jsonl`) | **no** — salen de los apuntes |
|
| Lo derivado (`cosecha.jsonl`, `sintesis.jsonl`) | **no** — salen de los apuntes |
|
||||||
|
|
||||||
Así que un equipo recién clonado, con `indexa.py`, construye un índice **útil sin
|
Así que un equipo recién clonado consulta **al instante**, sin dato privado y sin
|
||||||
ningún dato privado**: las *man pages*, el glosario, y **el pack de metodología**
|
reindexar: el `saber-publico.jsonl` ya trae el glosario y el pack de metodología
|
||||||
(`saber/conocimiento/`) —enumeración, explotación web, shells, privesc, Active
|
—enumeración, explotación web, shells, privesc, Active Directory, cheatsheets— más
|
||||||
Directory, cheatsheets...— con los comandos de verdad. Son apuntes propios estilo
|
los **manuales** de las herramientas que no traen man page (`saber/conocimiento/09
|
||||||
OSCP, scrubeados de hosts, credenciales y rutas. Los apuntes privados del usuario
|
- Manuales/`, cosechados con `manuales.py` de su `--help`). Cuando quiera sumar sus
|
||||||
(su `saber.jsonl`, su diario) siguen fuera; el pack los complementa.
|
propias notas y las *man pages* de su máquina, corre `indexa.py` y pasa a usar su
|
||||||
|
índice personal. Los apuntes privados del usuario (su `saber.jsonl`, su diario)
|
||||||
|
siguen fuera; el pack los complementa.
|
||||||
|
|
|
||||||
449
nucleo/datos/saber-publico.jsonl
Normal file
449
nucleo/datos/saber-publico.jsonl
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -22,18 +22,31 @@ import os
|
||||||
|
|
||||||
AQUI = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
AQUI = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
INDICE = os.path.join(AQUI, "datos", "saber.jsonl")
|
INDICE = os.path.join(AQUI, "datos", "saber.jsonl")
|
||||||
|
# El indice portable que viene en el repo. Se usa tal cual mientras no exista el
|
||||||
|
# personal, para que un clon recien hecho ya sepa de pentesting sin reindexar.
|
||||||
|
INDICE_PUBLICO = os.path.join(AQUI, "datos", "saber-publico.jsonl")
|
||||||
|
|
||||||
_modelo = None
|
_modelo = None
|
||||||
_entradas = None
|
_entradas = None
|
||||||
_matriz = None
|
_matriz = None
|
||||||
|
|
||||||
|
|
||||||
|
def _fuente():
|
||||||
|
"""El indice personal si existe; si no, el publico que trae el repo."""
|
||||||
|
if os.path.exists(INDICE):
|
||||||
|
return INDICE
|
||||||
|
if os.path.exists(INDICE_PUBLICO):
|
||||||
|
return INDICE_PUBLICO
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _carga():
|
def _carga():
|
||||||
global _modelo, _entradas, _matriz
|
global _modelo, _entradas, _matriz
|
||||||
if _entradas is not None:
|
if _entradas is not None:
|
||||||
return _entradas is not False
|
return _entradas is not False
|
||||||
|
|
||||||
if not os.path.exists(INDICE):
|
fuente = _fuente()
|
||||||
|
if not fuente:
|
||||||
_entradas = False
|
_entradas = False
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
@ -41,7 +54,7 @@ def _carga():
|
||||||
from model2vec import StaticModel
|
from model2vec import StaticModel
|
||||||
|
|
||||||
entradas, vectores = [], []
|
entradas, vectores = [], []
|
||||||
with open(INDICE, encoding="utf-8") as f:
|
with open(fuente, encoding="utf-8") as f:
|
||||||
for l in f:
|
for l in f:
|
||||||
try:
|
try:
|
||||||
d = json.loads(l)
|
d = json.loads(l)
|
||||||
|
|
@ -190,4 +203,4 @@ def resumen(tope_temas: int = 10) -> str:
|
||||||
|
|
||||||
|
|
||||||
def disponible() -> bool:
|
def disponible() -> bool:
|
||||||
return os.path.exists(INDICE)
|
return _fuente() is not None
|
||||||
|
|
|
||||||
35
nucleo/saber/conocimiento/09 - Manuales/gobuster.md
Normal file
35
nucleo/saber/conocimiento/09 - Manuales/gobuster.md
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
# gobuster — manual
|
||||||
|
|
||||||
|
Salida de `gobuster --help`, capturada de la propia herramienta. Referencia completa de opciones (las invocaciones del dia a dia estan en el cheatsheet de comandos).
|
||||||
|
|
||||||
|
```
|
||||||
|
Usage:
|
||||||
|
gobuster [command]
|
||||||
|
|
||||||
|
Available Commands:
|
||||||
|
completion Generate the autocompletion script for the specified shell
|
||||||
|
dir Uses directory/file enumeration mode
|
||||||
|
dns Uses DNS subdomain enumeration mode
|
||||||
|
fuzz Uses fuzzing mode. Replaces the keyword FUZZ in the URL, Headers and the request body
|
||||||
|
gcs Uses gcs bucket enumeration mode
|
||||||
|
help Help about any command
|
||||||
|
s3 Uses aws bucket enumeration mode
|
||||||
|
tftp Uses TFTP enumeration mode
|
||||||
|
version shows the current version
|
||||||
|
vhost Uses VHOST enumeration mode (you most probably want to use the IP address as the URL parameter)
|
||||||
|
|
||||||
|
Flags:
|
||||||
|
--delay duration Time each thread waits between requests (e.g. 1500ms)
|
||||||
|
-h, --help help for gobuster
|
||||||
|
--no-color Disable color output
|
||||||
|
--no-error Don't display errors
|
||||||
|
-z, --no-progress Don't display progress
|
||||||
|
-o, --output string Output file to write results to (defaults to stdout)
|
||||||
|
-p, --pattern string File containing replacement patterns
|
||||||
|
-q, --quiet Don't print the banner and other noise
|
||||||
|
-t, --threads int Number of concurrent threads (default 10)
|
||||||
|
-v, --verbose Verbose output (errors)
|
||||||
|
-w, --wordlist string Path to the wordlist
|
||||||
|
|
||||||
|
Use "gobuster [command] --help" for more information about a command.
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
# impacket-secretsdump — manual
|
||||||
|
|
||||||
|
Salida de `impacket-secretsdump -h`, capturada de la propia herramienta. Referencia completa de opciones (las invocaciones del dia a dia estan en el cheatsheet de comandos).
|
||||||
|
|
||||||
|
```
|
||||||
|
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
|
||||||
|
|
||||||
|
usage: secretsdump.py [-h] [-ts] [-debug] [-system SYSTEM] [-bootkey BOOTKEY]
|
||||||
|
[-security SECURITY] [-sam SAM] [-ntds NTDS]
|
||||||
|
[-resumefile RESUMEFILE] [-outputfile OUTPUTFILE]
|
||||||
|
[-use-vss] [-rodcNo RODCNO] [-rodcKey RODCKEY]
|
||||||
|
[-use-keylist]
|
||||||
|
[-exec-method [{smbexec,wmiexec,mmcexec}]]
|
||||||
|
[-just-dc-user USERNAME] [-just-dc] [-just-dc-ntlm]
|
||||||
|
[-pwd-last-set] [-user-status] [-history]
|
||||||
|
[-hashes LMHASH:NTHASH] [-no-pass] [-k]
|
||||||
|
[-aesKey hex key] [-keytab KEYTAB] [-dc-ip ip address]
|
||||||
|
[-target-ip ip address]
|
||||||
|
target
|
||||||
|
|
||||||
|
Performs various techniques to dump secrets from the remote machine without
|
||||||
|
executing any agent there.
|
||||||
|
|
||||||
|
positional arguments:
|
||||||
|
target [[domain/]username[:password]@]<targetName or address>
|
||||||
|
or LOCAL (if you want to parse local files)
|
||||||
|
|
||||||
|
options:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-ts Adds timestamp to every logging output
|
||||||
|
-debug Turn DEBUG output ON
|
||||||
|
-system SYSTEM SYSTEM hive to parse
|
||||||
|
-bootkey BOOTKEY bootkey for SYSTEM hive
|
||||||
|
-security SECURITY SECURITY hive to parse
|
||||||
|
-sam SAM SAM hive to parse
|
||||||
|
-ntds NTDS NTDS.DIT file to parse
|
||||||
|
-resumefile RESUMEFILE
|
||||||
|
resume file name to resume NTDS.DIT session dump (only
|
||||||
|
available to DRSUAPI approach). This file will also be
|
||||||
|
used to keep updating the session's state
|
||||||
|
-outputfile OUTPUTFILE
|
||||||
|
base output filename. Extensions will be added for
|
||||||
|
sam, secrets, cached and ntds
|
||||||
|
-use-vss Use the VSS method instead of default DRSUAPI
|
||||||
|
-rodcNo RODCNO Number of the RODC krbtgt account (only avaiable for
|
||||||
|
Kerb-Key-List approach)
|
||||||
|
-rodcKey RODCKEY AES key of the Read Only Domain Controller (only
|
||||||
|
avaiable for Kerb-Key-List approach)
|
||||||
|
-use-keylist Use the Kerb-Key-List method instead of default
|
||||||
|
DRSUAPI
|
||||||
|
-exec-method [{smbexec,wmiexec,mmcexec}]
|
||||||
|
Remote exec method to use at target (only when using
|
||||||
|
-use-vss). Default: smbexec
|
||||||
|
|
||||||
|
display options:
|
||||||
|
-just-dc-user USERNAME
|
||||||
|
Extract only NTDS.DIT data for the user specified.
|
||||||
|
Only available for DRSUAPI approach. Implies also
|
||||||
|
-just-dc switch
|
||||||
|
-just-dc Extract only NTDS.DIT data (NTLM hashes and Kerberos
|
||||||
|
keys)
|
||||||
|
-just-dc-ntlm Extract only NTDS.DIT data (NTLM hashes only)
|
||||||
|
-pwd-last-set Shows pwdLastSet attribute for each NTDS.DIT account.
|
||||||
|
Doesn't apply to -outputfile data
|
||||||
|
-user-status Display whether or not the user is disabled
|
||||||
|
-history Dump password history, and LSA secrets OldVal
|
||||||
|
|
||||||
|
authentication:
|
||||||
|
-hashes LMHASH:NTHASH
|
||||||
|
NTLM hashes, format is LMHASH:NTHASH
|
||||||
|
-no-pass don't ask for password (useful for -k)
|
||||||
|
-k Use Kerberos authentication. Grabs credentials from
|
||||||
|
ccache file (KRB5CCNAME) based on target parameters.
|
||||||
|
If valid credentials cannot be found, it will use the
|
||||||
|
ones specified in the command line
|
||||||
|
-aesKey hex key AES key to use for Kerberos Authentication (128 or 256
|
||||||
|
bits)
|
||||||
|
-keytab KEYTAB Read keys for SPN from keytab file
|
||||||
|
|
||||||
|
connection:
|
||||||
|
-dc-ip ip address IP Address of the domain controller. If ommited it use
|
||||||
|
the domain part (FQDN) specified in the target
|
||||||
|
parameter
|
||||||
|
-target-ip ip address
|
||||||
|
IP Address of the target machine. If omitted it will
|
||||||
|
use whatever was specified as target. This is useful
|
||||||
|
when target is the NetBIOS name and you cannot resolve
|
||||||
|
it
|
||||||
|
```
|
||||||
61
nucleo/saber/conocimiento/09 - Manuales/impacket-wmiexec.md
Normal file
61
nucleo/saber/conocimiento/09 - Manuales/impacket-wmiexec.md
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
# impacket-wmiexec — manual
|
||||||
|
|
||||||
|
Salida de `impacket-wmiexec -h`, capturada de la propia herramienta. Referencia completa de opciones (las invocaciones del dia a dia estan en el cheatsheet de comandos).
|
||||||
|
|
||||||
|
```
|
||||||
|
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
|
||||||
|
|
||||||
|
usage: wmiexec.py [-h] [-share SHARE] [-nooutput] [-ts] [-silentcommand]
|
||||||
|
[-debug] [-codec CODEC] [-shell-type {cmd,powershell}]
|
||||||
|
[-com-version MAJOR_VERSION:MINOR_VERSION]
|
||||||
|
[-hashes LMHASH:NTHASH] [-no-pass] [-k] [-aesKey hex key]
|
||||||
|
[-dc-ip ip address] [-A authfile] [-keytab KEYTAB]
|
||||||
|
target [command ...]
|
||||||
|
|
||||||
|
Executes a semi-interactive shell using Windows Management Instrumentation.
|
||||||
|
|
||||||
|
positional arguments:
|
||||||
|
target [[domain/]username[:password]@]<targetName or address>
|
||||||
|
command command to execute at the target. If empty it will
|
||||||
|
launch a semi-interactive shell
|
||||||
|
|
||||||
|
options:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-share SHARE share where the output will be grabbed from (default
|
||||||
|
ADMIN$)
|
||||||
|
-nooutput whether or not to print the output (no SMB connection
|
||||||
|
created)
|
||||||
|
-ts Adds timestamp to every logging output
|
||||||
|
-silentcommand does not execute cmd.exe to run given command (no
|
||||||
|
output)
|
||||||
|
-debug Turn DEBUG output ON
|
||||||
|
-codec CODEC Sets encoding used (codec) from the target's output
|
||||||
|
(default "utf-8"). If errors are detected, run
|
||||||
|
chcp.com at the target, map the result with https://do
|
||||||
|
cs.python.org/3/library/codecs.html#standard-encodings
|
||||||
|
and then execute wmiexec.py again with -codec and the
|
||||||
|
corresponding codec
|
||||||
|
-shell-type {cmd,powershell}
|
||||||
|
choose a command processor for the semi-interactive
|
||||||
|
shell
|
||||||
|
-com-version MAJOR_VERSION:MINOR_VERSION
|
||||||
|
DCOM version, format is MAJOR_VERSION:MINOR_VERSION
|
||||||
|
e.g. 5.7
|
||||||
|
|
||||||
|
authentication:
|
||||||
|
-hashes LMHASH:NTHASH
|
||||||
|
NTLM hashes, format is LMHASH:NTHASH
|
||||||
|
-no-pass don't ask for password (useful for -k)
|
||||||
|
-k Use Kerberos authentication. Grabs credentials from
|
||||||
|
ccache file (KRB5CCNAME) based on target parameters.
|
||||||
|
If valid credentials cannot be found, it will use the
|
||||||
|
ones specified in the command line
|
||||||
|
-aesKey hex key AES key to use for Kerberos Authentication (128 or 256
|
||||||
|
bits)
|
||||||
|
-dc-ip ip address IP Address of the domain controller. If ommited it use
|
||||||
|
the domain part (FQDN) specified in the target
|
||||||
|
parameter
|
||||||
|
-A authfile smbclient/mount.cifs-style authentication file. See
|
||||||
|
smbclient man page's -A option.
|
||||||
|
-keytab KEYTAB Read keys for SPN from keytab file
|
||||||
|
```
|
||||||
66
nucleo/saber/conocimiento/09 - Manuales/netexec.md
Normal file
66
nucleo/saber/conocimiento/09 - Manuales/netexec.md
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
# netexec — manual
|
||||||
|
|
||||||
|
Salida de `netexec --help`, capturada de la propia herramienta. Referencia completa de opciones (las invocaciones del dia a dia estan en el cheatsheet de comandos).
|
||||||
|
|
||||||
|
```
|
||||||
|
usage: netexec [-h] [--version] [-t THREADS] [--timeout TIMEOUT]
|
||||||
|
[--jitter INTERVAL] [--no-progress] [--log LOG]
|
||||||
|
[--verbose | --debug] [-6] [--dns-server DNS_SERVER]
|
||||||
|
[--dns-tcp] [--dns-timeout DNS_TIMEOUT]
|
||||||
|
{smb,ftp,ldap,mssql,winrm,nfs,ssh,wmi,vnc,rdp} ...
|
||||||
|
|
||||||
|
. .
|
||||||
|
.| |. _ _ _ _____
|
||||||
|
|| || | \ | | ___ | |_ | ____| __ __ ___ ___
|
||||||
|
\\( )// | \| | / _ \ | __| | _| \ \/ / / _ \ / __|
|
||||||
|
.=[ ]=. | |\ | | __/ | |_ | |___ > < | __/ | (__
|
||||||
|
/ /˙-˙\ \ |_| \_| \___| \__| |_____| /_/\_\ \___| \___|
|
||||||
|
˙ \ / ˙
|
||||||
|
˙ ˙
|
||||||
|
|
||||||
|
The network execution tool
|
||||||
|
Maintained as an open source project by @NeffIsBack, @MJHallenbeck, @_zblurx
|
||||||
|
|
||||||
|
For documentation and usage examples, visit: https://www.netexec.wiki/
|
||||||
|
|
||||||
|
Version : 1.5.1
|
||||||
|
Codename: Yippie-Ki-Yay
|
||||||
|
Commit : 515dccee
|
||||||
|
|
||||||
|
options:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
--verbose enable verbose output
|
||||||
|
--debug enable debug level information
|
||||||
|
|
||||||
|
Generic Options:
|
||||||
|
--version Display nxc version
|
||||||
|
-t THREADS, --threads THREADS
|
||||||
|
set how many concurrent threads to use
|
||||||
|
--timeout TIMEOUT max timeout in seconds of each thread
|
||||||
|
--jitter INTERVAL sets a random delay between each authentication
|
||||||
|
|
||||||
|
Output Options:
|
||||||
|
--no-progress do not displaying progress bar during scan
|
||||||
|
--log LOG export result into a custom file
|
||||||
|
|
||||||
|
DNS:
|
||||||
|
-6 Enable force IPv6
|
||||||
|
--dns-server DNS_SERVER
|
||||||
|
Specify DNS server (default: Use hosts file & System DNS)
|
||||||
|
--dns-tcp Use TCP instead of UDP for DNS queries
|
||||||
|
--dns-timeout DNS_TIMEOUT
|
||||||
|
DNS query timeout in seconds
|
||||||
|
|
||||||
|
Available Protocols:
|
||||||
|
{smb,ftp,ldap,mssql,winrm,nfs,ssh,wmi,vnc,rdp}
|
||||||
|
smb own stuff using SMB
|
||||||
|
ftp own stuff using FTP
|
||||||
|
ldap own stuff using LDAP
|
||||||
|
mssql own stuff using MSSQL
|
||||||
|
winrm own stuff using WINRM
|
||||||
|
nfs own stuff using NFS
|
||||||
|
ssh own stuff using SSH
|
||||||
|
wmi own stuff using WMI
|
||||||
|
vnc own stuff using VNC
|
||||||
|
rdp own stuff using RDP
|
||||||
|
```
|
||||||
249
nucleo/saber/conocimiento/09 - Manuales/nuclei.md
Normal file
249
nucleo/saber/conocimiento/09 - Manuales/nuclei.md
Normal file
|
|
@ -0,0 +1,249 @@
|
||||||
|
# nuclei — manual
|
||||||
|
|
||||||
|
Salida de `nuclei --help`, capturada de la propia herramienta. Referencia completa de opciones (las invocaciones del dia a dia estan en el cheatsheet de comandos).
|
||||||
|
|
||||||
|
```
|
||||||
|
Nuclei is a fast, template based vulnerability scanner focusing
|
||||||
|
on extensive configurability, massive extensibility and ease of use.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
nuclei [flags]
|
||||||
|
|
||||||
|
Flags:
|
||||||
|
TARGET:
|
||||||
|
-u, -target string[] target URLs/hosts to scan
|
||||||
|
-l, -list string path to file containing a list of target URLs/hosts to scan (one per line)
|
||||||
|
-eh, -exclude-hosts string[] hosts to exclude to scan from the input list (ip, cidr, hostname)
|
||||||
|
-resume string resume scan using resume.cfg (clustering will be disabled)
|
||||||
|
-sa, -scan-all-ips scan all the IP's associated with dns record
|
||||||
|
-iv, -ip-version string[] IP version to scan of hostname (4,6) - (default 4)
|
||||||
|
|
||||||
|
TARGET-FORMAT:
|
||||||
|
-im, -input-mode string mode of input file (list, burp, jsonl, yaml, openapi, swagger) (default "list")
|
||||||
|
-ro, -required-only use only required fields in input format when generating requests
|
||||||
|
-sfv, -skip-format-validation skip format validation (like missing vars) when parsing input file
|
||||||
|
|
||||||
|
TEMPLATES:
|
||||||
|
-nt, -new-templates run only new templates added in latest nuclei-templates release
|
||||||
|
-ntv, -new-templates-version string[] run new templates added in specific version
|
||||||
|
-as, -automatic-scan automatic web scan using wappalyzer technology detection to tags mapping
|
||||||
|
-t, -templates string[] list of template or template directory to run (comma-separated, file)
|
||||||
|
-turl, -template-url string[] template url or list containing template urls to run (comma-separated, file)
|
||||||
|
-ai, -prompt string generate and run template using ai prompt
|
||||||
|
-w, -workflows string[] list of workflow or workflow directory to run (comma-separated, file)
|
||||||
|
-wurl, -workflow-url string[] workflow url or list containing workflow urls to run (comma-separated, file)
|
||||||
|
-validate validate the passed templates to nuclei
|
||||||
|
-nss, -no-strict-syntax disable strict syntax check on templates
|
||||||
|
-td, -template-display displays the templates content
|
||||||
|
-tl list all available templates
|
||||||
|
-tgl list all available tags
|
||||||
|
-sign signs the templates with the private key defined in NUCLEI_SIGNATURE_PRIVATE_KEY env variable
|
||||||
|
-code enable loading code protocol-based templates
|
||||||
|
-dut, -disable-unsigned-templates disable running unsigned templates or templates with mismatched signature
|
||||||
|
-esc, -enable-self-contained enable loading self-contained templates
|
||||||
|
-egm, -enable-global-matchers enable loading global matchers templates
|
||||||
|
-file enable loading file templates
|
||||||
|
|
||||||
|
FILTERING:
|
||||||
|
-a, -author string[] templates to run based on authors (comma-separated, file)
|
||||||
|
-tags string[] templates to run based on tags (comma-separated, file)
|
||||||
|
-etags, -exclude-tags string[] templates to exclude based on tags (comma-separated, file)
|
||||||
|
-itags, -include-tags string[] tags to be executed even if they are excluded either by default or configuration
|
||||||
|
-id, -template-id string[] templates to run based on template ids (comma-separated, file, allow-wildcard)
|
||||||
|
-eid, -exclude-id string[] templates to exclude based on template ids (comma-separated, file)
|
||||||
|
-it, -include-templates string[] path to template file or directory to be executed even if they are excluded either by default or configuration
|
||||||
|
-et, -exclude-templates string[] path to template file or directory to exclude (comma-separated, file)
|
||||||
|
-em, -exclude-matchers string[] template matchers to exclude in result
|
||||||
|
-s, -severity value[] templates to run based on severity. Possible values: info, low, medium, high, critical, unknown
|
||||||
|
-es, -exclude-severity value[] templates to exclude based on severity. Possible values: info, low, medium, high, critical, unknown
|
||||||
|
-pt, -type value[] templates to run based on protocol type. Possible values: dns, file, http, headless, tcp, workflow, ssl, websocket, whois, code, javascript
|
||||||
|
-ept, -exclude-type value[] templates to exclude based on protocol type. Possible values: dns, file, http, headless, tcp, workflow, ssl, websocket, whois, code, javascript
|
||||||
|
-tc, -template-condition string[] templates to run based on expression condition
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
-o, -output string output file to write found issues/vulnerabilities
|
||||||
|
-sresp, -store-resp store all request/response passed through nuclei to output directory
|
||||||
|
-srd, -store-resp-dir string store all request/response passed through nuclei to custom directory (default "output")
|
||||||
|
-silent display findings only
|
||||||
|
-nc, -no-color disable output content coloring (ANSI escape codes)
|
||||||
|
-j, -jsonl write output in JSONL(ines) format
|
||||||
|
-irr, -include-rr -omit-raw include request/response pairs in the JSON, JSONL, and Markdown outputs (for findings only) [DEPRECATED use -omit-raw] (default true)
|
||||||
|
-or, -omit-raw omit request/response pairs in the JSON, JSONL, and Markdown outputs (for findings only)
|
||||||
|
-ot, -omit-template omit encoded template in the JSON, JSONL output
|
||||||
|
-nm, -no-meta disable printing result metadata in cli output
|
||||||
|
-ts, -timestamp enables printing timestamp in cli output
|
||||||
|
-rdb, -report-db string nuclei reporting database (always use this to persist report data)
|
||||||
|
-ms, -matcher-status display match failure status
|
||||||
|
-me, -markdown-export string directory to export results in markdown format
|
||||||
|
-se, -sarif-export string file to export results in SARIF format
|
||||||
|
-je, -json-export string file to export results in JSON format
|
||||||
|
-jle, -jsonl-export string file to export results in JSONL(ine) format
|
||||||
|
-rd, -redact string[] redact given list of keys from query parameter, request header and body
|
||||||
|
|
||||||
|
CONFIGURATIONS:
|
||||||
|
-config string path to the nuclei configuration file
|
||||||
|
-tp, -profile string template profile config file to run
|
||||||
|
-tpl, -profile-list list community template profiles
|
||||||
|
-fr, -follow-redirects enable following redirects for http templates
|
||||||
|
-fhr, -follow-host-redirects follow redirects on the same host
|
||||||
|
-mr, -max-redirects int max number of redirects to follow for http templates (default 10)
|
||||||
|
-dr, -disable-redirects disable redirects for http templates
|
||||||
|
-rc, -report-config string nuclei reporting module configuration file
|
||||||
|
-H, -header string[] custom header/cookie to include in all http request in header:value format (cli, file)
|
||||||
|
-V, -var value custom vars in key=value format
|
||||||
|
-r, -resolvers string file containing resolver list for nuclei
|
||||||
|
-sr, -system-resolvers use system DNS resolving as error fallback
|
||||||
|
-dc, -disable-clustering disable clustering of requests
|
||||||
|
-passive enable passive HTTP response processing mode
|
||||||
|
-fh2, -force-http2 force http2 connection on requests
|
||||||
|
-ev, -env-vars enable environment variables to be used in template
|
||||||
|
-cc, -client-cert string client certificate file (PEM-encoded) used for authenticating against scanned hosts
|
||||||
|
-ck, -client-key string client key file (PEM-encoded) used for authenticating against scanned hosts
|
||||||
|
-ca, -client-ca string client certificate authority file (PEM-encoded) used for authenticating against scanned hosts
|
||||||
|
-sml, -show-match-line show match lines for file templates, works with extractors only
|
||||||
|
-ztls use ztls library with autofallback to standard one for tls13 [Deprecated] autofallback to ztls is enabled by default
|
||||||
|
-sni string tls sni hostname to use (default: input domain name)
|
||||||
|
-dka, -dialer-keep-alive value keep-alive duration for network requests.
|
||||||
|
-lfa, -allow-local-file-access allows file (payload) access anywhere on the system
|
||||||
|
-lna, -restrict-local-network-access blocks connections to the local / private network
|
||||||
|
-i, -interface string network interface to use for network scan
|
||||||
|
-at, -attack-type string type of payload combinations to perform (batteringram,pitchfork,clusterbomb)
|
||||||
|
-sip, -source-ip string source ip address to use for network scan
|
||||||
|
-rsr, -response-size-read int max response size to read in bytes
|
||||||
|
-rss, -response-size-save int max response size to read in bytes (default 1048576)
|
||||||
|
-reset reset removes all nuclei configuration and data files (including nuclei-templates)
|
||||||
|
-tlsi, -tls-impersonate enable experimental client hello (ja3) tls randomization
|
||||||
|
-hae, -http-api-endpoint string experimental http api endpoint
|
||||||
|
|
||||||
|
INTERACTSH:
|
||||||
|
-iserver, -interactsh-server string interactsh server url for self-hosted instance (default: oast.pro,oast.live,oast.site,oast.online,oast.fun,oast.me)
|
||||||
|
-itoken, -interactsh-token string authentication token for self-hosted interactsh server
|
||||||
|
-interactions-cache-size int number of requests to keep in the interactions cache (default 5000)
|
||||||
|
-interactions-eviction int number of seconds to wait before evicting requests from cache (default 60)
|
||||||
|
-interactions-poll-duration int number of seconds to wait before each interaction poll request (default 5)
|
||||||
|
-interactions-cooldown-period int extra time for interaction polling before exiting (default 5)
|
||||||
|
-ni, -no-interactsh disable interactsh server for OAST testing, exclude OAST based templates
|
||||||
|
|
||||||
|
FUZZING:
|
||||||
|
-ft, -fuzzing-type string overrides fuzzing type set in template (replace, prefix, postfix, infix)
|
||||||
|
-fm, -fuzzing-mode string overrides fuzzing mode set in template (multiple, single)
|
||||||
|
-fuzz enable loading fuzzing templates (Deprecated: use -dast instead)
|
||||||
|
-dast enable / run dast (fuzz) nuclei templates
|
||||||
|
-dts, -dast-server enable dast server mode (live fuzzing)
|
||||||
|
-dtr, -dast-report write dast scan report to file
|
||||||
|
-dtst, -dast-server-token string dast server token (optional)
|
||||||
|
-dtsa, -dast-server-address string dast server address (default "localhost:9055")
|
||||||
|
-dfp, -display-fuzz-points display fuzz points in the output for debugging
|
||||||
|
-fuzz-param-frequency int frequency of uninteresting parameters for fuzzing before skipping (default 10)
|
||||||
|
-fa, -fuzz-aggression string fuzzing aggression level controls payload count for fuzz (low, medium, high) (default "low")
|
||||||
|
-cs, -fuzz-scope string[] in scope url regex to be followed by fuzzer
|
||||||
|
-cos, -fuzz-out-scope string[] out of scope url regex to be excluded by fuzzer
|
||||||
|
|
||||||
|
UNCOVER:
|
||||||
|
-uc, -uncover enable uncover engine
|
||||||
|
-uq, -uncover-query string[] uncover search query
|
||||||
|
-ue, -uncover-engine string[] uncover search engine (shodan,censys,fofa,shodan-idb,quake,hunter,zoomeye,netlas,criminalip,publicwww,hunterhow,google,odin,binaryedge) (default shodan)
|
||||||
|
-uf, -uncover-field string uncover fields to return (ip,port,host) (default "ip:port")
|
||||||
|
-ul, -uncover-limit int uncover results to return (default 100)
|
||||||
|
-ur, -uncover-ratelimit int override ratelimit of engines with unknown ratelimit (default 60 req/min) (default 60)
|
||||||
|
|
||||||
|
RATE-LIMIT:
|
||||||
|
-rl, -rate-limit int maximum number of requests to send per second (default 150)
|
||||||
|
-rld, -rate-limit-duration value maximum number of requests to send per second (default 1s)
|
||||||
|
-rlm, -rate-limit-minute int maximum number of requests to send per minute (DEPRECATED)
|
||||||
|
-bs, -bulk-size int maximum number of hosts to be analyzed in parallel per template (default 25)
|
||||||
|
-c, -concurrency int maximum number of templates to be executed in parallel (default 25)
|
||||||
|
-hbs, -headless-bulk-size int maximum number of headless hosts to be analyzed in parallel per template (default 10)
|
||||||
|
-headc, -headless-concurrency int maximum number of headless templates to be executed in parallel (default 10)
|
||||||
|
-jsc, -js-concurrency int maximum number of javascript runtimes to be executed in parallel (default 120)
|
||||||
|
-pc, -payload-concurrency int max payload concurrency for each template (default 25)
|
||||||
|
-prc, -probe-concurrency int http probe concurrency with httpx (default 50)
|
||||||
|
|
||||||
|
OPTIMIZATIONS:
|
||||||
|
-timeout int time to wait in seconds before timeout (default 10)
|
||||||
|
-retries int number of times to retry a failed request (default 1)
|
||||||
|
-ldp, -leave-default-ports leave default HTTP/HTTPS ports (eg. host:80,host:443)
|
||||||
|
-mhe, -max-host-error int max errors for a host before skipping from scan (default 30)
|
||||||
|
-te, -track-error string[] adds given error to max-host-error watchlist (standard, file)
|
||||||
|
-nmhe, -no-mhe disable skipping host from scan based on errors
|
||||||
|
-project use a project folder to avoid sending same request multiple times
|
||||||
|
-project-path string set a specific project path (default "/tmp")
|
||||||
|
-spm, -stop-at-first-match stop processing HTTP requests after the first match (may break template/workflow logic)
|
||||||
|
-stream stream mode - start elaborating without sorting the input
|
||||||
|
-ss, -scan-strategy value strategy to use while scanning(auto/host-spray/template-spray) (default auto)
|
||||||
|
-irt, -input-read-timeout value timeout on input read (default 3m0s)
|
||||||
|
-nh, -no-httpx disable httpx probing for non-url input
|
||||||
|
-no-stdin disable stdin processing
|
||||||
|
|
||||||
|
HEADLESS:
|
||||||
|
-headless enable templates that require headless browser support (root user on Linux will disable sandbox)
|
||||||
|
-page-timeout int seconds to wait for each page in headless mode (default 20)
|
||||||
|
-sb, -show-browser show the browser on the screen when running templates with headless mode
|
||||||
|
-ho, -headless-options string[] start headless chrome with additional options
|
||||||
|
-sc, -system-chrome use local installed Chrome browser instead of nuclei installed
|
||||||
|
-lha, -list-headless-action list available headless actions
|
||||||
|
|
||||||
|
DEBUG:
|
||||||
|
-debug show all requests and responses
|
||||||
|
-dreq, -debug-req show all sent requests
|
||||||
|
-dresp, -debug-resp show all received responses
|
||||||
|
-p, -proxy string[] list of http/socks5 proxy to use (comma separated or file input)
|
||||||
|
-pi, -proxy-internal proxy all internal requests
|
||||||
|
-ldf, -list-dsl-function list all supported DSL function signatures
|
||||||
|
-tlog, -trace-log string file to write sent requests trace log
|
||||||
|
-elog, -error-log string file to write sent requests error log
|
||||||
|
-version show nuclei version
|
||||||
|
-hm, -hang-monitor enable nuclei hang monitoring
|
||||||
|
-v, -verbose show verbose output
|
||||||
|
-profile-mem string generate memory (heap) profile & trace files
|
||||||
|
-vv display templates loaded for scan
|
||||||
|
-svd, -show-var-dump show variables dump for debugging
|
||||||
|
-vdl, -var-dump-limit int limit the number of characters displayed in var dump (default 255)
|
||||||
|
-ep, -enable-pprof enable pprof debugging server
|
||||||
|
-tv, -templates-version shows the version of the installed nuclei-templates
|
||||||
|
-hc, -health-check run diagnostic check up
|
||||||
|
|
||||||
|
UPDATE:
|
||||||
|
-up, -update update nuclei engine to the latest released version
|
||||||
|
-ut, -update-templates update nuclei-templates to latest released version
|
||||||
|
-ud, -update-template-dir string custom directory to install / update nuclei-templates
|
||||||
|
-duc, -disable-update-check disable automatic nuclei/templates update check
|
||||||
|
|
||||||
|
STATISTICS:
|
||||||
|
-stats display statistics about the running scan
|
||||||
|
-sj, -stats-json display statistics in JSONL(ines) format
|
||||||
|
-si, -stats-interval int number of seconds to wait between showing a statistics update (default 5)
|
||||||
|
-mp, -metrics-port int port to expose nuclei metrics on (default 9092)
|
||||||
|
-hps, -http-stats enable http status capturing (experimental)
|
||||||
|
|
||||||
|
CLOUD:
|
||||||
|
-auth configure projectdiscovery cloud (pdcp) api key (default true)
|
||||||
|
-tid, -team-id string upload scan results to given team id (optional) (default "none")
|
||||||
|
-cup, -cloud-upload upload scan results to pdcp dashboard [DEPRECATED use -dashboard]
|
||||||
|
-sid, -scan-id string upload scan results to existing scan id (optional)
|
||||||
|
-sname, -scan-name string scan name to set (optional)
|
||||||
|
-pd, -dashboard upload / view nuclei results in projectdiscovery cloud (pdcp) UI dashboard
|
||||||
|
-pdu, -dashboard-upload string upload / view nuclei results file (jsonl) in projectdiscovery cloud (pdcp) UI dashboard
|
||||||
|
|
||||||
|
AUTHENTICATION:
|
||||||
|
-sf, -secret-file string[] path to config file containing secrets for nuclei authenticated scan
|
||||||
|
-ps, -prefetch-secrets prefetch secrets from the secrets file
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
Run nuclei on single host:
|
||||||
|
$ nuclei -target example.com
|
||||||
|
|
||||||
|
Run nuclei with specific template directories:
|
||||||
|
$ nuclei -target example.com -t http/cves/ -t ssl
|
||||||
|
|
||||||
|
Run nuclei against a list of hosts:
|
||||||
|
$ nuclei -list hosts.txt
|
||||||
|
|
||||||
|
Run nuclei with a JSON output:
|
||||||
|
$ nuclei -target example.com -json-export output.json
|
||||||
|
|
||||||
|
Run nuclei with sorted Markdown outputs (with environment variables):
|
||||||
|
$ MARKDOWN_EXPORT_SORT_MODE=template nuclei -target example.com -markdown-export nuclei_report/
|
||||||
|
|
||||||
|
Additional documentation is available at: https://docs.nuclei.sh/getting-started/running
|
||||||
|
```
|
||||||
|
|
@ -10,6 +10,15 @@ con los comandos que se usan de verdad. Usan marcadores como `TU_IP` en vez de
|
||||||
direcciones reales; están limpios de datos personales (sin hosts, credenciales,
|
direcciones reales; están limpios de datos personales (sin hosts, credenciales,
|
||||||
rutas ni referencias privadas).
|
rutas ni referencias privadas).
|
||||||
|
|
||||||
|
`06 - Cheatsheets/Comandos de herramientas.md` reúne las invocaciones más usadas
|
||||||
|
de las herramientas que no traen man page (ffuf, sqlmap, la suite impacket,
|
||||||
|
netexec, hydra, evil-winrm...). `09 - Manuales/` va un paso más allá: es la salida
|
||||||
|
de `--help` de esas mismas herramientas, cosechada con `../manuales.py` de la
|
||||||
|
propia herramienta instalada y limpia de rutas. Entre las dos cosas —la
|
||||||
|
invocación común y la referencia completa de opciones— el modelo tiene el manual
|
||||||
|
que la man page no da. Si instalas una herramienta más, corre `manuales.py` y
|
||||||
|
manda el `.md` nuevo: es un buen commit.
|
||||||
|
|
||||||
Es la parte del RAG que SÍ se publica: el conocimiento genérico. Los apuntes
|
Es la parte del RAG que SÍ se publica: el conocimiento genérico. Los apuntes
|
||||||
personales del usuario (su `saber.jsonl`, su diario) no se suben —ver
|
personales del usuario (su `saber.jsonl`, su diario) no se suben —ver
|
||||||
[../../../PRIVACIDAD.md](../../../PRIVACIDAD.md)—; este pack los complementa, y en
|
[../../../PRIVACIDAD.md](../../../PRIVACIDAD.md)—; este pack los complementa, y en
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,10 @@ import sys
|
||||||
AQUI = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
AQUI = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
COFRE = os.path.expanduser("~/COFRE")
|
COFRE = os.path.expanduser("~/COFRE")
|
||||||
INDICE = os.path.join(AQUI, "datos", "saber.jsonl")
|
INDICE = os.path.join(AQUI, "datos", "saber.jsonl")
|
||||||
|
# El indice PUBLICO y portable: solo glosario + pack de conocimiento, sin nada de
|
||||||
|
# la maquina (ni COFRE, ni man pages, ni servidores). Se commitea con vectores ya
|
||||||
|
# calculados para que un clon recien hecho consulte al instante, sin reindexar.
|
||||||
|
INDICE_PUBLICO = os.path.join(AQUI, "datos", "saber-publico.jsonl")
|
||||||
|
|
||||||
# Los perfiles que se indexan. Cada uno es una carpeta de ~/COFRE.
|
# Los perfiles que se indexan. Cada uno es una carpeta de ~/COFRE.
|
||||||
PERFILES = ["PENTESTERS", "PHISHERS", "REVERSERS", "PROTECTORS", "HARD-WARERS",
|
PERFILES = ["PENTESTERS", "PHISHERS", "REVERSERS", "PROTECTORS", "HARD-WARERS",
|
||||||
|
|
@ -145,6 +149,66 @@ def trocea(ruta):
|
||||||
yield buffer.strip()
|
yield buffer.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def _conocimiento():
|
||||||
|
"""El pack de metodologia y manuales que viene con el repo (conocimiento/)."""
|
||||||
|
fragmentos = []
|
||||||
|
base_con = os.path.join(os.path.dirname(os.path.abspath(__file__)), "conocimiento")
|
||||||
|
if not os.path.isdir(base_con):
|
||||||
|
return fragmentos
|
||||||
|
for raiz, _, ficheros in os.walk(base_con):
|
||||||
|
m = re.match(r"^\d{2}\s*-\s*(.+)$", os.path.basename(raiz))
|
||||||
|
tema = m.group(1).strip().lower() if m else ""
|
||||||
|
for fich in ficheros:
|
||||||
|
if not fich.endswith(".md"):
|
||||||
|
continue
|
||||||
|
for trozo in trocea(os.path.join(raiz, fich)):
|
||||||
|
fragmentos.append({
|
||||||
|
"tipo": "metodologia", "herramienta": fich[:-3],
|
||||||
|
"perfil": "PENTESTERS", "tema": tema,
|
||||||
|
"fichero": os.path.join("conocimiento", os.path.relpath(
|
||||||
|
os.path.join(raiz, fich), base_con)),
|
||||||
|
"texto": trozo})
|
||||||
|
return fragmentos
|
||||||
|
|
||||||
|
|
||||||
|
def _guarda_indice(todo, ruta):
|
||||||
|
"""Calcula los vectores de las entradas y las escribe a un indice jsonl."""
|
||||||
|
print(" cargando el modelo de embeddings...", flush=True)
|
||||||
|
from model2vec import StaticModel
|
||||||
|
modelo = StaticModel.from_pretrained("minishlab/potion-multilingual-128M")
|
||||||
|
|
||||||
|
print(" calculando vectores...", flush=True)
|
||||||
|
vectores = modelo.encode([e["texto"] for e in todo], show_progress_bar=False)
|
||||||
|
|
||||||
|
os.makedirs(os.path.dirname(ruta), exist_ok=True)
|
||||||
|
with open(ruta, "w", encoding="utf-8") as f:
|
||||||
|
for entrada, vec in zip(todo, vectores):
|
||||||
|
entrada["v"] = [round(float(x), 5) for x in vec]
|
||||||
|
f.write(json.dumps(entrada, ensure_ascii=False) + "\n")
|
||||||
|
print(f" indice guardado: {ruta} ({os.path.getsize(ruta)//1024} KB)")
|
||||||
|
|
||||||
|
|
||||||
|
def construye_publico(solo_cuenta=False):
|
||||||
|
"""El indice PORTABLE que se sube al repo: glosario + pack de conocimiento.
|
||||||
|
|
||||||
|
Nada de la maquina —ni COFRE, ni man pages, ni servidores SSH—, asi que es
|
||||||
|
100 % publico y vale igual en cualquier equipo. Un clon lo usa tal cual hasta
|
||||||
|
que corre su propio indexa.py; asi el trabajo de indexar el pack no se repite.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
from saber import glosario
|
||||||
|
except ImportError:
|
||||||
|
import glosario
|
||||||
|
glo = list(glosario.entradas())
|
||||||
|
con = _conocimiento()
|
||||||
|
todo = glo + con
|
||||||
|
print(f" glosario {len(glo)} + conocimiento {len(con)} = {len(todo)} entradas publicas")
|
||||||
|
if solo_cuenta:
|
||||||
|
return 0
|
||||||
|
_guarda_indice(todo, INDICE_PUBLICO)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def construye(solo_cuenta=False, solo_cofre=False):
|
def construye(solo_cuenta=False, solo_cofre=False):
|
||||||
fichas, fragmentos = [], []
|
fichas, fragmentos = [], []
|
||||||
|
|
||||||
|
|
@ -195,23 +259,8 @@ def construye(solo_cuenta=False, solo_cofre=False):
|
||||||
# esta scrubeado, asi que un clon recien hecho —sin apuntes propios de COFRE—
|
# esta scrubeado, asi que un clon recien hecho —sin apuntes propios de COFRE—
|
||||||
# ya sabe de pentesting. En la maquina del usuario se solapa con sus apuntes
|
# ya sabe de pentesting. En la maquina del usuario se solapa con sus apuntes
|
||||||
# y el deduplicado de busca lo colapsa.
|
# y el deduplicado de busca lo colapsa.
|
||||||
conocimiento = []
|
conocimiento = _conocimiento()
|
||||||
base_con = os.path.join(os.path.dirname(os.path.abspath(__file__)), "conocimiento")
|
print(f" CONOCIMIENTO {len(conocimiento):5d} fragmentos (pack del repo)")
|
||||||
if os.path.isdir(base_con):
|
|
||||||
for raiz, _, ficheros in os.walk(base_con):
|
|
||||||
m = re.match(r"^\d{2}\s*-\s*(.+)$", os.path.basename(raiz))
|
|
||||||
tema = m.group(1).strip().lower() if m else ""
|
|
||||||
for fich in ficheros:
|
|
||||||
if not fich.endswith(".md"):
|
|
||||||
continue
|
|
||||||
for trozo in trocea(os.path.join(raiz, fich)):
|
|
||||||
conocimiento.append({
|
|
||||||
"tipo": "metodologia", "herramienta": fich[:-3],
|
|
||||||
"perfil": "PENTESTERS", "tema": tema,
|
|
||||||
"fichero": os.path.join("conocimiento", os.path.relpath(
|
|
||||||
os.path.join(raiz, fich), base_con)),
|
|
||||||
"texto": trozo})
|
|
||||||
print(f" CONOCIMIENTO {len(conocimiento):5d} fragmentos (pack del repo)")
|
|
||||||
|
|
||||||
todo = fichas + fragmentos + sistema + conocimiento
|
todo = fichas + fragmentos + sistema + conocimiento
|
||||||
print(f"\n total: {len(fichas)} fichas + {len(fragmentos)} apuntes + "
|
print(f"\n total: {len(fichas)} fichas + {len(fragmentos)} apuntes + "
|
||||||
|
|
@ -219,19 +268,7 @@ def construye(solo_cuenta=False, solo_cofre=False):
|
||||||
if solo_cuenta:
|
if solo_cuenta:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
print(" cargando el modelo de embeddings...", flush=True)
|
_guarda_indice(todo, INDICE)
|
||||||
from model2vec import StaticModel
|
|
||||||
modelo = StaticModel.from_pretrained("minishlab/potion-multilingual-128M")
|
|
||||||
|
|
||||||
print(" calculando vectores...", flush=True)
|
|
||||||
vectores = modelo.encode([e["texto"] for e in todo], show_progress_bar=False)
|
|
||||||
|
|
||||||
os.makedirs(os.path.dirname(INDICE), exist_ok=True)
|
|
||||||
with open(INDICE, "w", encoding="utf-8") as f:
|
|
||||||
for entrada, vec in zip(todo, vectores):
|
|
||||||
entrada["v"] = [round(float(x), 5) for x in vec]
|
|
||||||
f.write(json.dumps(entrada, ensure_ascii=False) + "\n")
|
|
||||||
print(f" indice guardado: {INDICE} ({os.path.getsize(INDICE)//1024} KB)")
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -246,7 +283,11 @@ def main() -> int:
|
||||||
help="di que encontrarias, sin indexar")
|
help="di que encontrarias, sin indexar")
|
||||||
p.add_argument("--solo-cofre", action="store_true",
|
p.add_argument("--solo-cofre", action="store_true",
|
||||||
help="indexar solo COFRE, sin la documentacion del sistema")
|
help="indexar solo COFRE, sin la documentacion del sistema")
|
||||||
|
p.add_argument("--publico", action="store_true",
|
||||||
|
help="construir el indice portable (glosario + conocimiento) que se sube al repo")
|
||||||
a = p.parse_args()
|
a = p.parse_args()
|
||||||
|
if a.publico:
|
||||||
|
return construye_publico(solo_cuenta=a.cuenta)
|
||||||
return construye(solo_cuenta=a.cuenta, solo_cofre=a.solo_cofre)
|
return construye(solo_cuenta=a.cuenta, solo_cofre=a.solo_cofre)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
139
nucleo/saber/manuales.py
Normal file
139
nucleo/saber/manuales.py
Normal file
|
|
@ -0,0 +1,139 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Cosecha el manual de las herramientas que no traen man page.
|
||||||
|
|
||||||
|
./manuales.py regenera conocimiento/09 - Manuales/
|
||||||
|
./manuales.py --lista di que herramientas cosecharia y cuales estan
|
||||||
|
|
||||||
|
Muchas herramientas de pentesting (ffuf, sqlmap, la suite impacket, netexec...)
|
||||||
|
no instalan man page: su "manual" es lo que sueltan con --help. Este script lo
|
||||||
|
captura, lo limpia de rutas y datos de la maquina, y lo escribe como markdown en
|
||||||
|
el pack de conocimiento, donde indexa.py lo recoge como todo lo demas.
|
||||||
|
|
||||||
|
Solo cosecha lo que ESTA instalado en la maquina. El resultado (los .md) se
|
||||||
|
commitea, asi que crece con lo que cada quien tenga: quien instale una
|
||||||
|
herramienta mas, regenera y manda el .md nuevo. Es el complemento verificado del
|
||||||
|
cheatsheet escrito a mano (que da las invocaciones comunes; esto da la lista
|
||||||
|
completa de opciones).
|
||||||
|
"""
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
AQUI = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
DESTINO = os.path.join(AQUI, "conocimiento", "09 - Manuales")
|
||||||
|
|
||||||
|
# Las herramientas cuyo manual vale la pena y que no suelen traer man page.
|
||||||
|
# (comando, [argumentos para pedir la ayuda]). Se prueban en orden hasta que una
|
||||||
|
# devuelva algo con sustancia.
|
||||||
|
CATALOGO = [
|
||||||
|
("ffuf", ["-h"]),
|
||||||
|
("feroxbuster", ["--help"]),
|
||||||
|
("gobuster", ["--help"]),
|
||||||
|
("sqlmap", ["-hh"]),
|
||||||
|
("nuclei", ["-h"]),
|
||||||
|
("hydra", ["-h"]),
|
||||||
|
("netexec", ["--help"]),
|
||||||
|
("crackmapexec", ["--help"]),
|
||||||
|
("evil-winrm", ["--help"]),
|
||||||
|
("john", []), # john sin args ya imprime el uso
|
||||||
|
("hashcat", ["--help"]),
|
||||||
|
("wpscan", ["--help"]),
|
||||||
|
("nikto", ["-Help"]),
|
||||||
|
("smbmap", ["-h"]),
|
||||||
|
("enum4linux-ng", ["-h"]),
|
||||||
|
("wfuzz", ["-h"]),
|
||||||
|
("dirsearch", ["-h"]),
|
||||||
|
("responder", ["-h"]),
|
||||||
|
("chisel", ["--help"]),
|
||||||
|
("ligolo-proxy", ["-h"]),
|
||||||
|
("bloodhound-python", ["-h"]),
|
||||||
|
("certipy", ["-h"]),
|
||||||
|
("kerbrute", ["-h"]),
|
||||||
|
# La suite impacket: cada binario es una herramienta.
|
||||||
|
("impacket-secretsdump", ["-h"]),
|
||||||
|
("impacket-GetUserSPNs", ["-h"]),
|
||||||
|
("impacket-GetNPUsers", ["-h"]),
|
||||||
|
("impacket-getTGT", ["-h"]),
|
||||||
|
("impacket-psexec", ["-h"]),
|
||||||
|
("impacket-wmiexec", ["-h"]),
|
||||||
|
("impacket-smbexec", ["-h"]),
|
||||||
|
("impacket-smbserver", ["-h"]),
|
||||||
|
("impacket-mssqlclient", ["-h"]),
|
||||||
|
("impacket-ntlmrelayx", ["-h"]),
|
||||||
|
]
|
||||||
|
|
||||||
|
ANSI = re.compile(r"\x1b\[[0-9;]*[A-Za-z]")
|
||||||
|
CASA = re.compile(re.escape(os.path.expanduser("~")))
|
||||||
|
USUARIO = re.compile(re.escape(os.environ.get("USER", "\0nadie\0")))
|
||||||
|
|
||||||
|
|
||||||
|
def limpia(texto):
|
||||||
|
"""Quita colores y cualquier rastro de la maquina de esta cosecha."""
|
||||||
|
texto = ANSI.sub("", texto)
|
||||||
|
texto = CASA.sub("~", texto) # /home/quien-sea -> ~
|
||||||
|
texto = USUARIO.sub("usuario", texto) # el login real -> generico
|
||||||
|
texto = re.sub(r"[ \t]+\n", "\n", texto) # espacios al final de linea
|
||||||
|
texto = re.sub(r"\n{3,}", "\n\n", texto) # como mucho una linea en blanco
|
||||||
|
return texto.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def ayuda(cmd, args):
|
||||||
|
"""La salida de ayuda de una herramienta, o None si no dice nada util."""
|
||||||
|
if not shutil.which(cmd):
|
||||||
|
return None
|
||||||
|
for intento in (args, ["--help"], ["-h"], []):
|
||||||
|
try:
|
||||||
|
r = subprocess.run([cmd, *intento], capture_output=True, text=True,
|
||||||
|
timeout=15, errors="ignore")
|
||||||
|
except (subprocess.TimeoutExpired, OSError):
|
||||||
|
continue
|
||||||
|
salida = (r.stdout or "") + (r.stderr or "")
|
||||||
|
salida = limpia(salida)
|
||||||
|
if len(salida) >= 120: # menos que esto no es un manual
|
||||||
|
return salida
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def escribe(cmd, texto):
|
||||||
|
md = (f"# {cmd} — manual\n\n"
|
||||||
|
f"Salida de `{cmd} {'--help' if not cmd.startswith('impacket') else '-h'}`, "
|
||||||
|
f"capturada de la propia herramienta. Referencia completa de opciones "
|
||||||
|
f"(las invocaciones del dia a dia estan en el cheatsheet de comandos).\n\n"
|
||||||
|
f"```\n{texto}\n```\n")
|
||||||
|
os.makedirs(DESTINO, exist_ok=True)
|
||||||
|
ruta = os.path.join(DESTINO, f"{cmd}.md")
|
||||||
|
with open(ruta, "w", encoding="utf-8") as f:
|
||||||
|
f.write(md)
|
||||||
|
return ruta
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
p = argparse.ArgumentParser()
|
||||||
|
p.add_argument("--lista", action="store_true",
|
||||||
|
help="di que cosecharia y que hay instalado, sin escribir")
|
||||||
|
a = p.parse_args()
|
||||||
|
|
||||||
|
if a.lista:
|
||||||
|
for cmd, _ in CATALOGO:
|
||||||
|
hay = "instalada" if shutil.which(cmd) else "-"
|
||||||
|
print(f" {cmd:26s} {hay}")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
hechos = faltan = 0
|
||||||
|
for cmd, args in CATALOGO:
|
||||||
|
texto = ayuda(cmd, args)
|
||||||
|
if texto is None:
|
||||||
|
faltan += 1
|
||||||
|
continue
|
||||||
|
ruta = escribe(cmd, texto)
|
||||||
|
print(f" {cmd:26s} -> {os.path.relpath(ruta, AQUI)} ({len(texto)} car.)")
|
||||||
|
hechos += 1
|
||||||
|
print(f"\n {hechos} manuales cosechados, {faltan} no instalados en esta maquina")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
Loading…
Add table
Add a link
Reference in a new issue