前言
近期Log4j漏洞席卷而来,大家都忙得不可开交,对于攻击者来说这是好用的利器,而对于防御者来说这是一场与时间赛跑的应急挑战。大家都在忙着处理这个漏洞,关于这个漏洞的细节就不多说了,说一下我发现的一个问题,近期大家疯狂刷屏各家存在这个漏洞,但是真的都是存在吗?不尽然,很多人依靠一张DNSLog的截图就说存在漏洞,很显然这并不合理,因为你输入的Payload中包含了一个域名,在黑盒的情况下,这个域名你永远不知道在什么地方被处理过,很有可能是其他的功能去处理了这个域名而不是Log4j这个组件。
进阶
综上所述,单纯依靠DNSLog去判断存在Log4j显然不可取,不仅如此,防御者在内网对自己的业务、产品做验证的时候,由于内网环境没有DNS服务无法搭建DNSLog平台,这种方式就更加没法应用到内部的安全验证,所以,我们需要找到一个更加直接的方法,这里我们完全可以直接搭建一个LDAP服务,LDAP有Receive就说明确实存在漏洞。但是,这样也同样存在一个问题,现成的JNDI注入工具开启服务并没有API可以直接拉取对应服务的结果,这就导致需要人工去查看,很费时间,再加上已经写好BurpSuite被动插件进行扫描了,为了节省时间就简单写了一个脚本用于获取JNDI工具的执行结果并通过API的形式返回,便于插件拉取结果进行漏洞验证。
脚本
项目地址:https://github.com/gh0stkey/Command2API
代码如下,原理就是一个线程开启Web服务,一个线程执行命令,通过全局变量与Web服务共享执行命令的结果:
```python
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.send_response(200)
self.send_header('Content-Type', 'text/plain')
self.end_headers()
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
python Command2Api.py "执行的命令" Web运行的端口
YApi是高效 、易用 、功能强大 的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论