利用binfmt_misc机制加快CGI调试

admin 2025-12-29 00:53:51 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了利用Linux内核binfmt_misc机制优化CGI程序调试的方法。通过注册自定义解释器,将.cgi文件或特定架构程序重定向至gdbserver代理脚本,避免繁琐的进程附加步骤。该方法适用于本地及qemu模拟环境,能保留真实环境变量,显著提升漏洞分析与逆向调试效率。 综合评分: 93 文章分类: 逆向分析,二进制安全,IoT安全,漏洞分析,安全工具


cover_image

利用binfmt_misc机制加快CGI调试

原创

ha1vk

奇安信天工实验室

2025年6月25日 11:30 北京

一、binfmt_misc介绍

二、binfmt_misc机制分析

三、注册一个新的配置文件

四、binfmt_misc的利用

五、总  结

binfmt_misc介绍

binfmt_misc是Linux内核的一项功能,其使得内核可识别任意类型的可执行文件格式并传递至特定的用户空间应用程序,如模拟器和虚拟机。例如在装有qemu的x86-64的Linux中可以直接执行ARM64程序不需要指明使用qemu。

binfmt_misc机制分析

要使用binfmt_misc机制,首先需要挂载binfmt_misc

在/proc/sys/fs/binfmt_misc文件夹下会有一些已经注册的配置文件,分别用来处理各种个样的二进制程序:

配置文件中的内容一般有interpreter 文件交给哪个处理程序、magic 匹配文件头、mask 匹配文件头时使用的掩码

type应为E或M类型:

  • 若类型为E,则可执行文件格式由其文件扩展名进行识别:magic是与二进制格式相关联的文件扩展名;此时忽略offset和mask参数。
  • 若类型为M,则可执行文件格式通过文件中的offset的(默认为0)magic数字识别;mask是全默认为 0xFF的bitmask,其用于指示数字中存在意义的二进制位。

flags: 这些标志控制解析器的行为和操作方式。

下面是一些常见的 flags 标志及其作用:

  • O:覆盖(Override)标志。当多个解析器的匹配规则冲突时,使用具有此标志的解析器进行匹配和执行。
  • E:可执行文件标志。指定解析器用于执行可执行文件的功能。
  • F:开启自动刷新标志。当启用此标志时,每次访问 register 文件时都会重新加载解析器配置。
  • C:关闭自动刷新标志。当关闭此标志时,解析器配置只在系统启动时加载一次,之后不会自动刷新。
  • B:启用解析器的特权执行。这将允许使用具有特权的解析器执行文件。
  • M:启用魔数验证标志。指定解析器在匹配时必须验证魔数。

注意事项:offset+size(magic) 必须小于 128,解释器字符串不得超过 127 个字符。

注册一个新的配置文件

使用echo “:name:type:offset:magic:mask:interpreter:flags” > /proc/sys/fs/binfmt_misc/register的格式来注册配置文件,例如我们可以注册一个这样的配置文件:

并使用这样的文件内容来触发:

要取消注册一个配置文件,可以执行echo -1 > /proc/sys/fs/binfmt_misc/xxx

我们还可以使用扩展名匹配的方式echo “:hello:E::log::/bin/cat:O” > /proc/sys/fs/binfmt_misc/register

binfmt_misc的利用

01

CGI程序调试

在调试CGI程序时,一般需要先用gdb附加到类似于httpd的主进程上,然后慢慢的跟踪子进程的创建,最后一步一步的才能调试到CGI程序;又或者是对CGI程序打补丁,加入sleep函数给gdb附加创造一个时机。有了binfmt_misc机制,CGI调试可以变得非常简单,对于带有.cgi后缀的,我们可以直接使用扩展名匹配的方式,将.cgi程序交给gdb来启动 为了过滤出想要调试的具体cgi程序,我们需要写一个中间代理程序。

中间代理程序会检查要执行的程序,如果是test2.cgi,那么就会使用 /usr/bin/gdb -x /mnt/hgfs/works/share/script.gdb –args /tmp/test2.cgi.tmp xxxx,这里我们需要拷贝一份CGI程序,同时后缀要加上.tmp防止gdb启动CGI时再次匹配上.cgi后缀进入一个死循环。

在实际调试时,我们应该使用gdbserver而不是gdb来启动CGI,因为CGI的标准输入输出不在终端,因此稍微修改一下:

CGI被httpd等程序启动时,会自动进入gdbserver监听1234端口等待调试。

02

qemu-user模拟下的CGI调试

以模拟调试Cisco RV340的CGI为例,使用chroot + qemu-arm-static基本可以将根文件系统模拟起来,虽然有报错但是http服务可以正常启动。

对qemu-arm的binfmt_misc配置文件首先进行取消注册echo -1 > /proc/sys/fs/binfmt_misc/qemu-arm,然后注册新的配置,将ARM程序交给中间代理程序debug进行处理:

中间代理程序debug如下:

代理程序过滤了/www/cgi-bin/upload.cgi,如果匹配到这个CGI,就会执行/qemu-arm-static -g 1234 /www/cgi-bin/upload.cgi进入调试模式。

此时可以直接使用gdb-multiarch进行远程附加,可以看到环境变量传递这些一个不漏,比手动执行CGI然后构造REQUEST_METHOD=POST QUERY_STRING的方式要更加的方便快捷,是服务器真实传递给CGI的参数。

总  结

binfmt-misc机制可以匹配任意格式的文件并将文件传递给注册的处理程序进行处理。我们可以借助binfmt-misc机制来对一些特定的程序进行处理,比如加入调试、监听程序的打开等操作。

参考链接

1. binfmt_misc wiki

2. binfmt_misc CSDN

【版权说明】

【版权说明】

本作品著作权归ha1vk所有

未经作者同意,不得转载

ha1vk

二进制安全研究员,BlackHat USA 2022 WASM演讲者,擅长IOT、硬件、内核等方面的研究

往期回顾

01

CVE-2025-49113 漏洞分析与利用方式

02

CVE-2024-47575 漏洞分析及三种利用方式

03

通用Linux x64内核态shellcode编写技巧

04

基于路由转发导致的权限认证绕过漏洞分析

每周三更新一篇技术文章  点击关注我们吧!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:奇安信天工实验室 ha1vk《利用binfmt_misc机制加快CGI调试》

评论:0   参与:  0