Hallo zusammen,
vor ein paar Tagen hat der Betreiber des online-Monitorings meiner PV-Anlage mit Batteriespeicher die Seite im größeren Stile geändert.
Auch das login-Prozedere wurde dabei umgestellt (JSON -> HTML oder so).
Seit dem funktioniert das Abholen der aktuellen Monitoring-Werte per HTTPMOD nicht mehr.
Zuvor klappte es mit einem HTTPMOD-Device mit folgenden Atrributen (für den login):
sid1Data, sid1Header1, sid1Header2, sid1URL, reAuthRegex, extractAllJSON
In sid1Data steckten die Angaben für user und Passwort, in sid1URL stand der link zur Login-seite.
Per reAuthRegex wurde dann der login durchgeführt, und mit extractAllJSON wurden dann die entsprechenden Readings angelegt und kontinuierlich aktualisiert.
Folgendes habe ich bereits über die Entwickler-Werkzeuge im Firefox herausgefunden (mit burp kann ich die Seite aus irgendwelchen Gründen nicht aufrufen):
"Hauptlink": https://mein-senec.de
Die gewünschten Daten stecken nun hier: https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
Der "login-Durchlauf" sieht so aus:
Nach Eingabe der login-Daten wird diese Unterseite aufgerufen: https://mein-senec.de/endkunde/auth/authenticate
Dort erscheinen dann unter Parameter die login-Daten als Formulardaten in dieser Form: username=email@email.de&passwort=geheim bzw. wie im beigefügten screenshot
Dann werden diverse scripte und andere Unterseiten verarbeitet, und man gelangt auf die Seite mit den aktuellen Monitoring-Daten, s.o..
Ich habe die einzelnen Seiten, die mir dabei aufgefallen sind, mit den jeweiligen Daten der Kopfzeilen, Cookies, Parameter und Antworten aus den Firefox-Entwicklerwerkzeugen mal als zip-Datei beigefügt, da es sehr viele screenshots geworden sind.
Dabei folgende Nummerierung der Seiten in den screenshots:
Nr. Unterseite
1 authenticate
2 /endkunde/
3 getEndkunde
4 getAnlage?anlageNummer=0
5 getstatusoverview.php?anlageNummer=0
Ich habe zur Zeit leider keinen Plan, wie ich nun ein entsprechendes HTTPMOD-Device aufbauen muss, um wieder an die Daten zu kommen, bzw. ich weiß nicht, ob es überhaupt noch per HTTPMOD funktioniert.
Ein einfaches Austauschen der login-Daten und URLs im "alten" HTTPMOD-Device bringt keinen Erfolg.
So, ich hoffe, ich habe jetzt nicht zuviel Verwirrung gestiftet, und vielleicht kann ja jemand helfen oder mir ein paar Tipps dazu geben.
Vielen Dank schonmal!
Gruß
Andreas
Moin,
dies habe ich noch zusätzlich herausgefunden:
Beim ersten Aufruf der homepage erhält man beim login von der Unterseite "https://mein-senec.de/auth/authenticate" folgendes als Antworttext in den Entwicklertools des browsers:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" type="image/vnd.microsoft.icon"
href="/VAADIN/themes/meinsenec/favicon.ico"/>
<link rel="icon" type="image/vnd.microsoft.icon" href="/VAADIN/themes/meinsenec/favicon.ico"/>
<link rel="stylesheet" href="/VAADIN/themes/meinsenec/styles.css" type="text/css">
<base href="">
<title>Login Portal</title>
</head>
<body>
<script type="text/javascript">
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "/endkunde/auth/authenticate");
var usernameField = document.createElement("input");
usernameField.setAttribute("type", "hidden");
usernameField.setAttribute("name", "username");
usernameField.setAttribute("value", "user@email.de");
form.appendChild(usernameField);
var passwortField = document.createElement("input");
passwortField.setAttribute("type", "hidden");
passwortField.setAttribute("name", "passwort");
passwortField.setAttribute("value", "geheim");
form.appendChild(passwortField);
document.body.appendChild(form);
form.submit();
</script>
<div class="loginform-wrapper">
<div class="title-area">
<div class="logo"></div>
</div>
<div id="loginContainer" class="login-form-area">
TEST
</div>
<div class="title-row">Login Portal</div>
<div class="status-text">
<span>Version 2.0.0-SNAPSHOT-
201703061646</span>
</div>
</div>
</body>
</html>
mit username und passwort.
Vielleicht weiß jemand damit was anzufangen...ich komme leider mit dem login-Prozedere per HTTPMOD noch nicht weiter...
Gruß
Andreas
Hallo.
helfen kann ich leider nicht, jedoch habe ich ein ähnliches Problem. Ich möchte mich auf der https://cloud.vallox.com Seite anmelden und scheitere bei der Übergabe von username und passwort. Laut trace im Browser soll es als username=user@email.de&passwort=yyyy übergeben werden.
Kannst Du mir Deine bisherige Konfiguration mal als Beispiel geben?
sid1Data username=user@email.de&passwort=yyyy
sid1Header1 ???
sid1Header2 ???
sid1URL https://cloud.vallox.com/
reAuthRegex
extractAllJSON <== vallox stellt die Daten auch als json liste dar, was ich über einen curl Aufruf (mit offener session) bereits lesen kann
In der Hoffnung, dass Dein Beispiel bei mir passen könnte :-)
Gruß
Christian
P.S. Am Anfang ist ja sooooo viel zu lernen
FHEM 5.8; Rpi 2b; Jessie
Hi,
klar, hier mein Versuch, aber klappt wie gesagt nicht...
Komme beim login nicht weiter.
Weiß auch nicht genau, ob die Header-Daten passen...
Die gewünschten Daten liegen dort ebenfalls als json-Liste vor.
Gruß
Andreas
DEF
https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0 60
Attribute
enableCookies 1
extractAllJSON 1
reAuthRegex .*
sid1Data username=e@mail.de&passwort=geheim
sid1Header1 Content-Type: text/html
sid1Header2 Accept: */*
sid1URL https://mein-senec.de/auth/authenticate
Hallo Anreas.
viele Dank erst ein mal. Ich hatte es so verstanden, dass eine Verbindung schon mal funktionierte und diese Konfiguration wollte ich dann als Muster für meine Verbindung verwenden.
Bei mir ist es momentan so, dass ich über den Browser ein Login machen kann und anschließend z.B. einen get Request mit curl von der Shell aus machen kann.
Dabei wird die komplette Session Autorisierung von mir kopier und mit keep-alive offen gehalten.
In diesem Zustand kann ich mit get oder post kommunizieren und meine KWL zuhause reagiert auch darauf. Die Daten werden hierbei mit json übertragen und ich kann die modbus Felder mit der Dokumentation entsprechend zuordnen.
Nun versuche ich gerade mit httpmod über das Login hinweg zu kommen. War Dein Beispiel nun das alte, was funktioniert hat oder das neue ohne Funktion?
Viele Grüße
Christian
Hi Christian,
das ist schon das neue, nicht funktionierende.
Das alte habe ich damit überschrieben, so dass ich die kompletten Daten von damals wohl nicht mehr zusammen bekomme...sorry.
Gruß
Andreas
Hi Andreas,
die werden in der fhem.cfg abgelegt und sind dann in Deiner Datensicherung ;-)
Oder in der alten Log Datei, als Du das device eingerichtet hast.
Ansonsten schade, schade, funktionierende Beispiele sind immer Gold wert.
Gruß und Danke
Christian
Ich bin dann jetzt zu https://forum.fhem.de/index.php/topic,45176.msg600969.html#msg600969 (https://forum.fhem.de/index.php/topic,45176.msg600969.html#msg600969) gewechselt. Da steht alles noch umfangreicher und mit Konfiguration
Bei mir sieht es jetzt so aus, funktioniert aber noch nicht.
Einiges wird in das login-Formular schon übertragen, aber dann geht's nicht weiter...siehe Anmerkungen im zweiten code.
Im Moment hab ich auch keine Idee mehr... :-\
Gruß
Andreas
DEF und Attribute
https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0 60
enableCookies 1
extractAllJSON 1
reAuthRegex .*Error.*
sid1Data username=e%40mail.de&passwort=geheim
sid1Header1 Content-Type: application/x-www-form-urlencoded
sid1Header2 Accept: */*
sid1URL https://mein-senec.de/auth/authenticate
im log erscheint dann mit verbose 4
2017.03.07 18:18:29 4: httpmod_senec_neu_login: GetUpdate called (update)
2017.03.07 18:18:29 4: httpmod_senec_neu_login: update timer modified: will call GetUpdate in 60.0 seconds at 2017-03-07 18:19:29
2017.03.07 18:18:29 4: httpmod_senec_neu_login: AddToQueue adds update, initial queue len: 0
2017.03.07 18:18:29 4: httpmod_senec_neu_login: HandleSendQueue sends request type update to URL https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0, No Data,
header: Cookie: JSESSIONID=s-AclKYuW18iyhQK53h_ToFaf4vnQxs_c-4Klex8.application01,
timeout 2
2017.03.07 18:18:29 4: HttpUtils url=https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
2017.03.07 18:18:29 4: https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0: HTTP response code 500
2017.03.07 18:18:29 4: HttpUtils https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0: Got data, length: 1465
2017.03.07 18:18:29 4: httpmod_senec_neu_login: Read callback: request type was update retry 0,
Header: HTTP/1.1 500 Internal Server Error
Date: Tue, 07 Mar 2017 17:18:29 GMT
Server: Apache/2.4.23 (Fedora) OpenSSL/1.0.2j-fips PHP/5.6.29
Content-Type: text/html;charset=UTF-8
Content-Length: 1465
Connection: close,
Body:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" type="image/vnd.microsoft.icon"
href="/endkunde/VAADIN/themes/pip/favicon.ico" />
<link rel="icon" type="image/vnd.microsoft.icon"
href="/endkunde/VAADIN/themes/pip/favicon.ico" />
<link rel="stylesheet"
href="/endkunde/VAADIN/themes/pip/styles.css"
type="text/css">
<base href="/endkunde">
<title>MeinSenec - Fehler</title>
</head>
<body>
<div class="v-Notification error v-Notification-error" style="width: 640px; margin: 200px auto 0px auto;">
<div class="popupContent">
<div class="gwt-HTML">
<h1>Unerwarteter Fehler!</h1>
<div style="font-size: 10px; text-align: left;">
<div>
Fehler: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.senecies.meinsenec.utils.security.AccessDeniedException: Not logged in!
</div>
<div>
Bitte wenden Sie sich an Ihren Administrator und teilen Sie ihm den Fehlercode mit.<br />
Vielen Dank für Ihr Verständnis.
</div>
<div>Klicken Sie <a href="/endkunde">hier</a> um zur Anwendung zurückzugelangen oder
<a href="/endkunde/logout">hier</a> um sich neu anzumelden.
</div>
</div>
</div>
</div>
</div>
</body>
</html>no error
2017.03.07 18:18:29 3: httpmod_senec_neu_login: error while parsing JSON data: malformed JSON string, neither array, object, number, string or atom, at character offset 4 (before "<!DOCTYPE html PUBLI...") at (eval 1618786) line 1.
2017.03.07 18:18:29 4: httpmod_senec_neu_login: CheckAuth decided new authentication required
2017.03.07 18:18:29 4: httpmod_senec_neu_login: Auth called with Steps: 1
2017.03.07 18:18:29 4: httpmod_senec_neu_login: AddToQueue adds auth1, initial queue len: 0, prio
2017.03.07 18:18:29 4: httpmod_senec_neu_login: HandleSendQueue sends request type auth1 to URL https://mein-senec.de/auth/authenticate,
data: username=e%40mail.de&passwort=geheim, <========== die Formulardaten (sid1Data)
header: Content-Type: application/x-www-form-urlencoded
Accept: */*
Cookie: JSESSIONID=s-AclKYuW18iyhQK53h_ToFaf4vnQxs_c-4Klex8.application01,
timeout 2
2017.03.07 18:18:29 4: HttpUtils url=https://mein-senec.de/auth/authenticate
2017.03.07 18:18:29 4: httpmod_senec_neu_login: AddToQueue adds update, initial queue len: 0
2017.03.07 18:18:29 4: httpmod_senec_neu_login: CheckAuth requeued request update after auth, retryCount 0 ...
2017.03.07 18:18:30 4: https://mein-senec.de/auth/authenticate: HTTP response code 200
2017.03.07 18:18:30 4: HttpUtils https://mein-senec.de/auth/authenticate: Got data, length: 1819
2017.03.07 18:18:30 4: httpmod_senec_neu_login: Read callback: request type was auth1 retry 0,
Header: HTTP/1.1 200 OK
Date: Tue, 07 Mar 2017 17:18:30 GMT
Server: WildFly/10
X-Powered-By: Undertow/1
X-Powered-By: JSP/2.3
Set-Cookie: JSESSIONID=ANBSawZD9b6MndGqL7goVMWAsYkLL3Z453Sl0soV.application01; path=/
Content-Type: text/html;charset=UTF-8
Content-Language: en-
Connection: close,
Body:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" type="image/vnd.microsoft.icon"
href="/VAADIN/themes/meinsenec/favicon.ico"/>
<link rel="icon" type="image/vnd.microsoft.icon" href="/VAADIN/themes/meinsenec/favicon.ico"/>
<link rel="stylesheet" href="/VAADIN/themes/meinsenec/styles.css" type="text/css">
<base href="">
<title>Login Portal</title>
</head>
<body>
<script type="text/javascript">
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "/endkunde/auth/authenticate");
var usernameField = document.createElement("input");
usernameField.setAttribute("type", "hidden");
usernameField.setAttribute("name", "username");
usernameField.setAttribute("value", "e@mail.de"); <========== wurde korrekt eingefügt
form.appendChild(usernameField);
var passwortField = document.createElement("input");
passwortField.setAttribute("type", "hidden");
passwortField.setAttribute("name", "passwort");
passwortField.setAttribute("value", "geheim"); <========== wurde korrekt eingefügt
form.appendChild(passwortField);
document.body.appendChild(form);
form.submit();
</script>
<div class="loginform-wrapper">
<div class="title-area">
<div class="logo"></div>
</div>
<div id="loginContainer" class="login-form-area">
TEST
</div>
<div class="title-row">Login Portal</div>
<div class="status-text">
<span>Version 2.0.0-SNAPSHOT-
201703061646</span>
</div>
</div>
</body>
</html>no error
2017.03.07 18:18:30 3: httpmod_senec_neu_login: error while parsing JSON data: malformed JSON string, neither array, object, number, string or atom, at character offset 5 (before "<!DOCTYPE html PUBLI...") at (eval 1618788) line 1.
2017.03.07 18:18:30 4: httpmod_senec_neu_login: Cookie: JSESSIONID Wert ANBSawZD9b6MndGqL7goVMWAsYkLL3Z453Sl0soV.application01 Rest path=/
2017.03.07 18:18:30 4: httpmod_senec_neu_login: HandleSendQueue sends request type update to URL https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0, No Data,
header: Cookie: JSESSIONID=ANBSawZD9b6MndGqL7goVMWAsYkLL3Z453Sl0soV.application01,
timeout 2
2017.03.07 18:18:30 4: HttpUtils url=https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
2017.03.07 18:18:31 4: https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0: HTTP response code 500
2017.03.07 18:18:31 4: HttpUtils https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0: Got data, length: 1465
2017.03.07 18:18:31 4: httpmod_senec_neu_login: Read callback: request type was update retry 1,
Header: HTTP/1.1 500 Internal Server Error
Date: Tue, 07 Mar 2017 17:18:31 GMT
Server: Apache/2.4.23 (Fedora) OpenSSL/1.0.2j-fips PHP/5.6.29
Set-Cookie: JSESSIONID=m3KBbjI7w1lReX2JW7XppvYXgmt--zik5d6BnBrt.application01; path=/endkunde; HttpOnly
Content-Type: text/html;charset=UTF-8
Content-Length: 1465
Connection: close,
Body:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" type="image/vnd.microsoft.icon"
href="/endkunde/VAADIN/themes/pip/favicon.ico" />
<link rel="icon" type="image/vnd.microsoft.icon"
href="/endkunde/VAADIN/themes/pip/favicon.ico" />
<link rel="stylesheet"
href="/endkunde/VAADIN/themes/pip/styles.css"
type="text/css">
<base href="/endkunde">
<title>MeinSenec - Fehler</title>
</head>
<body>
<div class="v-Notification error v-Notification-error" style="width: 640px; margin: 200px auto 0px auto;">
<div class="popupContent">
<div class="gwt-HTML">
<h1>Unerwarteter Fehler!</h1>
<div style="font-size: 10px; text-align: left;">
<div>
Fehler: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.senecies.meinsenec.utils.security.AccessDeniedException: Not logged in!
</div>
<div>
Bitte wenden Sie sich an Ihren Administrator und teilen Sie ihm den Fehlercode mit.<br />
Vielen Dank für Ihr Verständnis.
</div>
<div>Klicken Sie <a href="/endkunde">hier</a> um zur Anwendung zurückzugelangen oder
<a href="/endkunde/logout">hier</a> um sich neu anzumelden.
</div>
</div>
</div>
</div>
</div>
</body>
</html>no error
2017.03.07 18:18:31 3: httpmod_senec_neu_login: error while parsing JSON data: malformed JSON string, neither array, object, number, string or atom, at character offset 4 (before "<!DOCTYPE html PUBLI...") at (eval 1618790) line 1.
2017.03.07 18:18:31 4: httpmod_senec_neu_login: Cookie: JSESSIONID Wert m3KBbjI7w1lReX2JW7XppvYXgmt--zik5d6BnBrt.application01 Rest path=/endkunde; HttpOnly
2017.03.07 18:18:31 4: httpmod_senec_neu_login: CheckAuth decided new authentication required
2017.03.07 18:18:31 4: httpmod_senec_neu_login: Authentication still required but no retries left - did last authentication fail?
2017.03.07 18:18:31 3: httpmod_senec_neu_login: no parsed JSON structure available
2017.03.07 18:18:31 3: httpmod_senec_neu_login: Read response to update didn't match any Reading
Hmm,
wir hängen an einer ähnlichen Stelle. Nur bei Dir steht Du sollst den Administrator anrufen :-) Haste das schon gemacht?
Im Forum steht zu diesem Thema auch recht wenig und ich kann die Attribute von httpmod noch nicht in Gänze interpretieren.
In der Doku sollte der Bereich Login mit noch mehr Beispielen, oder einem Link zur wiki aufgepeppt werden. Ich denke einige unserer Mitstreiter haben sicherlich schon verschiedene Anmeldungen hinbekommen. Also los......wir brauchen Hilfe.
Ich werde noch im hausinternen Lan einen zweiten Anlauf direkt zu meiner KWL machen. Da läuft es etwas einfacher ohne login Seite. Letztendlich wird mein Rpi2 mit FHEM ja auch lokal laufen.
Einen schönen Abend noch
Christian
Hallo Vize,
Du musst versuchen die Kommunikation zwischen Browser und Server exakt nachzubilden. Da kommt es auf jedes Detail bzw. Zeichen an.
Wenn also beispielsweise der Browser einen Post-Request an den Server sendet, in dem folgendes steht:
username:"ich"
password:"geheim"
dann hilft es Dir nicht weiter das als username=email@email.de&passwort=geheim zu senden. Der Server wird das ziemlich sicher nicht akzeptieren. Sowohl der Zeilenumbruch als auch die Anführungszeichen können entscheidend sein.
Zudem kann jede Header-Zeile wichtig sein. Insbesondere wenn Cookies gesetzt werden, musst Du diese auch in Deiner HTTPMOD-Konfiguration berücksichtigen. Du könntest es mit dem automatischen Cookie-Handling versuchen. Für eine einfache JSESSIONID sollte das klappen. Wenn Du aber gar keine Cookies sendest, kann es nicht klappen. Das ist kein Problem von HTTPMOD sondern von der Server-Applikation ...
Generell würde ich das schrittweise mit der Burp-Suite angehen.
Zuerst alles aufzeichnen und dann schrittweise über den Burp-Repeater versuchen die Requests zu vereinfachen und manuell zu senden. So kannst Du herausfinden in welchen Schritten die Login-Prozedur ablaufen muss und welche Header / Daten tatsächlich wichtig sind.
Gruss / viel Glück
Stefan
Hallo Stefan,
danke für die Antwort und die Tipps.
Im meinem letzten post sieht man im log-Auszug, dass die Formulardaten zum user und passwort schonmal richtig übergebn wurden, oder?
(ist mit <========== in der jeweilgen Zeile gekennzeichnet)
Dann geht es aber nicht weiter...
Zum Post Request:
In burp steht in den Rohdaten zum login dieses
username=e%40mail.de&passwort=geheim
Muss ich diese Daten denn dann nicht auch genauso mitgeben und nicht als
username="email"
passwort="geheim"
?
Was meinst du mit dem Satz "über den Burp-Repeater versuchen die Requests zu vereinfachen und manuell zu senden".
Wie gehe ich das an?
Sorry, aber ich komme so langsam an meine Grenzen und auch durcheinander... :-[
Hier noch Request und Response der login-Seite aus burp:
Request
POST /auth/authenticate HTTP/1.1
Host: mein-senec.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.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, br
Referer: https://mein-senec.de/
Cookie: JSESSIONID=s1y1rmNWDS4crro0goJneGeXd0wTh72juERZ4tO2.application01
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 56
username=e%40mail.de&passwort=geheim
Response
HTTP/1.1 200 OK
Date: Tue, 07 Mar 2017 16:21:03 GMT
Server: WildFly/10
X-Powered-By: Undertow/1
X-Powered-By: JSP/2.3
Content-Type: text/html;charset=UTF-8
Content-Language: de-
Connection: close
Content-Length: 1819
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" type="image/vnd.microsoft.icon"
href="/VAADIN/themes/meinsenec/favicon.ico"/>
<link rel="icon" type="image/vnd.microsoft.icon" href="/VAADIN/themes/meinsenec/favicon.ico"/>
<link rel="stylesheet" href="/VAADIN/themes/meinsenec/styles.css" type="text/css">
<base href="">
<title>Login Portal</title>
</head>
<body>
<script type="text/javascript">
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "/endkunde/auth/authenticate");
var usernameField = document.createElement("input");
usernameField.setAttribute("type", "hidden");
usernameField.setAttribute("name", "username");
usernameField.setAttribute("value", "e@mail.de");
form.appendChild(usernameField);
var passwortField = document.createElement("input");
passwortField.setAttribute("type", "hidden");
passwortField.setAttribute("name", "passwort");
passwortField.setAttribute("value", "geheim");
form.appendChild(passwortField);
document.body.appendChild(form);
form.submit();
</script>
<div class="loginform-wrapper">
<div class="title-area">
<div class="logo"></div>
</div>
<div id="loginContainer" class="login-form-area">
TEST
</div>
<div class="title-row">Login Portal</div>
<div class="status-text">
<span>Version 2.0.0-SNAPSHOT-
201703061646</span>
</div>
</div>
</body>
</html>
Kannst du noch weiterhelfen?
Gruß
Andreas
Hallo Andreas,
Bitte versuch den kompletten Ablauf des Logins von der ersten Seite, die die erste Session-Id setzt, bis zur Seite mit den gesuchten Daten in Burp mitzuschneiden.
In Deinen bisherigen Screenshots und Logs sehe ich nur einen Teil und die Screenshots sind aus dem Firefox (zumindest für mich) nicht besonders hilfreich.
Eventuell muss erst mal eine erste Session-ID gesetzt werden und es klappt nicht weil Du sofort auf die authenticate-Seite einsteigst.
Im Log sieht es so aus als ob Du die Login-Daten an /auth/authenticate schickst.
Als Antwort scheint dann aber wieder nur ein Login-Portal zu kommen, in dem Deine Daten als versteckte Variable drinstecken. Wie geht es denn weiter wenn Du Dich im Browser erfolgreich anmeldest? Wo kommt der Verweis oder Redirect auf die eigentliche Daten-Seite?
Ich teste solche Dinge immer erst mal in der Burp Suite durch. Wenn man die Aufzeichnung gemacht hat, kann man einzelne Requests an den "Repeater" von Burp senden (ich glaube das war mit rechte Maustaste auf dem Request). Im Repeater kann man dann den Request nochmals absenden. Das Ergebnis (z.B. eine neue Session-Id) kann man dann in den nächsten Request im Repeater reinkopieren und auch den nochmal absenden. Wenn das alles klappt, kommen am Ende der Sequenz die gewünschten Daten raus.
Da Du in HTTPMOD aber nicht alle Header definieren möchtest, kannst Du dann in der Burp-Suite versuchen einzelne Header wegzulassen. Wenn die Schritte der Reihe nach immer noch zum Ergebnis führen, dann waren die Header offensichtlich überflüssig...
So findest Du heraus, ob Referer oder User-Agent im Request benötigt werden. In Deiner bisherigen Konfiguration hast Du ja nur sid1Header1 Content-Type: application/x-www-form-urlencoded
sid1Header2 Accept: */*
das könnte zu wenig sein. In Deinen Screenshot sind deutlich mehr Header ...
Wenn in Burp username=e%40mail.de&passwort=geheim stand, dann wird das stimmen. In Deinen Sreenshots sah das anders aus. Deshalb verwende ich lieber die Burp-Suite.
Gruss
Stefan
Hi Stefan,
danke nochmal für deine Antwort...und vor allem für deine Geduld mit mir... :-[
Ich werde mir das Ganze nochmal Schritt für Schritt mit burp vornehmen.
Ich werde aber wahrscheinlich nicht schlau daraus, was davon alles in die HTTPMOD-Attribute rein muss...
Werde dann mal den Mitschnitt hier einstellen...
EDIT: Hier schonmal ein screenshot aus burp mit der "Verzeichnisstruktur".
Wie gesagt, die Daten liegen als JSON-Tabelle hier:
https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
VG
Andreas
Guten Abend,
leider hatte ich noch keine Zeit, mich nochmal ausführlich mit burp zu beschäftigen.
Was ich aber noch gesehen habe:
Auf der Hauptseite https://mein-senec.de wird bereits ein Cookie (session id) gesetzt, aber nicht mit Set-Cookie, wahrscheinlich per (Java)script.
Siehe screenshot 1.
Das wird dann mitgenommen auf die Unterseite /endkunde/auth/authenticate, die 1 im screenshot zwei, und dort wird per Set-Cookie ein weiteres Cookie (session id) gesetzt, die 2 im screenshot 2.
Komisch ist, dass diese Seite beim ersten login nicht das "endkunde" im Pfad hat... :o
Diese Cookies werden dann in die anderen Unterseiten mitgenommen.
Siehe screenshot 3.
Auch in die Unterseite mit den gewünschten Daten.
Siehe screenshot 4.
Vielleicht liegt das an diesen cookies, dass der login (noch) nicht klappt?
@Stefan
Ich habe mir auch schon deinen post hier angeschaut: https://forum.fhem.de/index.php/topic,56455.msg479909.html#msg479909
Das scheint ja ähnlich zu sein.
Daraus werde ich aber leider nicht ganz schlau, ob und wie ich das in meinem Fall umsetzen kann... :-[
Bekomme es nicht auf die Kette...
Ich brauche wohl doch nochmal Hilfe...
Danke!
Gruß
Andreas
Hallo Andreas,
der erste Schritt bleibt eine genaue Analyse der Kommunikation - am besten mit Burp ...
Erst wenn wir die Kommunikation zwischen Browser und Server verstanden haben, können wir das mit HTTPMOD nachbauen.
Gruss
Stefan
OK,
sobald Zeit da ist, werde ich das machen.
Soll ich die (Roh)Daten aus burp dann einfach hier posten, oder wie kommen wir am besten weiter?
Dank und Gruß
Andreas
So,
anbei mal eine Textdatei mit allen Rohdaten aus burp vom Aufruf der homepage über login bis zur Seite mit den Daten.
Die einzelnen Seiten habe ich jeweils mit =========================== getrennt.
Kann man nun daraus einen Ansatz für entsprechendes HTTPMOD-Device ableiten?
Bin für jede Hilfe dankbar...
Gruß
Andreas
Hallo Andreas,
Vielen Dank für den Mtschnitt. Das sieht doch gleich viel brauchbarer aus.
Ich fürchte aber, Du hast einen Request zwischendrin vergessen.
Es müsste noch ein Post auf /endkunde/auth/authenticate erfolgt sein. Den habe ich in Deinem File nicht gefunden.
Gruß / Thanx
Stefan
Hallo Stefan,
jau, hast wohl recht...
Liefere ich heute Abend nach.
Gruß
Andreas
Ahoi,
so, den Post auf /endkunde/auth/authenticate habe ich entsprechend in der Datei ergänzt und diese nochmal angehängt.
Jetzt bin ich gespannt, was daraus gebaut werden kann... :-[
Danke schonmal/nochmal!!!
Gruß
Andreas
Also ...
Der Mitschnitt ist jetzt leider etwas inkonsistent - zumindest passen die Cookies nicht mehr zueinander, da Du einen Teil am Sonntag und einen Teil am Montag aufgezeichnet hast. Ich würde es aber mal so zusammenfassen:
Für die Anmeldung macht man zunächst einen GET Request auf
/
In der Response auf den ersten Request wird das Cookie JSESSIONID mit dem Wert VelYNe6v_HUcGAas73kelwHIFYuNDJpYjjMpuNGT.application01
und der Option path=/
gesetzt und ein Login-Formular angeboten.
Der Anwender füllt das aus und beim Abschicken geht ein zweiter Request als POST an
/auth/authenticate
Darin steht in den POST-Daten
username=email%40email.de&passwort=geheim
im Header wird das vorher vom Server gesetzte Cookie natürlich auch mitgeschickt.
Die Antwort auf den zweiten Request enthält die eingegebenen Login-Daten im Javascript Code und per Javascript wird das ganze gleich wieder per POST als dritter Request an die nächste URL geschickt:
/endkunde/auth/authenticate
Auch hier ist das gesetzte erste Cookie natürlich wieder mit drin.
In den Daten steht nochmal
username=email%40email.de&passwort=geheim
Die Antwort auf den dritten Request ist die Bestätigung des Logins. Sie setzt das Cookie JSESSIONID neu, diesmal mit dem Wert 10xvITNZrHRtu63K1Rq-gjaao9MKvWuDTh-vBvAf.application01
und den Optionen path=/endkunde
und
HttpOnly
inhaltlich ist die Antwort ein Redirect auf
/endkunde
Die folgenden Requests lesen dann die Daten und schicken dabei beide Cookies mit.
Wenn man es exakt so mit HTTPMOD umsetzen möchte, muss also die Haupt-URL auf die Seite mit den Daten zeigen, also zum Beispiel
/endkunde/api/status/getstatusoverview.php?anlageNummer=0
Für das Login müssen drei Schritte definiert werden.
Zuerst ein Request auf /
dann einer auf
/auth/authenticate
dann auf
/endkunde/auth/authenticate
eventuell ist der mittlere Request überflüssig. Das müsste man ausprobieren.
dabei müssen die Cookies berücksichtigt werden. Normalerweise kann HTTPMOD das automatisch wenn Cookie-Handling aktiviert ist. Hier könnte es aber sein, dass es nicht klappt, da JSESSIONID gleich zweimal mit verschiedenen Path-Optionen verwendet wird. Möglicherweise ist das aber auch nicht schlimm und nur das zweite Cookie ist relevant.
Zudem müsste man noch testen, welche Header tatsächlich benötigt werden.
Also sind folgende Attribute nötig:
sid01URL
sid01Header
sid02URL
sid02Header
sid02Data
sid03URL
sid03Header
sid03Data
wenn alles klappt, sollte HTTPMOD die Haupt-URL mit den Daten abrufen können.
Wenn Du es zunächst in Burp probieren möchtest, kannst Du die einzelnen Requests im Burp-Repeater neu auslösen, aus der Response das Cookie kopieren und in den nächsten Request einfügen und dann diesen ausführen. Nach dem dritten Request sollte die Response das für den Abruf der Daten gültige Session-Cooke mit Pfad-Option /enkunde enthalten.
Im Burp Repeater kannst Du dann auch immer wieder eine Header-zeile entfernen und testen ob der Request noch zu einer gültigen Antwort führt, oder ob ein Fehler vom Server kommt. So findest Du am einfachsten heraus, welche Header-Zeilen überflüssig sind.
Wenn Du es nicht mit Burp probieren möchtest, solltest Du lieber ein paar Header mehr mitschicken als zu wenige, also z.B.
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: application/json, text/plain, */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://mein-senec.de/endkunde/
If-Modified-Since: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache
Pragma: no-cache
bei mehreren Header-Zeilen musst Du die jeweils als sid01Header1, sid01Header2, sid01Header3 und dann beim nächsten Request als sid02Header1 etc. angeben.
Mit enableCookies 1 kümmert sich HTTPMOD selbst um die Cookie-Header, sofern JSESSIONID nicht tatsächlich zwei mal benötigt wird. Glaube ich aber eigentlich nicht.
Vermutlich brauchst Du die meisten Header gar nicht, aber das muss man eben ausprobieren.
Probier es doch mal, poste die komplette Konfig und das Ergebnis bzw. den relevanten Auszug aus dem Log mit Verbose 5.
Gruss
Stefan
Hallo Stefan,
super, vielen Dank für die ausführliche Antwort.
Eine konkrete Frage habe ich aber erstmal noch.
Ist in deiner Beschreibung sid01URL die Hauptseite, also /, oder geht es bei /auth/authenticate los?
Gruß
Andreas
Ich würde zunächst mal versuchen sid01URL auf / zu setzen, damit beim nächsten Request schon eine erste SessionID vorhanden ist. Wenn es mal funktioniert kann man immer noch versuchen es zu vereinfachen...
Gruß
Stefan
Hab gerade mal versucht den GET Request manuell in burp zur Hauptseite abzusetzen.
Im Repeater muss ja auch ein Port angegeben werden. Aus meinen alten screenshots habe ich entnommen, dass es wohl Port 443 ist.
Wenn ich nun dieses in burp auf https://mein-senec.de:443 abschicke:
GET / HTTP/1.1
Host: mein-senec.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.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, br
Upgrade-Insecure-Requests: 1
Connection: close
erhalte ich als Antwort:
HTTP/1.1 408 Request Timeout
Date: Tue, 14 Mar 2017 20:23:50 GMT
Server: Apache/2.4.23 (Fedora) OpenSSL/1.0.2j-fips PHP/5.6.29
Content-Length: 221
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>408 Request Timeout</title>
</head><body>
<h1>Request Timeout</h1>
<p>Server timeout waiting for the HTTP request from the client.</p>
</body></html>
Will sagen, ich scheitere schon am Anfang...
Gruß
Andreas
Hallo Stefan,
anbei ein erster Versuch mit "minimalen" Headern...leider erfolglos. :-\
Einmal Log-Auszug mit verbose 5 und ein list des Devices.
Kannst du daraus erkennen, ob es mit fehlenden Headern zu tun hat, oder hast du noch weitere Tipps?
Gruß
Andreas
Hallo Andreas,
zum Absenden von Requests in Burp:
Ich würde den Request zuerst aufzeichnen und dann im History-Fenster mit einem rechten Mausklick und "Send to repeater" den Request in den Repeater schicken. Da musst Du keine Ports definieren und es muss eigentlich auch funktionieren. Allerdings müssen die Cookie-Werte zu diesem Zeitpunkt gültig sein. Du musst also die Requests in der richtigen Reihenfolge senden und die Werte passend ändern...
Zu Deinem Versuch mit HTTPMOD:
es scheitert hier:
2017.03.15 18:23:29 4: HttpUtils url=https://mein-senec.de/endkunde/auth/authenticate
2017.03.15 18:23:30 4: https://mein-senec.de/endkunde/auth/authenticate: HTTP response code 302
2017.03.15 18:23:30 4: HttpUtils https://mein-senec.de/endkunde/auth/authenticate: Redirect to https://mein-senec.de/endkunde/
2017.03.15 18:23:30 4: HttpUtils url=https://mein-senec.de/endkunde/
2017.03.15 18:23:30 4: https://mein-senec.de/endkunde/: HTTP response code 302
2017.03.15 18:23:30 4: HttpUtils https://mein-senec.de/endkunde/: Redirect to https://mein-senec.de/endkunde/auth/login
2017.03.15 18:23:30 4: HttpUtils url=https://mein-senec.de/endkunde/auth/login
Die Antwort auf den Request an https://mein-senec.de/endkunde/auth/authenticate ist ein Redirect. Darin steht aber das gültige Session-Cookie. Ohne zusätzliche Anweisungen folgt aber HttpUtils gleich dem Redirect und so hat HTTPMOD keine Chance das neue Cookie zu extrahieren. Die Lösung ist ein attr sid3IgnoreRedirects 1 (Siehe Doku / Wiki). Dann solltest Du einen Schritt weiter kommen.
Gruss
Stefan
Hallo Stefan,
danke für den weiteren Tipp!
Ich glaube, ich bin auch schon etwas schlauer geworden bzw. habe noch etwas herausgefunden...
Das mit dem Repeater in burp hat jetzt soweit geklappt.
Nach ein paar Versuchen konnte ich die Prozedur auf folgendes eindampfen:
Diese Requests werden benötigt:
GET auf / -> dort wird im Response cookie 1 gesetzt/erzeugt
POST auf /endkunde/auth/authenticate -> dort wird cookie 2 gesetzt/erzeugt
BEIDE Cookies müssen nun mitgenommen werden
GET auf /endkunde/
Danach Aufruf der Seite mit den Daten.
Ein Minimieren der Header habe ich noch nicht getestet...
Hilft das noch weiter, bzw. gibt das neuen Aufschluss für dich?
IgnoreRedirects teste ich mal.
Danke!
Gruß
Andreas
Ich werd bekloppt...der geht!!!!
Der Tipp mit IgnoreRedirects war der Jackpot.
Vielen, vielen Dank Stefan!
Hier nun ein list des funktionierenden Devices:
Internals:
BUSY 0
CFGFN
DEF https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0 300
HTTPCookies JSESSIONID=eOnp8eyUzAKLy1e9C4tMxZ7hv2sePRQU8qRNHhim.application01
Interval 300
JSONEnabled 1
LASTSEND 1489697931.9306
LastAuthTry 2017-03-16 21:58:48
MainURL https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
ModuleVersion 3.3.5 - 29.9.2016
NAME httpmod_senec_neu_login
NR 117009
STATE 16
TRIGGERTIME 1489698228.46336
TRIGGERTIME_FMT 2017-03-16 22:03:48
TYPE HTTPMOD
addr https://mein-senec.de:443
buf
code 200
conn
data
displayurl https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
header Cookie: JSESSIONID=eOnp8eyUzAKLy1e9C4tMxZ7hv2sePRQU8qRNHhim.application01
host mein-senec.de
httpheader HTTP/1.1 200 OK
Date: Thu, 16 Mar 2017 20:58:52 GMT
Server: WildFly/10
Expires: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
X-Powered-By: Undertow/1
X-XSS-Protection: 1; mode=block
Pragma: no-cache
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
Content-Type: application/json;charset=UTF-8
Connection: close
Transfer-Encoding: chunked
httpversion 1.1
hu_blocking 0
hu_filecount 288
hu_portSfx
ignoreredirects 0
loglevel 4
path /endkunde/api/status/getstatusoverview.php?anlageNummer=0
protocol https
redirects 0
timeout 20
url https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
value 0
Httpcookiehash:
Jsessionid:
Options path=/endkunde; HttpOnly
Value eOnp8eyUzAKLy1e9C4tMxZ7hv2sePRQU8qRNHhim.application01
QUEUE:
Readings:
2017-03-16 21:58:52 accuexport_now 0
2017-03-16 21:58:52 accuexport_today 3.6065
2017-03-16 21:58:52 accuimport_now 0.57
2017-03-16 21:58:52 accuimport_today 2.8951
2017-03-16 21:58:52 consumption_now 0.56
2017-03-16 21:58:52 consumption_today 21.2676
2017-03-16 21:58:52 gridexport_now 0.02
2017-03-16 21:58:52 gridexport_today 29.2798
2017-03-16 21:58:52 gridimport_now 0
2017-03-16 21:58:52 gridimport_today 0.7738
2017-03-16 21:58:52 lastupdated 1489697698
2017-03-16 21:58:52 machine MCU
2017-03-16 21:58:52 powergenerated_now 0
2017-03-16 21:58:52 powergenerated_today 47.8423
2017-03-16 21:58:52 readable_state ?com.senecies.meinsenec.senec.model.SteuereinheitState.ENTLADEN?
2017-03-16 21:58:52 state 16
2017-03-16 21:58:52 wartungNotwendig false
Request:
data
header
ignoreredirects 0
retryCount 1
type update
url https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0
value 0
Defptr:
Readingbase:
accuexport_now reading
accuexport_today reading
accuimport_now reading
accuimport_today reading
consumption_now reading
consumption_today reading
errorCode reading
gridexport_now reading
gridexport_today reading
gridimport_now reading
gridimport_today reading
lastupdated reading
machine reading
powergenerated_now reading
powergenerated_today reading
readable_state reading
state reading
wartungNotwendig reading
Readingnum:
accuexport_now
accuexport_today
accuimport_now
accuimport_today
consumption_now
consumption_today
errorCode
gridexport_now
gridexport_today
gridimport_now
gridimport_today
lastupdated
machine
powergenerated_now
powergenerated_today
readable_state
state
wartungNotwendig
Readingoutdated:
Requestreadings:
Update:
accuexport_now reading
accuexport_today reading
accuimport_now reading
accuimport_today reading
consumption_now reading
consumption_today reading
errorCode reading
gridexport_now reading
gridexport_today reading
gridimport_now reading
gridimport_today reading
lastupdated reading
machine reading
powergenerated_now reading
powergenerated_today reading
readable_state reading
state reading
wartungNotwendig reading
Powermap:
Readingsdesc:
Pm_consumption:
rtype w
Pm_energy:
rtype whr
Sslargs:
Attributes:
disable 0
enableCookies 1
extractAllJSON 1
httpVersion 1.1
reAuthRegex .*Error.*
sid1Header1 Content-Type: text/html
sid1Header2 Accept: */*
sid1URL https://mein-senec.de/
sid2Data username=email@email.de&passwort=geheim
sid2Header1 Accept: */*
sid2Header2 Content-Type: application/x-www-form-urlencoded
sid2IgnoreRedirects 1
sid2URL https://mein-senec.de/endkunde/auth/authenticate
sid3Header1 Accept: */*
sid3Header2 Content-Type: text/html
sid3URL https://mein-senec.de/endkunde
timeout 20
userattr sid1Data sid1Header1 sid1Header2 sid1URL sid2Data sid2Header1 sid2Header2 sid2IgnoreRedirects:0,1 sid2URL sid3Data sid3Header1 sid3Header2 sid3URL sid4Header1 sid4Header2 sid4URL
verbose 5
Was für eine Geburt... ;)
Vielen Dank nochmal!
Gruß
Andreas
Moin,
hier dann nochmal (zur besseren Übersicht) die entsprechende Konfiguration des Devices:
DEF:
https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0 300
Attribute:
enableCookies 1
extractAllJSON 1
httpVersion 1.1
reAuthRegex .*Error.*
sid1Header1 Content-Type: text/html
sid1Header2 Accept: */*
sid1URL https://mein-senec.de/
sid2Data username=<email>&passwort=<passwort>
sid2Header1 Accept: */*
sid2Header2 Content-Type: application/x-www-form-urlencoded
sid2IgnoreRedirects 1
sid2URL https://mein-senec.de/endkunde/auth/authenticate
sid3Header1 Accept: */*
sid3Header2 Content-Type: text/html
sid3URL https://mein-senec.de/endkunde
Ob man den ersten Request auf die Hauptseite (sid1XXX) wirklich braucht, weiß ich nicht...Vielleicht braucht man sid3XXX auch nicht...habe ich noch nicht getestet.
EDIT: Habe es mal an einem weiteren Device getestet...es reicht den POST-Request auf https://mein-senec.de/endkunde/auth/authenticate auszuführen. Die Sachen bei sid1XXX und sid3XXX sind nicht nötig. Das Attribut httpVersion braucht man auch nicht.
Viel Spaß!
Andreas
Bei mir funktioniert es auch wieder! Spitzenklasse, ganz vielen Dank für die Arbeit und sorry, dass ich keine Zeit hatte, mit zu helfen!
Ahoi,
nachdem das Device nun so wunderbar (wieder) funktioniert, habe ich noch eine spezielle Zusatzfrage...
Die Readings werden mit extractAllJSON erzeugt.
Darunter befindet sich ein reading zum "Zustand", also ob der Akku gerade beladen, entladen usw. wird.
Auf der Webseite und in burp bzw. den browser-Entwicklertools werden die Daten korrekt dargestellt.
Beispiel siehe screenshots.
Unter buf im HTTPMOD-Device - und somit im reading - steht aber dann das.
"readable_state":"?com.senecies.meinsenec.senec.model.SteuereinheitState.PV_UND_ENTLADEN?"
Hat jemand eine Idee, wie man es hinbekommen kann, dass dieses reading "lesbar" erzeugt wird, also als "PV und Entladen" usw. ?
Was mir noch aufgefallen ist: Rufe ich die Webseite im browser unter linux Ubuntu auf, steht im browser der Status ebenfalls in der "Langversion" wie im reading des HTTPMOD-Devices...
Da FHEM bei mir auf einem RasPi mit Raspbian läuft, könnte es vielleicht damit zusammenhängen?
Im Moment behelfe ich mir mit readingOMap, um das reading entsprechend umzubiegen. Vielleicht gibt es ja eine elegantere Lösung?
Danke schonmal für jegliche Hilfe!
Gruß
Andreas
Für mich klingt das so als ob der Server abhängig vom User-Agent eine andere Antwort liefert.
Das sollte sich mit Burp nachvollziehen lassen. Hängt vermutlich auch nur an einem Header ...
Gruss
Stefan
OK, werde ich mal testen.
Danke für den Tipp!
Gruß
Andreas
Also, wenn ich den User-Agent
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
als getHeader angebe, ändert sich nichts.
Als requestHeader bringt auch nichts...
Burp unter Ubuntu habe ich mir aber noch nicht angeschaut...
Gruß
Andreas
Burp müsste nicht auf einem anderen System laufen.
Wenn Du mit einem Browser unter Windows eine korrekte Antwort bekommst, diesen Request über Burp als Proxy schickst und aufzeichnest und dann die Aufzeichnung in Burp im Repeater nochmals absendest, muss die gleiche korrekte Antwort kommen.
Damit hier nichts schief läuft einfach den aufgezeichneten Request per Rechtsklick an den Repeater senden. Dann muss der absolut gleiche Request auch die gleiche Antwort liefern. Bei dem ersten Request über Burp als Proxy kommt der Request ja auch von Burp...
Dann würde ich den Request nochmal Header für Header mit Deiner vereinfachten Konfiguration vergleichen.
Irgendwo muss ein Unterscheid sein.
Du könntest auch den Browser auf einem Ubuntu-System über den Burp-Proxy auf Deinem Windows-System schicken und das aufzeichnen und mit dem funktionierenden Request vergleichen.
Gruss
Stefan
Hallo Stefan!
ZitatWenn Du mit einem Browser unter Windows eine korrekte Antwort bekommst, diesen Request über Burp als Proxy schickst und aufzeichnest und dann die Aufzeichnung in Burp im Repeater nochmals absendest, muss die gleiche korrekte Antwort kommen.
Jepp, das hatte ich auch schon getestet, passt auch.
ZitatDann würde ich den Request nochmal Header für Header mit Deiner vereinfachten Konfiguration vergleichen.
Irgendwo muss ein Unterscheid sein.
Ich hatte auch schon versucht, alle Header aus dem browser-Request mitzuschicken. War bisher leider auch erfolglos...werde ich mir aber nochmal vornehmen.
Nur zum Verständnis, die Header (der Seite mit den Daten) muss ich doch mit getHeaderXX mitgeben, oder?
ZitatDu könntest auch den Browser auf einem Ubuntu-System über den Burp-Proxy auf Deinem Windows-System schicken und das aufzeichnen und mit dem funktionierenden Request vergleichen.
Diesen Satz verstehe ich leider nicht...was genau meinst du damit, und wie macht man das?
Gruß
Andreas
Hallo Andreas,
Wenn Dein Browser unter Ubuntu andere Daten liefert als der unter Windows, dann müsste man die Unterschiede in den Requests einfach finden können wenn beides über Burp aufgezeichnet wird.
Da die Burp-Suite als Netzwerk-Proxy arbeitet, muss der Browser nicht auf dem gleichen Sytem laufen wie der Proxy. du kannst auch dem Browser auf einer Ubuntu-Maschine sagen, dass er als Proxy die Adresse und den Port verwenden soll, auf dem Burp auf einer andern System lauscht.
Einfach in den Proxy-Settings des Browsers eintragen ...
Gruß
Stefan
Sorry, Stefan, jetzt versteh ich nur noch Bahnhof...
In der burp-Suite stelle ich doch generell den Proxy auf 127.0.0.1:8080...oder was meinst du mir "Adresse und Port verwenden soll, auf dem Burp auf einem anderen System lauscht"?
Wie soll ich da was in den Proxy-Einstellungen des browsers eintragen?
Ich raff's einfach nicht... :-[
Komme mit burp unter Ubuntu mit Firefox auch nicht weiter. Stelle ich im Firefox den Proxy 127.0.0.1:8080 gemäß burp ein, warnt Firefox beim Aufruf der https-Seite vor einem nicht bekannten Zertifikat, und dass Firefox keine Ausnahme hinzufügen kann...ich kann die Seite dann nicht aufrufen.
Manuell kann ich das Zertifikat von burp auch nicht im Firefox einpflegen...
Kann es also bisher nicht unter Ubuntu mit Firefox nachstellen.
Gruß
Andreas
Hallo Andreas,
statt 127.0.0.1 kannst Du in der Burp Suite unter Proxy - Options auch angeben, dass der Proxy auf allen Adressen des Systems antworten soll.
Dann kannst Du die LAN-Adresse des Systems mit Burp als Proxy auf anderen Systemen angeben.
Gruss
Stefan
Hallo Stefan,
vielleicht dämmert es mir so langsam, worauf du hinaus willst...sicher bin ich aber nicht...
Ich starte Windows und Ubuntu aus einem Multi-Boot-System heraus vom gleichen PC.
Die LAN-Adresse des Systems ist also immer die gleiche, weil fest für den PC vergeben.
Falls du das meintest...
Gruß
Andreas
Ok, auf einem Multiboot-System bringt Dich das nicht weiter.
Gruss
Stefan
Zitat von: brembs am 17 März 2017, 21:33:46
Bei mir funktioniert es auch wieder! Spitzenklasse, ganz vielen Dank für die Arbeit und sorry, dass ich keine Zeit hatte, mit zu helfen!
Hallo,
seit dem 30.06 geht das login so nicht mehr. Gibt es eine Lösung?
mfg
Jens
Hallo!
Ich hab im Keller auch einen SENEC-Speicher stehen und schau mir fast täglich die Daten auf der SENEC-Seite an.
Ich bin vor einigen Tagen soz. per Zufall auf FHEM gestossen, da ich unserer Wärmepumpe ein Interface verpassen wollte. Nachdem ich das erfolgreich geschafft habe, entstehen natürlich weitere Wünsche. ;)
Nach Bemühen der Forums-Suche mit Schlagwort "SENEC", kam dieser Beitrag als einziges Ergebnis. Mit Bedauern habe ich den letzten Eintrag gelesen...
Nichts desto Trotz würde mich dennoch interessieren, wie die Einbindung in FHEM dann überhaupt funktioniert. Aus den Codeteilen in den einzelnen Beiträgen konnte ich leider nicht schlau werden. Ich muss auch noch zugeben, dass ich in Sachen FHEM noch recht "grün" bin, von Programmierung aber schon etwas Ahnung habe - allerdings in C, bisher nur auf embedded Systemen und das ist auch schon einige Jahre her.
Vielleicht mag jemand ein paar erklärende Worte dazu schreiben - wäre sehr nett!
Ciao
Tom
PS: ..und Klasse wär's, wenn's wieder funktionieren würde. :-)
Hallo zusammen,
vielen Dank für die guten Info's hier im Thread. Ich habe heute meinen Speicher von Senec bekommen. Ich konnte das Device von Vizw leider noch nicht testen, da ich den online Zugang noch nicht habe.
Ich stelle mir aber die Frage, warum es über die Daten über die Website https://mein-senec.de einbinden soll, wenn ich doch genauso gut per LAN und IP auf den Speicher zugreifen kann? Hier kann ich durch den Aufruf der lokalen IP ohne Benutzername usw alle Daten sehen.
Oder ist das nur eine versteckte Weiterleitung? Wäre ja einfacher lokal zu bleiben, oder irre ich mich hier?
Inzwischen bin ich schon hinsichtlich FHEM um einiges schlauer geworden und hab auch schon vieles probiert und teilweise integriert.
Jetzt bin ich hier wieder angekommen, da ich noch immer Interesse habe, u.a. meinen Speicher-Status mit anzuzeigen und ggf. damit auch später mal was zu steuern.
Nach einiges Versuchen es so zu machen, wie Vize (Andreas), bin ich aber noch nicht ans Ziel gekommen. Entweder ich mach was falsch oder es geht noch immer nicht.
@Tiger84: Hast du dich vielleicht an der Möglichkeit den Akku lokal im LAN einzubinden versucht?
leider nicht wirklich und dann sind bei dem Wetter auch wieder "Outdoor"-Projekte hinzugekommen...
Alles klar.. - Outdoor-Aktivitäten haben bei mir zwischenzeitlich auch wieder extrem erhöhte Priorität. Ab 3. September hab ich wieder richtig Zeit für anderes.. ;D
Seit ein paar Tagen, nach einer Umstellung bei SENEC funktioniert der Login wieder einmal nicht mehr:
The request was rejected because the URL contained a potentially malicious String ";"
Sieht so als als bentzten sie SpringSecurity
https://github.com/spring-projects/spring-security
was keine URL im Format /auth/oauth/authorize;jsessionid=<sessionid> mehr zulässt. Habe mal im HTTPMOD Thread eine Anfrage hinterlassen und werde etwaige Lösungen hier posten. Nicht sicher ob man das mit entsprechenden Befehlen verhindern kann, oder ob Stefan das Modul updaten muss.
Hallo brembs,
Ich glaube nicht dass HTTPMOD geändert werden muss. Aber um die Konfiguration an das neue Login-Verfahren anzupassen muss sich jemand die Mühe machen und genau analysieren, welche Requests / Responses hin und hergeschickt werden. Mit den Replacement-Features von HTTPMOD müsste dann alles abbildbar sein.
Gruss
Stefan
Hallo Stefan,
vor ein paar Tagen habe ich das neue login-Verfahren mal mit burp aufgezeichnet.
Wenn ich (in einigen Tagen) wieder zu Hause bin, schicke ich dir mal den Mitschnitt.
Es sieht so aus, als ob nun session-tokens (oder wie die heißen) erzeugt und mitgeschickt werden.
Mal sehn, ob man das mit den replacements von HTTPMOD nachbauen kann.
Ab welcher Version von HTTPMOD funktionieren die replacements? Habe lange nicht mehr ein update gemacht... :-[
VG
Andreas
Hallo Andreas,
Ich glaube die Replacements sind seit 2016 drin.
Gruss
Stefan
Hallo Andreas,
ich habe mir das neue Login-Verfahren mit Deinen Informationen mal näher angesehen.
Es ist mit HTTPMOD machbar.
Man muss ca. 15 Schritte abarbeiten und dabei Readings für code und state sowie zwei Session IDs tracken.
Die automatische Cookie-Funktion wird dabei vermutlich auch nicht funktionieren, da man zwei JSESSIONIDs vorhalten muss.
Mit Replacements sollte das aber alles machbar sein, aber es ist sicher mühsam ;-)
Sobald ich mal ein paar Stunden Zeit dafür habe, könnte ich versuchen eine Zusatzfunktion in HTTPMOD einzubauen, die das stark vereinfacht und den Redirects automatisch folgt, dabei die richtigen Session-Cookies verwendet und so auch code und state mitnimmt.
Die Fhem HttpUtils verfolgen zwar prinzipiell Redirects, aber soweit ich das verstanden habe, werden dabei die Cookies nicht mitgenommen. Folglich muss man es bisher manuell in HTTPMOD konfigurieren.
Falls Du Dir die Mühe machen möchtest:
1) GET /login
aus der Response die erste Session ID holen und aus der Location den State holen
2) GET /auth/oauth/authorize?client_id=portale&redirect_uri=https://mein-senec.de/login&response_type=code&state=QeiJtQ
mit dem Session Cookie und dem State aus dem ersten Request
aus der Response die neue Session-Id für /auth holen
3) GET /auth/login
mit der Session Id als Cookie aus 2
4) POST /auth/login
mit der Session Id als Cookie aus 2
und mit User und Password
aus der Response die neue Session-Id holen und aus der Location den State
usw.
Aufpassen muss man dabei dass man die richtigen Session-Ids zum passenden Pfad nimmt.
Gruss
Stefan
OK, klingt aufwändig aber machbar, vielen Dank für die Anleitung! Hoffe, ich finde etwas Zeit um das mal aus zu probieren...
Hallo,
anbei eine neue Version von HTTPMOD zum Testen. Es gibt zwei neue Attribute:
enableRedirects
aktiviert ein Redirect-Handling innerhalb von HTTPMOD, so dass auch Cookies zwischen Redirects verwaltet werden können.
dontRequeueAfterAuth
verhindert dass der letzte Request nach Durchführung der Login-Prozedur nochmals gesendet wird.
Für die meine-senec Website sieht eine einfache Konfiguration dann folgendermassen aus:
define senec HTTPMOD https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0 0
attr senec dontRequeueAfterAuth 1
attr senec enableControlSet 1
attr senec enableCookies 1
attr senec handleRedirects 1
attr senec reAuthRegex Login.Portal
attr senec sid01URL https://mein-senec.de/auth/login
attr senec sid01Header1 Accept: text/html, application/xhtml+xml, image/jxr, */*
attr senec sid01Data =&username=xxxx&password=xxxx
Ich hoffe es klappt auch bei Euch auf Anhieb ;-)
Gruss
Stefan
Hi Stefan,
es läuft!!! ;D 8)
Vielen, vielen Dank nochmals an dieser Stelle!
Wahnsinn, was es doch für programmiertechnische Perlen hier gibt!
VG
Andreas
Zitat von: Tiger84 am 08 Februar 2018, 18:55:52Ich stelle mir aber die Frage, warum es über die Daten über die Website https://mein-senec.de einbinden soll, wenn ich doch genauso gut per LAN und IP auf den Speicher zugreifen kann? Hier kann ich durch den Aufruf der lokalen IP ohne Benutzername usw alle Daten sehen.
Hi,
ja, man kann auch im LAN eine HTTPMOD-Abfrage des Speichers machen.
"Nachteil" hierbei ist, dass die interne Zeitanzeige des SENEC-Speichers 1 bzw. 2 Stunden (Sommer/Winterzeit) hinkt. Dadurch passen die Tageswerte dann nicht.
Ausserdem kann man sich von der internen Seite nicht alle Sachen holen, die im Online-Portal dargestellt werden, z.B. getrennte Darstellung Netzbezug zu Netzeinspeisung oder auch die Daten zu (falls gebucht) EconamicGrid- und Gutscheinbeladungen.
Anbei mal ein screenshot meiner readingsGroup zum SENEC.
VG
Andreas
Alles funktioniert wieder! Stefan, Du bist absolute Spitze! Genial!
@Vize: Ich komme seit der Umstellung auf EconamicGrid gar nicht mehr auf den lokalen Router drauf und kann da also keine Werte mehr auslesen. Das soll so sein, haben die mir damals gesagt. Kommst Du noch auf den lokalen Router und kannst dort Werte auslesen? Wenn ja, wie machst Du das?
Moin,
das kommt darauf an, welche Version des Speichers du hast.
Ohne "Umwege" geht das nur bei den V2 (Li) Speichern. Die haben keinen externen VPN-Router mehr, sondern einen integrierten.
Diese Speicher kann man dann ganz normal im LAN über die IP-Adresse erreichen.
Bei den älteren Klumpen (Pb und Li) geht das leider nicht. Dort wird dann auch keine Adresse aus deinem LAN auf dem Display angezeigt, sondern die des Senec-VPNs.
VG
Andreas
Ah, alles klar, das erklärt es. Dauert bei mir noch 5 Jahre, bis ich mir einen neuen Speicher zulege... 8)
Zitat von: Vize am 05 Juli 2018, 16:55:13
Hi,
ja, man kann auch im LAN eine HTTPMOD-Abfrage des Speichers machen.
"Nachteil" hierbei ist, dass die interne Zeitanzeige des SENEC-Speichers 1 bzw. 2 Stunden (Sommer/Winterzeit) hinkt. Dadurch passen die Tageswerte dann nicht.
Ausserdem kann man sich von der internen Seite nicht alle Sachen holen, die im Online-Portal dargestellt werden, z.B. getrennte Darstellung Netzbezug zu Netzeinspeisung oder auch die Daten zu (falls gebucht) EconamicGrid- und Gutscheinbeladungen.
Anbei mal ein screenshot meiner readingsGroup zum SENEC.
VG
Andreas
Hallo Andreas,
wäre es vielleicht möglich, dass du die ReadingsNames und Regex hoch lädst. Ich würde das auch gerne über die Seite aus dem LAN umsetzen aber bekomme das irgendwie mit den Regex nicht hin.
Beimir funktioniert die Konfiguration von Atwort 53 nicht.
Kann jemand da mal nachschauen was ich falsch mache:
defmod senec2 HTTPMOD https://mein-senec.de/endkunde/api/status/getstatusoverview.php?anlageNummer=0 0
attr senec2 userattr sid01Data sid01Header1 sid01URL
attr senec2 dontRequeueAfterAuth 1
attr senec2 enableControlSet 1
attr senec2 enableCookies 1
attr senec2 handleRedirects 1
attr senec2 reAuthRegex Login.Portal
attr senec2 sid01Data &username=xxx@xxx.de&password=xxxxx
attr senec2 sid01Header1 Accept: text/html, application/xhtml+xml, image/jxr, */*
attr senec2 sid01URL https://mein-senec.de/auth/login
attr senec2 timeout 60
attr senec2 verbose 4
Danke
ZitatBeimir funktioniert die Konfiguration von Atwort 53 nicht.
SENEC ändert die Seite ständig und man muss danach immer alles neu konfigurieren. Zur Zeit haben wir keine funktionierende Konfiguration mehr, leider.
Restarte den Thread mal, in der Hoffnung jemand kann mich unterstützen.
Ich versuche Mittels HTTPMOD die Leistungsdaten aus unserem PVA-Portal auszulesen und scheitere momentan am Login.
Mittels burp fand ich den Request mit UID und PW, sowie das nachgelagerte Cookie. Doch leider bin ich ein absoluter Programmier-DAU und komme nicht weiter...
René