DDexec / EverythingExec

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Context

Linuxでは、プログラムを実行するには、それがファイルとして存在し、ファイルシステム階層を通じて何らかの方法でアクセス可能でなければなりません(これはexecve()の動作方法です)。このファイルはディスク上またはRAM(tmpfs、memfd)に存在する可能性がありますが、ファイルパスが必要です。これにより、Linuxシステム上で実行されるものを制御することが非常に簡単になり、脅威や攻撃者のツールを検出したり、彼らが何かを実行しようとするのを防ぐことが容易になります(例:特権のないユーザーが実行可能ファイルをどこにでも配置することを許可しない)。

しかし、この技術はすべてを変えるために存在します。実行したいプロセスを開始できない場合... 既存のプロセスをハイジャックします

この技術により、読み取り専用、noexec、ファイル名のホワイトリスト、ハッシュのホワイトリストなどの一般的な保護技術をバイパスすることができます...

Dependencies

最終的なスクリプトは、以下のツールに依存しており、攻撃しているシステムでアクセス可能である必要があります(デフォルトでは、これらはどこにでも存在します):

dd
bash | zsh | ash (busybox)
head
tail
cut
grep
od
readlink
wc
tr
base64

テクニック

プロセスのメモリを任意に変更できる場合、そのプロセスを乗っ取ることができます。これは、既存のプロセスをハイジャックし、別のプログラムに置き換えるために使用できます。これを達成するには、ptrace()システムコールを使用するか(これはシステムでシステムコールを実行する能力が必要です)、またはより興味深い方法として/proc/$pid/memに書き込むことができます。

ファイル/proc/$pid/memは、プロセスのアドレス空間全体の1対1のマッピングです(例: x86-64では0x0000000000000000から0x7ffffffffffff000まで)。これは、オフセットxでこのファイルから読み書きすることは、仮想アドレスxの内容を読み取ったり変更したりすることと同じであることを意味します。

さて、私たちは直面するべき4つの基本的な問題があります:

  • 一般的に、ファイルの所有者とrootのみがそれを変更できます。

  • ASLR。

  • プログラムのアドレス空間にマッピングされていないアドレスに読み書きしようとすると、I/Oエラーが発生します。

これらの問題には、完璧ではないものの良い解決策があります:

  • ほとんどのシェルインタプリタは、子プロセスによって継承されるファイルディスクリプタの作成を許可します。書き込み権限を持つシェルのmemファイルを指すfdを作成できます... そのfdを使用する子プロセスはシェルのメモリを変更できるようになります。

  • ASLRは問題ではありません。シェルのmapsファイルやprocfsの他のファイルをチェックすることで、プロセスのアドレス空間に関する情報を得ることができます。

  • したがって、ファイルに対してlseek()を行う必要があります。シェルからは、悪名高いddを使用しない限り、これを行うことはできません。

詳細に

手順は比較的簡単で、理解するために特別な専門知識は必要ありません:

  • 実行したいバイナリとローダーを解析して、必要なマッピングを特定します。次に、カーネルがexecve()を呼び出すたびに行うのと同様の手順を実行する「シェル」コードを作成します:

  • そのマッピングを作成します。

  • バイナリをそれに読み込みます。

  • 権限を設定します。

  • 最後に、プログラムの引数でスタックを初期化し、ローダーに必要な補助ベクタを配置します。

  • ローダーにジャンプし、残りの処理(プログラムに必要なライブラリの読み込み)を任せます。

  • 実行中のシステムコールから戻るアドレスをsyscallファイルから取得します。

  • その場所を上書きします。これは実行可能であり、私たちのシェルコードで上書きします(memを通じて書き込み不可のページを変更できます)。

  • 実行したいプログラムをプロセスのstdinに渡します(その「シェル」コードによってread()されます)。

  • この時点で、ローダーがプログラムに必要なライブラリを読み込み、それにジャンプするのはローダーの役割です。

ツールは https://github.com/arget13/DDexec をチェックしてください

EverythingExec

ddの代替手段はいくつかあり、そのうちの1つであるtailは、現在memファイルをlseek()するために使用されるデフォルトのプログラムです(これはddを使用する唯一の目的でした)。これらの代替手段は:

tail
hexdump
cmp
xxd

SEEKER 変数を設定することで、使用するシーカーを変更できます。例:

SEEKER=cmp bash ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)

もしスクリプトに実装されていない別の有効なシーカーを見つけた場合は、SEEKER_ARGS 変数を設定して使用することができます:

SEEKER=xxd SEEKER_ARGS='-s $offset' zsh ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)

Block this, EDRs.

参考文献

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

HackTricksをサポートする

Last updated