Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2022-46169 — Cacti 1.2.22 인증되지 않은 명령 주입 | Kitploit
도구/GitHubGitHub/k4pxd/cve-2022-46169
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationRed Teaming
GitHubk4pxd/cve-2022-46169

CVE-2022-46169

Cacti 1.2.22 인증되지 않은 명령 주입

저장소 보기
8시간 53분 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2022-46169 — Cacti 1.2.22 인증되지 않은 명령 주입


필드세부 정보
제품Cacti
영향을 받는 버전1.2.22
취약점인증되지 않은 OS 명령 주입
CVECVE-2022-46169
CWECWE-77 — 명령 주입
심각도치명적(Critical)
CVSS v3.19.8
공격 벡터네트워크(Network)
인증없음(None)
사용자 상호작용없음(None)
영향기밀성 / 무결성 / 가용성
수정 버전1.2.23
취약한 구성 요소remote_agent.php
추가 구성 요소lib/functions.php
주요 취약 동작polldata

게시된 CVSS 벡터는 다음과 같습니다:

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

공식 권고는 이를 9.8 치명적(Critical) 으로 평가합니다. (GitHub)

1. 근본 원인

실제로는 두 개의 버그가 연결되어 있습니다.

1단계 — 인증 우회

Cacti의 remote_agent.php는 일반적인 인증 없이 요청을 수락하지만, 요청자가 인증된 폴러(poller)인지 여부를 확인하려고 시도합니다.

인증 흐름은 사실상 다음과 같이 동작합니다:

root@kitploit:~
HTTP 요청
     │
     ▼
remote_agent.php
     │
     ▼
remote_client_authorized()
     │
     ▼
get_client_addr()
     │
     ▼
gethostbyaddr()
     │
     ▼
poller 테이블 호스트명 비교

문제는 get_client_addr()입니다.

1.2.22에서 이 함수는 전달된 클라이언트 IP 헤더를 포함한 수많은 HTTP 파생 서버 변수를 검사합니다. 권고에 따르면 공격자가 제어하는 HTTP_* 값이 이 함수가 반환하는 IP에 영향을 줄 수 있습니다. (GitHub)

즉, 애플리케이션이 다음과 같이 속을 수 있습니다:

root@kitploit:~
공격자
   ↓
"내 IP는 Cacti 서버입니다"
   ↓
gethostbyaddr()
   ↓
Cacti 서버 호스트명
   ↓
poller 테이블과 일치
   ↓
인증됨(AUTHORIZED)

따라서 공격자는 합법적인 Cacti 계정이 필요하지 않습니다.


2. 두 번째 취약점 — 명령 주입

인증 확인을 우회한 후, 관심 있는 엔드포인트 기능은 polldata 동작입니다.

관련 실행 경로는 대략 다음과 같습니다:

root@kitploit:~
remote_agent.php
      │
      ▼
    polldata
      │
      ▼
 poll_for_data()
      │
      ├── host_id
      ├── local_data_ids
      └── poller_id
              │
              ▼
       poller_item 조회
              │
              ▼
 POLLER_ACTION_SCRIPT_PHP
              │
              ▼
          proc_open()
              │
              ▼
       OS 명령 실행

중요한 실수는 poller_id 의 처리입니다.

애플리케이션은 이를 정수로 강제하는 대신 다음을 사용하여 검색합니다:

root@kitploit:~
get_nfilter_request_var()

공격자가 제어하는 해당 값은 결국 PHP의 proc_open()에 전달되는 명령의 일부가 됩니다. 공식 권고는 이를 명령 주입 프리미티브로 명시적으로 식별합니다. (GitHub)

개념적으로:

root@kitploit:~
공격자가 제어하는 입력
        ↓
     poller_id
        ↓
 문자열 연결
        ↓
     proc_open()
        ↓
 운영체제 명령

이것이 취약점의 핵심 부분입니다.


3. RCE가 되는 이유

PoC 분석에서 흥미로운 점은 두 버그 중 어느 하나만으로는 전체 이야기가 아니라는 것입니다.

