CHFI v10 / CySA+ (CS0-003) Learn & Lab

Bất kỳ thiết bị IoT nào bạn sử dụng, bạn sẽ tương tác với firmware và điều này là do firmware là mã thực tế chạy trên IoT hoặc thiết bị nhúng. Đối với bài đăng này, chúng tôi sẽ bắt đầu bằng cách xem xét nhiều cách khác nhau để trích xuất hệ thống tệp từ chương trình cơ sở, sau đó đi sâu hơn vào việc phân tích các tệp nhị phân để tìm lỗ hổng. Kiến trúc phổ biến nhất cho các thiết bị IoT là ARM và MIPS, đây cũng là kiến trúc chúng tôi sẽ đề cập ở phần sau của loạt bài này.
Trước khi bắt đầu tìm hiểu sâu về firmware , chúng ta sẽ xem xét các thành phần và các khía cạnh liên quan, chẳng hạn như loại hệ thống tệp, nén, mã hóa và bộ tải khởi động.
Các thành phần của firmware
Các loại hệ thống tập tin:
Trong toàn bộ hành trình phân tích firmware , chúng ta sẽ gặp nhiều loại hệ thống tệp khác nhau như Squashfs, Cramfs, YAFFS2, v.v. Việc lựa chọn hệ thống tệp chỉ dành cho các nhà phát triển tạo ra các thiết bị nhúng và các chức năng khác mà họ muốn cung cấp, những chức năng này có thể có sẵn trong một hệ thống tệp này chứ không phải trong hệ thống tệp khác. Ví dụ: Squashfs là một hệ thống tệp Linux nén chỉ đọc , đây là một trong những hệ thống tệp phổ biến nhất mà bạn sẽ gặp trong các thiết bị nhúng.
Để biết danh sách đầy đủ các hệ thống tệp, vui lòng tham khảo liên kết sau: http://elinux.org/File_Systems .
Một trong những điều chúng ta có thể làm, sau khi có hình ảnh firmware dựa trên loại hệ thống tệp, chúng ta có thể mount chúng và phân tích nội dung bên trong nó.
Vì vậy, để phân tích hệ thống tập tin nằm ở vị trí nào, chúng ta có thể sử dụng Binwalk. chúng tôi sẽ thảo luận chi tiết về Binwalk sau trong bài đăng này, nhưng hiện tại, nó có thể giúp chúng tôi cung cấp địa chỉ chính xác nơi đặt hệ thống tệp.

Để gắn hình ảnh jffs2 vào hệ thống , điều đầu tiên chúng ta sẽ làm là cung cấp một phân vùng MTD trong RAM có kích thước được chỉ định bởi Total_size.
modprobe mtdram Total_size=25247744
Tiếp theo, chúng ta sẽ tạo một thiết bị khối mà qua đó chúng tôi có thể truy cập vào phân vùng, sau đó tải lên hỗ trợ cho các hệ thống tệp jffs2 có thể không được bật theo mặc định.
modprobe mtdblock
modprobe jffs2
Việc tiếp theo là sao chép hệ thống tệp từ vị trí dẫn xuất ở trên và xuất sang tệp mới bằng dd.

Sau khi hoàn tất, chúng tôi sẽ chỉ cần sao chép hệ thống tệp từ tệp đã tạo (filesys) sang mtdblock0 .

Sau khi hoàn tất, chúng ta có thể sử dụng mount để gắn kết hệ thống tập tin để có thể truy cập nó. Chúng ta có thể nhanh chóng xem trang chính của mount và xem cách chúng ta có thể mount hình ảnh của mình.

Vì chúng ta biết rằng loại hệ thống tập tin là jffs2 nên chúng ta chỉ cần tiếp tục và sử dụng lệnh mount như đã đề cập trong trang man. Vì vậy, chúng tôi chỉ cần tạo một thư mục mới ở vị trí hiện tại có tên jffs2 và gắn mtdblock vào thư mục đó.

