使用golang撸一个反向socks5

2021年7月20日 276点热度 0人点赞 0条评论


STATEMENT

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。



安恒西安运营能力中心

NO.1 socks5代理

关于使用 Golang 做一个常规的 socks5 代理的文章, 网上已经有很多, 所以本次来尝试一种特殊情况, 即在目标机器不出网的情况下, 使用 Golang 实现一个反向的 socks5 隧道。



NO.2 工具的基本原理

反向 socks5 与正向的 socks5 所不同的地方在于, socks5 服务端并不直接处于目标内网中, 而是通过 agent 维持的长连接来将代理流量传递到目标内网中。

图片

如图, 因为有防火墙的存在,user 和 server 无法直接正向连接到 agent 所在的机器,因此需要让 agent 主动回连,在 server 上再做一次类似端口转发的工作。


agent 运行后, 主动向 server 端发起长连接, 每一个长连接将会承载一个socks5代理请求。


server 端监听两个端口, 其中一个是面向用户使用的socks5服务端口, 另一个是与 agent 通信的端口。


在运行之后, agent 会向 server 发起一个长连接, 而 server 端在接收 user 的 socks5 代理连接之后, 将这两个连接怼到一起就好了。



NO.3 代码实现

agent

agent 的实现其实非常简单, 这里使用了这个 socks5 的库(http://github.com/armon/go-socks5), 因为它有一个比较方便的ServeConn方法。在TCP连接建立之后,就将连接交给处理 socks5 协议的库去处理,如果对协议部分感兴趣的话,可以跟到这个 socks5 的库源码里面看一看,大概的步骤就是读取协议头,进行认证(如果有的话),然后从协议头中获取客户端的目标地址,由 server 端向目标发起连接,然后将客户端到 server 的连接和 server 到目标的连接对接起来。

package main
import (  "fmt"  "net"  "time"
 "github.com/armon/go-socks5")
var server *socks5.Server
func main() {  // 起一个简单的socks5服务  var err error  server, err = socks5.New(&socks5.Config{})  if err != nil {    panic(err)  }  // 不断向server发起连接请求  for {    conn, err := net.Dial("tcp", "127.0.0.1:8989")    if err != nil {      continue    }    // 连接成功之后,使用socks5库处理该连接    go handleSocks5(conn)  }}
func handleSocks5(conn net.Conn) {  defer conn.Close()  _ = conn.SetDeadline(time.Time{})  // 使用该socks5库提供的ServeConn方法  err := server.ServeConn(conn)  if err != nil {    fmt.Println(err)  }}

server

server 这边的实现也很简单首先监听两个端口,一个供 user 连接使用,另一个供 agent 回连使用。


在 agent 成功回连之后,再取一条 user 的连接,调用 golang 的 io.Copy 方法,将两个连接的输入输出互相复制,即可将流量转发到 agent 进行处理。

package main
import (  "fmt"  "io"  "net"  "sync"  "time")
func main() {  // 使用两个channel来暂存agent和user的连接请求  userConnChan := make(chan net.Conn, 10)  agentConnChan := make(chan net.Conn, 10)  // 监听agent服务端口  go ListenService(agentConnChan, "127.0.0.1:8989")  // 监听user服务端口  go ListenService(userConnChan, "127.0.0.1:1080")  for agentConn := range agentConnChan {    userConn := <-userConnChan    go copyConn(userConn, agentConn)  }}
func ListenService(c chan net.Conn, ListenAddress string) {  listener, err := net.Listen("tcp", ListenAddress)  if err != nil {    panic(err)  }  for {    conn, err := listener.Accept()    if err != nil {      fmt.Println(err)      continue    }    c <- conn  }}
func copyConn(srcConn, dstConn net.Conn) {  _ = srcConn.SetDeadline(time.Time{})  _ = dstConn.SetDeadline(time.Time{})  var wg sync.WaitGroup  wg.Add(2)  go func() {    defer wg.Done()    defer srcConn.Close()    defer dstConn.Close()    _, err := io.Copy(srcConn, dstConn)    if err != nil {      return    }  }()  go func() {    defer wg.Done()    defer dstConn.Close()    defer srcConn.Close()    _, err := io.Copy(dstConn, srcConn)    if err != nil {      return    }  }()  wg.Wait()}



NO.4 效果图

图片



NO.5 一些可以改进的地方

可以改进的地方其实有很多, 本文给出的 demo 只能算作一个可行性验证, 如果在真实环境中使用会遇到一些问题, 例如重度使用时不可避免的会遇到连接数过高的问题, socks5 虽然是一个轻量化的协议, 但是特征还是太过于明显, 并且因为 agent 引用了一个完整的 socks5 实现库, 体积必然不会小到哪里去。因此, 如果想要改进的话, 可以尝试由 server 来处理 socks5 的认证步骤, agent 和 server 之间采用自己实现的更轻量化的协议, 这样做可以:

· 带来更小的 agent 体积

· 复用 agent 和 server 的 TCP 连接来更精确的控制连接数

· agent 和 server 之间可以使用 UDP 来通信, 更加隐蔽




RECRUITMENT

招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。


简历投递至 

[email protected]

设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;

3、精通photoshop/illustrator/coreldrew/等设计制作软件;
4、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽


简历投递至 

[email protected]

安全招聘

————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;


岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。


简历投递至

[email protected]

岗位:红队武器化Golang开发工程师

薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.掌握C/C++/Java/Go/Python/JavaScript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至

[email protected]



END

图片
图片
图片

长按识别二维码关注我们


7830使用golang撸一个反向socks5

root

这个人很懒,什么都没留下

文章评论