DrayTek Vigor3910 CVE-2024-41592分析

DrayTek Vigor3910 CVE-2024-41592分析

博智非攻研究院 博智非攻研究院 2025-01-27 04:07

01

漏洞描述

CVE-2024-41592:DrayTek Vigor3910 devices through 4.3.2.6 have a stack-based overflow when processing query string parameters because GetCGI mishandles extraneous ampersand characters and long key-value pairs.

CVE-2024-41592:DrayTek Vigor3910 设备在 4.3.2.6 及之前版本在处理查询字符串参数时出现基于堆栈的溢出,因为 GetCGI 错误地处理了无关的 & 字符和长键值对。

02

固件分析

到官网下载
Vigor3910固件,通过binwalk -E查看可以发现其镝值为1,可以得知此固件为加密固件:

去查找一下以前版本有没有中间过渡件,
在固件下载链接中找到V3.9.7.1版本,binwalk -Me可解出特征,但并不支持binwalk解压,解压不出来完整的文件系统:

通过-E参数可以知道,此固件并没有加密:

结合固件的基本结构,bootloader引导加载程序,kernel内核(通常采用压缩的方式),rootfs文件系统……
根据binwalk的解析出来的信息可以分析得知,
此块推测可能为bootloader 0-0x2C0A57

273054        0x42A9E         Unix path: /home/eason_jhan/1000b/cavium/firmware/bdk/libbdk-os/bdk-rlock.c280056        0x445F8         AES S-Box280568        0x447F8         AES Inverse S-Box283704        0x45438         SHA256 hash constants, little endian469662        0x72A9E         Unix path: /home/eason_jhan/1000b/cavium/firmware/bdk/libbdk-os/bdk-rlock.c476664        0x745F8         AES S-Box477176        0x747F8         AES Inverse S-Box480312        0x75438         SHA256 hash constants, little endian571444        0x8B834         AES Inverse S-Box571700        0x8B934         AES S-Box573012        0x8BE54         SHA256 hash constants, little endian833588        0xCB834         AES Inverse S-Box833844        0xCB934         AES S-Box835156        0xCBE54         SHA256 hash constants, little endian2032941       0x1F052D        Neighborly text, “neighbor %d too different %d from average %d, picking %d.LMC%d.R%d: MAJORTY: Byte %d: picking majority of %d over average %d.”2057224       0x1F6408        AES S-Box2057736       0x1F6608        AES Inverse S-Box2079947       0x1FBCCB        Unix path: /home/eason_jhan/1000b/cavium/firmware/bdk/libbdk-os/bdk-rlock.c2096368       0x1FFCF0        SHA256 hash constants, little endian2119768       0x205858        LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 2285442 bytes

此块可能为kernel 0x205858-0xEE3DF1,因为有LZMA压缩标识,并且这区间有ftb设备树标识

