SMTP用户枚举原理简介及相关工具

SMTP是安全测试中比较常见的服务类型,其不安全的配置(未禁用某些命令)会导致用户枚举的问题,这主要是通过SMTP命令进行的。本文将介绍SMTP用户枚举原理以及相关工具。

SMTP

SMTP命令

若服务器未禁用某些特殊命令,则可以利用这些特殊命令枚举用户,主要是MAIL FROM、RCPT TO、ETRN、VRFY指令。

SMTP命令

命令功能

MAIL FROM

指定发件人地址

RCPT TO

指定单个的邮件接收人;可有多个 RCPT TO;常在 MAIL FROM命令之后

VRFY

用于验证指定的用户/邮箱是否存在;由于安全原因,服务器常禁止此命令

EXPN

验证给定的邮箱列表是否存在,也常被禁用

SMTP返回码

执行上面的SMTP命令,通过其返回码可以判断用户是否存在。主要是250和550状态。

返回码

含义

250

要求的邮件操作完成

550

要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)

(文末附所有返回码)

手动枚举用户名

通过上面的介绍,我们可以通过Telnet连接,在未禁用上述SMTP命令的服务器上,使用上述命令手动枚举用户名。通过shodan等可以找到开放SMTP的服务器。

VRFY命令

$ telnet 202.38.xxx.xxx 25Trying 202.38.xxx.xxx...Connected to 202.38.xxx.xxx.Escape character is '^]'.220 mxt.xxx.xxx.cn ESMTP PostfixVRFY root252 2.0.0 rootVRFY bin252 2.0.0 binVRFY admin550 5.1.1 : Recipient address rejected: User unknown in local recipient table

MAIL FROM+RCPT TO命令

$ telnet 202.38.xxx.xxx 25Trying 202.38.xxx.xxx...Connected to 202.38.xxx.xxx.Escape character is '^]'.220 mxt.xxx.xxx.cn ESMTP PostfixMAIL FROM:root250 2.1.0 OkRCPT TO:root250 2.1.5 OkRCPT TO:bin250 2.1.5 OkRCPT TO:admin550 5.1.1 : Recipient address rejected: User unknown in local recipient table

可以看到两种方式均返回root、bin用户是存在的,admin用户不存在。

smtp-user-enum工具

smtp-user-enum是kali自带的,使用Perl编写的工具,其原理就是通过上述的三种命令枚举用户账户。

参数

Usage: smtp-user-enum.pl [options] ( -u username | -U file-of-usernames ) ( -t host | -T file-of-targets ) options:-m 最大线程数(默认: 5)-M 使用方法方式 EXPN, VRFY or RCPT (默认: VRFY)-u 指定用户-f 邮箱地址,只能用在 "RCPT TO" mode (默认: user@example.com)-D 使用电子邮件地址添加到用户列表在域 (默认: none)使用邮箱代替用户名,比如:"-D example.com"域来使用代替testA@example.com, testB@example.com-U 通过smtp服务指定文件里的用户名检查-t 指定主机来运行smtp服务器主机服务-T 指定文件来运行smtp服务器主机服务-p

设置TCP端口号 (默认: 25)-d 调试-t 最大返回时间 (default: 5)-v 版本 -h 帮助

文档:http://pentestmonkey.net/tools/user-enumeration/smtp-user-enum。

示例

VRFY方式

$ smtp-user-enum -M VRFY -u root -t 202.38.xxx.xxxStarting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum ) ----------------------------------------------------------| Scan Information | ----------------------------------------------------------Mode ..................... VRFYWorker Processes ......... 5Target count ............. 1Username count ........... 1Target TCP port .......... 25Query timeout ............ 5 secsTarget domain ............ ######## Scan started at Fri Aug 24 09:37:15 2018 #########202.38.xxx.xxx: root exists######## Scan completed at Fri Aug 24 09:37:15 2018 #########1 results.1 queries in 1 seconds (1.0 queries / sec)

RCPT方式

$ smtp-user-enum -M RCPT -u bin -t 202.38.xxx.xxxStarting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum ) ----------------------------------------------------------| Scan Information | ----------------------------------------------------------Mode ..................... RCPTWorker Processes ......... 5Target count ............. 1Username count ........... 1Target TCP port .......... 25Query timeout ............ 5 secsTarget domain ............ ######## Scan started at Fri Aug 24 09:37:44 2018 #########202.38.xxx.xxx: bin exists######## Scan completed at Fri Aug 24 09:37:44 2018 #########1 results.1 queries in 1 seconds (1.0 queries / sec)

EXPN方式(目标服务器禁用了该方法)

