前言

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. poj1950 Dessert(DFS)

    题目链接 http://poj.org/problem?id=1950 题意 输入一个整数n(3<=n<=15),将1,2,..n顺序排列,在数字中间插入'+','-','.',这样会产生 ...

  2. OOD沉思录 --- 面向动作与面向对象 --- 避免全能类

    面向过程的软件开发通过非常集中化的控制机制来分解功能,在程序设计中表现就是大量的条件判断,深层次的循环嵌套等. 这种模式下,我们可以通过分析方法的参数,局部变量及其访问的全局变量来得到方法对数据的依赖 ...

  3. Mysql 主键约束PrimaryKey

    Mysql 主键约束Primary Key 今天来简单的讲一下主键约束. 假如有一张学生信息表,里面记录了学生的学号 ,姓名,成绩等,那么,会不会有两个学号相同的学生,答案肯定是否定的,如果有的话也只 ...

  4. python爬虫实战(三)--------搜狗微信文章(IP代理池和用户代理池设定----scrapy)

    在学习scrapy爬虫框架中,肯定会涉及到IP代理池和User-Agent池的设定,规避网站的反爬. 这两天在看一个关于搜狗微信文章爬取的视频,里面有讲到ip代理池和用户代理池,在此结合自身的所了解的 ...

  5. Python对Excel的操作

    Python几个读取Excel库的介绍: xlwings 可结合 VBA 实现对 Excel 编程,强大的数据输入分析能力,同时拥有丰富的接口,结合 pandas/numpy/matplotlib 轻 ...

  6. redis:CLUSTER cluster is down 解决方法

    redis:CLUSTER cluster is down 解决方法 首先进入安装目录的src下: 1. ./redis-trib.rb check 127.0.0.1:7001 检查问题所在 2.  ...

  7. FastReport.Net使用:[5]主从表

    主从报表在日常生活中也很常用,譬如订单,班级学生报表等.下面以学生选课为例,以学生为主表,选课为从表做一学生选课报表. 绘制简单主从报表 1.绘制报表标题. 2.为数据区添加从表. ●可以直接右键数据 ...

  8. 一个安卓应用 多少个 dalvik 虚拟机

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 一个

  9. 贪心:zoj3953 Intervals

    Description Chiaki has n intervals and the i-th of them is [li, ri]. She wants to delete some interv ...

  10. 2018 计算之道初赛第二场 阿里巴巴的手机代理商(困难)(反向可持久化Trie)

    阿里巴巴的手机代理商(困难) 阿里巴巴的手机代理商正在研究 infra 输入法的新功能.他们需要分析单词频率以改进用户输入法的体验.于是需要你在系统内核里面写一个 API. API 有如下功能: 添加 ...