Swaks SMTP 服务测试
Swaks 全称 Swiss Army Knife SMTP,是一个灵活、可脚本化的 SMTP 事务测试工具。它适合检查 SMTP 服务是否可达、支持哪些命令、STARTTLS 是否可用、认证是否正常,以及邮件是否能被投递到目标用户邮箱。
在靶场里,Nmap 发现 25/465/587 端口后,Swaks 通常用于验证邮件投递链路。它不负责“扫描漏洞”,更像 SMTP 服务的手工测试器。
安装
Kali / Debian / Ubuntu
sudo apt update && sudo apt install -y swaks
macOS
brew install swaks
源码
从 Swaks 官方页面 下载脚本,赋予执行权限后放到 PATH 中:
chmod +x swaks
sudo mv swaks /usr/local/bin/
核心参数速查
| 参数 | 说明 | 示例 |
|---|---|---|
--server, -s | 指定 SMTP 服务器,可带端口 | --server 192.168.1.108 |
--port, -p | 指定端口 | --port 25 |
--to, -t | 收件人 | --to [email protected] |
--from, -f | 发件人 | --from [email protected] |
--helo | 指定 HELO/EHLO 主机名 | --helo attacker.local |
--quit-after, -q | 在指定阶段后退出 | --quit-after EHLO |
--tls | 要求使用 STARTTLS | --tls |
--tls-on-connect | 连接后立即 TLS,常用于 465 | --tls-on-connect --port 465 |
--tls-verify | 验证服务端证书 | --tls --tls-verify |
--auth, -a | 启用认证,可指定机制 | --auth LOGIN |
--auth-user, -au | 认证用户名 | --auth-user [email protected] |
--auth-password, -ap | 认证密码 | --auth-password password |
--body | 指定邮件正文 | --body "hello" |
--data | 使用完整 DATA 内容 | --data mail.txt |
--attach | 添加附件 | --attach report.txt |
--add-header, -ah | 添加邮件头 | --add-header "X-Test: 1" |
--timeout | 事务超时时间 | --timeout 10 |
常用测试模式
1. 检查 SMTP Banner
swaks --server 192.168.1.108 --quit-after BANNER
只验证服务是否能连接,以及服务端返回的 Banner。适合确认端口开放是否真的是 SMTP。
2. 检查 EHLO 能力
swaks --server 192.168.1.108 --quit-after EHLO
EHLO 结果里通常能看到服务支持的扩展,例如 STARTTLS、AUTH、PIPELINING、SIZE 等。
3. 发送一封基础测试邮件
swaks --server 192.168.1.108 --to root@localhost --from [email protected] --body "smtp test"
如果服务接受 MAIL FROM、RCPT TO 和 DATA,说明邮件投递链路至少在协议层可用。
4. 指定端口
swaks --server 192.168.1.108 --port 25 --to user@localhost --from [email protected]
常见端口:
| 端口 | 场景 |
|---|---|
| 25 | SMTP 服务端投递 |
| 465 | SMTPS,通常连接后立即 TLS |
| 587 | Submission,通常需要 STARTTLS 和认证 |
5. STARTTLS 测试
swaks --server mail.example.com --port 587 --tls --quit-after EHLO
如果目标是 465:
swaks --server mail.example.com --port 465 --tls-on-connect --quit-after EHLO
需要验证证书时:
swaks --server mail.example.com --port 587 --tls --tls-verify --quit-after EHLO
6. SMTP 认证测试
swaks --server mail.example.com --port 587 --tls \
--auth LOGIN \
--auth-user [email protected] \
--auth-password 'password' \
--to [email protected] \
--from [email protected] \
--body "auth test"
不要把真实密码写进可提交的 Markdown、脚本或命令历史。知识库示例只使用占位值。
7. 添加自定义邮件头
swaks --server 192.168.1.108 \
--to root@localhost \
--from [email protected] \
--add-header "X-BeeHack: smtp-test" \
--body "header test"
这适合测试邮件过滤、日志记录、网关规则和安全设备处理逻辑。
8. 发送附件
swaks --server mail.example.com \
--to [email protected] \
--from [email protected] \
--body "attachment test" \
--attach report.txt
附件测试容易触发网关、杀毒或 DLP 策略,只应在授权环境中执行。
靶场中的邮件投递验证
在 CTF 或 VulnHub 靶机中,SMTP 常见用途是确认本地用户是否能收邮件,或者验证“可控邮件内容是否会落到某个可读文件”。如果后续存在 LFI,邮件投递可能成为读取邮件队列或用户邮箱的入口。
swaks --server 192.168.1.108 \
--to www-data@localhost \
--from [email protected] \
--body "beehack smtp delivery test"
如果只是验证协议流程,不想真正发送 DATA,可以停在 RCPT TO:
swaks --server 192.168.1.108 \
--to www-data@localhost \
--from [email protected] \
--quit-after RCPT
在授权靶场中,若要复现“邮件内容写入可被 LFI 读取的位置”这一类路径,先用普通文本确认投递,再进入具体靶机文章里的利用步骤。不要在真实邮件系统中投递可执行 Payload。
排错思路
| 现象 | 可能原因 | 下一步 |
|---|---|---|
| 连接超时 | 防火墙、端口未开放、目标服务未监听 | 回到 Nmap 确认端口和服务 |
550 | 收件人不存在或不允许中继 | 换本地域用户,观察 RCPT 阶段 |
530 Authentication required | 服务要求认证 | 加 --auth、--auth-user、--auth-password |
| STARTTLS 失败 | 端口不支持 STARTTLS 或证书/TLS 协议问题 | 先 --quit-after EHLO 看能力列表 |
| 465 无响应 | 465 通常需要连接后立即 TLS | 加 --tls-on-connect |
| 邮件未落盘 | 本地投递链路、别名、权限或 MTA 配置问题 | 查看服务日志或换本地用户验证 |
靶场实战速查
| 场景 | 命令 |
|---|---|
| 看 Banner | swaks --server target --quit-after BANNER |
| 看 EHLO 能力 | swaks --server target --quit-after EHLO |
| 发普通测试邮件 | swaks --server target --to root@localhost --from [email protected] --body "test" |
| 停在 RCPT 阶段 | swaks --server target --to root@localhost --from [email protected] --quit-after RCPT |
| STARTTLS | swaks --server target --port 587 --tls --quit-after EHLO |
| SMTPS 465 | swaks --server target --port 465 --tls-on-connect --quit-after EHLO |
| 认证发送 | swaks --server target --port 587 --tls --auth LOGIN --auth-user user --auth-password password --to [email protected] |
| 自定义邮件头 | swaks --server target --to root@localhost --add-header "X-Test: 1" |