背景
什么时候需要修改TCP传输的数据 ? 如果我们知道TCP中的数据,并且可以修改,可以做什么 ?
TCP数据修改思路:
- Windows平台 Winsock api 替换本机ddl
- Linux平台 netfilter 库
- 通用 代理中间人攻击
常见工具:
- WPE三剑客
- HookMe
- 基于winsock的一系列工具
因个人对dll等不熟悉,netfilter尝试失败等原因,遂采用代理中间人方式。
但是了解tcp的都应该知道,tcp和http传输消息不同的是,tcp的包中只有源信息和目的信息,而http的应用层中包含了目的服务的信息。那么如果修改目的信息为中间人服务,那么原本的目的信息去哪里了?
这里可以采用别人开发好的socks5代理服务,它基于dll代理,与中间人服务器建立连接,建立连接成功后,并且发送一个tcp包,里面包含了原始信息包。这样socks5服务器就有了中间人的条件。
客户端主机 <=> 代理服务器 <=> 目标服务器
修改逻辑
以golang代码为例
func proxy(dst io.Writer, src io.Reader, lead bool, errCh chan error) {
//这块使用的copy
var err error
//发送的规则
if lead {
//src是请求信息
// 问题是如何解密封包中的含义是什么,然后就可以编码修改发送和返回
bufReq := bufio.NewReader(src)
for ; ; {
//需要将发送指令接收到,然后重写 发送到服务端
var buf [128]byte
n ,_:=bufReq.Read(buf[:])
fmt.Printf("接收到实际客户端消息%s",string(buf[:n]))
dst.Write(([]byte)(string(buf[:n])+"1"))
}
} else {
//接受的规则
_, err = io.Copy(dst, src)
}
if tcpConn, ok := dst.(closeWriter); ok {
tcpConn.CloseWrite()
}
errCh <- err
}
假设tcp中的消息都是明文,且单个消息小于等于128,这样修改逻辑就完成的。当然具体需要和实际结合。
消息修改,并且没有问题,需要严格遵守服务端消息格式,加密解密,盐值,序号等。