内网渗透代理之frp的应用与改造(一)

内⽹渗透代理之frp的应⽤与改造(⼀)
0×0 前⾔
在内⽹渗透中,通常为了团队协作和代理的稳定性,我会选择⼀个合适且持久的沦陷主机来通过docker⼀键搭建OpenVPN,但是对于通过钓鱼等⽅式获取到window⼯作机器,⽤来搭建OpenVPN显然是不太⽅便(个⼈觉得过于笨重,安装⿇烦且容易被发现),所以当时⾃⼰就在⽹上物⾊⼀些⽐较轻便、稳定、⾼速且⽀持socks代理的⼯具来满⾜⾃⼰的场景需求。
0×1 前置知识
0x1.1 socks 协议
socks是⼀种⽹络传输协议,主要⽤于客户端与外⽹服务器之间通讯的中间传递。SOCKS是”SOCKetS”的缩写。
汽车板材当防⽕墙)后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外⽹的资格,允许的话,就将客户端的请求发往外部的服务器。
这个协议最初由David Koblas开发,⽽后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前⼀版本相⽐,增加⽀持UDP、验证,以及IPv6。
根据OSI模型,SOCKS是会话层的协议,位于表⽰层与传输层之间。
SOCKS协议不提供加密
可以简单理解为socks是⼀种代理协议,处于中介的⾓⾊,被⼤多数软件所⽀持,⽀持多种协议的数据转发。
0x1.2 kcp协议
KCP是⼀个快速可靠协议,能以⽐ TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最⼤延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使⽤者⾃⼰定义下层数据的发送⽅式,以 callback的⽅式提供给 KCP。连时钟都需要外部传递进来,内部不会有任何⼀次系统调⽤。
TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利⽤带宽。⽽ KCP是为流速设计的(单个数据从⼀端发送到⼀端需要多少时间),以10%-20%带宽浪费的代价换取了⽐ TCP0%-40%的传输速度。
可以简单理解为基于udp的KCP协议就是在保留UDP⾼传输速度的同时尽可能地提⾼了可靠性。
0×2 frp使⽤
通过阅读frp的说明⽂档,可以知道frp⽀持相当多的功能,有兴趣的可以⾃⾏挖掘⼀下。
这⾥只说明下⾃⼰在内⽹渗透中最常使⽤的配置,主要涉及到稳定性和加密两个点。
0x2.1 kcp模式对⽐
在⽹络环境⽐较差的时候,使⽤kcp能够有效提⾼传输效率。
(1) 没有开启kcp模式
frps.ini
船长教学设计
国家标准馆•伯特兰德
[common] bind_addr= 0.0. 0.0 bind_port= 7000 # IP 与 bind_addr 默认相同,可以不设置# dashboard_addr = 0.0.0.0#端⼝必须设置,只有设置web页⾯才⽣效dashboard_port= 7500# ⽤户密码保平安dashboard_user= xq17 dashboard_pwd= admin888 # 允许客户端绑定的端⼝#allow_ports =
电信网技术
发出商品科目40000-50000frpc.ini [common]server_addr= 101.200. 157.195server_port= 7000[plugin_socks5]type= tcp remote_port= 6005plugin= socks5 plugin_user= abc plugin_passwd= abc (2) 开启KCPfrps.ini [common] 下添加 kcp_bind_port参数即可 [common]bind_addr= 0.0.
0.0bind_port= 7000# 开启kcp模式kcp_bind_port= 7000# IP 与 bind_addr 默认相同,可以不设置# dashboard_addr = 0.0.0.0# 端⼝必须设置,只有设置web页⾯才⽣效dashboard_port= 7500# ⽤户密码保平安dashboard_user= xq17 dashboard_pwd= admin888 # 允许客户端绑定的端⼝#allow_ports = 40000-50000frpc.ini [common]下添加
protocol=kcp即可 [common]server_addr= 101.200. 157.195# kcp监听的端⼝server_port= 7000protocol= kcp [plugin_socks5]type= tcp remote_port= 6005plugin= socks5 plugin_user= abc plugin_passwd= abc 可以看到⽆论在下载还是延迟上都有了很⼤的优化,由于⽀持端⼝复⽤, 就算环境不⽀持kcp也不会出错,所以这个选项建议默认开启。
0x2.2 TLS 加密模式对⽐从 v0.25.0 版本开始 frpc 和 frps 之间⽀持通过 TLS 协议加密传输。通过在 frpc.ini 的 common 中配置 tls_enable = true 来启⽤此功能,性更⾼。为了端⼝复⽤,frp 建⽴ TLS 连接的第⼀个字节为 0x17。通过将frps.ini 的 [common] 中 tls_only 设置为 true,可以强制 frps 只接受 TLS 连接。注意: 启⽤此功能后除 xtcp 外,不需要再设置 use_encryption。 (1) 没有开启TLS加密当
没有开启TLS加密的时候,我们可以⽤WireShark抓包分析⼀下流量。规则: ip.dst == 101.200.157.195 || tcp.port == 7000 || udp.port == 7000由于开启了KCP所以抓到的包⾛的是UDP协议。通过观测udp stream, 可以看到:前⾯4次udp数据报可以看到client和Server进⾏版本、任务信息的校鉴过程。我们尝试使⽤socks5的插件请求www.speedtest/这个⽹站进⾏测速,然后观察wireshark的流量情况。查看Firefox 使⽤socks5的流量规则: tcp.port == 6006直接跟踪流可以看到信息发送和返回都是明⽂传输的,这个其实关系不⼤,因为这些信息是暴露在我们这边,我们再分析下client端的数据交互。可以看到前⾯⼏个包都是再进⾏⼀些数据交换,其中出现了很多特定特征,我们可以跟踪 udp stream 其中数据也没有进⾏加密在这种代理模式下,是很容易被拦截的,数据传输安全得不到保证。(2) 开启TLS加密只需在frpc.ini 的 [common] 中配置tls_enable = true 来启⽤此功能
[common]server_addr= 101.200. 157.195server_port= 7000protocol= kcp tls_enable= true[plugin_socks5]type= tcp remote_port= 6006plugin= socks5 plugin_user= abc plugin_passwd= abc 我们再通过wireshark看下流量的情况:可以看到整个流量过程都已经被加密了。⽹络传输的质量保持也良好,不过出现了⽐较多EOF的错误,不知道是否会对某些情况产⽣影响。0x2.3 负载均衡如果我们同时拿到了多台内⽹机器,为了进⼀步提⾼代理的稳定性,同时也希望避免沦陷主机资源负载过⾼等异常情况。我们可以考虑使⽤frp的负载均衡的配置来分担流量,同时开启frp⾃带的健康检查,避免出现服务单点故障,从⽽实现⾼可⽤架构的稳定代理。查阅相关⽂档,得知其⽤法:server: frps.ini [common]bind_addr= 0.0.
0.0bind_port= 7000kcp_bind_port= 7000# IP 与 bind_addr 默认相同,可以不设置# dashboard_addr = 0.0.0.0# ,只有设置web页⾯才⽣效dashboard_port= 7500# ⽤户密码保平安dashboard_user= xq17 dashboard_pwd= admin888 client1: frpc.ini [common]server_addr= 101.200. 157.195# kcp监听的端⼝server_port= 7000protocol= kcp
[client_socks5_one]type= tcp remote_port= 6005plugin= socks5 # 启⽤健康检查,类型为 tcphealth_check_type= tcp #建⽴连接超时时间为 3 秒health_check_timeout_s= 3# 连续 3 次检查失败,此 proxy 会被摘除
建⽴连接超时时间为 3 秒health_check_timeout_s= 3# 连续 3 次检查失败,此 proxy 会被摘除
health_check_max_failed= 3# 每隔 10 秒进⾏⼀次健康检查health_check_interval_s= 10# 负载均衡配置客户组group= load_balance group_key= 123client2: frpc.ini [common]server_addr= 101.200. 157.195# kcp监听的端⼝server_port= 7000protocol= kcp [client_socks5_two]type= tcp remote_port= 6005plugin= socks5 # 启⽤健康检查,类型为tcphealth_check_type= tcp # 建⽴连接超时时间为 3 秒health_check_timeout_s= 3# 连续 3 次检查失败,此 proxy 会被摘除health_check_max_failed= 3# 每隔 10 秒进⾏⼀次健康检查health_check_interval_s= 10# 负载均衡配置客户组group= load_balance group_key= 123可以看到流量被平均分配到了两个负载的机器上:0×3 frp client执⾏流程
分析这⾥主要分析客户端: frp/cmd/从⼊⼝开始跟起:可以发现处理参数使⽤的是 cobra库在这⾥定义了持久的参数,其中cfgFile默认值是./frpc.ini, 通过阅读⽂档,RunE 获取函数后对函数进⾏操作的函数跟进runClient⾸先加载配置⽂件内容给content,然后parseClientCommonCfg对配置⽂件内容进⾏解析,我们看下解析的规则跳过⼀些中间函数可以看到配置⽂件中的内容安装key装进了cfg⾥⾯,后⾯这句就是加载⾃⼰定义配置pxyCfgs, visitorCfgs, err :=
config.LoadAllConfFromIni(cfg.User, content, cfg.Start)原理差不多,也是只提取定义好的key然后装进cfg解析完所有配置⽂件到cfg,真正开始启动服务err = startService(cfg, pxyCfgs, visitorCfgs, cfgFilePath)其中pxyCfgs主要存放的内容就是我们添加的插件的配置,接着会尝试登陆到服务器,然后返回conn和session然后开始进去ConnectServerByProxyWithTLS->ConnectServerByProxy和服务器尝试建⽴连接:这⾥就开始建⽴tcp的连接:然后⽤建⽴好的连接,发了个0x17的字符,代表等下要建⽴tls加密传输,然后进⼊了然后tls.client重新封装的为,作为后续的tls交互使⽤然后后⾯就是利⽤fmux继续封装,⽤来实现多路复⽤,返回conn=stream,⽤来后续的链接…因为有链接时超时的限制,这⾥我们直接跟下⼀个关键断点。这⾥主要是yamux建⽴应⽤流通道时基于tcp的交互。最后发送登录信息给服务端完成:

本文发布于:2024-09-22 15:40:46,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/20338.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:配置   协议   代理   流量   看到   开启   加密   数据
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议