Openwrt安全问题思考
1. 背景
OpenWrt 可以被描述为一个嵌入式的 Linux 发行版。(主流路由器固件有 dd-wrt,tomato,openwrt,padavan四类)对比一个单一的、静态的系统,OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。
Openwrt操作系统作为目前嵌入式设备上主流的定制化操作系统,已经越来越受厂商喜爱,主流厂商比如小米所发布的家用路由设备都是基于Openwrt系统进行二次研发。Openwrt所占的市场份额也呈现逐年递增的趋势,那随之而来的一些安全问题也是需要我们注意,搭建环境也是我们进行安全研究的前提条件。
2. 环境搭建
2.1 下载
下载地址:https://github.com/openwrt/openwrt
$ git clone git://github.com/openwrt/openwrt.git
初始化项目
$ ./scripts/feeds update -a
$ ./scripts/
2.2 目录结构
主要目录介绍
- include
此目录主要存放Openwrt编译系统过程中需要调用的MakeFile文件,包含的MakeFile都可以在其中找到。
- package
此目录主要存放Openwrt软件包。每个代码包都存放在此文件目录,在编译过程过程中会自动识别MakeFile文件并编译。
- scripts
此目录主要存放脚本工具,包括一些要用的shell、python工具。
- staging_dir
此目录主要存放内核、工具等源码编译结果
- target
此目录主要存放和平台相关的代码(多种不一样的芯片型号)。
- toolchain
此目录主要存放交叉编译工具链。
- tools
此目录主要存放一些工具集(压缩相关、加壳、文件系统构造等)
- build_dir
此目录主要存放内核、工具、软件源码编译内容。其目录内容和staging_dir一模一样,staging_dir就是build_dir中代码的编译结果。
2.3 配置选项
$ make menuconfig
target System(设备架构)
Sub Target
Target Profile
Target Images(选择vmdk)
Base System(基本系统--可选择安装的程序)
不需要变动,如果想让自带的busybox命令有增加,可以选择Customize busybox options,增加想要的命令
- Boot Loaders(启动项--不需要改变)
- Development(主要是GDB调试有关选项)
- Extra package
- Frimware(CPU驱动相关的)
- kernel(内核相关)
- kernel modules(内核驱动相关)
- languages(需要安装的编程语言)
- Libraries(动态库)
- network(网络相关的程序)
- Utilities(工具包--常见的程序)
注意
本次搭建为X86_64架构便于本地调试,其他架构版本需要具体硬件设备(如树莓派)
2.3 编译
$ make V=s
编译生成目录
编译完成之后的二进制文件(完整的bin文件,所有的ipk文件)存放于bin目录
2.4 运行
本次展示的是x86_64平台下编译出来的虚拟机
文件名(openwrt-x86-64-combined-ext4.vmdk)
Vmware打开并载入
开启dropbear
连接
3. 安全问题思考
3.1 后端代码
3.1.1 Lua语言后台
以小米某款产品为例
根文件系统
后端代码
controller ---- Web路由
查看路由,代码审计可能出现的一系列漏洞(未授权、命令注入、越权、xss、目录穿越等)
3.1.2 Boa-开源http服务器
360某款产品,并没有采用Openwrt官方提供的Lua语言,而是通过自己研发的boa,对HTTP请求进行处理
根文件
逆向分析
3.2 硬编码
/etc/passwd和/etc/shadow是否存在初始密码
telnet与ssh服务是否存在默认票据且无法修改
某款路由器存在硬编码
#!/bin/sh
echo [$0]: $1 ... > /dev/console
orig_devconfsize=`xmldbc -g /runtime/device/devconfsize`
entn=`devdata get -e ALWAYS_TN`
if [ "$1" = "start" ] && [ "$entn" = "1" ]; then
telnetd -i br0 -t 99999999999999999999999999999 &
exit
fi
if [ "$1" = "start" ] && [ "$orig_devconfsize" = "0" ]; then
if [ -f "/usr/sbin/login" ]; then
image_sign=`cat /etc/config/image_sign`
telnetd -l /usr/sbin/login -u Alphanetworks:$image_sign -i br0 &
else
telnetd &
fi
else
killall telnetd
fi
3.3 后门漏洞
一般嵌入式设备除了处理开放80、443端口,也会开启其他端口(53、22、23端口)
除了对常规的Web端口进行逆向分析,也需要我们查看是否存在其他端口的程序可让攻击者通过某种认证方式连接,从而达到命令执行的目的。
NetCore(磊科)全系列路由器后门漏洞
igdmtpd 监听53413端口
总结
通过本篇文章希望让大家对Openwrt的组织架构有个更加清晰认识,为后面的IoT安全研究起到一个铺垫的作用。