mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 09:27:32 +00:00
Translated ['binary-exploitation/common-binary-protections-and-bypasses/
This commit is contained in:
parent
709160a7a9
commit
b1d2abc05a
4 changed files with 256 additions and 52 deletions
|
@ -725,6 +725,7 @@
|
|||
* [Ret2plt](binary-exploitation/common-binary-protections-and-bypasses/aslr/ret2plt.md)
|
||||
* [Ret2ret & Reo2pop](binary-exploitation/common-binary-protections-and-bypasses/aslr/ret2ret.md)
|
||||
* [CET & Shadow Stack](binary-exploitation/common-binary-protections-and-bypasses/cet-and-shadow-stack.md)
|
||||
* [Libc Protections](binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md)
|
||||
* [Memory Tagging Extension (MTE)](binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md)
|
||||
* [No-exec / NX](binary-exploitation/common-binary-protections-and-bypasses/no-exec-nx.md)
|
||||
* [PIE](binary-exploitation/common-binary-protections-and-bypasses/pie/README.md)
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
# Protecciones de Libc
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende a hackear AWS desde cero hasta convertirte en un experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**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)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
## Aplicación de Alineación de Chunks
|
||||
|
||||
**Malloc** asigna memoria en agrupaciones de **8 bytes (32 bits) o 16 bytes (64 bits)**. Esto significa que el final de los chunks en sistemas de 32 bits debería alinearse con **0x8**, y en sistemas de 64 bits con **0x0**. La característica de seguridad verifica que cada chunk **se alinee correctamente** en estas ubicaciones específicas antes de usar un puntero de un bin.
|
||||
|
||||
### Beneficios de Seguridad
|
||||
|
||||
La aplicación de la alineación de chunks en sistemas de 64 bits mejora significativamente la seguridad de Malloc al **limitar la ubicación de chunks falsos a solo 1 de cada 16 direcciones**. Esto complica los esfuerzos de explotación, especialmente en escenarios donde el usuario tiene un control limitado sobre los valores de entrada, haciendo que los ataques sean más complejos y difíciles de ejecutar con éxito.
|
||||
|
||||
* **Ataque Fastbin en \_\_malloc\_hook**
|
||||
|
||||
Las nuevas reglas de alineación en Malloc también frustran un ataque clásico que implica el `__malloc_hook`. Anteriormente, los atacantes podían manipular tamaños de chunks para **sobrescribir este puntero de función** y obtener **ejecución de código**. Ahora, el estricto requisito de alineación garantiza que tales manipulaciones ya no sean viables, cerrando una ruta común de explotación y mejorando la seguridad general.
|
||||
|
||||
## Enmascaramiento de Punteros en fastbins y tcache
|
||||
|
||||
El **Enmascaramiento de Punteros** es una mejora de seguridad utilizada para proteger los **punteros Fd de fastbin y tcache** en operaciones de gestión de memoria. Esta técnica ayuda a prevenir ciertos tipos de tácticas de explotación de memoria, específicamente aquellas que no requieren información de memoria filtrada o que manipulan ubicaciones de memoria directamente en relación con posiciones conocidas (sobrescrituras **relativas**).
|
||||
|
||||
El núcleo de esta técnica es una fórmula de ofuscación:
|
||||
|
||||
**`Nuevo_Ptr = (L >> 12) XOR P`**
|
||||
|
||||
* **L** es la **Ubicación de Almacenamiento** del puntero.
|
||||
* **P** es el **Puntero Fd de fastbin/tcache** real.
|
||||
|
||||
La razón por la cual el desplazamiento de bits de la ubicación de almacenamiento (L) por 12 bits hacia la derecha antes de la operación XOR es crítica. Esta manipulación aborda una vulnerabilidad inherente en la naturaleza determinista de los 12 bits menos significativos de las direcciones de memoria, que suelen ser predecibles debido a las limitaciones de la arquitectura del sistema. Al desplazar los bits, la parte predecible se elimina de la ecuación, mejorando la aleatoriedad del nuevo puntero enmascarado y protegiendo así contra exploits que dependen de la previsibilidad de estos bits.
|
||||
|
||||
Este puntero enmascarado aprovecha la aleatoriedad existente proporcionada por la **Aleatorización del Diseño del Espacio de Direcciones (ASLR)**, que aleatoriza las direcciones utilizadas por los programas para dificultar que los atacantes predigan el diseño de memoria de un proceso.
|
||||
|
||||
**Desenmascarar** el puntero para recuperar la dirección original implica usar la misma operación XOR. Aquí, el puntero enmascarado se trata como P en la fórmula, y al hacer XOR con la ubicación de almacenamiento sin cambios (L), se revela el puntero original. Esta simetría en el enmascaramiento y desenmascaramiento garantiza que el sistema pueda codificar y decodificar eficientemente punteros sin una sobrecarga significativa, al tiempo que aumenta sustancialmente la seguridad contra ataques que manipulan punteros de memoria.
|
||||
|
||||
### Beneficios de Seguridad
|
||||
|
||||
El enmascaramiento de punteros tiene como objetivo **prevenir sobrescrituras parciales y completas de punteros en el heap**, una mejora significativa en seguridad. Esta característica impacta las técnicas de explotación de varias maneras:
|
||||
|
||||
1. **Prevención de Sobrescrituras Relativas de Bye Byte**: Anteriormente, los atacantes podían cambiar parte de un puntero para **redirigir chunks del heap a ubicaciones diferentes sin conocer direcciones exactas**, una técnica evidente en el exploit **House of Roman** sin filtraciones. Con el enmascaramiento de punteros, tales sobrescrituras relativas **sin una filtración de heap ahora requieren fuerza bruta**, reduciendo drásticamente su probabilidad de éxito.
|
||||
2. **Aumento de la Dificultad de Ataques a Tcache Bin/Fastbin**: Los ataques comunes que sobrescriben punteros de función (como `__malloc_hook`) manipulando entradas de fastbin o tcache se ven obstaculizados. Por ejemplo, un ataque podría implicar filtrar una dirección de LibC, liberar un chunk en el tcache bin y luego sobrescribir el puntero Fd para redirigirlo a `__malloc_hook` para ejecución de código arbitrario. Con el enmascaramiento de punteros, estos punteros deben enmascararse correctamente, **necesitando una filtración de heap para una manipulación precisa**, elevando así la barrera de explotación.
|
||||
3. **Requisito de Filtraciones de Heap en Ubicaciones No-Heap**: Crear un chunk falso en áreas no-heap (como la pila, sección .bss o PLT/GOT) ahora también **requiere una filtración de heap** debido a la necesidad de enmascaramiento de punteros. Esto extiende la complejidad de explotar estas áreas, similar al requisito de manipulación de direcciones de LibC.
|
||||
4. **Hacer Filtraciones de Direcciones de Heap se Vuelve Más Desafiante**: El enmascaramiento de punteros restringe la utilidad de los punteros Fd en fastbin y tcache bins como fuentes de filtraciones de direcciones de heap. Sin embargo, los punteros en bins no ordenados, pequeños y grandes permanecen sin enmascarar, aún siendo utilizables para filtrar direcciones. Este cambio empuja a los atacantes a explorar estos bins en busca de información explotable, aunque algunas técnicas aún pueden permitir desenmascarar punteros antes de una filtración, aunque con limitaciones.
|
||||
|
||||
### **Desenmascaramiento de Punteros con una Filtración de Heap**
|
||||
|
||||
{% hint style="danger" %}
|
||||
Para una mejor explicación del proceso [**consulta la publicación original desde aquí**](https://maxwelldulin.com/BlogPost?post=5445977088).
|
||||
{% endhint %}
|
||||
|
||||
### Resumen del Algoritmo
|
||||
|
||||
La fórmula utilizada para enmascarar y desenmascarar punteros es: 
|
||||
|
||||
**`Nuevo_Ptr = (L >> 12) XOR P`**
|
||||
|
||||
Donde **L** es la ubicación de almacenamiento y **P** es el puntero Fd. Cuando **L** se desplaza hacia la derecha por 12 bits, expone los bits más significativos de **P**, debido a la naturaleza de **XOR**, que produce 0 cuando los bits se XOR con ellos mismos.
|
||||
|
||||
**Pasos Clave en el Algoritmo:**
|
||||
|
||||
1. **Filtración Inicial de los Bits Más Significativos**: Al hacer XOR entre el **L** desplazado y **P**, obtienes efectivamente los 12 bits superiores de **P** porque la parte desplazada de **L** será cero, dejando los bits correspondientes de **P** sin cambios.
|
||||
2. **Recuperación de Bits del Puntero**: Dado que XOR es reversible, conocer el resultado y uno de los operandos te permite calcular el otro operando. Esta propiedad se utiliza para deducir el conjunto completo de bits para **P** al hacer XOR sucesivamente con conjuntos conocidos de bits con partes del puntero enmascarado.
|
||||
3. **Desenmascaramiento Iterativo**: El proceso se repite, utilizando cada vez los bits de **P** recién descubiertos del paso anterior para decodificar el siguiente segmento del puntero enmascarado, hasta que se recuperan todos los bits.
|
||||
4. **Manejo de Bits Deterministas**: Los últimos 12 bits de **L** se pierden debido al desplazamiento, pero son deterministas y pueden reconstruirse después del proceso.
|
||||
|
||||
Puedes encontrar una implementación de este algoritmo aquí: [https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
|
||||
## Protección de Punteros
|
||||
|
||||
Pointer guard es una técnica de mitigación de exploits utilizada en glibc para proteger los punteros de funciones almacenados, especialmente aquellos registrados por llamadas de biblioteca como `atexit()`. Esta protección implica mezclar los punteros mediante XOR con un secreto almacenado en los datos del hilo (`fs:0x30`) y aplicar una rotación de bits. Este mecanismo tiene como objetivo evitar que los atacantes secuestren el flujo de control sobrescribiendo punteros de funciones.
|
||||
|
||||
### **Burlando Pointer Guard con una fuga**
|
||||
|
||||
1. **Entendiendo las Operaciones de Pointer Guard:** El mezclado de punteros se realiza utilizando la macro `PTR_MANGLE` que realiza XOR con el puntero con un secreto de 64 bits y luego realiza una rotación a la izquierda de 0x11 bits. La operación inversa para recuperar el puntero original es manejada por `PTR_DEMANGLE`.
|
||||
2. **Estrategia de Ataque:** El ataque se basa en un enfoque de texto plano conocido, donde el atacante necesita conocer tanto la versión original como la mezclada de un puntero para deducir el secreto utilizado para el mezclado.
|
||||
3. **Explotando Textos Planos Conocidos:**
|
||||
* **Identificando Punteros de Funciones Fijos:** Al examinar el código fuente de glibc o tablas de punteros de funciones inicializadas (como `__libc_pthread_functions`), un atacante puede encontrar punteros de funciones predecibles.
|
||||
* **Calculando el Secreto:** Utilizando un puntero de función conocido como `__pthread_attr_destroy` y su versión mezclada de la tabla de punteros de funciones, el secreto se puede calcular mediante una rotación inversa (rotación a la derecha) del puntero mezclado y luego XOR con la dirección de la función.
|
||||
4. **Textos Planos Alternativos:** El atacante también puede experimentar con la mezcla de punteros con valores conocidos como 0 o -1 para ver si estos producen patrones identificables en la memoria, potencialmente revelando el secreto cuando se encuentran estos patrones en volcados de memoria.
|
||||
5. **Aplicación Práctica:** Después de calcular el secreto, un atacante puede manipular punteros de manera controlada, esencialmente burlando la protección de Pointer Guard en una aplicación multiproceso con conocimiento de la dirección base de libc y la capacidad de leer ubicaciones de memoria arbitrarias.
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://maxwelldulin.com/BlogPost?post=5445977088](https://maxwelldulin.com/BlogPost?post=5445977088)
|
||||
* [https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1](https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1)
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Equipos Rojos de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
@ -16,7 +16,7 @@ Otras formas de apoyar a HackTricks:
|
|||
|
||||
## Información Básica de Pkg
|
||||
|
||||
Un **paquete de instalación** de macOS (también conocido como archivo `.pkg`) es un formato de archivo utilizado por macOS para **distribuir software**. Estos archivos son como una **caja que contiene todo lo que un software** necesita para instalarse y ejecutarse correctamente.
|
||||
Un **paquete de instalación de macOS** (también conocido como archivo `.pkg`) es un formato de archivo utilizado por macOS para **distribuir software**. Estos archivos son como una **caja que contiene todo lo que un software** necesita para instalarse y ejecutarse correctamente.
|
||||
|
||||
El archivo del paquete en sí es un archivo comprimido que contiene una **jerarquía de archivos y directorios que se instalarán en el equipo** objetivo. También puede incluir **scripts** para realizar tareas antes y después de la instalación, como configurar archivos de configuración o limpiar versiones antiguas del software.
|
||||
|
||||
|
@ -27,10 +27,10 @@ El archivo del paquete en sí es un archivo comprimido que contiene una **jerarq
|
|||
* **Distribución (xml)**: Personalizaciones (título, texto de bienvenida...) y comprobaciones de script/instalación
|
||||
* **PackageInfo (xml)**: Información, requisitos de instalación, ubicación de instalación, rutas a scripts para ejecutar
|
||||
* **Lista de materiales (bom)**: Lista de archivos para instalar, actualizar o eliminar con permisos de archivo
|
||||
* **Carga (archivo CPIO comprimido con gzip)**: Archivos para instalar en la `ubicación de instalación` desde PackageInfo
|
||||
* **Scripts (archivo CPIO comprimido con gzip)**: Scripts de pre y post instalación y más recursos extraídos a un directorio temporal para la ejecución.
|
||||
* **Carga (archivo CPIO comprimido con gzip)**: Archivos para instalar en la `ubicación de instalación` de PackageInfo
|
||||
* **Scripts (archivo CPIO comprimido con gzip)**: Scripts de pre y post instalación y más recursos extraídos a un directorio temporal para su ejecución.
|
||||
|
||||
### Descomprimir
|
||||
### Descompresión
|
||||
```bash
|
||||
# Tool to directly get the files inside a package
|
||||
pkgutil —expand "/path/to/package.pkg" "/path/to/out/dir"
|
||||
|
@ -44,33 +44,35 @@ xar -xf "/path/to/package.pkg"
|
|||
cat Scripts | gzip -dc | cpio -i
|
||||
cpio -i < Scripts
|
||||
```
|
||||
Para visualizar el contenido del instalador sin descomprimirlo manualmente, también puedes usar la herramienta gratuita [**Suspicious Package**](https://mothersruin.com/software/SuspiciousPackage/).
|
||||
## Información básica de los archivos DMG
|
||||
|
||||
## Información Básica de DMG
|
||||
Los archivos DMG, o Imágenes de Disco de Apple, son un formato de archivo utilizado por 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 bloques crudos generalmente comprimidos y a veces encriptados. 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 Apple Disk Images, son un formato de archivo utilizado por 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 bloques crudos generalmente comprimidos y a veces encriptados. Cuando abres un archivo DMG, macOS lo **monta como si fuera un disco físico**, lo que te permite acceder a su contenido.
|
||||
{% hint style="danger" %}
|
||||
Ten en cuenta que los instaladores **`.dmg`** admiten **tantos formatos** que en el pasado algunos de ellos que contenían vulnerabilidades fueron abusados para obtener **ejecución de código de kernel**.
|
||||
{% endhint %}
|
||||
|
||||
### Jerarquía
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (12) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (222).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
La jerarquía de un archivo DMG puede ser diferente según el contenido. Sin embargo, para los DMGs de aplicaciones, generalmente sigue esta estructura:
|
||||
|
||||
- Nivel Superior: Este es la raíz de la imagen de disco. A menudo contiene la aplicación y posiblemente un enlace a la carpeta de Aplicaciones.
|
||||
- Nivel superior: Este es la raíz de la imagen de 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 facilitar la instalación de 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 abuso de pkg
|
||||
|
||||
### Ejecución desde directorios públicos
|
||||
|
||||
Si un script de pre o post instalación está ejecutando, por ejemplo, desde **`/var/tmp/Installerutil`**, y un atacante pudiera controlar ese script, podría escalar privilegios cada vez que se ejecute. Otro ejemplo similar:
|
||||
Si un script de pre o post instalación está, por ejemplo, ejecutándose desde **`/var/tmp/Installerutil`**, y un atacante pudiera controlar ese script, podría escalar privilegios cada vez que se ejecute. Otro ejemplo similar:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic 5.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic 5.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption><p><a href="https://www.youtube.com/watch?v=kCXhIYtODBg">https://www.youtube.com/watch?v=kCXhIYtODBg</a></p></figcaption></figure>
|
||||
|
||||
### AuthorizationExecuteWithPrivileges
|
||||
|
||||
Esta es una [función pública](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) que varios instaladores y actualizadores llamarán para **ejecutar algo como root**. Esta función acepta la **ruta** del **archivo** a **ejecutar** como parámetro, sin embargo, si un atacante pudiera **modificar** este archivo, podrá **abusar** de su ejecución con root para **escalar privilegios**.
|
||||
Esta es una [función pública](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) que varios instaladores y actualizadores llamarán para **ejecutar algo como root**. Esta función acepta la **ruta** del **archivo** a **ejecutar** como parámetro, sin embargo, si un atacante pudiera **modificar** este archivo, podrá **abusar** de su ejecución con privilegios de root para **escalar privilegios**.
|
||||
```bash
|
||||
# Breakpoint in the function to check wich file is loaded
|
||||
(lldb) b AuthorizationExecuteWithPrivileges
|
||||
|
@ -80,7 +82,7 @@ Esta es una [función pública](https://developer.apple.com/documentation/securi
|
|||
|
||||
Si un instalador escribe en `/tmp/fixedname/bla/bla`, es posible **crear un montaje** sobre `/tmp/fixedname` sin propietarios para poder **modificar cualquier archivo durante la instalación** y abusar del proceso de instalación.
|
||||
|
||||
Un ejemplo de esto es **CVE-2021-26089** que logró **sobrescribir un script periódico** para obtener ejecución como root. Para más información, echa un vistazo a la charla: [**OBTS v4.0: "Montaña de Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
Un ejemplo de esto es **CVE-2021-26089** que logró **sobrescribir un script periódico** para obtener ejecución como root. Para obtener más información, echa un vistazo a la charla: [**OBTS v4.0: "Montaña de Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
|
||||
## pkg como malware
|
||||
|
||||
|
@ -92,9 +94,10 @@ Es posible simplemente generar un archivo **`.pkg`** con **scripts de pre y post
|
|||
|
||||
Es posible agregar etiquetas **`<script>`** en el archivo **xml de distribución** del paquete y ese código se ejecutará y puede **ejecutar comandos** utilizando **`system.run`**:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (14).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1040).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Referencias
|
||||
|
||||
* [**DEF CON 27 - Desempaquetando Pkgs Un Vistazo Dentro de los Paquetes de Instalación de macOS y Fallas de Seguridad Comunes**](https://www.youtube.com/watch?v=iASSG0\_zobQ)
|
||||
* [**DEF CON 27 - Desempaquetando Pkgs Un Vistazo Dentro de los Paquetes de Instalación de MacOS y Fallas Comunes de Seguridad**](https://www.youtube.com/watch?v=iASSG0\_zobQ)
|
||||
* [**OBTS v4.0: "El Salvaje Mundo de los Instaladores de macOS" - Tony Lambert**](https://www.youtube.com/watch?v=Eow5uNHtmIg)
|
||||
* [**DEF CON 27 - Desempaquetando Pkgs Un Vistazo Dentro de los Paquetes de Instalación de MacOS**](https://www.youtube.com/watch?v=kCXhIYtODBg)
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de AWS de HackTricks)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](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 & HackTricks**](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)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -19,8 +19,8 @@ Otras formas de apoyar a HackTricks:
|
|||
Permisos en un **directorio**:
|
||||
|
||||
* **lectura** - puedes **enumerar** las entradas del directorio
|
||||
* **escritura** - puedes **eliminar/escribir** **archivos** en el directorio y puedes **eliminar carpetas vacías**.
|
||||
* Pero **no puedes eliminar/modificar carpetas no vacías** a menos que tengas permisos de escritura sobre ellas.
|
||||
* **escritura** - puedes **borrar/escribir** **archivos** en el directorio y puedes **borrar carpetas vacías**.
|
||||
* Pero **no puedes borrar/modificar carpetas no vacías** a menos que tengas permisos de escritura sobre ellas.
|
||||
* **No puedes modificar el nombre de una carpeta** a menos que la poseas.
|
||||
* **ejecución** - se te permite **atravesar** el directorio - si no tienes este derecho, no puedes acceder a ningún archivo dentro de él, ni en ningún subdirectorio.
|
||||
|
||||
|
@ -28,27 +28,27 @@ Permisos en un **directorio**:
|
|||
|
||||
**Cómo sobrescribir un archivo/carpeta propiedad de root**, pero:
|
||||
|
||||
* Un **propietario del directorio padre** en la ruta es el usuario
|
||||
* Un **propietario del directorio padre** en la ruta es un **grupo de usuarios** con **acceso de escritura**
|
||||
* Un **grupo de usuarios** tiene **acceso de escritura** al **archivo**
|
||||
* Uno de los **propietarios del directorio padre** en la ruta es el usuario
|
||||
* Uno de los **propietarios del directorio padre** en la ruta es un **grupo de usuarios** con **acceso de escritura**
|
||||
* Un **grupo de usuarios** tiene acceso de **escritura** al **archivo**
|
||||
|
||||
Con cualquiera de las combinaciones anteriores, un atacante podría **inyectar** un **enlace simbólico/duro** en la ruta esperada para obtener una escritura arbitraria privilegiada.
|
||||
|
||||
### Caso Especial de R+X de la raíz de la carpeta
|
||||
|
||||
Si hay archivos en un **directorio** donde **solo root tiene acceso R+X**, estos **no son accesibles para nadie más**. Por lo tanto, una vulnerabilidad que permita **mover un archivo legible por un usuario**, que no se puede leer debido a esa **restricción**, desde esta carpeta **a otra diferente**, podría ser abusada para leer estos archivos.
|
||||
Si hay archivos en un **directorio** donde **solo root tiene acceso de R+X**, estos **no son accesibles para nadie más**. Por lo tanto, una vulnerabilidad que permita **mover un archivo legible por un usuario**, que no se puede leer debido a esa **restricción**, desde este directorio **a otro diferente**, podría ser abusada para leer estos archivos.
|
||||
|
||||
Ejemplo en: [https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions)
|
||||
|
||||
## Enlace Simbólico / Enlace Duro
|
||||
## Enlace simbólico / Enlace duro
|
||||
|
||||
Si un proceso privilegiado está escribiendo datos en un **archivo** que podría ser **controlado** por un **usuario menos privilegiado**, o que podría ser **creado previamente** por un usuario menos privilegiado. El usuario podría simplemente **apuntarlo a otro archivo** a través de un enlace simbólico o duro, y el proceso privilegiado escribirá en ese archivo.
|
||||
Si un proceso privilegiado está escribiendo datos en un **archivo** que podría ser **controlado** por un **usuario menos privilegiado**, o que podría ser **creado previamente** por un usuario menos privilegiado. El usuario simplemente podría **apuntarlo a otro archivo** a través de un enlace simbólico o duro, y el proceso privilegiado escribirá en ese archivo.
|
||||
|
||||
Ver en las otras secciones dónde un atacante podría **abusar de una escritura arbitraria para escalar privilegios**.
|
||||
Consulta en las otras secciones dónde un atacante podría **abusar de una escritura arbitraria para escalar privilegios**.
|
||||
|
||||
## .fileloc
|
||||
|
||||
Los archivos con extensión **`.fileloc`** pueden apuntar a otras aplicaciones o binarios, por lo que cuando se abren, la aplicación/binario será la que se ejecute.\
|
||||
Los archivos con extensión **`.fileloc`** pueden apuntar a otras aplicaciones o binarios, por lo que cuando se abren, la aplicación/binario será el que se ejecute.\
|
||||
Ejemplo:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
@ -62,13 +62,13 @@ Ejemplo:
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
## Descriptores de archivo arbitrarios
|
||||
## FD Arbitrario
|
||||
|
||||
Si puedes hacer que un **proceso abra un archivo o una carpeta con altos privilegios**, puedes abusar de **`crontab`** para abrir un archivo en `/etc/sudoers.d` con **`EDITOR=exploit.py`**, de modo que `exploit.py` obtendrá el descriptor de archivo al archivo dentro de `/etc/sudoers` y lo abusará.
|
||||
Si puedes hacer que un **proceso abra un archivo o una carpeta con altos privilegios**, puedes abusar de **`crontab`** para abrir un archivo en `/etc/sudoers.d` con **`EDITOR=exploit.py`**, de esta manera `exploit.py` obtendrá el FD al archivo dentro de `/etc/sudoers` y lo abusará.
|
||||
|
||||
Por ejemplo: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)
|
||||
|
||||
## Trucos para evitar las xattrs de cuarentena
|
||||
## Trucos para Evitar las xattrs de Cuarentena
|
||||
|
||||
### Eliminarlo
|
||||
```bash
|
||||
|
@ -99,7 +99,7 @@ xattr: [Errno 1] Operation not permitted: '/tmp/mnt/lol'
|
|||
```
|
||||
### ACL de writeextattr
|
||||
|
||||
Este ACL evita agregar `xattrs` al archivo.
|
||||
Esta ACL evita agregar `xattrs` al archivo.
|
||||
```bash
|
||||
rm -rf /tmp/test*
|
||||
echo test >/tmp/test
|
||||
|
@ -124,7 +124,7 @@ ls -le /tmp/test
|
|||
|
||||
El formato de archivo **AppleDouble** copia un archivo incluyendo sus ACEs.
|
||||
|
||||
En el [**código fuente**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) es posible ver que la representación de texto de ACL almacenada dentro del xattr llamado **`com.apple.acl.text`** se establecerá como ACL en el archivo descomprimido. Por lo tanto, si comprimiste una aplicación en un archivo zip con el formato de archivo **AppleDouble** con un ACL que evita que otros xattrs se escriban en él... el xattr de cuarentena no se estableció en la aplicación:
|
||||
En el [**código fuente**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) es posible ver que la representación de texto de ACL almacenada dentro del xattr llamado **`com.apple.acl.text`** se establecerá como ACL en el archivo descomprimido. Por lo tanto, si comprimiste una aplicación en un archivo zip con el formato de archivo **AppleDouble** con un ACL que evita que otros xattrs se escriban en él... el xattr de cuarentena no se establecerá en la aplicación:
|
||||
|
||||
Consulta el [**informe original**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) para obtener más información.
|
||||
|
||||
|
@ -146,9 +146,9 @@ ditto -c -k del test.zip
|
|||
ditto -x -k --rsrc test.zip .
|
||||
ls -le test
|
||||
```
|
||||
(Nota que incluso si esto funciona, la sandbox escribe el atributo de cuarentena antes)
|
||||
(Note that even if this works the sandbox write the quarantine xattr before)
|
||||
|
||||
No es realmente necesario, pero lo dejo aquí por si acaso:
|
||||
No es realmente necesario, pero lo dejo ahí por si acaso:
|
||||
|
||||
{% content-ref url="macos-xattr-acls-extra-stuff.md" %}
|
||||
[macos-xattr-acls-extra-stuff.md](macos-xattr-acls-extra-stuff.md)
|
||||
|
@ -202,7 +202,7 @@ Sin embargo, hay algunos archivos cuya firma no se verificará, estos tienen la
|
|||
...
|
||||
</dict>
|
||||
```
|
||||
Es posible calcular la firma de un recurso desde la CLI con:
|
||||
Es posible calcular la firma de un recurso desde la línea de comandos con:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -210,7 +210,7 @@ openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/
|
|||
```
|
||||
## Montar dmgs
|
||||
|
||||
Un usuario puede montar un dmg personalizado incluso encima de algunas carpetas existentes. Así es como podrías crear un paquete dmg personalizado con contenido personalizado:
|
||||
Un usuario puede montar un archivo dmg personalizado incluso encima de algunas carpetas existentes. Así es como podrías crear un paquete dmg personalizado con contenido personalizado:
|
||||
```bash
|
||||
# Create the volume
|
||||
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
|
||||
|
@ -233,20 +233,20 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Normalmente macOS monta el disco hablando con el servicio Mach `com.apple.DiskArbitrarion.diskarbitrariond` (proporcionado por `/usr/libexec/diskarbitrationd`). Si se agrega el parámetro `-d` al archivo plist de LaunchDaemons y se reinicia, almacenará registros en `/var/log/diskarbitrationd.log`.\
|
||||
Por lo general, macOS monta el disco hablando con el servicio Mach `com.apple.DiskArbitration.diskarbitrationd` (proporcionado por `/usr/libexec/diskarbitrationd`). Si se agrega el parámetro `-d` al archivo plist de LaunchDaemons y se reinicia, almacenará registros en `/var/log/diskarbitrationd.log`.\
|
||||
Sin embargo, es posible utilizar herramientas como `hdik` y `hdiutil` para comunicarse directamente con el kext `com.apple.driver.DiskImages`.
|
||||
|
||||
## Escrituras Arbitrarias
|
||||
|
||||
### Scripts sh periódicos
|
||||
|
||||
Si tu script podría ser interpretado como un **script de shell**, podrías sobrescribir el script de shell **`/etc/periodic/daily/999.local`** que se activará todos los días.
|
||||
Si su script podría ser interpretado como un **script de shell**, podría sobrescribir el script de shell **`/etc/periodic/daily/999.local`** que se activará todos los días.
|
||||
|
||||
Puedes **simular** una ejecución de este script con: **`sudo periodic daily`**
|
||||
Puede **simular** una ejecución de este script con: **`sudo periodic daily`**
|
||||
|
||||
### Daemons
|
||||
|
||||
Escribe un **LaunchDaemon** arbitrario como **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** con un plist que ejecute un script arbitrario como:
|
||||
Escriba un **LaunchDaemon** arbitrario como **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** con un plist que ejecute un script arbitrario como:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -269,11 +269,11 @@ Si tienes **escritura arbitraria**, podrías crear un archivo dentro de la carpe
|
|||
|
||||
### Archivos PATH
|
||||
|
||||
El archivo **`/etc/paths`** es uno de los principales lugares que populan la variable de entorno PATH. Debes ser root para sobrescribirlo, pero si un script de un **proceso privilegiado** está ejecutando algún **comando sin la ruta completa**, podrías **secuestrarlo** modificando este archivo.
|
||||
El archivo **`/etc/paths`** es uno de los lugares principales que populan la variable de entorno PATH. Debes ser root para sobrescribirlo, pero si un script de un **proceso privilegiado** está ejecutando algún **comando sin la ruta completa**, podrías **secuestrarlo** modificando este archivo.
|
||||
|
||||
También puedes escribir archivos en **`/etc/paths.d`** para cargar nuevas carpetas en la variable de entorno `PATH`.
|
||||
|
||||
## Generar archivos con permisos de escritura como otros usuarios
|
||||
## Generar archivos escribibles como otros usuarios
|
||||
|
||||
Esto generará un archivo que pertenece a root y es escribible por mí ([**código desde aquí**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew\_lpe.sh)). Esto también podría funcionar como escalada de privilegios:
|
||||
```bash
|
||||
|
@ -287,20 +287,126 @@ MallocStackLogging=1 MallocStackLoggingDirectory=$DIRNAME MallocStackLoggingDont
|
|||
FILENAME=$(ls "$DIRNAME")
|
||||
echo $FILENAME
|
||||
```
|
||||
## Memoria Compartida POSIX
|
||||
|
||||
**La memoria compartida POSIX** permite a los procesos en sistemas operativos compatibles con POSIX acceder a un área de memoria común, facilitando una comunicación más rápida en comparación con otros métodos de comunicación entre procesos. Implica crear o abrir un objeto de memoria compartida con `shm_open()`, establecer su tamaño con `ftruncate()`, y mapearlo en el espacio de direcciones del proceso utilizando `mmap()`. Los procesos pueden entonces leer y escribir directamente en esta área de memoria. Para gestionar el acceso concurrente y prevenir la corrupción de datos, se suelen utilizar mecanismos de sincronización como mutex o semáforos. Finalmente, los procesos desmapean y cierran la memoria compartida con `munmap()` y `close()`, y opcionalmente eliminan el objeto de memoria con `shm_unlink()`. Este sistema es especialmente efectivo para una IPC eficiente y rápida en entornos donde múltiples procesos necesitan acceder a datos compartidos rápidamente.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ejemplo de Código del Productor</summary>
|
||||
```c
|
||||
// gcc producer.c -o producer -lrt
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main() {
|
||||
const char *name = "/my_shared_memory";
|
||||
const int SIZE = 4096; // Size of the shared memory object
|
||||
|
||||
// Create the shared memory object
|
||||
int shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
|
||||
if (shm_fd == -1) {
|
||||
perror("shm_open");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Configure the size of the shared memory object
|
||||
if (ftruncate(shm_fd, SIZE) == -1) {
|
||||
perror("ftruncate");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Memory map the shared memory
|
||||
void *ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
|
||||
if (ptr == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Write to the shared memory
|
||||
sprintf(ptr, "Hello from Producer!");
|
||||
|
||||
// Unmap and close, but do not unlink
|
||||
munmap(ptr, SIZE);
|
||||
close(shm_fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ejemplo de Código del Consumidor</summary>
|
||||
```c
|
||||
// gcc consumer.c -o consumer -lrt
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main() {
|
||||
const char *name = "/my_shared_memory";
|
||||
const int SIZE = 4096; // Size of the shared memory object
|
||||
|
||||
// Open the shared memory object
|
||||
int shm_fd = shm_open(name, O_RDONLY, 0666);
|
||||
if (shm_fd == -1) {
|
||||
perror("shm_open");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Memory map the shared memory
|
||||
void *ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
|
||||
if (ptr == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Read from the shared memory
|
||||
printf("Consumer received: %s\n", (char *)ptr);
|
||||
|
||||
// Cleanup
|
||||
munmap(ptr, SIZE);
|
||||
close(shm_fd);
|
||||
shm_unlink(name); // Optionally unlink
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
## Descriptores protegidos de macOS
|
||||
|
||||
Los **descriptores protegidos de macOS** son una característica de seguridad introducida en macOS para mejorar la seguridad y confiabilidad de las **operaciones de descriptores de archivos** en aplicaciones de usuario. Estos descriptores protegidos proporcionan una forma de asociar restricciones específicas o "guardias" con descriptores de archivos, que son aplicadas por el kernel.
|
||||
|
||||
Esta característica es particularmente útil para prevenir ciertas clases de vulnerabilidades de seguridad como el **acceso no autorizado a archivos** o **condiciones de carrera**. Estas vulnerabilidades ocurren, por ejemplo, cuando un hilo está accediendo a una descripción de archivo dando acceso a **otro hilo vulnerable sobre él** o cuando un descriptor de archivo es **heredado** por un proceso hijo vulnerable. Algunas funciones relacionadas con esta funcionalidad son:
|
||||
|
||||
* `guarded_open_np`: Abre un FD con una guardia
|
||||
* `guarded_close_np`: Ciérralo
|
||||
* `change_fdguard_np`: Cambia las banderas de guardia en un descriptor (incluso eliminando la protección de la guardia)
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/](https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking de AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red de HackTricks de AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](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)
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue