Phân tích IoT Firmware

Một bài hướng dẫn phân tích khá hay từ infosec, bài tập cần thiết cho những ai đang theo học chương trình CHFI và CPENT. Các công cụ triển khai trong bài này là binwalk và firmwalker cùng với onlinedisassembler.com , để thực hành theo cần có Kali Linux và tải các mẫu firmware về để lab.

Giới thiệu

Nguồn – Tài liệu tham khảo cho các member chương trình CHFI và CPENT

Đây là bài đăng trong loạt bài Thử nghiệm thâm nhập và khai thác IoT. Trong bài đăng này, chúng ta sẽ xem xét một thành phần quan trọng trong kiến ​​trúc thiết bị IoT – Phần sụn (theo Google dịch) hay thường gọi là firmware.

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 có thể được coi là mã thực chạy trên IoT hoặc thiết bị nhúng. Đối với bài này, chúng ta 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ừ firmware, sau đó chuyển sang phân tích sâu hơn 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 trong 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.

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íchfirmware, chúng ta sẽ bắt gặp nhiều loại hệ thống tệp khác nhau, chẳng hạn 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 thiết bị nhúng và các chức năng khác mà họ muốn cung cấp, có thể có sẵn trong một hệ thống tệp và không có trong hệ thống tệp khác. Ví dụ: Squashfs là một hệ thống tệp nén chỉ đọc của Linux, đâ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 này: http://elinux.org/File_Systems .

Để 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 trên hệ thống điều đầu tiên là cung cấp 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 thông 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í bắt nguồn ở trên và xuất sang một tệp mới bằng cách sử dụng dd.

Sau khi hoàn tất, chúng ta 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 hệ thống tệp để chúng ta có thể truy cập nó. Chúng tôi có thể nhanh chóng xem trang chính của giá treo và xem cách chúng tôi có thể gắn hình ảnh của mình.

Vì chúng tôi biết rằng loại hệ thống tệp là jffs2, chúng tôi chỉ cần tiếp tục và sử dụng lệnh mount như đã đề cập trong trang hướng dẫn. 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ủa chúng tôi có tên là jffs2 và gắn mtdblock vào thư mục đó.

Như bạn có thể thấy từ hình trên, giờ đây chúng ta có quyền truy cập vào toàn bộ hệ thống tệp. Đây chỉ là một ví dụ về cách chúng tôi 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 khác đơn giản hơn để 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à nén và mã hóa đượ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ố kiểu 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 .

Hãy đưa một số kiến ​​thức này vào sử dụng thực tế. Chúng tôi biết rằng một số nhà cung cấp cho 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 firmware của mình và grep cho shsq để biết địa chỉ bắt đầu của firmware.

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 cách sử dụng dd.

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

Nếu bạn chạy unsquashfs -h, nó sẽ cho biết công cụ unsquashfs đã hỗ trợ nén lzma.

Vì vậy, chúng tôi chỉ cần 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à squashfs-root, thư mục này sẽ giải nén toàn bộ hệ thống tệp. Từ đây, bây giờ chúng ta có thể phân tích các tệp nhị phân riêng lẻ hoặc tìm trong các tệp cấu hình để xác định các lỗ hổng.

bộ tải 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ác cài đặt hệ thống và sau đó tải lên kernel sẽ được sử dụng để tải lên toàn bộ hệ thống tệp.

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ẽ bắt gặp lại bootloader sau trong loạt blog này, nhưng hiện tại, chúng tôi 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 .

Để có thể thực hiện phân tích firmware, điều quan trọng là phải hiểu cách nắm giữ firmware ngay từ đầu. Thông thường, có hai cách để có được 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ẽ có chương trình cơ sở được liệt kê 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 firmware 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 firmware 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 tasẽ thảo luận về kỹ thuật này trong các bài viết sau này.

Khi bạn đã có được chương trình cơ sở, bây giờ chúng ta có thể tiếp tục 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 firmware bộ định tuyến dễ bị tổn thương có thể lấy từ đây – https://github.com/praetorian-inc/DVRF .

