Awesome-Forwarder开发实战
零鉴科技
初
衷
上矩形
在实战的过程中,总会遇到防火墙或者一些策略的限制,导致目标机器只放行80,443等特定端口的流量,此时若没有闲置的服务器作为攻击机的话,往往则需要调整当前的服务或者新开一台服务器,这会给渗透工作带来很多额外的操作。
如果有一个根据ip来转发流量的工具,对外只暴露所需的端口,后续流量都由转发工具进行转发,那么既能够满足只出特定端口的需求,同时也可以较好地隐藏机器的真实功能。
简介
Awesome-Forwarder是一个轻量级的流量转发工具,能够根据特定的ip或者网段来转发流量,并支持以配置文件的形式导入路由表。
基于golang编写的Awesome-Forwarder可以很好的兼容各个平台,能够保证高并发率以及高效率。
特点功能
1.根据ip或者网段进行流量转发。
2.热加载,这意味着你可以在运行时实时修改配置文件。
3.静默模式。
4.自动日志转储和压缩。
5.每六小时自动存储状态信息。
6.在控制台中,通过输入"conn"来获取当前连接的状态,输入"routes"来获取当前路由信息。
左中括号
项目框架
左中括号
核心代码
1.流量转发
`func forwardPacket(conn net.Conn, dest string, belong string) {` `var target net.Conn` `target, err := net.Dial("tcp", dest)` `defer target.Close()`` //...` `// io bridge` `go tcpBridge(conn, target)` `tcpBridge(target, conn)``}`` ``func tcpBridge(a, b net.Conn) {` `defer func() {` `a.Close()` `b.Close()` `}()` `buf := make([]byte, 2048)` `for {` `n, err := a.Read(buf)` `if err != nil {` `return` `}` `b.Write(buf[:n])` `}``}`
Forwarder在此承担一个双向通信的角色,分别向来源端和目标端建立连接,并将发送来的数据包转发给目标端,将目标返回的数据包返回给来源端。这样的实现方式得益于golang中优雅的io Reader和Writer,通过这两个接口,程序可以以流的方式高效处理数据,而不用考虑数据是什么,数据来自哪里,以及数据要发送到哪里的问题,开发者仅仅需要将数据往里面写(Writer)和读数据(Reader)即可。
2. 热加载
`go func() {` `for {` `select {` `case event := <-watcher.Events:` `switch event.Op {` `case fsnotify.Remove:`` // reset routeMap` `resetConfig()` `// add the file to the filewatcher again` `err := watcher.Add(*ConfigFile)` `if err != nil {` `fmt.Println("fail to watch directory")` `}` `case fsnotify.Write:`` // reset routeMap` `resetConfig()` `}` `case err := <-watcher.Errors:` `fmt.Println("file watcher error")` `}` `}``}()`
在Forwarder启动的同时新建一个goroutine,使用go下的fsnotify库来监控文件,在捕捉到修改文件的事件后,重新设置配置。
这里有一个坑点是:在linux下,使用vim/vi修改文件会产生RENAME, CHMOD, REMOVE三个通知事件,而最后的REMOVE会移除所监控文件,所以要重新把文件添加入监控列表。
3.配置文件
`{` `"log_level": "debug",`` "listen_port": "0.0.0.0:80", `` "routers": [` `{` `"description": "web",`` "from": "1.2.3.5", `` "to": "5.6.7.8:81" `` },` `{` `"description": "ssh",` `"from": "1.2.3.4",`` "to": "5.6.7.8:22"` `}` `]``}`
Forwarder读取json格式的配置文件来形成路由表,其中log_level设置log等级,listen_port设置监听的端口,routers中存储着路由信息,路由信息由description,from和to三条信息构成,以此来标识一个转发规则。
压力测试
服务端:Ubuntu 20.04.1 LTS Apache 2.4.41
客户端:apache benchmark Version 2.3
服务端和客户端都位于内网环境
测试结果:
列"Local xxx" 表示直接请求服务端, 列"Forwarder xxx"表示通过 Forwarder转发流量来请求服务端。
从测试结果可以得出,Awesome-Forwarder做到了所有测试100%无丢包率,在内网测试下转发速率约为33MB/s,并且即使在30000次请求,200个线程下也能够很好的完成端口转发的工作。但是因为Forwarder需要将入口流量转发给出口,并将出口流量返回给入口(共两次请求),所以它大约需要耗费两倍于正常请求的时间来完成一次请求。
后序
Forwarder后序可以附加上很多额外的功能:
连接管理终端
提供web api获取当前连接状态和修改配置文件
与telegram bot进行联动,实时提醒
提供以守护进程启动的方式
身份认证功能
参考