前记
近期可能得帮客户做一个钓鱼邮件的攻防演练,本来以为写个python调用一下几个大厂的smtp发送一下就完事了,没想到几个大厂的安全措施做的还是不错的各种拦截,哈哈。也不敢到网上用别人的smtp,最后没办法就自己动手在本地搭建一套smtp服务器去实现了,初步计划在本地自建Named+postfix实现邮件发送,然后用python调用smtp把邮件发出去,如果对方有all组的话就不用批量发了直接发给all组就可以了,搭建后测试效果发现还不错。因为是自建的服务器没有什么安全设置,可以把域名设置成和对方相似的域名,这样增加钓鱼的成功率,并任意添加账户,账户名可以和对方高层一样。
关于结果收集方面还没想好,本来以为可以直接上个url比较简单,但是对方从内网访问到公网的ip记录下来的ip是出口ip,这样就没法定位到是哪个员工中招了,除非对方有浏览器漏洞,在钓鱼的页面插入pyload记录本地地址,但是这很依赖用户的浏览器版本。目前的想法是做一个word,利用word较新的漏洞,去记录本地信息并回传到我们的服务器,但这在目标机器执行了代码,估计还得协商一下哈哈。
DNS服务器搭建及配置
- 安装named
1 | yum install named |
- 修改/etc/named.conf主配置文件设置监听的端口,配置文件,转发请求等,主要修改内容为:
- 把listen-on port 53、listen-on-v6 port 53、allow-query改为any,允许所有人访问dns服务器
- 添加 forward first、forwarders {114.114.114.114;}; ,在本域解析不了的请求发往114.114.114.114查询
1 |
|
- 修改/etc/named.rfc1912.zones添加解析域文件
- 添加test.com域的正向域解析文件
- 添加218.168.192.段的反向解析文件
1 | zone "localhost.localdomain" IN { |
- 创建正向解析文件test.com.zone,并添加MX和A记录
1 | #从模板复制到test.com.zone文件 |
- 创建反向解析文件192.168.218.in-addr.arpa.zone,并添加MX和PTR记录
1 | #从模板复制到192.168.218.in-addr.arpa.zone文件 |
- DNS指向本地IP,启动named服务器并测试结果
1 | #启动服务 |
Postfix服务器搭建及配置
- 安装Postfix
1 | yum install postfix |
- 修改主配置文件main.cf,主要的配置参数如下:
- myhostname:设置邮件服务器主机名称
- mydomain:设置域
- myorigin:设置组织
- inet_interfaces:设置监听IP
- inet_protocols:设置监听协议
- mydestination:设置邮件接收域
- mynetworks:设置本地网络
- relay_domains:设置转发哪些外域的邮件
- home_mailbox:设置邮箱目录
1 | myhostname = mail.test.com |
- 启动postfix并测试结果
1 | #启动服务 |
python调用smtp服务器
这个地方踩了坑比较多,本来想用本地的smtp发送个邮件到QQ邮箱,结果发不出去,看一下日志,我靠我家的IP被封了?我都没用QQ邮箱,之后我又往google发,也告诉我IP信誉度低被拒收了,感觉我家的IP被人盗用了:(,后来测试往163发没有问题,这里真吐槽一下QQ邮箱的防护,发一个subject“项目进度”都是垃圾邮件~
第二个问题就是邮件的编码问题,一开始我的[‘From’]和[‘TO’]是这么写的,结果收件人显示乱码。
1 | message['From'] = Header("张总", 'utf-8') |
在网上查了一下,[‘From’]和[‘TO’]以变量的形式引入才不会乱码,至于效果我在163邮箱是得到证实的,不过每个邮件系统可能还有区别,需要多去测一测。
最后的代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = 'jack'
receivers = ['18756994059@163.com']
mail_host = '192.168.218.155'
message = MIMEText('test mail', 'plain', 'utf-8')
# message['From'] = Header("张总", 'utf-8')
message['From'] = "%s<jack@test.com>" % Header("张总", 'utf-8')
message['TO'] = "%s<18756994059@163.com>" % Header("全体员工", 'utf-8')
message["Accept-Language"] = "zh-CN"
message["Accept-Charset"] = "ISO-8859-1,utf-8"
subject = 'test'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP(mail_host, 25)
smtpObj.sendmail(sender, receivers, message.as_string())
print "邮件发送成功"
except smtplib:
print "邮件发送失败"
后记
至此,前面的发送阶段应该问题不大了。重点是如何把钓鱼的结果收集上来,后面先测试一下用OFFICE文件进行钓鱼的效果,目前也只想到这一种较好的方法,访问统计由于只能统计到出口地址应该是不可行了。