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

2017-09-11 17:57:24 luochicun 嘶吼专业版


前言

这个存储库包含将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都是以透明代理的形式运行的,因为客户根本不知道代理的存在。这种设置的主要优点是它将客户端的配置降低到最小值,具体设置如下图所示。

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

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

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

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

下面,我会详细阐述如何将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访问网络)。

现在需要配置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.8log-querieslog-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按钮。

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

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

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

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

自动化处理

这么复杂,手动的话将会非常耗时,所以我想到了自动化处理的方法。你可以在我的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)来拦截所有流量。

移动应用程序

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

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

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

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

1. 进入Android的安全设置。

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

3.选择证书文件。

4.命名证书。

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

1.

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

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

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

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

Windows应用程序

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

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

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

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

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

Raspberry Pi Kali路由器

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

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。

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

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

完成后,我将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