前言

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用户枚举原理简介及相关工具的更多相关文章

  1. kafka原理简介并且与RabbitMQ的选择

    kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...

  2. Linux DNS原理简介及配置

    Linux DNS原理简介及配置 DNS简介 DNS原理 域名解析的过程 资源记录 DNS BIND安装配置 一.简介 一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访 ...

  3. Oracle Golden Gate原理简介

    Oracle Golden Gate原理简介 http://www.askoracle.org/oracle/HighAvailability/20140109953.html#6545406-tsi ...

  4. Linux SSH基于密钥交换的自动登陆原理简介及配置说明

    一.原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密 ...

  5. NAT原理简介、各种 ADSL Modem 及路由器的端口映射方法

    NAT原理简介 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force ...

  6. Zeppelin原理简介

    Zeppelin是一个基于Web的notebook,提供交互数据分析和可视化.后台支持接入多种数据处理引擎,如spark,hive等.支持多种语言: Scala(Apache Spark).Pytho ...

  7. django工作原理简介

    django工作原理简介 先简单的介绍一下django的工作原理,其中还会涉及到Middleware(中间件,包括request, view, exception, response),URLConf ...

  8. storm 原理简介及单机版安装指南——详细版【转】

    storm 原理简介及单机版安装指南 本文翻译自: https://github.com/nathanmarz/storm/wiki/Tutorial 原文链接自:http://www.open-op ...

  9. 【推荐】CentOS修复OpenSSH用户枚举漏洞

    注:以下所有操作均在CentOS 6.8 x86_64位系统下完成. #漏洞说明# OpenSSH(OpenBSD Secure Shell)是OpenBSD计划组所维护的一套用于安全访问远程计算机的 ...

随机推荐

  1. Python全栈开发之7、模块和几种常见模块以及format知识补充

    一.模块的分类 Python流行的一个原因就是因为它的第三方模块数量巨大,我们编写代码不必从零开始重新造轮子,许多要用的功能都已经写好封装成库了,我们只要直接调用即可,模块分为内建模块.自定义的模块. ...

  2. lr11_Run-time Settings选项介绍:

    lr11_Run-time Settings选项介绍: ●Run Logic ●Pacing ●Log 下面对每个

  3. 安装deb包解决依赖问题

    在使用 dpkg -i 安装deb包后,会出现依赖关系而不能正常安装软件,这个时候先更新下源然后解决依赖关系后重装即可. sudo apt-get update # 更新 sudo apt-get - ...

  4. 提起Ajax请求的方式(POST)

    前言 => 是ES6中的arrow function x=>x+6 就相当于 function(x){ return x+6; } 正文 XMLHttpRequest a=new XMLH ...

  5. Wannafly挑战赛7 E - 珂朵莉与GCD

    题目描述 给你一个长为n的序列a m次查询 每次查询一个区间的所有子区间的gcd的和mod1e9+7的结果 输入描述: 第一行两个数n,m之后一行n个数表示a之后m行每行两个数l,r表示查询的区间 输 ...

  6. EL和JSTL的关系

    JSTL与EL的关系:EL的功能是有限的,去集合只能取特定的某一个元素,如果遍历或循环就不行了,或者添加一些条件分支判断也不行,或做一些格式化,比如日期的格式化,数字的格式化,也不行,所以要做这些功能 ...

  7. JSP之登录验证码

    1.JSP页面中设置输入选项和验证码 <form action=login.do" method="post" > <div class="l ...

  8. React Native 系列(四)

    前言 本系列是基于React Native版本号0.44.3写的.RN支持CSS中的布局属性,因此可以使用CSS布局属性,这里就不详细地讲解了,这篇文章的重点主要是讲述一下RN中的Flex布局. CS ...

  9. 范浩强treap——可持久化

    当平衡树需要可持久化的时候,意味着我们需要访问以前的某个时间点的平衡树,就要保持以前的树形态不变,新建一个时间戳,构建一棵新的树. 如果用以前的旋转treap可能就不方便做到(又要打时间戳,又要新建节 ...

  10. POJ 2728 JZYZOJ 1636 分数规划 最小生成树 二分 prim

    http://172.20.6.3/Problem_Show.asp?id=1636 复习了prim,分数规划大概就是把一个求最小值或最大值的分式移项变成一个可二分求解的式子. #include< ...