Fast ein telnet-Ersatz ...

Status
Für weitere Antworten geschlossen.

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Es geht um ein .cgi-Skript, dass die Funktionalität einer Shell in den Disk Station Manager bringt. Wozu? Damit kann man fast alle Dinge tun, für die man sonst einen Telnet braucht. Ist sicher (weil https) und schön :D


Achtung: Wie immer erfolgen alle Änderungen mit telnet-Aufruf auf der DS und auf eigene Kappe

Voraussetzung: Die Option HTTPS-Verbindung ist aktiv, d. h. auf den Web Station Manager wird mit https://IP_der_DS:5001 zugegriffen.

(1) Der Einfachheit habe ich das Skript auch in das Verzeichtnis: /usr/syno/synoman/phpsrc/systeminfo gelegt. Wer also noch kein Verzeichnis systeminfo hat, der lege sich eins an und stelle sich dann hinein.

(2) Die Datei shell.cgi erstellen mit folgendem Inhalt (Achtung, die erste Zeile ist sehr wichtig!) :

Rich (BBCode):

#!/bin/ash
cmd=$(echo $QUERY_STRING | sed 's/\+/ /g' | sed 's#%\([0-9A-F][0-9A-F]\)#\\x\1#g')
cmd=${cmd##*=}
cmd=$(echo -e $cmd)
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Shell</title></head><body>"
echo "<style>body{font:11px Arial;}</style>"
echo "<form name='f' method='get' action='shell.cgi'>"
echo "<input size=100 style='font:11px Courier New' type=text name='cmd'>"
echo "<input type=submit value=go>"
echo "</form>"
echo "<div style='background-color:#ccf;border:1px solid #ccc;height:500px;overflow:auto'><pre>"
echo '$ '$cmd
ash -c "$cmd"
echo "</pre></div>"
echo "</div></body></html>"

(3) Ein Verzeichnis anlegen: /usr/syno/synoman/webman/3rdparty/shell. In diesem Verzeichnis die Datei application.cfg erfassen:

text = shell
description = shell
type = embedded
protocol = https
address = IP_der_Diskstation
port = 5001
path = /phpsrc/systeminfo/shell.cgi

(4) Disk Station Manger aufrufen & testen

Kurze Erläuterung: Das Skript schickt ein Formular zur Eingabe des gewünschten Linux-Kommandos. Mit dem Button (oder der Return-Taste) abschicken. Das Skript ruft sich selbst wieder auf. Jetzt erfolgt die Aufbereitung der QUERY_STRINGS (Substitution der Leerstellen und des URIDECODES (z.B. %2F -> / ), Abschneiden des Variablennamens und Aufbreitung für die Ausführung). Das eingegeben Kommando wird dann am Ende mit ash -c $cmd aktiviert.

Achtung, es wird jedesmal eine neue Shell gestartet, so dass Ergebnisse von Kommandos nicht zwischengespeichert werden, d. h. ein cd .. mit nachfolgendem ls -l geht nur wie folgt: cd ..;ls -l

Einige Programm gehen nicht (z. B. vi), andere verhalten sich eigenwillig, weil bestimmte Shell-Umgebungsvariablen nicht stimmen (z. B. more) ...

OOOOhhhhjeee - ich hab was vergessen zu schreiben. Man kann jedes Kommando eingeben! Mit der Folge, dass man auch den größt-möglichen-Schaden anrichten kann. Also immer klaren Kopf, wenn man was damit tut - ist genauso wie im telnet ... also keine rm -r ... oder so ... das kann die gesamte Platte löschen
 
Zuletzt bearbeitet:

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
Muss man sich mit diesem Script eigentlich vorher irdgendwie einloggen? Also nicht nur in die WebAdmin sondern zusätzlich?

Falls nicht, ist äusserste Vorsicht geboten, weil alle skripts im Verz. phpsrc direkt vom Web aufrufbar sind! Und wenn diese nicht speziell abgesichert werden, wirds kritisch.

Im genannten Beispiel ist also über "https://Ip_der_Diskstation:5001/phpsrc/systeminfo/shell.cgi" jetzt das ganze System für jeden offen!


Pio435
 
Zuletzt bearbeitet:

Trolli

Benutzer
Mitglied seit
12. Jul 2007
Beiträge
9.848
Punkte für Reaktionen
1
Punkte
0
Ja. Das muss man beachten. Im genannten Fall sollte der Port 5001 nicht frei im Internet zugänglich gemacht werden...

Trolli
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
hmm ... also ich komme mit dem normalen Aufruf: http://IP_der_DS/phpsrc/systeminfo/irgendwas an das Verzeichnis phpsrc/systeminfo nicht dran, weder an html-Dateien noch an .cgi-Skripte, weil bei mir die Klausel: DocumentRoot in der http.conf für den user-Apache auskommentiert ist (und ich meine, daran auch nichts geändert zu haben).

Somit käme also dein Beispiel in Frage, dass sich jemand von Draußen per https://Ip_der_Diskstation:5001/phpsrc/systeminfo/shell.cgi auf das Skript zugreift. Aber das geht nur, wenn auch der Port 5001 im Router durchgelassen wird.

Klar kann man das Ganze ansichern, zum Beispiel per .htaccess. Aber ganz ehrlich, dazu hab ich einfach keine Lust mehr gehabt :D. Und wer die Idee erkennt, kann sich das ja zurechtbiegen :)
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
hmm ... also ich komme mit dem normalen Aufruf: http://IP_der_DS/phpsrc/systeminfo/irgendwas an das Verzeichnis phpsrc/systeminfo nicht dran, weder an html-Dateien noch an .cgi-Skripte, weil bei mir die Klausel: DocumentRoot in der http.conf für den user-Apache auskommentiert ist (und ich meine, daran auch nichts geändert zu haben).

