Gophish详细教程

gophish详细教程

本文转自 Ve99 并作补充

声明:
利用钓鱼网站骗取银行卡或信用卡账号、密码等私人资料属于非法行为,请不要进行任何非授权的网络攻击
由于传播、利用本文所提供的信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任

Gophish简介

偶然发现了 gophish 这个钓鱼工具,可网上关于该工具的(中文)资料却寥寥无几。花了一些时间了解之后,发现这个工具真香,因此特意斥巨资 (时间就是金钱) 写了这篇个人认为比较详细的教程,希望可以帮到第一次接触这个工具的小伙伴。不足之处,还望各路大神批评!

Gophish 项目地址:https://github.com/gophish/gophish
Gophish 官网地址:https://getgophish.com/

Gophish:开源网络钓鱼工具包

Gophish 是为企业和渗透测试人员设计的开源网络钓鱼工具包。 它提供了快速,轻松地设置和执行网络钓鱼攻击以及安全意识培训的能力。

gophish 自带 web 面板,对于邮件编辑、网站克隆、数据可视化、批量发送等功能的使用带来的巨大的便捷
在功能上实现分块,令钓鱼初学者能够更好理解钓鱼工作各部分的原理及运用

安装包下载:https://github.com/gophish/gophish/releases

当前(2020.07.23)最新版本是 v0.10.1
gophish 可以运行在常见的操作系统上,下面分别介绍两大主流系统 Linux 与 Windows 上的安装及运行

Linux

根据自身操作系统的版本下载相应的安装包
gophish-v0.10.1-linux-32bit.zip
gophish-v0.10.1-linux-64bit.zip

使用wget命令下载到本地

1
2
3
4
//32bit
root@ubuntu:~$ wget https://github.com/gophish/gophish/releases/download/v0.10.1/gophish-v0.10.1-linux-32bit.zip
//64bit
root@ubuntu:~$ wget https://github.com/gophish/gophish/releases/download/v0.10.1/gophish-v0.10.1-linux-64bit.zip

这里以 64 位 Ubuntu 系统为例:
下载完成后,利用unzip命令进行解压

1
root@ubuntu:~$ mkdir gophishroot@ubuntu:~$ unzip gophish-v0.10.1-linux-64bit.zip -d ./gophish

修改配置文件:

1
root@ubuntu:~$ cd gophish

若需要远程访问后台管理界面,将listen_url修改为0.0.0.0:3333,端口可自定义。(这项主要针对于部署在服务器上,因为一般的 Linux 服务器都不会安装可视化桌面,因此需要本地远程访问部署在服务器上的 gophish 后台)
如果仅通过本地访问,保持127.0.0.1:3333即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@ubuntu:~$ vi config.json
{
//后台管理配置
"admin_server": {
"listen_url": "0.0.0.0:3333", // 远程访问后台管理
"use_tls": true,
"cert_path": "gophish_admin.crt",
"key_path": "gophish_admin.key"
},
"phish_server": {
"listen_url": "0.0.0.0:80",
"use_tls": false,
"cert_path": "example.crt",
"key_path": "example.key"
},
"db_name": "sqlite3",
"db_path": "gophish.db",
"migrations_prefix": "db/db_",
"contact_address": "",
"logging": {
"filename": "",
"level": ""
}
}

运行 gophish:
运行 gophish 脚本

1
root@ubuntu:~$ ./gophish

访问后台管理系统:
本地打开浏览器,访问https://ip:3333/ (注意使用 https 协议)
可能会提示证书不正确,依次点击 高级继续转到页面 ,输入默认账密进行登录:admin/gophish

注:最新版本的 gophsih(v0.11.0) 删除了默认密码 “ gophish”。取而代之的是,在首次启动 Gophish 时会随机生成一个初始密码并将其打印在终端中
详情见:https://github.com/gophish/gophish/releases/tag/v0.11.0

此处建议,如果是部署在公网服务器上,尽量登录后在功能面板Account Settings处修改高强度密码

如果依旧访问不到后台管理系统,有可能是服务器未对外开放 3333 端口,可查看防火墙策略、配置 iptables 等方式自检

image

访问钓鱼界面:
本地打开浏览器,访问http://ip:80/
由于我们还未配置钓鱼页面,提示小段的404 page not found说明运行正常

image

至此,已完成了 Linux 下 gophish 的安装以及相关配置,并且运行起来了。
另外我在实践中遇到过一个小问题,当仅仅使用命令./gophish来启动 gophish 时,经过一段时间会自动掉线(脚本终止运行)
所以需要长期保持运行时,可以结合nohup&来启动 gophish,保持后台稳定运行
具体命令:

1
root@ubuntu:~$ nohup ./gophish &

Windows

关于 gophish 的 Windows 平台安装包仅有 64 位的,如果是 32 的 win 可能会不兼容(未测试),不过现在的 PC 大多数都是 64 位了,因此还是具有普遍性

下载安装包:
gophish-v0.10.1-windows-64bit.zip
下载完成后,使用压缩工具解压到文件夹中

image

(可选)修改配置文件:
如果有远程访问 gophish 的后台管理系统的需求,则修改配置文件。具体参考 Linux 下修改 gophish 配置文件
使用编辑器打开config.json文件,修改字段listen_url的值为0.0.0.0:3333 (默认为127.0.0.1:3333,仅本地访问),端口可自定义

运行 gophish:
双击目录下的gophish.exe启动 gophish,这里需要保持小黑框不被关闭,关闭则脚本终止(如果看着碍眼可以自行搜索后台运行的方法)

image

访问后台管理系统:
本地浏览器访问:https://127.0.0.1:3333https:// 远程 ip:3333 (注意使用 https 协议)
输入默认账密进行登录:admin/gophish

注:最新版本的 gophsih(v0.11.0) 删除了默认密码 “ gophish”。取而代之的是,在首次启动 Gophish 时会随机生成一个初始密码并将其打印在终端中
详情见:https://github.com/gophish/gophish/releases/tag/v0.11.0

image

访问钓鱼界面:
本地打开浏览器,访问http://127.0.0.1:80/http:// 远程 ip:80/
由于我们还未配置钓鱼页面,提示小段的404 page not found说明运行正常

image

至此完成了 gophish 在 Windows 平台下的安装配置及运行

由于后台管理系统是不区分操作系统的,因此不区分 Linux 和 Windows 来介绍各功能

进入后台后,左边的栏目即代表各个功能,分别是Dashboard 仪表板Campaigns 钓鱼事件Users & Groups 用户和组Email Templates 邮件模板Landing Pages 钓鱼页面Sending Profiles 发件策略六大功能
由于实际使用中并不是按照该顺序来配置各个功能,因此下面通过实际使用顺序来详细介绍各功能的使用方法

Sending Profiles 发件策略

Sending Profiles 的主要作用是将用来发送钓鱼邮件的邮箱配置到 gophish

点击New Profile新建一个策略,依次来填写各个字段
Name:
Name 字段是为新建的发件策略进行命名,不会影响到钓鱼的实施,建议以发件邮箱为名字,例如如果使用 qq 邮箱来发送钓鱼邮件,则 Name 字段可以写xxxxxx@qq.com

image

Interface Type:
Interface Type 是接口类型,默认为SMTP 类型且不可修改,因此需要发件邮箱开启 SMTP 服务
From:
From 是发件人,即钓鱼邮件所显示的发件人。(在实际使用中,一般需要进行近似域名伪造)这里为了容易理解,就暂时以 qq 邮箱为例,所以 From 字段可以写:test<xxxxxx@qq.com>

image

Host:
Host 是 smtp 服务器的地址,格式是 smtp.example.com:25,例如 qq 邮箱的 smtp 服务器地址为smtp.qq.com

image

Username:
Username 是 smtp 服务认证的用户名,如果是 qq 邮箱,Username 则是自己的 qq 邮箱号xxxx@qq.com
Password:
Password 是 smtp 服务认证的密码,例如 qq 邮箱,需要在登录 qq 邮箱后,点击 设置 - 账户 - 开启 SMPT 服务 生成授权码,Password 的值则可以填收到的授权码

