背景

什么时候需要修改TCP传输的数据 ? 如果我们知道TCP中的数据,并且可以修改,可以做什么 ?

TCP数据修改思路:

  1. Windows平台 Winsock api 替换本机ddl
  2. Linux平台 netfilter 库
  3. 通用 代理中间人攻击

常见工具:

  1. WPE三剑客
  2. HookMe
  3. 基于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,这样修改逻辑就完成的。当然具体需要和实际结合。

消息修改,并且没有问题,需要严格遵守服务端消息格式,加密解密,盐值,序号等。