回归最本质的信息安全

如何将Kali Linux秒变成一个能够拦截网络流量的代理路由器

2017年9月11日发布

35,863
0
1

导语:本文,我会假设你拥有一个以太局域网USB适配器和一个无线B/G/N USB适配器,Linux支持的任何卡片(USB或内置的)都可以使用。

timg.jpg

前言

这个存储库包含将Kali Linux设备转换成路由器的代码。Kali Linux变成路由器后可以实现两个功能:

1.记录所有与wireshark的流量,Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。

2. 将HTTP和HTTPS流量发送至一个拦截代理,例如BurpSuite等,使其能在另一台设备上运行。

本文,我会假设你拥有一个以太局域网USB适配器和一个无线B/G/N USB适配器,Linux支持的任何卡片(USB或内置的)都可以使用。

经常从事网络安全分析的人往往会从嵌入式设备、移动应用程序或windows应用程序中嗅探或拦截流量。对于具有代理意识的设备或应用程序,拦截流量是很简单的:通过配置应用程序或设备来使用代理,例如BurpSuite。对于非代理的设备或应用程序,拦截流量更具挑战性。

在本文中,我将描述了如何设置Kali Linux来嗅探TCP/UDP传输的任何设备、应用程序或应用程序,通过将Kali配置为一个拦截路由器,可以将特定的流量转发到另一台设备上的透明代理,例如将HTTP(S)流量转发到BurpSuite。拦截路由器包括许多复杂的场景,其中许多设备和应用程序会出现彼此交互的情况,例如与web服务交互的嵌入式设备,但也可以通过移动设备和windows应用程序进行配置。为了使实用性最大化,我会在Raspberry Pi上实现上面描述的设置。

安装

我会将Kali Linux配置为具有代理类型的路由器,连接到这台路由器的客户端(例如嵌入式设备和手机App)都可以正常进行网络通信,但是有些数据包(例如HTTP和HTTPS包)会被我的Kali Linux设备拦截并被重定向到代理服务器(例如BurpSuite)。所有通过我的路由器的流量都是用Wireshark监控的。我的Kali Linux设备和BurpSuite都是以透明代理的形式运行的,因为客户根本不知道代理的存在。这种设置的主要优点是它将客户端的配置降低到最小值,具体设置如下图所示。

1.png

在配置我的Kali Linux设备之前,我需要配置VMWare和我的网络接口,步骤如下:

1. 在VMWare中运行Kali Linux,并将网络改为桥接模式,这样可以让Kali Linux直接链接到网络之中,而被监控的设备(应用程序或手机)同样可以正常连接至网络。

2.png

2.我会连接两个适配器(以太网和WiFi),并给Kali提供USB连接。如下图所示,我的适配器是Ethernet LAN Network Adapter ASIX AX88179和Atheros UB91C USB无线适配器。对于WiFi,我可以使用任何兼容Linux的适配器,只要它支持混杂模式(Promiscuous mode)即可。

译者注:混杂模式(Promiscuous mode)就是将网卡接收到所有的数据全部发送给系统。

3.png

下面,我会详细阐述如何将Kali Linux设备配置为路由器,以及如何通过将其连接到Kali Linux路由器来监控设备和应用程序。

将Kali Linux配置为路由器

我的Kali Linux设备将通过USB网络接口(以太网和WiFi)连接到自己的网络连接,反之亦然。创建路由器的四个步骤:

1.设置以太网层,使有线客户端可以连接到Kali的接口。

2.设置wi – fi数据链路层,这样无线客户端可以连接到Kali的“软件访问点(software access point)”,并从Kali发送或接收IP数据包。我使用了hostapd应用来完成这个任务。通过桥连接接口的访问点,设备就连接到同一网络。这样我就可以通过以太网连接一个移动应用和一个Windows应用程序,监控嵌入式设备。

3.在我的Kali Linux设备上设置网络配置,这样它就可以正确地将IP数据包从它自己的网络连接转发到它的连接客户端。

4.添加诸如DNS和DHCP这样的网络服务,这样客户就可以分配IP地址,并且可以解析域名。我可以使用DNS网络服务将任何域名重定向到我控制下的设备。

要注意的是,在执行上述步骤之前,我需要找出适配器出现的接口。为此,我会使用命令ifconfig查看插入USB适配器之前和之后的设备状态。