Như bạn có thể thấy từ hình trên, bây giờ chúng ta có quyền truy cập vào toàn bộ hệ thống tập tin. Đây chỉ là một ví dụ về cách chúng ta có thể truy cập vào hệ thống tệp của phần sụn. Sau này, chúng ta sẽ thấy các kỹ thuật đơn giản khác để làm điều tương tự.
Nén và mã hóa:
Khi đã hiểu hệ thống tệp, chúng ta cần hiểu các khía cạnh khác liên quan đến phần sụn – cụ thể là tính năng nén và mã hóa đang được sử dụng. Hệ thống tệp trong các thiết bị nhúng thường được nén để tiết kiệm dung lượng. Một số cách nén phổ biến nhất được sử dụng bởi các hệ thống tệp thiết bị IoT là LZMA, GZIP, Zlib, Zip và ARJ, cùng một số cách nén khác.
Hãy áp dụng một số kiến thức này vào thực tế. Chúng tôi biết rằng một số nhà cung cấp hệ thống tệp Squashfs nén LZMA sử dụng số ma thuật shsq. Vì vậy, chúng ta có thể thực hiện hexdump trên chương trình cơ sở của mình và grep để shsq biết địa chỉ bắt đầu của chương trình cơ sở.

Như chúng ta có thể thấy ở trên, chúng ta đã tìm thấy số ma thuật shsq tại vị trí 0x000e0080. Bây giờ chúng ta đã biết địa chỉ bắt đầu của hệ thống tệp, chúng ta có thể kết xuất nội dung bằng dd.

Vì chúng tôi biết rằng đó là loại tệp Squashfs nên chúng tôi có thể chạy unsquashfs trên đó để truy cập hệ thống tệp. -l chỉ đơn giản liệt kê nội dung của hệ thống tập tin.

Nếu bạn chạy unsquashfs -h, nó sẽ hiển thị rằng công cụ unsquashfs đã hỗ trợ nén lzma.

Vì vậy, chúng ta có thể tiếp tục và giải nén hệ thống tệp từ filesystem.bin.

Thao tác này sẽ tạo một thư mục có tên là squallfs-root, thư mục này sẽ được giải nén toàn bộ hệ thống tập tin. Từ đây, giờ đây chúng tôi có thể phân tích các tệp nhị phân riêng lẻ hoặc xem các tệp cấu hình để xác định các lỗ hổng.
Bộ nạp khởi động:
Bộ tải khởi động là thành phần của bất kỳ thiết bị nào giúp toàn bộ hệ thống khởi động, nói một cách đơn giản nhất có thể. Nó giúp toàn bộ hệ thống thiết lập cài đặt hệ thống và sau đó tải kernel sẽ được sử dụng để tải toàn bộ hệ thống tập tin.
Một số bộ tải khởi động phổ biến nhất là Das uBoot, Redboot, CFE, v.v. Chúng ta sẽ gặp lại bootloader sau trong loạt blog này, nhưng hiện tại, chúng ta sẽ giới hạn nó ở mức này.
Bạn có thể đọc thêm về bộ tải khởi động tại đây – http://www.informit.com/articles/article.aspx?p=1647051 .
Khi chúng ta đã hiểu phần sụn,
Để có thể thực hiện phân tích phần sụn, điều quan trọng là phải hiểu cách lấy phần sụn ngay từ đầu. Thông thường, có hai cách để lấy chương trình cơ sở cho một thiết bị cụ thể:
Lấy chương trình cơ sở từ trang web của nhà cung cấp: Nhiều nhà sản xuất thiết bị IoT sẽ liệt kê chương trình cơ sở trong phần Tải xuống hoặc Hỗ trợ của trang web để người dùng có thể tải xuống và cập nhật thiết bị theo cách thủ công.
Kết xuất phần sụn khỏi thiết bị thông qua các kỹ thuật khai thác phần cứng: Điều này có thể đạt được bằng cách kết xuất phần sụn bằng cách sử dụng giao tiếp nối tiếp như UART hoặc JTAG hoặc sử dụng SPI Flash. Chúng tôi sẽ thảo luận về kỹ thuật này trong các bài viết sau của chúng tôi.
Khi bạn đã có được chương trình cơ sở, bây giờ chúng ta có thể tiến hành sâu hơn và bắt đầu với các kỹ thuật phân tích của mình. Đối với bài tập này, chúng tôi sẽ sử dụng Phần sụn bộ định tuyến dễ bị tổn thương chết tiệt, có thể lấy từ đây – https://github.com/praetorian-inc/DVRF .
Khi chúng tôi có DVRF.bin, tức là chương trình cơ sở, chúng tôi có thể chạy kết xuất hex nhanh trên đó để xem liệu chúng tôi có thể xác định nó thuộc về thiết bị nào và có thể cả một số thông tin bổ sung hay không.
Như chúng ta có thể thấy từ kết xuất hex, mặc dù hầu hết thông tin không có ý nghĩa, nhưng có hai chuỗi nổi bật – u2nd và hdr0. Chỉ cần tìm kiếm nhanh trên Google, chúng tôi biết rằng điều này có liên quan đến sản phẩm Linksys và thực tế đúng như vậy.

