Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2016 06:52:18

exhalace
Зарегистрирован: 2016-06-03
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib, D-Link и согласование

Приветствую.

Имеется DGS-3627G, у которого телнет не хочет дружить c telnetlib.

Тестовый скрипт:

#!/usr/bin/env python2
# ~*~ coding: utf-8 ~*~
import telnetlib
tn = telnetlib.Telnet('172.20.10.18')
tn.set_debuglevel(1)
tn.read_until("UserName:")
tn.write("admin\r")
tn.read_until("PassWord:")
tn.write("Pa$$w0rd\r")
tn.read_until("#")
tn.write("logout\r")
tn.close()

На первый взгляд все очень тривиально, но давайте посмотрим дебаг:
Telnet(172.20.10.18,23): recv '\xff\xfd\x03'
Telnet(172.20.10.18,23): IAC DO 3
Telnet(172.20.10.18,23): recv '\xff\xfb\x03\xff\xfb\x01\x1b[0m\x1b[1;1H\x1b[2J\n\r                      DGS-36'
Telnet(172.20.10.18,23): IAC WILL 3
Telnet(172.20.10.18,23): IAC WILL 1
Telnet(172.20.10.18,23): recv '27G Gigabit Ethernet Switch\n\r                     '
Telnet(172.20.10.18,23): recv '       Command Line Interface\n\r\n\r                 '
Telnet(172.20.10.18,23): recv '          Firmware: Build 2.82.B23\n\r           Cop'
Telnet(172.20.10.18,23): recv 'yright(C) 2010 D-Link Corporation. All rights rese'
Telnet(172.20.10.18,23): recv 'rved.\n\rUserName:'
Telnet(172.20.10.18,23): send 'admin\r'
Telnet(172.20.10.18,23): recv '\xff\xfe\x03'
Telnet(172.20.10.18,23): IAC DONT 3
Telnet(172.20.10.18,23): recv '\xff\xfc\x03'
Telnet(172.20.10.18,23): IAC WONT 3
Telnet(172.20.10.18,23): recv '\xff\xfc\x01admin\n\rPassWord:'
Telnet(172.20.10.18,23): IAC WONT 1
Telnet(172.20.10.18,23): send 'Pa$$w0rd\r'
Telnet(172.20.10.18,23): recv '*'
Telnet(172.20.10.18,23): recv '*'
Telnet(172.20.10.18,23): recv '********\n\rFail!\n\rUserName:'
Тут мы видим что согласующие последовательности попадают в пользовательский ввод какого-то лешего, и явно что-то лишнее отсылается в качестве пароля.

Пробуем через библиотеку pexpect
#!/usr/bin/env python2
# ~*~ coding: utf-8 ~*~
import sys
import pexpect
switch_ip = '172.20.10.18'
p = pexpect.spawn('telnet %s' % switch_ip, timeout=2)
p.logfile=sys.stdout
p.expect('UserName:')
p.sendline('admin')
p.expect('PassWord:')
p.sendline('Pa$$w0rd')
p.expect('#')
p.sendline('logout')
p.close()
Вывод
                      DGS-3627G Gigabit Ethernet Switch
                            Command Line Interface
                           Firmware: Build 2.82.B23
           Copyright(C) 2010 D-Link Corporation. All rights reserved.
UserName:admin
admin
PassWorda$$w0rd
********
DGS-3627G:admin#logout
Видно, что все работает. То есть через нативный телнет все согласуется. Давайте посмотрим, что же там происходит:
$ telnet
telnet> toggle options
Will show option processing.
telnet> open 172.20.10.18
Trying 172.20.10.18...
Connected to 172.20.10.18.
Escape character is '^]'.
SENT DO SUPPRESS GO AHEAD
SENT WILL TERMINAL TYPE
SENT WILL NAWS
SENT WILL TSPEED
SENT WILL LFLOW
SENT WILL LINEMODE
SENT WILL NEW-ENVIRON
SENT DO STATUS
SENT WILL XDISPLOC
RCVD DO SUPPRESS GO AHEAD
SENT WILL SUPPRESS GO AHEAD
RCVD WILL SUPPRESS GO AHEAD
RCVD WILL ECHO
SENT DO ECHO
                      DGS-3627G Gigabit Ethernet Switch
                            Command Line Interface
                           Firmware: Build 2.82.B23
           Copyright(C) 2010 D-Link CorpRCVD DONT TERMINAL TYPE
RCVD DONT NAWS
RCVD DONT TSPEED
RCVD DONT LFLOW
RCVD DONT LINEMODE
RCVD DONT NEW-ENVIRON
RCVD WONT STATUS
RCVD DONT XDISPLOC
oration. All rights reserved.
UserName:admin
PassWord:********
DGS-3627G:admin#
DGS-3627G:admin#logout
Command: logout
**********
* Logout *
**********
Connection closed by foreign host.
Конечно же я могу не ждать приглашения к вводу логина и пароля, а просто их отсылать, после чего уже ожидать промта самого CLI длинка. Но мне очень интересно данное поведение, поскольку совсем непонятно как могут нечто лишнее попадать в пользовательский ввод.
Возможно telnetlib использует режим telnet-а, не поддерживаемый коммутатором, но это вряд ли. Если повторить блок кода с вводом логина пароля, то таки все работает. Охото разобраться, но с наскоку не получается.

Офлайн

#2 Июнь 3, 2016 08:39:53

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

telnetlib, D-Link и согласование

Да было такое поведение замечено за ДГСами (решил использованием plink из комплекта putty), на ДЕСах все нормально работает. Кажется мне, что тут бага самого D-linka, поскольку на всех других устройствах для которых пользовал telnetlib все было в порядке. Друг тоже проделывал с ДГС, но на cpp, наблюдал похожее поведение.

PS. Если разберётесь, отпишите, самому интересно.

Отредактировано noob_saibot (Июнь 3, 2016 08:40:46)

Офлайн

#3 Июнь 3, 2016 12:25:04

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

telnetlib, D-Link и согласование

Вот эту ветку смотрели?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Июнь 3, 2016 12:45:29

exhalace
Зарегистрирован: 2016-06-03
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib, D-Link и согласование

PooH
Вот эту ветку смотрели?
Смотрел, но некропостить не стал.
Дампы трафика подтверждают, что на пользовательский ввод попадают лишние символы, которые отображаются на железке эхом в виде дополнительных звездочек. Саму либу пока не трейсил, не было времени. Временно ввернул кривой костыль с повторной попыткой авторизации.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version