Remote your DS

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
WARNUNG:
Dieses Script führt remote Kommandos unter dem User aus, der den Webserver laufen lässt. Damit kann man problemlos alle Daten der Platte löschen. Sichert also den Zugriff darauf unbedingt ab!

Habe heute/gestern den überraschend einfachen Weg gefunden auf einer DS via GET Parameter Kommandos ausführen zu lassen. Das ganze geht via ein cgi.
Es braucht zwei Dateien. Eine cgi Datei, die das Kommando via QUERY_STRING entgegen nimmt und ausführt.
Code:
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo '<pre>'
for i in $(env)
do
 if [ $(echo $i | grep -i '^query_string') ]
 then
#  echo 'Vorher: '$(echo $i | awk -Fcommand= '{print $2}')
#  echo -n 'Nachher: '
#  echo $(echo $i | awk -Fcommand= '{print $2}' | ./decode.php)
   $(echo $i | awk -Fcommand= '{print $2}' | ./decode.php)
  exit
 fi
done
echo '</pre>'
dieses cgi nimmt via command= das Kommando entgegen.
Zusätzlich braucht man noch ein kleines Script (hier ein PHP Script decode.php), das den Query_String dekodiert. Denn Leerzeichen werden immer als %20 beim Server ankommen und ein solches Kommando könnte nicht ausgeführt werden.
PHP:
#!/usr/bin/php
<?php
$fp=fopen('php://stdin','r');
$str = array();
while($line=fgets($fp,4096)){
 $str[] = trim($line);
}
echo urldecode(implode($str));
exit;
?>
diese beiden Scripte ausführbar machen und ins gleiche Verzeichnis ablegen. Ich habe bei mir /usr/syno/synoman/phpsrc verwendet, den root Apache also. Dieses Script darf keinesfalls verwendet werden wenn man den Syno Assi (also Port 5000 und/oder 5001) geöffnet hat ;)
Wer es mal angucken will, ich habe es bei mir auch auf dem Webserver. Allerdings führe ich da das Kommando natürlich nicht aus :D
http://brain-force.ch/command.cgi?command=ssh -i /root/key_ssh root@192.168.100.9 ls -al /root /tmp

Gut Nacht

tobi
 

ubuntulinux

Benutzer
Mitglied seit
23. Jan 2010
Beiträge
2.063
Punkte für Reaktionen
0
Punkte
82
Geht es jetzt auch korrekt mit leerschlägen?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@ubuntu
Klick meinen Link und vergleiche vorher und nachher des Befehls :)
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Habe der Code mal noch etwas angepasst:
Das Kommando wird dahingehend geprüft, ob es überhaupt existiert auf der DS. Zusätzlich die Option ein File einzubinden, welches die erlaubten Kommandos aufführt. Dazu im folgenden cgi Code check=1 setzen
Code:
#!/bin/sh
echo "Content-type: text/html"
echo ""

check=0
cmdAllowed ()
{
 found=0
 for ii in $(cat ./allw_cmd)
 do
  if [ "$ii" = "$1" ]
  then
   found=1
   break
  fi
 done
 if [ $found -eq 0 ]
 then
  echo "<strong>$1</strong> nicht erlaubt"
  echo '<br />Erlaubte Kommandos sind:<br /><strong>'
  echo $(cat ./allw_cmd)
  echo '</strong>'
  exit
 fi
}
checkcmd ()
{
  which $1 > /dev/null 2>&1
  if [ $? -eq 0 ]
  then
   found=1
  else
   echo "<strong>$chck</strong> nicht gefunden"
   exit
  fi
}
for i in $(env)
do
 if [ $(echo $i | grep -i '^query_string') ]
 then
  cmd=$(echo $i | awk -Fcommand= '{print $2}' | ./decode.php)
  chck=$(echo $cmd | awk -F" " '{print $1}')
  if [ $check -eq 1 ]
  then
   cmdAllowed $chck
  fi
  checkcmd $chck
  echo '<pre>'
  $cmd
  echo '</pre>'
 fi
done
im File allw_cmd (sollte im gleichen Verzeichnis sein wie die anderen Dateien), kann man die erlaubten Kommandos festlegen. Dabei pro Kommando eine Zeile z.B.
Code:
ps
netstat
ls
route
 
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