【VK技术分享】frp安全实践

  • A+
所属分类:安全文章




1、序


1.1
前言

近期看到一则消息如下:

2020年11月17日上午11:56,某公司发出全员级别的通告。人工智能部AI实验室一名实习生私自将公司内网端口映射到公网,导致不法分子入侵公司服务器,违反《集团员工行为准则》和《员工信息安全规范》有关规定,解除其实习协议,并将相关涉案人员移送司法处理。
对此,该公司客服工作人员表示:“针对此情况我们没有收到相关部门的通知。我们会尝试与相关部门沟通,有进展的话会予以答复。”

看到的第一反应是无论此事真假,但如果发生在我司,安全部有没有能力去发现?于是,本着守望互助和发散思考的原则研究了一波内网端口映射到公网软件,恰好看到朋友圈已经有人总结了常见列表:

【VK技术分享】frp安全实践

本人能力有限,故仅挑选一款倍受喜爱的frp来浅析一二,希望可以抛砖引玉。

文章核心内容如下:

  • 两种常用模式的示例

  • 如何提取特征进行安全检测

  • 绕过安全检测的思路


1.2
frp简介

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

为什么使用 frp ?通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。

  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。

  • 代理组间的负载均衡。

  • 端口复用,多个服务通过同一个服务端端口暴露。

  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。

  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。

  • 服务端和客户端 UI 页面。






2、两种常见示例


2.1
SSH访问内网机器

1、图示

图示最能一眼直观看懂,奈何翻遍互联网没有找到让我满意的示意图,为清晰表达,故简单画图。

【VK技术分享】frp安全实践


2、配置

frps配置:

【VK技术分享】frp安全实践

frpc配置:

【VK技术分享】frp安全实践

客户端连接:

ssh -oPort=60001 [email protected]30


3、日志

frps日志,包含:启动、连接成功、退出成功

【VK技术分享】frp安全实践

frpc日志,只包含启动

【VK技术分享】frp安全实践


2.2
安全地暴露内网服务


1、图示【VK技术分享】frp安全实践


2、配置

frps配置:

【VK技术分享】frp安全实践

frpc内网服务器:

【VK技术分享】frp安全实践

frpc客户端启动服务:

【VK技术分享】frp安全实践

客户端连接:

ssh -oPort=7000 [email protected]


3、日志

这里针对frps开启了trace模式,可以收到全面的信息,对于下文wireshark抓包分析、对照数据包分析指令等有帮助。

frps:

【VK技术分享】frp安全实践

frpc内网服务器:

【VK技术分享】frp安全实践

frpc客户端启动服务:

【VK技术分享】frp安全实践






3、如何检测


3.1
针对第一种


1、特征提取

登陆后查看连接:

  • w查看有localhost登陆

  • 确立连接中有到frps连接

  • 确立连接中有到127.0.0.1:22的连接

【VK技术分享】frp安全实践

根据端口反查:

【VK技术分享】frp安全实践

断开连接后查看:

【VK技术分享】frp安全实践

frpc关闭服务后查看:

【VK技术分享】frp安全实践

综上总结:

  • 程序运行时有127.0.0.1:22的监听和网络连接

  • 会有一定特征进程启动

  • 未编译版本可通过指纹(md5)匹配

2、检测

“君子生非异也,善假于物也”,故这里借助多种产品来协助安全检测。

产品一:

程序运行时刷新资产状态,可以查看到frpc进程:

【VK技术分享】frp安全实践

通过网络连接查看:

select datetime,agent_ip,cmd,src_ip,src_port,dst_ip,dst_port,pname from qtevent_net_connect where datatime > "now-2h" where pname like "frp"

【VK技术分享】frp安全实践

通过进程查看:

select pid as 进程ID, processName as 进程名称, from_unixtime(startTime) as start_time, startArgs , md5 as MD5 from wx.wisteria_assets.linux_process where processName like "frp" order by start_time desc

【VK技术分享】frp安全实践

通过md5检查(这里偷懒就对比了一下值):

【VK技术分享】frp安全实践

产品二

通过网络连接查看:

__topic__:aegis-log-network and ip:172.23.250.213 and frpc

【VK技术分享】frp安全实践

通过进程查看:

