Jump to content

VladimirTs

Forum Members
  • Posts

    26
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by VladimirTs

  1.  

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

    
    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 2
    • Upvote 2
  2. 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
     

     

  3. Спасибо за разъяснение, а что если мне нужно получить доступ к rci из локальной сети? Обращаться по порту 79?

    И связанный вопрос - если не работает basic auth, можно ли с помощью современных скриптовых языков, например, powershell, использовать поддерживаемую новую аутентификацию для вызова rci? 

    ИЗ документации поддерживаются:

    • OAuth: Requires -Token. Will send and RFC 6750 Authorization: Bearer header with the supplied token. This is an alias for Bearer
  4. Перестал работать следующий код на PowerShell - ошибка access denied, c предыдущей все было в порядке

    $user = "admin"
    $pass= "****"
    $secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
    Invoke-WebRequest "http://192.168.1.1/rci/ip/route"-Credential $credential

     

  5. 2 hours ago, Александр Рыжов said:

    Откройте в своём любимом браузере отладчик (F12) и посмотрите что WebUI отсылает.

    Поделюсь с сообществом скриптом, сделано через отправку параметров в body через json

    function ConvertTo-IPv4MaskString {
      <#
      .РЕЗЮМЕ
      Преобразует число разрядов (0 - 32) в строку маски сети IPv4 (например, "255.255.255.0").
    
      .ОПИСАНИЕ
      Преобразует число разрядов (0 - 32) в строку маски сети IPv4 (например, "255.255.255.0").
    
      .ПАРАМЕТР MaskBits
      Указывает число разрядов в маске.
      #>
      param(
        [parameter(Mandatory=$true)]
        [ValidateRange(0,32)]
        [Int] $MaskBits
      )
      $mask = ([Math]::Pow(2, $MaskBits) - 1) * [Math]::Pow(2, (32 - $MaskBits))
      $bytes = [BitConverter]::GetBytes([UInt32] $mask)
      (($bytes.Count - 1).. 0 | ForEach-Object { [String] $bytes[$_] }) -join "."
    }
    
    $user = "admin"
    $pass= "password"
    $interface="OpenVPN0"
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add('Content-Type','application/json')
    
    $secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
    $ips=get-content C:\1\ips.txt 
    $ips| ForEach-Object {
        $network=$_.Split("\/")[0]
        $mask=ConvertTo-IPv4MaskString([int] $_.Split("\/")[1])
        $body='{"network":"'+$network+'", "mask":"'+$mask+'",  "interface":"'+$interface+'","auto": true }'
        $rv=Invoke-WebRequest "http://my.keenetic.net/rci/ip/route"  -TimeoutSec 3 -Credential $credential -Method Post -Body $body -Headers $headers
        Write-Host "$network $mask processed:$(-not $rv.Content.Contains("error"))"
    }

    формат файла ips.txt - сеть/маска

    108.174.12.0/22
    108.174.0.0/21
    108.174.8.0/21
    199.101.161.0/24

     

     

    • Thanks 1
    • Upvote 1
  6. Добрый, не подскажите, как с помощью RCI добавить маршрут? 

    URL понятен, http://192.168.1.1/rci/ip/route, а что и как отправить POST в body?

    • Thanks 1

    Cloud

    Добрый день!

    Использую Https для доступа к внутреннему сайту, очень часто (2-3 раза в час) появляется ошибка (Keenetic 4G III), подключение через модем.

    Cloud::Tunnel: "NDNS/733bf23ce566fb206e0084eb632c256e": WAN: failed to receive data from 192.168.8.100:443 - connection reset by peer.

     

    Аналогично настроенное соединение через проводного провайдера (Ultra) ошибок не выдает.

    Как улучшить надежность? На модеме качество связи очень высокое - вышка рядом, 4g Yota.

    Может у Keenetic 4G III просто мощности процессора или памяти не хватает?

    Status Internet access
    Modem HUAWEI_MOBILE
    Network type 4G
    Software version 22.317.01.00.17 / 17.100.13.01.03-Mod1.3
    Signal (CINR/RSSI) 27dB / -65dBm
    LTE device ID removed
    IPv4 address 10.152.72.60
    MAC address BA:AB:BE:34:44:45
    KeenDNS name removed.mykeenetic.net
    Mode CDC Ethernet
  7. Спасибо, работает.

    кстати, если кому интересно - скрипт на PowerShell

    $user = "admin"
    $pass= "password"
    $secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
    $rv=Invoke-WebRequest "http://my.keenetic.net/rci/system/reboot?interval=60"  -TimeoutSec 3 -Credential $credential -Method Post -Body "{}"
    $message = "Router: $(($rv.Content |ConvertFrom-Json).message)"
    Write-Host $message

     

    • Thanks 3
×
×
  • Create New...