frp是什么
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
在内网渗透中,由于内网主机没有公网ip,本地无法直接对内网访问或扫描,这时可以搭建代理,frp就是一种常用的代理工具。
frp怎么用
frp分为服务端和客户端,服务端放在本地可以直接访问的服务器上(通常是自己的公网服务器),客户端放在靶机上。简单配置如下:
frps.ini:
1 | [common] |
frpc.ini:
1 | [common] |
实验准备
ubuntu上用docker compose开几个靶机
docker-compose.yml
1 | version: '3.8' |
docker compose up -d
然后传frp
1 | docker cp frp_0.51.3_linux_amd64/frps ub1:/ |
然后写配置,因为容器里没有编辑器,只能写好了往里传
一级代理
先搭一级代理,在ub1上开frps,在ub2上开frpc
ub1s.ini
1 | [common] |
ub2c.ini
1 | [common] |
传进容器
1 | docker cp frp_0.51.3_linux_amd64/ub1s.ini ub1:/ |
然后开起来
1 | docker exec -d ub1 /frps -c /ub1s.ini |
换到kali,用proxychains连接
vim /etc/proxychains4.conf
修改最后的[ProxyList]
1 | [ProxyList] |
协议 ip 端口 账号 密码,如果frpc.ini里配的什么就写什么,没配就不写
然后proxychains4 要执行的命令
在ubuntu上开一个web服务看请求来源:
python -m http.server 80
然后在kali上访问webproxychains4 curl 192.168.5.130
1 | ┌──(root㉿kali)-[~] |
到ubuntu的shell里看日志
1 | root@ubuntu:/var/www/html# python -m http.server 80 |
可以看到是172.28.1.11来的,也就是ub2,说明代理有效
二级代理
二级代理就是再套一层,在ub2上再开个frps,ub3上开个frpc
传frp
1 | docker cp frp_0.51.3_linux_amd64/frps ub2:/ |
写配置
ub2s.ini
1 | [common] |
ub3c.ini
1 | [common] |
传进容器
1 | docker cp frp_0.51.3_linux_amd64/ub2s.ini ub2:/ |
然后开起来
1 | docker exec -d ub2 /frps -c /ub2s.ini |
然后在**/etc/proxychains4.conf**的最后加一行,结果如下
1 | [ProxyList] |
然后kali访问web
1 | ┌──(root㉿kali)-[~] |
可以看到**[proxychains] Strict chain … 192.168.5.130:5001 … 127.0.0.1:5001 … 192.168.5.130:80**,说明走了两级代理到的web
到ubuntu看日志,来源是ub3的ip
1 | root@ubuntu:/var/www/html# python -m http.server 80 |
流量分析
在ubuntu上开frpc,kali开frps,同时在kali上开wireshark,方便查看frp流量
保存流量包到本机查看
新版本的frp默认开启了TLS加密,所以看不出流量特征
https://gofrp.org/zh-cn/docs/features/common/network/network-tls/
从 v0.50.0 开始,
transport.tls.enable
的默认值将会为 true,默认开启 TLS 协议加密。如果 frps 端没有配置证书,则会使用随机生成的证书来加密流量。
默认情况下,frpc 开启 TLS 加密功能,但是不校验 frps 的证书。
修改frpc.ini,在common里添加tls_enable = false
1 | [common] |
重新用wireshark抓frp的连接流量,发现frp连接时的流量特征
建立时
其中第一个包是frpc发给frps,的里面包含了靶机的操作系统信息
1 | {"version":"0.51.3","os":"linux","arch":"amd64","privilege_key":"133bc97921bf88b8622d4ac43c12f115","timestamp":1729505753,"pool_count":1} |
privilege_key每次连接都不一样,不是token
通信时
在使用socks5代理通信的时候,还会泄露ip和协议:
1 | {"proxy_name":"socks5","src_addr":"127.0.0.1","dst_addr":"127.0.0.1","src_port":55588,"dst_port":5001} |
这里都是本地看不出来
socks5的账号密码
socks5代理流量的内容