x
WebSocket协议
websocket是一种在单个TCP连接上建立的全双工通信协议,服务端和客户端可以护发信息,实现异步通信
c2
command and control
攻击者用来远程控制已经攻陷的计算机(肉鸡,僵尸机)
组成部分
c2服务器
发送指令和窃取数据
c2客户端(木马)
运行在受害者电脑上的恶意程序,负责:定期连接服务器,等待服务器指令,执行指令,将数据返回服务器
常见c2通信形式
https,dns,websocket,邮件,网络api,自定义tcp/udp
服务端实现(server.go)
准备工作
安装websocket依赖
1 | go get github.com/gorilla/websocket |
1 |
1 | s.upgrader.Upgrade(w,r,nil)返回一个升级成功连接成功的websocket对象后续通过ReadJSON,WriteJson,Close方法与客户端进行通信 |
建立一个message结构体用来显示待发送的命令,显示发送的文件,,建立一个client基础结构体,记录客户端信息,建立一个server结构体,用来升级websocket,通过map快速查找和管理多个客户端
用NewServer初始化一个server结构体
给server绑定一个连接websocket的方法,首先升级链接websocket,垫一个Close方法,在下面所有操作完成后关闭连接,在方法里面声明一个校验标识,把连接对象返回的信息赋值给这个标识
然后开始注册填入map中client的信息
启动心跳检测
心跳检测
确认双方通信是否活跃
向客户端发送命令
生成自签名证书
叶子证书
数字证书层级结构中的终端实体证书,证书链的最后一个,因为他不能再签发下级证书,直接代表一个具体的实体,是服务器直接呈现给客户端的证书
1 | 根证书-》中间证书-》叶子证书 |
SAN主题备用名称
传统CN只允许绑定一个主机名,SAN是CN进化版
我生成一个叶子证书,装上SAN拓展,里面加上localhost,当被控端通过wss://localhost:8443/ws连接C2服务器时,TLS库校验该叶子证书的SAN中是否包含localhost,校验通过,然后建立加密隧道
如果不加SAN,现代浏览器或TLS库会拒绝连接
1 | x509.CreateCertificate返回一个数组类型的byte,是证书的der编码数据 |
der和pem的区别
der是二进制不可读,pom是der的base64编码,便于复制粘贴
TLS
https
wss://通信被包装在TLS隧道中,流量看起来和普通https网页一模一样
我趣流量分析来了,学习交集这一块
学不动先照着敲代码吧
生成go.mod
是的照着敲完发现自己不会生成go.mod
1 | go mod tidy |
1 | package go_studay/WebSocketC2 is not in std (F:\cry\go\src\go_studay\WebSocketC2) |
如有错误,多多指教