Ngay cả khi đó, chúng tôi vẫn không có đủ thông tin về phần sụn mà chúng tôi có thể sử dụng để khai thác. Vì vậy, tiếp tục từ kết xuất hex, điều tiếp theo chúng ta sẽ làm là chạy binwalk trên đó.
Binwalk là một công cụ kỹ thuật đảo ngược phần sụn được tạo bởi Craig Heffner(@devttys0) để giúp những người kiểm tra bút và các nhà nghiên cứu bảo mật phân tích và hiểu phần sụn. Công cụ này hỗ trợ nén và mã hóa hệ thống tệp khác nhau và là một công cụ thực tế khi nói đến kỹ thuật đảo ngược chương trình cơ sở. Việc cài đặt binwalk trên hệ thống của bạn rất đơn giản và bạn có thể làm theo hướng dẫn trên trang Github của dự án tại đây – https://github.com/devttys0/binwalk/blob/master/INSTALL.md .
Khi bạn đã thiết lập binwalk trên hệ thống của mình, bước tiếp theo sẽ là sử dụng binwalk để phân tích chương trình cơ sở và hiểu các phần khác nhau có trong đó. Khi chúng tôi chạy binwalk trên DVRF.bin, bên dưới là những gì chúng tôi sẽ thấy.

Như chúng ta có thể thấy ở trên, tiêu đề bắt đầu từ 0x20 và tiếp tục cho đến 0x3c, sau đó là dữ liệu nén gzip với tên tệp piggy và cuối cùng là hệ thống tệp squatfs bắt đầu từ 0x192728.
Vì vậy, hãy sử dụng binwalk để giải nén cả piggy cũng như hệ thống tệp squatfs. Bạn cũng có thể sử dụng dd cho mục đích tương tự; binwalk chỉ đơn giản hóa toàn bộ quá trình.
Chạy binwalk trên DVRF.bin để trích xuất, chúng tôi sẽ có thể lấy được nội dung của hệ thống tệp và dữ liệu bổ sung được lưu trữ bên trong chương trình cơ sở.
binwalk -e DVRF_0.3.bin

Như chúng ta có thể thấy từ hệ thống tệp được trích xuất, đó là một hệ điều hành dựa trên Linux. Linux là một trong những hệ điều hành phổ biến nhất mà bạn sẽ gặp phải khi đảo ngược chương trình cơ sở, tiếp theo là các hệ điều hành khác như VxWorks và eCOS.
Khi chúng tôi đã giải nén phần sụn, bước tiếp theo là xem xét các tệp nhị phân khác nhau có trong phần sụn và phân tích chúng để xác định các lỗ hổng. Một trong những cách dễ dàng để bắt được quả treo thấp là kiểm tra phiên bản của các tệp nhị phân phổ biến như busybox và xem liệu bạn có thể tìm thấy cách khai thác tương ứng cho phiên bản nhất định đó hay không.
Bây giờ chúng ta hãy xem phần sụn khác của thiết bị Dlink (đề cập đến tên thiết bị và URL tải xuống phần sụn). Vì vậy, chúng tôi chỉ cần tải xuống chương trình cơ sở từ trang web và sử dụng binwalk để trích xuất hệ thống tệp từ chương trình cơ sở.
binwalk -e Dlink.bin
Hãy thử tìm kiếm thông tin xác thực nhạy cảm trong phần sụn này. Telnet có vẻ là một điểm khởi đầu tốt vì nó có thể cấp cho chúng tôi quyền truy cập vào thiết bị chạy chương trình cơ sở này.
Nếu chúng ta grep cho telnet, chúng ta có thể thấy rằng có một tệp nằm ở /etc/scripts/misc/telnetd.sh.

