Jump to content
  • 0
OmegaTron

Не работает digest-авторизация для rci

Question

О проблеме я уже отписывался в соседней теме, но там этот вопрос проигнорировали. При запросе rci с digest-авторизацией на 2.13.C.0.0-1 веб-сервер роутера шлёт лесом

curl -s --digest --user  xxx:xxx "http://192.168.1.15:10080/rci/show/interface?name=PPPoE0" -H "Content-Type: application/json"

<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>Web server</center>
</body>
</html>

при отправке запроса к ci (xml) всё отрабатывает, при отправке запроса к rci с кукой сессии из браузера - всё работает. На ранее юзаемой 2.11.C.0.0-2 с rci проблем не было.

 

Edited by OmegaTron

Share this post


Link to post
Share on other sites

23 answers to this question

  • 0
21 час назад, OmegaTron сказал:

curl не может, но на баше через md5sum и sha256sum можно сгенерировать всё необходимое и потом всё это отправить curl'ом json как data в post запросе. Если интересует, могу скинуть свой скрипт.

Только на 2.13 от него нет проку. Там для авторизации требуется что-то ещё.

Сравнил куски кода с 2.12 и 2.13 в джаваскрипте отвечающие за авторизацию - они асболютно одинаковы. 

После этого все же запустил свой скрипт на новой прошивке, и он вполне нормально отработал. Причем по урлу https://my-name.keenetic.link/ с ssl сертификатом.

Значит никаких проблем с авторизацией в 2.13 нету.

 

Мои предположения почему у тебя не получается: когда ты генеришь на баше json, ты это делаешь с первоначальной кукой (токеном), которую ты получил тем же curl'ом, а когда запускаешь curl второй раз, с уже якобы готовым json'ом, то у тебя по факту уже новая сессия и новая кука (токен), а нужно чтобы сессия не разрывалась и пихалась в ответ та кука которая пришла в этой сессии. Именно поэтому я отказался от баша и написал все на перле с помощью либы LWP.

Edited by dvg_lab
  • Thanks 1

Share this post


Link to post
Share on other sites
  • 1
11 час назад, OmegaTron сказал:

О проблеме я уже отписывался в соседней теме, но там этот вопрос проигнорировали. При запросе rci с digest-авторизацией на 2.13.C.0.0-1 веб-сервер роутера шлёт лесом


curl -s --digest --user  xxx:xxx "http://192.168.1.15:10080/rci/show/interface?name=PPPoE0" -H "Content-Type: application/json"

<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>Web server</center>
</body>
</html>

при отправке запроса к ci (xml) всё отрабатывает, при отправке запроса к rci с кукой сессии из браузера - всё работает. На ранее юзаемой 2.11.C.0.0-2 с rci проблем не было.

 

https://forum.keenetic.net/topic/5072-rcishowarp-401-authorization-required

Share this post


Link to post
Share on other sites
  • 1

Авторизация теперь работает так:

GET-запрос к <АДРЕС КИНЕТИКА>/auth 

либо успешно завершается (вы уже авторизованы), либо возвращает код 401.

В случае кода 401 нужно сохранить заголовки ответа (token)

X-NDM-Challenge

и realm

X-NDM-Realm

и послать запрос POST-запрос на авторизацию по тому же адресу:

<АДРЕС КИНЕТИКА>/auth

с данными: 

{
  login: login
  password: sha256(token + md5(login + ':' + realm + ':' + password))
}

Опять же удачная авторизация -- ответ с кодом 200, неудачная -- 401

 

Сессия авторизации длится 10 минут (т.е. если в течение 10 минут не будет отправлено ни одного запроса -- придется еще раз авторизоваться).

Share this post


Link to post
Share on other sites
  • 1
32 минуты назад, OmegaTron сказал:

ОК. Спасибо. Проверять вариант с my.keenetic.net буду завтра, как роутер будет в зоне доступа. Теперь ясно когда всё поломалось.

Но, если судить по тому, что новый интерфейс вам не нравится -- имеет смысл переключиться на legacy (2.11.D)

Share this post


Link to post
Share on other sites
  • 1
8 минут назад, OmegaTron сказал:

Буду эксперементировать. Я упустил realm + не знал, алгоритм генерации хэша (думаю, это простительно, если учитывать тот момент, что с прямой digest-авторизацией я до этого не имел дела).

