📘Comunicación con Procesos
Uno de los mejores lugares para buscar la escalada de privilegios son los procesos que se están ejecutando en el sistema. Incluso si un proceso no se está ejecutando como administrador, puede generar privilegios adicionales. El ejemplo más común es descubrir un servidor web como IIS o XAMPP ejecutándose en el equipo, colocar un aspx/php
shell en el equipo y obtener un shell como el usuario que ejecuta el servidor web. Por lo general, no se trata de un administrador, pero a menudo tendrá el SeImpersonate
token, lo que le permite Rogue/Juicy/Lonely Potato
proporcionar permisos de SISTEMA.
Tokens de acceso
En Windows, los tokens de acceso se utilizan para describir el contexto de seguridad (reglas o atributos de seguridad) de un proceso o subproceso. El token incluye información sobre la identidad de la cuenta de usuario y los privilegios relacionados con un proceso o subproceso específico. Cuando un usuario se autentica en un sistema, su contraseña se verifica con una base de datos de seguridad y, si se autentica correctamente, se le asignará un token de acceso. Cada vez que un usuario interactúa con un proceso, se le presentará una copia de este token para determinar su nivel de privilegio.
Enumeración de servicios de red
La forma más común en que las personas interactúan con los procesos es a través de un socket de red (DNS, HTTP, SMB, etc.). El comando netstat mostrará las conexiones TCP y UDP activas, lo que nos dará una mejor idea de qué servicios están escuchando en qué puerto(s), tanto localmente como accesibles desde el exterior. Es posible que encontremos un servicio vulnerable al que solo pueda acceder el host local (cuando se inicia sesión en el host) que podamos explotar para escalar privilegios.
Conexiones de red activas
Lo principal que hay que buscar con las conexiones de red activas son las entradas que escuchan en direcciones de loopback ( 127.0.0.1
y ::1
) que no están escuchando en la dirección IP ( 10.129.43.8
) o broadcast ( 0.0.0.0
, ::/0
). La razón de esto es que los sockets de red en localhost a menudo son inseguros debido a la idea de que "no son accesibles a la red". El puerto que sobresale de inmediato será el puerto 14147
, que se utiliza para la interfaz administrativa de FileZilla. Al conectarse a este puerto, puede ser posible extraer contraseñas FTP además de crear un recurso compartido FTP en c:\ como usuario de FileZilla Server (potencialmente Administrador).
Más ejemplos
Uno de los mejores ejemplos de este tipo de escalada de privilegios es el Splunk Universal Forwarder
, instalado en los puntos finales para enviar registros a Splunk. La configuración predeterminada de Splunk no tenía ninguna autenticación en el software y permitía que cualquiera implementara aplicaciones, lo que podía provocar la ejecución de código. Nuevamente, la configuración predeterminada de Splunk era ejecutarlo como SYSTEM$ y no como un usuario con privilegios bajos. Para obtener más información, consulte Splunk Universal Forwarder Hijacking y SplunkWhisperer2 .
Otro vector de escalada de privilegios locales que se pasa por alto pero que es común es el Erlang Port
(25672). Erlang es un lenguaje de programación diseñado en torno a la computación distribuida y tendrá un puerto de red que permite que otros nodos de Erlang se unan al clúster. El secreto para unirse a este clúster se llama cookie. Muchas aplicaciones que utilizan Erlang utilizarán una cookie débil (RabbitMQ la utiliza rabbit
de forma predeterminada) o colocarán la cookie en un archivo de configuración que no está bien protegido. Algunos ejemplos de aplicaciones de Erlang son SolarWinds, RabbitMQ y CouchDB. Para obtener más información, consulte la publicación del blog Erlang-arce de Mubix.
Named Pipes
La otra forma en que los procesos se comunican entre sí es a través de tuberías con nombre. Las tuberías son, básicamente, archivos almacenados en la memoria que se borran después de leerse. Cobalt Strike utiliza canalizaciones con nombre para cada comando (excepto BOF ). Básicamente, el flujo de trabajo se ve así:
Beacon inicia una tubería con nombre de
\.\pipe\msagent_12
Beacon inicia un nuevo proceso e inyecta un comando en ese proceso dirigiendo la salida a
\.\pipe\msagent_12
El servidor muestra lo que se escribió en
\.\pipe\msagent_12
Cobalt Strike hizo esto porque si el comando que se estaba ejecutando era marcado por el antivirus o fallaba, no afectaría al beacon (proceso que ejecuta el comando). A menudo, los usuarios de Cobalt Strike cambiarán sus canalizaciones con nombre para hacerse pasar por otro programa. Uno de los ejemplos más comunes es mojo en lugar de msagent. Uno de mis hallazgos favoritos fue encontrar una canalización con nombre que comenzaba con mojo, pero la computadora en sí no tenía Chrome instalado. Afortunadamente, resultó ser el equipo rojo interno de la empresa. Dice mucho cuando un consultor externo encuentra el equipo rojo, pero el equipo azul interno no.
Más información
Las tuberías se utilizan para la comunicación entre dos aplicaciones o procesos que utilizan memoria compartida. Hay dos tipos de tuberías, tuberías con nombre y tuberías anónimas. Un ejemplo de una tubería con nombre es \\.\PipeName\\ExampleNamedPipeServer
. Los sistemas Windows utilizan una implementación cliente-servidor para la comunicación por tuberías. En este tipo de implementación, el proceso que crea una tubería con nombre es el servidor y el proceso que se comunica con la tubería con nombre es el cliente.
Las tuberías con nombre pueden comunicarse mediante half-duplex
, o un canal unidireccional en el que el cliente solo puede escribir datos en el servidor, o duplex
, que es un canal de comunicación bidireccional que permite al cliente escribir datos a través de la tubería y al servidor responder con datos a través de esa tubería. Cada conexión activa a un servidor de tuberías con nombre da como resultado la creación de una nueva tubería con nombre. Todas ellas comparten el mismo nombre de tubería, pero se comunican mediante un búfer de datos diferente.
Podemos utilizar la herramienta PipeList de Sysinternals Suite para enumerar instancias de tuberías con nombre.
Listado de Named Pipes con Pipelist
Además, podemos usar PowerShell para enumerar las tuberías con nombre usando gci
( Get-ChildItem
).
Listado de Named Pipes con PowerShell
Después de obtener una lista de las canalizaciones con nombre, podemos usar Accesschk para enumerar los permisos asignados a una canalización con nombre específica revisando la Lista de acceso discrecional (DACL), que nos muestra quién tiene los permisos para modificar, escribir, leer o ejecutar un recurso. Echemos un vistazo al proceso LSASS
. También podemos revisar las DACL de todas las canalizaciones con nombre usando el comando .\accesschk.exe /accepteula \pipe\
.
Revisión de los permisos de Named Pipes de LSASS
Del resultado anterior, podemos ver que solo los administradores tienen acceso completo al proceso LSASS, como se esperaba.
Ejemplo de ataque de Named Pipes
Veamos un ejemplo de cómo aprovechar una canalización con nombre expuesta para escalar privilegios. Esta escalada de privilegios de canalización con nombre de WindscribeService es un gran ejemplo. Con el comando accesschk
, podemos buscar todas las canalizaciones con nombre que permitan el acceso de escritura accesschk.exe -w \pipe\* -v
y observar que la canalización con nombre WindscribeService
permite el acceso READ/WRITE
al grupo Everyone
, es decir, a todos los usuarios autenticados.
Comprobación de los permisos de la canalización con nombre de WindscribeService
Al confirmar con accesschk
vemos que el grupo Todos efectivamente tiene FILE_ALL_ACCESS
(todos los derechos de acceso posibles) sobre la tubería.
Desde aquí, podríamos aprovechar estos permisos laxos para escalar privilegios en el host a SYSTEM.
Caso práctico
Pregunta 1
¿Qué servicio está escuchando en 0.0.0.0:21? (dos palabras)
Primero mostramos los procesos en ejecución y hacemos un filtrado por el puerto 21 con FindStr:
Objetemos un servicio corriendo con un PID asignado 1740
, entonces vamos a usar el siguiente comando para ver el nombre del servicio:
Pregunta 2
¿Qué cuenta tiene privilegios
WRITE_DAC
sobre la tubería con nombre\pipe\SQLLocal\SQLEXPRESS01
?
Podemos usar el binario accesschk64.exe
para ello:
La cuenta que tiene privilegios WRITE_DAC sobre la tubería \pipe\SQLLocal\SQLEXPRESS01
es:
🔹 NT SERVICE\MSSQL$SQLEXPRESS01
Este privilegio le permite modificar la lista de control de acceso (ACL) de la tubería, lo que significa que puede cambiar los permisos y otorgar acceso a otras cuentas.
Última actualización
¿Te fue útil?