解密BadUSB:世界上最邪恶的USB外设
作者 Rabbit_Run
概述
在2014年美国黑帽大会上,柏林SRLabs的安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为“BadUSB”(按照BadBIOS命名)的攻击方法,这种攻击方法让USB安全和几乎所有和USB相关的设备(包括具有USB端口的电脑)都陷入相当危险的状态。
USB背景知识
1. USB内部结构
注:BadUSB主要依靠USB驱动器的构建方式,USB通常有一个大容量的可重写的内存芯片用于实际的数据存储,以及一个独立的控制器芯片。控制芯片实际上是一个低功耗计算机,并且与你的笔记本电脑或台式机一样,它通过从内存芯片加载基本的引导程序来启动,类似于笔记本电脑的硬盘驱动器包含一个隐藏的主引导记录(MasterBoot Record)。
2. USB如何识别
3. USB设备的初始化
设备可以拥有多个标识(注:一个设备可以被识别为多种类型):
*一个设备通过一个描述符标明它的功能;
*一个设备可以拥有多个描述符,如果它支持多种设备类别,例如网络摄像头+麦克风;
*设备可以注销,然后再次注册为一个不同的设备;
可重复编程的外设
USB攻击场景
1. 在Windows环境下感染USB,然后再控制Linux机器
键盘模拟足够用于感染和权限提升(不需要软件漏洞)
注:在Linux/Unix操作系统,LD_PRELOAD是一个环境变量,可以影响程序的运行时的链接(Runtimelinker),设置在程序运行前优先加载的动态链接库。通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入恶意程序,从而达到那不可告人的罪恶的目的。
2. USB设备篡改Windows系统的DNS设置
通过“USB上的DHCP”转移网络流量
意外收获:突破虚拟机
3. Android转移Windows机器的网络流量
“我能借用你的笔记本给手机充电吗?”Android手机是最简单的USB攻击平台。
注:Ethernet-Over-USB:将USB接口模拟为以太网接口,实现基于Ethernet的网络连接。
Android设备的POC代码下载地址为:
https://srlabs.de/blog/wp-content/uploads/2014/07/BadAndroid-v0.1.zip
4. USB引导扇区病毒
5. 攻击方式总结
防护以及下一步
1. 防护对策及缺陷
2. USB外设的可重复编程也有积极的用途
总结
以上内容主要源自SRLabs在2014年黑帽子大会上的演讲稿,仅对内容的编排做了调整,原稿的下载地址https://srlabs.de/blog/wp-content/uploads/2014/07/SRLabs-BadUSB-BlackHat-v1.pdf。
花了一周的空余时间翻译的,水平有限,欢迎大家批评指正!
- Spring Cloud Feign 启动UnsatisfiedDependencyException
- Spring Cloud Zuul结合Smconf配置中心动态进行IP黑名单限制
- 高性能NIO框架Netty入门篇
- Spring Boot Web 静态文件缓存处理
- hbuilder 开发APP填坑经验
- hbuilder APP 定位提示苹果审核不通过
- hbuilder 开发5+ APP采坑记录
- Spring Cloud如何提供API给客户端
- 5分钟学会Spring Boot自定义属性和自动配置
- 创建一个Spring Security OAuth认证服务
- Zipkin和微服务链路跟踪
- Java8真不用再搞循环了?
- 针对事件驱动架构的Spring Cloud Stream
- Spring的三种Circuit Breaker
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel5.7框架安装与使用学习笔记图文详解
- Python基于httpx模块实现发送请求
- Python Tkinter图形工具使用方法及实例解析
- PHP实现的简单留言板功能示例【基于thinkPHP框架】
- Python SMTP配置参数并发送邮件
- Python如何实现自带HTTP文件传输服务
- 在keras中实现查看其训练loss值
- keras实现VGG16方式(预测一张图片)
- 利用python中的matplotlib打印混淆矩阵实例
- pytorch加载自己的图像数据集实例
- python实现批量转换图片为黑白
- Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
- Python实现验证码识别
- 详解PHP神奇又有用的Trait
- laravel实现按时间日期进行分组统计方法示例