Раньше была digest-авторизация. Теперь -- не digest. Заголовки можно было назвать (практически) как угодно. Хэш от пароля и с чем-то еще тоже можно считать (практически) как угодно.

 

10 минут назад, OmegaTron сказал:

Я так понимаю, все эти меры безопасности связаны с тем, что идентичный метод авторизации использует приложение для смартфонов ? Иначе я просто не понимаю, к чему такие сложности на домашнем роутере )))

С приложением это никак не связано. А в чем сложность? От обычного пользователя домашнего роутера это все скрыто. Ему все равно в какие два поля вводить логин с паролем.

А для тех, кто знает слова digest и curl -- вроде несложно.

11 минуту назад, OmegaTron сказал:

Судя по количеству манипуляций, под windows получится явно громоздкая конструкция, а это целевая система :| Никсы на подхвате на vbox. Функционал для работы с rci будет включён в ndmq ?

Ну и раз уж пошёл разговор про ndmq, существуют ли готовые сборки для cygwin под win (сам я профан в кросс-компиляции) ?

На вопросы по ndmq я ответить не могу. Что вы хотите сделать? Какой-то скрипт для пакетного применения настроек? Можно написать на любом скриптовом языке. В Windows 10 вроде даже нормальный терминал завезли. Наверняка есть бинарники самых распространенных утилит из linux.

Share this post


Link to post
Share on other sites
  • 1
5 минут назад, OmegaTron сказал:

Не то чтобы сложно, просто это дополнительный гемморой, который неясно по какой причине появился и который предстоит решать.

 

5 минут назад, OmegaTron сказал:

Скрипт, но не применения настроек, а для получения и обработки определённых данных с роутера :)

10-ку я не перевариваю, уж не обессудьте ? максимум 7-ка

Я достаточно давно настроил себе ConEmu + Far + какой-то набор бинарников, где есть wget/curl и всякие другие штуки, не могу вспомнить где и что брал.

http://cmder.net/ -- выглядит как хорошая штука, на мой взгляд. 

Share this post


Link to post
Share on other sites
  • 0
24 минуты назад, eralde сказал:

ОК. Спасибо. Проверять вариант с my.keenetic.net буду завтра, как роутер будет в зоне доступа. Теперь ясно когда всё поломалось.

Цитата

Подсмотреть как именно происходит авторизация можно в коносоли разработчика браузера. Либо напишите мне в личку.

Я смотрел кстати, только толку от этого было ноль, ибо слишком хитро  всё теперь сделано. Там идёт post-запрос с отправкой json'a с логином и паролем в виде 64-х значного криптованного хэша (или типа того), который при каждой новой авторизации перегенеривается, после чего отдаётся кука сессии и браузер получает-принимает запросы. Вот только воспроизвести это curl'ом не получается. Вместо "хэша" (?) я пробовал совать реальный пароль, но на выходе получал не то bad request (400), не то 401 без html, в ответных хедерах. Думается мне, что нужна отправка именно "хэша", вот только я не в курсе алгоритма его генерации.

Edited by OmegaTron

Share this post


Link to post
Share on other sites
  • 0

Авторизация теперь работает так:

ОК ! Спасибо :)

Буду эксперементировать. Я упустил realm + не знал, алгоритм генерации хэша (думаю, это простительно, если учитывать тот момент, что с прямой digest-авторизацией я до этого не имел дела).

Я так понимаю, все эти меры безопасности связаны с тем, что идентичный метод авторизации использует приложение для смартфонов ? Иначе я просто не понимаю, к чему такие сложности на домашнем роутере )))

Судя по количеству манипуляций, под windows получится явно громоздкая конструкция, а это целевая система :| Никсы на подхвате на vbox. Функционал для работы с rci будет включён в ndmq ?

Ну и раз уж пошёл разговор про ndmq, существуют ли готовые сборки для cygwin под win (сам я профан в кросс-компиляции) ?

Но, если судить по тому, что новый интерфейс вам не нравится -- имеет смысл переключиться на legacy (2.11.D)
Если 2.13 будет стабильная как танк и выдержит аптайм в месяц - два, буду пользоваться ею :) Последняя 2.11, которой я пользовался (2.11.C.0.0-2), падала раз в пару дней. Судя по ченджлогу, с того момента многое исправили, но пока проверять стабильность не хочется. Если фейс и ещё какие-то моменты окончательно задолбают - перейду на 2.11.D

