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 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 (默认: user@example.com)
-D <domaim> 使用电子邮件地址添加到用户列表在域 (默认: none)使用邮箱代替用户名,比如:"-D example.com"域来使用代替testA@example.com, testB@example.com
-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 | 等待用户输入验证信息 |
SMTP用户枚举原理简介及相关工具的更多相关文章
- kafka原理简介并且与RabbitMQ的选择
kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...
- Linux DNS原理简介及配置
Linux DNS原理简介及配置 DNS简介 DNS原理 域名解析的过程 资源记录 DNS BIND安装配置 一.简介 一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访 ...
- Oracle Golden Gate原理简介
Oracle Golden Gate原理简介 http://www.askoracle.org/oracle/HighAvailability/20140109953.html#6545406-tsi ...
- Linux SSH基于密钥交换的自动登陆原理简介及配置说明
一.原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密 ...
- NAT原理简介、各种 ADSL Modem 及路由器的端口映射方法
NAT原理简介 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force ...
- Zeppelin原理简介
Zeppelin是一个基于Web的notebook,提供交互数据分析和可视化.后台支持接入多种数据处理引擎,如spark,hive等.支持多种语言: Scala(Apache Spark).Pytho ...
- django工作原理简介
django工作原理简介 先简单的介绍一下django的工作原理,其中还会涉及到Middleware(中间件,包括request, view, exception, response),URLConf ...
- storm 原理简介及单机版安装指南——详细版【转】
storm 原理简介及单机版安装指南 本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial 原文链接自:http://www.open-op ...
- 【推荐】CentOS修复OpenSSH用户枚举漏洞
注:以下所有操作均在CentOS 6.8 x86_64位系统下完成. #漏洞说明# OpenSSH(OpenBSD Secure Shell)是OpenBSD计划组所维护的一套用于安全访问远程计算机的 ...
随机推荐
- day4 递归二分法查找
现有一个序列,data=[for i in range(1,5000,3)],现在要求看一个数是否在列表中存在,我们知道,我们可以使用in或__contains__()的方法,判断一个值是否在列表中, ...
- vue中methods、watch、computed之间的差别对比以及适用场景
首先要说,methods,watch和computed都是以函数为基础的,但各自却都不同: 一.computer 当页面中有某些数据依赖其他数据进行变动的时候,可以使用计算属性. <p id=& ...
- spring_150905_sqlmapclient
添加ibatis相关的jar包! 实体类: package com.spring.model; public class DogPet { private int id; private String ...
- JS获取select的value和text值的简单实例
本篇文章主要是对JS获取select的value和text值的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 代码如下: <select id = "cityList ...
- Vue路由开启keep-alive缓存页面
mode:hash模式下: HTML部分: <template> <div id="app"> <keep-alive> <!--使用ke ...
- 转:在 Ubuntu 上使用 Nginx 部署 Flask 应用
转:http://Python.jobbole.com/84286/ 原文出处: Vladik 译文出处:开源中国 我职业生涯的大部分都在使用微软的架构,最近我决定走出技术的舒适区,步入开源 ...
- 【转载】ARouter-万能路由协议
Github源码地址:https://github.com/alibaba/ARouter 一.功能介绍 支持直接解析标准URL进行跳转,并自动解析参数注入 支持多模块工程使用 支持添加多个拦截器,自 ...
- 井字棋游戏升级版 - TopTicTacToe项目 简介
一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...
- 如何正确地使用Java的@deprecated标注
没有什么事情比看到一个没有任何说明的@deprecated标注更让人愤怒的事情了.这种做法只能让人困惑,我到底还要不要用这个已经‘废弃’的方法?如果开发者不希望某个方法再被人用的话,就要好好地为@de ...
- 我的sublime text3 配置文件设置
{ "ignored_packages": [ "Vintage" ], //vim模式 "line_padding_bottom": 2, ...