0x01 技术介绍
0x01.01 项目介绍
项目介绍:快速反向代理,帮助用户将 NAT 或防火墙后面的本地服务器暴露给 Internet
0x01.02 FRP 隧道技术介绍
| frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信
在 FRP 中,一个代理对应一个需要公开访问的内网服务。一个客户端可以同时配置多个代理,以满足不同的需求。
0x02 环境&文件准备
安装环境:Ubuntu Server 24.0LTS
FRP 版本: 最新
0x02.01 下载安装
0x02.01.A 自动下载 git
使用命令:
1
|
git clone https://gitclone.com/github.com/fatedier/frp.git
|

进入目录:

0x02.01.B 手动下载
手动文件下载:

选择对应版本下载,解压,进入对应目录
Wget:
Linux 下还可以用 wget 程序下载文件
使用命令:
1
|
wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz
|

之后解压:
使用命令:
之后进入对应目录

0x03 配置编辑&服务运行
文件目录结构:
| 主要就编辑两个配置文件

0x03.01 服务端(一般为内网跳板机或者公网服务器)
运行命令:
| 旧版配置文件名叫 frps.ini
1
2
3
4
|
# 给运行权限
chmod +x frps
#运行
./frps -c ./frps.toml
|
配置实例:
1
2
3
4
5
6
|
# frps.toml
bindPort = 7000 # 服务端与客户端通信端口
transport.tls.force = true # 服务端将只接受 TLS链接
auth.token = "public" # 身份验证令牌,frpc要与frps一致
|

0x03.02 客户端 (一般配置在需要穿透的主机上)
运行命令:
| 旧版配置文件名叫 frpc.ini
1
2
3
4
|
# 给运行权限
chmod +x frpc
#运行
./frpc -c ./frpc.toml
|
配置实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# frpc.toml
transport.tls.enable = true # 从 v0.50.0版本开始,transport.tls.enable的默认值为 true
serverAddr = "x.x.x.x" #自己的公网地址
serverPort = 7000 # 公网服务端通信端口
auth.token = "public" # 令牌,与公网服务端保持一致
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1" # 需要暴露的服务的IP
localPort = 22 # 将本地22端口的服务暴露在公网的6666端口
remotePort = 6666 # 暴露服务的公网入口
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8888
|
0x04 拓展_二层代理实操
0x04.01 环境准备
[!tip] 内网两台主机需要互通
实验环境:
- 攻击机
- 公网服务器
- 内网靶机一(出网,已攻陷)192.168.31.200
- 内网靶机二(不出网)192.168.31.6
实验流程:内网靶机二 22端口映射到内网靶机一 2222端口,最后出网到公网服务器 3559 端口,攻击机连接
0x04.02 实验过程
0x04.02.A 配置
靶机一配置:
| 配置客户端连接公网服务器

| 配置服务端,留给靶机二连接

靶机一配置:
| 客户端配置

公网服务端配置:将端口在防火墙放开,配置文件添加对应端口
0x04.02.B 连接
| 启动靶机一的客户端,服务端

| 启动靶机二的客户端
查看靶机一日志

| 使用公网地址连接

连接成功,执行命令
0x05 拓展_二层代理实操_2
0x04.01 环境准备
[!tip] 内网两台主机需要互通
0x04.01.A 实验环境
- 攻击机 (kali)
- 公网服务器
- 内网靶机一(出网,已攻陷)192.168.0.2|10.0.0.3
- 内网靶机二(不出网)10.0.0.2
实验流程:靶机一是双网卡主机联通两个网段,靶机二不出网,并设置有数据库
0x04.01.B 配置
[!tip] 此次实验环境使用 docker 配置
Docker:
目录结构:
project/
├── docker-compose.yml
├── Dockerfile.First_layer
├── Dockerfile.Second_layer
├── init.sql
运行命令:
1
2
3
4
|
# 启动!!
docker compose up -d
# 查看状态
docker ps
|
配置内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# docker-compose.yml
version: '3.8'
services:
first_layer:
build:
context: .
dockerfile: Dockerfile.first_layer
container_name: first_layer
tty: true
stdin_open: true
networks:
external_net:
ipv4_address: 192.168.0.2
internal_net:
aliases:
- first_layer
ports:
- "2222:22"
second_layer:
build:
context: .
dockerfile: Dockerfile.second_layer
container_name: second_layer
tty: true
stdin_open: true
networks:
internal_net:
ipv4_address: 10.0.0.2
environment:
MYSQL_ROOT_PASSWORD: root@123
volumes:
mysql_data:
networks:
external_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.0.0/24
internal_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.0.0.0/24
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# Dockerfile.first_layer
FROM ubuntu:latest
RUN apt-get update && apt-get install -y wget openssh-server
RUN wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz && \
tar -zxvf frp_0.38.0_linux_amd64.tar.gz && \
mv frp_0.38.0_linux_amd64/frp /usr/local/bin/ && \
rm -rf frp_0.38.0_linux_amd64.tar.gz frp_0.38.0_linux_amd64
# SSH配置
RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH登录修复
RUN sed -i 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# Dockerfile.second_layer
FROM ubuntu:latest
RUN apt-get update && apt-get install -y mysql-server wget
RUN wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz && \
tar -zxvf frp_0.38.0_linux_amd64.tar.gz && \
mv frp_0.38.0_linux_amd64/frp /usr/local/bin/ && \
rm -rf frp_0.38.0_linux_amd64.tar.gz frp_0.38.0_linux_amd64
# MySQL配置
ENV MYSQL_ROOT_PASSWORD=root@123
COPY init.sql /docker-entrypoint-initdb.d/
EXPOSE 3306
CMD ["mysqld"]
|
1
2
3
4
|
# init.sql
CREATE DATABASE IF NOT EXISTS exampledb;
GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'%' IDENTIFIED BY 'examplepassword';
FLUSH PRIVILEGES;
|

frp:
ssh 连接:

查看网卡信息:
可互通:

分别配置 frp:
| 靶机 2 客户端

| 靶机 1 客户端/服务端

0x04.02 实验过程
0x04.02.A 连接数据库
