
이 리포지토리에는 CVE-2019-17147에 취약한 펌웨어 버전이 포함된 덤프된 플래시 파티션과 WR841N 라우터를 다운그레이드 및 디버깅하는 데 유용한 몇 가지 바이너리가 포함되어 있습니다.
이 저장소는 CVE-2019-17147에 취약한 펌웨어 버전의 덤프된 플래시 파티션과 WR841N(V14) 라우터를 다운그레이드하고 디버깅하는 데 유용한 몇 가지 바이너리를 포함하고 있습니다.
플래시 칩 파티션 덮어쓰기와 같은 하드웨어 수정에는 위험이 따릅니다. 위험을 평가하고 직접 수행 여부를 결정하십시오.
ZDI의 게시물: https://www.zerodayinitiative.com/blog/2019/12/2/mindshare-hardware-reversing-with-the-tp-link-tl-wr841n-router-part-2은 제가 정말 시도해보고 배우고 싶은 매우 흥미로운 취약점을 보여주었습니다.
안타깝게도 펌웨어 버전 (US) 0.9.1 4.16 v007c.0 Build 180613 Rel.42415n은(는) 미국 웹사이트에서 이미 내려져 더 이상 다운로드할 수 없습니다.
하지만 저는 ZDI가 악용한 버전보다 더 오래된 펌웨어 버전 (TW) 0.9.1 4.16 v009e.0 Build 180516 Rel.81030n을 실행하는 WR841N을 보유하고 있으며, 동일한 취약점이 여전히 존재합니다.
이 익스플로잇을 재현하는 데 관심이 있는 많은 사람들이 동일한 문제에 직면해 있을 것 같습니다. 즉, 취약한 펌웨어 버전을 실행하는 작동하는 WR841N을 찾을 수 없다는 것입니다.
TW, EU 또는 JP 버전 하드웨어를 사용 중이라면, 180613보다 오래된 펌웨어 버전(즉, 2018/06/13에 빌드된 버전)을 공식 웹사이트에서 다운로드하여 "업그레이드"하는 방식으로 라우터를 다운그레이드하는 것이 여전히 가능합니다.
펌웨어 다운그레이드가 가능하지만, WR841N은 실제로 다른 국가에서 판매되는 하드웨어용 펌웨어를 확인하고 수락하지 않습니다. 따라서 TP-Link가 웹사이트에 취약한 펌웨어 버전을 제공하지 않는 국가(예: 미국)에 거주하는 사람들은 HTTP 서버의 확인을 우회하고 취약한 펌웨어를 장치의 플래시 칩에 직접 작성해야 합니다. 이것이 이 저장소의 주된 목적입니다.
또한 익스플로잇을 디버깅하고 재현하려는 사람들을 위해 WR841N에서 작동하는 정적 busybox와 gdbserver를 크로스 컴파일했습니다.
플래시 파티션을 덮어쓰기 전에 현재 파티션을 백업하여 이 취약한 버전으로 작업을 마친 후 라우터를 복원할 수 있도록 해야 합니다.
직렬 콘솔 사용에 이미 익숙하다고 가정하고 하드웨어 부분은 건너뛰겠습니다.
원하는 머신에 tftp 서버를 설정하십시오.
WR841N 콘솔에서:
(IP 주소를 tftp 서버의 주소로 바꾸십시오)
~ # cat /dev/mtd0 > /var/WR841N_backup_mtd0_boot.bin
~ # tftp -p -r /var/WR841N_backup_mtd0_boot.bin 192.168.0.100
~ # rm /var/WR841N_backup_mtd0_boot.bin
~ #
~ # cat /dev/mtd1 > /var/WR841N_backup_mtd1_kernel.bin
~ # tftp -p -r /var/WR841N_backup_mtd1_kernel.bin 192.168.0.100
~ # rm /var/WR841N_backup_mtd1_kernel.bin
~ #
~ # cat /dev/mtd2 > /var/WR841N_backup_mtd2_rootfs.bin
~ # tftp -p -r /var/WR841N_backup_mtd2_rootfs.bin 192.168.0.100
~ # rm /var/WR841N_backup_mtd2_rootfs.bin=
WR841N의 플래시 파티션은 다음과 같습니다:
dev: size erasesize name
mtd0: 00010000 00010000 "boot"
mtd1: 000f0000 00010000 "kernel"
mtd2: 002e0000 00010000 "rootfs"
mtd3: 00010000 00010000 "config"
mtd4: 00010000 00010000 "radio"
덮어써야 할 주요 파티션은 rootfs(mtd2)이지만, 안정성을 위해 boot와 kernel도 덮어쓰겠습니다.
config와 radio 파티션은 취약점에 영향을 미치지 않고 잠재적인 법적 문제를 피하기 위해 RF 설정을 건드리고 싶지 않을 것이므로 제공하지 않았습니다.
flashcp를 WR841N으로 전송하십시오.WR841N 셸에서:
~ # cd /var
/var # tftp -g -r flashcp 192.168.0.100
/var # chmod +x flashcp
(물론 IP 주소를 tftp 서버를 실행 중인 머신의 주소로 바꾸십시오.)
TW_wr841N_mtd0_boot_180516.bin을(를) WR841N으로 전송하고 flashcp로 덮어쓰십시오:/var # tftp -g -r TW_wr841N_mtd0_boot_180516.bin 192.168.0.100
/var # ./flashcp TW_wr841N_mtd0_boot_180516.bin /dev/mtd0
/var # rm TW_wr841N_mtd0_boot_180516.bin
TW_wr841N_mtd1_kernel_180516.bin을(를) WR841N으로 전송하고 flashcp로 덮어쓰십시오:/var # tftp -g -r TW_wr841N_mtd1_kernel_180516.bin 192.168.0.100
/var # ./flashcp TW_wr841N_mtd1_kernel_180516.bin /dev/mtd1
/var # rm TW_wr841N_mtd1_kernel_180516.bin
TW_wr841N_mtd2_rootfs_180516.bin을(를) WR841N으로 전송하고 flashcp로 덮어쓰십시오 (이것이 가장 큰 파티션이므로 flashcp가 완료되는 데 시간이 걸립니다):/var # tftp -g -r TW_wr841N_mtd2_rootfs_180516.bin 192.168.0.100
/var # ./flashcp TW_wr841N_mtd2_rootfs_180516.bin /dev/mtd2
/var # rm TW_wr841N_mtd2_rootfs_180516.bin
0.9.1 4.16 v009e.0 Build 180516 Rel.81030n인 것을 확인할 수 있습니다.
buildroot-2021.02.6으로 제가 직접 크로스 컴파일했습니다.