通过Quectel EG25-G调制解调器上的AT命令以root用户身份执行代码(2021年)

2022-02-14 20:15:34

正如我在上一篇博文末尾提到的,我详细介绍了在PinePhone上运行我的博客';在GSM/WWAN/GPS调制解调器上,我怀疑负责解析调制解调器上AT命令的守护进程';s端易受OS命令注入的影响,因为它使用了大量的system()调用。我的直觉证明是真的。

在其他通道中,PinePhone通过PinePhone上的串行线-/dev/ttyUSB2';s侧和调制解调器上的/dev/ttyHSL0';s方。

调制解调器,与PinePhone#39分开运行完整的Linux安装;s主操作系统,接收这些命令,解析它们,并根据程序逻辑执行它们。之后,调制解调器会通过串行线路返回OK(正常)或ERROR(错误)到手机。主要负责此操作的守护程序是atfwd_守护程序。

获取守护进程很容易。它';设置adb访问并使用adb提取是可能的。它';也可以简单地从固件中提取它';更新软件包,因为它';它没有任何加密方式。

在Ghidra中加载atfwd_守护进程表明,可执行文件在文件的233个不同位置使用system()。那';s、 很多。

虽然将system()与用户输入一起使用从来都不是一个好主意,但大多数调用都无法被利用,因为它们是硬编码的,或者用户输入使用sprintf()转换为整数:

但是,在一些地方,用户输入是sprintf()-d,作为%s,并且没有对用户输入执行检查或清理。

在这里,我们可以看到param1[1]被格式化为ipth_dme-dmacc%s;,然后将其传递给system()。什么';值得注意的是,系统上根本不存在ipth_dme,因此该程序永远不会运行。

遍历程序执行流程,我们可以看到上一个屏幕截图中的切换情况是在用户输入的某些部分以"开头时触发的;dmacc";。这是在一个名为quectel_parse_fumo_cfg_cmd_params()的例程中检查的:

进一步向上看,我们可以看到解析该输入的相关命令是+QFUMOCFG:

由此,我们可以推断任意命令的执行是可能的。例如,我们可以使用backticks在子shell中执行命令。例如,要重新启动调制解调器:

由于守护进程以root用户身份运行,因此代码也以root用户身份在调制解调器上执行。

例如,在这个Asciinema记录中,我cat/etc/passwd并运行id,然后将数据返回到PinePhone';通过串行线路传输操作系统:

它';很可能这个漏洞也会影响其他Quectel产品,因为固件通常会被重用,但我没有其他硬件来测试它。