コンテンツ
序文
この記事では、TCPとHTTPを介して送信されるツールfrpについて説明します。
github:https ://github.com/fatedier/frp
I.概要
1はじめに
2015年に作成され、継続的に更新され、従来のオンラインツールであるGoで作成されました。
- TCPとUDP、およびHTTPとHTTPSプロトコルをサポートし、P2Pもサポートします
- 暗号化と圧縮のサポート
- クロスプラットフォームのサポート
- GUIがあります
- 構成ファイルによって異なります
2.原則
- まず、frpcの起動後、frpsに接続し、login()にリクエストを送信します。次に、この長い接続を維持します。切断されている場合は、再試行します。
- frpsはリクエストを受信すると、パブリックネットワークからのリクエストをリッスンするリスナーを確立します
- frpsはリクエストを受信すると、使用可能な接続があるかどうかをローカルでチェックします(frpは接続プールを設定できます)。ない場合は、msg.StartWorkConnを送信し、frpcからのリクエストを待ちます。
- frpcはそれを受信すると、frpsへの要求を開始します。要求の開始時に、接続先のプロキシを指定します。
- frpsはfrpcから接続を受信すると、新しく確立された接続とパブリックネットワークからの接続の間でトラフィックを転送します
- リクエストが切断されると、もう一方の端のリクエストも切断されます
3.使用法
(1)サーバー
frps.ini構成ファイル
[common]
#frp服务器监听地址,如果是IPV6地址必须用中括号包围
bind_addr = 0.0.0.0
#frp服务器监听端口
bind_port = 7000
#kcp的udp监听端口,如果不设那就不启用
#kcp_bind_port = 7000
#指定使用的协议,默认tcp,可选kcp
#protocol = kcp
#如果要使用vitual host,就必须设置
#vhost_http_port = 80
#vhost_https_port = 443
#Web后台监听端口
dashboard_port = 7500
#Web后台的用户名和密码
dashboard_user = admin
dashboard_pwd = admin
#Web后台的静态资源目录,调试用的,一般不设
#assets_dir = ./static
#日志输出,可以设置为具体的日志文件或者console
log_file = /var/log/frps.log
#日志记录等级,有trace, debug, info, warn, error
log_level = info
#日志保留时间
log_max_days = 3
#启用特权模式,从v0.10.0版本开始默认启用特权模式,且目前只能使用特权模式
#privilege_mode = true
#特权模式Token,请尽量长点且复杂
privilege_token = 12345678
#特权模式允许分配的端口范围
privilege_allow_ports = 2000-3000,3001,3003,4000-50000
#心跳超时,不用改
#heartbeat_timeout = 90
#每个代理可以设置的连接池上限
#max_pool_count = 5
#认证超时时间,一般不用改
#authentication_timeout = 900
#如果配置了这个,当你的模式为http或https时,就能设置子域名subdomain
#subdomain_host = frps.com
#是否启用tcp多路复用,默认就是true,不用管
#tcp_mux = true
走る
./frps -c ./frps.ini
./frps -c ./frps.ini & # 后台运行
# 如果要运行多个服务端:只需要复制并修改frps.ini配置文件中的端口号
(2)クライアント
frpc.ini構成ファイル
[common]
#frp服务器地址
server_addr = 1.2.3.4
#frp服务器端口
server_port = 7000
#特权模式Token
privilege_token = 12345678
#转发SSH
[ssh]
type = tcp
#可以指定为其它IP,默认是本地
#local_ip = 127.0.0.1
local_port = 22 #代理出去的端口
remote_port = 6000 #出去的端口
#启用加密
use_encryption = true
#启用压缩
use_compression = true
#转发Web
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
#修改header中的host
#host_header_rewrite = dev.yourdomain.com
#启用简单HTTP认证
#http_user = abc
#http_pwd = abc
#在服务端配置了subdomain_host的情况下用于自定义二级域名
#subdomain = test
#在存在多个相同域名的情况下通过请求的URL路由到不同的配置
#locations = /news,/about
#转发DNS请求
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000
#转发Unix域套接字(这儿是Docker)
[unix_domain_socket]
type = tcp
remote_port = 6000
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock
#HTTP代理
[http_proxy]
type = tcp
remote_port = 6000
plugin = http_proxy
#配置http代理的简单认证
#plugin_http_user = abc
#plugin_http_passwd = abc
走る
./frpc -c ./frpc.ini
./frpc -c ./frpc.ini & # 后台运行
# 如果要运行多个客户端:只需要复制并修改frpc.ini配置文件中的端口号
2.練習
1.テストシナリオ
攻撃者(サーバー):kali 192.168.10.128
ターゲット(クライアント):ubuntu 192.168.10.129
TCP接続を制限しない
2.トンネルを確立します
(1)サーバー
./frps -c ./frps.ini
(2)クライアント
Apacheを起動します
構成ファイル
./frpc -c ./frpc.ini
(3)トンネルの設置
同様に、ポートはサービスに基づいて決定できます
3.パッケージを見てください
3ウェイハンドシェイク
は、サービスコール中に接続を確立します
3.探索する
1.ソースコードと分析
frpcとfrpsの間でリクエストを組み合わせるために、frpプログラムコードはTCP上にプロトコルをカプセル化するため、多くのチャネルを使用するため、コードはいたるところに散在し、接続が容易ではありません。
https://jiajunhuang.com/articles/2019_06_19-frp_source_code_part2.md.htmlで入手可能
2.検出とバイパス
(1)設定ファイル
構成ファイルの使用は重要です
バイパス方法:リファクタリング、構成ファイルなし
(2)機能文字列と機能コード
コマンドとログの機能文字列は、検出機能として使用でき、
コード内の機能コードとして使用できます。
バイパス方法:対応する機能を変更します
(3)ポート制御
ポート制御を適切に行い、必要なポートのみを開きます
バイパス方式:ポート多重化
(4)プロセスとライブラリの呼び出し
端末のプロセスチェーン制御とサードパーティライブラリの呼び出しが検出されています
バイパス方法:ホワイトプロセスを使用し、ライブラリをできるだけ呼び出さず、パッケージ、主にトロイの木馬のないキリングセットをパックします
エピローグ
frpはあまりにも有名で成熟しています(つまり、frpの検出も非常に成熟している必要があります)が、ソースコードは非常に散在しています