集成二十六种未授权访问

作者:Sec-Labs | 发布时间:

支持以下未授权访问

  • Active MQ
  • Atlassian Crowd
  • CouchDB
  • Docker
  • Dubbo
  • Druid
  • Elasticsearch FTP
  • Hadoop
  • JBoss
  • Jenkins
  • Jupyter Notebook
  • Kibana
  • Kubernetes Api Server
  • LDAP
  • MongoDB
  • Memcached
  • NFS
  • Rsync
  • Redis
  • RabbitMQ
  • Solr
  • Spring Boot Actuator
  • Weblogic
  • ZooKeeper
  • Zabbix

核心代码

Unauthorized.py

import requests
import argparse
import socket
import urllib3
import ftplib
import platform
import os
import sys
import pymongo
import threading
import config
from ldap3 import Connection, Server, ALL
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'
}

RabbitMQheaders = {
    'authorization': 'Basic Z3Vlc3Q6Z3Vlc3Q=',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
}



def ActiveMQ(target):
    url = target + config.ActiveMQVuln
    try:
        basicAuth = requests.get(url, headers, verify=False, auth=('admin', 'admin'))
        if basicAuth.status_code == 200 and "Version" in basicAuth.text:
            print("[!]ActiveMQ Unauthorized", url)
    except Exception:
        pass


def AtlassianCrowd(target):
    url = target + config.AtlassianCrowdVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 400:
            print("[!]AtlassianCrowd Unauthorized(RCE https://github.com/jas502n/CVE-2019-11580)", url)
    except Exception:
        pass


def CouchDB(target):
    url = target + config.CouchDBVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "version" in vuln.text:
            print("[!] CouchDB Unauthorized", url)
    except Exception:
        pass


def DockerAPI(target):
    url = target + config.DockerAPIVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "Version" in vuln.text:
            print("[!] DockerAPI Unauthorized", url)
    except Exception:
        pass


def Dubbo(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    ip = socket.gethostbyname(url)
    try:
        socket.setdefaulttimeout(5)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, config.DubboVuln))
        s.send(bytes("status -l\r\n", 'UTF-8'))
        result = s.recv(1024).decode()
        if "server" in result:
            print("[!] Dubbo Unauthorized", ip)
        s.close()
    except Exception:
        pass


def Druid(target):
    url = target + config.DruidVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "Druid Stat Index" in vuln.text:
            print("[!] Druid Unauthorized", url)
    except Exception:
        pass


def Elasticsearch(target):
    url = target + config.ElasticsearchVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "/_cat/master" in vuln.text:
            print("[!] Elasticsearch Unauthorized", url)
    except Exception:
        pass


def Ftp(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    ip = socket.gethostbyname(url)
    try:
        ftp = ftplib.FTP()
        ftp.connect(ip, config.FtpVuln)
        ftp.login("anonymous", "anonymous")
        print("[!] FTP Unauthorized", ip)
    except Exception:
        pass


def HadoopYARN(target):
    url = target + config.HadoopYARNVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "All Applications" in vuln.text:
            print("[!] HadoopYARN Unauthorized", url)
    except Exception:
        pass


def JBoss(target):
    url = target + config.JBossVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "JBoss JMX Management Console" in vuln.text:
            print("[!] JBoss Unauthorized", url)
    except Exception:
        pass


def Jenkins(target):
    url = target + config.JenkinsVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "Jenkins-Crumb" in vuln.text:
            print("[!] Jenkins Unauthorized", url)
    except Exception:
        pass


def JupyterNotebook(target):
    url = target + config.JupyterNotebookVuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "Jupyter Notebook" in vuln.text:
            print("[!] JupyterNotebook Unauthorized", url)
    except Exception:
        pass


def Kibana(target):
    url = target + config.Kibanavuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "Visualize" in vuln.text:
            print("[!] Kibana Unauthorized", url)
    except Exception:
        pass


def KubernetesApiServer(target):
    url = target + config.KubernetesApiServervuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "paths" in vuln.text and "/api" in vuln.text:
            print("[!] KubernetesApiServer", url)
    except Exception:
        pass


def ldap_anonymous(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    try:
        server = Server(url, get_info=ALL, connect_timeout=1)
        conn = Connection(server, auto_bind=True)
        print("[+] ldap login for anonymous")
        conn.closed()
    except Exception:
        pass


def Weblogic(target):
    url = target + config.Weblogicvuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "管理控制台主页" in vuln.text and "注销" in vuln.text:
            print("[!] Weblogic Unauthorized", url)
    except Exception:
        pass


def Solr(target):
    url = target + config.Solrvuln
    try:
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "Collections" in vuln.text and "Cloud" in vuln.text:
            print("[!] Solr Unauthorized", url)
    except Exception:
        pass


def Springboot(target):
    try:
        url = target + config.Springbootvuln
        vuln = requests.get(url, headers, verify=False)
        if vuln.status_code == 200 and "/info" in vuln.text and "/health" in vuln.text:
            print("[!] SpringbootActuator Unauthorized", url)
    except Exception:
        pass


def RabbitMQ(target):
    url = target + config.RabbitMQvuln
    try:
        vuln = requests.get(url, headers=RabbitMQheaders, verify=False)
        if vuln.status_code == 200 and "guest" in vuln.text:
            print("[!] RabbitMQ Unauthorized", url)
    except Exception:
        pass


def Zabbix(target):
    url = target + config.Zabbixvuln
    try:
        vuln = requests.get(url, headers=RabbitMQheaders, verify=False)
        if vuln.status_code == 200 and "Latest data" in vuln.text:
            print("[!] RabbitMQ Unauthorized", url)
    except Exception:
        pass


def Redis(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    ip = socket.gethostbyname(url)
    try:
        socket.setdefaulttimeout(10)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, config.Redisvuln))
        s.send(bytes("INFO\r\n", 'UTF-8'))
        result = s.recv(1024).decode()
        if "redis_version" in result:
            print("[!] Redis Unauthorized", ip)
        s.close()
    except Exception:
        pass


def Rsync(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    if "Linux" in platform.platform():
        rsynctext = "rsync  " + "rsync://" + url + config.Rsyncvuln
        result = os.popen(rsynctext)
        bool = False
        for line in result:
            if "Password:" in line:
                bool = True
                return
        if bool:
            print("[!] Rsync Unauthorized", url)
    else:
        print("[*] Windows does not support Rsync unauthorized scanning")


def NFS(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    if "Linux" in platform.platform():
        rsynctext = "showmount  -e  " + url
        result = os.popen(rsynctext)
        for line in result:
            if "Export list" in line:
                print("[!] NFS Unauthorized", url)
                return
    else:
        print("[*] Windows does not support NFS unauthorized scanning")


def Memcache(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    ip = socket.gethostbyname(url)
    try:
        socket.setdefaulttimeout(10)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, config.Memcachevuln))
        s.send(bytes("stats\r\n", 'UTF-8'))
        result = s.recv(1024).decode()
        if "STAT version" in result:
            print("[!] Memcachevuln Unauthorized", ip)
        s.close()
    except Exception:
        pass


def MongoDB(target):
    try:
        conn = pymongo.MongoClient(target, config.MongoDBvuln, socketTimeoutMS=3000)
        dbname = conn.database_names()
        if dbname:
            print("[!] MongoDB Unauthorized")
    except Exception:
        pass


def Zookeeper(target):
    url = target.replace("http://", "")
    if "https://" in target:
        url = target.replace("https://", "")
    ip = socket.gethostbyname(url)
    try:
        socket.setdefaulttimeout(10)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, config.Zookeepervuln))
        s.send(bytes("envi\r\n", 'UTF-8'))
        result = s.recv(1024).decode()
        if "Environment" in result:
            print("[!] Zookeeper Unauthorized", ip)
        s.close()
    except Exception:
        pass