$ smtp-user-enum -M EXPN -u bin -t 202.38.xxx.xxxStarting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum ) ----------------------------------------------------------| Scan Information | ----------------------------------------------------------Mode ..................... EXPNWorker Processes ......... 5Target count ............. 1Username count ........... 1Target TCP port .......... 25Query timeout ............ 5 secsTarget domain ............ ######## Scan started at Fri Aug 24 09:37:53 2018 ################# Scan completed at Fri Aug 24 09:37:53 2018 #########0 results.1 queries in 1 seconds (1.0 queries / sec)

与手工测试的相同,root与bin用户是存在的。由最后的EXPN方式的结果可以看到,该工具不返回结果,不一定是由于不存在测试的账户,还可能是由于服务器禁用了该方式对应的命令,这时可以考虑使用手工方式通过返回的状态码进一步确定原因(文末附所有返回码)。

metasploit辅助模块:smtp_enum

metasploit有辅助模块smtp_enum,可以基于字典枚举smtp用户名。设置比较简单,主要是常规的远程主机地址、端口号、用户名字典、线程数等。其中的UNIXONLY是用于设置是否跳过对微软系的测试,这是由于Windows的SMTP服务命令稍有不同(请见:https://technet.microsoft.com/zh-cn/library/aa996114(v=exchg.65).aspx)

msf > use auxiliary/scanner/smtp/smtp_enum msf auxiliary(scanner/smtp/smtp_enum) > show options Module options (auxiliary/scanner/smtp/smtp_enum): Name Current Setting Required Description ---- --------------- -------- ----------- RHOSTS yes The target address range or CIDR identifier RPORT 25 yes The target port (TCP) THREADS 1 yes The number of concurrent threads UNIXONLY true yes Skip Microsoft bannered servers when testing unix users USER_FILE /usr/share/metasploit-framework/data/wordlists/unix_users.txt yes The file that contains a list of probable users accounts.msf auxiliary(scanner/smtp/smtp_enum) > set rhosts 202.38.xxx.xxxrhosts => 202.38.xxx.xxxmsf auxiliary(scanner/smtp/smtp_enum) > run[*] 202.38.xxx.xxx:25 - 202.38.xxx.xxx:25 Banner: 220 mxt.xxx.xxx.cn ESMTP Postfix[+] 202.38.xxx.xxx:25 - 202.38.xxx.xxx:25 Users found: adm, avahi, avahi-autoipd, bin, daemon, fax, ftp, games, gdm, gopher, haldaemon, halt, lp, mail, news, nobody, operator, postgres, postmaster, root, sshd, sync, uucp, webmaster, www[*] Scanned 1 of 1 hosts (100% complete)[*] Auxiliary module execution completed

可以看到枚举出了许多的用户名,通过其中的ftp、gopher、www等,可以猜测到服务器运行着相关的服务,这对后续的测试有很大的价值。

nmap脚本:smtp-enum-users

nmap也有名为smtp-enum-users的扫描脚本可供使用。这是nmap对同一服务器枚举出的用户名。可以通过–script-args smtp-enum-users.methods={EXPN,RCPT,VRFY}设置扫描方式。如果未指定,按照RCPT、VRFY、EXPN的顺序进行测试。通过 –script-args userdb=user_path,passdb=pass_path指定字典。

$ nmap -p 25 --script smtp-enum-users.nse 202.38.193.203Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-24 10:23 CSTNmap scan report for news.scut.edu.cn (202.38.193.203)Host is up (0.054s latency).PORT STATE SERVICE25/tcp open smtp| smtp-enum-users: | root| admin| administrator| webadmin| sysadmin| netadmin| guest| user| web|_ testNmap done: 1 IP address (1 host up) scanned in 1.27 seconds

总结

通过上面的简介,可以看出若服务器未对SMTP服务做安全的配置,则容易通过SMTP用户枚举获取用户名,并结合一些典型服务的默认用户名,为后续的测试提供系统的相关信息。

附录:SMTP返回码

返回码

含义

500

格式错误,命令不可识别(此错误也包括命令行过长)

501

参数格式错误

502

命令不可实现

503

错误的命令序列

504

命令参数不可实现

211

系统状态或系统帮助响应

214

帮助信息

220

服务就绪

221

服务关闭传输信道

421

服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应)

250

要求的邮件操作完成

251

用户非本地,将转发向

450

要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)

550

要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)

451

放弃要求的操作;处理过程中出错

551

用户非本地,请尝试

452

系统存储不足,要求的操作未执行

552

过量的存储分配,要求的操作未执行

553

邮箱名不可用,要求的操作未执行(例如邮箱格式错误)

354

开始邮件输入,以.结束

554

操作失败

535

用户验证失败

235

用户验证成功

334

等待用户输入验证信息