
CVE-2024-23113 포트 541의 SSL 연결을 통해 FortiGate FGFM 서비스의 형식 문자열 취약점을 탐지하며, 조작된 페이로드를 전송하여 RCE 취약성을 확인합니다.
이 스크립트는 FortiGate FGFM 서비스(FortiGate와 FortiManager 간 프로토콜)에서 TCP 포트 541을 통해 발생하는 포맷 문자열 취약점인 CVE-2024-23113을 탐지하도록 설계되었습니다. 이 취약점은 공격자가 포맷 문자열을 제어할 수 있어 원격 코드 실행(RCE) 또는 기타 의도치 않은 동작을 유발할 수 있기 때문에 발생합니다. FGFM 서비스는 FortiGate 장치와 FortiManager 간의 구성 관리를 위한 통신을 허용하며, 패치되지 않은 버전은 입력 처리가 부적절하여 포맷 문자열 공격에 취약합니다. 스크립트 작동 방식
네트워크 연결 설정:
스크립트는 먼저 대상의 541번 포트에 SSL/TLS 연결을 설정합니다.
인증서 확인을 비활성화한 ssl.SSLContext 객체를 사용하여 연결을 설정합니다. 장치가 자체 서명된 인증서를 사용할 수 있기 때문입니다.
페이로드 구성:
연결이 완료되면 스크립트는 포맷 문자열 공격(authip=%n)을 사용하는 악성 페이로드를 제작합니다. %n 지시문은 지금까지 출력된 바이트 수를 변수에 쓰도록 시스템에 지시하며, 이는 잠재적으로 메모리 손상으로 이어질 수 있습니다.
제작된 페이로드는 설정된 연결을 통해 대상에 전송됩니다.
탐지 로직:
그런 다음 스크립트는 페이로드에 대한 대상의 응답 동작을 확인합니다.
연결이 갑자기 종료되고 SSL 경고가 발생하면, 대상이 취약한 것으로 간주합니다. 이는 포맷 문자열 취약점 보호 메커니즘(예: glibc의 _FORTIFY_SOURCE)이 트리거되었기 때문입니다.
연결이 유지되면 대상이 패치된 상태일 가능성이 높습니다.
사용 방법
스크립트 실행:
Python 3으로 다음 명령어를 실행하여 스크립트를 실행합니다.
sh
python check_vulnerability.py
호스트명/IP 입력:
취약 여부를 확인할 호스트명 또는 IP 주소를 입력하라는 메시지가 표시됩니다.
중단하려면 exit를 입력합니다.
출력:
대상이 취약한 경우 스크립트는 다음과 같이 출력합니다.
[!] 경고: 이(가) 취약합니다!
대상이 패치된 경우 다음과 같이 출력합니다.
[+] <hostname>은(는) 패치된 것으로 보입니다.
요구 사항
스크립트를 실행하는 머신에 Python 3이 설치되어 있어야 합니다.
대상 장치에 네트워크로 접근 가능해야 하며, 541번 포트가 열려 있어야 합니다.
대상 장치에서 FGFM 서비스가 실행 중이어야 합니다.