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

www-freebuf-com

#1

*本文作者:lemurhhh,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

前言

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 25  
Trying 202.38.xxx.xxx...  
Connected to 202.38.xxx.xxx.  
Escape character is '^]'.  
220 mxt.xxx.xxx.cn ESMTP Postfix  
VRFY root  
252 2.0.0 root  
VRFY bin  
252 2.0.0 bin  
VRFY admin  
550 5.1.1 <admin>: Recipient address rejected: User unknown in local recipient table

MAIL FROM+RCPT TO命令

 $ telnet 202.38.xxx.xxx 25  
Trying 202.38.xxx.xxx...  
Connected to 202.38.xxx.xxx.  
Escape character is '^]'.  
220 mxt.xxx.xxx.cn ESMTP Postfix  
MAIL FROM:root  
250 2.1.0 Ok  
RCPT TO:root  
250 2.1.5 Ok  
RCPT TO:bin  
250 2.1.5 Ok  
RCPT TO:admin  
550 5.1.1 <admin>: 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 <number>   最大线程数(默认: 5)  
-M <mode>  使用方法方式 EXPN, VRFY or RCPT (默认: VRFY)  
-u <user>   指定用户  
-f <addr>   邮箱地址,只能用在 "RCPT TO" mode (默认: [email protected])  
-D <domaim>   使用电子邮件地址添加到用户列表在域 (默认: none)使用邮箱代替用户名,比如:"-D example.com"域来使用代替[email protected], [email protected]  
-U <file>   通过smtp服务指定文件里的用户名检查  
-t <host>   指定主机来运行smtp服务器主机服务  
-T <file>   指定文件来运行smtp服务器主机服务  
-p <port>   设置TCP端口号 (默认: 25)  
-d   调试  
-t <time>   最大返回时间 (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.xxx  
Starting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum )  
  
 ----------------------------------------------------------  
|                   Scan Information                       |  
 ----------------------------------------------------------  
  
Mode ..................... VRFY  
Worker Processes ......... 5  
Target count ............. 1  
Username count ........... 1  
Target TCP port .......... 25  
Query timeout ............ 5 secs  
Target 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.xxx  
Starting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum )  
  
 ----------------------------------------------------------  
|                   Scan Information                       |  
 ----------------------------------------------------------  
  
Mode ..................... RCPT  
Worker Processes ......... 5  
Target count ............. 1  
Username count ........... 1  
Target TCP port .......... 25  
Query timeout ............ 5 secs  
Target 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.xxx  
Starting smtp-user-enum v1.2 ( http://pentestmonkey.net/tools/smtp-user-enum )  
  
 ----------------------------------------------------------  
|                   Scan Information                       |  
 ----------------------------------------------------------  
  
Mode ..................... EXPN  
Worker Processes ......... 5  
Target count ............. 1  
Username count ........... 1  
Target TCP port .......... 25  
Query timeout ............ 5 secs  
Target 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.xxx  
rhosts => 202.38.xxx.xxx  
msf 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.203  
Starting Nmap 7.70 ( https://nmap.org ) at 2018-08-24 10:23 CST  
Nmap scan report for news.scut.edu.cn (202.38.193.203)  
Host is up (0.054s latency).  
  
PORT   STATE SERVICE  
25/tcp open  smtp  
| smtp-enum-users:   
|   root  
|   admin  
|   administrator  
|   webadmin  
|   sysadmin  
|   netadmin  
|   guest  
|   user  
|   web  
|_  test  
  
Nmap 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 等待用户输入验证信息

*本文作者:lemurhhh,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

Original links

http://www.freebuf.com/articles/web/182746.html