智能硬件入门


  智能硬件目前玩的人相对于玩PC、服务器和移动的人来说要少很多。以前,大部分研究这块的人都是电子行业相关人士,但是目前物联网的流行,使得很多黑客和安全研究人员进入该领域,使得该领域产品安全问题频发。物联网的发展让虚拟网络与现实生活紧密的联系起来,一旦发生安全问题,遭受黑客攻击必将对人们的现实生活环境产生严重的影响和危害,甚至危及到人身安全和生命安全,如车联网的安全问题等等。物联网已然成为未来互联网发展的趋势,那么物联网安全同样也是安全行业发展必不可少一个重要方向。  
  对于很多未涉足该领域的人,特别是之前从事计算机行业的人来说,感觉这个领域太广,涉及处理器架构也比较多,嵌入式操作系统和非操作系统的也不少,感觉会无从下手,那么本文主要目的就是引导新人入门或者给想要转入该方向的朋友们一个学习参考。当然我个人精力也是有限的,也只能涉足少量的一些方向,目前我也只是以某一方面的学习路线来引导大家尽快入门。对于安全来说,这个领域还比较新,有太多的东西需要学习,后续我会把一些好的技术文章发到该板块,和大家一起讨论学习。

一、什么是智能硬件  
  
  首先我们要明白智能硬件是什么,明确了概念,才能定位方向,不至于无从着手。智能硬件实际上是智能手机概念的升级,也就是把传统的设备进行升级改造使其具有某种智能,比如电视、冰箱、空调、手表、门锁、茶杯、医疗仪器、玩具、机器人、汽车甚至房子等等。因此智能硬件这块方向比较宽泛,涉及的领域比较广,与此相关的行业也非常非常的多。并不像PC平台那样,我们只需要关心某一类处理器架构,甚至只需要关心某一个操作系统平台就可以。如果要完全列出智能硬件这块的知识架构,可能得写本书也无法列举完全。我们每个人精力是有限的,也不能每一个领域都去涉足,因而我们只需要关心某一个领域或者方向即可。

二、按软件进行分类

  根据设备使用的软件系统的不同,我把这些智能硬件分为如下四类:

    1.android设备系列,包含智能手机,智能电视,智能手表,连接云的汽车,智能导航设备等等。
    2.ios设备系列,主要是苹果系的产品。
    3.嵌入式操作系统:嵌入式linux,VxWorks,FreeRTOS,Windows XP Embedded,Windows CE,RTX,uCLinux等等,这一块跟嵌入式操作系统相关。
    4.非操作系统(这里特指非智能设备):如照相机,摄影机,洗衣机,电子玩具,键盘,鼠标,摄像头,话筒等等电子设备,还包括有仪器,电子卡,SIM卡等等。

  前两类设备,对于熟悉android和ios的朋友应该问题不大。看雪这两个版块有很多非常好的文章,感兴趣的可以到这两个板块进行学习。这里我主要讲的是后两类设备的入门学习。这两类设备需要嵌入式开发相关的知识和单片机相关的知识作为准备。
  对于嵌入式系统大部分都是POSIX标准,这一块儿的入门,大家可以先学习linux,然后学习嵌入式操作系统移植,入门应该不难,对其进行安全研究和逆向分析和传统方式也差不多,毕竟都是基于操作系统的,学习思路很相似,只是逆向这一块儿涉及的汇编会不一样。
  对于那些非操作系统类型的设备,安全研究和逆向分析相对来说要难一些,因为这些设备多半都是封闭式或者半封闭式的,基本上都需要拆开封装,分析电路板并对电路板进行测试分析。这方面入门主要以单片机学习来入门会走得更远。我们可以先学习单片机再学习嵌入式,也可以反过来,无所谓。这两个方面都需要了解硬件,只是着重点不同而已。

三、硬件设备怎么玩

  由于硬件设备太多,嵌入式系统也不少,太多的设备会导致我们不知道该从何入手。那么首先在我们打算学习之前,需要要弄清楚我们学习的目的是什么,我们的兴趣点是什么,弄清楚这些后我们才有具体的学习目标,这样更有助于我们入门。
