3

tcpストリーム「トンネル」(SSHがデフォルトで処理するものと同様)を書き込もうとしていますが、1つの例外を除いて、流れるときに特定の情報を書き直す必要があります。

そこに似たようなものがあると確信していますが、私はそれを見つけることができませんでした。私は3つの主な質問があります:

  • 観察のためにtcpストリームを保存する簡単な方法はありますか?(つまり、netcat、ssh -r / -l / -Dを使用するか、他のユーティリティを一緒に使用します)
  • その場でストリームを書き直すのはどれくらい難しいですか?

編集:書き換えられる情報は、単なる初期認証になります。

4

4 に答える 4

11

ロギングを備えたストレートパススルートンネルは、既存の(または簡単に見つけられる)ユーティリティから一緒に石畳にすることができます。

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

この例では、に接続するhttp://localhost:8080/とに渡されhttp://localhost:80/、ログデータはに転送されlogます。

ツールTCPreenは、まさにこの目的に特化しています。

root権限を持っている場合、トラフィックをリダイレクトすることなく、ネットワークから直接パケットをキャプチャできるtcpdumptcpflowなどの多くのアナライザがあります。

socatまた、文字を削除/追加/置換するオプションを使用して,cr、非常に基本的なストリーム変更を行うこともできます。,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();
        }
    }
}
于 2010-01-30T02:07:45.680 に答える
2

EttercapがTCPストリームの書き換えをサポートしていることは間違いありません。

tcpdumpはパケットキャプチャを書き出すことができ、後でWiresharkを使用して分析できます。

プログラムでそれを実行したい場合は、それぞれのソースを調べて、どこから始めればよいかを知ることができます。

于 2010-01-30T01:54:48.097 に答える
1

私自身のホーンを宣伝するためではありませんが、私は非同期IO用にずっと前に書いたフレームワークでこれを正確に行うためのコードをいくつか書きました。コードには今では時代遅れのものがたくさんありますが、それは機能します。その上にあるWebページへのリンクは次のとおりです。

私が書いた、必要なトンネル機能を実行するものはPortForwardと呼ばれ、TCPストリームをダンプするものもありますが、私がそれを呼んだことを忘れてしまいました。フレームワークがどのように機能するかにより、これらは簡単に組み合わせることができます。

その目標を達成するためにそれを使用して助けが必要な場合は、私は戻ってきます。他の人が指摘しているように、SSLストリームをその場で書き直すことは不可能です。したがって、接続で暗号化やMACを使用している場合(SSLの場合、これが当てはまる1つの方法です)、運が悪いことになります。

于 2010-01-30T01:55:37.750 に答える
0

これがあなたが求めているものかどうかはわかりませんが...

サーバーのSSL証明書の秘密鍵がない限り、SSLストリームをその場で書き換えることはできません...または、SSLで保護されていないある時点(クライアントまたはサーバーのアドレス空間)でSSLストリームを傍受することができます。できれば、SSLは時間の無駄になります。

同様に、SSLストリームのコンテンツ全体を(双方向で)キャプチャする場合、関連する秘密鍵がない限り、効果はありません。

于 2010-01-30T01:54:50.647 に答える