이는 취약점 체인입니다:

root@kitploit:~
        ┌──────────────────────────┐
        │ 인증되지 않은 공격자      │
        └────────────┬─────────────┘
                     │
                     ▼
          remote_agent.php
                     │
                     ▼
        클라이언트 IP 로직을 통한
           인증 우회
                     │
                     ▼
              polldata
                     │
                     ▼
            poller_item 조회
                     │
                     ▼
       POLLER_ACTION_SCRIPT_PHP
                     │
                     ▼
             공격자 입력
              → poller_id
                     │
                     ▼
                proc_open()
                     │
                     ▼
              명령 실행
                     │
                     ▼
                    RCE

이것은 보고서에서 매우 중요한 구분입니다:

CVE-2022-46169는 단순히 "remote_agent.php의 잘못된 매개변수"가 아닙니다. 이는 인증 우회 + 명령 주입이 연결된 취약점입니다.

공식 권고는 취약한 실행 조건에 POLLER_ACTION_SCRIPT_PHP 동작을 가진 poller_item이 필요함을 확인합니다. (GitHub)


4. 환경적 전제 조건

PoC는 이것이 중요한 분석적 세부 사항이므로 명시적으로 문서화해야 합니다.

대상에는 다음과 같이 구성된 적절한 poller_item이 필요합니다:

root@kitploit:~
POLLER_ACTION_SCRIPT_PHP

Cacti 권고는 Device - Uptime 및 Device - Polling Time 과 같은 사전 정의된 템플릿이 이러한 항목을 생성할 수 있기 때문에 프로덕션 설치에서 이는 일반적이라고 언급합니다. (GitHub)

따라서 다음과 같이 작성하지 마세요:

"모든 Cacti 1.2.22 설치가 자동으로 공격 가능합니다."

더 기술적으로 정확한 설명은 다음과 같습니다:

Cacti 1.2.22는 취약하며, 성공적인 명령 실행은 적절한 poller_item 구성의 존재에 달려 있습니다.


5. host_id와 local_data_id가 중요한 이유

poll_for_data()는 제공된 poller_id를 단순히 실행하지 않습니다.

먼저 다음 값에 해당하는 poller_item을 쿼리합니다:

root@kitploit:~
host_id
local_data_id

그런 다음 결과 항목의 동작을 검사합니다.

취약한 조건은 사실상 다음과 같습니다:

root@kitploit:~
host_id
   +
local_data_id
   ↓
poller_item
   ↓
action == POLLER_ACTION_SCRIPT_PHP
   ↓
취약한 실행 경로

원래 권고는 관련 항목이 애플리케이션 데이터베이스에 존재하고, 생산적인 설치 환경에 적절한 항목이 존재할 가능성이 높기 때문에 이러한 식별자를 발견할 수 있다고 언급합니다. (GitHub)

공개 PoC의 경우, 이를 숨기기보다는 이 전제 조건을 명시적으로 시연하는 것이 좋습니다.


6. 안전한 PoC 방법론

게시할 내용의 경우, PoC가 독자에게 무기화된 리버스 셸 페이로드를 제공하지 않고 명령 실행을 시연하도록 만드는 것이 좋습니다.

예를 들어, 시연을 다음과 같이 구성하세요:

root@kitploit:~
1. 격리된 VM에 Cacti 1.2.22 배포
2. POLLER_ACTION_SCRIPT_PHP를 사용하여 poller_item 구성
3. remote_agent.php에 접근 가능한지 확인
4. 인증 결정이 영향을 받는지 시연
5. polldata 실행 경로 도달
6. 무해한 명령 실행 마커 사용
7. 결과 애플리케이션/로그 증거 캡처
8. 1.2.23으로 업그레이드
9. 테스트 반복
10. 취약점이 더 이상 악용되지 않음을 시연

이렇게 하면 보고서를 즉시 사용 가능한 인터넷 RCE 무기로 만들지 않으면서도 합법적인 취약점 시연이 가능합니다.