__topic__:aegis-log-process and ip:172.23.250.213 and frpc

【VK技术分享】frp安全实践


3.2
针对第二种

1、特征提取

这里只贴图,请按照上节内容自我思考。

【VK技术分享】frp安全实践


2、检测

产品一:

通过网络连接查看:

select datetime,agent_ip,cmd,src_ip,src_port,dst_ip,dst_port,pname from qtevent_net_connect where datatime > "now-2h" where pname like "frp"

【VK技术分享】frp安全实践

通过进程查看:

select pid as 进程ID, processName as 进程名称, from_unixtime(startTime) as start_time, startArgs , md5 as MD5 from wx.wisteria_assets.linux_process where processName like "frp" order by start_time desc

【VK技术分享】frp安全实践

 

产品二:

通过网络连接查看:

__topic__:aegis-log-network and ip:172.23.250.213 and frpc

【VK技术分享】frp安全实践

通过进程查看:

【VK技术分享】frp安全实践


3.3
针对于客户端

流量分析类安全产品可以根据特征检测。

【VK技术分享】frp安全实践






4、绕过思路


4.1
数据包特征分析

传统的流量分析安全设备是根据规则来命中事件类型,那么我们来研究一下数据包有什么特征。

抓取了一次从建立连接到ssh登陆的数据包,干干净净的话大概20个。

【VK技术分享】frp安全实践

找到第一个传输flag信息的数据包,右键Follow--TCP Stream

【VK技术分享】frp安全实践

先从数据包中分析有用的字段 version,hostname,os,arch,user,privilege_key,runid,metas,接下来会从代码萌新层面讨论如何去掉特征。


4.2
代码分析

git拉取源代码分析,git clone  https://github.com/fatedier/frp

首先定位到pkg/msg/msg.go【VK技术分享】frp安全实践

先拿version字段为例,第二三段均为frps端收到连接时打log用的,所以不用考虑。

【VK技术分享】frp安全实践

我们打开第一段会定位到client/service.go,再次跟进到pkg/util/version/version.go,代码如下:

【VK技术分享】frp安全实践

我这里修改版本号"0.34.3"为"SSH-2.0-OpenSSH_7.4"(一时脑洞,想着会不会被识别为ssh服务,哈哈)

这里还有个小插曲,就是修改了version后,建立连接时返回

"Please upgrade your frpc version to at least 0.18.0"

翻了一下代码定位到pkg/util/version/version.go中有如下:

【VK技术分享】frp安全实践

LessThan函数中会去做一堆版本号比对,检测什么呀,直接把Compat返回值return true,或者把LessThan返回值return false都可以解决。

好了,version修改完毕,在纠结继续修改哪些参数到时候,想到去frps上面看一下log,收到的就是需要修改的特征,于是翻了一下日志

【VK技术分享】frp安全实践

害,发现好多参数都是发了个寂寞~

【VK技术分享】frp安全实践

既然如此,那么就顺便修改一下os和arch,用了个很low很简单方法

【VK技术分享】frp安全实践

好了,编译打包。frp里面集成了打包shell,去到对应目录下执行package.sh,结果如下:

【VK技术分享】frp安全实践

好啦,这下子可以舒舒服服的绕过安全检测了吧

【VK技术分享】frp安全实践

一边测试一边抓包看是否能绕过安全检测~

【VK技术分享】frp安全实践

果不其然,还是检测出来了,打脸了

【VK技术分享】frp安全实践

不哭不哭,我们来继续找原因,先看一下数据包

【VK技术分享】frp安全实践

仔细翻了翻找到了刚刚没有看到的说明文档doc/server_plugin_zh.md,里面描述了用户登陆操作信息、创建代理的相关信息、心跳相关信息、新增 frpc 连接相关信息等数据字段格式,结合上图,突然有个扎眼的字段“privilege_key”,此时想了一下如果单独从前面几个字段的key去做特征误报率太高了,如果我设计就找几个特殊的key和几个特殊的value。心中定了想法,就去看一下这个key。

【VK技术分享】frp安全实践

这里重点是第一个文件pkg/msg/msg.go,第二三个均是doc里面的内容,不用管。这里看了一下PrivilegeKey在pkg/auth/token.gopkg/auth/oidc.go都有关联,但是字段名却只有这个文件包含了3次,全局替换一波字段名,老样子编译打包一波。

