2016-01-29 2 views
0

Я реализую сервер Telnet, где у меня есть две реализации Telnet: предварительная аутентификация и пост-аутентификация.Twisted Telnet Server: как избежать вложенных CRLF

Основная проблема заключается в том, что сервер отправляет \r\r\n вместо \r\n. Пошаговую отладку я узнал, что это связано с ProtocolTransportMixin, что есть дважды в классе heriarchy. Я считаю, что это связано с предварительным и пост-автским транспортом, которые каким-то образом взаимосвязаны (один из них является базовым транспортом другого).

Есть ли способ отменить эффект одного из микшинов?

Мой Telnet сервер завод конкретизирует с

lambda: TelnetTransport(MyOwnTelnetAuthTransport, ...) 

MyOwnTelnetAuthTransport подкласс AuthenticatingTelnetProtocol.

После аутентификации я соединяю его через царство с моим собственным подклассом TelnetBootstrapProtocol.

Так как TelnetTransport и TelnetBootstrapProtocol имеют ProtocolTransportMixin, который заменяет \n для \r\n в write() метод, который я в конечном итоге с \r\r\n ...

ответ

0

Я установил его рода хак. Все еще ищут лучшие решения.

подклассы TelnetTransport с MyTelnet со следующей реализацией:

class MyTelnet(TelnetTransport): 
    """Sole purpose is to override write() and fix a CRLF nesting bug""" 

    # Because of the presence of two ProtocolTransportMixin in the protocol 
    # stack once authenticated, I need to override write() and remove a \r 
    # otherwise we end up with \r\r\n on the wire. 
    def write(self, bytes): 
     self.transport.write(bytes.replace('\r\n', '\n')) 

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

+0

Хотя это будет работать 99,9% от времени, с технической точки зрения это неверно, поскольку вызывающий может * вызывать 'write (" \ r ")', а затем 'write (" \ n ")'. – Glyph

0

Прежде всего, если вы на самом деле проверяете пользователей, не пользуйтесь telnet. Используйте SSH. Twisted предоставляет conch, который уже реализует протокол.

Во-вторых, когда вы задаете такой вопрос, всегда указывайте SSCCE. Я не знаю, какова ваша фактическая проблема, если я не могу запустить ваш код, и я не собираюсь реконструировать ваш код на основе свободного описания.

Наконец-то, похоже, что вы только что обнаружили ошибку в Twisted, и вы должны ее записать. TelnetTransport не должно удваиваться на CR, так что если это действительно то, что происходит, это не должно быть хакерским обходным путем в вашем коде, кроме исправления вверх по течению.

P.S .: MyOwnTelnetAuthTransport не является транспортом, это TelnetProtocol, поэтому именование немного запутанно. Если вы поместили класс Transport в свою иерархию, возможно, это проблема?

+0

Это для honeypot, чтобы поймать вредоносное ПО в Интернете. Я явно внедряю аутентификацию Telnet в суффикс с помощью скрученной SSH-системы, чтобы иметь больше возможностей для покрытия. –

+0

Я хотел был бы предоставить SSCCE, но он включает в себя Портал, Аватар, протоколы Telnet, фабрики, классы аутентификации, а затем подключается к терминалу (History.Recvline или что-то еще) ... Я мог бы вернуться и предоставить его, но это нетривиальный объем работы. Я хочу доставить свой проект, чтобы я мог перейти к своей работе: анализ вредоносных программ.Это взлом, но он работает, поэтому стимул для SSCCE опустился совсем немного. Этот PR может дать вам представление о том, что я сделал: https://github.com/micheloosterhof/cowrie/compare/master...GoSecure:telnet-wip?expand=1 –

+0

Обращение к PS: Я нахожу, что рамки не ясно о различии между транспортом и протоколом. За последние недели я прочитал много извращенных документов и исходного кода, так как это было неясно мне в контексте Telnet. Я мог бы смешать их. Я обязательно переименую класс, чтобы выразить правильное намерение. Благодаря! –