2886232       0x2C0A58        LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 311880 bytes3000920       0x2DCA58        LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 630943 bytes3155032       0x302458        Flattened device tree, size: 5542 bytes, version: 173160664       0x303A58        Flattened device tree, size: 4223 bytes, version: 173165272       0x304C58        Flattened device tree, size: 157 bytes, version: 173165784       0x304E58        Flattened device tree, size: 6321 bytes, version: 173172440       0x306858        Flattened device tree, size: 7806 bytes, version: 173180632       0x308858        Flattened device tree, size: 4081 bytes, version: 173184728       0x309858        Flattened device tree, size: 555 bytes, version: 17省略……3557526       0x364896        Copyright string: “Copyright (C) 2016, Cavium Inc.”3559079       0x364EA7        Copyright string: “copyright notice and this permission notice shall be”3561562       0x36585A        Unix path: /sys/class/gpio/gpio472) for DSL model5052256       0x4D1760        CRC32 polynomial table, little endian5058320       0x4D2F10        AES Inverse S-Box5065888       0x4D4CA0        AES S-Box5099137       0x4DCE81        Motorola S-Record; binary data in text format, record type: header5259312       0x504030        Linux kernel ARM64 image, load offset: 0x80000, image size: 44011520 bytes, little endian, 4k page size,5499456       0x53EA40        SHA256 hash constants, little endian12693552      0xC1B030        ELF, 64-bit LSB shared object, version 1 (SYSV)12741544      0xC26BA8        gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)12820184      0xC39ED8        Intel x86 or x64 microcode, sig 0xffffff80, pf_mask 0x00, 1DE0-08-26, size 204812820328      0xC39F68        Intel x86 or x64 microcode, sig 0xffffff80, pf_mask 0x00, 1DE0-08-26, size 204812897440      0xC4CCA0        DES SP2, little endian12897952      0xC4CEA0        DES SP1, little endian12923200      0xC53140        LZO compressed data12925744      0xC53B30        CRC32 polynomial table, little endian13188944      0xC93F50        Copyright string: “Copyright (c) 1999-2006 Intel Corporation.”13196536      0xC95CF8        Copyright string: “Copyright (c) 2009 – 2012 Intel Corporation.”13197320      0xC96008        Copyright string: “Copyright (c) 1999-2008 Intel Corporation.”13199736      0xC96978        Copyright string: “Copyright (c) 2013 – 2016 Intel Corporation.”13410380      0xCCA04C        Certificate in DER format (x509 v3), header length: 4, sequence length: 1484814404968      0xDBCD68        Unix path: /dev/vc/014479296      0xDCEFC0        Ubiquiti partition header, header size: 56 bytes, name: “PARTNAME=%s”, base address: 0x74790A00, data size: 23295090 bytes14486472      0xDD0BC8        xz compressed data14569424      0xDE4FD0        Unix path: /lib/firmware/updates/4.9.0-OCTEONTX_SDK_6_2_0_p3_build_3814663912      0xDFC0E8        Ubiquiti firmware additional data, name: UTE DEVICE DIAGNOSTIC, size: 1145372672 bytes, size2: 0 bytes, CRC32: 014712280      0xE07DD8        Copyright string: “Copyright(c) 1999-2006 Intel Corporation”14789199      0xE1AA4F        Copyright string: “Copyright 2005-2007 Rodolfo Giometti”14812265      0xE20469        Copyright string: “Copyright(c) Pierre Ossman”14848048      0xE29030        Unix path: /sys/firmware/devicetree/base14848848      0xE29350        Unix path: /sys/firmware/fdt’: CRC check failed14864129      0xE2CF01        Neighborly text, “neighbor table overflow!ate is %x”15613000      0xEE3C48        LZ4 compressed data, legacy

此块可能为rootfs 0xEE3C48-末尾,从这里开始有Executable script的标识,表示存在实际的shell脚本文件内容了,以及后面有图片、网页的标识,可以断定为文件系统