随手一测~(不要问,需要结果的同学自己动手试一下就知道了)

【VK技术分享】frp安全实践






5、思考

做一些发散思考和思路,时间原因,并未全部尝试;攻防本是对抗过程,文中方法可能随时失效,授人鱼不如授人以渔。


5.1
针对特征绕过的检测

上文中绕过是在建立连接时用户发送登录信息给服务端时,那么如果针对此检测可以有两个思路:

1、提取登录信息的新特征,防止正则匹配绕过

2、对前置或后置阶段特征提取,如发送RPC请求建立连接数据包、建立连接后的心跳数据包(最近读安全客有感,可参照6、引用和致谢[2]


5.2
NetFliter检测流量转发

NetFilter可以针对Linux包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪,可以做多个HOOK点,我们可以抽象流量转发模型有以下特征:

  • 数据包内容相同,但五元组不同

  • 数据包间隔时间短

  • 会在127.0.0.1上面做些文章

以上特征用代码实现用作入侵检测取证时很棒,有魄力的也可以做成服务检测报送式,用salt或ansible推送到服务器检测。


5.3
frps IP隐藏

设想,每次得手后都会在服务器留一个明文的.ini文件,应急响应和溯源时岂不是白白送上思路?

以上已有师傅实现,可参照6、引用和致谢[3]


5.4
补偿控制

frpc很多人会在BYOD终端启动,个人的测试中几款pc端的agent都无法从服务端采集到终端的frp软件信息和事件,故在没有更好的方法之前用一些手段去补偿控制,当然这些手段也需要不断的建设和运营,在阶段初期误报率和复杂度估计会很高。

  • 服务器只允许堡垒机IP登录,其它ip做限制或登录告警(针对使用frp映射非ssh服务无法奏效)

  • 抓取出互联网流量中心跳特征包(很多Saas服务会有心跳包,会产生大量误报,这个需要运营,如果流量分析产品可以实现则更佳)

  • 零信任解决方案,基于账号、角色、权限、访问对象,结合微隔离、SDP,极端一些可以达到MAC(强制访问控制)模型





6、引用和致谢

感谢引用中各位大佬和团队的分享精神!frp是一个免费开源且在开发中的软件,我相信它会越来越好;各安全检测方法和测试手法也仅限于本人研究过的产品和特定版本,不能以偏概全。如果文章中有任何描述不正确或引用不当的地方,辛苦大佬们指正。

也欢迎各位安全同僚拍砖、交流和技术分享!(微信:solosec)

引用来源:

[1] https://gofrp.org/docs/ frp官方文档

[2] https://mp.weixin.qq.com/s/f11pMe55aFR92NfH_VNgBg 入侵检测系列1(上):基于私有协议的加密流量分析思路(Teamviewer篇)

[3]https://uknowsec.cn/posts/notes/FRP%E6%94%B9%E9%80%A0%E8%AE%A1%E5%88%92.html  FRP改造计划





这是【VK技术分享】的第12期
后续我们将持续输出优秀的技术文章
如果您有任何希望交流讨论问题
欢迎在文末或后台进行留言
我们期待与您的技术交流和思想碰撞




点击下方图片
阅读【VK技术分享】往期精彩文章

【VK技术分享】frp安全实践

【VK技术分享】数据安全怎么做—个人信息保护法解读


【VK技术分享】frp安全实践

【VK技术分享】Docker安全实践


【VK技术分享】frp安全实践

【VK 技术分享】数据安全怎么做——数据防泄漏



关于VIPKID SRC
VIPKID安全响应中心(VIPKID Security Response Center)--简称VKSRC,隶属于VIPKID信息安全部,于2017年10月25日正式上线。VKSRC的上线,旨在建立一个连接白帽子、安全团队和安全爱好者们的官方渠道和沟通桥梁,主动收集、发现潜在的安全威胁,全方位保障VIPKID公司、用户及合作伙伴的信息和隐私数据安全,共建互联网安全生态。

【VK技术分享】frp安全实践



点个在看

你最好看

【VK技术分享】frp安全实践

本文始发于微信公众号(VIPKID安全响应中心):【VK技术分享】frp安全实践

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: