ubuntuusers.de

Per Upnp reconnect des Routers erzwingen (keine Fritzbox)

Status: Gelöst | Ubuntu-Version: Server 9.04 (Jaunty Jackalope)
Antworten |

kaBOOOM

Avatar von kaBOOOM

Anmeldungsdatum:
6. Juni 2009

Beiträge: Zähle...

Hi, seit ich meinen neuen Router habe, kann ich nicht mehr per ReconnectScript und Curl auf meinem Router zugreifen, weil in der Befehlsadresse ein HASH angegeben werden muss der sich ständig ändert und nur funktioniert, wenn ich mich per Firefox vorher an meinem Router angemeldet habe.

curl http://192.168.1.1/post_login.xml?hash=ce8331c81fb39ad90c8e4fc751eb2b72e2453819
curl http://192.168.1.1/wan_pppoe.cgi?connect=false
curl http://192.168.1.1/wan_pppoe.cgi?connect=true

Mein Router ist der D-Link DIR-855, also wollte ich über die universelle Schnittstelle UPNP ein Reconnect machen. Habe diese Seite gefunden, doch ich habe keine FB und weiss nicht wie ich meinem Router per upnp sagen soll dass er reconnecten soll.

Edit1: Also ich such was, wie RouterReconnect 1.3 nur als script für Linux ....

dol

Avatar von dol

Anmeldungsdatum:
6. September 2008

Beiträge: 48

Wohnort: Basel

