HTTPMOD und javascript login? ich blicks nicht...

Begonnen von eldrik, 14 März 2015, 06:55:16

Vorheriges Thema - Nächstes Thema

eldrik

Hi,

ich komm nicht weiter :/ und zwar lese ich bereits erfolgreich ein paar Seiten via HTTPMOD und entsprechenden Regex aus, darunter auch Seiten, bei denen man User und Passwort in der URL mit angeben kann, doch will es mir bei dem aktuellen Fall nicht gelingen.

Die Login Seite lautet: http://meineip/public/login.html und verlangt nur ein Passwort, dem Seitenquelltext kann man entnehmen, dass es sich um ein javascript handeln soll

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Login</title>
    <link rel="stylesheet" href="style.css" />
   
    <script src="jquery-1.7.1.js"></script>
    <script src="md5.js"></script>   
    <script src="login.js"></script>   
</head>
<body>

<div id="outside">
    <div class="spacerBar"></div>
    <div id="content">
        <div class="section">

            <form action="/" onsubmit="tryLogin(); return false;">
                <fieldset>
                    <legend>Login</legend>
                    <p>
                        <label for="passwordInput">Password&nbsp;:</label>
                        <input type="password" id="passwordInput" maxlength="15" tabindex="100" />
                        <input type="button" name="Login" value="Log In" onclick="tryLogin();" />
                        <noscript>
                            <label class="warning">WARNING: JavaScript not enabled - you will not be able to log in!</label>
                        </noscript>
                    </p>
                       
                </fieldset>
            </form>
        </div>                   
    </div>
</div> 
   
</body>
</html>


Wie könnte ich mich nun an dieser Stelle mit HTTPMOD anmelden und nach dem Login die eigentlich interessanten Daten von der Seite http://meineip/main.html auslesen?

Greetz
Eldrik

rudolfkoenig

Du musst login.js analysieren, um zu wissen, was fuer eine Anmeldung zu tun ist.
Es kann leicht sein, dass HTTPMOD nicht ohne weiteres in der Lage ist alle benoetigten Schritte durchzufuehren.

eldrik

Hi,

hilft es das Script hier zu posten? Mit firebug konnte ich es mir zumindest anzeigen lassen.

function tryLogin()
{
var password = $("#passwordInput").val().substr(0,16);
$("#passwordInput").val("");
for (var i = password.length; i < 63; i++)
{
password += String.fromCharCode(1);
}
var hash = hex_md5(password);
$.ajax({
type: "POST",
url: '/login?id='+hash,
success: function( data ) {
window.location.replace("/main.html");
},
error: function(jqXHR, textStatus, errorThrown) {
alert("Login failed - Invalid password");
$("#passwordInput").focus();
}
});
}


Greetz
Eldrik

rudolfkoenig

Zitathilft es das Script hier zu posten?

Du meinst, damit jemand sie in Perl nachbaut?
Das muessen wir abwarten, unmoeglich ist das nicht.

eldrik

ich hatte gehofft, dass man anhand des Scriptes vl. eine URL hätte ableiten können die für die Anmeldung genutzt wird. :(

Greetz
Eldrik

rudolfkoenig

Nein, so einfach ist das nicht. Das Passwort wird bis Laenge 63(?) mit chr(1) aufgefuellt, daraus ein md5hash berechnet, und das an dem Server geschickt, der vermutlich ein Cookie setzt, was im weiteren als Zugangs-Ticket dient.

StefanStrobel

Hallo Eldrik,

wenn das Passwort sich nicht ändert, musst Du es eventuell nicht selbst berechnen und das JavaScript gar nicht weiter ansehen. Ich würde den Login-Vorgang einfach ein paar mal mit einem Proxy wie der Burp suite beobachten und analysieren. So kannst Du versuchen das Ergebnis der Berechnung in der Burp suite mitzuschneiden und dann einfach diesen Request mit dem fertig gehashten Passwort in HTTPMOD verwenden. Selbst wenn mehrere Requests nacheinander nötig sind, sollte das mit HTTPMOD funktionieren.

Gruss
   Stefan

eldrik

Hallo Stefan,

das mit Burp war scheinbar der erste Schritt in die richtige Richtung, den Hash hab ich jetzt und dies scheint auch mit HTTPMOD zu funktionieren.

Wie schaff ich es nun nach dem initialen anmelden über die URL http://10.0.81.16/login?id=hash danach Inhalte der URL http://10.0.81.16/main.html auszulesen?

Greetz
Eldrik

StefanStrobel

Hallo Eldrik,

wie Rudolf geschrieben hat, vergibt der Server vermutlich nach der erfolgreichen Anmeldung eine Session-Id und setzt diese per cookie im HTTP-Header.

Das Cookie kannst Du aus der Server-Antwort auf eine erfolgreiche Anmeldung extrahieren (siehe sidIDRegex) und dann in den folgenden Requests in einem Header oder wo auch immer es der Server erwartet als $sid verwenden.

Gruss
   Stefan

eldrik

Hallo Stefan,

sorry irgendwie bekomm ich es nicht auf die Reihe  :'(

In Burp läuft folgendes ab:
Nachdem man auf der Login Seite das Passwort eingegeben hat, erhält man nach dem Request den folgenden Response

Request:
/login?id=md5hash HTTP/1.1

Response:
HTTP/1.1 200 OK
Content-Length: 0


Danach wird direkt eine Verbindung zur /main.html aufgebaut

Request:
GET /main.html HTTP/1.1
Host: 10.0.81.16
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://10.0.81.16/public/login.html
Connection: keep-alive


Response:
HTTP/1.1 200 OK
Content-Type:text/html
Content-Length: 2683

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Triax SatIP Converter</title>

    <link rel="stylesheet" href="public/style.css" />
    <script type="text/javascript" src="public/jquery-1.7.1.js"></script>
    <script type="text/javascript" src="public/md5.js"></script>
    <script type="text/javascript" src="ajaxfileupload2.js"></script>
    <script type="text/javascript" src="remoteCall.js"></script>
    <script type="text/javascript" src="networkSettings.js"></script>
    <script type="text/javascript" src="softwareUpgrade.js"></script>
    <script type="text/javascript" src="lnbSettings.js"></script>
    <script type="text/javascript" src="diagnostics.js"></script>
    <script type="text/javascript" src="systemStatus.js"></script>
    <script type="text/javascript" src="upnpSettings.js"></script>
    <script type="text/javascript" src="administration.js"></script>
    <script type="text/javascript" src="mainNavigation.js"></script>
</head>
<body>

<div id="outside">
    <div class="spacerBar"></div>

    <div id="content">
        <div id="contentHeader">
            <div class="spacerBarThin"></div>
            <table id="serverStatusTable">
                <tr>
                    <th>SW Version</th>
                    <th>Clients</th>
                    <th>Cpu Load</th>
                    <th>Memory Usage</th>
                    <th>Date</th>
                    <th>Uptime</th>
                </tr>
                <tr>
                    <td id="serverStatusVersion"></td>
                    <td id="serverStatusNumClients"></td>
                    <td id="serverStatusCpuLoad"></td>
                    <td id="serverStatusMemUsage"></td>
                    <td id="serverStatusDate"></td>
                    <td id="serverStatusUptime"></td>
                </tr>
            </table>
        </div>

        <div class="spacerBarThin"></div>

        <div class="section">
            <input type="button" value="Network Settings" id="NetworkSettingsButton"/>
            <input type="button" value="Software Upgrade" id="SoftwareUpdateButton"/>
            <input type="button" value="LNB Settings" id="LNBSettingsButton"/>
            <input type="button" value="Diagnostic" id="DiagnosticButton"/>
            <input type="button" value="System Status" id="SystemStatusButton"/>
            <input type="button" value="UPnP Settings" id="UpnpSettingsButton"/>
            <input type="button" value="Administration" id="AdministrationButton"/>
        </div>
        <div id="currentPage"></div>
    </div>
</div>

</body>
</html>


Über Burp habe ich ferner rausgefunden, dass es auch eine direkte Abfrage mit anschließender XML Ausgabe gibt in der die von mir gewünschten Daten liegen:

/remoteCall?name=WebUi::Status

Request:
POST /remoteCall?name=WebUi::status HTTP/1.1
Host: 10.0.81.16
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: application/xml, text/xml, */*; q=0.01
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Referer: http://10.0.81.16/main.html
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 0


Response:
<?xml version="1.0"?>
<Status>
  <Server>
    <Version>0.5.12</Version>
    <Clients>0</Clients>
    <CpuLoad>10</CpuLoad>
    <MemoryUsage>7466KB</MemoryUsage>
    <UpTime>00:00:53</UpTime>
</Status>
[code]


Nach meinen Verständnis müsste ich jetzt mit HTTPMOD mit der /login?id=md5hash URL an den TV Server herantreten und im zweiten Step die URL für den Status aufrufen /remoteCall?name=WebUi::Status und per Regex die Rückgabe auswerten, aber wie hat dies in HTTPMOD auszuschauen?

Greetz
Eldrik

StefanStrobel

Hallo Eldrik,

Das sieht so aus, als ob Dein Gerät gar keine Session-Id verwenden würde. Oder waren in der ersten Response auf den Login-Request noch andere Header drin?

Was kommt denn für eine Response wenn Du den Post auf /remoteCall?name=WebUi::status ohne vorherigen Login ausführst?

Wenn sich Dein Gerät per Login einfach nur eine Liste authentisierter IP Adressen merkt, dann reicht es wohl aus, den Login-Request mit dem richtigen Hash einmal hinzuschicken und danach kann man andere Daten ohne Session-Id o.ä. senden.

HTTPMOD braucht eine ReAuthRegex, an der es erkennen kann, dass ein Login nötig ist. Schick einfach mal den remoteCall Post ohne vorheriges Login. Da sollte eine Fehlermeldung oder eine Meldung mit "Authentication required" oder ähnlich kommen. Dann schreibst Du eine Regex, die auf diese Fehlermeldung matcht.

Wenn beim Ergebnis einer Daten-Abfrage die ReauthRegex matcht, wird HTTPMOD der Reihe nach die Anmelde-Requests ausführen, die mit den sid-Attributen definiert sind.
In Deinem Fall könnte ein Attribut mit sid1URL schon ausreichen, wenn für den Anmelderequest wirklich keine weiteren Header und Daten nötig sind. Sonst kommen noch sid1Header und sid1Data hinzu.
Das ist das was ich im Wiki als Multi Step Login Prozedur versucht habe zu beschreiben. Wenn es komplizierter wird kann man nach sid1URL auch sid2URL etc. angeben und HTTPMOD führt die Requests der Reihe nach aus. Meist wird dann in einer Antwort vom Server ein Cookie gesetzt. Das kann man dann mit sid1IDRegex extrahieren...

Gruß
    Stefan

eldrik

Hi,

wenn ich den remoteCall ohne vorherige Anmeldung absende erhalte ich als Response:

HTTP/1.1 302 FOUND
Location:/public/login.html
Content-Length: 0


Andere Header kamen mir nicht unter..

Demnach müsste es so aussehen?

reAuthRegex 302
sid1URL http://10.0.81.16/login?id=md5hash

Könntest du mir vl. ne Auflistung der notwendigen Attribute niederschreiben? Die ganzen sid, set, readings Möglichkeiten bekomme ich irgendwie nicht geordnet...

Greetz
Eldrik

StefanStrobel

Hi Eldrik,

Ich würde eine etwas längere Regex nehmen, sonst matcht das auch wenn mal 302 im Text vorkommt. sonst sieht es aber gut aus. Könnte so schon klappen.
Hast Du es schon getestet?

Gruss
    Stefan

eldrik

Hi,

nein leider nicht...

Folgendes erhalte ich bei Verbose 5

2015.03.16 06:51:36.297 4: HttpUtils url=http://10.0.81.16/remoteCall?name=WebUi::status
2015.03.16 06:51:36.305 3: satip_client_status: read callback: request type was Update, no headers, buffer empty,
Error http://10.0.81.16/remoteCall?name=WebUi::status: empty answer received
2015.03.16 06:51:43.724 5: satip_client_status: set called with ?
2015.03.16 06:51:46.656 5: satip_client_status: set called with ?
2015.03.16 06:52:36.298 4: satip_client_status: GetUpdate called
2015.03.16 06:52:36.298 5: satip_client_status: AddToQueue called, initial send queue length : 0
2015.03.16 06:52:36.298 5: satip_client_status: AddToQueue adds type Update to URL http://10.0.81.16/remoteCall?name=WebUi::status, data , header
2015.03.16 06:52:36.298 5: satip_client_status: handle send queue called, qlen = 1
2015.03.16 06:52:36.299 4: satip_client_status: HandleSendQueue sends request type Update to URL http://10.0.81.16/remoteCall?name=WebUi::status, data , header , timeou 2
2015.03.16 06:52:36.299 4: HttpUtils url=http://10.0.81.16/remoteCall?name=WebUi::status
2015.03.16 06:52:36.307 3: satip_client_status: read callback: request type was Update, no headers, buffer empty,
Error http://10.0.81.16/remoteCall?name=WebUi::status: empty answer received


Ein list liefert:

Internals:
   BUSY       0
   DEF        http://10.0.81.16/remoteCall?name=WebUi::status 60
   HTTPHEADER
   Interval   60
   LASTSEND   1426485216.29962
   MainURL    http://10.0.81.16/remoteCall?name=WebUi::status
   NAME       satip_client_status
   NR         769
   STATE      ???
   TYPE       HTTPMOD
   addr       http://10.0.81.16:80
   buf
   conn
   data
   displayurl http://10.0.81.16/remoteCall?name=WebUi::status
   header
   host       10.0.81.16
   httpheader
   ignoreredirects 0
   loglevel   4
   path       /remoteCall?name=WebUi::status
   protocol   http
   redirects  0
   timeout    2
   url        http://10.0.81.16/remoteCall?name=WebUi::status
   QUEUE:
   Readings:
   Request:
     data
     header
     ignoreredirects 0
     retryCount 0
     type       Update
     url        http://10.0.81.16/remoteCall?name=WebUi::status
   Helper:
     Bm:
       Httpmod_attr:
         cnt        8
         dmx        0
         mAr
         max        0
         tot        0
       Httpmod_define:
         cnt        1
         dmx        0
         mAr
         max        0
         tot        0
       Httpmod_set:
         cnt        28
         dmx        0
         mAr
         max        0
         tot        0
Attributes:
   disable    0
   reAuthRegex 302
   sid1URL    http://10.0.81.16/login?id=md5hash
   verbose    5


Greetz
Eldrik

StefanStrobel

Hallo Eldrik,

Offenbar bekommst Du eine komplett leere Antwort vom Gerät. Daher kann auch nichts matchen.
Probier doch mal das Attribut noShutdown. Bei einigen Servern, die genau so ein Problem haben, ist das die Lösung.

Gruß
   Stefan