$ ifconfig -a

我的以太网适配器通常会显示为eth1,而我的WiFi适配器通常会显示为wlan0。(eth0是由VMWare配置的接口,可以让Kali访问网络)。

5.png

现在需要配置network-manager服务,告诉该服务我会将适配器的MAC地址添加到/etc/NetworkManager/NetworkManager.conf文件的unmanaged-devices参数之中,并接管已添加的接口。

[keyfile]
unmanaged-devices=mac:d8:eb:97:b6:ce:12;mac:56:6b:a2:90:c4:b9

重新启动网络服务,使设备进入“无管理”状态。

$ /etc/init.d/networking restart

以太网配置

在创建我的监控网络之前,我选择一个合适的网络地址和子网掩码。选择一个与Kali所在网络IP范围(eth0)不同的地址空间,以此来确保受监控设备的IP地址不会跟我们的监控网络发生冲突。在我的配置环境中,我选择的是172.16.0.0/12。因为我的主网络接口(eth0)通常只接10.0.0.0/8(公司的)或192.168.0 / 16(家庭的)网络地址。

由于我需要让无线网和有线网处于同一地址空间中,所以我会选择使用bridge-utils工具在这两者之间桥接。

$ apt-get install bridge-utils

然后我删除分配给我的有线接口eth1的任何IP地址。

$ ip addr flush dev eth1

我创建了一个名为br0的桥接接口。

$ brctl addbr br0

我将有线接口eth1添加到桥接口br0。

$ brctl addif br0 eth1

接下来,开启桥接接口br0。

$ ip link set dev br0 up

根据我选择的IP地址空间,给这个br0接口分配一个IP地址。因为它的功能是作为被监控设备的网关,所以我们选择172.16.0.1。

$ ip addr add 172.16.0.1/12 dev br0

无线数据链路层

在配置了以太网接口后,我通过hostapd程序创建了一个无线接入点。在此,我首先安装apt-get。

$ apt-get install hostapd

然后使用下列信息创建配置文件hostapd.conf。

# create a wireless network with this interface; change it if your wireless card is not wlan0
interface=wlan0
# change this if a different bridge interface was chosen
bridge=br0
# the name of our wireless network
ssid=Monitor-Network
# Change the passphrase to something you like
wpa_passphrase=Monitor-Network
# the driver used
driver=nl80211
auth_algs=3
# the wireless channel we listen on.
channel=7
driver=nl80211
# the mode we use (g)
hw_mode=g
# we don't log
logger_stdout=-1
logger_stdout_level=2
max_num_sta=5
rsn_pairwise=CCMP
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP

第一行是我的无线局域网将创建的接口,即插在无线适配器wlan0上。我会配置网络的名称(ssid)及其密码(wpa_passphrase)。稍后我将在连接设备时使用它。nl80211驱动程序是用于Atheros芯片组,当我希望以太网和无线USB适配器出现在同一网络时,我会将它们添加到同一桥接接口(br0)中。我的网络是一个g无线网络(hw_mode),因为它与我想要监控的大多数设备兼容。所有其他参数都与WPA和日志的配置有关。更多信息,请参考hostapd Linux文档https://wireless.wiki.kernel.org/en/users/Documentation/hostapd。

由于nl80211驱动程序存在一些漏洞,我会执行以下命令来让脚本使用wlan接口。

$ nmcli radio wifi off
$ rfkill unblock wlan

在创建无线接口wlan0之后,我将其启动。

$ ip link set dev wlan0 up

接下来,让hostapd程序开启监控网络。

$ hostapd ./hostapd.conf -B

网络配置

在配置了无线和有线接口之后,我将Kali配置为将流量转发到由VMWare配置的接口,以使Kali访问网络(eth0)。为此,我首先启用了IP转发的内核选项,然后告诉iptables程序将所有数据包转发到该接口。

注意:这个配置仅限实验环境,因为它是相当不安全的。

$ sysctl -w net.ipv4.ip_forward=1
$ iptables -P FORWARD ACCEPT
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

网络服务

我使用dnsmasq作为我的DNS和DHCP服务器。我安装了apt-get安装dnsmasq,然后创建一个dnsmasq。conf文件包含以下信息。