Share this post


Link to post
Share on other sites
  • 0
1 час назад, eralde сказал:

Раньше была digest-авторизация. Теперь -- не digest

Понятно. Просто обычно я имел дело с basic-авторизацией, а если попадался digest, то все проблемы решались дополнительным ключём для curl'a и в дебри отладки не лез, если только не попадалось что типа такого :D После того как полез увидел по заголовкам нечто напоминающее digest и "завис" ...

1 час назад, eralde сказал:

А для тех, кто знает слова digest и curl -- вроде несложно.

Не то чтобы сложно, просто это дополнительный гемморой, который неясно по какой причине появился и который предстоит решать.

1 час назад, eralde сказал:

На вопросы по ndmq я ответить не могу. Что вы хотите сделать? Какой-то скрипт для пакетного применения настроек?

Скрипт, но не применения настроек, а для получения и обработки определённых данных с роутера :)

1 час назад, eralde сказал:

Можно написать на любом скриптовом языке. В Windows 10 вроде даже нормальный терминал завезли.

10-ку я не перевариваю, уж не обессудьте ? максимум 7-ка

1 час назад, eralde сказал:

Наверняка есть бинарники самых распространенных утилит из linux.

Высчитать хэш не проблема. Просто придётся изобретать дополнительный велосипед для того, что и так уже ранее работало.

***

К слову, с my.keenetic.net каменный цветок так и не вышел

Цитата

curl -s --digest --user  xxx:xxx "http://78.47.125.180:10080/rci/show/interface?name=PPPoE0" -H "Content-Type: application/json"

<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>Web server</center>
</body>
</html>

curl -s --digest --user  xxx:xxx "http://my.keenetic.net:10080/rci/show/interface?name=PPPoE0" -H "Content-Type: application/json"

<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>Web server</center>
</body>
</html>

 

так что займусь велосипедом ...

Edited by OmegaTron

Share this post


Link to post
Share on other sites
  • 0
2 часа назад, eralde сказал:

http://cmder.net/ -- выглядит как хорошая штука, на мой взгляд.

По иронии, буквально на днях познакомился с данной сборкой. Согласен, вещь хорошая - синтез conemu и clink. Т.к. функционала последнего уже перестало хватать, пришлось искать альтернативу.

Добавьте кнопку "Выйти" в веб-интерфейсе.

Понятно. Хотели как лучше, а получилось как всегда )))

где  есть wget/curl и всякие другие штуки, не могу вспомнить где и что брал.

С этим проблем нет. Я беру бинарники либо из набора unxtools, либо использую cygwin'овский загрузчик под win для загрузки чего-то специфического.

Share this post


Link to post
Share on other sites
  • 0
В 16.10.2018 в 20:33, eralde сказал:

Авторизация теперь работает так:

Так, то ли лыжи не едут, то ли я

Цитата

X-NDM-Challenge: ZGENTERUUDCKTARJNNYYNLFLSSCITQVO
X-NDM-Realm: ZyXEL Keenetic Omni II

Данные без хэширования

ZGENTERUUDCKTARJNNYYNLFLSSCITQVOadmin:ZyXEL Keenetic Omni II:aaabbbccc123

X-NDM-Challenge + хэш второго блока в md5

ZGENTERUUDCKTARJNNYYNLFLSSCITQVO5da4a889c4a614daff93dcd11c0734e4

и наконец всё это добро в sha256

672b1977d3daed6538c0fb73cf597b384f4cd96814578ca1dc0d3aa26b982bf9

Отправляю

curl -sv "http://192.168.1.15:10080/auth" -X POST -H "Content-Type: application/json" --data-binary '{"login":"admin","password":"672b1977d3daed6538c0fb73cf597b384f4cd96814578ca1dc0d3aa26b982bf9"}'

получаю в отладке

< HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request

и аналогичный html-выхлоп

<html>
<head>
</head>
<body>
<h1>400: Bad Request</h1>
</body>
</html>

Ну и где я ошибся ?

p.s. Оригинальный пароль другой и все манипуляции проводились именно с ним, а "aaabbbccc123" - просто пример, с которым я провёл те же манипуляции. С оригинальным паролем была именно 400-я ошибка - Bad Request. Все манипуляции выполнялись под никсами, дабы исключить какие-либо проблемы с кросскомпилированными бинарниками.

 

