[하루한줄] CVE-2021-1366: Cisco AnyConnect Posture(HostScan) Local Privilege Escalation

URL

Analysis of Cisco AnyConnect Posture (HostScan) Local Privilege Escalation: CVE-2021-1366

Target

  • Cisco AnyConnect Posture 4.9.05042 이전 버전

Explain

Cisco AnyConnect Posture에서 DLL 하이재킹을 통한 권한 상승 취약점이 발견되었습니다. Cisco AnyConnect Posture는 AnyConnect Secure Mobility Client에서 선택하여 설치할 수 있는 모듈입니다. 해당 모듈을 사용하면 VPN 클라이언트가 호스트에 설치된 운영 체제, 안티 바이러스, 안티 스파이웨어, 방화벽을 식별할 수 있습니다.

AnyConnect Posture(ciscod.exe)의 Cisco Security Service Windows 서비스는 localhost 1023 포트에서 로컬 peer의 연결을 대기합니다. 로컬 peer가 연결되면, lphlpapi.dll 라이브러리의 GetExtendedTcpTable 함수를 통해 로컬 클라이언트의 PID에 해당하는 실행 파일을 찾습니다. 그 후 연결된 프로세스가 “Cisco System, Inc” 서명을 가졌는지 확인합니다.

서명 검사를 통과하면, 특정 포맷으로 된 패킷을 통해 명령어를 처리합니다. process_ipc_message 함수에서 패킷의 첫 4바이트가 0x2E24인지 확인한 후, 다음 4바이트가 유효한 명령어인지 확인합니다.

이 중 priv_file_copy 명령어는 모든 위치에서 %ProgramFiles(x86)%\Cisco\Cisco HostScan 디렉터리 내의 서브 디렉터리로 파일을 복사할 수 있습니다. directory traversal을 검사하므로, source file은 \Cisco\Cisco HostScan 디렉터리 내부에 위치하여야 합니다. 이를 통해 원하는 DLL을 복사하여, 서비스가 시작될 때 해당 DLL을 실행할 수 있습니다.

해당 취약점을 악용하기 위해 일반 유저가 서비스를 중지/시작할 수 없으므로, 재부팅 없이 권한 상승을 수행하기 위해 priv_get_device_id 명령을 사용합니다. 서비스가 이 명령어를 받으면, /lib 디렉터리에서 libhostscan.dll 라이브러리 로드를 시도합니다. libhostscan.dll 라이브러리는 자신의 location path에 위치하지 않는 여러 DLL을 로드합니다.(ex. IPHLPAPI.DLL)

LPE를 트리거하는 과정은 다음과 같습니다.

  1. libhostscan.dll 라이브러리가 어디에 위치하는지 확인하고 %TEMP%\Cisco\Cisco HostScan 디렉터리에 복사합니다. 라이브러리는 %ProgramFiles(x86)%\Cisco\Cisco HostScan\lib이나 %ProgramFile(x86)%\Cisco\Cisco AnyConnect Secure Mobility Client\Posture 디렉터리에 있습니다.
  2. 서비스의 실행 파일(ciscod.exe)을 일시 중지합니다.
  3. 일시 중지된 프로세스에 process hollowing을 수행하고 아래의 세 명령어를 127.0.0.1:1023으로 보내는 프로세스로 바꿉니다.
    • %TEMP%\Cisco\Cisco HostScan 디렉터리에서 %PROGRAMFILES(x86)%\Cisco\Cisco HostScan\lib 디렉터리로 libhostscan.dll를 복사하는 priv_file_copy 명령어(라이브러리가 존재하면 overwrite 됩니다.)
    • %TEMP%\Cisco\Cisco HostScan 디렉터리에서 PROGRAMFILES(x86)%\Cisco\Cisco HostScan\lib 디렉터리로 공격자가 제어하는 DLL을 복사하는 priv_file_copy 명령어(해당 DLL의 이름은 IPHLPAPI.DLL이고, 원본 DLL의 export function을 동일하게 export 해야 합니다.)
    • priv_get_device_id 명령어
  4. 일시 중지 상태에서 다시 시작시킵니다.

해당 취약점은 priv_file_copy 명령에 디지털 서명 확인을 추가함으로써 패치되었습니다. POC는 coresecurity 블로그의 해당 게시글에서 확인하실 수 있습니다.