image

(可选)Email Headers:
Email Headers 是自定义邮件头字段,例如邮件头的X-Mailer字段,若不修改此字段的值,通过 gophish 发出的邮件,其邮件头的 X-Mailer 的值默认为 gophish

image

设置好以上字段,可以点击Send Test Email来发送测试邮件,以检测 smtp 服务器是否认证通过

image

成功收到测试邮件:

image

至此,发件邮箱的配置已经完成。当然,在实际钓鱼中,不可能使用自己的 qq 邮箱去发送钓鱼邮件。一是暴露自身身份,且邮件真实性低,二是 qq 邮箱这类第三方邮箱对每个用户每日发件数存在限制。
因此,如果需要大批量去发送钓鱼邮件,最好的方式是使用自己的服务器,申请近似域名,搭建邮件服务器来发件

Landing Pages 钓鱼页面

完成钓鱼邮件的编写后,下一步则需要设计由邮件中超链接指向的钓鱼网页,点击New Page新建页面
Name:
Name 是用于为当前新建的钓鱼页面命名,可以简单命名为钓鱼页面 1

image

Import Site:
与钓鱼邮件模板的编辑一样,gophish 为钓鱼页面的设计也提供了两种方式,第一种则是Import Site
点击 Import Site 后,填写被伪造网站的 URL,再点击 Import,即可通过互联网自动抓取被伪造网站的前端代码
这里以伪造 XX 大学电子邮箱登录界面为例,在 Import Site 中填写https://mail.XX.edu.cn/cgi-bin/loginpage,并点击import

image

内容编辑框:
内容编辑框是编辑钓鱼页面的第二种方法,但是绝大多数情况下,它更偏向于用来辅助第一种方法,即对导入的页面进行源码修改以及预览。

image

由于编码的不同,通常直接通过 Import Site 导入的网站,其中文部分多少存在乱码现象,这时候就需要查看源码并手动修改过来
例如预览刚才导入的 XX 大学邮箱登录界面,就发现在多处存在乱码现象

image

(重点)Capture Submitted Data:
通常,进行钓鱼的目的往往是捕获受害用户的用户名及密码,因此,在点击 Save Page 之前,记得一定要勾选Capture Submitted Data
当勾选了Capture Submitted Data后,页面会多出一个Capture Passwords的选项,显然是捕获密码。通常,可以选择勾选上以验证账号的可用性。如果仅仅是测试并统计受害用户是否提交数据而不泄露账号隐私,则可以不用勾选
另外,当勾选了Capture Submitted Data后,页面还会多出一个Redirect to,其作用是当受害用户点击提交表单后,将页面重定向到指定的 URL。可以填写被伪造网站的 URL,营造出一种受害用户第一次填写账号密码填错的感觉
(一般来说,当一个登录页面提交的表单数据与数据库中不一致时,登录页面的 URL 会被添加上一个出错参数,以提示用户账号或密码出错,所以在Redirect to中,最好填写带出错参数的 URL)
因此,令此处的 Redirect to 的值为https://mail.XX.edu.cn/cgi-bin/loginpage?errtype=1

image

填写好以上参数,点击Save Page,即可保存编辑好的钓鱼页面

踩坑汇总

(必看)经验之谈 · 注意事项
在导入真实网站来作为钓鱼页面时,绝大多数情况下并非仅通过 Import 就能够达到理想下的克隆,通过多次实践,总结出以下几点注意事项

  1. 【捕获不到提交的数据】导入后要在 HTML 编辑框的非 Source 模式下观察源码解析情况,如果明显发现存在许多地方未加载,则有可能导入的源码并非页面完全加载后的前端代码,而是一个半成品,需要通过浏览器二次解析,渲染未加载的 DOM。这种情况下,除非能够直接爬取页面完全加载后的前端代码,否则无法利用 gophish 进行钓鱼,造成的原因是不满足第 2 点。
  2. 【捕获不到提交的数据】导入的前端源码,必须存在严格存在<form method="post" ···><input name="aaa" ··· /> ··· <input type="submit" ··· /></form>结构,即表单(POST 方式)— Input 标签(具有 name 属性)Input 标签(submit 类型)— 表单闭合的结构,如果不满足则无法捕获到提交的数据
  3. 【捕获不到提交的数据】在满足第 2 点的结构的情况下,还需要求<form method="post" ···>浏览器解析渲染后(即预览情况下)不能包含action属性,或者action 属性的值为空。否则将会把表单数据提交给 action 指定的页面,而导致无法被捕获到
  4. 【捕获数据不齐全】对于需要被捕获的表单数据,除了input 标签需要被包含在<form>中,还需满足该<input>存在name属性。例如<input name="username">, 否则会因为没有字段名而导致value被忽略
  5. 【密码被加密】针对https页面的 import,通常密码会进行加密处理,这时需要通过审计导入的前端代码,找到加密的JavaScript 函数(多数情况存在于单独的js 文件中,通过 src 引入),将其在 gophish 的 HTML 编辑框中删除,阻止表单数据被加密

以上 5 点是在实践中总结出来的宝贵经验,或许还有其他许多坑未填,但所有的坑通常都围绕在<form><input /></form>结构中,所以如果遇到新坑,先将该结构排查一遍,还是不行,再另辟蹊径

Email Templates 钓鱼邮件模板

完成了邮箱配置之后,就可以使用 gophish 发送邮件了。所以,接下来需要去编写钓鱼邮件的内容
点击New Template新建钓鱼邮件模板,依次介绍填写各个字段

Name:
同样的,这个字段是对当前新建的钓鱼邮件模板进行命名。可以简单的命名为:邮件模板 1

image

Import Email:
gophish 为编辑邮件内容提供了两种方式,第一种就是Import Email

用户可以先在自己的邮箱系统中设计好钓鱼邮件,然后发送给自己或其他伙伴,收到设计好的邮件后,打开并选择导出为 eml 文件或者显示邮件原文,然后将内容复制到 gophish 的 Import Email中,即可将设计好的钓鱼邮件导入

image

需要注意,在点击Import之前需要勾选上Change Links to Point to Landing Page,该功能实现了当创建钓鱼事件后,会将邮件中的超链接自动转变为钓鱼网站的 URL
Subject:
Subject 是邮件的主题,通常为了提高邮件的真实性,需要自己去编造一个吸引人的主题。这里简单填写成“第一次钓鱼测试”

image

内容编辑框:
内容编辑框是编写邮件内容的第二种模式,内容编辑框提供了TextHTML两种模式来编写邮件内容,使用方式与正常的编辑器无异。
其中 HTML 模式下的预览功能比较常用到,在编辑好内容后,点击预览,就可以清晰看到邮件呈现的具体内容以及格式

image

Add Tracking Image:
Add Tracking Image 是在钓鱼邮件末添加一个跟踪图像,用来跟踪受害用户是否打开了收到的钓鱼邮件。默认情况下是勾选的,如果不勾选就无法跟踪到受害用户是否打开了钓鱼邮件
(注:跟踪受害用户是否点击钓鱼链接以及捕捉提交数据不受其影响)
Add Files:
Add Files 是在发送的邮件中添加附件,一是可以添加相关文件提高邮件真实性,二是可以配合免杀木马诱导受害用户下载并打开

当填写完以上字段后,点击Save Template,就能保存当前编辑好的钓鱼邮件模板

Users & Groups 用户和组

当完成上面三个功能的内容编辑,钓鱼准备工作就已经完成了 80%,Users & Groups 的作用是将钓鱼的目标邮箱导入 gophish 中准备发送
点击New Group新建一个钓鱼的目标用户组
Name:
Name 是为当前新建的用户组命名,这里简单命名为目标 1 组

image