upd: При дополнительной отправке куки сессии полученной в первоначальном get-запросе html-выхлопа не происходит, только в ответных хедерах вылезает 401-я ошибка.

Edited by OmegaTron

Share this post


Link to post
Share on other sites
  • 0

Я все это делал на перле, curl не умеет в новую авторизацию.  Не знаю каким образом он может собрать это:

{
  login: login
  password: sha256(token + md5(login + ':' + realm + ':' + password))
}

Share this post


Link to post
Share on other sites
  • 0
В 26.10.2018 в 16:23, dvg_lab сказал:

Я все это делал на перле, curl не умеет в новую авторизацию.  Не знаю каким образом он может собрать это:

curl не может, но на баше через md5sum и sha256sum можно сгенерировать всё необходимое и потом всё это отправить curl'ом json как data в post запросе. Если интересует, могу скинуть свой скрипт.

Только на 2.13 от него нет проку. Там для авторизации требуется что-то ещё.

Share this post


Link to post
Share on other sites
  • 0
1 час назад, dvg_lab сказал:

Значит никаких проблем с авторизацией в 2.13 нету.

Не факт. eralde писал об аналогичных проблемах, что и у меня. У вас какой билд ? У меня юзается экспериментальная сборка 2.13.C.0.0-1

1 час назад, dvg_lab сказал:

Мои предположения почему у тебя не получается: когда ты генеришь на баше json, ты это делаешь с первоначальной кукой (токеном), которую ты получил тем же curl'ом, а когда запускаешь curl второй раз, с уже якобы готовым json'ом, то у тебя по факту уже новая сессия и новая кука (токен), а нужно чтобы сессия не разрывалась и пихалась в ответ та кука которая пришла в этой сессии.

Нет с куками я тоже пробовал.

В 18.10.2018 в 09:56, OmegaTron сказал:

upd: При дополнительной отправке куки сессии полученной в первоначальном get-запросе html-выхлопа не происходит, только в ответных хедерах вылезает 401-я ошибка.

Единственный момент, который я не учёл - это было использование echo при генерации хэша, который давал \n на конце и делал кэш не валидным. К сожалению, его замена на printf не привела к желаемому результату - роутер всё равно шлёт меня лесом при авторизации, в том числе с куками (специально сегодня перепроверял разные варианты авторизации после замены echo на printf). Как буду дома - скину скрипт для проверки :)

Share this post


Link to post
Share on other sites
  • 0
55 минут назад, OmegaTron сказал:

Не факт. eralde писал об аналогичных проблемах, что и у меня. У вас какой билд ? У меня юзается экспериментальная сборка 2.13.C.0.0-1

Нет с куками я тоже пробовал.

Единственный момент, который я не учёл - это было использование echo при генерации хэша, который давал \n на конце и делал кэш не валидным. К сожалению, его замена на printf не привела к желаемому результату - роутер всё равно шлёт меня лесом при авторизации, в том числе с куками (специально сегодня перепроверял разные варианты авторизации после замены echo на printf). Как буду дома - скину скрипт для проверки :)

Версия ПО 2.13.C.0.0-3, и у меня все пашет, проверено на Ultra - II, где-то что-то все же не учитывается. Куку обязательно сохранять и пихать ее в ответном пакете, аккуратно со всеми \n, перепроверять хеши...

Share this post


Link to post
Share on other sites
  • 0
В 29.10.2018 в 23:07, dvg_lab сказал:

Версия ПО 2.13.C.0.0-3, и у меня все пашет, проверено на Ultra - II, где-то что-то все же не учитывается. Куку обязательно сохранять и пихать ее в ответном пакете, аккуратно со всеми \n, перепроверять хеши...

