binwalk を使用してホーム ルーターをリバース エンジニアリングします。 ルーターのソフトウェアを信頼していますか?

binwalk を使用してホーム ルーターをリバース エンジニアリングします。 ルーターのソフトウェアを信頼していますか?

数日前、binwalk を使用してルーターのファームウェアをリバース エンジニアリングすることにしました。

自分で買った TP-Link Archer C7 ホームルーター。 最高のルーターではありませんが、私のニーズには十分です。

新しいルーターを購入するたびにインストールします OpenWrtの。 何のために? 一般に、メーカーはルーターのサポートにはあまり関心がなく、時間の経過とともにソフトウェアが古くなり、脆弱性が出現するなど、一般的には理解できるでしょう。 したがって、私はオープンソース コミュニティによって十分にサポートされている OpenWRT ファームウェアを好みます。

OpenWRT をダウンロードしたので、 最新のファームウェアイメージをダウンロードしました 公式ウェブサイトから私の新しいArcher C7を入手し、それを分析することにしました。 純粋に楽しみのため、ビンウォークについて話します。

ビンウォークとは何ですか?

ビンウォーク は、分析、リバース エンジニアリング、ファームウェア イメージ抽出のためのオープンソース ツールです。

2010 年に Craig Heffner によって作成された binwalk は、ファームウェア イメージをスキャンしてファイルを検索し、ファイル システム イメージ、実行可能コード、圧縮アーカイブ、ブートローダーとカーネル、JPEG や PDF などのファイル形式などを識別して抽出することができます。

binwalk を使用してファームウェアをリバース エンジニアリングし、ファームウェアがどのように機能するかを理解できます。 バイナリ ファイルの脆弱性を検索し、ファイルを抽出して、バックドアやデジタル証明書を探します。 見つけることもできます opcodes さまざまな CPU の束に対応します。

ファイルシステム イメージを抽出して、特定のパスワード ファイル (passwd、shadow など) を探し、パスワード ハッシュの解読を試みることができます。 XNUMX つ以上のファイル間でバイナリ解析を実行できます。 データのエントロピー分析を実行して、圧縮データまたはエンコードされた暗号化キーを検索できます。 これらすべてをソース コードにアクセスする必要はありません。

一般的に、必要なものはすべてそこにあります:)

ビンウォークはどのように機能しますか?

binwalk の主な機能は、署名スキャンです。 Binwalk はファームウェア イメージをスキャンして、さまざまな組み込みファイル タイプとファイル システムを検索できます。

コマンドラインユーティリティをご存知ですか file?

file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=12f73d7a8e226c663034529c8dd20efec22dde54, stripped

チーム fileファイルのヘッダーを調べ、署名 (マジック ナンバー) を探してファイルの種類を判断します。 たとえば、ファイルがバイトのシーケンスで始まる場合、 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A、それが PNG ファイルであることがわかります。 の上 ウィキペディア 一般的なファイル署名のリストがあります。

ビンウォークも同じように機能します。 ただし、ファイルの先頭だけで署名を探すのではなく、binwalk はファイル全体をスキャンします。 さらに、binwalk はイメージ内にあるファイルを抽出できます。

ツール file и binwalk 図書館を利用する libmagic ファイルの署名を識別します。 しかし binwalk さらに、圧縮/zip ファイル、ファームウェア ヘッダー、Linux カーネル、ブートローダー、ファイル システムなどを検索するためのカスタム マジック シグネチャのリストもサポートしています。

楽しもう?

ビンウォークのインストール

Binwalk は、Linux、OSX、FreeBSD、Windows などの複数のプラットフォームでサポートされています。

最新バージョンの binwalk をインストールするには、次のようにします。 ソースコードをダウンロードする そしてフォローしてください インストール手順 または クイックガイド、プロジェクトの Web サイトから入手できます。

Binwalk にはさまざまなパラメータがあります。

$ binwalk

Binwalk v2.2.0
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk

Usage: binwalk [OPTIONS] [FILE1] [FILE2] [FILE3] ...

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>

Extraction Options:
    -e, --extract                Automatically extract known file types
    -D, --dd=<type:ext:cmd>      Extract <type> signatures, give the files an extension of <ext>, and execute <cmd>
    -M, --matryoshka             Recursively scan extracted files
    -d, --depth=<int>            Limit matryoshka recursion depth (default: 8 levels deep)
    -C, --directory=<str>        Extract files/folders to a custom directory (default: current working directory)
    -j, --size=<int>             Limit the size of each extracted file
    -n, --count=<int>            Limit the number of extracted files
    -r, --rm                     Delete carved files after extraction
    -z, --carve                  Carve data from files, but don't execute extraction utilities
    -V, --subdirs                Extract into sub-directories named by the offset

Entropy Options:
    -E, --entropy                Calculate file entropy
    -F, --fast                   Use faster, but less detailed, entropy analysis
    -J, --save                   Save plot as a PNG
    -Q, --nlegend                Omit the legend from the entropy plot graph
    -N, --nplot                  Do not generate an entropy plot graph
    -H, --high=<float>           Set the rising edge entropy trigger threshold (default: 0.95)
    -L, --low=<float>            Set the falling edge entropy trigger threshold (default: 0.85)

Binary Diffing Options:
    -W, --hexdump                Perform a hexdump / diff of a file or files
    -G, --green                  Only show lines containing bytes that are the same among all files
    -i, --red                    Only show lines containing bytes that are different among all files
    -U, --blue                   Only show lines containing bytes that are different among some files
    -u, --similar                Only display lines that are the same between all files
    -w, --terse                  Diff all files, but only display a hex dump of the first file

Raw Compression Options:
    -X, --deflate                Scan for raw deflate compression streams
    -Z, --lzma                   Scan for raw LZMA compression streams
    -P, --partial                Perform a superficial, but faster, scan
    -S, --stop                   Stop after the first result

General Options:
    -l, --length=<int>           Number of bytes to scan
    -o, --offset=<int>           Start scan at this file offset
    -O, --base=<int>             Add a base address to all printed offsets
    -K, --block=<int>            Set file block size
    -g, --swap=<int>             Reverse every n bytes before scanning
    -f, --log=<file>             Log results to file
    -c, --csv                    Log results to file in CSV format
    -t, --term                   Format output to fit the terminal window
    -q, --quiet                  Suppress output to stdout
    -v, --verbose                Enable verbose output
    -h, --help                   Show help output
    -a, --finclude=<str>         Only scan files whose names match this regex
    -p, --fexclude=<str>         Do not scan files whose names match this regex
    -s, --status=<int>           Enable the status server on the specified port

画像スキャン

まずは画像内のファイル署名を検索してみましょう (サイトからの画像) TP-リンク).

--signature パラメーターを指定して binwalk を実行します。

$ binwalk --signature --term archer-c7.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
------------------------------------------------------------------------------------------
21876         0x5574          U-Boot version string, "U-Boot 1.1.4-g4480d5f9-dirty (May
                              20 2019 - 18:45:16)"
21940         0x55B4          CRC32 polynomial table, big endian
23232         0x5AC0          uImage header, header size: 64 bytes, header CRC:
                              0x386C2BD5, created: 2019-05-20 10:45:17, image size:
                              41162 bytes, Data Address: 0x80010000, Entry Point:
                              0x80010000, data CRC: 0xC9CD1E38, OS: Linux, CPU: MIPS,
                              image type: Firmware Image, compression type: lzma, image
                              name: "u-boot image"
23296         0x5B00          LZMA compressed data, properties: 0x5D, dictionary size:
                              8388608 bytes, uncompressed size: 97476 bytes
64968         0xFDC8          XML document, version: "1.0"
78448         0x13270         uImage header, header size: 64 bytes, header CRC:
                              0x78A267FF, created: 2019-07-26 07:46:14, image size:
                              1088500 bytes, Data Address: 0x80060000, Entry Point:
                              0x80060000, data CRC: 0xBB9D4F94, OS: Linux, CPU: MIPS,
                              image type: Multi-File Image, compression type: lzma,
                              image name: "MIPS OpenWrt Linux-3.3.8"
78520         0x132B8         LZMA compressed data, properties: 0x6D, dictionary size:
                              8388608 bytes, uncompressed size: 3164228 bytes
1167013       0x11CEA5        Squashfs filesystem, little endian, version 4.0,
                              compression:xz, size: 14388306 bytes, 2541 inodes,
                              blocksize: 65536 bytes, created: 2019-07-26 07:51:38
15555328      0xED5B00        gzip compressed data, from Unix, last modified: 2019-07-26
                              07:51:41

現在、この画像に関する多くの情報が得られています。

画像の用途 潜水艦 ブートローダーとして (イメージヘッダーは 0x5AC0 および圧縮されたブートローダー イメージ 0x5B00)。 0x13270 の uImage ヘッダーに基づいて、プロセッサ アーキテクチャが MIPS であり、Linux カーネルがバージョン 3.3.8 であることがわかります。 そして、アドレスで見つかった画像に基づいて、 0x11CEA5、それがわかります rootfs ファイルシステムです squashfs.

次のコマンドを使用してブートローダー (U-Boot) を抽出しましょう。 dd:

$ dd if=archer-c7.bin of=u-boot.bin.lzma bs=1 skip=23296 count=41162
41162+0 records in
41162+0 records out
41162 bytes (41 kB, 40 KiB) copied, 0,0939608 s, 438 kB/s