15613426      0xEE3DF2        Executable script, shebang: “/bin/sh”16971299      0x102F623       Unix path: /dev/net/tun.17236166      0x10700C6       mcrypt 2.5 encrypted data, algorithm: “w”, keysize: 332 bytes, mode: “””,19705376      0x12CAE20       XML document, version: “1.0”20045201      0x131DD91       VMware4 disk image20045848      0x131E018       Executable script, shebang: “/bin/sh”20089785      0x1328BB9       AES Inverse S-Box20090041      0x1328CB9       AES S-Box20090329      0x1328DD9       DES PC1 table20090417      0x1328E31       DES PC2 table20111190      0x132DF56       Base64 standard index table21756040      0x14BF888       Unix path: /sys/class/net/%s/phy8021122373111      0x15562F7       Base64 standard index table22816893      0x15C287D       MPEG transport stream data23678637      0x1694EAD       Copyright string: “Copyright 1995-2005 Jean-loup Gailly “23745388      0x16A536C       PGP RSA encrypted session key – keyid: D8020270 1B1148DC RSA Encrypt-Only 1024b24029059      0x16EA783       Unix path: /dev/net/tun24056482      0x16F12A2       AES S-Box24057270      0x16F15B6       AES Inverse S-Box24533651      0x1765A93       eCos RTOS string reference: “ecosW”24543379      0x1768093       HTML document header24563221      0x176CE15       LUKS_MAGIC24564177      0x176D1D1       xz compressed data24873394      0x17B89B2       OpenSSL encryption, salted, salt: 0xC00770252D32357324884301      0x17BB44D       HTML document header24906969      0x17C0CD9       Private key in DER format (PKCS header length: 4, sequence length: 234525343574      0x182B656       Unix path: /usr/local/shk25480049      0x184CB71       Executable script, shebang: “/bin/bash”26449086      0x19394BE       SHA256 hash constants, little endian26965826      0x19B7742       Cisco IOS microcode, for “”27792979      0x1A81653       gzip compressed data, maximum compression, has header CRC, last modified: 1974-10-07 02:33:45 (bogus date)30516402      0x1D1A4B2       HTML document header30707709      0x1D48FFD       Base64 standard index table32138317      0x1EA644D       HTML document header32463276      0x1EF59AC       PNG image, 32 x 24, 8-bit/color RGBA, interlaced32463352      0x1EF59F8       Zlib compressed data, default compression32492091      0x1EFCA3B       GIF image data, version “89a”, 5 x32548082      0x1F0A4F2       JPEG image data, EXIF standard32574798      0x1F10D4E       Zlib compressed data, best compression32577456      0x1F117B0       Zlib compressed data, best compression32580729      0x1F12479       JPEG image data, JFIF standard 1.02, thumbnail 11×9832751022      0x1F3BDAE       Zlib compressed data, best compression32760485      0x1F3E2A5       Zlib compressed data, default compression32767499      0x1F3FE0B       JPEG image data, JFIF standard 1.0232822738      0x1F4D5D2       Zlib compressed data, best compression32831773      0x1F4F91D       XML document, version: “1.0”32866201      0x1F57F99       JPEG image data, JFIF standard 1.0232905743      0x1F61A0F       GIF image data, version “89a”, 30 x 3032943989      0x1F6AF75       Zlib compressed data, best compression32947100      0x1F6BB9C       Zlib compressed data, best compression32954824      0x1F6D9C8       XML document, version: “1.0”32972713      0x1F71FA9       JPEG image data, JFIF standard 1.0133011108      0x1F7B5A4       PNG image, 52 x 5, 8-bit/color RGBA, non-interlaced33201563      0x1FA9D9B       XML document, version: “1.0”33236782      0x1FB272E       PNG image, 1000 x 280, 8-bit/color RGBA, interlaced33318819      0x1FC67A3       Zlib compressed data, best compression33382838      0x1FD61B6       JPEG image data, JFIF standard 1.0133382868      0x1FD61D4       TIFF image data, little-endian offset of first image directory: 833516114      0x1FF6A52       ZBOOT firmware header, header size: 32 bytes, load address: 0x9C54505A, start address: 0x8B844857, checksum: 0x4F8B885F, version: 0xFF979388, image size: 991901497 bytes33609975      0x200D8F7       PNG image, 300 x 84, 8-bit/color RGBA, non-interlaced33776158      0x203621E       XML document, version: “1.0”33809104      0x203E2D0       PNG image, 310 x 531, 8-bit/color RGBA, non-interlaced33809203      0x203E333       Zlib compressed data, best compression34312241      0x20B9031       JPEG image data, JFIF standard 1.0134352652      0x20C2E0C       TIFF image data, big-endian, offset of first image directory: 834799229      0x212FE7D       Base64 standard index table35201331      0x2192133       AES S-Box35201587      0x2192233       AES Inverse S-Box35282151      0x21A5CE7       HTML document header35375557      0x21BC9C5       Base64 standard index table38441243      0x24A911B       Certificate in DER format (x509 v3), header length: 4, sequence length: 87338694241      0x24E6D61       Executable script, shebang: “/bin/bash”38694568      0x24E6EA8       Unix path: /dev/net/tun39750489      0x25E8B59       Unix path: /usr/lib64/tc/39881890      0x2608CA2       Copyright string: “Copyright (C) 2004 by Harald Welte”40546844      0x26AB21C       Unix path: /home/ruby/X40667261      0x26C887D       Copyright string: “Copyright (C) 2018, Thomas G. Lane, Guido Vollbeding”40692035      0x26CE943       Unix path: /home/ruby/X42108450      0x2828622       Copyright string: “Copyright (C) 2018, Thomas G. Lane, Guido Vollbeding”42240067      0x2848843       Copyright string: “Copyright (C) 2018, Thomas G. Lane, Guido Vollbeding”42600735      0x28A091F       gzip compressed data, ASCII, from VM/CMS, last modified: 1995-08-24 06:41:0742608185      0x28A2639       ELF, 64-bit LSB processor-specific,42845890      0x28DC6C2       Neighborly text, “neighbor C %s”43871781      0x29D6E25       Unix path: /home/ruby/X44237701      0x2A30385       Executable script, shebang: “/bin/sh”44249877      0x2A33315       OpenSSH RSA public key45239782      0x2B24DE6       SHA256 hash constants, little endian45601353      0x2B7D249       gzip compressed data, ASCII, from VM/CMS, last modified: 2008-04-20 10:46:2847200461      0x2D038CD       SHA256 hash constants, little endian47222790      0x2D09006       AES Inverse S-Box

可以看到从0xEE3DF2开始存在一些shell命令,可以由此推断出应该为文件系统,但又存在一些非ASCII的内容,推断应该是压缩过后的:

再根据此块信息,可以看到gzip压缩:

12741544      0xC26BA8        gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)12820184      0xC39ED8        Intel x86 or x64 microcode, sig 0xffffff80, pf_mask 0x00, 1DE0-08-26, size 204812820328      0xC39F68        Intel x86 or x64 microcode, sig 0xffffff80, pf_mask 0x00, 1DE0-08-26, size 204812897440      0xC4CCA0        DES SP2, little endian12897952      0xC4CEA0        DES SP1, little endian12923200      0xC53140        LZO compressed data12925744      0xC53B30        CRC32 polynomial table, little endian13188944      0xC93F50        Copyright string: “Copyright (c) 1999-2006 Intel Corporation.”13196536      0xC95CF8        Copyright string: “Copyright (c) 2009 – 2012 Intel Corporation.”13197320      0xC96008        Copyright string: “Copyright (c) 1999-2008 Intel Corporation.”13199736      0xC96978        Copyright string: “Copyright (c) 2013 – 2016 Intel Corporation.”13410380      0xCCA04C        Certificate in DER format (x509 v3), header length: 4, sequence length: 1484814404968      0xDBCD68        Unix path: /dev/vc/014479296      0xDCEFC0        Ubiquiti partition header, header size: 56 bytes, name: “PARTNAME=%s”, base address: 0x74790A00, data size: 23295090 bytes14486472      0xDD0BC8        xz compressed data14569424      0xDE4FD0        Unix path: /lib/firmware/updates/4.9.0-OCTEONTX_SDK_6_2_0_p3_build_3814663912      0xDFC0E8        Ubiquiti firmware additional data, name: UTE DEVICE DIAGNOSTIC, size: 1145372672 bytes, size2: 0 bytes, CRC32: 014712280      0xE07DD8        Copyright string: “Copyright(c) 1999-2006 Intel Corporation”14789199      0xE1AA4F        Copyright string: “Copyright 2005-2007 Rodolfo Giometti”14812265      0xE20469        Copyright string: “Copyright(c) Pierre Ossman”14848048      0xE29030        Unix path: /sys/firmware/devicetree/base14848848      0xE29350        Unix path: /sys/firmware/fdt’: CRC check failed14864129      0xE2CF01        Neighborly text, “neighbor table overflow!ate is %x”