# listen to this interface; change it if a different bridge name was chosen
interface=br0
# give IP addresses, lease is valid for 8 hours
dhcp-range=172.16.0.10,172.31.255.254,8h
# router
dhcp-option=3,172.16.0.1
# dns server
dhcp-option=6,172.16.0.1
# upstream DNS server
server=8.8.8.8
log-queries
log-dhcp

# include addresses
address=/attacker.com/172.16.0.1

我将DHCP地址发送到DHCP范围内的桥接接口上的任何请求(172.16.0.10 – 172.31.255.254),然后命令设备连接到我的Kali路由器(172.16.0.1)和我的DNS服务器(dnsmasq本身通过IP 172.16.0.1的接口br0可到达)。如果dnsmasq不知道DNS查询的答案,它会询问上游服务器(8.8.8.8 – google)来回答问题。我将地址添加到文件的底部,以便这些域名解析到我控制下的设备。我会通过添加更多的行来添加更多的地址,并且每次我都重新启动dnsmasq来保证进程的顺利进行。

$ service dnsmasq restart

嗅探和拦截流量

在我的监控范围内,网络上设备之间的所有流量都会通过桥接接口(br0),我可以在该接口上运行wireshark来嗅探网络流量。这里我选择使用tshark,它相当于是命令行界面的wireshark。接下来,我将监控接口br0,并将所有监控到的流量数据写入到output.pcap文件中。

$ tshark -i br0 -w ./output.pcap -P

通常,我还希望拦截流量,因此需要更多的iptables规则将HTTP /1.1和HTTPS流量重定向到我的拦截代理(BurpSuite),而不是实际的服务器。关于其他协议的设置方法包括HTTP/1.0,请参考此处

第一个规则是在端口80和443上拦截tcp包,并将其发送到BurpSuite。

$ iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j DNAT --to-destination burpip:burp_http_port
$ iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to-destination burpip:burp_https_port

第二条规则是确保回复信息是通过Kali Linux设备发送的,而不是直接发送到被监控的客户端(这一点很重要)。该规则使用masquerade,这样Kali Linux设备就可以接收一个动态IP地址。

$ iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/12 -d burpip -j MASQUERADE

第三种可有可无,就是确保Kali路由器将适当的数据包转发给运行了BurpSuite的设备。适当的数据包是HTTP(- p tcp——dport burp_http_port)和HTTPS数据包(- p tcp——dport burp_https_port),它来自于桥接接口(- s172.16.0 /12),在实际网络(- o eth0)设备上运行目标BurpSuite(- d burpip)。

$ iptables -A FORWARD -s 172.16.0.0/12 -d burpip -i br0 -o eth0 -p tcp --dport burp_http_port -j ACCEPT
$ iptables -A FORWARD -s 172.16.0.0/12 -d burpip -i br0 -o eth0 -p tcp --dport burp_https_port -j ACCEPT

然后,我将BurpSuite配置为在上面的iptables规则中引用的设备(burpip)和端口(burp_http_port和burp_https_port)上的透明代理。此时,我就可以启动BurpSuite,点击Proxy标签,然后选择Options菜单,然后点击Add按钮。

26.png

对于HTTP流量,我将BurpSuite绑定到所有接口上的80端口,即我的iptables规则中的burp_http_port。

27.png

我将访问请求处理选项卡并启用对不可见代理(invisible proxy)的支持。这是必要的,因为客户不知道BurpSuite的存在。

28.png

对于HTTPS流量,我将BurpSuite绑定到所有接口上的443端口,即我iptables规则中的burp_https_port。

29.png

此时,我会访问请求处理选项卡,将流量重定向到端口443,强制使用SSL,并支持对不可见的代理进行支持。

30.png

自动化处理

这么复杂,手动的话将会非常耗时,所以我想到了自动化处理的方法。你可以在我的GitHub主页找到相关的配置文件以及脚本。具体步骤如下:

1.从github获取代码:

$ git clone https://github.com/koenbuyens/kalirouter.git

2.安装必要的组件:

apt-get install dnsmasq hostapd bridge-utils

3. 插入USB接口,通过执行iptables来发现适配器的名字和MAC地址。

4.通过network-manager服务,我会添加适配器MAC地址来接管相关接口,并运行命令/etc/init.d/networking restart来重启网络服务。/etc/NetworkManager/NetworkManager.conf文件的修改内容如下所示。

