零鉴科技
在实战的过程中,总会遇到防火墙或者一些策略的限制,导致目标机器只放行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