前言
这个存储库包含将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.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按钮。
对于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. 将移动设备连接到我的监测网络,密码是我在hostapd配置文件中设置的密码。
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设备瞬间转换成一个代理路由器,它能够拦截多个设备之间的网络流量。