Awesome-Forwarder开发实战
2021-10-21 02:00:17 Author: mp.weixin.qq.com(查看原文) 阅读量:21 收藏

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进行联动,实时提醒

  • 提供以守护进程启动的方式

  • 身份认证功能

参考

•https://github.com/crabkun/switcher


文章来源: http://mp.weixin.qq.com/s?__biz=MzkzODE2NjgyNQ==&mid=2247484205&idx=1&sn=336004c9cbb8b554522c283ce9517192&chksm=c2851c6bf5f2957d02cf4bdd2818fd509cf491f901cd3d2339c31e15aed3dfe664e5d0e512a8&mpshare=1&scene=24&srcid=0728nzfonu2rRyheMMVjuuny&sharer_sharetime=1627457805843&sharer_shareid=5191b3dcb328f693d5261ba6bca8d267#rd
如有侵权请联系:admin#unsafe.sh