目前我们的目标不是去做硬件开发,也不是做嵌入式开发,我们目的是做安全研究和逆向工程,那么我们对于硬件可做哪些呢:

  1.挖掘安全弱点:登录验证,弱口令,弱加密,溢出漏洞,固件更新漏洞,敏感信息泄露,不安全的访问控制,嵌入式系统遗留的漏洞等等,这方面目前主要体现在物联网上比较多,实际上是传统安全问题在新领域的复制。
  2.开源硬件DIY:开源硬件资料齐全,需要一点硬件方面的知识,但主要考验动手能力和排错能力,比如树莓派(现在大量系统都主动来支持树莓派,特别是3,潜力无限),Ardurino,Atmel Xplained(PRO),CooCox开发工具,伽利略开发板等等;还有专门的机器人开源项目(DFRobot,TurtleBot等),四轴飞行器(3DR Solo,MikroKopter,Crazepony等),3D打印机(Ormerod,Mamba3D,Ultimaker等)等等。
  3.固件逆向工程:逆向固件,发现固件级别的安全问题,比如华盛顿大学和加州大学圣地亚哥的研究员通过利用蓝牙固件漏洞获取到了一个汽车远程信息处理单元的远程代码执行权限。
  4.固件代码植入:向固件中植入恶意程序,比如方程式组织的硬盘固件病毒,这一块儿可以作为个人兴趣安全研究,比如今年blackhat上有一个议题就是向PLC中植入病毒,大家可以关注一下。
  5.固件DIY:国外很多人玩,比如把鼠标改造成扫描仪,将背光键盘改造成贪吃蛇游戏等等,后面我会将这些文章分享出来,介绍分析方法和实现原理。
  6.硬件DIY:自己diy硬件,这一块需要你具备硬件方面的知识更多一些,自己设计电路图,自己焊接,需要一些手工技能,这方面该板块后续也会引入一些帖子来介绍方法。
  7.破解:比如各种卡的破解等。

四、物联网的机遇

  上面介绍的第一种玩法实际上是传统安全的玩法。在物联网时代,当一些原来与网络隔离的设备被加入智能操作系统并接入互联网时,那么传统的安全研究思想和方法又能够再一次的发挥威力。
  由于物联网的发展将大量原来漏洞百出的系统暴露在网络中,并且大量从事这些工作核心技术工程师来自于传统嵌入式工程师,安全开发的意识比较缺乏,使得很多低级安全问题出现在物联网设备中,比如各种路由器口令后门,智能电视弱登录验证,遥控器与智能家居的明文通信或者弱加密通信,智能开关与云的弱验证,远程溢出漏洞等等,因而这些设备的安全问题随着物联网的发展而不断暴露。因而这个领域的大量安全问题正等待着大家来发觉,这也是一个新领域的老问题,也是大家该介入的最好时机,不管怎么样,目前物联网安全漏洞是还处于一个非常容易挖掘的时期。
  当然在万物互联的大背景下,汽车安全、工业控制安全、POS系统安全,医疗网络安全等等都在成为大家关注的热点问题。当然还有一些比如监控摄像头,ATM机安全,无线通信安全等等。

  基本准备:
  如果你之前是做渗透测试或者漏洞挖掘,那么基本可以直接测试自己身边智能路由器,智能开关,智能电视等设备,以及控制这些设备的APP.

  一些基本知识:
    1.熟悉嵌入式操作系统,如linux,VxWorks,FreeRTOS,RTX等,可以自己试图去编译安装这些系统,熟悉一下它们文件系统。
    2.学习ARM和MIPS汇编
    3.会使用一般的渗透测试工具进行测试,推荐使用Kali系统,装备齐全。

  物联网的玩法简单些,无需关心硬件,传统的渗透测试和模糊测试的方法同样适用,更深入点的可以dump出固件,这些固件(嵌入式系统固件)都是以一定格式存放的嵌入式操作系统及其文件系统,只需要提取出其中关心的程序(通常是ARM和MIPS汇编的程序)进行分析来发现安全漏洞。

  当然你可以挑选最简单的来玩,比如很多智能家居设备,比如智能开关,智能冰箱,智能电饭煲等等这些智能设备都会支持android和ios进行控制,你可以直接分析测试这些app是否存在一些安全问题。

五、底层硬件入门

  如果大家对底层感兴趣,并且让自己能够更加深入的玩下去,那最好是熟悉硬件底层,当然我们没有条件也没有必要去制造那些乱七八糟的设备,但是我们可以拿到一个设备后动手去观察,分析,使用工具去拆解它。那么只要我们愿意去动手,愿意去使用搜索引擎查看电路板的各芯片说明,即便最后没能成功,也能学到不少东西。当然在我们做这些工作之前,还是需要做一些准备工作,我们最好还是把基础打牢固,这样很多看似很难得问题都能迎刃而解了。

  1.首先最好学习一下单片机,这是你熟悉硬件的最佳途径,熟悉C语言的做单片机编程真的是非常简单,虽然我们目的不是去编程,但是编程对于我们做逆向分析和了解其运行机制非常有用。最简单的是51单片机,其次是PIC,avr,stm32,从这些编程中,你试着逆向去了解8051指令集,avr指令集以及arm指令集等等。