画像は LZMA を使用して圧縮されているため、解凍する必要があります。

$ unlzma u-boot.bin.lzma

これで、U-Boot イメージが完成しました。

$ ls -l u-boot.bin
-rw-rw-r-- 1 sprado sprado 97476 Fev  5 08:48 u-boot.bin

のデフォルト値を見つけてはどうでしょうか bootargs?

$ strings u-boot.bin | grep bootargs
bootargs
bootargs=console=ttyS0,115200 board=AP152 rootfstype=squashfs init=/etc/preinit mtdparts=spi0.0:128k(factory-uboot),192k(u-boot),64k(ART),1536k(uImage),14464k@0x1e0000(rootfs) mem=128M

U-Boot 環境変数 bootargs Linux カーネルにパラメータを渡すために使用されます。 上記のことから、デバイスのフラッシュ メモリについての理解が深まりました。

Linux カーネルイメージを抽出してみてはいかがでしょうか?

$ dd if=archer-c7.bin of=uImage bs=1 skip=78448 count=1088572
1088572+0 records in
1088572+0 records out
1088572 bytes (1,1 MB, 1,0 MiB) copied, 1,68628 s, 646 kB/s

次のコマンドを使用して、画像が正常に抽出されたことを確認できます。 file:

$ file uImage
uImage: u-boot legacy uImage, MIPS OpenWrt Linux-3.3.8, Linux/MIPS, Multi-File Image (lzma), 1088500 bytes, Fri Jul 26 07:46:14 2019, Load Address: 0x80060000, Entry Point: 0x80060000, Header CRC: 0x78A267FF, Data CRC: 0xBB9D4F94

uImage ファイル形式は、基本的に、追加のヘッダーを備えた Linux カーネル イメージです。 このヘッダーを削除して、最終的な Linux カーネル イメージを取得しましょう。

$ dd if=uImage of=Image.lzma bs=1 skip=72
1088500+0 records in
1088500+0 records out
1088500 bytes (1,1 MB, 1,0 MiB) copied, 1,65603 s, 657 kB/s

画像は圧縮されているので、解凍してみましょう。

$ unlzma Image.lzma

これで、Linux カーネル イメージが完成しました。

$ ls -la Image
-rw-rw-r-- 1 sprado sprado 3164228 Fev  5 10:51 Image

カーネルイメージを使って何ができるでしょうか? たとえば、イメージ内で文字列検索を実行して Linux カーネルのバージョンを見つけ、カーネルの構築に使用された環境について知ることができます。

$ strings Image | grep "Linux version"
Linux version 3.3.8 (leo@leo-MS-7529) (gcc version 4.6.3 20120201 (prerelease) (Linaro GCC 4.6-2012.02) ) #1 Mon May 20 18:53:02 CST 2019

このファームウェアは昨年 (2019 年) にリリースされましたが、この記事を書いている時点では、3.3.8 年にリリースされた古いバージョンの Linux カーネル (2012) を使用しており、これも 4.6 年以降に非常に古いバージョンの GCC (2012) でコンパイルされています。 !
(おおよその翻訳。オフィスや自宅のルーターをまだ信頼していますか?)

オプションあり --opcodes binwalk を使用してマシン命令を検索し、イメージのプロセッサ アーキテクチャを決定することもできます。

$ binwalk --opcodes Image
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
2400          0x960           MIPS instructions, function epilogue
2572          0xA0C           MIPS instructions, function epilogue
2828          0xB0C           MIPS instructions, function epilogue

ルートファイルシステムはどうなるのでしょうか? 画像を手動で抽出する代わりに、オプションを使用しましょう binwalk --extract:

$ binwalk --extract --quiet archer-c7.bin

完全なルート ファイルシステムがサブディレクトリに抽出されます。

$ cd _archer-c7.bin.extracted/squashfs-root/

$ ls
bin  dev  etc  lib  mnt  overlay  proc  rom  root  sbin  sys  tmp  usr  var  www

$ cat etc/banner
     MM           NM                    MMMMMMM          M       M
   $MMMMM        MMMMM                MMMMMMMMMMM      MMM     MMM
  MMMMMMMM     MM MMMMM.              MMMMM:MMMMMM:   MMMM   MMMMM