7. 보고서를 위한 소스 코드 분석

취약한 코드를 세 가지 영역으로 나눌 수 있습니다.

A. remote_agent.php

원격 에이전트 기능을 노출하고 요청된 동작을 디스패치하는 역할을 담당합니다.

root@kitploit:~
remote_agent.php
      │
      └── action = polldata
                 │
                 ▼
            poll_for_data()

B. lib/functions.php

get_client_addr()를 포함합니다.

문제가 있는 설계는 요청자의 실제 네트워크 주소를 결정할 때 HTTP 파생 값을 신뢰하는 것입니다.

공식 권고는 실제 원격 주소로 폴백하기 전에 검사되는 여러 HTTP 관련 변수를 나열합니다. (GitHub)

C. proc_open()

최종 위험한 싱크는 proc_open()을 통해 실행되는 PHP 명령의 구성입니다.

권고는 취약한 흐름을 다음과 같이 식별합니다:

root@kitploit:~
poller_id
    ↓
get_nfilter_request_var()
    ↓
명령 구성
    ↓
proc_open()

(GitHub)


8. 패치가 수정하는 이유

Cacti 권고는 두 가지 중요한 수정 사항을 식별합니다.

첫째, poller_id는 정수로 처리되어야 합니다:

root@kitploit:~
get_nfilter_request_var()
             ↓
get_filter_request_var()

둘째, 값은 명령에 통합되기 전에 추가로 셸 이스케이프되어야 합니다:

root@kitploit:~
escapeshellarg($poller_id)

권고는 두 가지 조치를 모두 구체적으로 권장합니다. (GitHub)

인증 측면에서도 공격자가 인증에 사용되는 클라이언트 IP를 임의로 조작할 수 없도록 해야 합니다. (GitHub)


9. 버전 비교

root@kitploit:~
Cacti 1.2.22
     │
     ├── 취약함
     ├── 인증 우회
     ├── 명령 주입
     └── 잠재적 인증되지 않은 RCE
     
Cacti 1.2.23
     │
     └── CVE-2022-46169 패치됨

공급업체 권고는 1.2.22가 영향을 받는 버전이고 1.2.23이 패치된 1.2.x 릴리스라고 명시합니다. (GitHub)

Amazon의 보안 권고는 이 문제를 인증되지 않은 공격자가 임의의 명령을 실행할 수 있게 하는 것으로 독립적으로 설명하며 9.8 CVSS 점수를 부여합니다. (AWS Training and Certification)


10. 게시할 PoC에 적합한 제목

다음과 같은 제목을 사용하는 것이 좋습니다:

CVE-2022-46169 — Cacti 1.2.22의 인증되지 않은 명령 주입 / RCE

또는 더 기술적으로:

CVE-2022-46169: Cacti 1.2.22 원격 에이전트 인증 우회 및 명령 주입 체인 분석

취약점 요약은 다음과 같이 작성할 수 있습니다:

Cacti 1.2.22는 원격 에이전트 기능에 치명적인 취약점 체인을 포함합니다. 공격자는 클라이언트 주소 결정 로직을 조작하여 원격 에이전트 인증 확인을 우회할 수 있습니다. polldata 기능에 도달하면 poller_id 매개변수의 불충분한 검증으로 인해 공격자가 제어하는 데이터가 proc_open()을 통해 실행되는 명령에 도달할 수 있습니다. POLLER_ACTION_SCRIPT_PHP 폴러 항목이 포함된 구성에서는 인증되지 않은 원격 명령 실행이 발생할 수 있습니다. 이 문제는 Cacti 1.2.23에서 수정되었습니다. (GitHub)

연구에 대한 중요한 수정 사항: 이를 CVE-2023-39362와 혼동하지 마세요. 이후의 Cacti RCE는 1.2.24에 영향을 미치며 1.2.25에서 수정되었으므로, 1.2.22 PoC에 원하는 취약점이 아닙니다. (NVD)

도구 다운로드