Bulk Import Users:
Bulk Import Users 是批量导入用户邮箱,它通过上传符合特定模板的CSV 文件来批量导入目标用户邮箱
点击旁边灰色字体的Download CSV Template可以下载特定的 CSV 模板文件。其中,模板文件的Email是必填项,其余的Frist NameLast NamePosition可选填

image

Add:
除了批量导入目标用户的邮箱,gophish 也提供了单个邮箱的导入方法,这对于开始钓鱼前,钓鱼组内部测试十分方便,不需要繁琐的文件上传,直接填写Email即可,同样其余的Frist NameLast NamePosition可选填

image

编辑好目标用户的邮箱后,点击Save Changes即可保存编辑好的目标邮箱保存在 gophish 中

Campaigns 钓鱼事件

Campaigns 的作用是将上述四个功能Sending ProfilesEmail TemplatesLanding PagesUsers & Groups联系起来,并创建钓鱼事件
在 Campaigns 中,可以新建钓鱼事件,并选择编辑好的钓鱼邮件模板,钓鱼页面,通过配置好的发件邮箱,将钓鱼邮件发送给目标用户组内的所有用户

点击New Campaign新建一个钓鱼事件

Name:
Name 是为新建的钓鱼事件进行命名,这里简单命名为第一次钓鱼

image

Email Template:
Email Template 即钓鱼邮件模板,这里选择刚刚上面编辑好的钓鱼邮件模板邮件模板 1

image

Landing Page:
Landing Page 即钓鱼页面,这里选择刚刚上面编辑好的名为钓鱼页面 1的 XX 大学邮箱登录页面的钓鱼页面

image

(重点)URL:
URL 是用来替换选定钓鱼邮件模板中超链接的值,该值指向部署了选定钓鱼页面的 url 网址(这里比较绕,下面具体解释一下,看完解释再来理解这句话)

简单来说,这里的 URL 需要填写当前运行 gophish 脚本主机的 ip
因为启动 gophish 后,gophish 默认监听了333380端口,其中3333端口是后台管理系统,而80端口就是用来部署钓鱼页面的。
当 URL 填写了http:// 主机 IP/,并成功创建了当前的钓鱼事件后。gophish 会在主机的80端口部署当前钓鱼事件所选定的钓鱼页面,并在发送的钓鱼邮件里,将其中所有的超链接都替换成部署在80端口的钓鱼页面的 url

所以,这里的 URL 填写我本地当前运行 gophish 主机的 IP 对应的 url,即http://192.168.141.1/

image

另外,需要保证的是该 URL 对于目标用户组的网络环境是可达的。例如填写内网 IP,则该钓鱼事件仅能够被内网目标用户所参与,而外网目标用户网络不可达。如果部署了 gophish 的是公网服务器,URL 填写公网 IP域名,则需要保证目标用户的内网环境能够访问该公网服务器的 IP(有些企业的内网环境会设定防火墙策略,限制内网用户能够访问的公网 IP)
Launch Date:
Launch Date 即钓鱼事件的实施日期,通常如果仅发送少量的邮箱,该项不需要修改。如果需要发送大量的邮箱,则配合旁边的Send Emails By效果更佳

image

(可选)Send Emails By:
Send Emails By 配合Launch Date使用,可以理解为当前钓鱼事件下所有钓鱼邮件发送完成的时间。Launch Date作为起始发件时间,Send Emails By 作为完成发件时间,而它们之间的时间将被所有邮件以分钟为单位平分

例如,Launch Date的值为2020.07.22,09:00Send Emails By的值为2020.07.22,09:04,该钓鱼事件需要发送50 封钓鱼邮件。
那么经过以上设定,从 9:00 到 9:04 共有 5 个发件点,这 5 个发件点被 50 封邮件平分,即每个发件点将发送 10 封,也就是每分钟仅发送 10 封

这样的好处在于,当需要发送大量的钓鱼邮件,而发件邮箱服务器并未限制每分钟的发件数,那么通过该设定可以限制钓鱼邮件不受约束的发出,从而防止因短时间大量邮件抵达目标邮箱而导致的垃圾邮件检测,甚至发件邮箱服务器 IP 被目标邮箱服务器封禁
Sending Profile:
Sending Profile 即发件策略,这里选择刚刚编辑好的名为XXXXX@qq.com的发件策略

image

Groups:
Groups 即接收钓鱼邮件的目标用户组,这里选择刚刚编辑好的名为目标 1 组的目标用户组

image

填写完以上字段,点击Launch Campaign后将会创建本次钓鱼事件(注意:如果未修改Launch Date,则默认在创建钓鱼事件后就立即开始发送钓鱼邮件)

image

Dashboard 仪表板

当创建了钓鱼事件后,Dashboard 会自动开始统计数据。统计的数据项包括邮件发送成功的数量及比率邮件被打开的数量及比率钓鱼链接被点击的数量及比率账密数据被提交的数量和比率以及收到电子邮件报告的数量和比率。另外,还有时间轴记录了每个行为发生的时间点

关于电子邮件报告,详情参考:
https://docs.getgophish.com/user-guide/documentation/email-reporting

image

需要注意的是,Dashboard 统计的是所有钓鱼事件的数据,而非单个钓鱼事件的数据,如果仅需要查看单个钓鱼事件的统计数据,可以在Campaigns中找到该钓鱼事件,点击View Results按钮查看

image

Results for 第一次钓鱼:

image

至此,一次在 gophish 发起的钓鱼事件所需实施步骤就已经全部完成,接下来就等着鱼儿上钩

查看捕获的数据

模拟目标用户的行为,打开上述发送的钓鱼邮件

image

点击超链接,跳转到部署好的钓鱼页面,发现与真实的 XX 大学邮箱登录界面无差别。(乱码问题以通过人工替换解决)观察网站的 URL,可以看到钓鱼邮件中的超链接指向的就是之前在新建Campaigns的表单中填写的URL,只不过后面多了一个rid 参数
这里的?rid=csF1qTj具有唯一性,即唯一指向打开的这封钓鱼邮件,换句话说csF1qTj是为这封邮件的收件人唯一分配的
如果此次名为第一次钓鱼的 Campaigns 选择的目标存在多个目标邮箱,则 gophish 会为每一封目标邮件分配一个唯一的 rid 值,以此来区别不同的收件人

image

输入用户名密码,test/test 并点击提交

image

点击提交后,部署的钓鱼页面重定向到了真实的 XX 大学邮箱系统页面,且添加上了出错参数errtype=1,使账号或密码错误的提示显示出来,达到迷惑受害用户的作用

image

在 gophish 中查看捕获的数据 依次点击 Campaigns - 选择第一次钓鱼的 View Results 按钮 - 展开 Details - 展开 Submitted Data
可以看到在钓鱼页面提交的账密信息

image

以上即 gophish 功能面板中所有功能的介绍,通过以上功能的学习和利用,已经可以实施较为基础的网络钓鱼了。而Sending Profiles 发件策略Landing Pages 钓鱼页面Email Templates 邮件模板Users & Groups 用户和组Campaigns 钓鱼事件Dashboard 仪表板的顺序也是在实际使用中需要按照的顺序,如果前一步不能配置好,将会影响到后续的功能达不到想要的效果。因此,严格遵循该步骤不说可以事半功倍,至少能避免在成为 “捕鱼人” 的道路上迷踪失路。

熟悉了上面的各项功能,虽然可以进行简单的钓鱼,但对于仿真度可信度要求较高的网络钓鱼还是不够的。但凡具有一定网络安全意识的人一般情况下都不会上钩,所以下面采用一个实际的案例来看看一个常规的钓鱼还需要额外做哪些工作。

事情是这样的,一天,客户要求对公司的人员进行一次为期 7 天的网络钓鱼,来提高员工的网络安全意识,避免在真正的 HW 行动中因为钓鱼而使系统被攻陷。所以,一场漫长的网络钓鱼就开始在偷偷被谋划准备中了 ···