使用dd命令提取此块内容,15613000-14864129=748871

dd if=v3910_3972.all of=gizp.bin bs=1 skip=12741544 count=748871

打开文件可以由此看出,此文件是kernel的配置文件,那么也验证了我们之前所猜测分析的内容:

去查看配置文件信息的时候会发现initramfs.cpio.lz4

结合之前所分析,再次证明从此之后就是文件系统,只是在开头经过了lz4压缩,那么我们也知道binwalk并不支持lz4解压缩,故我们下载liblz4-tool,并在binwalk的配置文件中添加规则^lz4 compressed data:lz4:lz4 -d ‘%e’ ‘%e.bin’

sudo apt-get install liblz4-tool

再次使用binwalk -Me解包固件,可以得到完整的文件系统内容了,注意这只是针对未加密的固件:

可以知道同样型号的设备要想从未加密版本升级到加密版本,就涉及到固件升级操作,我们去grep搜索关键字“upgrade”,再去搜索关键字“firmware”,会发现在fw_upload文件中同时包含:

根据分析fw_upload文件可以知道此脚本文件就是一整套升级固件的流程,
通过对其解密部分的分析可知是使用了chacha20解密:

对此二进制文件进行一些基础的信息收集,可以知道其为arm64的小端序:

通过cp把qemu-aarch64-static移动到当前目录下,去运行此程序

