hacktricks/linux-hardening/bypass-linux-shell-restrictions/ddexec.md
2023-07-07 23:42:27 +00:00

8.8 KiB
Raw Blame History

DDexec

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

コンテキスト

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

しかし、このテクニックはすべてを変えるためにここにあります。もし、あなたが実行したいプロセスを開始できない場合... 既に存在するプロセスを乗っ取ります

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

依存関係

最終的なスクリプトは、以下のツールに依存して動作します。攻撃対象のシステムでこれらのツールにアクセスできる必要があります(デフォルトでは、どこにでも見つけることができます)。

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

技術

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

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

さて、私たちは解決しなければならない基本的な問題が4つあります

  • 一般的に、ルートとファイルのプログラム所有者のみがそれを変更できます。
  • ASLR。
  • プログラムのアドレス空間にマップされていないアドレスに読み書きしようとすると、I/O エラーが発生します。

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

  • ほとんどのシェルインタプリタは、子プロセスで継承されるファイルディスクリプタを作成することを許可します。私たちは、書き込み権限を持つ mem ファイルを指す fd を作成することができます... したがって、その fd を使用する子プロセスはシェルのメモリを変更することができます。
  • ASLR は問題ではありません。プロセスの maps ファイルや procfs の他のファイルを調べることで、プロセスのアドレス空間に関する情報を得ることができます。
  • したがって、ファイル上で lseek() を行う必要があります。シェルからは、悪名高い dd を使用しない限り、これは行えません。

より詳細に

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

  • 実行したいバイナリとローダーを解析し、必要なマッピングを特定します。そして、カーネルが execve() を呼び出すたびに行うのとほぼ同じ手順を実行する "シェル" コードを作成します:
  • マッピングを作成します。
  • バイナリをそれらに読み込みます。
  • 権限を設定します。
  • 最後に、プログラムの引数でスタックを初期化し、ローダーが必要とする補助ベクターを配置します。
  • ローダーにジャンプし、残りの処理を任せます(プログラムに必要なライブラリをロードします)。
  • syscall ファイルから、シスコールの実行後にプロセスが戻るアドレスを取得します。
  • その場所(実行可能な場所)を私たちのシェルコードで上書きします(mem を介して書き込み不可のページを変更できます)。
  • 実行したいプログラムをプロセスの stdin に渡します("シェル" コードによって read() されます)。
  • この時点で、ローダーがプログラムのために必要なライブラリをロードし、それにジャンプするかどうかはローダー次第です。

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

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