2. PLC固件提取与静态安全分析
固件镜像的获取与预处理
对西门子 S7-1200 进行固件静态分析,第一步是拿到可分析的镜像。S7-1200 的固件通常以 .upd 升级包形式发布,内部封装了引导加载程序、固件分区和文件系统。若从设备侧提取,可通过调试接口(如 XMODEM 或 JTAG)读取 Flash 内容;若从官方升级包获取,则需先解包再分析。
拿到镜像后,先做基础识别,确认文件类型和结构,再决定后续提取策略:
# 识别镜像类型
file s7_1200_fw.upd
# 查看十六进制头部,确认魔数和分区表
xxd -l 256 s7_1200_fw.upd
# 计算哈希,建立分析基线
sha256sum s7_1200_fw.upd
西门子升级包常见结构为:头部元数据 + 压缩固件分区 + 校验区。部分版本使用私有封装格式,需要先剥离外层容器才能进入 binwalk 分析。
使用 binwalk 提取文件系统
binwalk 是固件分析的核心工具,通过签名扫描识别镜像中的嵌套文件系统、压缩流和可执行代码。对 S7-1200 固件,重点关注 SquashFS、CramFS、JFFS2 等嵌入式文件系统,以及 gzip、lzma 压缩段。
# 签名扫描,识别镜像中的文件系统与压缩段
binwalk s7_1200_fw.bin
# 自动提取所有可识别内容
binwalk -e s7_1200_fw.bin
# 对提取出的文件系统进一步递归分析
binwalk -Me s7_1200_fw.bin
# 查看提取结果目录结构
ls -la _s7_1200_fw.bin.extracted/
提取后通常得到 squashfs-root/ 目录,包含 /bin、/etc、/lib、/www 等标准嵌入式 Linux 目录。若 binwalk 无法自动识别,可尝试手动定位文件系统魔数:SquashFS 为 hsqs,CramFS 为 0x28cd3d45,JFFS2 为 0x1985。
strings 定位硬编码凭据与调试接口
文件系统提取完成后,用 strings 扫描二进制文件和配置文件,寻找硬编码凭据、调试接口路径和未文档化命令。这一步的关键是结合上下文过滤噪声,而不是盲目搜索。
# 扫描所有可打印字符串,输出到文件
strings -a -n 6 squashfs-root/bin/* > all_strings.txt
# 搜索凭据相关关键词
grep -iE "password|passwd|pwd|secret|token|key" all_strings.txt
# 搜索调试接口与未文档化命令
grep -iE "debug|diag|shell|telnet|ssh|backdoor|hidden" all_strings.txt
# 搜索 Web 接口中的认证逻辑
strings -a squashfs-root/www/cgi-bin/* | grep -iE "auth|login|admin"
典型发现包括:/etc/passwd 中的默认账户、Web CGI 中的硬编码 API Key、调试串口配置中的 console=ttyS0、以及未在文档中公开的 diag 或 debug 命令。对每个命中项,需回溯到原始文件确认上下文,避免误报。
-n 6 以上长度,减少短字符串噪声;对关键命中项用 grep -B2 -A2 查看前后文,判断是否真实凭据。静态分析结果整理与验证
将提取到的文件系统、凭据线索和调试接口整理成结构化清单,便于后续验证。对每条线索,记录来源文件、偏移地址、原始字符串和初步判断。硬编码凭据需在隔离环境中验证是否仍有效;调试接口需确认是否在量产固件中开放。
| 发现类型 | 来源文件 | 关键内容 | 风险判断 |
|---|---|---|---|
| 硬编码凭据 | /etc/passwd | admin:$1$xxx:0:0:... | 默认账户可登录 |
| 调试接口 | /etc/inittab | ttyS0::respawn:/bin/sh | 串口 shell 未禁用 |
| 未文档化命令 | /bin/diag_tool | "diag --dump-config" | 可导出配置 |
| Web API Key | /www/cgi-bin/api.cgi | API_KEY="S7-1200-DEFAULT" | 接口鉴权可绕过 |