cp $(which qemu-aarch64-static) ./

运行时报错,提示缺少参数,输入文件和输出文件

sudo chroot . ./qemu-aarch64-static ./sbin/chacha20Bad input data in argvUsing: ./main input.file output.file

加上要解密的固件以及解密后的固件名,还是会报同样的错误

sudo chroot . ./qemu-aarch64-static ./sbin/chacha20 v3910_4326.all decrypt.allBad input data in argvUsing: ./main input.file output.file

通过IDA对此二进制程序进行逆向分析发现里面会存在key:

值得注意的是,它会把Jason中的J换成了字母E,也是踩了坑,再去看逆向二进制才知道:

基于对chacha20流密码加密算法的了解,除了key之外还需要一个nonce,在010 editor中可以看到被加密的固件开头会写有nonce=JXN5DVEZ14Us

注意我们要知道加密的固件是从enc_Image之后开始的,后面0x034BA100为其大小(小端序) 0x034B1A00=55253504 0xF0=240(要加3从0E开始) ,通过dd命令来提取被加密过后的固件

dd if=v3910_4326.all of=enc_image skip=243 count=55253504 bs=1

那么我们知道的是,chacha20已经被集成在许多语言中的库里了,故我们用python去写一个解密的脚本即可(因为原程序参数我们不知道该放什么故想着写脚本去解密)

from Crypto.Cipher import ChaCha20def do_decrypt(enc_image):    # 设置 nonce 和 key    nonce = b”JXN5DVEZl4Us”    key = b”0DraytekKd5Eason3DraytekKd5Eason”    # 读取加密数据    with open(enc_image, “rb”) as f:        enc_data = f.read()    # 创建 ChaCha20 解密器    cipher = ChaCha20.new(key=key, nonce=nonce)    # 解密数据    dec_data = cipher.decrypt(enc_data)    # 保存解密后的数据    with open(f”{enc_image}_decrypt”, “wb”) as f:        f.write(dec_data)    print(“解密完成”)if name == “main“:    filename = “enc_image”  # 要解密的文件名    do_decrypt(filename)

执行完成后再次binwalk -Me解包固件:

得到完整的文件系统,至此结束解密:

03

固件模拟

通过分析其启动项inittab,其内容告诉我们去执行sbin/rc,通过查看rc,需要注意的是会在后台中运行firmware/run.sh

去查看run.sh,发现需要关注run_linux.sh, 通过在firmware文件夹中可以发现,setup_qemu_linux.sh和run_linux.sh分别是网络设置脚本和启动qemu脚本,比较有意思的是,它是通过qemu来启动sohod64.bin来执行主要逻辑