Khi đã có DVRF.bin , đó là chương trình cơ sở, các bạn hãy chạy kết xuất hex nhanh trên đó để xem liệu có thể xác định xem nó thuộc về thiết bị nào không và một số thông tin bổ sung.

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 gì, hai trong số các 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 một sản phẩm của Linksys, điều này thực sự đúng như vậy.

Ngay cả khi đó, chúng ta không có đủ thông tin về firmware mà 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 firmware do Craig Heffner (@devttys0) tạo ra để giúp pentester và các nhà nghiên cứu bảo mật phân tích và hiểu về firmware . Công cụ này hỗ trợ các mã hóa và nén 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 firmware . 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 – (hoặc sử dụng sẳn có trên Kali Linu hay Parrot OS) 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 các bạn chạy binwalk trên DVRF.bin, bên dưới là những gì chúng ta 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 có tên tệp piggy và cuối cùng là hệ thống tệp squashfs 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 squashfs. 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ể đạt được nội dung của hệ thống tệp và dữ liệu bổ sung được lưu trữ bên trong phần sụn.

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ĐH 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ĐH khác như VxWorks và eCOS.

Khi các bạn đã giải nén firmware, bước tiếp theo là xem xét các tệp nhị phân khác nhau có trong đó 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 quả treo thấp (hay low hanging fruit – dịch ra rất thú vị, kiểu như hái quả ở dưới thấp mà không cần trèo lên cây, hay nôm na là tìm cái nào dễ trước) 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 đã cho đó hay không.

Bây giờ, chúng ta hãy xem một chương trình cơ sở khác của thiết bị Dlink (đề cập đến tên thiết bị và URL tải xuống chương trình cơ sở). Vì vậy, chúng tôi sẽ chỉ cần tải xuống firmware từ trang web và sử dụng binwalk để giải nén hệ thống tệp từ phần sụn.

binwalk -e Dlink.bin

Hãy thử tìm kiếm thông tin xác thực nhạy cảm trong firmware này. Telnet có vẻ như 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 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 tôi mở tệp này, bên dưới là nội dung trông như thế nào.

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 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 xem xét 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 ta 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

Có một số công cụ tự động để thực hiện phân tích động và tĩnh của firmware. Một công cụ phổ biến như vậy là firmwalker, do Craig Smith phát triển, thực hiện phân tích tĩnh trên firmware 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 phần sụn nào được giải nén.

bản sao git https://github.com/craigz28/firmwalker.git

máy nghe nhạc cd

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 giải nén 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 Phần sụn bộ định tuyến dễ bị tổn thương.

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 phần sụn và cho phép bạn tìm các tệp thú vị mà bạn có thể xem xét thêm.

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 động và tĩnh của firmwalker. Vì chúng phức tạp hơn một chút để thiết lập và yêu cầu hướng dẫn sâu hơn nhiều, chúng tôi sẽ đề cập đến nó trong các bài đăng sắp tới.

Phân tích nhị phân bằng cách sử dụng disassembly

Một trong những kỹ thuật khai thác quan trọng nhất, sau khi chúng ta trích xuất phần sụn, là phân tích các tệp nhị phân thú vị thông qua việc disassembly. Khi bạn giải nén firmware bộ định tuyến dễ bị tổn thương, bạn sẽ tìm thấy các tệp nhị phân thú vị nằm ở squashfs-root/pwnables/Intro/.

Bạn có thể phân tách chúng thông qua các công cụ như objdump, IDA hoặc thậm chí là trình phân tách trực tuyến. Ví dụ: nếu chúng tôi dùng thử tệp nhị phân tại pwnables/Intro/stack_bof1 trong onlinedisassembler.com, chúng ta có thể thấy các chức năng khác nhau trong tệp nhị phân và cách tháo gỡ cho từng chức năng.

Ả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 phân tách nâng cao nào khác, trình phân tách trực tuyến cũng có chức năng hiển thị cho bạn bố cục đồ thị của toàn bộ quá trình phân tách, như minh họa bên dưới.

Đó là tất cả cho bài đăng này về Bắt đầu với phân tích firmware. Trong bài đăng tiếp theo, chúng tôi sẽ giới thiệ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.

@ eLearning CHF và CPENT tại CEHVIETNAM

Trả lời

Bạn cần phải đăng nhập để gửi bình luận:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s