C を学ぶ前に、しばらく PHP を勉強しました。root コマンドを実行するために PHP を使用する必要があったのですが、ある日スーパー プラグインを検索するまで失敗しました。
C の学習に時間を費やすうちに、実行する外部コマンドを C 言語でラップできることがわかり、試してみたところ、うまくいきました。
PHP を使用すると、外部ツールを使用せずに root コマンドを実行できます。
プラットフォーム: Linux 実験用コマンド iptables 現在のディレクトリは /var/www/html/http です
プログラムを作成するときは、root ユーザーを使用してください
iptables は root 以外のユーザーが実行できないことは誰もが知っています
。
まずはCプログラムを書きます
名前: ipt.c
[コード]
#include
;
#include
;
#include
#include
;
int main()
{
uid_t uid、euid
uid = getuid();
euid = geteuid();
printf("私のuid:%u
",getuid()); //ここに表示されている現在の uid はコメントアウトできます。
printf("私の EUID:%u
",geteuid()); //ここに表示されるのは現在のeuidです
If(setreuid(euid, uid)) //これら 2 つの ID を交換します
エラー("setreuid");
printf("setreuid uid 後:%u
",getuid());
Printf("後 sertreuid euid :%u
",geteuid());
system("/sbin/iptables -L"); // iptables -L コマンドを実行します
0 を返す
}
[/コード]
ファイル gcc -o ipt -Wall ipt.c をコンパイルします
このパスに ipt 実行可能ファイルを生成します。
ここで PHP Web ページを使用して ipt を呼び出すと、setreuid を実行しても機能しません
。
次に行うことは chmod u+s ./ipt です
-rwsr-xr-x 1 ルート ルート 5382 7 月 2 日 21:45 ipt
S ビットが設定されました
それを呼び出す別の php ページを作成します。
[コード]
エコー;
$last_line = システム(/var/www/html/http/ipt, $retval);
エコー
前>
出力の最後の行: $last_line 。
戻り値: $retval;
?>
[/コード]
ブラウザで見る
[color=Red]チェーン入力 (ポリシー ACCEPT)
ターゲット プロト オプト ソース デスティネーション デスティネーション
チェーンフォワード (ポリシードロップ)
ターゲット プロト オプト ソース デスティネーション デスティネーション
すべて同意します -- どこでもどこでも状態 関連、確立
チェーン出力 (ポリシー承認)
目標
[color=Blue]私のUID:48
私のEUID:0
setreuid uid の後:0
セルトロイド・ユーイド以降:48[/color]
-------------------------------------------------- ---------------------------------
出力の最後の行: afer sertreuid euid :48
-------------------------------------------------- ---------------------------------
戻り値: 0
コマンドは正常に実行されました。
ご存知のとおり、Apache の uid は 48 です。 setreuid を呼び出した後、有効なユーザー ID と実際のユーザー ID が交換されます (chmod u+s が有効になるときでなければなりません)。これにより、Apache の現在の uid を 0 にします。 rootコマンドを実行します。