从理论上来说我们去运行配置网络和启动qemu脚本,就可以在我们本地起起来这个固件了。
首先把setup_qemu_linux.sh中关于重置的代码片段删除以免对本地环境遭到破坏:

去执行setup_qemu_linux.sh之前先要在宿主机上创建两张网卡eth0和eth1

执行完setup_qemu_linux.sh再执行run_linux.sh,用其文件系统中的qemu-system-aarch64一直会报一个kvm的错误,根据官方中的GPL源码DrayTek File Server,找到qemu去编译一个我们所需要的qemu-system-aarch64

在/Vigor3910_v396_GPL_release/source/qemu-2.12.1/linux/cavium-rootfs/src_dir/qemu-2.12.1下进行编译,其中缺什么库就下载什么库即可:

./configure –enable-kvm –enable-debug –target-list=aarch64-softmmumake

找到编译完成后的qemu-system-aarch64,放入到文件系统中的firmware目录下

先运行setup_qemu_linux.sh再执行run_linux.sh

setup_qemu_linux.sh

!/bin/bashiflan=eth0ifwan=eth1mylanip=”192.168.1.2″brctl delbr br-lanbrctl delbr br-wanip link add br-lan type bridgeip tuntap add qemu-lan mode tapbrctl addif br-lan $iflanbrctl addif br-lan qemu-lanip addr flush dev $iflanifconfig br-lan $mylanipifconfig br-lan upifconfig qemu-lan upifconfig $iflan upip link add br-wan type bridgeip tuntap add qemu-wan mode tapbrctl addif br-wan $ifwanbrctl addif br-wan qemu-wanip addr flush dev $ifwanifconfig br-lan $mylanipifconfig br-wan upifconfig qemu-wan upifconfig $ifwan upbrctl show#for speed testethtool -K $iflan gro offethtool -K $iflan gso offethtool -K $ifwan gro offethtool -K $ifwan gso offethtool -K qemu-lan gro offethtool -K qemu-lan gso offethtool -K qemu-wan gro offethtool -K qemu-wan gso off#for telnet from linux to drayos 192.168.1.1ethtool -K br-lan tx off

run_linux.sh(此文件修改需结合运行时的报错信息以及结合run.sh文件去就行修改补充)

!/bin/bash# 1. do “fw_setenv purelinux 1” first , then reboot# 2. do setup_qemu_linux.sh (default P3 as WAN, P4 as LAN, for both 1Gbps connection only)# 3. remember to recover to normal mode by “fw_setenv purelinux 0″rangen() {   printf “%02x” shuf -i 1-255 -n 1}rangen1() {   printf “%x” shuf -i 1-15 -n 1}wan_mac(){        idx=$1        printf “%02x\n” $((0x${C}+0x$idx)) | tail -c 3 # 3 = 2 digit + 1 terminating character}A=$(rangen); B=$(rangen); C=$(rangen);LAN_MAC=”00:1d:aa:${A}:${B}:${C}”if [ ! -p serial0 ]; then    mkfifo serial0fiif [ ! -p serial1 ]; then    mkfifo serial1fiplatform_path=”./platform”echo “x86″ > $platform_pathenable_kvm_path=”./enable_kvm”echo “kvm” > $enable_kvm_pathcfg_path=”./magic_file”echo “GCI_SKIP” > gci_magicmkdir -p ../data/uffstouch ../data/uffs/v3910_ram_flash.binuffs_flash=”../data/uffs/v3910_ram_flash.bin”echo “1” > memsize(sleep 20 && ethtool -K qemu-lan tx off) &model=”./model”echo “3” > ./modelrm -rf ./app && mkdir -p ./app/gciGCI_PATH=”./app/gci”GCI_FAIL=”./app/gci_exp_fail”GDEF_FILE=”$GCI_PATH/draycfg.def”GEXP_FLAG=”$GCI_PATH/EXP_FLAG”GEXP_FILE=”$GCI_PATH/draycfg.exp”GDEF_FILE_ADDR=”0x4de0000″GEXP_FLAG_ADDR=”0x55e0000″GEXP_FILE_ADDR=”0x55e0010″echo “0#” > $GEXP_FLAGecho “19831026” > $GEXP_FILEecho “GCI_SKIP” > $GDEF_FILESHM_SIZE=16777216./qemu-system-aarch64 -M virt,gic_version=3 -cpu cortex-a57 -m 1024 -L ../usr/share/qemu \           -kernel ./vqemu/sohod64.bin $serial_option -dtb DrayTek \           -nographic $gdb_serial_option $gdb_remote_option \           -device virtio-net-pci,netdev=network-lan,mac=${LAN_MAC} \           -netdev tap,id=network-lan,ifname=qemu-lan,script=no,downscript=no \           -device virtio-net-pci,netdev=network-wan,mac=00:1d:aa:${A}:${B}:$(wan_mac 1) \           -netdev tap,id=network-wan,ifname=qemu-wan,script=no,downscript=no \           -device virtio-serial-pci -chardev pipe,id=ch0,path=serial0 \           -device virtserialport,chardev=ch0,name=serial0 \           -device loader,file=$platform_path,addr=0x25fff0 \           -device loader,file=$cfg_path,addr=0x260000 \           -device loader,file=$uffs_flash,addr=0x00be0000 \           -device loader,file=$enable_kvm_path,addr=0x25ffe0 \           -device loader,file=memsize,addr=0x25ff67 \            -device loader,file=$model,addr=0x25ff69 \           -device loader,file=$GDEF_FILE,addr=$GDEF_FILE_ADDR \           -device loader,file=$GEXP_FLAG,addr=$GEXP_FLAG_ADDR \           -device loader,file=$GEXP_FILE,addr=$GEXP_FILE_ADDR \           -device nec-usb-xhci,id=usb \           -device ivshmem-plain,memdev=hostmem \           -object memory-backend-file,size=${SHM_SIZE},share,mem-path=/dev/shm/ivshmem,id=hostmem

通过访问192.168.1.1,发现模拟成功:

默认账户名和密码为admin:

04

漏洞分析

通过burp抓包可以看出来其POST请求走的时cgi文件

针对整个sohod64.bin去逆向,发现在sub_40D1B930函数下存在对GET以及POST请求的处理

往下就到了漏洞的溢出点,此处变量v4用于计数和索引a2数组中的存储位置。每次提取参数后,v4增加1。如果v4增加到超过a2数组的实际大小(即a2能容纳的最大参数数量),则会导致对a2数组的越界访问,从而引发溢出。

而且QUERY_STRING的内容是来自外部请求的,理论上可以是任意大小。若请求中包含过多的参数,循环将不断增加v4,直到超出a2的边界。

05

漏洞复现

通过url访问验证,我们找一个典型的cgi,登录的时候会走wlogin.cgi去处理但此处是POST请求,我们去读取参数的时候是通过GET请求访问192.168.1.1/cgi-bin/wlogin.cgi?&&&&&&….

通过足够多的&来造成溢出从而导致设备Dos

06

总结

1、该固件解密较为复杂,但解密方法适用于其很多其他系列的产品,凡是在010 editor中可以看到nonce,则可以先进行尝试同样的解密方法,因为key是保持不变的;

2、该固件模拟起来,需要对启动项进行详细分析,需要通过执行后的报错去结合其它启动脚本文件的内容,整合成一个启动文件后,直接执行可以把其web服务模拟成功;

3、该固件与传统固件差距较大,其整个运行是通过qemu启动的,并且启动的文件sohod64.bin是Darytek自行实现的os系统,其最大的难点就在于没有符号表。

tips:

在固件解密中,运行chacha20程序时之前提到并不确定要加什么参数,但经过验证,只需要把nonce内容存放在一个文件中,跟在后面作为参数即可。