イントラネット浸透シリーズ:イントラネットトンネルのFRP

序文

この記事では、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の検出も非常に成熟している必要があります)が、ソースコードは非常に散在しています

おすすめ

転載: blog.csdn.net/weixin_44604541/article/details/119735357