gen PSI
NoDeny
Пользователь
Карма: -5
Offline
Сообщений: 55
|
|
« : 20 Июля 2019, 13:05:05 » |
|
Всем гуру доброго времени суток . Как уже обсуждалось здесь http://forum.nodeny.com.ua/index.php?topic=2703.165 , Микротик в прошивках выше 6.45.1 использует новый метод авторизации на котором перестает работать модуль hw_mikrotik .pl Имея динозавра в виде 50ой версии биллинга , я попробовал по аналогии выложенной Efendy изменить скрипт и под 50ую версию, под требования авторизации МТ 6.45.1 , но к сожалению успехом изменения не увенчались . Или же синтаксис неверный или же еще какая то хитрость. Остался в итоге на 6.44.5 , на текущий момент - это последняя прошивка в которой юзер Микротик нормально авторизируется. Вопрос - как верно отредактировать скрипт hw_mikrotik .pl , чтоб нормально пройти авторизацию ?[i]@cmd = ('/login'); hw_dialog ($sock, \@cmd, \@reply, \%attr); exists $attr{ret} or return 0;
$md5 = new Digest::MD5; $md5->add (chr (0)); $md5->add ($HW_nas_pass); $md5->add (pack ("H*", $attr{ret})); @cmd = ( '/login', '=name=' . $HW_nas_user, '=response=00' . $md5->hexdigest );
hw_dialog ($sock, \@cmd, \@reply, \%attr) or return 0;
return ($reply[0] eq '!done');[/i] Заранее спасибо ! # Old API authentication method will also no longer work, see documentation for new login procedure: wiki.mikrotik.com/wiki/Manual:API#Initial_login
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #1 : 20 Июля 2019, 22:08:48 » |
|
По идее: $md5 = new Digest::MD5; $md5->add (chr (0)); $md5->add ($HW_nas_pass); $md5->add (pack ("H*", $attr{ret}));
@cmd = ( '/login', '=name=' . $HW_nas_user, '=response=00' . $md5->hexdigest ); заменить на: @cmd = ( '/login', '=name=' . $HW_nas_user, '=response=' . $HW_nas_pass );
|
|
|
Записан
|
|
|
|
gen PSI
NoDeny
Пользователь
Карма: -5
Offline
Сообщений: 55
|
|
« Ответ #2 : 20 Июля 2019, 22:57:52 » |
|
Спасибо, попробую ! Один из моих вариантов был таков, но он не заработал. @cmd = ('/login', '=name=' . $HW_nas_user, '=password=' . $HW_nas_pass) or return 0; return ($reply[0] eq '!done');
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #3 : 21 Июля 2019, 00:09:28 » |
|
Так вроде у тебя правильно (у меня нет - я скопировал и забыл имя параметра изменить). Наверное ты ж видел как н+ сделано: my $reply = $m->hw_dialog('/login','=name='.$m->{user},'=password='.$m->{pass}) or return 0; return $reply->{'!done'}; говорят, что работает
|
|
|
Записан
|
|
|
|
gen PSI
NoDeny
Пользователь
Карма: -5
Offline
Сообщений: 55
|
|
« Ответ #4 : 21 Июля 2019, 10:18:03 » |
|
Я видел , но в скрипте Н+ есть отличия . Так выходит что финальный вариант для 50 таков , без '=response=' и or return 0; ? @cmd = ( '/login', '=name=' . $HW_nas_user, '=password=' . $HW_nas_pass );
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #5 : 21 Июля 2019, 17:00:13 » |
|
Да, но ты удалил лишнее: hw_dialog ...
|
|
|
Записан
|
|
|
|
gen PSI
NoDeny
Пользователь
Карма: -5
Offline
Сообщений: 55
|
|
« Ответ #6 : 21 Июля 2019, 17:51:00 » |
|
Да, но ты удалил лишнее: hw_dialog ...
Звучит двухзначно, я удалил лишнее в смысле важное или лишнее в смысле ненужное ... hw_dialog - там два раза.... Еще раз выкладываю возможную финальную версию начиная от $sock->blocking , а вы скажите считаете ли верной или нет , если нет то поправьте меня пожалуйста( где -то надо пробелы ,а где -то нет, или они не важны, я это не понял) : $sock->blocking (0); @cmd = ('/login', '=name=' . $HW_nas_user, '=password=' . $HW_nas_pass);
hw_dialog ($sock, \@cmd, \@reply, \%attr) or return 0;
return ($reply[0] eq '!done'); }
# === API Mikrotik end =========================================================
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #7 : 21 Июля 2019, 19:40:40 » |
|
Звучит двухзначно, я удалил лишнее в смысле важное или лишнее в смысле ненужное ...
hw_dialog - там два раза....
Вот твой код, который я комментировал: @cmd = ('/login', '=name=' . $HW_nas_user, '=password=' . $HW_nas_pass) or return 0; return ($reply[0] eq '!done'); @cmd - это список команда + параметры. or return 0 делает возврат если список пустой, но он не пустой, поэтому эта команда бессмысленна, что есть что нет. А вот дальше идет возврат (return) и по сути ты вообще никакой команды на микротик не послал. А hw_dialog посылает
|
|
|
Записан
|
|
|
|
gen PSI
NoDeny
Пользователь
Карма: -5
Offline
Сообщений: 55
|
|
« Ответ #8 : 22 Февраля 2020, 12:53:36 » |
|
up
Всем снова здравствуйте . Проблема в итоге так и не решена , а Микротик хотелось бы обновлять хоть иногда. Nodeny пока обновить возможности нет. Возможно у кого есть рабочий вариант отредактированного модуля , поделитесь пожалуйста. Все варианты выше ,увы, не работают. Связать 50ую версию и Микротик с прошивкой 6.45.1 и выше так и не выходит. Последняя рабочая версия RouterOS 6.44.6.
|
|
|
Записан
|
|
|
|
operhunt
|
|
« Ответ #9 : 05 Марта 2020, 21:26:04 » |
|
Аналогичная проблема... Неужели никто не обновляет Микротик?
|
|
|
Записан
|
|
|
|
k291
|
|
« Ответ #10 : 05 Марта 2020, 23:09:11 » |
|
Я обновил. А в IP-Services прописал блоки IP с которых разрешен доступ. Не удобно, но что сейчас остается делать
|
|
|
Записан
|
|
|
|
Cell
NoDeny
Спец
Карма: 52
Offline
Сообщений: 1407
|
|
« Ответ #11 : 06 Марта 2020, 09:46:30 » |
|
Я обновил. А в IP-Services прописал блоки IP с которых разрешен доступ. Не удобно, но что сейчас остается делать
Так себе защита. Можно сказать что последняя надежда. При атаке ботнет может и завесить управление нафиг. Что часто и происходит.
|
|
|
Записан
|
|
|
|
operhunt
|
|
« Ответ #12 : 09 Марта 2020, 19:03:55 » |
|
Я обновил. А в IP-Services прописал блоки IP с которых разрешен доступ. Не удобно, но что сейчас остается делать
Так себе защита. Можно сказать что последняя надежда. При атаке ботнет может и завесить управление нафиг. Что часто и происходит. Вы же эксперт по ноудени, возможно сможете поправить авторизацию для 50 версии. Я готов оплатить Ваш труд)
|
|
|
Записан
|
|
|
|
operhunt
|
|
« Ответ #13 : 20 Марта 2020, 16:43:35 » |
|
sub hw_connect { my($md5); my(@cmd,@reply,%attr); $HW_error=''; $sock=''; &hw_debug('start connecting to the mikrotik'); $sock=new IO::Socket::INET(PeerAddr=>$HW_nas_ip, PeerPort=>$HW_nas_port, Proto=>'tcp', Timeout=>$HW_nas_connect_t_out); if( !$sock ) { $HW_error=$!; return 0; } $sock->blocking(0); @cmd=('/login'); &hw_dialog($sock,\@cmd,\@reply,\%attr); exists $attr{ret} or return 0; $md5=new Digest::MD5; $md5->add(chr(0)); $md5->add($HW_nas_pass); $md5->add(pack("H*",$attr{ret})); @cmd=('/login','=name='.$HW_nas_user,'=password='.$HW_nas_pass); &hw_dialog($sock,\@cmd,\@reply,\%attr) or return 0; return ($reply[0] eq '!done'); } Работает. Пользуйтесь.
|
|
|
Записан
|
|
|
|
Hasard
Пользователь
Карма: 0
Offline
Сообщений: 26
|
|
« Ответ #14 : 09 Июня 2021, 07:43:07 » |
|
Красава !!! Спасибо !!!
|
|
|
Записан
|
|
|
|
|