Wie sieht die Anmeldung via Firefox aus? Kommt ein Feld mit Benutzername und Passwort (wahrscheinlich http://de.wikipedia.org/wiki/HTTP-Authentifizierung).

curl unterstütz diese Authentifizierung

Beispiel:

1
curl -u name:password www.secrets.com

Ansonsten bitte den HTML-Code der Login-Seite posten.

kaBOOOM

(Themenstarter)
Avatar von kaBOOOM

Anmeldungsdatum:
6. Juni 2009

Beiträge: 19

Also der Anmeldescren bei meinem Router ist ein solches Fenster mit Benutzer (Admin oder User) und Password

Ungültiges Makro

Dieses Makro ist nicht verfügbar

wie genau sieht denn dann der Code aus???

curl -u admin:mein-password 192.168.1.1
curl http://192.168.1.1/wan_pppoe.cgi?connect=false
curl http://192.168.1.1/wan_pppoe.cgi?connect=true

der scheint z.B. nicht zu funktionieren ... Und falls dir der Seitenquelltext mehr aufschluss geben sollte ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"><!-- InstanceBegin template="/Templates/Master_No_Nav.dwt" codeOutsideHTMLIsLocked="false" -->

<head>

<meta http-equiv="content-type" content="text/html; charset=utf-8" />



<link rel="stylesheet" rev="stylesheet" href="../style.css" type="text/css" />



<link rel="stylesheet" rev="stylesheet" href="/substyle.css" type="text/css" />




<!-- InstanceBeginEditable name="Page Title" -->

<title>D-LINK SYSTEMS, INC. | WIRELESS ROUTER :

Login

</title>

<!-- InstanceEndEditable -->



<!-- InstanceBeginEditable name="Local Styles" -->

<style type="text/css">



fieldset label.duple {

width: 300px;

}

</style>

<!-- InstanceEndEditable -->


















<script type="text/javascript" src="/utils.js"></script>

<script type="text/javascript" src="/ajax.js"></script>



<script type="text/javascript">

//<![CDATA[







var local_debug = ("" == "") ? false : true;





var is_admin = "true" == "true";





var radio_count = 1;

var radio_name = ["Radio 1", "Radio 2"];





var no_reboot_alt_location = "";





function do_reboot()

{

top.location = "/reboot.cgi?reset=false";

}





function no_reboot()

{

if (no_reboot_alt_location) {

top.location = no_reboot_alt_location;

return;

}

document.getElementById("maincontent").style.display = "block";

document.getElementById("rebootcontent").style.display = "none";

}





// 



var lang_form;



var i18n_xslt_processor;

var i18n_xml_data_fetcher;

var i18n_is_data_ready = false;

var i18n_is_xslt_ready = false;

var i18n_xml_data; // This will be an XMLDocument



function i18n_xslt_is_ready(xmlDoc)

{

i18n_is_xslt_ready = true;

i18n_refresh_list();

}



function i18n_data_is_ready(xmlDoc)

{

i18n_xml_data = xmlDoc;

i18n_is_data_ready = true;

i18n_refresh_list();

}



function i18n_refresh_list()

{

if (!(i18n_is_xslt_ready && i18n_is_data_ready)) {

return;

}



var parent = document.getElementById("i18n_language_selection");

parent.innerHTML = "";

i18n_xslt_processor.transform(i18n_xml_data, window.document, parent);

i18n_language_selector(lang_form.i18n_language.value);

}



function i18n_language_selector(lang)

{

//lang_form.i18n_language_select.options[lang].selected = true;

var langs = lang_form.i18n_language_select;

langs.value = lang;

}



function i18n_change_language(lang)

{

lang_form.i18n_language.value = lang;

lang_form.submit();

}

// 



function template_load()

{

// 

lang_form = document.forms.lang_form;

if ("" === "") {

i18n_xslt_processor = new ajax_xslproc("/i18n_language_codes.xsl", i18n_xslt_is_ready);

i18n_xml_data_fetcher = new ajax_xmlhttp("/languages.xml", i18n_data_is_ready, null, null);

i18n_xslt_processor.retrieve_xsl();

i18n_xml_data_fetcher.retrieve_xml();

}

// 





global_fw_minor_version = "13";

if (global_fw_minor_version < 10) {

global_fw_minor_version = "0" + global_fw_minor_version;

}



//

var fw_extend_ver = "EU";

//



var fw_minor;



fw_minor = global_fw_minor_version + fw_extend_ver;

document.getElementById("fw_minor_head").innerHTML = fw_minor;

global_fw_minor_version = fw_minor; // save to for device info use



page_load();



document.getElementById("loader_container").style.display = "none";

}

//]]>

</script>



<!-- InstanceBeginEditable name="Scripts" -->

<script type="text/javascript" src="md5.js"></script>

<script type="text/javascript">

//<![CDATA[



function page_load()

{



if (!AJAX_BROWSER_HAS_XMLHTTP) {

alert ("Your web browser is too old to use this web site. Please upgrade your browser.");

return;

}





if (!AJAX_BROWSER_HAS_XSLT) {

alert ("Your web browser is old, some features of this web site may not work. Please upgrade your browser.");

}



if (local_debug) {

hide_all_ssi_tr();

}

document.forms.myform.password.focus();

}





function xml_ready(xml_doc)

{

var status = xml_doc.get_element_data("login");

if (status) {

if (status == "timeout") {

alert("Session timeout, please try again.");

location.replace ('/');

} else if (status == "error") {

alert("Invalid password, please try again.");

location.replace ('/');

} else {

location.replace ('/' + status);

}

}

}





function xml_timeout()

{



alert ("The network connection seems to be down. Press 'Ok' to try again.");

location.reload(true);

}





function send_login()

{



var salt = "737c2546";



var password = document.forms.myform.password.value.substr(0,16);

document.forms.myform.password.value = ""; // Make sure password never gets sent as clear text





for (var i = password.length; i < 16; i++) {

password += String.fromCharCode(1);

}





var input = salt + password;

for (var i = input.length; i < 63; i++) {

input += String.fromCharCode(1);

}





input += (document.forms.myform.username.value == 'user') ? 'U' : String.fromCharCode(1);





var hash = hex_md5(input);





var login_hash = salt.concat(hash);





var xml_loader = new ajax_xmlhttp("/post_login.xml?hash=" + login_hash, xml_ready, xml_timeout);

if (!xml_loader) {



alert ("Your web browser is too old to use this web site. Please upgrade your browser.");

return;

}

xml_loader.retrieve_xml();

}



//]]>

</script>

<!-- InstanceEndEditable -->

</head>



<body onload="template_load();">

<div id="loader_container" onclick="return false;">&nbsp;</div>

<div id="outside_1col">

<table id="table_shell" cellspacing="0" summary=""><col span="1"/>

<tbody>

<tr>

<td>

<div id="header_container">

<div id="info_bar">

<div class="fwv">Firmware Version:

1.<span id="fw_minor_head">13</span>

</div>

<div class="hwv">Hardware Version:

A2

</div>

<div class="pp">Product Page: <a href="http://support.dlink.com.tw/" onclick="return jump_if();">DIR-855</a></div>

</div>

</div>

<table id="masthead_container" border="0" cellspacing="0" summary="">

<tr>

<td><div id="masthead_image"></div></td>

</tr>

</table>

<table id="content_container" border="0" cellspacing="0" summary="">

<tr>

<td id="sidenav_container">&nbsp;</td>

<td id="maincontent_container">

<div id="rebootcontent_1col" style="display: none">

<div class="section">

<div class="section_head">

<h2>Reboot needed</h2>

<p>

Your changes have been saved. The router must be rebooted for the changes to take effect. You can reboot now, or you can continue to make other changes and reboot later.

</p>

<input class="button_submit" type="button" value="Reboot Now" onclick="do_reboot()" />

<input class="button_submit" type="button" value="Reboot Later" onclick="no_reboot()" />

</div>

</div> <!-- reboot_warning -->

</div>

<div id="maincontent_1col" style="display: block">



<!-- InstanceBeginEditable name="Main_Content" -->

<div class="section">

<div class="section_head">

<h2>Login</h2>

<noscript>

<p class="warning">WARNING: JavaScript is not enabled for this browser!</p>

</noscript>

<p>Log in to the router:</p>

<form id="myform" action="/" onsubmit="send_login(); return false;">

<fieldset>

<p>

<label class="duple" for="username">User Name&nbsp;:</label>

<select id="username" name="username">

<option value="admin">Admin</option>

<option value="user">User</option>

</select>

</p>

<p>

<label class="duple" for="password">Password&nbsp;:</label>

<input type="password" id="password" maxlength="15" name="password" value="" tabindex="100" />

<input class="button_submit_padleft" type="button" name="Login" value="Log In" onclick="send_login();" />

</p>

</fieldset>

</form>

</div>

</div> <!-- section -->

<!-- InstanceEndEditable -->



</div>



<!-- language selection functions -->

<form id="lang_form" action="#" onsubmit="doSave(); return false;">

<div id="lang_container">

<span id="i18n_language_selection">

<select>

<option value="DE">Deutsch</option>

<option value="EN" selected="selected">English</option>

<option value="ES">Espa&#241;ol</option>

<option value="FR">Fran&#231;ais</option>

<option value="IT">Italiano</option>

<option value="JA">&#26085;&#26412;&#35486;</option>

<option value="KO">&#54620;&#44397;&#50612;</option>

<option value="PT">Portugu&#234;s</option>

<option value="ZH">&#32321;&#39636;&#20013;&#25991;</option>

<option value="CN">&#31616;&#20307;&#20013;&#25991;</option>

</select>

</span>

<input type="hidden" id="i18n_language" name="config.i18n_language" value="EN" />

</div>

</form>





</td>

<td id="sidehelp_container">&nbsp;</td>

</tr>

</table>

<table id="footer_container" border="0" cellspacing="0" summary="">

<tr>

<td><img src="../Images/img_wireless_bottom.gif" width="114" height="35" alt="" /></td>

<td>&nbsp;</td>

</tr>

</table>

</td>

</tr>

</tbody>

</table>



<div id="copyright">Copyright &copy; 2004-2008 D-Link Systems, Inc.</div>

</div>

</body>

<!-- InstanceEnd --></html>

Gruß kaBOOOM

kaBOOOM

(Themenstarter)
Avatar von kaBOOOM

Anmeldungsdatum:
6. Juni 2009

Beiträge: 19

Edit1: So die obige 3 Zeilen habe ich in für Windows in eine BAT datei gepackt die wie folgt aussieht. Mit diesem funktionierts unter Windows ...

@echo off
Echo Router reset: D-LINK DIR 855
curl -u admin:mein-password http://192.168.1.1/
curl http://192.168.1.1/wan_pppoe.cgi?connect=false
curl http://192.168.1.1/wan_pppoe.cgi?connect=true

wenn ich nun aber dasselbe unter linux in ein script packe, dann schlägt der reconnect fehl. Habe das unten zu sehen script in eine datei reconnect.sh gepackt und diese mit ./reconnect.sh ausgeführt ...

#!/bin/bash
curl -u admin:mein-password http://192.168.1.1/
curl http://192.168.1.1/wan_pppoe.cgi?connect=false
curl http://192.168.1.1/wan_pppoe.cgi?connect=true

dol

Avatar von dol

Anmeldungsdatum:
6. September 2008

Beiträge: 48

Wohnort: Basel

Kannst du bitte mehrere Male hinter einander die Startseite aufrufen (Login-Seite) und im Quelltext kontrollieren, ob sich der Wert für 'var salt = "12345678";' laufend ändert. Wenn dies der Fall ist, dann wird das einloggen ein wenig schwieriger. Aber nicht unmöglich.

[Update]

Bekommst du einen Fehler, wenn du das Script in der Konsole ausführst? Wenn ja, wie lautet dieser. Eventuell liegt es daran, das die erste Zeile (Shebang) falsch geschrieben ist. #!/bin/bash/ hat einen Slash zu viel.

kaBOOOM

(Themenstarter)
Avatar von kaBOOOM

Anmeldungsdatum:
6. Juni 2009

Beiträge: 19

1. Also das mit der Windows BAT-Datei funktioniert wohl doch nicht immer. Irgendwie scheint es so, dass der Router die Logindaten für meinem Win-PC temporär (für ein paar Minuten) nach einem normalen Weblogin speichert, so dass auch das Script zeitweise funktioniert. (Shebang wurde berichtigt)

2. Die Codezeile 'var salt = "XXXXXXXX"' ändert sich auch nicht immer sofort nach jedem Aufruf, denn wenn ich mich per IE oder Firefox die Loginseite aufrufe ist sie für einen kurzen zeitraum gleich. Über einen "längeren Zeitraum" ändert sie sich aber trotzdem ...

3. Wenn ich das script ausführe gibts als Ausgabe noch ein Haufen HTML-Code, der aber nicht komplett angezeigt wird ...

dol

Avatar von dol

Anmeldungsdatum:
6. September 2008

Beiträge: 48

Wohnort: Basel

Ich habe mal was zusammengeschrieben.

Versuch bitte einmal dieses Script unter Linux aus.

Eventuelle Fehlermeldungen der Konsole weiterleiten.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
salt=`curl -s http://192.168.1.1 | grep "var salt ="`
salt=${salt:12:8}
password="geheim"

chr() {
  printf \\$(printf '%03o' $1)
}

blind=$(chr 1)
let COUNT=16-${#password}
# bash while loop
while [ $COUNT -gt 0 ]; do
	password=$password$blind
	let COUNT=COUNT-1
done

input=$salt$password
let COUNT=64-${#input}
# bash while loop
while [ $COUNT -gt 0 ]; do
        input=$input$blind
        let COUNT=COUNT-1
done

hash="echo -n '$input' | md5sum | awk '{print \$1}'"
hash=$(eval $hash)
login_hash=$salt$hash

curl -s http://192.168.1.1/post_login.xml?hash=$login_hash > /dev/null 2>&1
curl -s http://192.168.1.1/wan_pppoe.cgi?connect=false > /dev/null 2>&1
curl -s http://192.168.1.1/wan_pppoe.cgi?connect=true > /dev/null 2>&1

kaBOOOM

(Themenstarter)
Avatar von kaBOOOM

Anmeldungsdatum:
6. Juni 2009

Beiträge: 19

Das Script läuft ohne Ausgabe durch. Habe das password zwischen den "" von geheim auf mein richtiges umgeändert. Bisher 1mal getestet und es hat funktioniert ... ich werde es noch ein paar mal ausprobieren ob es auch weiterhin funkt ...

BTW: Was macht das Script denn eigentlich genau? Es ließt den Wert für "var salt" beim Verbinden mit dem Router aus, berechnet eine Variable hash und packt zum Schluss var salt und hash zum gesamten HASH zusammen. Wie berechnest du die Variable hash eigentlich bzw was rechnet das Script da? Dafür reichen meine sehr sehr bescheidenen Programmierkenntnisse nicht aus.

dol

Avatar von dol

Anmeldungsdatum:
6. September 2008

Beiträge: 48

Wohnort: Basel

Das tönt ja mal nicht schlecht.

Zum Script: Ich habe den HTML Code analysiert und gesehen, dass das Login via Javascript abläuft. Nun habe ich einfach die Javascript Logik in Bash nachgebaut. Kurz erklärt:

  • Salt (ist wie ein Schlüssel, mit dem zusammen das Passwort verschlüsselt wird) → curl Befehl am Anfang holt sich den aktuellen Salt-Wert, der sich eigentlich immer mal wieder ändern sollte. Hast dies auch beschrieben. Wahrscheinlich wird dieser irgendwie in Zusammenhang mit der Zeit generiert und auf dem Router abgespeichert.

  • Das Passwort wird mit Leerzeichen gefüllt, dass es genau 16 Zeichen lang ist

  • Salt und Passwort (16 Zeichen) werden zusammen gehängt und mit Leerzeichen auf 64 Zeichen aufgefüllt.

  • Salt + Passwort werden als MD5 (Einweg Verschlüsselung) verschlüsselt

  • Salt + MD5 Hash zusammen ergeben den Login Hash

  • Dieser Login Hash wird an die Login Schnittstelle per GET (URL)/curl gesendet

  • Server schneidet die ersten 8 Zeichen ab = Salt und generiert aus diesem Salt + Passwort (gespeichert auf Router) auch einen Hash. Stimmt der gesendete Hash mit dem vom Router generierten Hash überein, so klappt das Anmelden.

  • Warum wird das gemacht: Um das Passwort nicht als Klartext über das Netzwerk zu versenden. Diese Methode macht aus sicherheitstechnischer Sicht Sinn, doch muss für diese Variante das Passwort als Klartext auf dem Router gespeichert sein.

Hoffe dies ist verständlich. Eventuell könntest du immer den gleichen Salt benutzen. Kannst dies einmal testen, in dem du in Zeile 29 'echo $login_hash' hinzufügst und laufen lässt. Als Ausgabe erhältst du einen Login Hash der im unteren neuen Script hinzugefügt werden kann.

1
2
3
4
#!/bin/bash
curl -s http://192.168.1.1/post_login.xml?hash=LOGIN_HASH_HIER_EINFUEGEN > /dev/null 2>&1
curl -s http://192.168.1.1/wan_pppoe.cgi?connect=false > /dev/null 2>&1
curl -s http://192.168.1.1/wan_pppoe.cgi?connect=true > /dev/null 2>&1

kaBOOOM

(Themenstarter)
Avatar von kaBOOOM

Anmeldungsdatum:
6. Juni 2009

Beiträge: 19

Also bis jetzt hat das Script immer funktioniert. Eigentlich müsste man den Topic noch ändern in "Hash-generator reconnect script" oder ähnliches ^^, damit andere von der Arbeit profitieren die ebenfalls so ein Problem mit dem reconnect hatten.

Danke für die Arbeit. Mfg kaBOOOM

Antworten |