contenido
prefacio
Este artículo estudia una herramienta que sale a través de TCP y HTTP, frp
github: https://github.com/fatedier/frp
I. Resumen
1. Introducción
Escrito en 2015, continuamente actualizado, escrito en Go, una herramienta clásica en línea
- Admite TCP y UDP, así como los protocolos HTTP y HTTPS, y también admite P2P
- Soporte para encriptación y compresión.
- Soporte multiplataforma
- Tiene GUI
- depende del archivo de configuración
2. Principio
- Primero, después de que se inicie frpc, conecte frps y envíe una solicitud para iniciar sesión (), luego mantenga esta conexión larga, si se desconecta, intente nuevamente
- Después de que frps reciba la solicitud, establecerá un oyente para escuchar las solicitudes de la red pública.
- Cuando frps recibe la solicitud, verificará localmente si hay una conexión disponible (frp puede establecer un grupo de conexiones), si no, enviará un mensaje.StartWorkConn y esperará la solicitud de frpc
- Después de que frpc lo recibe, inicia una solicitud a frps. Al comienzo de la solicitud, especificará a qué proxy se dirige la conexión.
- Después de que frps reciba la conexión de frpc, transferirá el tráfico entre la conexión recién establecida y la conexión de la red pública.
- Si la solicitud se desconecta, la solicitud en el otro extremo también se desconecta
3. Uso
(1) servidor
archivo de configuración 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
correr
./frps -c ./frps.ini
./frps -c ./frps.ini & # 后台运行
# 如果要运行多个服务端:只需要复制并修改frps.ini配置文件中的端口号
(2) Cliente
archivo de configuración 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
correr
./frpc -c ./frpc.ini
./frpc -c ./frpc.ini & # 后台运行
# 如果要运行多个客户端:只需要复制并修改frpc.ini配置文件中的端口号
2. Practica
1. Escenario de prueba
Atacante (servidor): kali 192.168.10.128
Destino (cliente): ubuntu 192.168.10.129
Tampoco limita las conexiones TCP
2. Establecer un túnel
(1) servidor
./frps -c ./frps.ini
(2) Cliente
Iniciar Apache
archivo de configuración
./frpc -c ./frpc.ini
(3) Establecimiento del túnel
Del mismo modo, el puerto se puede determinar en función del servicio
3. Echa un vistazo al paquete
El protocolo de enlace de tres vías establece la conexión
durante la llamada de servicio
3. Explora
1. Código fuente y análisis
Para combinar la solicitud entre frpc y frps, el código del programa frp encapsula el protocolo sobre TCP, por lo que utiliza muchos canales, por lo que el código está disperso por todas partes y no es fácil conectarse.
Disponible en: https://jiajunhuang.com/articles/2019_06_19-frp_source_code_part2.md.html
2. Detección y derivación
(1) archivo de configuración
El uso de archivos de configuración es un gran problema
Método de derivación: refactorización, sin archivo de configuración
(2) Cadena de característica y código de característica
La cadena de función en el comando y el registro se puede usar como función de detección
y luego el código de función en el código
Método de derivación: modificar las características correspondientes
(3) control portuario
Haga un buen trabajo de control de puertos y solo abra los puertos necesarios
Método de derivación: multiplexación de puertos
(4) Llamadas de proceso y biblioteca
Se está detectando el control de la cadena de procesos del terminal y la llamada de la biblioteca de terceros
Método de omisión: use el proceso blanco, no llame a la biblioteca tanto como sea posible, empaquete el paquete, principalmente el conjunto de eliminación sin troyanos
Epílogo
frp es demasiado famoso y maduro (es decir, la detección de frp también debería ser muy madura), pero el código fuente está muy disperso