MMMM= MMMMMM  MMM   MMMM       MMMMM   MMMM  MMMMMM   MMMM  MMMMM'
MMMM=  MMMMM MMMM    MM       MMMMM    MMMM    MMMM   MMMMNMMMMM
MMMM=   MMMM  MMMMM          MMMMM     MMMM    MMMM   MMMMMMMM
MMMM=   MMMM   MMMMMM       MMMMM      MMMM    MMMM   MMMMMMMMM
MMMM=   MMMM     MMMMM,    NMMMMMMMM   MMMM    MMMM   MMMMMMMMMMM
MMMM=   MMMM      MMMMMM   MMMMMMMM    MMMM    MMMM   MMMM  MMMMMM
MMMM=   MMMM   MM    MMMM    MMMM      MMMM    MMMM   MMMM    MMMM
MMMM$ ,MMMMM  MMMMM  MMMM    MMM       MMMM   MMMMM   MMMM    MMMM
  MMMMMMM:      MMMMMMM     M         MMMMMMMMMMMM  MMMMMMM MMMMMMM
    MMMMMM       MMMMN     M           MMMMMMMMM      MMMM    MMMM
     MMMM          M                    MMMMMMM        M       M
       M
 ---------------------------------------------------------------
   For those about to rock... (%C, %R)
 ---------------------------------------------------------------

今では、さまざまなことができるようになりました。

構成ファイル、パスワード ハッシュ、暗号化キー、デジタル証明書を検索できます。 バイナリファイルを分析できます トラブルシューティング そして脆弱性。

ととも​​に qemu и chroot イメージから実行可能ファイルを実行 (エミュレート) することもできます。

$ ls
bin  dev  etc  lib  mnt  overlay  proc  rom  root  sbin  sys  tmp  usr  var  www

$ cp /usr/bin/qemu-mips-static .

$ sudo chroot . ./qemu-mips-static bin/busybox
BusyBox v1.19.4 (2019-05-20 18:13:49 CST) multi-call binary.
Copyright (C) 1998-2011 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]...
   or: busybox --list[-full]
   or: function [arguments]...

    BusyBox is a multi-call binary that combines many common Unix
    utilities into a single executable.  Most people will create a
    link to busybox for each function they wish to use and BusyBox
    will act like whatever it was invoked as.

Currently defined functions:
    [, [[, addgroup, adduser, arping, ash, awk, basename, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, cut, date, dd, delgroup, deluser, dirname, dmesg, echo, egrep, env, expr, false,
    fgrep, find, free, fsync, grep, gunzip, gzip, halt, head, hexdump, hostid, id, ifconfig, init, insmod, kill, killall, klogd, ln, lock, logger, ls, lsmod, mac_addr, md5sum, mkdir, mkfifo, mknod, mktemp,
    mount, mv, nice, passwd, pgrep, pidof, ping, ping6, pivot_root, poweroff, printf, ps, pwd, readlink, reboot, reset, rm, rmdir, rmmod, route, sed, seq, sh, sleep, sort, start-stop-daemon, strings,
    switch_root, sync, sysctl, tail, tar, tee, telnet, test, tftp, time, top, touch, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, which, xargs, yes, zcat

素晴らしい! ただし、BusyBox のバージョンは 1.19.4 であることに注意してください。 これは BusyBox の非常に古いバージョンです、2012年XNUMX月に発売されました。

そこで、TP-Link は 2019 年のソフトウェア (GCC ツールチェーン、カーネル、BusyBox など) を使用して、2012 年にファームウェア イメージをリリースします。

私がルータに常に OpenWRT をインストールする理由がわかりましたか?

それがすべてではありません

Binwalk は、エントロピー分析を実行し、生のエントロピー データを出力し、エントロピー グラフを生成することもできます。 通常、画像内のバイトがランダムである場合、より大きなエントロピーが観察されます。 これは、イメージに暗号化、圧縮、または難読化されたファイルが含まれていることを意味する可能性があります。 ハードコア暗号化キー? なぜだめですか。

binwalk を使用してホーム ルーターをリバース エンジニアリングします。 ルーターのソフトウェアを信頼していますか?

パラメータを使用することもできます --raw 画像またはパラメータ内のカスタムの生のバイト シーケンスを見つけるには --hexdump XNUMX つ以上の入力ファイルを比較する XNUMX 進ダンプを実行します。

カスタム署名 コマンドラインでパラメータを使用して指定されたカスタム署名ファイルを通じて binwalk に追加できます。 --magic、またはディレクトリに追加することによって $ HOME / .config / binwalk / magic.

binwalk の詳細については、次のサイトを参照してください。 公式ドキュメント.

ビンウォーク拡張

そこに API binwalk は、binwalk スキャンをプログラムで実行するために任意の Python スクリプトで使用できる Python モジュールとして実装されており、binwalk コマンド ライン ユーティリティは、わずか XNUMX 行の Python コードでほぼ完全に複製できます。

import binwalk
binwalk.scan()

Python API を使用すると、次のように作成することもできます。 Python プラグイン binwalk を設定および拡張します。

あります IDAプラグイン そしてクラウド版 ビンウォーク プロ.

それでは、インターネットからファームウェア イメージをダウンロードして、binwalk を試してみてはいかがでしょうか。 とても楽しい時間を過ごすことをお約束します:)

出所: habr.com

コメントを追加します