用户
搜索
  • TA的每日心情

    2021-7-15 15:48
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]经常看看II

    i春秋-核心白帽

    知识面,决定看到的攻击面有多广。知识链,决定发动的杀伤链有多

    Rank: 4

    41

    主题

    293

    帖子

    1167

    魔法币
    收听
    0
    粉丝
    84
    注册时间
    2016-4-17

    秦i春秋签约作者

    Vulkey_Chen i春秋-核心白帽 知识面,决定看到的攻击面 秦 i春秋签约作者 楼主
    发表于 2021-12-14 10:03:41 12706

    前言

    近期Log4j漏洞席卷而来,大家都忙得不可开交,对于攻击者来说这是好用的利器,而对于防御者来说这是一场与时间赛跑的应急挑战。大家都在忙着处理这个漏洞,关于这个漏洞的细节就不多说了,说一下我发现的一个问题,近期大家疯狂刷屏各家存在这个漏洞,但是真的都是存在吗?不尽然,很多人依靠一张DNSLog的截图就说存在漏洞,很显然这并不合理,因为你输入的Payload中包含了一个域名,在黑盒的情况下,这个域名你永远不知道在什么地方被处理过,很有可能是其他的功能去处理了这个域名而不是Log4j这个组件。

    进阶

    综上所述,单纯依靠DNSLog去判断存在Log4j显然不可取,不仅如此,防御者在内网对自己的业务、产品做验证的时候,由于内网环境没有DNS服务无法搭建DNSLog平台,这种方式就更加没法应用到内部的安全验证,所以,我们需要找到一个更加直接的方法,这里我们完全可以直接搭建一个LDAP服务,LDAP有Receive就说明确实存在漏洞。但是,这样也同样存在一个问题,现成的JNDI注入工具开启服务并没有API可以直接拉取对应服务的结果,这就导致需要人工去查看,很费时间,再加上已经写好BurpSuite被动插件进行扫描了,为了节省时间就简单写了一个脚本用于获取JNDI工具的执行结果并通过API的形式返回,便于插件拉取结果进行漏洞验证。

    脚本

    项目地址:https://github.com/gh0stkey/Command2API

    代码如下,原理就是一个线程开启Web服务,一个线程执行命令,通过全局变量与Web服务共享执行命令的结果:

    import subprocess
    import BaseHTTPServer
    import SimpleHTTPServer
    import cgi
    import threading
    import sys
    import string
    import random
    
    l = []
    
    uri = '/' + ''.join(random.sample(string.ascii_letters+string.digits,8))
    
    class thread(threading.Thread):
        def __init__(self, threadname, command):
            threading.Thread.__init__(self, name='Thread_' + threadname)
            self.threadname = int(threadname)
            self.command = command
    
        def run(self):
            global l
            ret = subprocess.Popen(
                self.command,
                shell=True,
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            for i in iter(ret.stdout.readline, b""):
                res = i.decode().strip()
                print(res)
                l.append(res)
    
    class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
        def do_GET(self):
            global l
            if self.path == uri:
                self.wfile.write(l)
    
    if __name__ == '__main__':
        # New Thread: Get Command Result
        t1 = thread('1', sys.argv[1])
        t1.start()
        # Webserver
        port = int(sys.argv[2])
        print("URL: http://HOST:{0}{1}".format(port, uri))
        Handler = ServerHandler
        httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', port), Handler)
        httpd.serve_forever()

    使用方法:

    python Command2Api.py "执行的命令" Web运行的端口

    结合BurpSuite插件自动验证:

    欢迎关注「凌驭空间·OverSpace」安全团队:OverSpace.Cn
    提示: 作者被禁止或删除 内容自动屏蔽
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册