def cmd():
    parser = argparse.ArgumentParser(usage="python Unauthorized.py -t http://target.com",
                                     description="集成二十六种未授权访问 [Active MQ ,Atlassian Crowd ,CouchDB ,Docker ,Dubbo ,Druid ,Elasticsearch ,FTP ,Hadoop ,JBoss ,Jenkins ,Jupyter Notebook ,Kibana ,Kubernetes Api Server ,LDAP ,MongoDB ,Memcached ,NFS ,Rsync ,Redis ,RabbitMQ ,Solr ,Spring Boot Actuator ,Weblogic ,ZooKeeper ,Zabbix]")
    parser.add_argument("-t", "--target", help="Set Target", type=str)
    args = parser.parse_args()
    return args


if __name__ == '__main__':
    if len(sys.argv) == 1:
        print("Usage: python Unauthorized.py -h")
        sys.exit()
    args = cmd()
    target = args.target
    if target[-1] == "/":
        target = sys.argv[1].strip("/")
    functionname = [ActiveMQ, AtlassianCrowd, CouchDB, DockerAPI, Dubbo, Druid,
                    Elasticsearch, Ftp, HadoopYARN, JBoss, Jenkins, JupyterNotebook,
                    Kibana, KubernetesApiServer, ldap_anonymous, Weblogic, Solr, Springboot,
                    RabbitMQ, Zabbix, Redis, Rsync, NFS, Memcache, MongoDB, Zookeeper
                    ]
    for func in functionname:
        thread = threading.Thread(target=func, args=(target,))
        thread.start()

配置文件config.py

ActiveMQVuln = "/admin"
AtlassianCrowdVuln = "/crowd/admin/uploadplugin.action"
CouchDBVuln = ":5984"
DockerAPIVuln = ":2375/version"
DubboVuln = 20880
DruidVuln = "/druid/index.html"
ElasticsearchVuln = ":9200/_cat"
FtpVuln = 21
HadoopYARNVuln = ":8088/cluster"
JBossVuln = ":8080/jmx-console/"
JenkinsVuln = ":8080/script"
JupyterNotebookVuln = ":8889/tree"
Kibanavuln = ":5601/app/kibana#"
KubernetesApiServervuln = ":6443"
Weblogicvuln = ":7001/console/css/%252e%252e%252fconsole.portal"
Solrvuln = ":8983/solr/#/"
Springbootvuln = "/actuator/"
RabbitMQvuln = "/api/whoami"
Zabbixvuln = "/latest.php?ddreset=1"
Redisvuln = 6379
Rsyncvuln = ":873/"
Memcachevuln = 11211
MongoDBvuln = 27017
Zookeepervuln = 2181

 

标签:工具分享