[keyfile]
unmanaged-devices=mac:d8:eb:97:b6:ce:12;mac:56:6b:a2:90:c4:b9

5.修改hostapd.conf文件,并将其指向正确的无线接口(默认wlan0)。

6.修改monitor.sh脚本中的接口变量,将其指向正确的接口。其中的WIRELESS_MONITOR_INTERFACE, WIRED_MONITOR_INTERFACE和 INTERNET_INTERFACE分别对应的是USB无线网卡、USB有线网卡和Kali的VMWare接口。默认为wlan0、eth1和eth0。

7.修改monitor.sh脚本中的代理变量,将其指向BurpSuite的IP地址以及端口,其中PROXYBOX, PROXYBOX_HTTP_PORT和 PROXYBOX_HTTPS_PORT分别对应的是IP地址、HTTP端口和HTTPS端口,默认为172.16.0.1、80和443。如果IP地址在另一台设备上运行(在我的设备中是192.168.1.192),则要修改。

8.运行下列命令执行脚本文件。

$ ./monitor.sh

9.输出数据保存在dumps/output.pcap文件中,你可以通过按下Ctrl+C来停止监控网络流量。

拦截嵌入式设备、移动应用和Windows应用程序的通信流量

启动监控器脚本后,我可以开始监控连接到我的监控器网络中的设备和应用程序了。

嵌入式设备

我将嵌入式设备连接到我的监控器网络,通过无线方式或通过以太网连接。然后我让设备备开始正常运行。在下面的例子中,我的嵌入式设备(10.0.0.38)通过UDP与主与一个内网移动应用进行通信(192.168.1.230)。我可以将这两个设备连接到我的监控器网络(10.0.0 / 8)来拦截所有流量。

35.png

移动应用程序

在我开始监控移动应用程序之前,我必须将BurpSuite的证书添加到移动操作系统的信任证书中,因为现在大多数移动应用程序以及胖客户机都会验证该证书。

1. 通过点击Proxy标签页中的Import/export CA certificate选项导出BurpSuite证书。

36.png

2. 通过选择Certificate in DER format选项将证书导出为DER文件。

37.png

对于Android应用程序,我先要将信任证书添加到其中。

1. 进入Android的安全设置。

38.png

2.从SD卡上安装一个证书。

39.png

3.选择证书文件。

40.png

4.命名证书。

41.png

导入证书后,我就可以准备监控应用程序的网络流量了。

1. 将移动设备连接到我的监测网络,密码是我在hostapd配置文件中设置的密码。

42.png

2.启动要监控的应用程序。下面的示例就是Amtrak应用程序。

43.png

3.在BurpSuite中观察到监控到的安卓应用的HTTPS流量。

44.png

4.也观察到了wireshark记录了所有的流量,下图是Facebook应用程序。

45.png

不过要注意的是,为了监控实现HSTS、HPKP或证书固定的应用程序,我需要完成额外的步骤,但这超出了本文的讨论范围。

Windows应用程序

我还可以使用它来监控Windows应用程序的流量,通过将我的Windows设备连接到同一个网络,并向Windows信任存储区添加BurpSuite的证书。

1.我将我的Windows设备通过以太网连接到我的监控网络。

46.png

2.导入Windows证书,详细步骤请点此处

3.我将启动我感兴趣的应用程序,在本例中就是我的浏览器。

47.png

4.请注意,BurpSuite和Wireshark都可以接收流量。

48.jpg

Raspberry Pi Kali路由器

当我想要一个便携式解决方案时,我会会在Raspberry Pi上实现以上的设置。你可以下载Raspberry Pi Kali Linux映像,同时,你很可能需要将上述的自动化部分中的一些设置进行略微的调整,特别是将你的网卡的MAC地址添加到网络管理器配置文件中。

49.jpg

1.下载最新的Kali Linux映像,用于攻击安全性的Raspberry Pi。这个映像很有可能被xz压缩,因为它以xz文件的扩展结束。我安装xz压缩工具并使用它来提取映像。如果Kali映像没有被xz压缩,也就是说,它有img文件扩展名,那我可以跳过这一步。

在MacOSX上,如下所示。

$ brew install xz
$ xz -d file-to-extract.xz

在Ubuntu上,如下所示。

$ apt-get install xz-utils
$ xz -d file-to-extract.xz

