[하루한줄] Cisco RV340 Dual WAN Gigabit VPN Router (RCE over LAN)

URL

Advisory: Cisco RV340 Dual WAN Gigabit VPN Router (RCE over LAN)

Target

Cisco RV340 Dual WAN Gigabit VPN Router

Explain

Pwn2Own에 제출된 Cisco RV340의 exploit chain입니다. 3개의 취약점을 활용해 root 권한으로 command를 실행할 수 있습니다.

Bug 1 - Unauthenticated Arbitrary File Upload
웹 인터페이스는 Nginx가 /etc/nginx에 위치한 configuration에 따라 핸들합니다. 그 중 /etc/nginx/conf.d/rest.url.conf에는 Authorization header를 검사하는 로직이 있는데, 문제는 Authoriaztion header가 non-null이라면 $deny값을 0으로 바꿔버리기 때문에 임의의 Authroization header를 포함한 request를 통해 인증 우회가 가능합니다. api/operations/ciscosb-file:form-file-upload에 이런 악성 request를 보내는 것으로 Nginx 업로드 디렉터리에 임의의 파일을 업로드할 수 있습니다.

if ($http_authorization != "") {
       set $deny "0";
   }

Bug 2 - Unauthenticated File Move
/etc/nginx에 위치한 etc/nginx/conf.d/web.upload.conf의 misconfiguration입니다. preare_file() 함수는 upload request에 명시된 file type에 따라 Nginx가 생성한 임시 파일을 디스크의 또다른 path로 복사합니다. 문제는 파일이 업로드 되는 query_path를 검사하기 전 prepare_file()이 호출되기 때문에 request에 file type을 지정하는 것으로 /tmp/www 혹은 /tmp/user등의 위치로 임의파일을 업로드 할 수 있습니다.

ret = prepare_file(file_type,src_file,dst_file);
if (ret== 0) {
  if (strcmp(query_path, "/api/operations/ciscosb-file:form-file-upload") == 0) {
    do_api_upload(__s,file_type,dst_file,local_6c);
  }
  else {
    if(strcmp(query_path,"/upload")==0){
        //some regex and length checks
        do_upload(__s,dst_file,uVar1,file_type,uVar4,local_58,local_54,local_50);
    }
  }
}

Bug 3 - Unauthenticated Command Injection
jsonrpc CGI는 RPC request를 ConfD 서버로 전달합니다. 각 RPC name에 해당하는 바이너리 혹은 스크립트들은 파라미터를 쌍따옴표로 전달받기 때문에 shell expension과 backtick(`)을 사용한 command injection에 취약합니다.

1번과 2번 취약점을 통해 타겟 시스템에 가짜 session file을 생성할 수 있고, 생성된 가짜 sessionid를 통해 3번 취약점을 트리거할 수 있게되며 최종적으로 타겟 시스템에서 root 권한의 command를 실행할 수 있게 됩니다.