学习单片机更重要的是去学习与外围设备的通信,接口连线,调试方法等等。

    1)外围设备包含LED灯、A/D(D/A)转换器、键盘、数码管、液晶屏、传感器、红外线、无线电、电机等等。
    2)接口包含USART、RS232、PCI、SPI、I2C,USB等等.

  附件里我会上传一些资源供大家学习。如果你了解了这些,那么基本上就有一定基础了。
  当然并不是所有外设你需要完全学会,你可以在研究到相关外设时再查资料学习。你可以把精力放在逆向上,一边写代码一边逆向,了解单片机从加电复位到你自己的代码执行这个期间的过程搞明白。
  如果你不学习单片机,直接进行物联网方向的安全分析也是没有问题,这方面实际只要找到了攻击面,就好入手,但是高手都是会了解得更深入才能最大限度的扩大攻击面。

  2.汇编知识,实际上对于8051,avr,arm,mips这些处理器架构,大家不必要去纠结汇编问题,当你研究某一个平台时有一本参考书籍就可以了,这些都是公共平台。

  3.电子电路,这一块不需要太过于深入,能够简单识别电器元件以及其功能,能够识别框图,读懂一些芯片图,引脚和接口图就可以。主要当你拆解一款设备后,你能够认识那些是控制器,那些是flash,以及找到datasheet后能够看懂芯片说明图。

  4.熟悉一些工具的使用是必备的:

    1)调试工具比如JTAG/SWD仿真器,OPENJTAG, 使用usb转串口工具等等,如果能够准确找到相关MCU相关的编程器的话就更好。这方面在后需要的文章中会给大家介绍,如何使用OPENOCD来进行固件调试,以及如何直接取出FLASH并且读取FLASH数据。
    2)USB协议分析工具如USBPcap,Wireshark.这些工具在该设备提供升级但是你又无法进行调试时用来分析USB数据包,你可以分析升级固件程序的机制,然后使用libusb库来编写自己的固件dump工具和擦写工具。这块后续通过分析文章给大家介绍。
    3)有一定基础后可以自己DIY调试仿真器,FLASH读取器等,按照自己的需求进行设计,现在国外很多爱好者都是自制的。



下面是一些资源,欢迎大家补充:

dfrobot机器人开源网站
http://wiki.dfrobot.com.cn/index.php...A6%96%E9%A1%B5

Crazepony开源微型四轴飞行器
www.crazepony.com 

互联网在线设备搜索引擎,绝对的神器,你可以找到全世界在线的网络摄像头、路由器、信号灯、核电站等有信息漏洞的设备:
https://www.shodan.io/

芯片手册

http://www.datasheet-pdf.com

芯片型号及其所属的内核芯片家族:
http://www.myir-tech.com/resource/450.asp

施耐德PLC以太网模块固件后门:
http://www.360doc.com/content/15/101...6538554.shtml#

揭秘黑客是如何黑掉三星NX300智能相机的
http://www.freebuf.com/vuls/99951.html

向硬盘固件程序嵌入代码
http://www.sosit.com.cn/de_news/de_yjxw/5949.html

openOCD+jlink调试uboot 
http://blog.chinaunix.net/uid-11319766-id-3060018.html

最低成本的ARM调试解决方案
http://blog.csdn.net/enbiting/article/details/7190794

libusb库官网:
http://www.libusb.org/wiki/libusb-win32#Installation

USBpcap,Wireshark,usb协议分析必备
http://desowin.org/usbpcap/
https://bugs.wireshark.org/bugzilla/...ug.cgi?id=8503

通用usb驱动libusb介绍和使用示例
http://www.cnblogs.com/image-eye/arc...0/2159897.html


常见基站定位/基站数据查询网站
http://www.cellid.cn/
https://www.juhe.cn/d/cellmap/gsm.php
http://www.jizhanyun.com

Kautilya是一个给人机接口设备提供各种payload的工具包,比如可以烧录给teensy,它可以帮助人们进行渗透测试。
https://github.com/samratashok/Kautilya

劫持无线鼠标项目
https://github.com/RFStorm/mousejack

ZigBee(无线通信)安全研究工具包
https://github.com/RFStorm/killerbee

物联网安全:LED灯中存在多个安全漏洞
https://blog.viktorstanchev.com/2015...fi-lightbulbs/

汽车黑客揭秘:我是如何通过逆向API接口黑掉宝马i3的
https://shkspr.mobi/blog/2015/11/rev...he-bmw-i3-api/
https://github.com/edent/BMW-i-Remote/