即时重写一个tcpstream:它有多难? 如何倾倒所述stream?

我试图写一个tcpstream“隧道”(类似于默认情况下的SSH处理),但有一个例外,我必须重写某些信息,因为它stream经。

我确定那里有类似的东西,但我一直没能find它。 我有三个主要问题:

  • 有一个简单的方法来保存一个tcpstream观察? (即使用netcat或者ssh -r / -l / -D,或者全部使用其他工具)
  • 在stream动中重写stream有多难?

编辑:被重写的信息将只是初始authentication。

带有伐木的直通隧道可以从现有的(或容易找到的)公用工具拼凑而成。

 socat -v -x tcp -l:8080,fork,reuseaddr tcp:localhost:80 2> log

在这个例子中,连接到http://localhost:8080/将通过http://localhost:80/ ,并将日志数据传输到log

TCPreen工具专门用于这个确切的目的。

如果您拥有root权限,则有许多分析器(如tcpdump和tcpflow)可以直接从网络捕获数据包,而不必重定向流量。

socat还可以使用,cr,crnl选项来进行一些非常基本的流修改,crnl选项会,crnl /添加/替换\r字符。

在任何情况下,回到原来的问题…自从我写了任何Java以来​​,这已经过时了,这完全没有经过测试,但是可以在重新传输之前修改流量的隧道并不困难。

 public class ForwardAndChangeCaseThread extends Thread { private Socket in, out; public ForwardAndChangeCaseThread(Socket in, Socket out) { this.in = in; this.out = out; } public void run() { byte[] buf = new byte[4096]; InputStream in = this.in.getInputStream(); OutputStream out = this.out.getOutputStream(); int count; while ((count = in.read(buf)) > 0) { for (int i = 0; i < count; i++) if (buf[i] >= 0x40) buf[i] ^= 0x20; out.write(buf, 0, count); } } } public class TcpForwarder { public static void main(String[] args) { serverSocket listen = new serverSocket(8080, 1); for (;;) { Socket local = listen.accept(); Socket remote = new Socket("localhost", 80); new ForwardAndChangeCaseThread(local, remote).start(); new ForwardAndChangeCaseThread(remote, local).start(); } } } 

很确定Ettercap支持重写TCP流。

tcpdump可以写出数据包捕获,然后你可以使用Wireshark进行分析

如果你想以编程的方式做,你可以检查他们各自的来源,以获得从哪里开始的想法。

不要自吹自擂,但我写了一些代码来完成这个在我很久以前写的异步IO框架。 关于代码的许多事情现在已经过时了,但它确实有效。 这里有一个链接到它的网页:

  • Streammodulee系统

我写的东西,你想要隧道的东西叫做PortForward,还有一些东西,将倾倒出一个TCP流,但我忘了我所说的。 由于框架的工作原理,它们可以很容易地结合起来。

如果你想用它来实现这个目标,我会回来的。 正如其他人所指出的那样,不可能重新编写SSL流。 所以,如果你的连接使用加密和/或MAC(一种方式是真实的,如果它是SSL),你运气不好。

我不确定这是不是你要问的,但是…

除非您拥有服务器SSL证书的私钥,否则您不能动态重写SSL流,或者您可以在某些位置(在客户端或服务器地址空间中)对其进行截取,而不受SSL保护。 如果可以的话,SSL将是浪费时间。

同样,如果您捕获SSL流的全部内容(双向),除非您拥有相关的私钥,否则不会有任何好处。