Somit käme also dein Beispiel in Frage, dass sich jemand von Draußen per https://Ip_der_Diskstation:5001/phpsrc/systeminfo/shell.cgi auf das Skript zugreift. Aber das geht nur, wenn auch der Port 5001 im Router durchgelassen wird.

Klar kann man das Ganze ansichern, zum Beispiel per .htaccess. Aber ganz ehrlich, dazu hab ich einfach keine Lust mehr gehabt :D. Und wer die Idee erkennt, kann sich das ja zurechtbiegen :)

Du hast schon recht, der Aufruf des Scripts ist nur möglich, wenn der Port 5001 verwendet wird und dieser beim Router durchgeschleift wird.

Mir ging es nur darum, auf dieses "Leck" hinzuweisen ...
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
und der Hinweis ist auch gut so! ;)

Es ist immer besser, sich über sowas Gedanken zu machen, als blind etwas einzusetzen. Und manchmal bringt eine Diskussion ja auch Klarheit in Zusammenhänge.
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
... ausserdem suche ich eine Möglichkeit, die Sicherung solcher Applikationen losgelöst von .htaccess zu realisieren.

Unter folgendem Link:

http://download.synology.com/downlo...S Server 3rd-Party Apps Integration Guide.pdf

ist die Doku für die 3rdparty-Intergration. Dort wird auf Seite 17 ein Skript gezeigt, welches überprüft, ob man angemelet ist oder nicht. Ich schaffe es aber nicht, dieses zu integrieren. Vielleicht hat jemand eine Idee?

Pio435

PS: ich habe den 5001 offen, darum ist es für mich ein Thema :)
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
@Pio435,

da haste mich nu doch neugierig gemacht, wie man das einbauen kann.

Ich hab das obige Skript um 2 Zeilen ergänzt (ab Zeile 2 gehts los):

Rich (BBCode):
#!/bin/ash
USR=$(/usr/syno/synoman/webman/modules/authenticate.cgi)
[ "$USR" != "admin" ] && exit 1

Allerdings gibts eventuell noch eine Änderung und zwar in der application.cfg:

statt address = IP_der_DS muss es bei dir wahrscheinlich heißen: address = DNS_Name_der_DS

