ทำ Firmware Analysis ด้วย Binwalk
Firmware Analysis คือกระบวนการวิเคราะห์หาช่องโหว่ของ Firmware โดยจะมีกระบวนการต่างๆ ดังนี้
- Acquire the Firmware ทำการ Download หรือ Dump ตัว Firmware ออกมาจากอุปกรณ์นั้น
- Analyzing the Firmware ทำการแปลง Binary file กลับมาเป็น Source Code Binwalk คือเครื่องมือที่ช่วยให้เราแปลง Binary file กลับมาเป็น Source Code ซึ่งเราจะเรียกกระบวนการนี้ว่า Reverse Engineering และนำ Code ที่ได้ไปค้นหาช่องโหว่(Static Application Security Testing: SAST)
- Emulating Firmware เราจะนำ Firmware ที่ได้ไป run เพื่อตรวจสอบหาช่องโหว่ในขณะ runtime(Dynamic Application Security Testing: DAST)
การติดตั้ง Binwalk
เราสามารถติดตั้ง Binwalk ได้ทั้งบน Linux และ Windows ซึ่งการติดตั้งจะแตกต่างกันตาม OS ที่เราใช้
การติดตั้งบน Linux
บน Limux เราจะติดตั้งผ่านทาง apt install
โดยจะมีขั้นตอนการติดตั้ง ดังนี้
- Install Binwalk ด้วยคำสั่ง
$ sudo apt install binwalk
- Run Binwalk ตรวจสอบการทำงานของ Binwalk ด้วยคำสั่ง
$ binwalk -h
การติดตั้งบน Windows
ในเครื่อง Windows ที่จะติดตั้ง binwalk ต้องมี Python ก่อนถึงจะ run binwalk ได้ ดังนั้นเราจะต้องทำตามขั้นตอนต่างๆ ดังนี้
- Install Python เราสามารถ Download ตัว Setup Python ได้ที่นี่
- Download Binwalk ลงมาในเครื่อง เราจะต้องเข้าไป Download Binwalk ที่ https://github.com/ReFirmLabs/binwalk
- Setup Binwalk หลังจากที่ Download binwalk ลงมาเรียบร้อยแล้วเราจะต้อง Setup binwalk ด้วยการ run
setup.py
> cd path\to\binwalk
> python setup.py install
- ตรวจสอบการทำงานของ Binwalk ด้วยคำสั่ง
> binwalk -h
ผลลัพธ์จะออกมาเป็น
Binwalk v2.3.3
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk
Usage: binwalk [OPTIONS] [FILE1] [FILE2] [FILE3] ...
Disassembly Scan Options:
-Y, --disasm Identify the CPU architecture of a file using the capstone disassembler
-T, --minsn=<int> Minimum number of consecutive instructions to be considered valid (default: 500)
-k, --continue Don't stop at the first match
Signature Scan Options:
-B, --signature Scan target file(s) for common file signatures
-R, --raw=<str> Scan target file(s) for the specified sequence of bytes
-A, --opcodes Scan target file(s) for common executable opcode signatures
-m, --magic=<file> Specify a custom magic file to use
-b, --dumb Disable smart signature keywords
-I, --invalid Show results marked as invalid
-x, --exclude=<str> Exclude results that match <str>
-y, --include=<str> Only show results that match <str>
Binwalk Commands
หลังจากที่เราได้ Binwalk command ที่พร้อมใช้งานแล้ว ต่อไปจะเป็นคำสั่งที่เราจะใช้ใน Binwalk ซึ่งเราต้องรู้จักไว้
Extract File
ถ้าเราต้องการ Extract File หรือทำ Reverse Engineering เรจะใช้คำสั่ง
$ binwalk -e [ไฟล์ Image]
ไฟล์ Image นั้นอาจได้มาจากหลายวิธีการ เช่น
- Download จาก Website ของผู้ผลิต
- Dump ออกมาจาก Port UART, JTAG หรือ PICit
- ดักจับ Network Traffic ในขณะที่อุปกรณ์นั้นทำการ Update
- ค้นหา URL สำหรับการ Download ตัว Upgrade
Signature Scan
เราจะใส่ -B
เข้าไปเพื่อทำการ Scan เพื่อระบุว่า file ไหนเป็น filesystem, boot loader,kernel หรือ เป็น zip file ที่สามารถ extract ออกมาได้
$ binwalk -B ddwrt-linksys-wrt1200ac-webflash.bin
ผลลัพธ์จะออกมาเป็น
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 TRX firmware header, little endian, image size: 37883904 bytes, CRC32: 0x95C5DF32, flags: 0x1, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0x0, rootfs offset: 0x0
28 0x1C uImage header, header size: 64 bytes, header CRC: 0x780C2742, created: 2018-10-10 02:12:20, image size: 2150281 bytes, Data Address: 0x8000, Entry Point: 0x8000, data CRC: 0xA097CFEA, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "DD-WRT"
92 0x5C Linux kernel ARM boot executable zImage (little-endian)
2460 0x99C device tree image (dtb)
23432 0x5B88 xz compressed data
23776 0x5CE0 xz compressed data
2117484 0x204F6C device tree image (dtb)
3145756 0x30001C UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x800, data offset: 0x1000
ในตัวอย่างนี้เราจะเห็นถึง section ต่างๆของ firmware ว่าส่วนของ Linux Kernel เริ่มจาก 0x5C ถึง 0x99B
Check Entropy
เราสามารถตรวจสอบได้ว่า Firmware นั้นมีการเข้ารหัสหรือไม่ด้วยคำสั่ง
$ binwalk -E [ไฟล์ image]
ผลลัพธ์จะออกมาเป็น
DECIMAL HEXADECIMAL ENTROPY
--------------------------------------------------------------------------------
0 0x0 Rising entropy edge (0.983751)
1155072 0x11A000 Falling entropy edge (0.000000)
1181696 0x120800 Rising entropy edge (0.990546)
3780608 0x39B000 Falling entropy edge (0.000000)
การที่เราใส่ -E
(ต่้องเป็นตัวพิมพิ์ใหญ่) จะเป็นการคำนวนค่า Entropy ของ Source code ยิ่งมีค่ามากแสดงว่ายิ่งอ่านไม่ออก ค่า Entropy จะสูงขึ้นเมื่อเปลี่ยนจาก plain text > encoded > encrypt
ถ้าเราต้องการแยกให้ละเอียดขึ้นเราสามารถใส่ --verbose
เข้าไปเพิ่ม เพื่อให้แยกค่า Entropy ตาม data block
$ binwalk -E --verbose [ไฟล์ image]
ผลลัพธ์จะออกมาเป็น
DECIMAL HEX ENTROPY ANALYSIS
--------------------------------------------------------------------------------
0 0x0 0.964914
1024 0x400 0.978591
2048 0x800 0.973048
3072 0xC00 0.976195
4096 0x1000 0.976072
5120 0x1400 0.976734
6144 0x1800 0.976861
7168 0x1C00 0.972385
8192 0x2000 0.972518
ดูพารามิเตอร์อื่นๆของ Binwalk ต่อได้ที่ Binwalk Github Page