因为涉及公司信息,故以文字和少量图片来叙述。主要是学习一些方式方法,并在实际需要中提供一些思路
本文提到的所有方式方法请在得到授权的前提下进行,并确保仅以提高员工安全意识为目的
再次提醒,一切未经授权的网络攻击均为违法行为,互联网非法外之地

前期准备

近似域名:
搜寻了一番,我们锁定了客户公司具有登录功能的门户网站,打算通过它来钓员工的 OA 门户账号密码。为了提高可信度,我们根据门户网站的域名abclmn.com申请了近似域名abcimn.com,因为 i 的大写 I,与门户网站的 l(L) 在某些字体下看起来是没有区别的,所以能够达到一定的仿真效果

搭建邮箱服务器:
有了近似域名后,我们将域名映射到服务器上。然后在服务器上利用postfix+dovecot搭建了邮箱服务,因为只需要发信,所以仅开启了SMTP服务。这样,我们就能够以xxx@abcI(i)mn.com为发件人来发邮件了,当然客户公司的邮箱系统账号是xxx@abcl(L)mn.com的形式,因此可以达到以假乱真的效果。

选择邮件主题:
经过一番信息收集,我们找到了一则通知是关于客户公司近期正在推广新的信息公示系统,并附上了信息公示系统的 URL(无需身份认证),所以可以利用这一点编辑一封主题是关于推广新信息公示系统的钓鱼邮件,诱导公司员工先通过我们的钓鱼页面登录 OA 门户,再通过重定向,定位到新的信息公示系统。这样,既能捕获到员工的 OA 账号密码,又能够有效降低可疑度,形成一个闭环

image

确定发件人:
准备的差不多后,客户发来了一份员工及部门的邮箱列表,通过筛选,结合公司情况,我们确定了一个技术部的邮箱,并伪造成 “技术部 <jishubu@abcI(i)mn.com>“ 来发送钓鱼邮件,保证了钓鱼邮件的权威性和可信度

配置 gophish

将门户页面、钓鱼邮件模板、目标用户邮箱导入到 gophisih 中保存,并在 Sending Profiles 配置好我们搭建的邮箱服务使其可以正常发件并不被丢进垃圾箱、过滤箱等。
配置完成后,创建钓鱼事件,因为发送量较大,需要设定Send Emails By 来限制每分钟的发信量,我们设定了10 封 / 分钟的速度来发送,避免被识别成垃圾邮件。
完成所有字段填写后启动钓鱼事件,就开始缓缓地发送钓鱼邮件了 ···

查看钓鱼结果

虽然上钩的只有46个用户,占发件数量的2%,但是在真实场景下,哪怕仅有1个真实用户上钩,对于系统来说就足够造成巨大的威胁,这也是为什么社会工程能够成为一项重要攻击手段的原因

image

自己动手搭建smtp邮箱服务器,内网向外网发送邮件

自己动手搭建smtp邮箱服务器,内网向外网发送邮件

本文转自 高老师 并作补充

(1).移除sendmail,并安装postfix

1
2
3
rpm -e sendmail 或者 yum remove sendmail

yum install postfix

(2).配置hostname为mail.nidey.com,可以自定义

1
2
3
vim /etc/hostname

mail.nidey.com

(3).配置hosts,ip就是本地的局域网ip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vim /etc/hosts

192.168.1.101 mail.nidey.com

## (4).配置postfix