Hintergrund: Der über den Disk Station Manager angemeldete User hinterlegt seine Identifikation verschlüsselt in einem Session-Cookie. Cookies werden aber pro Host-Namen gebildet, also ist die IP was anderes als deine DNS ... Und das authenticate.cgi schau einfach in sein Cookie-Fach rein und findet es halt nicht, wenn du dich bei der DS mit DNS-Namen angemeldet hättest, aber in der application.cfg dir per IP das Skript holst. Alles klar????:D
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
@Pio435,

da haste mich nu doch neugierig gemacht, wie man das einbauen kann.

Ich hab das obige Skript um 2 Zeilen ergänzt (ab Zeile 2 gehts los):

Rich (BBCode):
#!/bin/ash
USR=$(/usr/syno/synoman/webman/modules/authenticate.cgi)
[ "$USR" != "admin" ] && exit 1

Allerdings gibts eventuell noch eine Änderung und zwar in der application.cfg:

statt address = IP_der_DS muss es bei dir wahrscheinlich heißen: address = DNS_Name_der_DS

Hintergrund: Der über den Disk Station Manager angemeldete User hinterlegt seine Identifikation verschlüsselt in einem Session-Cookie. Cookies werden aber pro Host-Namen gebildet, also ist die IP was anderes als deine DNS ... Und das authenticate.cgi schau einfach in sein Cookie-Fach rein und findet es halt nicht, wenn du dich bei der DS mit DNS-Namen angemeldet hättest, aber in der application.cfg dir per IP das Skript holst. Alles klar????:D

genial, fast genau das habe ich gesucht. Du hast nicht zufällig noch die Syntax für den Einbau in ein PHP-Skript? Das wäre genial!

Danke schon mal für diesen Input!

Pio435
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
im Grunde sollte es genauso wie in Beschreibung von Synology gehen: popen, fread, if , pclose *guck*

Aber leider funktioniert das nicht bei mir - hab keinen Plan, wies gehen sollte. Der Aufruf verhält sich immer so als wäre man nicht angemeldet. Vielleicht hat das was mit den cookie-Pfaden zu tun, seh aber im Moment keine Lösung :mad:
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
.. so weit bin auch schon gekommen :mad:

Es wird immer der Wert 'Resource id #2' ausgegeben, unabhängig ob eingeloggt oder nicht ..!

aber jetzt stehe ich wie der Esel am Berg :(

Pio435
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Vermutlich geht es nicht mit PHP-Skripten, sondern nur im Zusammenhang mit .cgi-Programmen bzw. .cgi-Skripten. Es kann sein, dass der Apache für PHP einen eigenen Prozess- bzw. Thread-Raum aufmacht und dieser nicht mehr auf die Session-Cookies oder was auch immer zugreifen kann, weil er nicht mehr Abkömmling des Disk Station Managers ist (kennt man ja auch von Environment-Variablen, die nicht per export vererbt worden sind - schlechtes Beispiel, aber macht vielleicht die Problematik deutlicher).

Wenn man sich mal das ganze Disk Station Zeugs von Synology anschaut, ist da auch kein PHP dabei. Wenn du mal in den Syno-Blog schaust (/usr/syno/synoman/phpsrc/blog) und dort die Datei login.php wirst du sehen, dass die beim Blog auch ihre eigene Authentifizierung machen ...

PS. "Resource id #2" steht in der Variablen, die du mit dem popen ()-Aufruf zurückbekommt. du musst schon noch mit fread was aus der Datei lesen ... nur da steht nichts drin (NULL)....
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
Na ja, ich bin ja nun mal mehr Bastler als Programmierer, kann Deine Ausführungen aber noch knapp nachvollziehen.

Auf der Suche nach Alternativen habe ich folgende Idee:

Ich starte das PHP-Skript aus einer abgewandelten CGI (gemäss Deiner Vorlage) und übergebe ein Variabel - z.B. Login_ok. Diese kann ich ja dann im PHP-Skript abfangen und gegebenenfalls die Ausführung abbrechen.

Aber jetzt mein Problem als Bastler ;): Wie starte ich aus dem CGI ein PHP-Skript und übergebe z.B. ein Post-Variabel?

Wäre für einen Input sehr dankbar!

Pio435
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
@Bastler *gg*