Перед тем как сегодня отписаться, начал перепроверку кода под микроскопом (всмысле с отладкой) и таки была замечена пара просчётов - md5sum выполнялся без обрезки мусора после выхлопа, а printf в realm из-за пробелов выдавал только первый блок. Разбираться с экранированием буду позже (ибо с printf манипуляций меньше), пока вернулся назад к echo и обрезке \n через tr -d "\n". Теперь наконец всё работает и ответ от роутера "HTTP/1.1 200 OK" ))) C куками к слову всё было в порядке, просто глаз замылился и я в упор не видел ошибку :(

Edited by OmegaTron

Share this post


Link to post
Share on other sites
  • 0
38 минут назад, OmegaTron сказал:

Перед тем как сегодня отписаться, начал перепроверку кода под микроскопом (всмысле с отладкой) и таки была замечена пара просчётов - md5sum выполнялся без обрезки мусора после выхлопа, а printf в realm из-за пробелов выдавал только первый блок. Разбираться с экранированием буду позже (ибо с printf манипуляций меньше), пока вернулся назад к echo и обрезке \n через tr -d "\n". Теперь наконец всё работает и ответ от роутера "HTTP/1.1 200 OK" ))) C куками к слову всё было в порядке, просто глаз замылился и я в упор не видел ошибку :(

Ну вот, я рад что все получилось. Сейчас вспомнил что тоже наткнулся на косяк с md5sum, после этого плюнул и ушел на язык уровнем повыше. Сейчас есть рабочий скрипт на перле, но в итоге хочу приделать web интерфейс, где по нажатию кнопки на новый роутер будут заливаться все необходимые параметры и отдать это в эксплуатацию, ато у меня роутеров 230 штук, периодически дергают с ними.. думаю может ansible каким-то макаром научить json-ы собирать. ))

Share this post


Link to post
Share on other sites
  • 0

@OmegaTron а можешь примером кода поделиться? Хочу то же самое на powershell сделать. Та да проблема.

Share this post


Link to post
Share on other sites
  • 0
On 10/31/2018 at 7:26 AM, OmegaTron said:

Перед тем как сегодня отписаться, начал перепроверку кода под микроскопом (всмысле с отладкой) и таки была замечена пара просчётов - md5sum выполнялся без обрезки мусора после выхлопа, а printf в realm из-за пробелов выдавал только первый блок. Разбираться с экранированием буду позже (ибо с printf манипуляций меньше), пока вернулся назад к echo и обрезке \n через tr -d "\n". Теперь наконец всё работает и ответ от роутера "HTTP/1.1 200 OK" ))) C куками к слову всё было в порядке, просто глаз замылился и я в упор не видел ошибку :(

Привет, а можно на код посмотреть? Сделал не Powershell, но где-то ошибка:

$user = "admin"
$pass= "aabbcc"


try{
    $site = Invoke-WebRequest  'http://192.168.1.1/auth'  
    
    $state = $site.Headers
$state
}catch{

    $s = $_.Exception.Response
    if($s.StatusCode -eq "Unauthorized"){
    $token = $s.Headers["X-NDM-Challenge"]
    "Token:'$token'" 
    $realm = $s.Headers["X-NDM-Realm"]
    "Realm:'$realm'"
    $id= $s.Cookies["session_id"].Value
    #sha256(token + md5(login + ':' + realm + ':' + password))
    $tomd5=$user + ':' + $realm + ':' + $pass
    "ToMD5:'$tomd5'"
    $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    $utf8 = new-object -TypeName System.Text.UTF8Encoding
    $hashmd5 = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($tomd5)))
    $hashmd5=$hashmd5.Replace("-","")
    "HashMD5:'$hashmd5'"
    $tohash = $token
    "Tosha256:'$tohash'" 
    $hashed=""
   New-object System.Security.Cryptography.SHA256Managed | ForEach-Object {$_.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($tohash))} | ForEach-Object { $hashed+=$_.ToString("x2")}
    
    $hashed=$hashed.ToUpper()
    "Sha256:'$hashed'"

    $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
    $cookie = New-Object System.Net.Cookie 
    $cookie.Name = $s.Cookies[0].Name #"session_id"
    $cookie.Value = $s.Cookies[0].Value # ID
    $cookie.Domain = $s.Cookies[0].Domain
    $cookie 
    $session.Cookies.Add($cookie);

    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add('Content-Type','application/json') 

    $headers 
    $body='{"login":"'+$user+'", "password":"'+$hashed+'"}'
    "Body to post:$body"

    Invoke-WebRequest  'http://192.168.1.1/auth' -Method Post -Body $body  -headers $headers -SessionVariable $session 
    }
    }

Вывод скрипта:

Token:'SHNNEMKBAPROMVCZHVVSXMWBDRPLUDHG'
Realm:'ZyXEL Keenetic Ultra'
ToMD5:'admin:ZyXEL Keenetic Ultra:aabbcc'
HashMD5:'CF67093EBBF9F768A853D56BEFB747D9'
Tosha256:'SHNNEMKBAPROMVCZHVVSXMWBDRPLUDHG'
Sha256:'DB7027E420608ACD3EECC82A647425F7F2A97C72857E2B3A4585A4F0FA95D56F'


Comment    : 
CommentUri : 
HttpOnly   : False
Discard    : False
Domain     : 192.168.1.1
Expired    : False
Expires    : 01.01.0001 0:00:00
Name       : session_id
Path       : 
Port       : 
Secure     : False
TimeStamp  : 08.11.2018 17:40:38
Value      : PYPHESBYQNKXNPZJ
Version    : 0

Key   : Content-Type
Value : application/json

Body to post:{"login":"admin", "password":"DB7027E420608ACD3EECC82A647425F7F2A97C72857E2B3A4585A4F0FA95D56F"}
Invoke-WebRequest : The remote server returned an error: (400) Bad Request.
At C:\Users\vladt\Downloads\Untitled1.ps1:50 char:5
+     Invoke-WebRequest  'http://192.168.1.1/auth' -Method Post -Body $ ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
 

 

Share this post


Link to post
Share on other sites
  • 0
13 часа назад, VladimirTs сказал:

а можешь примером кода поделиться? Хочу то же самое на powershell сделать. Та да проблема.

Проверьте ЛС, отправил.

9 часов назад, VladimirTs сказал:

Привет, а можно на код посмотреть? Сделал не Powershell, но где-то ошибка:

С PowerShell я никогда не работал, увы. Но тем не менее, ошибка мне видится тут

9 часов назад, VladimirTs сказал:

Token:'SHNNEMKBAPROMVCZHVVSXMWBDRPLUDHG' Realm:'ZyXEL Keenetic Ultra' ToMD5:'admin:ZyXEL Keenetic Ultra:aabbcc' HashMD5:'CF67093EBBF9F768A853D56BEFB747D9' Tosha256:'SHNNEMKBAPROMVCZHVVSXMWBDRPLUDHG' Sha256:'DB7027E420608ACD3EECC82A647425F7F2A97C72857E2B3A4585A4F0FA95D56F'

вы загоняете challenge (token) в sha256 а нужно загонять исходный  $challenge + $login:$realm:$pass в md5 и всё без пробелов и одной строкой.

Edited by OmegaTron

Share this post


Link to post
Share on other sites
  • 0

 

Делюсь работающим примером


Function Get-StringHash([String] $String,$HashName = "MD5") 
{ 
    $StringBuilder = New-Object System.Text.StringBuilder 
    [System.Security.Cryptography.HashAlgorithm]::Create($HashName).ComputeHash([System.Text.Encoding]::UTF8.GetBytes($String))|%{ 
    [Void]$StringBuilder.Append($_.ToString("x2")) } 
    $StringBuilder.ToString() 
}


$session=""
$user = "admin"
$pass= "ppp"
$authorized = $false
try{
    $site = Invoke-WebRequest  -URI 'http://my.keenetic.net/auth'  -SessionVariable session
    $authorized=$true
}catch{
    $s = $_.Exception.Response
    if($s.StatusCode -eq "Unauthorized"){
        $token = $s.Headers["X-NDM-Challenge"]
        $realm = $s.Headers["X-NDM-Realm"]
        $id= $s.Cookies["session_id"].Value
        $tomd5=$user + ':' + $realm + ':' + $pass
        $hashmd5=Get-StringHash $tomd5 "MD5"
        $tohash = $token+$hashmd5
        $hashed=Get-StringHash $tohash  "SHA256"
        $body=@{"login"=$user ; "password"=$hashed}
        try{
           $rv = Invoke-WebRequest -URI 'http://my.keenetic.net/auth' -Method Post -Body ($body|ConvertTo-Json)  -WebSession $session  -ContentType "application/json"  
           $authorized = $true
        }catch{
        }
        if ($authorized){
            $v = Invoke-RestMethod -Uri  'http://my.keenetic.net/rci/show/ip/hotspot/host' -Method Get -WebSession $session -ContentType "application/json"
        }
        $v.Length
    }
}

 

  • Thanks 1
  • Upvote 1

Share this post


Link to post
Share on other sites
  • 0

Спасибо. Пригодится, когда буду осваивать PoweShell и начну с ним работать всерьёз :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×