2.将映像快闪到磁盘上,执行df程序两次,以识别系统上的磁盘。

$ df -h

SD卡的文件系统名称是以前没有的,在MacOSX上,它看起来像/dev/ disk2s1。在Ubuntu上,它看起来像/dev/sdb。

卸载分区,这样我就可以写它了。在MacOSX上,我使用diskutil命令卸载它。由于我的闪存卡是第二个磁盘(/dev/disk2…),我回执行以下操作。

$ sudo diskutil unmount /dev/disk2

在Ubuntu上,我使用umount命令卸载它。

$ sudo umount /dev/sdb

我用dd命令将Kali复制到SD卡,将rdisk2替换为正确的磁盘,即在我的Kali设备上的/dev/sdb,并将LocationOfKaliImage替换为Kali Linux设备的路径。

$ sudo dd bs=1m if=LocationOfKaliImage of=/dev/rdisk2

我将Kali扩展到在我的Ubuntu设备上运行gparted应用的完整的SD卡。

$ apt-get install gparted
$ gparted

我选择SD卡,通常是/dev/sdb。观察数据分区后的空白空间。我右键单击包含数据的分区(下图中的/ dev/ sdb2淡黄色部分),然后单击Resize/Move。

57.png

在resize对话框中,我将Free Space Following更改为零,并单击resize。在我的例子中,我将kali分区扩展到大约30GB。

58.png

我右键单击pending操作(在gparted底部),选择应用所有操作。

59.png

完成后,我将SD卡弹出,插入到 Raspberry Pi中,将Pi连接到屏幕上,连接键盘和鼠标,并将其与以太网连接到我的网络上。我将电源插头插入到Kali Linux中,并以用户名“root”和密码“toor”登录。

我通过运行以下命令来更新设备的软件:

$ apt-get update
$ apt-get upgrade
$ apt-get dist-upgrade

我通过执行passwd来更新根密码:

$ passwd root

要用我的计算机与我的 Raspberry Pi进行连接,就要使用SSH。由于我没有提前安装SSH,我将在boot上安装并启用它,如下所示:

$ apt-get install openssh-server
$ update-rc.d -f ssh remove
$ update-rc.d -f ssh defaults

如下所示,我会更改默认键:

$ cd /etc/ssh/
$ mkdir insecure_old
$ mv ssh_host* insecure_old
$ dpkg-reconfigure openssh-server

我将更改sshd_config文件以允许根用户进行身份验证。注意,这是不安全的,最好创建一个常规用户。

$ nano /etc/ssh/sshd_config

我对下一行进行了更改:

PermitRootLogin without-password

以代替如下这一行:

PermitRootLogin yes

我保存更改并重新启动openssh – server。

$ service ssh restart
$ update-rc.d -f ssh enable 2 3 4 5

我希望安装网络工具,以便我能够使用ifconfig。

$ apt-get install net-tools

然后我在 Raspberry Pi上检查我的脚本,连接我的USB适配器,按照上述自动化部分的配置说明,使用wlan1而不是wlan0。

$ git clone https://github.com/koenbuyens/kalirouter.git

总结

Kalirouter可以帮助我将Kali Linux设备瞬间转换成一个代理路由器,它能够拦截多个设备之间的网络流量。

参考文献

我在Kali Linux中创建了一个有线或无线路由器时,用到了下面的链接。

https://www.psattack.com/articles/20160410/setting-up-a-wireless-access-point-in-kali/ 

https://cybergibbons.com/security-2/quick-and-easy-fake-wifi-access-point-in-kali/ 

https://ubuntuforums.org/showthread.php?t=716192 

https://help.ubuntu.com/community/NetworkConnectionBridge 

https://wiki.archlinux.org/index.php/Internet_sharing#Configuration 

https://wiki.archlinux.org/index.php/software_access_point#Bridge_setup 

https://wiki.debian.org/BridgeNetworkConnections#Manual_bridge_setup 

https://help.ubuntu.com/lts/serverguide/network-configuration.html 

http://www.tldp.org/HOWTO/TransparentProxy-6.html 

本文翻译自:https://github.com/koenbuyens/kalirouter ,如若转载,请注明来源于嘶吼: http://www.4hou.com/technology/7605.html

点赞 1
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

luochicun

luochicun

这个人很懒,什么也没留下

发私信

发表评论