also zuerst das PHP-Skript, namens test.php

Rich (BBCode):
<?php var_dump($_ENV["USR"]); ?>

nun das .cgi-Skript, namens test.cgi, in dem das PHP-Skript aufgerufen wird:

Rich (BBCode):
#!/bin/ash
USR=$(/usr/syno/synoman/webman/modules/authenticate.cgi)
[ "$USR" != "admin" ] && exit 1
echo "Content-type: text/html"
echo ""
export USR
php -f test.php

chmod 755 test.cgi

Das müsste es gewesen sein: Der angemeldete User-Name wird per exportierter Shell-Variablen in das Environment des php-Interpreters übernommen und kann mit $_ENV["USR"] zur weiteren Benutzung wieder abgegriffen werden. Die Idee stammte ja von dir und siehe da, es geht und sieht gar nicht so schlimm aus ;)

Noch eine Bemerkung: schau dir mal mit var_dump(_SERVER["HTTP_REFERER"]) an! Das musst du auch noch im PHP-Skript abprüfen, damit dir keine X-Site-Scripts dein PHP-Skript aufrufen. Sonst wäre die ganze Mühe umsonst gewesen.
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
@Bastler *gg*

also zuerst das PHP-Skript, namens test.php

Rich (BBCode):
<?php var_dump($_ENV["USR"]); ?>

nun das .cgi-Skript, namens test.cgi, in dem das PHP-Skript aufgerufen wird:

Rich (BBCode):
#!/bin/ash
USR=$(/usr/syno/synoman/webman/modules/authenticate.cgi)
[ "$USR" != "admin" ] && exit 1
echo "Content-type: text/html"
echo ""
export USR
php -f test.php

chmod 755 test.cgi

Das müsste es gewesen sein: Der angemeldete User-Name wird per exportierter Shell-Variablen in das Environment des php-Interpreters übernommen und kann mit $_ENV["USR"] zur weiteren Benutzung wieder abgegriffen werden. Die Idee stammte ja von dir und siehe da, es geht und sieht gar nicht so schlimm aus ;)

Noch eine Bemerkung: schau dir mal mit var_dump(_SERVER["HTTP_REFERER"]) an! Das musst du auch noch im PHP-Skript abprüfen, damit dir keine X-Site-Scripts dein PHP-Skript aufrufen. Sonst wäre die ganze Mühe umsonst gewesen.

So weit alles klar und verständlich! VIELEN DANK!

Nur leider klappt es noch nicht ganz wie ich mir das vorstelle:

Meine CS startet einfach das PHP-Skript nicht? Kann nur nicht verstehen warum nicht :confused:

Hast Du noch eine Idee?

Pio435
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
sorry, weil ich nicht überprüft habe, wo mein php-Programm steht :mad:. Du hast das Programm php einfach nicht.

Ich habe ja einen zweiten Apache mit PHP installiert ... mit ipkg install php müsstest das php auch installiert bekommen. Check das dann aber ab mit ll /opt/bin/php, ob da auch wirklich das Programm php angekommen ist.

Sorry nochmal, weil ich das übersehen hab. Habe gestern nur mal schnell das Skript geproggt ohne mir darüber den Kopf zu machen :eek:
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
sorry, weil ich nicht überprüft habe, wo mein php-Programm steht :mad:. Du hast das Programm php einfach nicht.

Ich habe ja einen zweiten Apache mit PHP installiert ... mit ipkg install php müsstest das php auch installiert bekommen. Check das dann aber ab mit ll /opt/bin/php, ob da auch wirklich das Programm php angekommen ist.

Sorry nochmal, weil ich das übersehen hab. Habe gestern nur mal schnell das Skript geproggt ohne mir darüber den Kopf zu machen :eek:


Hey, hey, absolut kein Problem! Ich bin ja froh, das Du Dich meiner Bastlerei überhaupt angenommen hast! Vielen Dank!

Und das ich das PHP nicht drauf hab, hätte ich auch selbst überprüfen können ...

Habe also die Installation vorgenommen und siehe da, das PHP-Skript wird nun gestartet. Aber schon stehe ich vor einem neuen Problem:

