Coding Gun

ทำ Firmware Analysis ด้วย Binwalk

Firmware Analysis คือกระบวนการวิเคราะห์หาช่องโหว่ของ Firmware โดยจะมีกระบวนการต่างๆ ดังนี้

  1. Acquire the Firmware ทำการ Download หรือ Dump ตัว Firmware ออกมาจากอุปกรณ์นั้น
  2. Analyzing the Firmware ทำการแปลง Binary file กลับมาเป็น Source Code Binwalk คือเครื่องมือที่ช่วยให้เราแปลง Binary file กลับมาเป็น Source Code ซึ่งเราจะเรียกกระบวนการนี้ว่า Reverse Engineering และนำ Code ที่ได้ไปค้นหาช่องโหว่(Static Application Security Testing: SAST)
  3. Emulating Firmware เราจะนำ Firmware ที่ได้ไป run เพื่อตรวจสอบหาช่องโหว่ในขณะ runtime(Dynamic Application Security Testing: DAST)

การติดตั้ง Binwalk

เราสามารถติดตั้ง Binwalk ได้ทั้งบน Linux และ Windows ซึ่งการติดตั้งจะแตกต่างกันตาม OS ที่เราใช้

การติดตั้งบน Linux

บน Limux เราจะติดตั้งผ่านทาง apt install โดยจะมีขั้นตอนการติดตั้ง ดังนี้

  1. Install Binwalk ด้วยคำสั่ง
$ sudo apt install binwalk
  1. Run Binwalk ตรวจสอบการทำงานของ Binwalk ด้วยคำสั่ง
$ binwalk -h

การติดตั้งบน Windows

ในเครื่อง Windows ที่จะติดตั้ง binwalk ต้องมี Python ก่อนถึงจะ run binwalk ได้ ดังนั้นเราจะต้องทำตามขั้นตอนต่างๆ ดังนี้

  1. Install Python เราสามารถ Download ตัว Setup Python ได้ที่นี่
  2. Download Binwalk ลงมาในเครื่อง เราจะต้องเข้าไป Download Binwalk ที่ https://github.com/ReFirmLabs/binwalk
  3. Setup Binwalk หลังจากที่ Download binwalk ลงมาเรียบร้อยแล้วเราจะต้อง Setup binwalk ด้วยการ run setup.py
> cd path\to\binwalk
> python setup.py install
  1. ตรวจสอบการทำงานของ 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 นั้นอาจได้มาจากหลายวิธีการ เช่น

  1. Download จาก Website ของผู้ผลิต
  2. Dump ออกมาจาก Port UART, JTAG หรือ PICit
  3. ดักจับ Network Traffic ในขณะที่อุปกรณ์นั้นทำการ Update
  4. ค้นหา 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

Phanupong Permpimol
Follow me