Nếu chúng ta mở tệp này, nội dung sẽ trông như thế nào bên dưới.

Như chúng ta có thể thấy từ tệp, nó thực sự chứa mã để đăng nhập vào phiên telnet với tên người dùng của Alphanetworks và mật khẩu là nội dung của tệp được chỉ định bởi $image_sign. Nếu chúng ta nhìn kỹ, ngay trong dòng thứ hai của tập lệnh, biến $image_sign được đề cập là nội dung của tệp /etc/config/image_sign.
Vì vậy, nếu chúng ta chỉ cần cat tệp /etc/config/image_sign, chúng ta sẽ có mật khẩu đăng nhập telnet. Dưới đây là như nhau.

Do đó, chúng tôi có thể đảo ngược hệ thống tệp từ chương trình cơ sở của bộ định tuyến Dlink và có thể lấy thông tin đăng nhập telnet từ nó.
Công cụ tự động
Tồn tại một số công cụ tự động để thực hiện phân tích tĩnh và động của phần sụn. Một công cụ phổ biến như vậy là Firmwalker, được phát triển bởi Craig Smith, thực hiện phân tích tĩnh trên phần sụn bằng cách thực hiện kiểm tra các chuỗi thú vị.
Để chạy Firmwalker, hãy sao chép repo github và trỏ Firmwalker.sh vào bất kỳ hệ thống tệp được trích xuất nào của phần sụn.
bản sao git https://github.com/craigz28/firmwalker.git
CD Firmwalker
Sau khi hoàn tất, chỉ cần tiếp tục và chạy Firmwalker.sh trên bất kỳ hệ thống tệp nào được trích xuất từ binwalk. Trong trường hợp này, chúng tôi sẽ chạy nó trên hệ thống tệp của Firmware Bộ định tuyến dễ bị tổn thương chết tiệt.

Nhìn chung, Firmwalker là một công cụ tuyệt vời giúp bạn bắt đầu phân tích chương trình cơ sở và cho phép bạn tìm các tệp thú vị mà bạn có thể xem xét sâu hơn.
Ngoài ra còn có các công cụ tự động khác có thể được sử dụng để phân tích tĩnh và động của phần sụn. Vì việc thiết lập chúng phức tạp hơn một chút và yêu cầu hướng dẫn sâu hơn nhiều nên chúng tôi sẽ đề cập đến vấn đề này trong các bài đăng sắp tới.
Phân tích nhị phân bằng cách sử dụng tháo gỡ
Một trong những kỹ thuật khai thác quan trọng nhất, sau khi chúng tôi đã giải nén phần sụn, là phân tích các tệp nhị phân thú vị thông qua việc tháo gỡ. Sau khi giải nén Firmware Bộ định tuyến dễ bị tổn thương chết tiệt, bạn sẽ tìm thấy các tệp nhị phân thú vị nằm ở squallfs-root/pwnables/Intro/.
Bạn có thể tháo rời chúng thông qua các công cụ như objdump, IDA hoặc thậm chí là trình dịch ngược trực tuyến. Ví dụ: nếu chúng ta thử tệp nhị phân có tại pwnables/Intro/stack_bof1 trong onlinedisassembler.com, chúng ta có thể thấy các hàm khác nhau trong tệp nhị phân và quá trình phân tách cho từng hàm đó.
Ảnh chụp màn hình bên dưới hiển thị quá trình tháo gỡ stack_bof1 trên onlinedisassembler.com.

Ngoài ra, giống như bất kỳ trình tháo gỡ nâng cao nào khác, trình tháo gỡ trực tuyến cũng có chức năng hiển thị cho bạn bố cục biểu đồ của toàn bộ quá trình tháo gỡ, như hiển thị bên dưới.

Đó là tất cả cho bài đăng này về Bắt đầu với phân tích chương trình cơ sở. Trong bài đăng tiếp theo, chúng ta sẽ tìm hiểu cách bạn có thể mô phỏng chương trình cơ sở và thậm chí gỡ lỗi các tệp nhị phân bên trong chương trình cơ sở trong thời gian thực.





Bình luận về bài viết này