android socket 线程连接openwrt与arduino单片机串口双向通信
package zcd.netanything;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
public class MyCar extends Fragment implements OnClickListener{
private static String wifiurl;
private static String wificom;
private static String wificamera;
private Thread mThreadClient = null;
private Socket mSocketClient = null;
//视频线程
private Thread mThreadvideo = null;
private String recvMessageClient ;
//MySurfaceView r;
private boolean isConnect=false;
//指令发出 数据缓存
static PrintWriter mPrintWriterClient = null;
static BufferedReader mBufferedReaderClient = null;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.mycar,container, false);
view.findViewById(R.id.button1).setOnClickListener(this);
view.findViewById(R.id.button2).setOnClickListener(this);
view.findViewById(R.id.button3).setOnClickListener(this);
view.findViewById(R.id.button4).setOnClickListener(this);
view.findViewById(R.id.button5).setOnClickListener(this);
return view;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//内部类 广播接收
public static class myReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
wifiurl = intent.getStringExtra("wifiurl");
wificom = intent.getStringExtra("wificom");
wificamera = intent.getStringExtra("wificamera");
Toast.makeText(context, "广播已经接收", Toast.LENGTH_SHORT).show();
}
}
//来源 http://www.cnblogs.com/xiaobo-Linux/ 赵存档 QQ463431476
//线程mRunnable启动
private Runnable mRunnable = new Runnable()
{
public void run()
{
try
{
//连接服务器
mSocketClient = new Socket(wifiurl,Integer.parseInt(wificom));
//取得输入、输出流
mBufferedReaderClient = new BufferedReader(new InputStreamReader(mSocketClient.getInputStream()));
mPrintWriterClient = new PrintWriter(mSocketClient.getOutputStream(), true);
recvMessageClient = "wifi成功连接";//消息换行
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
}
catch (Exception e)
{
recvMessageClient = "连接错误!";//消息换行
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
return;
}
setRecvMessage();
}
};
public void setRecvMessage(){
char[] buffer = new char[256];
int count = 0;
while (true)
{
try
{
if((count = mBufferedReaderClient.read(buffer))>0)
{
recvMessageClient = getInfoBuff(buffer, count);//消息换行
//Thread.sleep(500);
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
//Toast.makeText(getActivity(),recvMessageClient,Toast.LENGTH_SHORT).show();
}
}
catch (Exception e)
{
recvMessageClient = "接收异常:" + e.getMessage() + "\n";//消息换行
Message msg = new Message();
msg.what = 0;
mHandler.sendMessage(msg);
}
}
}
Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
super.handleMessage(msg);
if(msg.what == 0)
{
Toast.makeText(getActivity(),recvMessageClient,Toast.LENGTH_SHORT).show();//刷新消息机制
}
else if(msg.what == 1)
{
try
{
String result = recvMessageClient;
Toast.makeText(getActivity(),result,Toast.LENGTH_SHORT).show();
}catch(Exception e)
{
//Toast.makeText(getActivity(),"无法获取数据,检查网络是否连接!",Toast.LENGTH_SHORT).show();//刷新消息机制
}
}
}
};
//接收处理
private String getInfoBuff(char[] buff, int count)
{
char[] temp = new char[count];
for(int i=0; i<count; i++)
{
temp[i] = buff[i];
}
return new String(temp);
}
/*public void onDestroy() {
super.onDestroy();
if (isConnect)
{
isConnect = false;
try {
if(mSocketClient!=null)
{
mSocketClient.close();
mSocketClient = null;
//mThreadvideo.destroy();
mPrintWriterClient.close();
mPrintWriterClient = null;
recvMessageClient = "网络端口成功";//消息换行
Message msg = new Message();
msg.what = 0;
mHandler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
mThreadClient.interrupt();
}
}
*/
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.button1:
mPrintWriterClient.print("f");
mPrintWriterClient.flush();//清空
Toast.makeText(getActivity(),"前进",Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
mPrintWriterClient.print("b");
mPrintWriterClient.flush();
Toast.makeText(getActivity(),"后退",Toast.LENGTH_SHORT).show();
break;
case R.id.button3:
mPrintWriterClient.print("l");
mPrintWriterClient.flush();
Toast.makeText(getActivity(),"向左",Toast.LENGTH_SHORT).show();
break;
case R.id.button4:
mPrintWriterClient.print("r");
mPrintWriterClient.flush();
Toast.makeText(getActivity(),"向右",Toast.LENGTH_SHORT).show();
break;
case R.id.button5:
if(!isConnect)
{
//开启mThreadClient线程
mThreadClient = new Thread(mRunnable);
mThreadClient.start();
Toast.makeText(getActivity(),"尝试连接网络",500).show();
}
else {
onDestroy();
isConnect=false;
// Btn_openwifi.setBackgroundResource(R.drawable.disconnect);
}
//开启mThreadvideo线程
//mThreadvideo = new Thread(mRunvideo);
//mThreadvideo.start();//开启视频监听
break;
//case R.id.button6:
//关闭wifi
/* if (isConnect)
{
isConnect = false;
try {
if(mSocketClient!=null)
{
mSocketClient.close();
mSocketClient = null;
//mThreadvideo.destroy();
mPrintWriterClient.close();
mPrintWriterClient = null;
recvMessageClient = "网络端口成功";//消息换行
Message msg = new Message();
msg.what = 0;
mHandler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
mThreadClient.interrupt();
}
*/
// break;
}
}
}
【物联网】OpenWrt编译和修改基础--预科
该文章讲解一下在AR9331上使用Openwrt的编译修改方法,前面先介绍一下硬件平台特点,为后面的代码修改做铺垫,然后描述一下Openwrt的编译烧写流程,最后再重点讲述编译配置、代码修改细节。
1. 硬件平台
手头上ar9331模块64MB DDR2,8MB spi flash,配合底板的硬件特点如下:
Port4
WAN
Port0
LAN1
Port1
LAN2
Port2
LAN3
Port3
LAN4
LED0_GPIO0
WLAN_LED(Active High)
LED1_GPIO1
USB_LED(Active High)
LED2_GPIO13
LAN1_LED(Active High)
LED3_GPIO14
LAN2_LED(Active High)
LED4_GPIO15
LAN3_LED(Active High)
LED5_GPIO16
LAN4_LED(Active High)
LED6_GPIO17
WAN_LED(Active Low)
LED7_GPIO27
SYSTEM_LED(Active Low)
LED8_GPIO26
NC
JS_GPIO11
WPS
ResetSwitch_GPIO12
Reset
GPIO23
User Key
GPIO18/I2S_CK
控制引脚
GPIO22/I2S_MICIN
控制引脚
2. 编译烧写流程
2.1. 依赖库
使用Ubuntu进行编译开发,需要安装的依赖库如下:
apt-get install build-essential asciidoc binutils bzip2 gawk gettext \git libncurses5-dev libz-dev patch unzip zlib1g-dev等等。
还需要安装svn,apt-get install subversion。
2.2. 下载源码
svn co svn://svn.openwrt.org/openwrt/trunk/
2.3. 编译
以下为编译步骤,在make menuconfig中做的配置将在后面具体介绍,在make V=s前需要做一些移植修改也将在后面具体介绍。
cd trunk/
svn up
cp feeds.conf.default feeds.conf
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
Make V=s
最终在trunk/bin/ar71xx/目录下得到最终的烧写目标代码(在此以mr3220-v2路由为基础),openwrt-ar71xx-generic-tl-mr3220-v2-squashfs-factory.bin。
2.4. 烧写
官方的Linux SDK开发包的烧录代码与Openwrt的烧录代码的分区规划不同,如果原来开发板上烧录的是官方的linux SDK代码,则需要先将刷新适用于Openwrt的Uboot,然后再烧写上一步中生成的openwrt-ar71xx-generic-tl-mr3220-v2-squashfs-factory.bin。
对开发板烧写程序可以通过多种方式实现:在Uboot中烧写Uboot与固件、编程器烧写、Web配置界面中程序升级。
2.4.1. 烧写Uboot
使用网线连接开发板与PC,然后连接上串口监控(115200-8-n-1,这里使用SecureCRT),开发板上电,在SecureCRT中看到Uboot打印信息,按任意键打断启动进入Uboot命令行,使用printenv命令查看启动参数,记录下serverip,例如为192.168.1.2,并将PC更改为该IP。PC端开启Tftp Sever软件,在uboot命令行中输入命令如下:
#tftpboot 0x80060000 u-boot-ar9331.bin
#erase 0x9f000000 +0x200000
#cp.b 0x80060000 0x9f000000 0x20000
重启开发板,看到uboot正常打印。
2.4.2. 烧写固件
同上面烧写uboot一样,进入uboot命令行模式,输入如下命令:
#tftpboot 0x80060000 openwrt-ar71xx-generic-tl-mr3220-v2-squashfs-factory.bin
#erase 0x9f020000 +0x7c0000
#cp.b 0x80060000 0x9f02000 0x7c0000
2.4.3. 编程器拯救板砖
上面两种方式前提是目标板不是板砖,万一变砖或者开发板上未烧写过程序,则需要使用编程器来烧写目标代码,这就是对普通的SPI flash烧录程序方法,只要知道芯片型号,有固件就行了。
2.4.4. Web升级程序
对于能正常启动的AR9331开发板可以通过web升级程序,登录到web配置界面后选择System->Backup/Flash Firmware,然后选择要升级的固件。
注意这种方式只能升级统一型号的路由固件,如现在正在运行的是wr720的固件,你编译了一个wr740的固件,是无法通过web升级的,只能通过上面在Uboot中烧写固件的方式进行升级。
3. menuconfig配置
这里将介绍上面编译步骤中的make menuconfig中的具体配置。在这里配置时候使用MR3220-V2路由器为蓝本。
开始配置,首先选择CPU与路由型号:
Target System—–Atheros AR71xx/AR7240/AR913x/AR934x
Target Profile—-TP-LINK MR3220
Kernel Modules配置:
Kernel modules —> Native Language Support —> <*> kmod-nls-utf8
Luci配置如下:
LuCI—>Collections—– <*> luci
LuCI—>Applications —> <*>luci-app-qos
LuCI—>Themes —> <*>luci-theme-openwrt
LuCI—>Translations—- <*> luci-i18n-Chinese
LuCI—>Translations—- <*> luci-i18n-English
Network配置:
Network—>Routing and Redirection—- <*> ip
在这里我们只做了必须的配置,更加丰富的功能可以再额外配置添加,如常见的USB storage、3G、Network Share(Samba)等等。
4. 代码修改
在这里我们做的移植中有些可以通过直接修改开发板中的配置文件来实现,而不需要重新编译固件,但是我们要的是一个编出来就是默认配置的固件,所以以下移植都将是在编译前实现的。
4.1. 编译权限
个人不喜欢在非root权限下编译,为此做一下简单修改使得能够在root权限下进行编译,修改/trunk/include/prereq-build.mk将原来的require non-root修改为root
define Require/non-root
#[ "$$(shell whoami)" != "root" ]
[ "$$(shell whoami)" != "noroot" ]
endef
4.2. flash配置
手头上的AR9331核心板上使用的是8MB的dataflash,而标配的MR3220-V2路由是4MB,为此我们需要修改:
trunk/tools/firmware-utils/src/mktplinkfw中MR3220-V2配置为8MB
.id = "TL-MR3220v2",
.hw_id = HWID_TL_MR3220_V2,
.hw_rev = 1,
.layout_id = "4Mlzma", //改为 8Mlzma
trunk/target/linux/ar71xx/image/Makefile中对应MR3220-V2处flash大小为8MB:
MR3220-V2,MR3220-V2,MR3220-V2,ttyATH0,115200,0x32200002,1,8Mlzma
4.3. Wifi配置
Openwrt编译出来的固件,wifi默认是不开启的,需要做一些修改让其上电自动开启AP模式。修改trunk/package/kernel/mac80211/files/lib/wifi/mac80211.sh,其中的detect_mac80211函数中就对wifi-device和wifi-iface即无线物理设配与无线接口做了具体的配置。
在wifi-device配置中屏蔽掉“option disable 1”这句就能使wifi上电自启动了,也可以对channel、hwmode、txpower做进一步的配置,如channel设置为auto,txpower设置为30dBm。
在wifi-iface配置中可以改变wifi的模式(mode)、名字(ssid)、加密方式(encryption)、密码(key)。
如下是一个最终配置示例,这其实也就是生成的/etc/config/wireless配置文件。
4.4. 设置默认登陆密码
Openwrt默认不设置密码,而我们需要一个默认的登陆密码,这可以通过修改package/base-files/files/etc/shadow来实现,修改root项如下:
root:$1$PjtjPtvn$F7wPtGnsC8lhpfJsB39.E/:16357:0:99999:7::: (对应密码123456)
或者
root:$1$0CVWiweD$4Xsq83ZIZtPJe8PVLfqJH0:16357:0:99999:7::: (对应密码admin)
注意Openwrt的登陆用户名为root,且当设置了密码后将不能在使用Telnet来登陆目标板,需使用SSH。
4.5. 设置LAN默认IP
Openwrt固件LAN口默认ip为192.168.1.1,我们可以通过如下方法在编译中修改默认ip:
在trunk目录下新建files/etc/config/目录,然后将已经个性化定制好的network配置文件放在这个目录下,这样再编译出来的固件将执行这个network配置。在此我们只要修改lan口的ipaddr即可,如下所示:
config interface 'lan'
option ifname 'eth1'
option force_link '1'
option type 'bridge'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.12.10'
最根本的方式是通过修改文件package/base-files/files/lib/functions/uci-defaults.sh实现,修改函数ucidef_set_interface_lan中lan口ip即可。
4.6. 串口释放
AR9331只有一个调试串口,如果想要释放调试串口用作他用比如通信等,为此需要释放系统console打印,具体方法如下:
在target/linux/ar71xx/base-files/etc/inittab中注释掉::askconsole:/bin/ash --login,也就是注释掉这个console登陆。
在package/base-files/files/etc/config/system文件中config system下添加以下两句
option 'conloglevel' '1'
option 'kconloglevel' '1'
简单测试:开发板串口连接pc,打开SecureCRT,配115200-8-n-1,使用ssh登陆到开发板,命令行下输入”echo test serial > /dev/ttyATH0”,看到PC端接收正常。
4.7. GPIO控制
如果想使用AR9331的一些GPIO引脚来做一些简单逻辑控制,则需要通过注册gpio设备来实现,修改target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr741nd-v4.c文件
在tl_mr3220_v2_setup函数中添加我们需要的GPIO管脚注册即可,如:
gpio_request_one(18,GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED, "Control GPIO18");
这里的18即是GPIO18,GPIOF_OUT_INIT_LOW限定初始化输出低电平,后面的名字可以自定。
系统启动后可以看到GPIO注册成功:
#ls /sys/class/gpio/
#export gpio18/ gpio22/ gpiochip0/ uexport/
可以使用cat命令获取管脚当前输出值,使用echo命令设置管脚输出。如下:
#cat gpio18/value
1
#echo 0 > gpio18/value
#cat gpio18/value
0
这里说明一下,在写C代码程序控制时候可以直接调用system()函数运行linux命令,比如在你的代码中你想控制GPIO18引脚的输出,那么你可以如下使用。
system(“echo 0 > /sys/class/gpio/gpio22/value”);
4.8. 按键与指示灯
target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr741nd-v4.c文件中对各按键及指示灯定义,具体如下:
l GPIO12做复位按键,短按则实现路由复位,长按大于5s则复位路由并恢复默认设置
l GPIO11做WPS输入按键
l GPIO17 做WAN口指示灯,对应Port4,低有效
l GPIO13 LAN1指示灯,对应Port1,高有效
l GPIO14 LAN2指示灯,对应Port1,高有效
l GPIO15 LAN3指示灯,对应Port1,高有效
l GPIO16 LAN4指示灯,对应Port1,高有效
l GPIO0 WIFI指示灯,高有效
l GPIO27 SYSTEM指示灯,低有效
此外将Port4与Port0的对换撤销掉,即恢复为使用Port4做wan口,将tl_ap121_setup函数中的
ath79_setup_ar933x_phy4_switch(true,true);
改为
ath79_setup_ar933x_phy4_switch(false, false);
修改target/linux/ar71xx/base-files/etc/uci-defaults/01_leds中mr3220-v2灯定义如下:
tl-mr3220-v2)
ucidef_set_led_netdev "wan" "WAN" "tp-link:green:wan" "eth1"
ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x02"
ucidef_set_led_switch "lan2" "LAN2" "tp-link:green:lan2" "switch0" "0x04"
ucidef_set_led_switch "lan3" "LAN3" "tp-link:green:lan3" "switch0" "0x08"
ucidef_set_led_switch "lan4" "LAN4" "tp-link:green:lan4" "switch0" "0x10"
ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
#ucidef_set_led_usbdev "usb" "USB" "tp-link:green:3g" "1-1"
4.9. 时间同步
修改package/base-files/files/etc/config/system文件如下,这样默认同步时间正确。
config system
option hostname 'You can Define'
option zonename 'Asia/Shanghai'
option timezone 'CST-8'
注:这里hostname可以改成你想要的主机名字,将来在web页面中显示的也将是这个主机名。
4.10. 语言及主题设置
编译中的默认设置为auto,即自动识别,这将根据浏览器设置而定,例如我们使用ie、360浏览器,登陆后得到的是英文界面,而使用火狐则是中文界面。如果向默认设置问中文,则修改build_dir/feeds/luci/modules/base/root/etc/config/luci配置文件,将默认auto修改问zh_cn,并将主题锁定为bootstrap
config core 'main'
option lang 'zh_cn'
option mediaurlbase '/luci-static/bootstrap'
option resourcebase '/luci-static/resources'
4.11. 自定义脚本的使用
Openwrt为用户预留的自定义启动脚本/package/base-files/files/etc/rc.local来实现一些扩展功能,我们可以在这里添加一些命令,或者调用一个外部脚本来实现一些扩展功能。
参考网址:http://m.blog.csdn.net/blog/jiaozi07/41774357
《Microduino实战》——2.4 Microduino WRT系列
本节书摘来自华章出版社《Microduino实战》一 书中的第2章,第2.1节,作者:姚琪 杨立斌,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.4 Microduino WRT系列
MicroWRT核心MicroWRT[3]是Makermodule为OpenWRT设计的一款全新开发板。其核心芯片采用联发科的MT7620A SoC芯片,内嵌的是MIPS24KEc处理器,支持DDR2内存,配备64/128M Flash,支持SD、PCI-E、I2S,能够实现NAS、网络摄像头、机器人、OpenCV。
MicroWRT是专门为OpenWRT设计的。OpenWRT是一个高度模块化、自动化的嵌入式Linux系统,拥有强大的网络组建和扩展性,常用于工控设备、智能家居、路由器等设备中。在MicroWRT上采用Hpin52接口,如图2-8所示。可以扩展Microduino Upin-27接口,所以可连接各种Microduino扩展模块,这极大地扩展了MicroWRT的应用范围。
MicroWRT扩展模块针对MicroWRT Hpin52接口标准,Microduino推出了一系列扩展模块,方便与其他设备的互联。
扩展模块名称 功能描述扩展模块名称 功能描述MicroWRT HUB
扩展2个USB2.0接口、1个10/100M以太网接口
MicroWRT_UPIN
Hpin52接口用于转换Upin-27接口,从而方便MicroWRT和Microduino其他模块之间的串口调试。采用拨码开关来配置串口模式和通路,使用串口1通信
MicroWRT PCIE
扩展1个PCIe接口,以及供PCIe使用的SIM卡插槽
拿什么来管理你,我的智能硬件?
拿什么来管理你,我的智能硬件?
当购买的或者DIY的心爱的智能设备安装好后,如何方便简单的管理这些设备就是我们要面临的问题;这里尤其是指运行Linux各种发行版本的设备,如树莓派、NAS、迷你主机、软路由、Openwrt路由器、电视盒子、DIY板子等等.对于直接购买的提供配套APP的设备,往往无需也无法选择管理设备的方式,这里就赞不做关注了。
下图是针对设备进行管理的常见方式的总结。
干货放前面 各种管理方式总结起来:
使用提供Console的WEB管理界面最方便有效
使用物理串口最稳妥可靠
尽量避免使用远程管理
本地管理
本地管理是指和被管理设备在同一个局域网/路由器下,此时双方通信是局限在局域网内部的,被管理设备也可以直接物理碰触到。
此时管理方式多种多样,每一种都有其优势,使用哪种任君选择.
WEB管理界面---带Web console功能的
此类管理WEB界面纷繁复杂,如Openwrt自带的LUCI、Raspberry开发的各类管理界面等,对于通用Linux系统来说,最推荐的是Cockpit直达链接。其支持Docker管理插件,自带Web console,
这个在不同的系统上安装也是超级简单
VNC管理界面 --- 远程桌面
如果设备上安装有GUI桌面系统,那么可以简单方便的通过VNC来管理和使用,对于习惯或者需要操作系统界面的情况来说,此类方式最为简单便宜。
如果系统使用的是Lightdm管理器,那么最简单不过了。
安装vncserver 建议使用tigervnc,这样可以使用高分辨率
sudo apt install tigervnc-standalone-server tigervnc-common
配置Lightdm开启远程VNC
root@pdnas:/etc/lightdm/lightdm.conf.d# cat 88-pdnas-enable-vnc.conf
[VNCServer]
enabled=true
command=Xvnc -rfbauth /etc/vncpasswd
#port=5900
#listen-address=
width=1920
height=1080
depth=24
配置VNC密码
vncpasswd -f /etc/vncpasswd
完工了,可以简单方便的使用VNC了
SSH管理界面 --- 管理万金油
SSH是简单方便有效,如果熟悉命令行界面,那么SSH是不二选择。各类系统基本上自带sshd用于提供ssh的登录。
鼠标键盘和显示器
对于支持HDMI输出的系统来说,通过鼠标、键盘和显示器来管理设备是最直观的方式。
USB 串口
在这边没有联网前或者没有网线的情况下,SSH/WEB/VNC等基于网络的管理方式都无法实施。使用USB串口来管理设备也是一个不错的选择,通过两个USB转串口的连接,在PC上可以直接登录设备.此功能需要设备上配置好才可使用哦。
物理 串口
物理串口就非常简单明了了,此方法往往需要拆开设备,焊接甚至飞线出串口,对于调试u-boot、内核等可能把系统搞挂或者无法再次启动的业务时,往往时必须的。
远程管理 --- 不推荐
对于没有原生标配管理APP的设备,不建议 个人使用时开启或者创建远程管理的方式。
这种方式带来的安全隐患或者问题远大于其带来的便利性。
远程SSH --- 需加强安全配置
如果确实需要远程管理的话,推荐使用 优化过的SSH, 不推荐使用SSH裸奔.
简单的几个步骤就可以极大加强SSH的安全性,降低被黑的风险.
不使用标准22接口,使用其他自定义非标准接口
禁止使用用户名密码方式登录,仅支持证书方式登录
禁止root登录
安装并使能fail2ban等安全防护
智能家居——IoT零基础入门篇
原文地址:http://www.cnblogs.com/rainmote/p/7617454.html
概要
本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器。后经过探索发现新大陆——Home Assistant&Homebridge,最终实现了一个智能家居设备从数据采集到控制、展示。
整体结构图
智能设备:温湿度传感器
主控芯片:STM32F103C8T6
通信协议:Zigbee
智能网关:树莓派
数据存储、展示、设备控制:HomeAssistant + Home Kit
效果图
传感器效果图
Home Assistant效果图
Home Kit效果图
启程
在大学时代时,宿舍有两个路由器TP-LINK路由器,尝试刷openwrt/dd-wrt,各种折腾,买了编程烧录器、FLASH芯片等,拆机焊接等,尝试用电烙铁拆解芯片(不该轻易尝试),搞坏了一个路由器。由此也开启对硬件的兴趣,看目前IoT备受大家关注与追捧,自己也想跃跃欲试——DIY智能家居。
2017年七月份,开始了解各种物联网设备、协议,纠结WiFi还是Zigbee?了解ESP8266,CC2530,JN5168等芯片。
最开始想着做个简单的,正好百宝箱中有一只DHT11,于是先做个温湿度设备。温湿度传感器应该是功耗小的,如果用WiFi就必须使用电源,如果每个房间一个,墙上基本插座肯定不够,即不美观也不现实。所以聚焦Zigbee, 于是在网上买了一套开发学习板,200+,买回来后才发现没时间搞,除了用串口测试玩了一下,一直在被搁置了。
花了近一周的时间在网上搜索Zigbee相关资料及产品,由于目前大多数Zigbee产品通信协议各厂商都各自实现,且不是完全开源,所以学习成本较大,Zigbee 3.0可能改善这一局面,不过目前网上资料甚少。为了实现上述DIY智能家居的目标,我选择暂时放下这个大骨头,选择一款支持透传的Zigbee板子DL-20, 串口转Zigbee透传。
无线传输问题解决了,下来就是如何驱动DHT11获取数据,购买Zigbee设备时,看资料这个模块应该是MCU,就是经常听到的单片机,正好家里百宝箱里有STM8和STM32(大学买的,一直被搁置,没时间搞,也不知道该怎么玩),于是网上查阅资料,发现STM8资料比STM32要少很多,看了STM32F103C8T6核心板也就10块钱左右,于是选择STM32,一方面价格能接受,配置也比STM8高些,容易入门上手。
突破STM32
刚开始在网上找STM32资料,发现有驱动DHT11的源代码,但是程序结构根本无法看懂。另外,搭建了IAR开发环境,发现将源码粘贴进去,根本编译不过;网上也没有详细的STM32F103配置资料。
周末,去图书馆翻遍STM32相关书籍,找到了一本非常适合突击,实战入门的资料书籍《疯狂STM32实战讲学录》,作者欧阳骏,李英芬,王小强等。花了大概5小时,熟悉了前七章的内容,主要有基本LED灯实验(说明库函数),GPIO入门之道(基本IO操作),中断(程序流程、通信),时钟,UART(串口)等知识点。
回家之后,发现STM32驱动DHT11程序能看懂了,但是开发环境中编译还是报错,从ST官网下载的固件库也不知道如何使用。
无意间,搜索到“51自学网”的STM32教程,该网站讲解的课程都很基础,很适合零基础,于是看了STM32开发环境搭建相关教程,于是自己动手实现了第一个LED灯。
按照教程又温故了时钟中断等知识点,实现了定时休眠功能,接着结合教程,DHT11说明文档,实现了读取温湿度数据。但是读取的数据没法显示,于是看了串口通信相关教程,实现了基本的串口通信,将读取的数据通过串口发送至电脑。
上述过程相关技术教程见《STM32F103X 开发环境搭建》、《STM32获取DHT11温度传感器数据》
尝试IoT云平台
串口读取到DHT11数据后,开始尝试将数据上传云平台保存,选择阿里云IoT套件,熟悉了MQTT协议,按照官方文档获取HTTPS授权,并将数据通过MQTT协议推送到云端,转储到表格存储中,接下来想着搭建一个WEB服务,绘制温湿度曲线图。接入阿里云物联网套件相关教程见《智能家居——阿里云物联网套件体验》
发现新大陆--Home Assistant
准备搭建Web服务器时,查阅网上相关资料,无意间发下了新大陆,Home Assistant,太符合我的需求。官网:https://home-assistant.io/安装教程可参考:https://zhuanlan.zhihu.com/p/28011522国内论坛:https://bbs.hassbian.com/forum.php
智能家居控制展示图(图片引用自Home Assistant官方文档)
总结
回看整个入门历程,发现IoT设备用户体验,能耗等细节至关重要,同时也是约束。
能耗
简单理解就是,要能耗低,那么设备一定要简单,简单的设备开发涉及硬件知识很多,对于软件工程师来说门槛较高。另一个就是通信协议,WiFi可以说是入门首选,但是其能耗较大决定了其不能成为家庭小型传感器所用。这方面小米一直做的不错,对于有源设备,比如智能排插等使用WiFi,同时推出Zigbee智能网关,温湿度、门窗感应设备使用Zigbee通信,而NXP公司的JN516X系列能耗与CC2530相比,又改善很多。所以网上查询小米设备的拆解资料可以看到,温湿度传感器等采用纽扣电池供电。随着Zigbee 3.0的来临,相信智能家居小型传感器的网络通信还是非Zigbee莫属。ESP8266所带来的价格优势,也让很多热爱IoT的Geek投入,使得WiFi也占一席之地。
用户体验
目前各大厂商都在建立自己的生态圈,家里买各种设备需要安装不同的APP,用户体验较差,而有一群人,热衷Home Assistant这个开源平台,投身在将各种设备适配到该平台。如果国内某个厂商能够进入开源社区,支持Home Assistant,那便是另一番景象,让我们共同期待。
作者:rainmote博客:http://www.cnblogs.com/rainmote本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
物联网技术周报第 86 期: 为认知 IoT 应用程序实现区块链
新闻
《微软推出主打安全性的 Project Sopris 低成本物联网设备》在“始终连接”的物联网世界,微软亦希望坚持保证安全性,并推出了一套名叫“Project Sopris”的低成本 IoT 设备。他们在首个技术报告中详细介绍这种“高安全性设备”的七大属性,此外还联手 MTK,打造了一款高安全性的改版微控制器(支持 Wi-Fi 的 MT7687)。
《阿里巴巴、中兴、中国联通共同打造物联网区块链框架》阿里巴巴集团、中兴、中国联通,以及中国工信部宣布将共同打造专门应用于物联网的区块链框架,且已与国际电信联盟(ITU)有过进一步接触,希望透过区块链技术来改善物联网连接成本过高、过度集中、扩展不易、网络安全漏洞等问题。
《瞄准千亿工业物联网市场,有人物联网为2万企业级用户提供完整可靠方案》成立于2011年的山东有人信息技术有限公司是一家工业物联网方案商。与市面上同类的工业物联网公司相比,有人物联网有两大核心优势。一是同时掌握有线网络、WIFI 网络、M2M 移动网络通讯技术;二个是有人物联网在早期就进行了互联网营销,建立了品牌优势。
技术
《使用微软 Azure IoT 开发者套件开发一个温湿度读取器》 本文将介绍了如何使用 Azure IoT 套件( Raspberry Pi 2 和 Pi 3)来熟悉Azure IoT的开发。并演示如何通过开发者套件,连接Azure IoT套件中的远程监视预配置解决方案。
《使用 Amazon Alexa 控制 Photon,无需进行 Alexa 编码》 开发一个新的 Alexa 应用的时候,需要进行创建设备、 引用代码、更新 Alexa Skill等步骤。本文的作者创建了一个库,来放置这些重复的代码,并结合 Photon 添加了设备自动发现的功能。文章随后介绍了,如何使用它来开发一个声控应用。
《为认知 IoT 应用程序实现区块链》目前集中化、基于云的 IoT 解决方案很难满足大 型企业面临的扩展性与安全性方面的挑战。通过利用区块链作为参与节点之间的分布式交易账本和对等通信机制,就可以解决这些问题了。 本文概述了支持区块链的 IoT 解决方案的优势,并演示了在多合作伙伴环境中如何开发一个基于 IBM Blockchain 平台的 IoT 应用程序的主要步骤。
开源软件
OK Bitcoin Fullnode OS 是一个面向 Raspberry Pi、Pine64 + 及IoT设备的加密操作系统。它在 Core OS、 Flavors OS 上集成了不同的加密货币/技术,如:Bitcoin, OKCash, Open Bazaar。
ModuleInterface 是一个Arduino兼容库,用于在设备之间自动传输设置和值。该项目旨在提供一种快速创建基于主从设备(模块)集合的方法,例如测量温度和其他传感器,打开和关闭物体,调节加热等,并让每个设备只需要少量的编程就可以实现。
SocketMan 是一个使用纯 C 实现的、轻量级守护程序,运行在 OpenWRT、LEDE 及其他 *nix 设备上。当前它用于Cucumber Tony控制其接入点和路由器的全球业务。它可以实现下面的功能:监控网络连接、收集,缓存并发送设备统计信息到指定的API、通过 MQTT 连接到代理并处理入站作业、从网络故障中恢复。
硬件
JeVois 是一个开源的四核智能机器视觉相机,带有微型封装的视频传感器、四核CPU、 USB视频、串口。它是一个教育项目,旨在通过提供一个独立的,可配置的机器视觉引擎,来作为视觉组件。只需要插入一个装有提供的开源机器视觉算法(包括OpenCV 3.2及其他)的 microSD 卡,再连接到你的桌面,笔记本电脑,或Arduino,就可以立即为您的项目提供视觉。
原文发布时间为:2017年4月12日
本文作者:黄峰达
本文来源:InfoQ,如需转载请联系原作者。
暗渡陈仓:用低功耗设备进行破解和渗透测试
信息安全技术丛书
暗渡陈仓:用低功耗设备进行
破解和渗透测试
Hacking and Penetration Testing with Low Power Devices
[美]菲利普·布勒斯特拉(Philip Polstra)著
桑胜田 翁 睿 阮 鹏 译
图书在版编目(CIP)数据
暗渡陈仓:用低功耗设备进行破解和渗透测试/(美)菲利普·布勒斯特拉(Philip Polstra)著;桑胜田,翁睿,阮鹏译. —北京:机械工业出版社,2016.10
(信息安全技术丛书)
书名原文:Hacking and Penetration Testing with Low Power Devices
ISBN 978-7-111-54879-9
I.?暗… II.①菲… ②桑… ③翁… ④阮… III. 计算机网络-安全技术 IV. TP393.08
中国版本图书馆CIP数据核字(2016)第223714号
本书版权登记号:图字:01-2015-0857
Hacking and Penetration Testing with Low Power Devices
Philip Polstra
ISBN: 978-0-12-800751-8
Copyright ? 2015 by Elsevier Inc. All rights reserved.
Authorized Simplified Chinese translation edition published by the Proprietor.
Copyright ? 2016 by Elsevier (Singapore) Pte Ltd. All rights reserved.
Printed in China by China Machine Press under special arrangement with Elsevier (Singapore) Pte Ltd. This edition is authorized for sale in China only, excluding Hong Kong SAR, Macau SAR and Taiwan. Unauthorized export of this edition is a violation of the Copyright Act. Violation of this Law is subject to Civil and Criminal Penalties.
本书简体中文版由Elsevier(Singapore)Pte Ltd.授权机械工业出版社在中国大陆境内独家出版和发行。本版仅限在中国境内(不包括香港、澳门特别行政区及台湾地区)出版及标价销售。未经许可之出口,视为违反著作权法,将受法律之制裁。
本书封底贴有Elsevier防伪标签,无标签者不得销售。
暗渡陈仓:用低功耗设备进行破解和渗透测试
出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037)
责任编辑:陈佳媛 责任校对:董纪丽
印 刷: 版 次:2016年10月第1版第1次印刷
开 本:186mm×240mm 1/16 印 张:13.25
书 号:ISBN 978-7-111-54879-9 定 价:69.00元
凡购本书,如有缺页、倒页、脱页,由本社发行部调换
客服热线:(010)88379426 88361066 投稿热线:(010)88379604
购书热线:(010)68326294 88379649 68995259 读者信箱:hzit@hzbook.com
版权所有·侵权必究
封底无防伪标均为盗版
本书法律顾问:北京大成律师事务所 韩光/邹晓东
Foreword?推 荐 序
亲爱的读者,在这篇序文中,我首先要提醒你当心此刻你手中所拿的这本书威力巨大!这本书不仅是一本教材,它定义了一个决定性的时刻。从此,无论是公司、组织还是各行各业的人都要重新审视它们的网络安全状况。长久以来,我们一直说服自己,在线交互的风险十分有限,风险仅当具有IP地址,并进行互联网连接时才存在。可是,从此刻起一切都变了!作者为我们揭露了无情的现实——没有物理安全就没有在线安全。本书展示了那些常见的小装置、小设备以及各种计算机外设如何成为渗透网络的工具。本书通过演示攻击网络的设备如何飞向目标,证明了天空也不再是攻击禁区。这些装置并不是未来的幻想,甚至也不是DARPA才有的高大上装备。作者将全面展示如何利用廉价的零件和这本书来构建自己的网络武器。曾经只有国家才能拥有这种力量的网络战黄金时代已经一去不复返了。感谢作者的辛勤努力,他把这种专业知识和技术传授给了普通大众!应该让每一位CIO、CEO(确切说,任何头衔带“C”的领导)都看到这本书,以便让他们意识到身处其中的威胁。我曾经说过:“如果我能骗过你的前台接待员,就不必劳神去搞你的防火墙了。”这不,作者以浅显易懂的方式精彩地展现了如何轻松做到这一点。
这不是一本为那些害怕发现漏洞(或审视其当前的信息安全策略和流程)的人准备的书!这本书是为这样的人准备的,他们敢于提问:“为什么那个电源插座上边带了一个网线?”也从不怕提出:“这是干什么用的?”这不是一本打发阴雨的星期天下午的休闲读物,而是需要拿着电烙铁、开着笔记本电脑,旁边再放点创可贴以备不测的书籍!前进吧,读者,去领略把鼠标变成武器、把玩具机器人变得比“终结者”更恐怖的美妙奇境吧!
我是认真的,这是本了不起的书,我从中学到了真正不同寻常的东西!
阅读愉快!
Jayson E. Street
译 者 序?The Translator’s Words
2001年,我在handhelds.org上第一次看到iPAQ掌上电脑,H3630屏幕上显示着企鹅图标和Linux内核启动信息,当时眼前一亮,隐约觉得这样的嵌入式设备会有很多非常规的、有趣的(或许还是有用的)玩法。去年一个深冬的下午,在安天微电子与嵌入式安全研发中心,我和同事正在做某个智能设备的拆解和固件提取,望着工作台上被肢解得七零八落的各种智能手机、4G网卡,突然感慨,这些主频上亿赫兹,内存数亿字节的设备,每个都是一个小宇宙,蕴藏着惊人的能量……
Philip Polstra博士的这本书展示了小型嵌入式系统的奇妙应用。作为安全专家,他向我们展示了这些工作在安全研究应用中的非凡作用;作为硬件极客,他带我们感受了有趣的DIY过程。所以,无论是寻求实用技术的工程师还是从兴趣出发的玩家,都会发现本书内容具有足够的吸引力。
早在2009年我就接触和应用过BeagleBoard,还曾基于BeagleBoard制作了便携式U盘杀毒和擦除器,所以对于书中的很多想法和做法颇感心有戚戚焉。读完这本书,我还是不由得感叹作者在BeagleBoard应用方面的丰富经验,以及本书对软硬件介绍的系统性和全面性。书中每部分的决策考量与实现方法又都与实际的渗透测试应用密切结合,娓娓道来,也足见作者软硬件功力深厚,实践经验丰富。
本书翻译工作得到了很多人的支持和帮助。除了我之外,翁睿和阮鹏也参与了本书的翻译工作。感谢华章公司吴怡编辑的细致耐心指导。由于经验不足,能力有限,翻译的不当之处还请读者批评指正。
桑胜田(esoul@antiy.cn)
安天微电子与嵌入式安全研发中心总经理
Acknowledgements?致 谢
首先,我要感谢我的妻子和孩子让我花时间写这本书——也被称为“爸爸的又一篇学位论文”。如果没有他们的支持,就不可能完成这本书。
感谢技术编辑Vivek Ramachandran给予我信息安全和写作上的宝贵建议,我对他能在百忙之中同意做这本书的技术编辑而感激不尽。
感谢和我一起创作的搭档T.J. O’Connor和Jayson Street,感谢他们在这本书构思之中提供的建议和对我的鼓励。
最后,要感谢高档安全会议的组织者们,是他们提供了论坛,让我能与他人分享信息安全方面点点滴滴的奇思妙想。特别要感谢44CON会议的 Steve Lord和Adrian from,GrrCON 会议的Chris和 Jaime Payne允许我这个当初一文不名的毛头小子登台演讲,后来又给予我特殊的关照,让我多次在他们的会议上发言。
作?者?简?介?About the Author
Philip Polstra博士(他的伙伴称他为Phil博士)是世界著名的硬件黑客。他在全球多个国际会议上展示过研究成果,包括:DEF CON、 BlackHat、44CON、GrrCON、MakerFaire、ForenSecure以及一些其他的顶级会议。Polstra博士是著名的USB取证专家,在这方面发表了多篇文章。
在美国中西部的一所私立大学担任教授和专职黑客期间,Polstra博士开发了数字取证和道德黑客学位课程。他目前在布鲁斯伯格大学教授计算机科学和数字取证。除了教学之外,他还以咨询的方式提供训练和进行渗透测试。工作之外,他在驾驶飞机、制造飞行器、鼓捣电子方面也很有名气。访问他的博客http://polstra.org可以了解他最近的活动,也可以在推特上关注他:@ ppolstra。
Contents?目 录
推荐序
译者序
致谢
作者简介
第1章 初识Deck 1
1.1 引子 1
1.2 Deck 2
1.2.1 运行Deck的设备 3
1.2.2 渗透测试工具集 3
1.2.3 操作模式 5
1.3 本章小结 9
第2章 认识Beagle系统板 10
2.1 引子 10
2.2 德州仪器公司的设备 11
2.2.1 BeagleBoard-xM 11
2.2.2 BeagleBone 13
2.2.3 BeagleBone Black 16
2.3 本章小结 18
第3章 安装一个基础操作系统 20
3.1 引子 20
3.1.1 非Linux选择 20
3.1.2 基于Linux方案的选择 23
3.2 渗透测试Linux发行版本所需的功能特性 32
3.3 基于Ubuntu方案的选项 33
3.3.1 Ubuntu变种 33
3.3.2 内核的选择 34
3.4 创建一个microSD卡 34
3.5 本章小结 35
3.6 本章附录:深入分析安装脚本 35
第4章 打造工具箱 44
4.1 引子 44
4.2 添加图形桌面环境 44
4.3 以简单方式添加工具 50
4.3.1 使用软件仓库 50
4.3.2 使用软件包 53
4.4 以复杂方式添加工具 57
4.4.1 本地编译 58
4.4.2 简单的交叉编译 58
4.4.3 基于Eclipse的交叉编译 59
4.4.4 自动化源码构建 66
4.4.5 安装Python工具 69
4.4.6 安装Ruby 70
4.5 入门级工具集 70
4.5.1 无线破解 70
4.5.2 密码破解 72
4.5.3 扫描器 73
4.5.4 Python工具 73
4.5.5 Metasploit 74
4.6 本章小结 76
第5章 为Deck供电 77
5.1 引子 77
5.2 电源需求 78
5.3 电源 80
5.3.1 市电供电 81
5.3.2 USB供电 82
5.3.3 电池供电 83
5.3.4 太阳能供电 85
5.4 降低功耗 86
5.5 使用单个攻击机的渗透测试 88
5.5.1 连上无线 89
5.5.2 看看能找到什么 91
5.5.3 寻找漏洞 93
5.5.4 漏洞利用 95
5.5.5 攻击密码 98
5.5.6 检测其他安全问题 101
5.6 本章小结 101
第6章 输入和输出设备 102
6.1 引子 102
6.2 显示方式的选择 102
6.2.1 传统显示器 103
6.2.2 直接连接的显示设备 103
6.3 键盘和鼠标 105
6.4 IEEE 802.11无线 105
6.5 IEEE 802.15.4无线 106
6.6 网络集线器和交换机 107
6.7 BeagleBone Cape扩展板 108
6.7.1 XBee Mini-Cape 109
6.7.2 XBee Cape 112
6.8 用单个远程攻击机进行的渗透测试 118
6.8.1 连上无线网络 118
6.8.2 看看能找到什么 123
6.8.3 寻找漏洞 125
6.8.4 漏洞利用 127
6.8.5 攻击密码并检测其他安全问题 128
6.9 本章小结 128
第7章 组建机器战队 129
7.1 引子 129
7.2 使用IEEE 802.15.4组网 130
7.2.1 点对多点网络 130
7.2.2 网状网络 132
7.3 配置IEEE 802.15.4猫 133
7.3.1 系列XBee猫的配置 135
7.3.2 系列XBee猫的配置 136
7.4 简单的远程控制方式 140
7.5 用Python远程控制 141
7.6 降低能耗 156
7.7 提高安全性 158
7.8 扩大控制范围 161
7.8.1 IEEE 802.15.4路由器 161
7.8.2 IEEE 802.15.4网关 161
7.9 用多个攻击机进行渗透测试 161
7.9.1 Phil’s Fun and Edutainment公司介绍 162
7.9.2 规划攻击 162
7.9.3 配置设备 163
7.9.4 执行测试攻击 164
7.10 本章小结 174
第8章 隐藏机器战队 175
8.1 引子 175
8.2 隐藏设备 176
8.2.1 把设备藏到自然界物体里 176
8.2.2 在建筑的里边和周围隐藏设备 177
8.2.3 用玩具和装饰物隐藏设备 182
8.3 安装设备 185
8.3.1 最初的安装 186
8.3.2 维护设备 188
8.3.3 移除设备 188
8.4 本章小结 188
第9章 增加空中支援 189
9.1 引子 189
9.2 构建AirDeck 189
9.2.1 选择飞行平台 190
9.2.2 单一路由功能方案 191
9.2.3 全功能的攻击机和路由器 192
9.3 使用空中攻击机 193
9.3.1 单路由功能的使用 193
9.3.2 使用AirDeck 194
9.3.3 节约电能 194
9.4 其他飞行器 196
9.4.1 四旋翼直升机 197
9.4.2 进一步改进飞行器 197
9.5 本章小结 198
第10章 展望未来 199
10.1 引子 199
10.2 Deck系统的最新进展 199
10.3 关于Cape的想法 200
10.4 Deck向其他平台的移植 200
10.5 用单片机实现超低功耗 201
10.6 结束语 201
第1章
初识Deck
本章内容:
Deck——一种定制的Linux发行版
几款运行Linux的小型计算机系统板
标准渗透测试工具集
渗透测试的台式机
投置机——从内部攻击
攻击机——用多个设备从远处攻击
1.1 引子
我们生活在一个日益数字化的世界,这个世界里联网设备不断增加。为了在全球一体化的经济中保持竞争力,世界各地的业务一刻也离不开计算机、平板电脑、智能手机以及其他数字设备。并且越来越多的业务与互联网密切相关。新连接到互联网的设备,不出几分钟就可能遭到恶意个人或组织的攻击。因此,对信息安全(information security,infosec)专业人才的需求十分强劲,其中渗透测试人员(penetration testers, pentester)尤其抢手。
既然正在读这本书,想必你已经知道渗透测试意味着什么。渗透测试是受客户委托所进行的得到授权的黑客活动,目的是查明客户的数字安全系统被渗透的难度,以及如何改进客户的安全态势。对渗透测试的需求引出了一些专用Linux发行版的产生。迄今为止,这些定制Linux发行版无一例外地运行在基于Intel(或AMD)处理器的台式机或笔记本上,由单个渗透测试员操作使用。
打消顾虑
在开始本章的正题之前,这里先给读者建立一下信心。本书假设读者理解渗透测试的一般概念,并且了解Linux的使用,除此之外,阅读本书并不需要其他额外基础。读者不必是出类拔萃的黑客(当然如果您是这样的精英,那就更棒了!)或者资深Linux用户或系统管理员。特别强调的是,读者不需要有硬件基础。虽然本书为动手定制电路板之类的读者提供了大量信息,但书中所说的全部物品都可以直接买到成品。
如果是初次接触硬件黑客的概念,读者可以酌情挑战不同的难度级别。若选择实用主义的保险路线,完全可以购买商品化的成品BeagleBone “马夹”——?cape(直接插到BeagleBone上的扩展板,详见http://beagleboard.org/cape);如果决定深入学习相应的技能,那么可以按照本书后续的讲解,给买来的XBee适配器(例如,Adafruit 适配器,见http://www.adafruit.com/products/126)焊接上4根导线,自己制作一个迷你cape。甚至对于想要自己动手刻蚀专用印刷电路板的高级读者,本书也提供了相应的信息。所以说,要进行本书所介绍的渗透测试,既可以完全避开硬件制作,也可以一切都自己动手制作,无论采用哪种方式都不会影响渗透测试的威力!
1.2 Deck
Deck是本书所介绍的Linux发行版,它给渗透测试员提供了一种运行在基于ARM的低功耗系统上的操作系统,从而打破了传统的渗透测试模式。运行该系统的硬件是由非盈利组织BeagleBone.org基金会开发的(下一章将详细介绍,如果想要快速了解,可以参考http://beagleboard.org/Getting%20Started)。运行Deck的设备更易于隐藏并且可以采用电池供电。本书成稿时Deck系统已经包含1600个软件包,成为非常适合于渗透测试的系统。Deck系统极度灵活,完全适用于传统的台式机、投置机,以及远程破解攻击机。
名字的含义
Deck
如果读者也是科幻小说爱好者,可能已经将Deck名字的由来猜得差不多了。这里Deck既用来指本书介绍的定制Linux发行版,也指运行Deck系统的设备。在1984年威廉·吉布森的经典科幻小说《神经浪游者》(《Neuromancer》)中,网络牛仔使用的连接到互联网的计算机终端被称为“punch deck”。吉布森描绘了其中所有设备都连接到互联网的未来世界。在本书作者心中,那些Beagle板子以及类似的小型、低功耗、廉价的设备代表着渗透测试的未来。把这个系统称作Deck算是向吉布森致敬吧。此外,BeagleBone的大小与一副扑克牌差不多。
1.2.1 运行Deck的设备
图1.1中的设备都在运行Deck系统。在本书写作时,Deck能够运行在Beagle家族的三种设备上:BeagleBoardxM、BeagleBone和BeagleBone Black。下一章将对这些系统板进行充分的介绍。读者可以参考BeagleBoard网站(http://beagleboard.org)得到进一步的信息。在此,我们仅需知道它们是基于运行频率高达1GHz的ARM Cortex-A8处理器的系统板就行了。尽管它们具有台式机的性能,但是它们的功耗只相当于Intel或AMD计算机的一个零头。即使在驱动7寸触摸屏(例如http://elinux.org/Beagleboard:BeagleBone_LCD7)和外部无线网卡时,一个10W(2A,5V)的电源也足够了。与此相比,那些笔记本和台式机的功率瓦数则高达3位数甚至4位数。
1.2.2 渗透测试工具集
Deck包含大量的渗透测试工具。设计理念是每个可能会用到的工具都应该包含进来,以确保在使用时无须下载额外的软件包。在渗透测试行动中给攻击机安装新的软件包很困难,轻则要费很大劲,重则完全没法装。一些面向台式机的渗透测试Linux发行版经常带有许多不常用的陈旧软件包。Deck中的每个软件包都是经过精心评估才包含进来的,引入一个新软件包所导致的任何冗余部分都会被剔除掉。这里将介绍一些比较常用的软件工具。
现在,无线网络应用十分普遍,所以许多渗透测试都从破解无线网络开始。因此Deck系统包含了aircrack-ng套件。airodump-ng工具用来捕包和分析,捕获的数据包可以转给aircrack-ng进行解密。图1.2和图1.3分别给出了airodump-ng和aircrack-ng的截屏。关于aircrack-ng组件使用的更多细节将在后续章节介绍。
图1.2 使用airodump-ng捕获和分析无线数据包
图1.3 用aircrack-ng成功破解
即使在用户不使用无线网的情况下,aircrack-ng组件也很有用,它可以用来检测和破解用户网络中可能存在的非法私接的无线AP(access point,接入点)。Deck中还包含了一个叫作Fern WiFi Cracker的无线破解工具,它是那种可以用鼠标来操作的易用工具。图1.4给出了使用Fern成功破解的截图。渗透测试新手可能觉得Fern十分好用。由于交互性操作的特点,aircrack-ng和Fern都不适用于我们的无人值守的破解攻击机。因此,Deck收录了Scapy Python(http://www.secdev.org/projects/scapy/)工具。
图1.4 使用Fern成功破解
不管是有线网络数据包还是无线网络数据包,对于渗透测试人员,它们都有重要价值。Deck包含了Wireshark(http://www.wireshark.org/),用来抓包和对数据包进行分析。Deck也提供了一个称作Nmap(http://nmap.org/)的标准网络映射工具,用于发现目标网络上的服务和主机。Metasploit(http://www.metasploit.com/)是包含一组漏洞扫描器和漏洞利用框架的工具,也是标准版本Deck的组件之一。上述工具见图1.5。
Metasploit是由Rapid 7(http://www.rapid7.com/)维护的很流行的工具,有大量关于它的书籍、培训课程、视频教程。Offensive Security还发布了一本在线图书《Metasploit Unleashed》(http://www.offensive-security.com/metasploit-unleashed/Main_Page),这是可以免费获得的学习资料(当然我们鼓励读者向Hackers for Charity捐赠)。Metasploit号称是个框架并且带有大量的漏洞,这些漏洞可用于从几百个攻击载荷中选择要传送的载荷。Metasploit能在脚本中运行,也能开启交互操作的控制台,还可以通过Web界面操作。本书不会全面介绍Metasploit,建议对其不了解的读者进一步学习这个了不起的工具。
图1.5 Wireshark、Nmap、Nikto和Metasploit
破解用户密码经常是渗透测试的工作之一。Deck带有若干在线密码破解器、离线密码破解器,以及密码字典。其中一个称作Hydra的在线密码破解工具如图1.6所示。此外还有大量的其他工具被集成在Deck中,其中不容忽视的是一组Python库。这些工具包中的有些组件将在本书后面的实例分析中重点说明。
图1.6 Hydra在线密码破解器
1.2.3 操作模式
Deck的强项之一就是它既能作为传统的图形用户界面的桌面系统使用,又能用于渗透行动的投置机,而且还能作为破解攻击机的系统。在这几种应用模式之间切换完全无需任何软件改动。这个特性极大地增加了渗透测试的灵活性。操作员可以携带多个相同的Deck设备到达渗透测试地点,现场酌情选择合适的电源或其他选项(比如无线网卡、802.15.4猫等)。而不需要按照渗透测试工作站、投置机或攻击机分别准备设备,如果那样的话,有可能到现场才发现有些类型的设备根本用不上。
Deck作为桌面系统
Deck于2012年9月在伦敦召开的44CON大会上首次亮相。当时它只能运行在BeagleBoard-xM上,展示了两种配置。第一种是作为以显示器、键盘、鼠标操作的桌面系统。另一种是带有7寸触摸屏和紧凑型演讲键鼠外设的配置。我在44CON大会上说这样的设备可以轻松放进孩子的午餐盒中。会后我回到家看到巴斯光年便当盒,于是就发明了渗透测试餐盒。之所以选择巴斯光年是因为,使用这个强大的渗透测试餐盒,你将在破解中超越极限,所向披靡!图1.7展示了这些装置。
自2012年9月发布以来,先后制作了几种桌面配置的Deck系统。其中一种带有7寸触摸屏、Alfa无线网卡(颤音摇杆被替换成了5dB天线)、一个RFID读卡器,这些都装到视频游戏吉他中。这个绰号为“haxtar”的系统看起来像个玩具,很容易被当作没有任何危害的东西让人放松警惕。实际上,它是一个强大的便携式渗透测试系统。由于配有背带甚至可以站着使用,用一个无线演讲键鼠组合作为输入装置。haxtar里边还有充足的空间可以容纳802.15.4模块和蓝牙。haxtar如图1.7所示。
2013年4月,BeagleBoard组织发布了新的板子——BeagleBone Black(BBB)版。这个新系统的处理能力和BeagleBoard-xM(BB-xM)相当,但价格只有BB-xM的三分之一。与最初的BeagleBone不同,BeagleBone Black带有HDMI输出,很适合作为桌面系统使用。两个版本的BeagleBone都和BeagleBoard-xM一样能直接连接到触摸屏。由于最初的BeagleBone计算能力不如BeagleBoard-xM或BeagleBone Black,所以不太建议用它作为桌面系统。图1.7给出了一个运行桌面系统的BeagleBone Black板。
机缘巧合
Deck系统的由来
在各种场合经常有人问Deck系统的创意源自何处。在开发Deck系统之前,我做了大量关于USB大容量存储设备取证方面的工作。在此过程中,我有幸于2011年9月在伦敦召开的44CON会议上演示了基于单片机的袖珍USB存储取证拷贝器。当时所采用的单片机的一个局限就是它不支持高速USB。这意味所开发的设备很适合拷贝U盘,但对于像移动硬盘这样的大容量存储媒体则太慢了。所以我想重新开发支持高速USB的取证系统。
幸运的是,在2011年夏天底特律的Maker Faire盛会上,我展示基于单片机的设备。碰巧我的展台紧挨着BeagleBoard.org基金会Jason Kridner的展台。当时BeagleBoard-xM刚发布,那两天展览上,Jason正在做十分吸引人的演示。那是我第一次听说BeagleBoard,但是一下子就看到了这款小板子的巨大潜力,于是就把它记在心里以备将来在项目中使用。
当决定把我的USB工具升级到支持高速USB时,BeagleBoard-xM自然成为最佳方案。于是就开始研究BeagleBoard-xM。很快我意识到,这么强的硬件只用来做取证的拷贝器实在太浪费了。我决定用它开发一个渗透测试工具。在这之前我一直在做自己的Linux发行版。这个渗透测试的工具的制作让我如痴如醉,以至于都把取证功能的事抛在脑后了。后来取证功能被做成了一个叫作4Deck的模块,2012年9月与Deck 1.0同时发布。
Deck用作投置机
这里所说的投置机(dropbox)是指在渗透测试中可以被植入到目标组织中的小型硬件设备。理想情况下,这些设备成本应该足够低廉,所以偶尔丢几个不至于太心疼。可是那些商品化的投置机售价高达1000美元,甚至更高,即使弄丢一个也是有重大经济损失。除了价格太高之外,许多商品化的投置机还有一些其他局限。
许多低成本的设备要么利用目标网络回传数据,要么需要将物理设备取回来提取所采集的数据。用目标网络回传数据可能会导致投置机暴露。对于那种只能将数据存在内置存储器的投置机,则渗透测试员只能等到拿回来才能获得数据。而且一旦设备被发现,那就连设备带信息都损失了。反复去现场接触投置机也会增加被发现的风险。
高端的商业投置机使用4G/GSM蜂窝网络提取数据。这倒是具有不占用目标网络带宽的优势,但也有缺点。在一些国家,4G/GSM服务很贵,还有可能信号覆盖不好,甚至在渗透测试的地点根本就没信号。还有一些国家的法律法规使得投置机难以获得4G/GSM服务。即使在法律法规不那么严的地方,管理众多的账户和对应的SIM卡也很快就成了管理员的噩梦。使用4G/GSM时,为了节约通信费所采用的数据缓存和数据压缩也会带来额外的复杂性。
许多投置机的另一个限制是它们缺少标准的渗透测试工具。部分原因是它们存储容量有限,并且计算能力不足,无法运行像Metasploit这样的强大工具。Deck则截然不同,它拥有桌面渗透测试系统所具有的全部工具。
用运行Deck操作系统的BeagleBone制作的投置机完全没有上述限制。BeagleBone体积小,能用电池供电,这就使它易于隐藏。报价45美元一个,BeagleBone Black足够便宜,偶尔损失一个不至于太心疼。配备IEEE 802.15.4无线通信后,投置机无需4G/GSM服务就能向远在一英里(约1.6公里)的地方传输数据。如前文所述,Deck系统具有其他投置机所不具备的大量的工具软件。
Deck作为破解攻击机
一提到投置机,人们往往想到的是利用社会工程活动突破目标的保安,把设备藏到目标设施中去。在传统渗透测试模型中,测试员可能用一个或几个投置机收集数据并且执行一些简单命令,但是主体工作是在他的笔记本电脑上进行的。本书给出一种新的工作模型,在这种模型下,破解活动是分布在多个设备上进行的,这些设备我们称作破解攻击机,它们接受渗透测试员控制台发出的命令,并且将结果反馈回控制台。
投置机和破解攻击机之间的界限似乎不那么清晰。确实如此,只要具有IEEE 802.15.4连接,运行Deck的投置机也可以像攻击机那样接受命令。由于低功耗的优势,运行Deck系统的设备能用电池供电,所以有可能被放到目标系统的安保半径之外工作。从而无需社会工程活动进入客户的环境内部,从而大大降低了人员被怀疑的可能性。
说到这里,你已经完全可以带着一组带有IEEE 802.15.4猫的BeagleBone这样的小设备去进行渗透测试了,但是好处还不止于此。体积小、重量轻还能催生出许多有趣又有用的其他潜在用法。例如图1.8中的Dalek desktop defender的玩具里面带有一个破解攻击机。(也可以算作投置机吧?)玩具内部有足够空间容纳BeagleBone、Alfa无线网卡和IEEE 802.15.4猫。被称为AirDeck的无人机载攻击机也出现在了图1.8中。当无法物理接近目标时,AirDeck可用来做初始侦查或降落在房顶上进行渗透测试。
使用攻击机的另一个好处是可以增加测试员和客户环境的距离。车停在别人办公室外边,上边耸立着高增益定向天线,在车里一坐一整天,这样的行为显得相当可疑。相比之下,要是能坐在客户所在街道另一端酒店的游泳池边就能进行渗透测试则太惬意了。使用攻击机的另一个好处是它们能每天24小时地为你工作。而在传统渗透测试模型中,夜间休息时工作基本上不会有什么进展。本书的后续章节会给出关于制作和使用攻击机的全部细节。
机缘巧合
破解攻击机创意的由来
Deck系统名字的由来是我被问到最多的问题,而其次经常被问及的就是我是如何想到破解攻击机的。实话实说,答案是有一天我在家里的工作室看到了一些闲置零件,我注意到其中有几个IEEE 802.15.4(XBee)适配器。这些XBee无线模块最初是我为某个为期13天的单片机课程项目准备的,这是我所工作的大学的课程。最终这些东西没有用上,刚好我的工作台上还有几个多余的早期版本的BeagleBone。
Deck系统本来是为BeagleBoard-xM(BB-xM)而设计的,但我知道它能不做任何改动而运行在BeagleBone上。原始版的BeagleBone的处理器稍微慢一些,并且只有BB-xM一半大小的内存,也没有内置视频输出口。当时XBee对于我来说还是新奇的东西,于是我把XBee接到BeagleBone上,想用这些被我闲置的硬件做些有用的东西,并且找点有趣的事拿XBee练练手。在我制作第一个破解攻击机的时候,我意识到了用攻击机进行渗透测试有巨大的潜力。
我认为能把一组攻击机、电池以及其他附件都放到一个背包中是个绝妙的主意。我经常带着全部家当乘飞机去参加会议,它们包括多达8个带有完整电池和附件的攻击机、一部笔记本电脑,以及一部平板电脑,这些统统装到一个小旅行包或一个手提箱中。轻松配置设备并满足渗透测试需求,我觉得这真的是很强的功能。而且,一个额外的好处是这些设备实际上又价格低廉,特别是当功能更强、价格却只有BeagleBone一半的BeagleBone Black板子发布后。
1.3 本章小结
本章对一种为渗透测试定制的Linux发行版——Deck进行了简要介绍,它运行在BeagleBoard和BeagleBone家族的ARM设备上。Deck是包含有1600多个软件包的强大的、完整的操作系统。运行Deck的设备无需做软件改动就可以用作桌面系统、投置机或攻击机。配备了IEEE 802.15.4无线的攻击机可以在一英里远的距离上接受命令。运行Deck的设备可以呈现不同的外观,包括裸的计算机系统板、隐藏了功能的普通办公用品,或者无线遥控飞机。
下一章将更仔细地审视BeagleBoard和BeagleBone家族的设备。我将分析它们的历史、差异和功能,并且将讨论它们的基本操作方法。
第2章
认识Beagle系统板
本章内容:
开放硬件
BeagleBoard-xM——开放硬件的台式机替代品
BeagleBone——威力远超单片机的单板计算机
BeagleBone Black——两个世界的最佳选择
2.1 引子
设想一下某天你突发灵感,想要对某种日常必须使用的设备做某方面的改进。可是,大多数设备都是有专利和版权保护的,更糟糕的是,在美国分析某个产品的工作原理是违法的,这叫作逆向工程。许多公司都在最终用户许可协议中加入了相应的条款,以阻止对其产品的逆向工程。考虑到法律问题,你还是忘掉你的创新吧,让本可以更好的生活一如从前,得过且过吧。
总有一些人,包括本书作者,觉得这样的情况是无法忍受的。想象一下,有一个美好世界,在那儿针对任何设备都能得到想了解的任何事情;在那儿所有的设计都有详细的文档说明,能够随意地用来对设备进行改进或修改;在这个理想国度,一个设计甚至可以整个引用另一个设计,而完全不用担心会摊上官司。这就是开放硬件(有时也称作开源硬件)的世界。
开放硬件更利于整个社会的快速进步。已经存在像Arduino(http://arduino.cc)、开源3-D打印机(例如:http://reprap.org),甚至开源卫星这样的开放原型平台。开放一个硬件的设计为更多人参与进来改进它创造了机会。虽听起来违背直觉,但实际上设计和制造开放硬件的公司也能盈利。只要看一下Arduino的数目庞大的项目和强有力的社区支持,就能知道开源项目会有多成功了。开放硬件设计能够更好地展示各种元器件的功能。
2.2 德州仪器公司的设备
一定程度上是为了展示和推广公司的芯片,德州仪器(TI)允许某些员工开发和推广使用TI公司产品的开放硬件计算机板(详细内容请参考http://beagleboard.org/about)。这些计算机系统板是由叫作BeagleBoard.org基金会的美国非盈利公司开发的。本书成稿之时,两位TI的员工为BeagleBoard.org基金会做了大量的努力——Jason Kridner担任社区的管理员,Gerald Coley负责硬件设计。
2.2.1 BeagleBoard-xM
BeagleBoard.org开发的最早的板子叫作BeagleBoard,于2008年7月发布,现在还能买到。这个板子基于TI公司720MHz的OMAP3530 Cortex-A8处理器,配备256MB RAM、256MB闪存、HDMI视频和S-Video视频输出、USB On-The-Go接口、USB host接口、SD卡插槽、RS-232接口,以及立体声音频输出口。这个75mm×75mm的计算机板标价125美元。
2010年9月升级的板子命名为BeagleBoard-xM,被称作售价149美元的、能当作台式机的系统板(见图2.1)。这里根据《BeagleBoard-xM系统参考手册》来总结一下它的特点,完整的手册可从http://circuitco.com/support/index.php?title=BeagleBoard-xM#Rev_C2
取得。
德州仪器号称BeagleBoard-xM所采用的1GHz的DM3730处理器是数字媒体处理器(详见http://www.ti.com/product/dm3730)。这个处理器带有NEON SIMD协处理器,能够显著加速多媒体应用和数学计算(http://www.arm.com/products/processors/technologies/neon.php)。这个处理器采用层叠封装(PoP,Package-on-Package),512MB的RAM芯片被装到处理器芯片的上边。这个处理器足以运行全功能的Linux系统和标准的渗透测试工具。图2.2和图2.3是BeagleBoard-xM的照片。
图2.2 BeagleBoard-xM的正面 图2.3 BeagleBoard-xM的背面
BeagleBoard-xM的电源管理和音频是由德州仪器的TPS65950芯片实现的,电源和音频结合到一片集成电路上似乎很怪异,这是因为该芯片设计目标是配套嵌入式应用处理器使用,在这样的应用场合降低芯片个数是重要的目标。有了TPS65950,BeagleBoard-xM就能通过USB OTG连接PC来供电。但当使用多种外设以及LCD触摸屏时不推荐这种供电方式,因为PC的USB口提供的功率有可能不够。当使用大功率USB外设时,可以用Y形USB电缆、带外部供电的USB集线器,或者外部5V(2A)的电源供电。
BeagleBoard-xM有4个USB 2.0 host接口,当使用直流电源口而不是USB OTG接口供电时,每一个USB host接口能提供高达500mA的供电能力。《System Reference Manual》推荐当所有的设备都工作起来时,要使用3A的电源供电。根据作者的经验,驱动1W Alfa无线网卡工作时,2A的电源足够了。这些host接口完全支持USB 2.0的三种速度(低速、全速、高速)。
在视频输出方面,BeagleBoard-xM提供S-Video、经HDMI插座输出的DVI-D,以及LCD触摸屏三种方式。S-Video可用来连接NTSC(默认制式)或PAL制式的电视。板子可以配置成向S-Video和DVI-D输出不同的显示内容。板上的标准HDMI插座可以连接数字显示器或电视。除了电缆里没有音频信号,DVI-D协议实际上和HDMI是相同的。Enhanced Display ID(EDID)或者Display Data Channel(DDC2B)用来正确识别所连接显示器的视频配置。建议在给BeagleBoard-xM上电前连接好显示器,以避免电涌冲击,这种冲击有可能损坏板子,而且这样也能让系统正确识别显示器。BeagleBoard-xM上一对0.05英寸2×10的插针可以连接LCD屏幕,比如像上一章餐盒计算机上的7寸触摸屏(http://elinux.org/Beagleboard:BeagleBone_LCD7)。
BeagleBoard-xM带有一个microSD卡槽,支持高容量microSD卡。这主要用来容纳操作系统,当然也可以买一个更大容量的卡来存储数据,这就省去了连接USB大容量存储设备了(不说别的,大容量存储至少会增加电源负担)。买microSD卡的时候,多花点钱买个class 10的绝对是值得的。class 4的或class 6的用起来明显感觉对性能有影响。BeagleBoard-xM与microSD的通信采用4位宽,20MHz的时钟。
BeagleBoard-xM配备2个按键和6个LED方便用户交互。一个按键用于热复位,另一个便于用户自定义。5个绿色LED的功能如下:前2个分别表示板子上电和USB集线器上电;后3个可由I2C或GPIO编程控制。还有一个红色的会在直流电源输入偏离5V时点亮,表明过压或欠压。虽然处理器和大部分电路都工作在3.3V,但5V对于USB电路工作是必需的。
BeagleBoard-xM带有集成的快速以太网(100Mbps)接口。以太网口由SMSC LAN9514芯片实现,它还包括USB集线器用来实现4个USB host接口。需要注意一件很重要的事情,这个芯片每次启动产生不同的MAC地址,这很可能导致使用DHCP的时候得到不同IP地址。
BeagleBoard-xM上还有一些其他的在破解和渗透测试中不太会用到的接口。一个JTAG接口用于板子测试和调试。还有一个DB9 RS-232串口用来连接一些老的设备或者用作串行控制台。还可以通过板上的一个专用连接器连接一个摄像头模块。有几个扩展口引出了GPIO和其他功能。
强烈推荐给BeagleBoard-xM板子配上外壳保护,比如像图2.4那样的外壳。从Special Computing(http://specialcomp.com)提供的简单亚克力外壳到eSawdust(http://www.esawdust.com/product/encl-dh-xm/)的金属壳,有多种外壳可供选择。至少要用带有铜柱的亚克力片(或其他不导电材料)保护一下,以防在导体上带电检修时短路。
2.2.2 BeagleBone
BeagleBone于2011年万圣节(10月31日)发布(http://beagleboard.org/Products/BeagleBone)。2009年Arduino Duemilanove(http://arduino.cc)发布之后,很多人开始对用微控制器搭建自己的电子设备感兴趣。可能有人不熟悉Arduino,它是另一个开源硬件项目。这个板子售价不到35美元,发布后,很快就围绕它形成了一个社区。通过可以接插扩展板(shield)的硬件和带有大量功能库、易于使用的编程环境,Arduino把单片机引入到了非技术群体。虽然可以用基于16MHz 8位AVR单片机的Arduino做很多事情,但一些项目需要更强的计算能力,这正是BeagleBone大显身手的地方。
BeagleBone可以看作是一个威力大大加强的“类Arduino”板。很多Arduino那 16MHz 8位单片机无能为力的情况,德州仪器的主频达720MHz的32位Cortex-A8处理器则游刃有余。除了提升通用计算和数学处理的能力之外,BeagleBone还能运行完整的操作系统(Arduino的处理能力只够运行一个装载到其中的程序)。与Arduino类似,它也被设计成能够使用扩展板。每个板子的扩展插针的布局不一样。BeagleBone的扩展板叫作“马夹”——cape,它们经常在以太网口的地方开个豁口,样子很像一个马夹,这个称呼显得尤为形象。BeagleBone如图2.5和图2.6所示。
图2.5 BeagleBone的正面 图2.6 BeagleBone的背面
以下信息来自于《BeagleBone System Reference Manual》,该手册可以从http://circuitco.com/support/index.php?title?BeagleBone#Rev_A6A获取。与BeagleBoard-xM相似,BeagleBone也采用Cortex-A8处理器,但芯片封装不同,运行速度稍慢。最大的好处是BeagleBoard-xM能运行的操作系统和软件它都能运行。要知道,BeagleBoard诞生至今,已有大量的操作系统和软件可用。
BeagleBone载有256MB DDR2内存,只有BeagleBoard-xM内存量的一半,这在运行某些大软件(例如Metasploit框架)时可能会有问题。但这与Arduino 2K 的RAM相比还是很有优势的。BeagleBone的板名、版本和序列号等信息都存储在32KB(早期版本是4KB)板上的EEPROM中。其余大部分剩余EEPROM空间留给操作系统和应用软件使用。巧合的是Arduino也有32KB以flash实现的非易失存储,它用来存储bootloader和唯一的程序。
BeagleBone可由5V直流电源或USB供电。BeagleBone使用了TI公司的TPS65127B电源管理芯片。需要注意,当通过USB口供电时,为了确保板子运行和USB外设工作的电力充足,CPU速度被限制在了500MHz。推荐使用5±0.1V,1A的直流电源供电。
BeagleBone相对于Arduino的另一个强项在USB方面,它带有一个USB集线器,允许使用一条USB线带起多个USB设备。当BeagleBone连接到PC时,上位机会检测到一个调试串口、一个JTAG端口和一个USB0端口,这个USB0端口直接连到BeagleBone处理器上。当采用直流电源供电时,USB host端口能提供500mA,5V供电能力。当采用USB供电时,则USB host端口只能使用低功耗的设备,例如键盘鼠标等。
与BeagleBoard-xM一样,BeagleBone也有一个microSD插槽,因为BeagleBone没有內置存储,所以用microSD卡来存储操作系统和其他文件。microSD卡的读写是4位的(这是SD卡的标准)。BeagleBone支持3.3V的microSD卡,包括高容量卡。Arduino没有内置SD卡存储支持,如果不介意占用几个GPIO,有一些扩展板可以提供SD卡支持。
比起Arduino,BeagleBone的另一个优势是内建快速以太网。与BeagleBoard-xM不同,以太网是由专用的网络芯片实现的,而不是用USB实现的。采用的芯片是SMSC LAN8710A。因为这个不同,BeagleBone每次启动都会报告相同的MAC地址,会通过DHCP获得相同的IP地址。
扩展cape被通过46针的插头连接到BeagleBone上,最多可以同时堆叠4个cape,只要它们互相之间不冲突。难以想象有什么样的项目是BeagleBone实现不了的。它有66个可用的GPIO(而Arduino只有14个)。一个需要注意的要点是,BeagleBone的GPIO是3.3V的,而不是5V。BeagleBone支持一个带有背光的全功能LCD触摸屏。通过扩展插座上的处理器引脚,还可以扩展出一个额外的SD/MMC卡接口。
在嵌入式电子系统中有两种常用的串行外设互联标准:SPI和I2C。BeagleBone完全支持这两种标准,它有2路SPI和2路I2C接口。每一路都可以连接多个设备。其中第二路I2C必须小心使用,因为它被BeagleBone用来识别和配置扩展cape(后面会有详细说明)。Arduino只有1路SPI和1路I2C接口。
扩展插座上引出了4路串口,在破解攻击机应用中,可以用其中的一个连接IEEE 802.15.4无线。BeagleBone还支持2路CAN总线,这是一种在汽车上常用的低速但高可靠性的总线,在其他环境中也有应用。
定时器、模数转换器(ADC)、脉宽调制器(PWM)进一步提高了BeagleBone的扩展能力。4路定时器信号被输出到扩展插头上,这些定时器对于周期性工作或重启cape上的组件很有用。BeagleBone提供了7路每秒100 000次采样的ADC,可用来连接一组老式的模拟传感器。ADC是1.8V的,必须小心使用,因为这些信号直接连在处理器上。PWM可调节输出信号的占空比,常用来驱动步进电机或用来调节LED的亮度。
虽然没有制作cape的统一规则,但有一些最大化兼容性的推荐标准。为了使一款cape能够被Beagle产品经销商出售,板上至少要有一个EEPROM,BeagleBone以此来识别这个cape。前边所说的第2路I2C总线用于和EEPROM通信。需要2个跳线或拨码开关来设置EEPROM的I2C地址,使EEPROM互相不干扰,从而使系统支持多达4个堆叠的cape。
像BeagleBoard-xM的情况一样,也强烈建议为BeagleBone配上保护外壳。有一些像Special Computing(http://specialcomp.com)和Adafruit Industries(http://adafruit.com)这样厂商出售外壳。根据使用不同cape的情况,优化的外壳方案也不同。如果BeagleBone板子不是嵌入到其他东西里工作,至少要用铜柱固定上亚克力板或其他绝缘板以防短路。如果自己设计制作外壳,一定要使用最小的铜柱,因为板上的某些表贴原件离安装孔很近,很容易被碰坏。
到这里,读者应该明白为什么BeagleBone在这些铁杆硬件玩家中如此流行了吧。通过本书你会看到,BeagleBone还是一个功能强大、体积小巧的计算机系统,而接下来要介绍的新推出的升级版——BeagleBone Black则更胜一筹。
2.2.3 BeagleBone Black
虽然BeagleBone在推出时已经很具有颠覆性了,但随着技术的进步,后来又发布了一个更强大的版本,价格却降到原来的一半(相比于之前的89美元,它只要45美元),被称作BeagleBone Black版(缩写成BBB)。原始版本发布不到18个月,BeagleBone Black于2013年4月23日推出。成本下降主要得益于芯片数的压缩和大批量生产。图2.7和图2.8是BeagleBone Black。
除了价格更低,新版BeagleBone还有一些改进。处理器速度从720MHz提升到了1GHz;RAM从256MB翻倍到了512MB。BeagleBone Black使用DDR3内存,如今DDR3比原版BeagleBone所使用的DDR2要便宜。这里给出的BeagleBone Black的信息摘自《BeagleBone Black System Reference Manual》,手册可以从https://github.com/CircuitCo/BeagleBone-Black/blob/master/BBB_SRM.pdf下载。
图2.7 BeagleBone Black正面 图2.8 BeagleBone Black背面
为什么不用……
开源硬件的能力是有高下之分的
在世界各地的会议上做关于Deck的演讲时,经常有人问我“为什么不使用某某开源板子?”,这里的“某某板子”通常是树莓派(Raspberry Pi),碰巧它还不是开源的。简短的回答是树莓派不适合我们的情况,详细的解释请看下文。
树莓派没有BeagleBone Black功能强。实际上,即使是比树莓派更早的BeagleBone也要比它强。BeagleBone Black使用1GHz的现代Cortex-A8处理器,树莓派使用的是只有700MHz的BCM2835芯片。树莓派缺少运行像Metasploit这样强力渗透测试工具所需的处理能力。德州仪器自由地发布他们处理器芯片的信息,而Broadcom却要求签署NDA才能得到应用他们芯片的细节。Broadcom的芯片使用支持不够好的陈旧ARM6指令集。这限制了树莓派所能使用的操作系统。特别地,树莓派不能使用Ubuntu。像下一章介绍的,Deck是基于Ubuntu的。
树莓派也没有Beagle家族成熟。最早版本的BeagleBoard在2008年就已经交付了。BeagleBone到用户手里的时间比树莓派早了足足半年。甚至树莓派项目启动一年后,批量购买都还成问题。相比之下,BeagleBone Black发布后一周我就买了好几块板子,根本不用等几个月才能拿到。
尽管构建渗透测试硬件时价格并不是主要问题,但用树莓派构建完整系统则要比使用BeagleBone Black贵得多。当外壳、USB电缆、电源,以及扩展板都配齐时,两个板子本身报价的差异立即就消失殆尽了。另外,当买多个BeagleBone时,多数经销商都会提供折扣。
树莓派提供最多17个GPIO线(仅比Arduino多一点),而BeagleBone板可以提供66个GPIO线。树莓派采用的是很脆弱的插针,需要购买一个排线来连接其他硬件,相比之下BeagleBone则使用坚固的插针,可以在板上直接扩展cape。BeagleBone很易于实现紧凑(并且更可靠)的设计。
尽管树莓派的处理能力低,但它却比BeagleBone需要更多的电能。因为运行的软件不一样,很难给出有意义的电能比较。据说,根据经验测试(例如2013年5月19日发布的题为《树莓派(B型)功耗,低压测试》的文章,http://www.youtube.com/watch?v=4a_OCg9UZbo),树莓派消耗的功率是BeagleBone的150%~200%。既然我们要构建电池供电的设备,BeagleBone Black在同类产品中稳拔头筹。
说到这儿,显然树莓派并不是构建渗透测试的理想选择。本书成稿时,几个把Deck移植到其他ARM系统的实验正在进行中。这将评估是否要把这些平台纳入官方支持。这些移植的最新进展参见官方网站(http://philpolstra.com)和我的博客(http://polstra.org)。
BeagleBone Black带有2GB的eMMC非易失存储(本书写作时,正在讨论在后续版本扩展到4GB)。随机安装的Angstrom Linux系统安装在eMMC中(宣布不久后新板出厂的预装系统将是Debian Linux)。相比于microSD的4位接口,eMMC的接口是8位。由于板载eMMC的配置是已知的,可以最大限度根据其参数优化性能,而不用像microSD卡那样,只有卡插入后才能确定参数。出于这些原因,使用eMMC存储根文件系统时能够获得巨大的性能提升。不幸的是Deck系统高达6GB多的根文件系统太大了,无法存储在eMMC上。
BeagleBone Black一个最明显的变化是增加了microHDMI插座输出HDMI视频信号。HDMI支持是由NXP TDA19988 HDMI成帧器实现的。BeagleBone Black支持高达1920×1080的视频分辨率。BeagleBone Black默认使用EDID报告的最高分辨率。正因这个原因,在BeagleBone Black系统启动前连接并且打开显示器是很必要的。与BeagleBoard-xM不同,该接口支持包括音频在内完整的HDMI规范。只有Consumer Electronics Association(CEA)标准中的分辨率下才支持音频,因为所有高清电视都支持这些分辨率,所以为BeagleBone Black找到显示器完全不成问题。
然而,不像增加HDMI插座那么明显的变化是,BeagleBone Black也比原版更省电了。压缩掉了几个芯片导致所需的电流大大降低(差不多30%)。结果,基于BeagleBone Black的电池驱动的破解攻击机能够比基于旧版BeagleBone的运行更长的时间。
BeagleBoard.org团队尽可能让新版BeagleBone兼容原版。购买cape时,一定要确保是BeagleBone Black兼容的,可以到http://elinux.org/Beagleboard:BeagleBone_Capes检查兼容性。增加eMMC和HDMI导致几个原来在扩展口上可用的引脚,现在被BeagleBone自己占用了。用到这些被eMMC和HDMI占用引脚的cape则必须把相关的功能关掉才能工作。在我们的应用中这不是问题,因为Deck系统太大不能放到eMMC中,并且对于破解攻击机,HDMI输出并不需要。两个BeagleBone版本之间还有一些其他的差异,但都跟我们的渗透测试关系不大。关于这些差异的详细情况可以参考《System Reference Manual》。
如前所述,BeagleBone Black应该配上外壳或把它装到绝缘的材料里保护起来,以防短路。Adafruit(http://www.adafruit.com/category/75)出售小的亚克力外壳和能容纳一个BeagleBone加上几个cape的大外壳。大多数像Special Computing(https://specialcomp.com/beaglebone/)这样的其他BeagleBone商家也都有简单的亚克力外壳出售,价格差不多10美元。图2.9和图2.10展示了Special Computing的外壳。原版BeagleBone的外壳如果用电钻或类似的工具开个microHDMI插座的槽,也能用在新版BeagleBone上。如果读者想自己制作外壳,一定小心别用太大的铜柱,因为这有可能会碰坏靠近安装孔的元器件。
图2.9 装上Special Computing外壳的 图2.10 装上Special Computing外壳的
BeagleBone Black正面 BeagleBone Black背面
2.3 本章小结
表2.1给出了BeagleBone Black、原版BeagleBone和BeagleBoard-xM的差异。这些信息来自http://beagleboard.org/Products的图表。
通过阅读本章,读者了解了来自BeagleBoard.org的几款开放硬件小计算机系统板。149美元的BeagleBoard-xM可以用来构建外形紧凑、能源高效的渗透测试桌面系统。最新的BeagleBone Black只要45美元,却拥有几乎与BeagleBoard-xM同样的性能。无论作为渗透测试的桌面机还是攻击机都很适用。至此,已经介绍了Deck系统和它运行所依赖的硬件,下一章将深入到安装基础操作系统的详细过程中去。
表2.1 BeagleBone Black、原版BeagleBone和BeagleBoard-xM的比较
BeagleBone Black BeagleBone BeagleBoard-xM
处理器 AM3358
ARM Cortex-A8 AM3358
ARM Cortex-A8 DM3730
ARM Cortex-A8
最大CPU速度 1GHz 720MHz 1GHz
模拟引脚 7 7 0
数字引脚(电压) 65(3.3V) 65(3.3V) 53(1.8V)
内存 512MB DDR3 256MB DDR2 512MB LPDDR
USB HS USB client/host HS USB client/host 4 口HS USB hub,
USB OTG
视频 MicroHDMI、cape Cape DVI-D、S-Video
音频 通过HDMI输出 Cape 3.5mm插座
支持的接口 4xUART、8xPWM、LCD、GPMC、MMC1、2xSPI、2xI2C、A/D转换器、2xCAN总线、4个定时器 4xUART、8xPWM、LCD、GPMC、MMC1、2xSPI、2xI2C、A/D转换器、2xCAN总线、4个定时器、FTDI USB转串口、通过USB 的JTAG McBSP、DSS、I2C、UART、LCD、McSPI、PWM、JTAG、camera接口
报价 45美元 89美元 149美元
第3章
安装一个基础操作系统
本章内容:
Beagle系统板可用的操作系统
渗透测试的Linux发行版所需的功能特性
Ubuntu方案
新内核的变化
设备树
制作Beagle可用的microSD系统卡
3.1 引子
正如前一章学到的,BeagleBoard.org从2008年就已经开始发售开放硬件的开发板。本章将简要地考察BeagleBoard.org网站上列出的一些操作系统方案。在对这些可用的系统有了基本的感性认识之后,讨论了渗透测试的Linux发行版应该具备的特性。在选出合适的基础操作系统后,将讨论一些细节以及近期的内核变化对我们的决策产生的影响。最后,详细说明如何制作一张含有所选系统的microSD卡,并将它安装到Beagles上,以此作为本章的结尾。
3.1.1 非Linux选择
坦诚一点说,由于我们期望做出一些有黑客乐趣的,并且可以用于渗透测试的东西,所以几乎可以肯定,我们的终极选择一定是某个Linux版本。即便如此,出于完备性的考虑,这里仍想简短地介绍一下Beagles可用的一些非Linux系统方案,并以此证明这些开发板的超强的通用性。
Windows CE
你可能认为无法在一个开放硬件上运行一个专有操作系统,但是在这儿,真的做到了。如我们所知,BeagleBoard-xM和BeagleBone比很多运行Windows XP的设备拥有更强的计算能力,你也许会疑惑为什么不运行一个完整版本的Windows而是Windows CE(通常被称为WinCE,官方称谓是Windows Embedded Compact。)答案是Windows CE能够通过板级支持包(BPS)运行在ARM架构的设备上,而桌面版的Windows是不兼容ARM架构的。Adeneo(Adeneo Embedded)以德州仪器(Texas Instruments)提供的标准BSP为基础,创建了BeagleBoard-xM的BSP(http://www.adeneo-embedded.com/en/Products/BoardSupport-Packages/BeagleBoard)。根据BeagleBoard.org网站上的评论,人们更喜欢在Beagles上运行一些其他的东西(http://beagleboard.org/project/WinCE7+BSP+for+BeagleBoard-XM/)。如图3.1所示,Windows CE运行在使用7寸Chipsee液晶屏的BeagleBone Black上。
QNX
Beagle系列开发板可以运行QNX Neutrino 实时操作系统(RTOS)(http://www.qnx.com/products/neutrino-rtos/neutrino-rtos.html)。实时操作系统是用于那些系统响应时间确定、响应时间尽可能短的嵌入式设备的。一个典型的实时操作系统是轻量级的,并且通过对中断和定时器的支持来与硬件紧密结合。QNX的实时操作系统是一个以微内核设计为特色的系统。这家公司提供了几个参考设计以展示QNX Neutrino(http://www.qnx.com/products/reference-design/ti-reference-design.html)的兼容性。图3.2是运行在BeagleBoard上的QNX智能节能系统参考设计。
图3.1 Windows CE运行在使用7寸Chipsee 图3.2 运行在BeagleBoard上的QNX智能
液晶屏的BeagleBone Black上 节能系统参考设计
FreeBSD
FreeBSD是基于伯克利软件发行版(BSD)的Unix。Linux则基于System V(SysV)版本Unix的,System V是另一个主要的Unix分支。这两种Unix系统的差异足以让用户郁闷。BSD和SysV有很多一样的命令,但是命令参数经常是不一致的。一些安全社区认为BSD系统比SysV系统更安全。如果你是这种说法的支持者的话,很幸运,Beagle系列开发板可以运行FreeBSD(http://beagleboard.org/project/freebsd/)。图3.3所示的是一个运行着FressBSD的Bealge兼容开发板。
图3.3 Bealge兼容开发板运行的FreeBSD
StarterWare
StarterWare是一种什么样的操作系统?从技术角度来讲,它根本不算是一个操作系统。对于一些应用来说,一个完整的操作系统是不必要的。脱离操作系统可以让更多的性能用于应用本身,但这通常是有代价的。你可以想象一个操作系统就像一个漂亮的界面,能够把你从繁杂丑陋的硬件细节中拯救出来。例如,你可以把一个要存储的文件交给操作系统,它会决定使用哪个硬盘扇区,创建一个目录入口点,并且和硬盘控制器进行通信。德州仪器的StarterWare提供了一个功能集合库,这个库提供诸如USB、图形、SPI、GPIO、中断和网络支持,省得那些想要开发裸机应用程序的人一切从头做起。
Android
虽然Android最初是给移动电话开发的,但现在它也成了一种应用广泛的嵌入式操作系统。德州仪器为几个Android版本提供了开发工具包(http://www.ti.com/tool/androidsdk-sitara)。Circuitco公司在他们的网站上提供了安装Android的教程(http://circuitco.com/support/index.php?title=Android)。或许读者知道,Android是基于Linux内核的,很多命令在Android和Linux系统上都可以使用。闲话少说,接下来就讨论那些可以用于BeagleBoard.org开发板的、种类繁多的Linux系统吧。图3.4展现了一个配有Chipsee触控屏的BeagleBone Black运行Android的示例。
3.1.2 基于Linux方案的选择
毫不奇怪,作为最受欢迎的开源操作系统,Linux中的一些版本可用于Beagle系列的开放硬件。Linux被认为是一个由程序员为程序员设计的操作系统。Linux以充分发挥硬件性能而闻名,尤其是对于比较低端或者比较老旧的计算机硬件。当然,这并不是说Linux在高端硬件上运行得不够好。Windows用户不久前才脱离32位兼容模式运行应用程序的禁锢,而Linux系统的用户早在2001年就已经可以使用64位操作系统了。事实上,64位的Linux内核在AMD首款AMD64架构处理器发布的2年前就已经就绪了。
你可能会惊讶地发现,有那么多你使用的设备在默默地运行着Linux系统。许多网络设备运行Linux系统,一些定制化的Linux版本(如OpenWrt)专门被设计出来,用于替代商业产品出厂内置的Linux。众所周知,许多智能电视和其他现代化家电都在运行着Linux。在支持的平台种类数量方面,没有任何其他操作系统能与Linux相匹敌。
Linux在黑客用户群体里也是显而易见的赢家。Linux系统上有大量的安全工具。支持多平台的工具都是先在Linux系统上实现,然后才移植到其他操作系统平台上。协作式的开源环境滋养了那些不可或缺的安全工具的成长,例如支持监视模式和数据包注入的全功能的无线网卡驱动。Linux提供给用户很多选择:Linux有各种各样的脚本可用;用户可以从众多图形环境中自由选择,甚至可以完全放弃图形界面使用纯命令行;像文本编辑这样的常见任务,不同喜好的用户都有多个程序可用。
?ngstr?m
听到?ngstr?m这个词的时候,你也许会想到度量单位(10-10m),?ngstr?m是用来描述光的波长(颜色)和像原子、分子这样小东西的尺寸的。?ngstr?m发行版本也是一个不为人知的嵌入式Linux发行版(http://angstrom-distribution.org)。这个Linux发行版的开发者强调说它被叫作?ngstr?m发行版,而不是?ngstr?m Linux。?ngstr?m发行版本的特点总结如表3.1所示。
表3.1 ?ngstr?m发行版的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 好——为Beagle板子优化编译
opkg(和Debian上的dpkg类似)
一般
差——主要面向嵌入式
一般——少量用户形成的社区
用了专用工具
Beagle系列板子原厂内置,但不为普通用户所知
?ngstr?m发行版本预装在BeagleBoard.org出厂的每个设备上,从最开始的BeagleBoard到BeagleBone Black(在本书编写时,BeagleBoard.org刚刚宣布,未来发布的产品上可能预装Debian Linux)。如果了解BeagleBoard设计者的背景,以及在2008年最原始版本的BeagleBoard发布时ARM设备的支持情况,你就不会惊讶为什么选择?ngstr?m发行版本作为默认预装的系统了。多数Linux桌面用户可能不熟悉这个发行版本。虽然?ngstr?m发行版预装在所有的Beagle上,为了让读者能更好地了解这个发行版的风格,这里还是简要地说一下构建?ngstr?m发行版的步骤吧。
通常嵌入式系统软件(包括操作系统)是在一台更为强大的桌面系统下构建的。这个过程被称为交叉编译(更多细节将在下一章讨论)。采用交叉编译的最主要原因是:嵌入式设备缺少足够的运算能力,无法在合理的时间内完成软件或者系统的构建。?ngstr?m发行版是由OpenEmbedded软件框架构建的(http://openembedded.org)。OpenEmbeded构建过程中使用BitBake构建工具(http://developer.berlios.de/projects/bitbake)。BitBake允许用户创建自己的“菜谱”,来精确描述软件包的“烹饪”过程,并自动把成功构建所依赖的软件组件包括进来。
构建?ngstr?m的过程非常简单。首先要下载OpenEmbedded BitBake安装设置脚本,根据?ngstr?m发行版官网所述,这些脚本可以从项目的Git仓库获得,命令如下:git clone git://git.angstrom-distribution.org/setup-scripts。?ngstr?m的服务器似乎不是最快最可靠的,如果下载遇到了困难,可以用GitHub代替它。相应的命令是:git clone https://github.com/Angstrom-distribution/setup-scripts 。
脚本下载完,第二步就是构建内核。所有的软件都使用oebb.sh脚本构建。该脚本使用MACHINE环境变量来指定目标架构。这个可以在启动脚本程序中设置,也可以在shell中手动设置。显然在命令行上执行脚本前设置变量更方便些。可以通过在命令前加上VARIABLE=value(变量=值)的形式使环境变量作用于特定的命令(我打赌,Linux新手肯定不知道)。下列命令将配置环境,编译Beagles的软件,更新文件,并构建内核:
上述的命令将会执行很长时间。由于脚本的写法问题,OpenEmbedded层也会被下载,尽管它和Beagles没什么关系。一旦内核构建好,最终步骤就是用选择的BitBake“菜谱”去构建文件系统了。例如:MACHINE=beagleboard bash ./oebb.sh bitbake console-image将会构建一个只有命令行的根文件系统。如果用Ubuntu系统作为构建主机,聪明的检查器将会向你“抱怨”找不到makeinfo,这个命令工具包含在texinfo包里。
德州仪器为?ngstr?m做了一些优化调整,以便能在Beagles上获得更好的性能。有一些可以用来构建基于?ngstr?m的嵌入式系统的工具,德州仪器的Jason Krinder创建的BoneScript,是一个可用来方便操作GPIO的Node.js库,集成在Beagles标准?ngstr?m 发行版本中。虽然?ngstr?m允许用户轻松创建嵌入式设备,但它的仓库缺少很多必需品,特别是很多标准桌面应用和渗透测试工具。图3.5所示是一个运行?ngstr?m的BeagleBone Black开发板。
图3.5 运行?ngstr?m的BeagleBone Black开发板
Arch Linux
Arch Linux是以简单、轻量、灵活为目标而创建的(http://archlinux.org)。Arch Linux原本是为Intel架构平台开发的,但是目前已经被移植到了ARMv5、ARMv6和ARMv7上(http://archlinuxarm.org)。Arch持续更新并且针对硬件优化,例如,Arch充分利用Beagles上集成在ARMv7 Cortex-A8里的“硬件浮点”数学处理器。Arch的设计理念是让有经验的Linux和Unix用户用得得心应手。Arch的特点总结如表3.2所示。
表3.2 Arch Linux的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 好——非常轻量
Pacman
非常好
差——支持ARM的工具非常少
好——活跃的社区,尤其是桌面版本
简单直接
支持ARMv5、ARMv6和ARMv7
http://archlinuxarm.org/platforms/armv7/ti/beaglebone-black上可找到关于将Arch Linux安装到BeagleBone Black的详细介绍。安装包括几个步骤。首先,用fdisk在microSD卡上分2个区。第一个分区保存bootloader,必须是一个至少64MB的FAT16格式的分区。第二个分区格式化为ext4格式,包含根文件系统。第二步,使用mkfs在microSD卡分区上创建文件系统。第三步,从archlinuxarm.org上下载bootloader和根文件系统镜像。第四步,将镜像文件解压到microSD卡上,如果你的系统足够小,以至于可以存放到BeagleBoard或者BeagleBone Black的eMMC上,可以先从microSD卡启动,再向eMMC上安装。这个方案并不适合我们的渗透测试根系统,它占用的空间大于6GB。图3.6所示的是一个BeagleBone Black上运行的Arc Linux屏幕截图。
图3.6 BeagleBone Black上运行的Arc Linux
Gentoo
Gentoo是一个强大并且高度定制化的Linux发行版本。一个最与众不同的特点就是几乎所有的东西都是从源码构建而来。因此它能提供高度的定制能力以及相当大的性能改进潜力。从源码构建能充分利用处理器特有功能;通过去除不需要的功能,可执行文件可以更小,更小的可执行文件可以加载得更快,占用更少的内存。Gentoo的特点总结如表3.3所示。
表3.3 Gentoo Linux的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注
极好——所有的东西都是定制化编译
Portage
好——桌面版本更好
好——桌面版本更好
好
不同于其他流行的发行版本,但是相当容易
默认情况,所有东西都需要从源码构建,可以提供极好的性能,但是包安装通常是很耗时间的
安装Gentoo是一个非常增长见识,但有时可能令人受挫的工作。如果你有一些Linux方面的经验,并且想要学习到更多关于Linux的知识,我强烈推荐你至少安装一次Gentoo,甚至可以在一些老的、不用的硬件上安装。Gentoo通常是分阶段安装的。首先,安装一个非常基础的系统;第二步,安装标准的构建工具。除了编译器和make,Gentoo使用一个强大的包管理工具——Portage;第三步, Portage用来安装构成完整的Gentoo系统的各种软件包。如果一个包在仓库里,可以通过Portage很容易地构建,使用命令emerge <package-name>。如果一个包无法从Gentoo仓库里获取,事情就变得更有趣一些了。
在Beagles上安装Gentoo的过程和安装桌面版是有所不同的。对于新手,在Beagle上安装Gentoo之前,需要一个支持microSD读卡器的桌面Gentoo系统。桌面版的Gentoo电脑用来创建在Beagle上使用的Gentoo系统microSD卡。详细的安装过程可以在http://dev.gentoo.org/armin76/arm/beagleboneblack/install.xml上找到。如同安装桌面版本一样,在Beagles上安装Gentoo比其他Linux发行版本稍微复杂一些。
首先,安装所需的构建工具。第二步,构建交叉编译器。第三步,下载U-boot bootloader(包含补丁的完整版)的副本并构建。第四步,配置并构建内核(包括固件)。第五步,格式化microSD卡,幸运的是有脚本可以完成这个任务。第六步,下载一个基本的根文件系统并写到microSD卡上。第七步,下载Portage快照,并复制到microSD卡的根文件系统里。第八步,配置一系列的选项(root密码、网络、文件系统、hostname、系统服务等)。第九步,将内核和U-boot复制到microSD卡的FAT16格式分区上,最后,Beagle可以从microSD卡启动,后续的其他包就可以安装了。
构建一个Gentoo系统可能会花上几天的时间。对于这种额外付出的回报是获得一个高度优化调校过的系统,也许还能够获得一些在周围技术圈炫耀的资本。大多数常用桌面应用程序可以在Gentoo的仓库里找到,但或许它在渗透测试应用程序方面还略逊于其他的发行版。因为构建应用可能是个费时的过程。鉴于这些原因,Gentoo可能并不是我们打造渗透测试Linux发行版的首选方案。
Sabayon
在现实世界里,Sabayon是一道意大利甜点。Sabayon Linux是Gentoo的衍生版,Sabayon的一个目标是为用户提供一个开箱即用的SOHO服务器功能(NFS、Samba、BitTorrent、Apache等)系统。它还提供了很多解码器,允许用户把电脑作为家庭影院电脑(HTPC)使用。Sabayon的特点如表3.4所示。
表3.4 Sabayon Linux的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 优秀——基于Gentoo
Portage
好
好
差——目前还没有太多用户
同Gentoo
是一个为SOHO和家庭影院定制的Gentoo
如同它的基础Gentoo一样,Sabayon使用滚动更新,这意味着基于Sabayon的系统可以持续更新而不用等待下一个版本的发布。不同于Gentoo的是,Sabayon提供系统快照,以便于用户可以安装大量软件包而不用从源码构建它们。BeagleBone安装Sabayon的详细说明可以在https://wiki.sabayon.org/index.php?title=Hitchhikers_Guide_to_the_BeagleBone_(and_ARMv7a)找到。不难想到,它的安装过程和Gentoo很像。
Buildroot
Buildroot本质上并不是一个Linux发行版本,而是一套编译完整嵌入式Linux系统的工具系统(http://buildroot.uclibc.org/)。因为它是为了构建嵌入式Linux系统而打造的,所以没有包含完整的软件仓库。这显然不是作为渗透测试系统基础的最佳选择。Buildroot的特点如表3.5所示。
表3.5 Buildroot的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 一般
无
无
无
差
没有标准工具
一个用于构建嵌入式Linux系统的工具系统,非传统意义上的发行版本
使用Erlang/OTP的Nerves项目
Erlang是一种使用OTP库来构建可扩展的软实时系统的编程语言,Nerves项目使用Buildroot构建的Linux内核,并使用Erlang交叉编译工具创建用于BeagleBone Black的固件镜像。虽然Nerves也许能用于创建渗透测试设备,但它似乎并不是一个构建渗透测试操作系统基础的最佳方案。Nerves项目的特点如表3.6所示。
表3.6 Nerves项目的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 未知
无
无
无
差——项目才刚起步
没有标准工具
用于创建软实时系统的系统
Fedora
Red Hat Linux是仍在被广泛使用的最老的发行版本之一,在2003年,Red Hat终止了Red Hat Linux的支持,并且从那时开始只支持Red Hat Enterprise Linux(RHEL)。Fedora(原来被叫作Fedora Core)是一个Red Hat的社区版本,它被创建来替代Red Hat Linux满足非企业用户的需要。Fedora项目得到了Red Hat公司部分赞助支持,事实上,RHEL是基于Fedora代码为基础的分支。社区开发Fedora,然后Red Hat选择将其中稳定的功能特性加入到RHEL中。顺便一提,GNU许可要求Red Hat提供RHEL的源代码,即产生了另一个发行版本(没有商业支持)CentOS(http://www.centos.org/)。Fedora的特点如表3.7
所示。
表3.7 Fedora的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 一般
Red Hat 包管理器(RPM)
未知
未知
差——Beagle镜像被发布出来了,然后被撤回了
标准工具
不像桌面版本Fedora支持得那么好
Fedora是一个主要面向桌面的Linux发行版本,但是后来出现了其他架构的移植版本,如ARM版(http://fedoraproject.org/en/get-fedora-options#2nd_arches)。如同RHEL和一些其他发行版本一样,Fedora使用Red Hat包管理器(RPM)管理软件包。仓库支持很完善。安装Fedora简单明了。从http://fedoraproject.org/en/get-fedoraoptions#2nd_arches下载镜像文件,写入到microSD卡上,然后就完成了。有一个BeagleBone Black专用镜像,但是在写本书时,因为使用?ngstr?m内核和Fedora根文件系统是一个有问题的组合,所以镜像被撤回了。运行Fedora的BeagleBone Black的截屏如图3.7所示。
图3.7 BeagleBone Black上运行的Fedora
Debian
Debian由Ian Murdock在1993年创建(http://www.debian.org/doc/manuals/project-history/)。Debian以Ian和他当时的女友,现在的妻子Debra命名。Debian已经被移植到了大量的架构上,它使用Debian包管理器(dpkg)进行软件包管理。仓库支持很不错,但是很多从它衍生的发行版(如Ubuntu)有着更好的支持。Debian有着大量的衍生版本,这些衍生版本中,Ubuntu是最受欢迎的。Debian的特点如表3.8所示。
表3.8 Debian的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 一般
dpkg——Debian包管理器
好
差——桌面版本更好
非常好配置
标准工具
良好的社区支持,大部分归功于一些个人付出努力的结果
常听到的关于Debian的抱怨是,它不像其他Linux发行版更新得那么频繁。奇怪的是衍生版本通常是持续更新的。Debian对Beagle的支持很好,安装Debian的详细说明可以在http://elinux.org/BeagleBoardDebian上找到。由于它的流行,Beagle上安装Debian很简单,可以通过互联网安装一个最新的镜像,或者安装demo镜像到Beagle上。
为了执行网络安装,首先使用git clone git://github.com/RobertCNelson/netinstall.git下载脚本,然后使用下面的命令下载软件,复制到microSD卡(至少1GB大小)上。
安装demo镜像的过程类似,下载demo镜像、解压、校验,然后使用脚本安装到microSD卡上。下列的命令将会执行demo镜像的安装(注意:本书写作时,这是最新的版本;读者也许希望到网上找最新的版本):
这个系统是命令行版本,如果想安装桌面环境,需要在安装后增加合适的软件包。一个好处是这个的根文件系统足够小,可以安装到BeagleBone Black的eMMC上,并且还有剩余空间容纳一些工具。
Ubuntu
Ubuntu和其衍生版极其受欢迎,Ubuntu已经占领DistroWatch排行榜前列几年了(http://distrowatch.com)。Ubuntu初次发布是在2004年,由Mark Shuttleworth的公司Canonical维护(http://ubuntu.com)。Canonical声称Ubuntu是这个世界上最受欢迎的开源操作系统。Ubuntu是来自南非一个富有哲理的词汇,其含义鼓励人们像一个社区一样在一起工作劳动。与它所基于的Debian不同,Ubuntu每6个月发布一个新版本。很多人认为Ubuntu是初学者最容易使用的Linux发行版本之一。Ubuntu的特点如表3.9所示。
表3.9 Ubuntu的特点
性能
包管理器
桌面应用仓库支持
Hacking应用仓库支持
社区支持
配置
备注 好——支持ARMv7的硬件浮点
Aptitude/dpkg
非常好
非常好
极好
标准工具
根据Canonical所说,Ubuntu是世界上最受欢迎的Linux发行版本。由于某些个人的努力,能够很好地支持Beagles
由于它太受欢迎了,Ubuntu有极好的软件仓库支持。Ubuntu包管理器apt(advanced packing tool),是一个极其简单易用的工具。安装一个新的软件包只需要在Shell中输入sudo apt-get install <package name>。更新系统的所有软件包也一件极其简单的事情,使用sudo apt-get update && sudo apt-get upgrade更新本地仓库信息,然后安装可用更新。如果不确定软件包的名称,或者认为一个工具可能被包含在另一个软件包里,可以通过执行apt-cache search <package or utility name>来找到正确的软件包名。还有图形化或基于文本的前端界面让软件包管理更容易。
虽然Linux系统有许多图形窗口化的桌面环境,但多年来两个被广泛使用的、最主要的桌面环境是GNOME和KDE。两个桌面环境都有着自己的追随者。Canonical还开发了它们自己的名为Unity的图形化窗口的桌面环境。毫无意外地,一些KDE和GNOME的“信徒”并不喜欢Unity。Kubuntu提供给喜欢KDE并想使用Ubuntu的用户(http://kubuntu.org)。本书就是在运行LibreOffice和其他一些开源工具的Kubuntu系统上完成的。Ubuntu Gnome则是为那些喜欢Gnome桌面环境的用户(http://ubuntugnome.org)准备的。
Unity、KDE和Gnome对于Beagle那有限的RAM来说都有点太大了。Beagles和低性能桌面电脑通常会使用一个轻量级的窗口系统。当一个轻量级桌面环境被用于一个桌面电脑时,这个发行版本名字是有变化的。如Xubuntu 是一个使用Xfce桌面环境的Ubuntu版本。当在基于ARM架构的硬件系统上运行它的时候,我们会说硬件上跑的是Ubuntu系统,即使使用的不是Unity桌面环境。
在Beagles上运行Ubuntu有多种选择。可以选择主版本、这个版本的变体和某个特定的内核。由于Ubuntu和内核最近的变化,这些选择比初听起来的要麻烦。新的设备,例如BeagleBone Black只支持较新版本的Ubuntu和Kernel,这些版本与从前的有些不兼容。在我们讨论完一个优秀的渗透测试Linux发行版的必备要素之后,再深入讨论这个问题。
3.2 渗透测试Linux发行版本所需的功能特性
现在我们对Beagles上可用的系统已经有所了解,顺理成章地,我们该问自己什么功能特性应该是适合的渗透测试Linux发行版本必备的。被选择的发行版本应该提供良好的性能和社区支持,软件包仓库要包含绝大多数我们想要使用的工具,容易配置,并且工作可靠。
怎么才能实现良好的性能?所有Beagles系统板都使用ARMv7 Cortex A8处理器,这些芯片支持“硬件浮点”数学处理器。运行一个能够兼容老的ARM架构的支持“软浮点”系统如同在i7处理器的机器上运行Windows 98。良好的性能起始于一个好的基础,这里,它意味着一个支持“硬件浮点”运算的内核。在这个基础上,进一步地需要构建一个有效的文件系统,优化的驱动以及只开启必需的服务。
等着我们的将是一番艰苦卓绝的奋斗,因为不可能一帆风顺,这是作为技术开拓者必须经历的。这也是要选择一个拥有良好社区支持的Linux发行版本的原因。正是因为拥有一个强有力的社区,才让Beagles从同类开发板中脱颖而出。Beagle用户可以使用在线聊天、论坛和邮件列表。邮件列表非常活跃,在一个比较受欢迎的Linux发行版本中,一个小时能收到关于某个问题的多个答复是很常见的。甚至不必大惊小怪,回答你问题的人可能正是开发板设计者或者发行版本开发团队领袖本人。
好的软件仓库可以使一个Linux发行版本更容易使用。反过来,如果你需要一直在互联网上寻找需要的软件,或者更糟糕的,总是被迫直接从源码编译的话,也许该考虑换一个Linux发行版了。大部分发行版本对桌面应用都有良好的支持,虽然这对我们的也很重要,但我们更关心对主要黑客工具的支持。能有多个可选的文本编辑器固然很好,但远赶不上能够轻松安装aircrack-ng、Wireshark和Scapy(一个Python编写的网络工具)重要。
我们一直尝试构建灵活性好的设备,可以用作投置机、破解攻击机,或者渗透测试桌面环境。这需要一个可以很容易配置的操作系统。系统应该可以很容易地用熟悉的工具进行配置和重新配置。选中的系统应该允许随意地关闭不必要的功能和特性,网络参数可以进行修改和远程配置。
在我们的应用中,稳定可靠也是非常重要的特性。如果不能确保运行数小时既不死机也不崩溃,即使电池能支持远程破解攻击机运行2天又有什么用呢?当设备能够在目标环境中接通电源或者从PC取电(例如嵌入到Dalek desktop defender玩具的情况),它们应该能够无故障地一直运行下去。
分析了上面9个Linux发行版本,Ubuntu成为明显的胜出者。最重要的一点就是能在ARM架构上为黑客工具程序提供强有力的支持。作为世界上最受欢迎的Linux发行版本,Ubuntu享有极好的社区支持。正是那些默默奉献者的努力,才让Beagles用上优化的Ubuntu。虽然也可以基于Arch Linux、Gentoo或者Debian构建一个系统,但这可能会比Ubuntu多花很多时间。不妨设想一下,你是愿意把宝贵时间花在折腾操作系统上,还是更想用这些时间来创造一些很棒的破解脚本呢?
3.3 基于Ubuntu方案的选项
现在我们已经决定使用Ubuntu,你可能会认为这就完事儿了,但你错了。Ubuntu提供给我们一大堆选择,第一个要做的决定是选择哪个Ubuntu版本,本书编写时,Ubuntu 13.04和13.10已经可以在Beagles上使用了(更高的版本也是可用的,只要你用的不是BeagleBone Black)。基于Ubuntu 14.04的一个实验版本也可以使用了。因为Ubuntu13.04完全满足目前的需要,并且它是久经考验的稳定版,所以本书将选择它。
Ubuntu 13.04选择妥当后,仍有一些细节需要确认。是否应该把BeagleBone Black的操作系统安装在eMMC上?eMMC的空间只够安装命令行版本的Ubuntu,Deck的根文件系统超过6GB。如果把操作系统放在eMMC上,那将需要挂载优盘或者microSD卡来安装全部工具,在这种场景下尝试安装桌面环境是不现实的。而且,既然使用了外部的存储介质,使用eMMC带来性能增益已经完全被抵消掉了(系统可能会更慢);并且,耗电将会增加。由于这些原因,我们将把带桌面环境的Ubuntu13.04的基本系统安装到一个8GB或者更大的SD卡上。
现在我们已经决定了安装什么和存储到哪里,接下来需要选择一个安装方法,三种主要的安装方式是:下载预配置的镜像、网络安装和手动安装。因为我们想要继续构建我们的工具集合(下章的主题),手动安装的方案就被排除了,因为花的时间太长,并且太容易出错。考虑到要在多个系统上构建,所以网络方式也被排除了。从一个预配置的镜像开始似乎最适合我们的情况,预配置镜像提供了一个基础的根文件系统,可被解压到microSD上。把工具添加到这个根文件系统中,然后重用安装脚本,将我们的定制镜像应用到多个系统上。
3.3.1 Ubuntu变种
Canonical提供了Beagles和其他ARM系统的镜像。但是,这些镜像并未进行优化。本书写作时,Canonical仍未提供Ubuntu 13.04的镜像,12.04还是最新的版本。幸运的是,Robert C. Nelson已经为Beagle家族的板子提供了一个demo镜像和优化的内核。Nelson的demo镜像是一个好的起点,它是只有命令行环境的镜像,所以我们需要在安装各种黑客工具前安装一个窗口环境。
3.3.2 内核的选择
Nelson先生的Ubuntu 13.04的镜像使用3.8或者更高版本的内核。本书写作时,3.8的内核是BeagleBone和BeagleBone Black的默认内核, BeagleBoard-xM使用3.12作为默认内核。通过补丁可以把BeagleBone的内核升级到3.12,如果使用3.8时遇到了问题,可以考虑安装这个补丁。内核镜像可以在Nelson的网站上http://rcn-ee.net/deb/raring-armhf/ 得到。3.8的内核在ARM平台上体现出了大量的变化。在之前的版本中,ARM系统制造商不得不提供定制化的内核,这种情况对任何人来说都没有好处,所以设备树作为应对硬件差异化的新方法应运而生。
设备树
BeagleBone Black是第一个运行支持设备树的新内核的开发板,这可能会带来一些暂时的困扰,但是,最终结果值得忍受这暂时的不适。设备树是一个数据结构,内核用它实现跨多种体系结构(http://elinux.org/Device_Tree)的标准方式来发现和配置设备(包括那些主板内置的设备)。设备树使得计算机系统以及附加硬件的设计者的生活变得更美好。
本书后面将会对设备树进行更详细的说明。现在,只需要把它看作一种更加容易支持所购买和构建的cape的简洁方法即可。如果购买的设备有EEPROM来描述自身,操作系统可以自动使用叫作设备树层叠的方法连接并配置相应的设备。对于那些你构建的和其他没有自身描述EEPROM的设备,可以加载一个或者多个包括在Ubuntu里的设备树层叠。
3.4 创建一个microSD卡
本章已经囊括了足够的理论知识,是时候实际操作一下了。我们将安装Robert C. Nelson版本的Ubuntu 13.04到microSD卡上。如前所述,之后将重复用这个安装过程去把完整渗透测试发行版镜像安装到多个硬件设备上。如果想安装Deck系统,则需要一个8GB或者更大的microSD卡。多花钱购买一个更快的microSD卡(class 10或者更好的)是值得的,节省这点儿钱而使用class 4或者class 6的SD卡是完全不值得。另外,不是所有厂商的产品都是一样的。我已经见识过在标称同一速度的卡持续读写的时候,有多么大的差距。
Nelson先生已经让Beagles(和其他基于ARM架构的开发板,如PandaBoard)上安装Ubuntu变得很轻松。下面的指导说明来自 http://elinux.org/BeagleBoardUbuntu。如果你使用上面的说明遇到了问题,可以求助于elinux.org页面。接下来需要下载镜像,选择性的校验,解压它,然后运行一个安装脚本:
上边的setup_sdcard.sh运行要长达几分钟。这个脚本初始化microSD卡,安装正确的内核,然后把一个小型的根文件系统拷贝过去。它运行的时间主要取决于卡的写速度。后边重用这个脚本和这个过程时,花费的时间比这要长得多,因为完整的根文件系统大了很多,Deck的根文件系统超过6GB,而Nelson先生的基本根文件系统只有不到400MB。3.6节将对该脚本深入讲解。
3.5 本章小结
本章考察了BeagleBoard.org系列计算机板可用的多种操作系统,把它们逐一按照我们的标准进行分析评估,这些标准是作为构建渗透测试发行版的基础系统所必备的。最终Robert C. Nelson定制的Ubuntu 13.04脱颖而出。我们也看到这个基础系统很容易通过一个脚本来安装。下一章将深入讨论在这个基础上添加一有用的工具,把它打造成一个完整的渗透测试系统。
3.6 本章附录:深入分析安装脚本
安装Ubuntu如此简单的一大部分原因是Robert C. Nelson完善的安装脚本,这个脚本有1700行,大部分脚本都是用于验证的。其中最有关系的部分包括在这里。第一段包括了版权信息声明和基本的安装说明。除去版权信息声明,大部分注释用于解释这个脚本:
除去进行大量验证工作后,脚本归结整理后只有下面几行:
在上面的脚本中调用的函数内容如下,函数已经加注释。为了简化内容,部分与Beagles无关的函数已经被移除了: