euid, ruid, suid
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
ruid
: 実ユーザーIDは、プロセスを開始したユーザーを示します。
euid
: 効果的ユーザーIDとして知られ、システムがプロセスの特権を確認するために使用するユーザーの識別を表します。一般的に、euid
はruid
と同じですが、SetUIDバイナリの実行のような場合には、euid
がファイル所有者の識別を引き受け、特定の操作権限を付与します。
suid
: この保存されたユーザーIDは、高特権プロセス(通常はrootとして実行される)が特定のタスクを実行するために一時的に特権を放棄し、後で元の昇格した状態を取り戻す必要があるときに重要です。
rootでないプロセスは、euid
を現在のruid
、euid
、またはsuid
に一致させることしかできません。
setuid
: 初期の仮定とは異なり、setuid
は主にeuid
を変更します。具体的には、特権プロセスの場合、指定されたユーザー(通常はroot)にruid
、euid
、およびsuid
を合わせ、これらのIDを強化します。詳細な情報はsetuidマニュアルページで確認できます。
setreuid
およびsetresuid
: これらの関数は、ruid
、euid
、およびsuid
の微妙な調整を可能にします。ただし、その機能はプロセスの特権レベルに依存します。非rootプロセスの場合、変更は現在のruid
、euid
、およびsuid
の値に制限されます。一方、rootプロセスまたはCAP_SETUID
権限を持つプロセスは、これらのIDに任意の値を割り当てることができます。詳細はsetresuidマニュアルページおよびsetreuidマニュアルページで確認できます。
これらの機能は、セキュリティメカニズムとしてではなく、プログラムが他のユーザーの識別を採用するために効果的ユーザーIDを変更する際の意図された操作フローを促進するために設計されています。
特に、setuid
はrootへの特権昇格の一般的な手段である一方で(すべてのIDをrootに合わせるため)、これらの関数の違いを理解し、さまざまなシナリオでユーザーIDの動作を操作することが重要です。
execve
システムコール機能: execve
は、最初の引数によって決定されるプログラムを開始します。引数用の2つの配列引数argv
と環境用のenvp
を取ります。
動作: 呼び出し元のメモリ空間を保持しますが、スタック、ヒープ、およびデータセグメントをリフレッシュします。プログラムのコードは新しいプログラムによって置き換えられます。
ユーザーIDの保持:
ruid
、euid
、および追加のグループIDは変更されません。
新しいプログラムにSetUIDビットが設定されている場合、euid
に微妙な変更があるかもしれません。
実行後にsuid
はeuid
から更新されます。
文書: 詳細な情報はexecve
マニュアルページで確認できます。
system
関数機能: execve
とは異なり、system
はfork
を使用して子プロセスを作成し、その子プロセス内でコマンドを実行します。
コマンド実行: sh
を介してコマンドを実行します。execl("/bin/sh", "sh", "-c", command, (char *) NULL);
を使用します。
動作: execl
はexecve
の一形態であり、同様に動作しますが、新しい子プロセスの文脈で実行されます。
文書: さらなる洞察はsystem
マニュアルページから得られます。
bash
とsh
の動作bash
:
euid
とruid
の扱いに影響を与える-p
オプションがあります。
-p
なしでは、bash
はeuid
がruid
と異なる場合、euid
をruid
に設定します。
-p
がある場合、初期のeuid
が保持されます。
詳細はbash
マニュアルページで確認できます。
sh
:
bash
の-p
に類似したメカニズムはありません。
ユーザーIDに関する動作は明示的に記載されておらず、-i
オプションの下でeuid
とruid
の等価性の保持が強調されています。
追加情報はsh
マニュアルページで確認できます。
これらのメカニズムは、異なる動作を持ち、プログラムの実行と遷移のための多様なオプションを提供し、ユーザーIDの管理と保持における特定のニュアンスを持っています。
例はhttps://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jailから取得したもので、さらなる情報はそちらで確認してください。
system
とのsetuid
の使用目的: system
とbash
をsh
として組み合わせたときのsetuid
の効果を理解すること。
Cコード:
コンパイルと権限:
分析:
ruid
と euid
はそれぞれ 99 (nobody) と 1000 (frank) から始まります。
setuid
は両方を 1000 に揃えます。
system
は sh から bash へのシンボリックリンクのために /bin/bash -c id
を実行します。
bash
は -p
なしで euid
を ruid
に合わせるため、両方が 99 (nobody) になります。
C コード:
コンパイルと権限:
実行と結果:
分析:
setreuid
は ruid と euid の両方を 1000 に設定します。
system
は bash を呼び出し、ユーザー ID の等価性によりそれらを維持し、実質的に frank として動作します。
目的: setuid と execve の相互作用を探る。
実行と結果:
分析:
ruid
は99のままですが、euidはsetuidの効果に従って1000に設定されています。
Cコード例 2 (Bashを呼び出す):
実行と結果:
分析:
euid
はsetuid
によって1000に設定されていますが、bash
は-p
がないためruid
(99)にeuid
をリセットします。
C コード例 3 (bash -pを使用):
実行と結果:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)