收起左侧

给FNCONNECT再套一层防护(有损方法)

1
回复
35
查看
[ 复制链接 ]

5

主题

11

回帖

0

牛值

江湖小虾

声明: 请理解文件命令再操作,风险需自己承担;

总结

  • 版本: fnos v1.1.23
  • 功能: 对通过fnconnect的三级域名(如xxx.fnos.net)的请求校验
  • 缺陷: 域名情况下只能在网页端访问, 手机APP用不了
  • 补充:
    • 对通过fnconnect的四级域名(如yyy.xxx.fnos.net)的请求不校验, 目前我了解的是这类请求都需要先登录三级域名, 比如docker的端口映射项目;
    • 可能会出现fnconnect无法开启或域名访问提示服务不可用, 多试几次;
    • 局域网的网页和APP通过IPV4访问不受影响, 但是如果经过[::1]:5666,那么会受到影响;
  • 请求过程:
    • 调整前: 浏览器->fn服务器->本机的pxy程序->[::1]:5666(nginx)
    • 调整后: 浏览器->fn服务器->本机的pxy程序->(目标端口被iptables更改)->[::1]:6010(nginx)->(nginx检查header)->127.0.0.1:5666(nginx)
  • 效果图

无标题.png

分析

  • 观察到pxy程序是连接的[::1]:5666端口
# 先用域名访问一下, 然后执行
sudo lsof -i :5666 -n
# 输出如下,可以观察到建立的连接
pxy [::1]xxxxx <> [::1]:5666
# 如果你的输出的目标地址不是[::1]:5666,那么本文只能提供参考,不能直接使用
  • 抓包,通过curl命令访问,进一步确认
sudo tcpdump  -i lo -s 0 -w b.pcap host ::1 and port 5666

curl -v -H "Cookie: mode=relay" https://更换为你的域名/static/app/icons/trim.file-manager/icon.png

实现

  • 创建含校验的nginx代理服务
mkdir -p /vol1/1000/App/nginx-pxy
cd /vol1/1000/App/nginx-pxy

echo 'no token? no page!' > no_token.html
chmod o+r no_token.html

touch default.conf
  • 登录网页版,在我的文件下找到default.conf, 用文本编辑器打开,填入下面的内容
server {
    listen       [::1]:6010; # pxy程序用
    listen       6011; # 本地调试用,后期可删除
    
    # 修改这个配置值,不能被别人知道
    set $v_my_token_value "a8f09a95";

    set $v_302_prefix "/";
    if ($http_x_forwarded_host){
    	set $v_302_prefix https://$http_x_forwarded_host;
    }

    # my_token_page这个地址也要修改,不能被别人知道
    location = /my_token_page  {
        add_header Set-Cookie "x_my_token=$v_my_token_value; Path=/; Max-Age=3600; SameSite=Strict; HttpOnly";
        return 302 $v_302_prefix;
    }
    location = /no_token.html{
    	alias /etc/nginx/conf.d/no_token.html;
    }

	location / {
        if ($cookie_x_my_token != $v_my_token_value) {
        	add_header Set-Cookie "mode=relay; Path=/; HttpOnly";
	        return 302 $v_302_prefix/no_token.html;
        }
        
	    proxy_http_version 1.1; 
	    proxy_set_header Host $host;
	    proxy_set_header X-Forwarded-Proto $scheme;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    proxy_set_header Upgrade $http_upgrade;
	    proxy_set_header Connection "upgrade";
	    
	    proxy_pass http://127.0.0.1:5666;
	}
}
  • 拉取最新的nginx的docker镜像

  • 创建nginx容器

    • 端口设置: 删除预设的80端口映射
    • 存储位置: /vol1/1000/App/nginx-pxy 映射到 /etc/nginx/conf.d
    • 网络: 选host,不选bridge
  • 启动nginx容器

  • 先局域网访问6011端口,验证代理是否正常,校验是否生效

    • chrome打开一个访客/隐私窗口, 访问 设备IP:6011
      • 正常是提示无权限/口令
    • 修改地址,访问 设备IP:6011/my_token_page (my_token_page替换为前面修改后的值)
      • 正常是会跳转到登录界面,可以正常登录和操作
  • 关键, 最好在局域网操作,可能会丢失连接,移花接木,将pxy流量重定向到新建nginx的6010端口
    ip6tables -t nat -I OUTPUT 1 -p tcp --dport 5666 -d ::1 -j DNAT --to-destination [::1]:6010

  • 通过域名访问验证效果

  • 记得修改 v_my_token_value的值 和 my_token_page这个字符串 , 只能你自己知道

  • 对于有WAF的人来说,只需最后一个命令, nginx的就不用了

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

5

主题

11

回帖

0

牛值

江湖小虾

3 小时前 楼主 显示全部楼层

更正一下,有几个请求地址不能拦截,会导致新浏览器连接失败

原配置

if ($cookie_x_my_token != $v_my_token_value) {
    add_header Set-Cookie "mode=relay; Path=/; HttpOnly";
    return 302 $v_302_prefix/no_token.html;
}

新配置

set $v_to_302 "Y";
if ($uri = "/favicon.ico"){
    set $v_to_302 "N";
}
if ($uri = "/trimcon/redirect"){
    set $v_to_302 "N";
}
if ($uri = "/trimcon/cookie"){
    set $v_to_302 "N";
}
if ($uri = "/trimcon"){
    set $v_to_302 "N";
}
if ($cookie_x_my_token = "$v_my_token_value" ) {
    set $v_to_302 "N";
}

if ($v_to_302 = "Y") {
    add_header Set-Cookie "mode=relay; Path=/; HttpOnly";
    return 302 $v_302_prefix/no_token.html;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则