Phần 2 sẽ chốt hạ full chain RCE một con Camera linh tinh được cài syscall filter (syscall firewall) trên nhân hệ điều hành.
Chắc không ai hóng chờ Part 2 đâu nhưng mà thôi viết bài để nhận tiền “Dư luận viên” vậy.

 

TLDR;

IoT ngày nay tuy được tích hợp thêm lớp bảo mật ở Kernelland tuy nhiên vẫn tồn tại lỗ hổng cổ điển BOF trên Userland, cộng thêm lợi dụng một số lỗ hổng trong bộ luật kiểm duyệt syscall ta vẫn thu được Full-chain RCE như bình thường.

 

TL;DR for tech

Khai thác BOF: Chép shellcode vào một biến global đã điều khiển từ trước, Overflow return address bằng địa chỉ một biến global đó.
Shellcode có 1 tí đặc biệt khi phải bypass cái syscall filter trên kernel.

 

Thông tin chi tiết lỗ hổng:


    • Thoạt nhìn sơ qua tưởng dễ ăn, “ping -c 2 %s” thì cứ ; ` & $() Commmand Injection các kiểu. Tuy nhiên không dễ ăn thế đâu sói ạ. Sói nhìn kìa sub_404B84, chưa cần chui vào reverse chỉ cần nhìn tham số thứ nhất của nó là “/bin/ping” là đã cầm chắc 90% nó kiểu như execv chứ không phải system() đâu mà command injection sói ạ. Mà tôi cũng reverse rồi 10% còn lại không xảy ra đâu, nó chẳng qua là tách một chuỗi v3 thành chuỗi các tham số khác để chạy cùng process “/bin/ping” thôi.
      Nhưng mà nếu chỉ cưỡi ngựa xem hoa mong chờ những món mì ăn liền như Command Injection thì bạn đã bỏ sót một viên ngọc rồi, ở đây nó dùng sprintf và %s mà lại còn ghi vào biến v3 trên stack nữa => STACK OVERFLOW HERE!

  • Để Stack Overflow v3 thì phải dùng hostname_global, trace ngược hostname_global được cái này:

    Tóm tắt sơ lược hàm này là nó parse file json và nhét data vào 2 biến hostname + ipaddr bằng strcpy!!!
    Còn về phần parse json tôi cũng đã thử research, thư viện json-c kia cũng khá an toàn, search thử các bug security thì mới có mỗi 3 số, thôi tạm thời gác thằng này qua 1 bên, làm cho xong chain exploit Stack Overflow đã.
    Dễ thấy rằng nếu ta kiểm soát được 100% file vmsconf.json thì sau khi parse xong sẽ overflow cả biến toàn cục hostname lẫn ipaddr bằng hàm strcpy, sau đó function ở Hình 1 sẽ sprintf “%s” hostname hoặc ipaddr vào biến v3 dẫn đến STACK OVERFLOW

 

Quá trình khai thác:

  • File vmsconf.json kể trên dễ dàng kiểm soát bằng một request http đơn giản cấu hình camera. Mà để cấu hình camera lại cần Authen, BUG Bypass Authen thì mình xin hẹn các bạn ở Part 3 nhé =))
  • Địa chỉ global không đổi => Không cần quan tâm ASLR
    Đa số IoT Mips mọi segment đều quyền rwx => Đơn giản chỉ là nhét Shellcode vào biến global rồi Overflow Return Addr với địa chỉ của biến global kia thôi.
  • Tuy nhiên như ở phần 1 đã nói, tồn tại một thế lực nằm ở thế giới bên kia (kernel land) ngăn chặn việc thực thi tiến trình lạ, không chỉ đơn giản cái shellcode múc bừa trên mạng mà chạy được /bin/sh -c “command” …
  • Để giải quyết vấn đề này, cùng xem lại chương trình có gọi /bin/ping tức là thế lực thế giới bên kia cho phép process bị exploit này thực thi /bin/ping … lợi dụng điều này thì có cách nào chạy /bin/ping nhưng execute được command không???
    Có đấy, /bin/ping cũng chỉ là link đến /bin/busybox chẳng qua nó chỉ đích danh chạy applet ping trong busybox bằng tham số thứ 0 thôi. Còn nhớ function sub_404B84 chứ? Nó cho phép ta chạy một process và kiểm soát toàn bộ các tham số của nó => Nếu chạy function với tham số như sau: sub_404B84(“/bin/ping”, “/bin/telnetd -p 7749”) thực chất sẽ chạy busybox applet là telnetd => thế lực thế giới bên kia sẽ nhìn thấy à thằng này chạy “/bin/ping” nên sẽ cho phép chạy.

Kết quả:

Thanks for reading,

__Neo of RedTeam VNPT CI__

694 lượt xem