前言
最近,继续遨游 GayHub 的海洋,在 FRP 的项目中找到了一个用于 FRPC 上线的消息通知插件,若 FRPC 连接了 FRPS,那么该插件就会向所设定的通知渠道发送上线通知。在日常渗透测试中,有时候需要对目标机器设置相关代理,此处有时用到 FRP 穿透工具,但是弄完配置文件并在目标机器执行相关命令后,我们还得去 FRPS 控制面板查看服务有没有上线,步骤相对繁杂,此处的插件正好可以解决该问题。
frp-notify 介绍
frp-notify 一个专注于消息通知的 frp server manager plugin 实现,让你对进入 frps
的连接了如指掌,不再裸奔,项目链接如下:
该插件支持 log日志
、DingTalk
、WxWork
、飞书
、Gotify
形式的消息通知,基本涵盖了主流的几大通知渠道,可在 frp-notify.json
文件中按需配置通知插件,同时也支持配置多个插件,多渠道通知。
注:本教程将使用 frp-notify 插件配合 Gotify 通知一起使用,若不使用 Gotify 作为消息通知的话,可略过相关 Gotify 的配置操作。并前往该项目查看其它通知相关配置。
Gotify 配置
在使用 frp-notify 插件之前,我们需安装 Gotify ,其项目地址如下:
其使用说明文档如下:
此处博主使用 Docker 安装运行的 Gotify ,若未安装 Docker 可使用二进制文件运行,其文档中有相关说明。
先创建一个待映射到容器中的目录:
mkdir -p /var/gotify/data
再启动对应容器(本地无对应容器镜像则会自动 Pull 并启动):
docker run -itd -p 50080:80 -v /var/gotify/data:/app/data gotify/server
此处是将本地的 50080 端口映射到容器中的 80 端口,本地的端口可自定义修改。接下来防火墙或安全组放通 50080 端口并浏览器访问,即可使用账号:admin
和密码:admin
登录(登录后强烈建议修改账号和密码),点击 APPS
创建一个通知应用,创建成功后记录该应用的 Token
字段:
接下来就是配置 frp-notify 了。
frp-notify 配置
此处 frp-notify 插件放置的目录为:/ur/local/frp-notify
,用户可自主选择所放置目录,其余操作仅需将该目录路径修改即可。
在项目的 Releases 处下载最新的对应机器架构的包,并解压到 /usr/local/frp-notify
目录下,并编辑配置 frp-notify.json
文件,删除其余通知字段,保留并设置如下:
[root@localhost frp_notify]# vim frp-notify.json
[root@localhost frp_notify]# cat frp-notify.json
{
"blacklist": [
],
"whitelist": [
],
"notify_plugins": [
{
"name": "gotify",
"config": {
"server_proto": "http",
"server_addr": "127.0.0.1:50080",
"app_token": "**********" # Gotify 的通知应用 Token
}
}
]
}
[root@localhost frp_notify]#
启动 frp_notify ,命令如下:
./frp-notify start -c ./frp-notify.json -b 127.0.0.1:50081
若无报错,则正常启动。此时另开一个终端窗口修改 FRPS 客户端配置文件, 在 frps.ini
文件中添加如下字段:
[root@localhost frp]# vim frps.ini
# 追加如下字段
[plugin.frp-notify]
addr = 127.0.0.1:50081 # frp-notify 地址
path = /handler # frp-notify url, 固定配置
ops = Login,NewProxy,NewWorkConn,NewUserConn # 通知的操作
[root@localhost frp]#
重启 FRPS,此时若有终端链接,Gotify 则会推送相关消息了:
至此,frp_notify + Gotify 的 FRP 用户上线消息通知就完成了,接下来就完善一下后续的开机自启以及其它操作吧!
开机自启动
上述虽然成功运行了 frp_notify 服务,但是会占用一个终端窗口,下面通过 system 服务使其开机自启动,在 frp_notify 项目中给了一份系统服务配置文件 frp_notify.service
,下面我们就这个系统服务配置文件进行简单修改,最终如下:
[Unit]
Description=Frp notify service
After=network.target
[Service]
Type=simple
User=nobody
Group=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp_notify/frp-notify start -c ./frp-notify.json -b 127.0.0.1:50081
WorkingDirectory=/usr/local/frp_notify/
[Install]
WantedBy=multi-user.target
其中,相关修改字段说明如下:
Group
:守护运行程序的用户组。ExecStart
:对相关运行命令修改,具体启动路径以服务所放置的目录修改,增加--log-level error
字段以修改日志输出等级。WorkingDirectory
:服务所在的工作目录,指定后后面的配置文件可使用相对路径指定,否则,请使用绝对路径。
将系统服务配置文件 frp_notify.service
移动到相关目录下:
mv ./frp_notify.service /usr/lib/systemd/system/
文件移动完成,修改一下 frp_notify 目录及服务文件的所属用户与用户组信息:
chown -R nobody:nobody /usr/local/frp_notify
再 daemon-reload
重载配置一下:
systemctl daemon-reload
启动 frp_notify 服务:
systemctl start frp_notify.service
若无报错,则服务启动成功。
再设置开机自启:
systemctl enable frp_notify.service
其余操作命令如下:
# 停止运行服务
systemctl stop frp_notify.service
# 查看服务状态
systemctl status frp_notify.service
Nginx 反代 Gotify Web
Gotify 启动后,其工作的端口可使用浏览器访问,若服务非 80 端口启动,则需指定端口,下面给出 Nginx 反代该服务( Gotify 的文档中有相关配置,此处加上了 SSL ),其 Nginx 的 server 如下:
server {
listen 80;
listen 443 ssl http2;
listen [::]:80;
listen [::]:443 ssl http2;
server_name example.com; # 解析的域名,自定义替换
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#SSL配置
# RSA Cert
ssl_certificate /xxxxx/fullchain.pem;
ssl_certificate_key /xxxxx/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384::!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# add_header Strict-Transport-Security "max-age=31536000" always; # HSTS 设置,按需启用
error_page 497 https://$host$request_uri;
location / {
proxy_pass http://127.0.0.1:50080;
proxy_redirect default;
proxy_set_header Host $host;
# WebSockt场景使用,此处使用 WebSocket 通信,若不使用,请注释下方三行
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_ssl_server_name on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 50m;
client_body_buffer_size 5m;
client_body_timeout 60s;
send_timeout 60s;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffer_size 32k;
proxy_buffers 4 16k;
proxy_busy_buffers_size 32k;
proxy_temp_file_write_size 32k;
proxy_ignore_client_abort on;
proxy_intercept_errors on;
}
# . files
location ~ /\.(?!well-known) {
deny all;
}
# robots.txt
location = /robots.txt {
default_type text/html;
add_header Content-Type "text/plain; charset=UTF-8";
return 200 "User-Agent: *\nDisallow: /";
}
}
按需修改上述的域名、证书、日志等字段并保存上述配置,再操作 Nginx 检查配置文件并重新加载,此时即可通过相关域名访问 Gotify Web了。若为公网服务器,那么其安全组放通的 50080 端口即可关闭,后续操作使用域名访问即可。
另:Gotify 也在 Android 上提供了一个 APP,可前往 Google 应用商店进行下载使用,其通知也会同步到该 APP 上。