使用树莓派 GPIO 引脚进行硬件安全测试
GPIO 是什么
GPIO(General Purpose Input/Output)是单板电脑上的 40+ 个引脚,可以单独配置为输入或输出模式。树莓派、Rock Pi、ODROID 等都有。
Kali Linux 在这些 ARM 设备上支持完整的 GPIO 控制。以下示例以树莓派 4B/5 为例。
准备
硬件
- 树莓派(任意型号均可)
- 面包板 + 杜邦线
- 测试用硬件:LED、继电器、按钮、传感器等
- 可选:逻辑分析仪、SDR 设备
软件
sudo apt update
sudo apt install -y python3-gpiod python3-rpi.gpio raspi-gpio
基础 GPIO 操作
raspi-gpio 命令行工具
查看所有引脚状态:
raspi-gpio get
设置引脚输出高电平:
raspi-gpio set 17 op dh # 引脚 17,输出模式,高电平
raspi-gpio set 17 op dl # 引脚 17,输出模式,低电平
配置输入模式并读取状态:
raspi-gpio set 23 ip # 引脚 23,输入模式
raspi-gpio get 23 # 读取电平值(0=低,1=高)
Python 控制
from gpiozero import LED, Button
from time import sleep
led = LED(17) # 引脚 17
button = Button(23) # 引脚 23
while True:
led.on()
sleep(1)
led.off()
sleep(1)
if button.is_pressed:
print("按钮被按下了!")
硬件安全测试场景
场景一:继电器控制物理开关
用继电器模块可以远程控制物理电路:
- 控制门禁电磁锁(模拟门禁卡)
- 控制服务器电源(物理重启)
- 控制 USB 设备的供电(模拟插拔)
import RPi.GPIO as GPIO
import time
# 继电器模块接引脚 17
RELAY_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(RELAY_PIN, GPIO.OUT)
# 打开继电器(默认低电平触发)
GPIO.output(RELAY_PIN, GPIO.LOW)
time.sleep(1)
# 关闭继电器
GPIO.output(RELAY_PIN, GPIO.HIGH)
场景二:UART 串口接入设备
很多嵌入式设备(路由器、摄像头、工业控制器)有 UART 调试口。用 USB-TTL 转换器 + GPIO:
# 找到串口设备
ls /dev/ttyUSB*
# 用 minicom 或 screen 连接
screen /dev/ttyUSB0 115200
常用波特率:9600、19200、115200。连接成功后会看到目标设备的 boot log,可以按 Ctrl+C 进入 U-Boot shell,然后破解 U-Boot 命令行注入。
场景三:I2C/SPI 协议分析
- PN532 NFC 模块(I2C)+ Kali 的 mfoc 工具 → 分析 Mifare Classic 卡片
- OLED 显示屏(I2C/SPI)→ 伪造屏幕输出
- 温度/湿度传感器 → 环境监控脚本
# I2C 扫描
i2cdetect -y 1
# SPI flash 读取
flashrom -p linux_spi:dev=/dev/spidev0.0 -r firmware.bin
场景四:CAN 总线分析(汽车测试)
用 MCP2515 CAN 模块(SPI 接口)连接汽车 OBD-II 接口:
# Kali 中配置 CAN 接口
modprobe can
modprobe can-dev
modprobe can-gw
ip link set can0 type can bitrate 500000
ip link set can0 up
# candump 抓取 CAN 帧
candump can0
# cansend 发送 CAN 帧(测试某个功能)
cansend can0 123#DEADBEEF
安全注意事项
- GPIO 输出是 3.3V 逻辑电平,不能直接接 5V/220V 设备,必须经过继电器/电平转换
- 接反线可能烧 GPIO 引脚——接之前对照引脚图仔细核对
- 不要把 GPIO 直接接在目标设备上修改其数据——你自己的电脑也会被当成攻击者
Kali NetHunter 与 GPIO
NetHunter 在手机上没有物理 GPIO 引脚,但可以通过 USB OTG 接 GPIO 扩展板,或者配合蓝牙控制 Raspberry Pi 的 GPIO。