SMTP 개요
SMTP는 이메일 송수신에 사용되는 프로토콜로 메일서버 외부와 통신을 담당합니다.
주요 보안 위험으로는 다음과 같은 것들이 있습니다.
- VRFY, EXPN 명령어를 통한 이메일 리스트 열거
- 인증이 없거나 오픈 릴레이가 활성화 되어 있을 경우, 스팸메일 발송을 위한 경유지로 활용
위와 같은 위험 요소가 존재하지만 그 중에서도 외부자가 내부 사용자에게 메일을 전송할 수 있는가? 를 확인하는게 가장 중요하다고 생각합니다.
기본 점검 방법
접근 가능한 SMTP 서버를 확인했다면 EHLO 명령어를 통해 서버에서 지원하는 명령어를 확인해야 합니다.
다음은 점검에 사용하는 명령어입니다.
1. VRFY, EXPN 명령어
해당 명령어들은 보통 비활성화되어 있지만 메일서버에 등록되어 있는 이메일 리스트를 확인할 수 있고, 더 나아가 SMTP에서 AUTH 기능을 지원한다면 무차별 대입 공격을 통해 계정 탈취까지 시도해볼 수 있습니다.
VRFY [user@example.com]
EXPN [some-list | ALL]
2. AUTH 명령어
이메일을 전송하기 전 인증을 통해 로그인하는 명령어입니다. 메일서버 환경구성에 따라 인증 없이도 메일 전송이 가능한 경우가 있습니다.
간혹 STARTTLS기능을 이용해서 TLS연결을 수립해야 해당 명령어를 사용가능한 경우도 있으며, 이때는 openssl의 openssl s_client -starttls smtp -connect smtp.example.com [port] 명령어를 통해 보안 연결을 수립하면 됩니다.
AUTH [LOGIN | PLAIN]
3. MAIL FROM, RCPT TO, DATA 명령
실제 메일을 전송할 때 사용되는 명령어입니다. 해당 명령어는 SQL 문법과 마찬가지로 순서대로 사용해야 오류가 나지 않습니다.
RCPT TO 명령어의 경우 메일서버 환경구성에 따라 존재하지 않는 이메일 입력 시 에러가 발생하는데 VRFY, EXPN 명령어가 비활성화 되어있을 때 유용하게 사용할 수 있습니다.
MAIL FROM:<user@example.com>
RCPT TO:<user@example.com>
DATA
실제 우회 사례
다음은 외부망에서 이메일을 전송할 때 IP접근제어가 존재하는 보안장비를 우회하여 메일을 전송했던 방법입니다.
1. 연결 수립: SMTP 접속 후, EHLO mail.example.com 명령어를 통해 메일서버와 연결을 수립
2. 발신자 설정: MAIL FROM:fearis@antoherdomain.com 등 메일서버의 도메인이 아닌 외부 도메인 입력
- 메일서버의 도메인과 동일하게 설정 시 보안장비의 IP 접근제어가 적용됨
3. 수신자 설정: RCPT TO:admin@example.com 등 실제 존재하는 이메일 주소 입력
4**. 메일 전송:** DATA 명령어를 통해 본문내용 첨부 후, 메일 전송
5. 결과 확인: 담당자에게 실제로 메일이 도착했는지 확인
추가 공격 시나리오
메일을 전달받은 사용자가 내부망에 존재하여 리버스쉘 등 외부와 연결이 불가능한 환경이라면 다른 접근방법을 사용할 수 있습니다.
전송하는 메일에 배치 스크립트나 쉘스크립트를 업로드해 다음과 같은 정보를 수집하도록 할 수 있습니다. (물론 첨부파일 필터링을우회할 수 있다는 전제가 필요합니다.)
- 네트워크 정보 (IP 대역, 라우팅 테이블 등)
- 시스템 정보(OS버전, 설치된 소프트웨어 등)
- 현재 실행중인 프로세스 정보
수집된 정보는 다시 메일 본문에 담아서 이메일을 통해 외부로 전송하게 함으로써, 외부 통신이 차단된 환경에서도 내부망 정보를 탈취할 수 있는 경로를 확보할 수 있습니다.
최근 메일서버(SMTP)를 대상으로 한 모의해킹을 진행하면서 공부했던 내용을 블로그에 남깁니다.