```bash
vim /etc/postfix/main.cf

##基础配置
myhostname = mail.nidey.com
mydomain = nidey.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, $mydomain

##SMTP账户认证配置
smtpd_client_restrictions = permit_sasl_authenticated #指定可以向postfix发起SMTP连接的客户端的主机名或ip地址
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated #此处permit_sasl_authenticated意思是允许通过了sasl认证的所有用户
smtpd_sasl_auth_enable = yes #指定postfix使用sasl验证 通俗的将就是启用smtp并要求进行账号、密码校验
smtpd_sasl_security_options = noanonymous #取消smtp的匿名登录 此项默认值为noanonymous 此项请务必指定为noanonymous

(5).安装sasldb、saslauthd,用来创建smtp账户

1
yum -y install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain cyrus-sasl-devel

(6).编辑sasl2配置

1
2
3
4
5
6
32位  vim  /usr/lib/sasl2/smtpd.conf
64位 vim /etc/sasl2/smtpd.conf

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login CRAM-MD5 DIGEST-MD5

(7).创建smtp账号,自动让你输入密码

1
saslpasswd2 -c -u nidey.com 392223903

上面生成的邮箱账号:392223903@nidey.com

(8).其他命令

1
2
sasldblistusers2   查看所有用户
saslpasswd2 -d 392223903@nidey.com 删除用户

(9).重置文件权限,否则postfix读取不到

1
chmod 755 /etc/sasldb2

(10).重启postfix 软件

1
2
postfix stop
postfix start

然后就可以用smtp协议+25端口发出邮件了。

邮件伪造原理和实践

邮件伪造原理和实践

本文转自 yanq 并作补充

1. smtp协议

smtp(Simple Mail Transfer Protocol)是用来发送邮件的协议,属于应用层协议的一种。SMTP的连接和发送过程如下:

  1. 建立TCP连接
  2. 客户端发送HELO或者EHLO命令以标识发件人自己的身份,服务器返回250 OK或者更详细一点的信息。
  3. 然后客户端发送MAIL命令,表明发件人邮箱地址, 服务器端以OK作为响应,表明准备接收
  4. 客户端发送RCPT命令,表明接收人邮箱地址,可以有多个RCPT行,服务器端以OK作为响应,表示愿意为收件人接收邮件
  5. 协商结束,发送邮件,用命令DATA发送,服务端会返回邮件发送成功与否的情况。

下面我们用一个telnet来模仿使用qq邮箱客户端发送一封邮件到gmail邮箱的过程:

image

发送结果:

image

上述我们使用qq邮箱服务器发送了邮件给gmail邮箱服务器,其架构如下:

image

2. SPF介绍

上一节我们是使用qq邮箱服务器来发送邮件的,那么我们能够本地直接发送邮件给gmail服务器呢?答案是可以的,那我们能否在本地发送邮件时假装自己是xxx@qq.com呢?

这就涉及到了邮件伪造问题,我们可以发送邮件给目标邮件服务器,然后声称自己是xxx@qq.com,因为SMTP 协议本身也不要求对此声明做认证,这也就是钓鱼邮件的原理。

但是显然经过这么多年的发展,邮件服务器也不能什么都不管,什么都信任。

发件人策略框架(Sender Policy Framework)就是一套电子邮件认证机制,当你定义了你域名的SPF记录之后,邮件接收方的收件服务器在接受到邮件后,首先检查域名的SPF记录,来确定发件人的IP地址是否被包含在SPF记录里面,如果在,就认为是一封正确的邮件,否则会认为是一封伪造的邮件进行退回或丢弃处理。

image

比如我们直接向163邮箱服务器发送一个邮件,并且声称自己是hr@huawei.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 163mx03.mxmail.netease.com是163邮件服务器的mx记录ip
ubuntu@10-9-15-151:~$ telnet 163mx03.mxmail.netease.com 25
Trying 220.181.14.158...
Connected to 163mx03.mxmail.netease.com.
Escape character is '^]'.
220 163.com Anti-spam GT for Coremail System (163com[20141201])
ehlo antispam
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrZp-lKUCa0xDrUUUUj
250-STARTTLS
250-SIZE 73400320
250 8BITMIME
mail from:<hr@huawei.com>
550 MI:SPF 163 mx41,W8CowADH_BmJ+n1e3WJCCQ--.18274S2 1585314452 http://mail.163.com/help/help_spam_16.htm?ip=106.71.91.111&hostid=mx41&time=1585314452

可以看到当我们发送mail from:<hr@huawei.com>来声称邮件发送方时,163的邮箱服务器抛出了SPF错误,也就是说我们发送方的ip106.71.91.111不在huawei.com域名的SPF记录名单里面。

我们可以查一下huawei.com的spf记录

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
ubuntu@10-9-15-151:~$ nslookup -type=txt huawei.com
;; Truncated, retrying in TCP mode.
Server: 10.9.255.1
Address: 10.9.255.1#53

Non-authoritative answer:
huawei.com text = "fz9vxRtJpRFrw8&VLnW9Z4gUPdofN1DwkF516%&L9YXHev2&VuoPYaiKqkD@tf7&eI^Aryg5I8SWUR&MxzvhgCfK3*OjUnT%6&ghuawei20190518"
huawei.com text = "v=spf1 ip4:45.249.212.32 ip4:45.249.212.35 ip4:45.249.212.255 ip4:45.249.212.187/29 ip4:45.249.212.191 ip4:185.176.76.210 ip4:168.195.93.47 ip4:103.69.140.247 -all"
huawei.com text = "v=DMARC1;p=none;rua=mailto:dmarc@edm.huawei.com"
huawei.com text = "N3U/UqKcdI+8rthQEYTbph+m6MCg7+IW43PP5SuPxww="
huawei.com text = "MS=C4F6A693225CC6E058F6C9C39FD728C06C43E597"

Authoritative answers can be found from:
. nameserver = d.root-servers.net.
. nameserver = b.root-servers.net.
. nameserver = k.root-servers.net.
. nameserver = c.root-servers.net.
. nameserver = j.root-servers.net.
. nameserver = e.root-servers.net.
. nameserver = f.root-servers.net.
. nameserver = g.root-servers.net.
. nameserver = i.root-servers.net.
. nameserver = a.root-servers.net.
. nameserver = h.root-servers.net.
. nameserver = m.root-servers.net.
. nameserver = l.root-servers.net.

关注其中的

1
v=spf1 ip4:45.249.212.32 ip4:45.249.212.35 ip4:45.249.212.255 ip4:45.249.212.187/29 ip4:45.249.212.191 ip4:185.176.76.210 ip4:168.195.93.47 ip4:103.69.140.247 -all

这是一种常见的SPF写法,其中的-all表明在不匹配前面所列主机时,接收服务器需要将邮件全部拒绝

SPF 记录的匹配机制主要用于定义和指定可由该域名发送邮件的主机,其定义方式包括:

  • all 匹配任何主机,它写在SPF记录最后以匹配在其前面所列出的主机。
  • ip4 匹配IPv4地址或网络范围。
  • ip6 匹配IPv6地址或网络范围。
  • a 匹配主机名或域名。
  • mx 匹配域名的MX记录,当出站与入站邮件为同一服务器时通常采用此种机制。
  • ptr 通过DNS反向记录来匹配发件人IP和域名,由于会增加DNS负载,一般不采用此种机制。
  • exists 只检查域是否在DNS中存在。
  • include 将发件人IP和SPF记录指向另一个域,这种匹配机制通常用于云服务,如Exchange Online Protection。

SPF 记录的匹配机制会结合一些限定词来使用,以告诉服务器找到一条匹配记录时该怎么办。常见的限定词有:

  • +放行,如果没有明确指定限定词,则为默认值
  • –硬拒绝,直接拒绝来自未经授权主机的邮件
  • ~软拒绝,邮件可被接受,也可被标记为垃圾邮件
  • ?中性,不考虑邮件是否被接受

3. DKIM与DMARC

域名密钥识别邮件(DomainKeys Identified Mail,DKIM)是一套电子邮件认证机制,使用公开密钥加密邮件,以检测邮件是否是伪造或被篡改。通常发送方会在电子邮件的标头插入DKIM-Signature及电子签名, 而接收方则透过DNS查询得到公钥后进行验证.

DMARC建立在发件人策略框架 (SPF)和域名识别邮件 (DKIM)协议之上。如果这两种身份验证方法都不通过,DMARC 策略将决定如何处理该消息。DMARC要求域名所有者在DNS记录中设置SPF记录和DKIM记录,并明确声明对验证失败邮件的处理策略。

以上两种机制也是现有的电子邮件安全机制,不过以SPF策略为主。

4. 邮件伪造

4.1 Swaks

Swaks(Swiss Army Knife for SMTP,SMTP瑞士军刀),多功能的SMTP协议测试工具,利用Swaks可以很方便的发送伪造邮件。

常用Swaks指令

1
2
3
4
--ehlo [helo-string]:伪造ehlo头信息
--header [header-and-data]:伪造From、Subject、Message-Id、X-Mailer等头信息
--data [data-portion]:伪造DATA的全部内容,可直接将邮件源码作为选项
--attach [attachment-specification]:添加附件

具体介绍就不多介绍了,可以看官方主页

这里来个示例:

1
swaks --to test@163.com --from test@gmail.com --body 'This is a test mailing' --header 'Subject: test' --ehlo gmail.com --header-X-Mailer gmail.com

4.2 SPF记录未设置或者设置不当

当一个域名未设置SPF记录或者设置不当时,就存在邮件伪造漏洞风险。可以通过以下方式探测域名是否存在SPF记录:

1
nslookup -type=txt xxx.com.cn
  • 未设置(比如我自己的域名)

    1
    2
    3
    4
    5
    6
    root@Test-WEB1-yanq:~# nslookup -type=txt saucer-man.com
    Server: 10.40.59.251
    Address: 10.40.59.251#53

    Non-authoritative answer:
    *** Can't find saucer-man.com: No answer
  • 设置不当

比如下面的域名,SPF记录设置成~all,未匹配到的邮件可被接受,也可被标记为垃圾邮件。

1
2
3
4
5
6
ubuntu@10-9-15-151:~$ nslookup -q=txt xxx.com
Server: 10.9.255.1
Address: 10.9.255.1#53

Non-authoritative answer:
xxx.com text = "v=spf1 ip4:36.7.172.15 ip4:220.248.245.131 ip4:111.39.232.6 ip4:36.7.172.14 ~all"

经过测试,当接收邮箱系统验证SPF时出现上述情况时,不同邮箱系统的反应如下:

  • qq邮箱不接受
  • outlook邮箱接收
  • gmail邮箱标记为垃圾邮件
  • 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
29
30
31
32
root@Test:~# swaks --to yixianosaurusphaaaga7096@gmail.com --from admin@saucer-man.com --body 'This is a test mailing' --header 'Subject: test mail' --ehlo saucer-man.com --header-X-Mailer saucer-man.com
=== Trying gmail-smtp-in.l.google.com:25...
=== Connected to gmail-smtp-in.l.google.com.
<- 220 mx.google.com ESMTP m6si9771129pld.54 - gsmtp
-> EHLO saucer-man.com
<- 250-mx.google.com at your service, [103.59.50.2]
<- 250-SIZE 157286400
<- 250-8BITMIME
<- 250-STARTTLS
<- 250-ENHANCEDSTATUSCODES
<- 250-PIPELINING
<- 250-CHUNKING
<- 250 SMTPUTF8
-> MAIL FROM:<admin@saucer-man.com>
<- 250 2.1.0 OK m6si9771129pld.54 - gsmtp
-> RCPT TO:<yixianosaurusphaaaga7096@gmail.com>
<- 250 2.1.5 OK m6si9771129pld.54 - gsmtp
-> DATA
<- 354 Go ahead m6si9771129pld.54 - gsmtp
-> Date: Mon, 30 Mar 2020 15:32:58 +0800
-> To: yixianosaurusphaaaga7096@gmail.com
-> From: admin@saucer-man.com
-> Subject: test mail
-> X-Mailer: saucer-man.com
->
-> This is a test mailing
->
-> .
<- 250 2.0.0 OK 1585553581 m6si9771129pld.54 - gsmtp
-> QUIT
<- 221 2.0.0 closing connection m6si9771129pld.54 - gsmtp
=== Connection closed with remote host.

接收到的信息:

image

原始数据:

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
29
30
31
32
33
34
35
36
37
Delivered-To: yixianosaurusphangnga7096@gmail.com
Received: by 2002:a4f:f31a:0:0:0:0:0 with SMTP id c26csp2268818ivo;
Mon, 30 Mar 2020 00:33:01 -0700 (PDT)
X-Google-Smtp-Source: APiQypJvIKWdfG+6JpupjdqrYQfiXBeg7CPCrQ/ME+6eM+jUzhd19nOOsyGO1oi2FzXc892BL1EW
X-Received: by 2002:a63:6d0b:: with SMTP id i11mr2776601pgc.404.1585553581825;
Mon, 30 Mar 2020 00:33:01 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1585553581; cv=none;
d=google.com; s=arc-20160816;
b=YbBzqga5isSYWhaqAsRdWg/lzDH0S92InVplzXxAmGXkCqxdt7C3t9mOFLwZpEkpqi
QW4Y2I4+vAIpbiMi2MqUyLL7tU2Cq/jNlaO6VX+r0Gu1nx8ZxTpUR
b9yqaZaq6tcg48EWzGfuOT3uBs2aVp9W8Upf0MeSxPLVbpgEnzqMRjqlIhZaXAIe9kR1xg4V4IObPilZfBb4uYY0ayLTDcDDMXTc
GyjA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
h=subject:from:to:date:message-id;
bh=ecGWgWCJeWxJFeM0urOVWP+KOlqqvsQYKOpYUP8nk7I=;
b=ZHdmyDNpyMR/DCfW1heAmecEtINi+fb5Myr8+sjj1meh6oH0VhTZzvOCTylrp/WXlu
kGgDW2zzC95QeKAFF3ZbXClFoDVgEGECg2mTmQ2QUXB74qi5EDtu+X4izzxqjBZ+
m97oeNIBQoka40rvItwK8foHNSo3l6k55cpTvJ6+c1SvOz/eW5f0Im7dFpX3ELrioNMK
Kuvw==
ARC-Authentication-Results: i=1; mx.google.com;
spf=temperror (google.com: error in processing during lookup of admin@saucer-man.com: DNS error) smtp.mailfrom=admin@saucer-man.com
Return-Path: <admin@saucer-man.com>
Received: from saucer-man.com ([003.11.50.2])
by mx.google.com with ESMTP id m6si9771129pld.54.2020.03.30.00.33.01
for <yixianosaurusphaaaga7096@gmail.com>;
Mon, 30 Mar 2020 00:33:01 -0700 (PDT)
Received-SPF: temperror (google.com: error in processing during lookup of admin@saucer-man.com: DNS error) client-ip=003.11.50.2;
Authentication-Results: mx.google.com;
spf=temperror (google.com: error in processing during lookup of admin@saucer-man.com: DNS error) smtp.mailfrom=admin@saucer-man.com
Message-ID: <5e81a0ad.1c69fb81.18eb2.4993SMTPIN_ADDED_MISSING@mx.google.com>
Date: Mon, 30 Mar 2020 15:32:58 +0800
To: yixianosaurusphaaaga7096@gmail.com
From: admin@saucer-man.com
Subject: test mail
X-Mailer: saucer-man.com

This is a test mailing

可以看出没有SPF记录,所以SPF验证失败,虽然也接收了,但是放进了垃圾邮箱。

4.3 利用邮件托管平台绕过SPF记录

当大部分公司SPF都设置的没问题,我们就需要想其他办法了。

我们需要借助到邮件托管平台来绕过SPF监测:

  • smtp2go(速度慢但免费发送量大,需要自己有域名)
  • SendCloud(速度快但免费发送量少)
  • 也可以自己搭建邮件服务器

这里我们使用smtp2go,注册账户并登录,smtp2go中需要存在有效SMTP Users和Domains才能正常投递邮件。

Add SMTP Users:

image

Add Domains,新建Domain需要一个域名并按照引导完成CNAME绑定:

image

然后利用swaks发送邮件:

1
swaks --to xxx@qq.com --from hr@huawei.com --header 'Subject: test main' --ehlo gmail.com --body 'hello, I am blut' --server mail.smtp2go.com -p 2525 -au <username> -ap <password> --header-X-Mailer gmail.com

image

但是邮箱显示出由 bT.8bpq490=utd2ksqiq7h24d=th2qtu@return.smtpservice.net 代发。

image

经过测试,各大邮箱的反应如下:

  • qq邮箱,正常接收,显示代发
  • gmail邮箱,正常接收,显示代发
  • 163邮箱,正常接收,显示代发
  • outlook邮箱,正常接收,不显示代发

为什么会显示代发

查看原始邮件会发现存在smtp.from以及From字段。smtp.from代表的就是真正发件人,收件服务器会去其代表的域下进行SPF记录校验,From字段是我们自定义的邮件Header字段,如果当两者不一致时,邮件服务商可能会在客户端显示代发,用来提示收件人邮件伪造攻击风险。

我们使用托管邮箱平台发送邮件时,邮件托管平台的域名会被作为smtp.from值,所以SPF记录校验是PASS的。

image

5. 总结

上述说了伪造邮件的方式。

  • 如果SPF记录未设置 直接用swaks伪造即可
  • 如果存在SPF记录,则利用第三方邮件托管平台伪造,但是一般会显示由xxx代发

一般情况下我们可以使用如下的流程去发送:

  1. 自己用邮箱编辑好钓鱼邮件,可以包含附件等再发送,然后导出为eml文件:

image

  1. 编辑eml文件,删除from值和之前的无关紧要的信息,及更改收件人昵称

image

  1. 使用如下命令发送。
1
swaks --to xxx@qq.com --from hr@huawei.com --data aaa.eml --server mail.smtp2go.com -p 2525 -au <username> -ap <password>

邮件伪造作为 APT 攻击的常见入口方式,是我在第一份工作时就进行的实现,当时是全自动化的评估企业邮箱的安全性吧,当时某易和某企鹅的产品都多少存在问题,无法识别全部的 POC,当时用到的工具就有 Swaks

直到24年做安全演练,想想做钓鱼邮件吧,就才把邮件伪造的相关资料翻出来,结果发现自己竟然没写过相关的博文,在此补上,和后续的自建smtp服务器、gophish实践一起,算作纪念

参考

Dealing w/ Gobuster “WildCard” and “Status Code” Errors

Dealing w/ Gobuster “WildCard” and “Status Code” Errors

本文转自Harley并作补充

Have you ever encountered the following error within Gobuster?

Error: the server returns a status code that matches the provided options for non existing urls. http://ipaddress/9b9353c0-3de2-4df5-abd7-0f618e4d70ab => 200. To force processing of Wildcard responses, specify the ‘–wildcard’ switch

Likely, the webserver you’re attacking is configured to always respond with a 200 response code. For example, let’s look at BART on Hack The Box.

image

Let’s see if we can extract anything with Curl. We’ll start by sending a request out to the default page. We see that it returns a 302 redirect to forum.bart.htb.

1
curl -vvv 10.10.10.81

image

Let’s try a request to a page we know doesn’t exist, and we are returned a success 200 message that displays an image. This explains why Gobuster was returning a 200 message on each directory.

image

We can confirm this by browsing to the page and looking at the image.

image

Armed with this information, we know that 200 response codes are bad, but other response codes (such as a 302) indicate a directory is present. Let’s rerun our Gobuster command, but we’ll specify which response codes we want returned.

Checking the help page, we can see that Gobuster accepts the following response codes; “200,204,301,302,307,401,403”.

image

So our command will look like this.

1
gobuster dir -u http://10.10.10.81 -w /usr/share/dirbuster/wordlists/directory-list-lowercase-2.3-medium.txt -s "204,301,302,307,401,403"

And with that command running, we eventually start to get some real results back.

image

Apache ShenYu Admin 身份验证绕过漏洞(CVE-2021-37580)漏洞复现及POC脚本编写

Apache ShenYu Admin 身份验证绕过漏洞(CVE-2021-37580)漏洞复现及POC脚本编写

本文转自rabbitsafe并作补充

Apache ShenYu Admin爆出身份验证绕过漏洞,攻击者可通过该漏洞绕过JSON Web Token (JWT)安全认证,直接进入系统后台。 Apache ShenYu 是应用于所有微服务场景的,可扩展、高性能、响应式的 API 网关解决方案。

Apache ShenYu Admin 存在身份验证绕过漏洞。 ShenyuAdminBootstrap 中 JWT 的错误使用允许攻击者绕过身份验证,攻击者可通过该漏洞直接进入系统后台。

CVE 编号 CVE-2021-37580

影响版本: Apache ShenYu 2.3.0 Apache ShenYu 2.4.0

漏洞复现:

该漏洞主要是接口文件dashboardUser未设置访问权限,攻击者可以直接访问该文件获取管理员帐号和口令

通过FOFA查找使用Apache ShenYu系统

fofa:fid=”uPGDN6V9UWnc+KJdy5wdkQ==”

通过BurpSuite发送数据包,GET /dashboardUser

还需要生成jwt,将生成的jwt数据带入head,发送数据包

image

通过返回数据包,可获取管理员帐号和口令,登录系统后台。

通过pocsuite3下的POC扫描脚本CVE-2021-37580.py验证漏洞。

image

脚本研发过程也非常简单,主要是发送GET数据包到/dashboardUser,通过返回数据包进行判断是否存在漏洞。

关键代码贴出来:

generateToken()主要是生成jwt,将生成的jwt数据带入head

image

check(url)主要是验证漏洞函数

image

check(url)验证漏洞函数返回2个值,一个是状态,一个是漏洞结果,存在漏洞返回真和漏洞结果。

image

利用pocsuite3下的POC扫描脚本CVE-2021-37580.py

image

通过fofaviewer导出fofa结果,保存url到url.txt中,可批量验证漏洞

python3 cli.py -r CVE-2021-37580.py -f url.txt –threads 10

可以发现大量存在漏洞的系统。

POC代码:https://github.com/rabbitsafe/CVE-2021-37580

Mac 解决kill无法强制杀死后台程序的问题

Mac 解决kill无法强制杀死后台程序的问题

本文转自三也视界并作补充

有些软件卸载之后,后台程序仍然在运行,使用kill都无法关闭

1
ps -ef|grep corplink |grep -v grep

image

可以看到这个程序,有多个进程互相保护唤醒,无法彻底杀死。可以打开mac自带的活动监视器,搜索并强制退出带有corplink的服务,发现关闭一个又启动了另一个。

尝试 ps -ef | grep 'corplink' | awk '{print $2}' | xargs kill -9 一次性全部杀死

1
2
3
4
5
kill: 6558: Operation not permitted
kill: 6586: Operation not permitted
kill: 6589: Operation not permitted
kill: 6590: Operation not permitted
kill: 7500: No such process

发现Operation not permitted,网上搜索了一下,大多数方案都是如下

mac系统下的Rootless机制,让我们在root权限下也不能随心所欲的读写所有路径了,特殊情况下我们需要关闭Rootless时,可尝试如下操作:

1
2
3
4
5
6
1. 重启按住 Command+R,进入恢复模式,打开Terminal。 
2. 键入命令 csrutil disable
3. reboot
Rootless机制是对抗恶意程序的最后防线,除非特殊需要时我们才将其关闭,否则保持开启状态

csrutil enable

太麻烦了,尝试其他解决办法。加sudo kill应该不会有权限问题

1
ps -ef | grep 'corplink' | awk '{print $2}' | xargs sudo kill -9 

虽然杀死了,但是还会重启新的进程,该方法无效,这简直就是流氓软件,病毒式的存在

image

1
ps -ef|grep corplink

我们发现,该服务的文件都在 /usr/local/corplink/ ,那么强制删除文件试试,记得加sudo,否则会报权限问题

1
sudo rm -rf /usr/local/corplink/

image

然后打开 mac自带的活动监视器,关闭corplink的进程,发现不会启动了,成功删除

win11系统第一次开机跳过联网的办法(3种方法)

win11系统第一次开机跳过联网的办法(3种方法)

本文转自jaray 并作补充

预装Win11家庭中文版由于微限制必须要联网激活,需要使用微软账户登入才可以继续开机过程,联网后系统会自动激活。

  新电脑,安装以后,会要求激活,我打电话问了厂家,居然告诉我,让我用新电脑连手机,使用手机的热点,去激活电脑。在没有网络的情况下,现在连电脑都无法激活,厂家这么说,我不知道是他们不愿意说,还是真的不知道,我是无法相信这种说法,我在网上搜了很多方法,带图的,结束“调出任务管理器找到 Network Connection Flow进程”,这种方法是不行的,根本没有这个进程。

  还有一种方法是:打开任务管理器,这个打开方法下面有,简单看完各个硬件参数,这个方法也扯了。

  由于很多厂家基本都是联网后就不符合无理由退货的条件了,所以我整理了以下的几种跳过联网的办法,可以参考。

一、win11初次开机跳过联网激活方法1

1、按下Shift+F10或者是Fn+Shift+F10快捷键调出命令提示符窗口;

2、输入taskmgr,并按下回车键;

3、接着就会出现任务管理器页面,我们点击“详细信息”;

4、找到“Network Connection Flow”进程或者是“网络连接流”进程,点击“结束任务”;

5、这样就可以跳过联网;

6、这种方法就是上面我提到过的方法,我这台电脑也不行。

二、win11初次开机跳过联网激活方法2

1、首次进入Windows11家庭版系统并进行设置,到联网界面,按下【Shift+F10】快捷键(无效可试下【FN+Shfit+F10】)

2、在出现的命令提示符页面输入OOBE\BYPASSNRO,按回车键,等待电脑重启完成

3、重启后,在联网界面会有“我没有Internet连接”选项,点击此选项即可跳过联网

三、通过修改注册表跳过联网界面3

1、按Shift键+F10键(不成功按Fn+Shift+F10);

2、弹出命令提示符窗口,输入regedit回;

3、然后在打开的注册表编辑器界面中,找到下方路径——计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE

4、接下来在注册表的右侧空白处鼠标右键,在弹出的右键菜单项中,新建一个DWORD(32位)值(D)。新建的值重命名为: BypassNRO,双击打开BypassNRO这个值,然后在编辑DWORD(32位)值窗口,将数值数据修改为【1】,再点击【确定】;

5、最后在cmd窗口再输入命令:logoff,回车;

6、可以跳过联网。

end.

sourcemap文件泄露漏洞

sourcemap文件泄露漏洞

本文转自小心灵呀 并作补充

最近进行渗透测试时,时常遇到xray扫出sourcemap文件,每次扫到都要百度,因此做个笔记。

漏洞原理

在日常测试时,经常会遇到以js.map为后缀的文件
这是jQuery中的一个新功能,支持Source Map
非常多Webpack打包的站点都会存在js.map文件.
通过sourcemap可还原前端代码找到API,间接性获取未授权访问漏洞

什么是Source map
简单说,Source map就是一个信息文件,里面储存着位置信息。转换后的代码的每一个位置,所对应的转换前的位置。
有了它,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码,这无疑给开发者带来了很大方便。

漏洞复现

使用xray扫到 dirscan/sourcemap/default 漏洞。

image

直接访问链接可下在sourcemap文件,利用该文件还原源代码需使用reverse-sourcemap工具。
先安装:nodejs,
下载地址:https://nodejs.org/zh-cn/download/
选择适合自己操作系统的版本:

image

双击下载后的文件,一路点击 next即可成功安装

image

安装完nodejs后,控制台输入:

1
npm -v

即可查看安装的版本。

image

然后安装 reverse-sourcemap

1
npm install --global reverse-sourcemap

安装完成(PS:我电脑中已经有reverse-sourcemap,所以大家如果为初次安装看到信息可能跟我不一样)。

image

安装完成后,将其加入环境变量

image

检查是否安装成功:

1
reverse-sourcemap -h

安装成功

image

还原map文件

1
reverse-sourcemap -v ****.js.map -o output

map文件会还原到 output文件

同时还可以通过浏览器,开发者模式-source模块查看前端源代码

image

漏洞修复

临时的解决方法就是删除代码目录下的.map文件;
永久的解决方法就是在build的时候禁用产生map文件的功能;
在scripts/build下的build.js 文件中添加如下配置:
process.env.GENERATE_SOURCEMAP = ‘false’;
重新build就不会再产生sourcemap文件了

参考资料

如何还原前端代码

SonarQube-破解

SonarQube-破解

本文转自ny0c 并作补充

新版SonarQube破解

软件版本: sonarqube-9.8.0.63668
Java版本: jdk11
Agent版本: 1.2

帖子上有人求新版破解,花了点时间搞定了通杀的,已经测试过8.9.8 LTS跟9.8.0最新版(笔者注:事实上10.x的版本也可以进行破解)

使用说明

1、把下列信息全部复制,然后base64加密后的内容就是license,注意要包括换行

1
2
3
4
5
6
7
8
9
10
11
Company=Unknown
Digest=NotRequired
Edition=Enterprise
EditionLabel=Enterprise
Expiration=2099-01-01
MaxLoc=9223372036854775806
Plugins=abap,cpp,plsql,security,sonarapex,swift,tsql,vbnet,cobol,pli,rpg,vb
Features=*
ServerId=*
Support=false
Type=ny0c

image

2、修改SonarQube启动参数
解压从官方下载压缩包,根据自身需求配置好数据库链接
然后修改sonarqube-版本号/conf/sonar.properties的内容
其中

1
#sonar.web.javaOpts=-Xmx1G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

改成

1
sonar.web.javaOpts=-javaagent:/你的agent目录/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx1G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

以及

1
#sonar.ce.javaOpts=-Xmx2G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

改成

1
sonar.ce.javaOpts=-javaagent:/你的agent目录/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx2G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

3、启动sonarqube
根据官方文档设置好sonarqube后,直接sonar.sh console启动控制台模式,看到app[][o.s.a.SchedulerImpl] Process[web] is up后,sonarqube启动成功

4、设置license
浏览器打开 http://sonarqube-IP地址:sonarqube-端口/ 设置或者登录sonarqube,然后点击最顶上的Administration选项卡,然后点击下面的Configuration,选择License Manager,接着设置License即可

image

旧帖

SonarQube其实很早之前就被我刀了,一直没有机会放出来,理论上能干整个 8.9.x LTS,具体版本是enterprise.

说实在的,看雪真是好地方啊,今天burp破解秒审核通过,那这个我也发了把,具体思路不大记得了,反正也是挺痛苦的过程,等我有时间再补把.

原版 SonarQube Enterprise Edition 8.9.8 LTS下载地址

用法很简单,直接加个javaagent到sonarqube-xxxx/conf/sonar.properties里面,注意web跟ce两个地方都要加

License编码方式
请保留换行,然后整体base64即可

补个图把

image

image

老规矩,不混淆,不加密,有兴趣的自己拆来看.

上传的附件

SonarQubeAgent-1.1-SNAPSHOT.jar

SonarQubeAgent-1.2-SNAPSHOT.jar

SonarQubeAgent-1.2-src.zip

安卓逆向 - Frida Hook(抓包实践)

安卓逆向 - 基础入门教程

本文转自小馒头yy 并作补充

一、引言

上篇文章:安卓逆向 - 基础入门教程_小馒头yy的博客-CSDN博客 介绍了Frida的安装、基本使用,今天我们来看看Frida常用Hook和基于Frida抓包实践。

二、Frida常用 Hook脚本

1、hook java.net.URL

1
2
3
4
5
6
7
8
function hook1() {
var URL = Java.use('java.net.URL');
URL.$init.overload('java.lang.String').implementation = function (a) {
console.log('加密前:' + a)
showStacks()
this.$init(a)
}
}

2、hook okhttp3 HttpUrl

1
2
3
4
5
6
7
8
9
10
function hookOkhttp3() {
var Builder = Java.use('okhttp3.Request$Builder');
Builder.url.overload('okhttp3.HttpUrl').implementation = function (a) {
console.log('a: ' + a)
var res = this.url(a);
showStacks()
console.log("res: " + res)
return res;
}
}

3、hook okhttp3 addHeader

1
2
3
4
5
6
7
8
9
10
11
function hook() {
var Builder = Java.use("okhttp3.Request$Builder");
Builder["addHeader"].implementation = function (str, str2) {
console.log("key: " + str)
console.log("val: " + str2)
showStacks()
var result = this["addHeader"](str, str2);
console.log("result: " + result);
return result;
};
}

4、打印堆栈

1
2
3
4
5
function showStacks() {
Java.perform(function () {
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
});
}

5、hook Base64

1
2
3
4
5
6
7
8
9
function hookBase() {
// Base64
var Base64Class = Java.use("android.util.Base64");
Base64Class.encodeToString.overload("[B", "int").implementation = function (a, b) {
var rc = this.encodeToString(a, b);
console.log(">>> Base64 " + rc);
return rc;
}
}

6、hook HashMap

1
2
3
4
5
6
7
8
function hookMap() {
var Build = Java.use("java.util.HashMap");
Build["put"].implementation = function (key, val) {
console.log("key : " + key)
console.log("val : " + val)
return this.put(key, val)
}
}

三、某麦网抓包实践

本篇以某麦网帖子详情接口,演示如何基于Frida hook抓包

1、安装某麦网8...apk

2、搭建Frida hook 环境,注入 hook java.net.URL脚本

3、点进帖子详情打印出如下堆栈,我们可以根据打印出的信息,跟栈分析该接口的请求头。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
https://acs.m.taobao.com/gw/mtop.damai.wireless.discovery.detail.get/1.4/?source=10101&version=6000168&type=originaljson&data=%7B%22contentId%22%3A%2211088650%22%2C%22appType%22%3A%221%22%2C%22source%22%3A%2210101%22%2C%22osType%22%3A%222%22%2C%22pageSize%22%3A%2230%22%2C%22pageIndex%22%3A%221%22%2C%22version%22%3A%226000168%22%2C%22channel_from%22%3A%22damai_market%22%7D&appType=1&osType=2&channel_from=damai_market
java.lang.Exception
at java.net.URL.<init>(Native Method)
at tb.yy0.m(Taobao:1)
at anet.channel.request.a.p(Taobao:2)
at anet.channel.session.TnetSpdySession.w(Taobao:18)
at anetwork.channel.unified.NetworkTask.sendRequest(Taobao:6)
at anetwork.channel.unified.NetworkTask.run(Taobao:44)
at anetwork.channel.unified.UnifiedRequestTask$a.proceed(Taobao:15)
at com.taobao.orange.sync.NetworkInterceptor.intercept(Taobao:30)
at anetwork.channel.unified.UnifiedRequestTask$a.proceed(Taobao:7)
at anetwork.channel.unified.UnifiedRequestTask$3.run(Taobao:2)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)

4、使用Jadx打开某麦网apk

从at tb.yy0.m(Taobao:1)跟栈分析

image

根据调用栈往上走,定位到如下位置,注意这行代码:

1
ALog.f("awcn.TnetSpdySession", "", aVar.n(), "request headers", aVar.g());

image

代码注释很清楚了 request headers,我们跟进 hook aVar.g() 这个方法

1
2
3
public Map<String, String> g() {
return Collections.unmodifiableMap(this.f);
}

hook之,对象输出可以使用 JSONObject转一下

1
var JSONObject = Java.use("com.alibaba.fastjson.JSONObject");
1
2
3
4
5
6
7
8
9
function hook6() {
var JSONObject = Java.use("com.alibaba.fastjson.JSONObject");
var a = Java.use("anet.channel.request.a");
a["g"].implementation = function () {
var result = this["g"]();
console.log("result : " + JSONObject.toJSON(result).toString());
return result;
};
}

打印出如下内容:

image

请求 URL、 请求方法这边都写得很清楚啦。

image

收工!