- Starte ich das PHP-Skript direkt (ohne den Umweg über das start.cgi) lädt die CS die Seite normal, soll heissen, auch die eingebundene SQL-Abfragen werden ausgeführt.
- Starte ich das PHP-Skript über die start.cgi (eben mit entsprechender User-Abfrage) lädt er wohl die Basis der Site, lädt aber dann SQL-Bereich nicht.

Ich glaube ich stehe auf dem Schlauch:eek:

Pio435
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
eek! SQL machste und sagst nichts vorher :eek:

Du hast ja nun einen zweiten PHP laufen und der versorgt sich mit seiner Konfiguration aus einer zweiten (!) php.ini (schau mal /opt/etc/php.ini). Dort ist natürlich der Datenbankzugriff nicht so eingetragen wie bei deiner ersten (!) php.ini (schau mal /usr/syno/etc/php.ini). Ich denke, du musst den Abschnitt [mysqli] in der /opt/etc/php.ini so einrichten wie es in der /usr/syno/etc/php.ini steht. Alles klar? :D
 

Pio435

Benutzer
Mitglied seit
30. Dez 2007
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
eek! SQL machste und sagst nichts vorher :eek:

Du hast ja nun einen zweiten PHP laufen und der versorgt sich mit seiner Konfiguration aus einer zweiten (!) php.ini (schau mal /opt/etc/php.ini). Dort ist natürlich der Datenbankzugriff nicht so eingetragen wie bei deiner ersten (!) php.ini (schau mal /usr/syno/etc/php.ini). Ich denke, du musst den Abschnitt [mysqli] in der /opt/etc/php.ini so einrichten wie es in der /usr/syno/etc/php.ini steht. Alles klar? :D

... auch das weider nachvollziehbar, und entsprechend korrigiert. Bin die beiden php.ini's durchgegangen und habe die entsprechenden Anpassungen vorgenommen.

Leider aber kein Erfolg beim Aufruf des Skripts, ab der Stelle wo SQL ins Spiel kommt ...

Kann es sein, dass ich im Syno_Apache noch was anpassen muss?

Die httpd.conf-sys mit:

AddType ...
LoadModule ....

Habe ich bereits angepasst ....

Pio435

Noch eine kleine Ergänzung: AB dem Punkt der SQL-Einbindung wird das ganze Skript nicht mehr ausgeführt. Leider wird eine PHP-Error ausgegeben?

und noch was: alle weiteren Seiten, welche ich über das PHP-Skript anspreche, die auch SQL-Abfragen beinhalten, funktionieren ohne Probs?
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Der Kommando-Zeilen-Aufruf hat nun nichts mehr mit dem Apache zu tun, so dass dort eigentlich keine Konfigurationsänderungen zu machen wären.

Hast Du auch wirklich den richtigen Abschnitt in der zweiten php.ini geändert: mysqli also den mit dem kleinen i hintendran???

Eigentlich müsste dein PHP-Skript auch direkt auf der Kommando-Zeile ausgeführt werden können, hast das schon mal probiert: php dein_skript.php

Da kommt nun das HTML heraus, ist nicht schön anzusehen, aber es sollten keine Fehlermeldungen kommen - das wäre zumindest schön ;)

Vielleicht ist ja der Datenbankzugriff noch ein Problem. Teste doch man den Zugriff mit folgendem PHP-Skript:
Rich (BBCode):
<?php
$conn = mysql_connect("localhost","root","passwort");
$res = mysql_list_dbs($conn);
$i = 0;
while ($i < mysql_num_rows ($res)) {
  $db_name = mysql_tablename($res,$i);
  print $db_name." ";
  ++$i;
  }
mysql_close($conn);
?>

Natürlich musste deinen Connect anpassen. Das Skript müsste nun per Kommandozeilen-Aufruf deine Datenbanken-Namen ausgeben. Wenn das nicht funktioniert, dann hast ein Datenbankzugriffsproblem ... es läge dann nicht an der PHP-Konfiguration. Also bei funktioniert der Datenbankzugriff per Kommandozeile :D
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat