Переписать поток tcp на лету: насколько это сложно? Как насчет того, чтобы взять дамп указанного потока? - PullRequest
3 голосов
/ 30 января 2010

Я пытаюсь написать «туннель» tcp-потока (аналогично тем, которые SSH обрабатывает по умолчанию), но с одним исключением, я должен переписать некоторую информацию, когда она проходит.

Я уверен, что есть что-то похожее, но я не смог его найти. У меня есть три основных вопроса:

  • Есть ли простой способ сохранить поток tcp для наблюдения? (т. е. с использованием netcat, или ssh -r / -l / -D, или с использованием какой-либо другой утилиты)
  • насколько сложно переписать поток на лету?

Редактировать: переписываемая информация будет только первоначальной аутентификацией.

Ответы [ 4 ]

11 голосов
/ 30 января 2010

Прямой сквозной туннель с каротажем может быть выложен вместе с существующими (или легко найденными) утилитами.

<a href="http://www.dest-unreach.org/socat/" rel="noreferrer">socat</a> -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, которые удаляют / добавляют / заменяют \r символов.

В любом случае вернемся к исходному вопросу & hellip; Прошло уже много лет с тех пор, как я написал какую-либо 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();
        }
    }
}
2 голосов
/ 30 января 2010

Уверен, что Ettercap поддерживает перезапись потоков TCP.

tcpdump может записывать захваты пакетов, которые затем можно будет проанализировать с помощью Wireshark

Если вы хотите сделать это программно, вы можете проверить их соответствующие источники, чтобы получить представление о том, с чего начать.

1 голос
/ 30 января 2010

Не говоря уже о моем собственном звуковом сигнале, но я написал некоторый код, чтобы сделать именно это в рамках, которые я написал давно для асинхронного ввода-вывода. В коде есть много вещей, которые уже устарели, но это работает. Вот ссылка на веб-страницу на нем:

То, что я написал, что делает туннель, который вы хотите, называется PortForward, и там также есть что-то, что будет выводить поток TCP, но я забыл, как я его назвал. Их можно легко комбинировать из-за того, как работает фреймворк.

Я вернусь, если вам понадобится помощь в ее использовании для достижения этой цели. Как отмечали другие, невозможно переписать поток SSL на лету. Так что, если ваше соединение использует шифрование и / или MAC (один из способов это было бы верно, если бы это был SSL), вам не повезло.

0 голосов
/ 30 января 2010

Я не уверен, что это то, что вы спрашиваете, но ...

Вы не можете переписать поток SSL на лету, если у вас нет личного ключа для сертификата SSL сервера ... или вы можете перехватить его в некоторый момент (в адресном пространстве клиента или сервера), где он не защищен SSL. Если бы вы могли, SSL был бы пустой тратой времени.

Аналогично, если вы захватываете все содержимое потока SSL (в обоих направлениях), это не принесет вам пользы, если у вас нет соответствующих закрытых ключей.

...