RCE để chạy whoami, ifconfig?
Hầu như ai cũng đều biết trong các loại lỗ hổng ATTT của ứng dụng thì lỗ hổng dẫn tới RCE (remote code execution) được xếp vào lỗ hổng có mức độ nghiêm trọng nhất, và trong các chương trình bugbounty lỗ hổng loại này cũng sẽ được nhận số tiền cao nhất. Nhưng trong thực tế, sau khi RCE xong bạn sẽ làm gì? hay chỉ để chạy câu lệnh whoami, ifconfig?…
Ở chỗ tôi làm, sẽ có những project pentest không chỉ là “or 1=1”, alert(1),… rồi báo cáo, mà thay vào đó bạn sẽ được nhận target là tên 1 tổ chức, công ty hay 1 domain và bạn phải hack vào tổ chức đó, đôi khi còn phải gửi email xss tới admin chờ đợi lấy được cookies, hay đôi khi phải remote desktop vào server lúc 12h đêm để quản trị server không phát hiện được. Phải chỉ ra được rằng, nếu tổ chức bị tấn công bởi hacker thật, thì sẽ nguy hiểm như thế nào, thiệt hại ra sao (tất nhiên điều này đã được sự đồng ý của đơn vị, tổ chức đó bằng văn bản). Sau đây tôi sẽ chia sẻ 1 case tôi đã từng làm, khá thú vị, nó không mang nặng kỹ thuật gì quá cao siêu, và có nhiều chỗ bạn sẽ thắc mắc “tại sao không làm thế này, tại sao không làm thế kia”, tôi cũng chẳng biết nữa, có thể skill của tôi chỉ có vậy.
Cách đây 2 hay 3 năm gì đó, tôi có được giao tấn công vào tổ chức A, là 1 công ty viễn thông ở nước ngoài, mục tiêu là xâm nhập vào sâu nhất có thể, đặc biệt là những hệ thống core về viễn thông. Tôi bắt đầu thu thập tất cả các thông tin về tổ chức: domain, ip, email,…vv, dùng một số công cụ để scan domain, scan IP, tìm ra nhiều nhất có thể các website, server của A, sắp xếp theo dải IP tương ứng để dễ quản lý. Tôi RCE được vào 1 server, server này là Windows chạy ASP.NET, MSSQL, có ip nội bộ. Tôi upload webshell, nâng quyền lên system, rồi sử dụng tool mimikatz ( https://github.com/gentilkiwi/mimikatz/) để dump password của user tử memory. Tôi lấy được vài tài khoản cùng password, password này không phải là ngẫu nhiên mà là từ có nghĩa (trong đó có cả password của Administrator). Tôi cẩn thận kiểm tra xem có session RDP nào đang hoạt động không, tạo thêm 1 tài khoản quyền admin, remote desktop vào server. Tôi sử dụng Nmap scan nhanh dải mạng /24 của ip nội bộ server trên cổng 3389 và 22. Dùng Hashcat (https://github.com/hashcat/hashcat) với các password thu thập ở trên cùng với danh sách server mở cổng 3389 tôi brutefoce tài khoản Administrator, root. May mắn thay quản trị này sử dụng chung mật khẩu cho nhiều server, tôi có được credential của gần ~10 server windows gì đó.
Tôi lần lượt tay to tìm hiểu từng server xem nó là server gì, có những gì trong đó, không quên dump password của các server đó để cho vào list danh sách username/password. Trong đám server đó tôi thấy có 1 server khá hay ho, với hostname “backup”, truy cập vào ổ D tôi thấy có 1 folder lưu một số file là backup của các server ảo hóa. Trong số này tôi để ý tới 1 thư mục có tên là “App Manager”, tôi đoán rằng server này cài ứng dụng “Applications Manager” của ManageEngine. Tôi đã từng tìm hiểu ứng dụng này và được biết được để monitor 1 máy chủ linux, có thể sử dụng mode ssh có 2 điểm đáng chú ý ở đây:
- Phải lưu ssh credential của server.
- Server này monitor các server khác nghĩa là từ server này sẽ có thể connect được tới tất cả các server khác.
Tôi download file máy ảo này về, sử dụng vmware để mở máy lên, reset password root rồi truy cập vào. Nhiệm vụ bây giờ là phải lấy được credential của các server có lưu trong DB. Tôi bắt đầu tìm hiểu về AppManager xem nó code như thế nào, sử dụng DB gì, thử truy cập vào DB xem sao. Nhưng tất nhiên các dữ liệu trong DB đều đã bị mã hóa hết rồi. Tới đây hầu như ai cũng sẽ nghĩ rằng, tìm xem hàm mã hóa của AppManager là gì, private key đặt ở đâu rồi cố gắng viết hàm giải mã. Thử search Google thì không thấy gì cả, không có thông tin gì về vấn đề này. Chỉ có cách là phải đọc code của AppManager (tất nhiên code cũng đã bị obfuscate hết rồi). Tới đây chắc có lẽ cũng đã bó tay.
Có lần 1 đồng nghiệp của tôi có từng đề cập tới kỹ thuật sniff được ssh credential dưới dạng plantext. Nghĩa là nếu có quyền root server linux, có thẻ capture được user/password những connect ssh tới server đó bằng cách:
- Strace tiến trình ssh
- Add thêm module cho ssh ( http://www.adeptus-mechanicus.com/codex/logsshp/logsshp.html)
Tới đây tôi nảy ra 1 ý tưởng: Dựng một con server rồi cho máy chủ AppManager ssh vào, rồi log đống ssh credential lại. Nhưng làm sao mà biết đống server thuộc dải IP nào mà set ip cho máy ảo nhỉ??? => route tất cả ip *.*.*.* tới 1 gateway (https://www.computerhope.com/unix/route.htm). Hehe tới đây thì mọi việc xong xuôi rồi, tôi ngồi capture được tất cả các server mà AppManager đang monitor. Tôi thống kê các dải mạng, các credential của ssh. May mắn là server “App Manager” đang chạy cũng dùng chung credential trong số credential tôi thu thập được. Tôi ssh vào server “AppManager”, từ đây tôi lại dùng hashcat bruteforce tất cả các dải mạng /24 cùng với credential ssh mà tôi thu thập được. Ok tới đây tôi đã có quyền ssh tới hầu hết các server, bao gồm những server quan trọng nhất (quản lý người dùng, server chứa các app về viễn thông,…). Tới đây thì sao? Bạn mà mang mấy cái hình ssh terminal đen xì, hay remote desktop vào server, ipconfig này kia mang demo cho Sếp lớn thì các Sếp cũng chẳng hiểu mô tê gì đâu, Sếp lại bảo ôi dào, dăm ba cái trò trẻ ranh :(. Vì vậy tôi cần phải lên 1 kịch bản demo, tôi chuẩn bị 3 kịch bản demo như sau:
- Deface trang portal.
- Cộng trừ tiền cho 1 thuê bao.
- Gửi SMS thông báo bị hack cho bộ phận IT.
Case đầu tiên thì dễ nhất rồi, chỉ việc tìm server nào là server chứa trang web portal rồi tải lên 1 file html với nội dung “Hacked by ****”. Một điều mà ngày xưa tôi vẫn thường làm, khi còn là 1 trẻ trâu :(.
Tiếp theo đó tôi tìm server chạy ứng dụng single sign on, vì tài khoản quản trị các ứng dụng khác đều được ứng dụng này quản lý. Tôi ssh vào server, download mã nguồn (ứng dụng viết bằng java), reverse, tìm tới hàm tạo mật khẩu để có thể viết lại được, sinh ra một hash hợp lệ. Sau đó connect vào DB, tạo thêm 1 row trong bảng người dùng, có mật khẩu là hash vừa tạo được, còn các trường khác thì copy y hệt tài khoản quản trị cao nhất. Yeah, tới đây tôi đã có được tài khoản quản trị của ứng dụng xác thực tập trung. Tôi add quyền access vào ứng dụng quản lý khách hàng, và ứng dụng gửi sms. Bằng 1 số biện pháp nghiệp vụ, tôi có được danh sách số điện thoại của lãnh đạo và bộ phận IT của công ty đó. Tới đây thì đơn giản hơn nhiều rồi, chỉ cần truy cập vào ứng dụng quản lý khách hàng, trừ tiền của một số thuê bao trên, rồi tạo 1 cái alias “Hacker” (giống như khi bạn nhận được tin nhắn từ 191 thì thay vì 191 thì giờ sẽ là Hacker”) dùng alias này nhắn tin tới bộ phận IT.
Yeah, tới đây là hết rồi, bạn nào muốn nghịch nghịch như thế này thì gửi CV cho mình nhé =)))). Cám ơn các bạn đã đọc :D.
Author: Khôi Dương