Dienstag, 19. Januar 2016

Spion im Wohnzimmer - Offene Webcams finden

Viele Webcams sind über das Internt frei zugänglich und haben oft gar keinen oder nur einen sehr einfachen Schutz vor fremden Zugriffen.

Es gibt Möglichkeiten diese mit einigen Suchbegriffen über Google zu finden oder man verwendet  spezielle Suchmaschinen für diesen Fall. Eine davon ist zum Beispiel SHODAN.
https://www.shodan.io/search?query=webcam
Hier findet man schnell tausende Webcams ohne Passwortschutz und viele lassen sich mit einem einfachen Angriff hacken. Zum Beispiel:

  • User: admin PW: admin
  • User: admin PW: 1234 

Mittwoch, 13. Januar 2016

Raspberry Pi - Monitoring mit MRTG und Temperatursensor DS18B20

Mit Hilfe des Programms MRTG (Multi Router Traffic Grapher) und RRD (Round-Robin-Database) lassen sich unter Linux sehr schnell grafische Auswertungen und Darstellungen von Messwerten erstellen. Es können HTML Seiten mit Grafiken erstellt werden.

Falls man direkten Zugriff über den Browser auf die Dateien haben möchte, sollte vorher auf dem Pi noch ein Webserver installiert werden. Dafür kann man den Apache2 oder auch den Lighttpd verwenden.

Siehe hierzu auch http://sebastianhemel.blogspot.de/2015/09/raspberry-pi-webserver-installieren.html

 

Installation & Konfiguration von MRTG/RRD/SNMP:


Installation der benötigten Pakete für MRTG und RRD.
sudo apt-get install mrtg mrtg-rrd rrdtool snmp snmpd
Anschließend kommt die Frage, ob root der Eigentümer der Datei /etc/mrtg.cfg sein soll. Hier sollte NEIN ausgewählt werden.

Anschließend muss ein Verzeichnis angelegt werden, in dem die RRD Datenbank und die PNG-Grafiken abgelegt werden können. Dies muss im öffentlichen WWW-Ordner vom Webserver erfolgen.
/var/ $ sudo mkdir www
/var/www $ sudo mkdir mrtg
Anschließend hat man die folgende Ordner-Struktur:
/var/www/mrtg
Jetzt müssen wir noch das cgi-bin Verzeichnis erstellen, auch dieses liegt im WWW-Ordner. Nun kann ein Symlink (https://de.wikipedia.org/wiki/Symbolische_Verknüpfung) zur mrtg-rrd.cgi erstellt werden. Hierrüber kann dann später die generierte HTML-Seite aufgerufen.
sudo mkdir -p /var/www/cgi-bin
sudo ln -s /usr/lib/cgi-bin/mrtg-rrd.cgi /var/www/cgi-bin/mrtg-rrd.cgi
Im Nachgang müssen nun die Rechte für den Lighttpd-Benutzer und die Gruppe gesetzt werden:
sudo chown -R www-data:www-data /var/www/*
Da es bei SNMP noch einen Fehler gibt, siehe auch http://penguinbliss.com/?p=239, muss noch die folgende Datei angepasst werden:
sudo sed -i 's|import Socket6;|Socket6->import(qw(inet_pton getaddrinfo));|' /usr/share/perl5/SNMP_Session.pm
Bevor wir mit der Erstellung des Diagramms starten, sollte von der "alten" mrtg.cfg eine Sicherheitskopie angelegt werden.
sudo mv /etc/mrtg.cfg /etc/mrtg.cfg.bak

 

Temperaturwerte für RRD bereitstellen

Hierzu wird ein Skript benötigt. Diese kann man z.B. im Home-Verzeichnis ablegen.
mkdir ~/graph
temp-mrtg-update.sh (wget https://www.shemel.de/download/raspberry/temp-mrtg-update.sh)

#!/bin/sh
# Temperatur von Sensor auslesen
# (c) Sebastian Hemel

sensor="/sys/bus/w1/devices/28-00000511590a/w1_slave"
if [ -f $sensor ]
then
        sensorraw=`cat $sensor`
        crc=`echo $sensorraw | cut -f2 -d= | cut -c4-6`
        if [ "$crc" = "YES" ]
        then
                tempraw=`echo $sensorraw | cut -f3 -d=`
                temp=`echo "scale=3; $tempraw / 1000" | bc`
                #temp=`echo "scale=2; $tempraw / 1000" | bc`

                # Update database
                #echo $temp
                printf "%04.2f" $temp
                echo 0
                echo 0
                echo temperature
        fi
fi
 

Die Datei muss ausführbar sein:
chmod 750 /home/pi/graph/temp-mrtg-update.sh
Es ist zu beachten, dass die ID eures Sensors hinterlegt werden muss!

Das Script sollte die folgenden Werte liefern:
pi@pi-ingolstadt ~/graph $ ./temp-mrtg-update.sh
3.560
0
temperature

 

Erstellen des Diagramms vom Temperatursensor:


Zu Beginn muss eine neue mrtg.cfg erstellt werden, dies erfolgt mit dem Befehl:
sudo cfgmaker --global "Options[_]: growright" --global "IconDir: /mrtg" --global "WriteExpires: Yes" --global "Language: german" --global "RunAsDaemon: yes" --global "EnableIPv6: no" --global "LogFormat: rrdtool" --global "Interval: 1" '--if-filter=$if_admin && $default_iftype' --output /etc/mrtg.cfg public@localhost
Jetzt kann der folgende Teil in die sudo nano /etc/mrtg.cfg übernommen werden:

### Global Config Options

#  for UNIX
# WorkDir: /home/http/mrtg

#  for Debian
HtmlDir: /var/www/mrtg
WorkDir: /var/www/mrtg
Imagedir: /var/www/mrtg

#  or for NT
# WorkDir: c:\mrtgdata

### Global Defaults
#  to get bits instead of bytes and graphs growing to the right
# Options[_]: growright, bits

EnableIPv6: no
Options[_]: growright
IconDir: /mrtg
WriteExpires: Yes
Language: german
RunAsDaemon: yes
EnableIPv6: no
LogFormat: rrdtool
Interval: 1


#####################################################################
# System: DS18S20 Temperatur Sensor
# Contact: root
# Location: attached to Raspberry Pi
#####################################################################
### DS18S20 Temperatur SensorIngolstadt
TimeStrPos[temp_ingolstadt]: RU
Target[temp_ingolstadt]: `/home/pi/graph/temp-mrtg-update.sh`
Options[temp_ingolstadt]: gauge,growright,nopercent,expscale,transparent
Title[temp_ingolstadt]: Temperatur Ingolstadt
PageTop[temp_ingolstadt]: <h1>Temperatur Ingolstadt</h1>
MaxBytes[temp_ingolstadt]: 60
#Unscaled[temp_ingolstadt]: ymwd
Step[temp_ingolstadt]: 60
Legend1[temp_ingolstadt]: Gemessene Temperatur in Ingolstadt
LegendI[temp_ingolstadt]: Aussentemperatur
LegendO[temp_ingolstadt]:
YLegend[temp_ingolstadt]: Grad Celsius
ShortLegend[temp_ingolstadt]: Grad °C

Die restlichen Einträge habe ich auskommentiert, da ich nur das Temperatur Diagramm haben möchte.

Bei Bedarf können noch die MRTG-Icons in den WWW Ordner vom Webserver kopiert werden:
sudo cp /usr/share/mrtg/* /var/www/mrtg/
Jetzt kann durch Starten von MRTG überprüft werden, ob die Konfiguration erfolgreich durchgeführt wurde.
sudo env LANG=C /usr/bin/mrtg /etc/mrtg.cfg
Möchte man MRTG erneut starten, muss vorher der bestehende Prozess (Prozess-ID siehe auch /etc/mrtg.pid) beendet werden:
ps -aux | grep mrtg
sudo kill -9 16391
sudo env LANG=C /usr/bin/mrtg /etc/mrtg.cfg

Probleme mit negativen Temperaturwerten beheben

Da MRTG keine negativen Werte erlaubt, kann man diese nachträglich (mit rrdtool) mit dem folgenden Befehlen im Verzeichnis /var/www/mrtg anpassen.
sudo rrdtool tune temp_ingolstadt.rrd --minimum ds0:-20
sudo rrdtool tune temp_ingolstadt.rrd --minimum ds1:-20
Jetzt werden Temperaturen bis - 20 Grad Celsius unterstützt.

Der Aufruf des Diagramms erfolgt über den Browser http://192.168.1.110/cgi-bin/mrtg-rrd.cgi

Hinweise: Kommt es beim Aufruf der Datei zu einem "500 - Internal Server Error", wurden die Rechte chmod +x nicht gesetzt. Führte dies nicht zum Erfolg, sollte man die syslog Datei auslesen. Dies geht mit dem Befehl /var/log $ tail -f syslog . Erscheint hier die Meldung "Can't locate CGI.pm in @INC (you may need to install the CGI module)", muss noch das folgenden Paket installiert werden: sudo apt-get install libcgi-pm-perl 

Achtung es gibt ein Fehler im mrtg-rrd Package: https://bugs.launchpad.net/ubuntu/+source/mrtg-rrd/+bug/1618800

Nov  1 13:49:34 raspberrypi lighttpd[538]: Can't use an undefined value as an ARRAY reference at /var/www/cgi-bin/mrtg-rrd.cgi line 499.

Ich musste folgende Zeilen der "mrtg-rrd.cgi" anpassen:
Hinweis: Vorher am Besten den MRTG Prozess wieder beenden (siehe oben).

Aug  7 21:49:01 raspberrypi-zero lighttpd[461]: Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at /var/www/cgi-bin/mrtg-rrd.cgi line 499.
#       return @{$target->{args}} if defined @{$target->{args}};
        return @{$target->{args}} if ($target->{args} && @{$target->{args}});

Aug  7 21:52:28 raspberrypi-zero lighttpd[461]: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at /var/www/cgi-bin/mrtg-rrd.cgi line 525.

#        %{$target->{options}} = ()
#                unless defined %{$target->{options}};           
         %{$target->{options}} = ()
                unless ($target->{options} && %{$target->{options}});   
           
Aug  7 21:58:11 raspberrypi-zero lighttpd[461]: Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at /var/www/cgi-bin/mrtg-rrd.cgi line 914.
       
#        if (defined @{$directories{$dir}{subdir}}) {
#                $subdirs_printed = 1
         if ($directories{$dir}{subdir} && @{$directories{$dir}{subdir}}) {
                $subdirs_printed = 1;
               
Aug  7 22:01:35 raspberrypi-zero lighttpd[461]: Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at /var/www/cgi-bin/mrtg-rrd.cgi line 929.

#        if (defined @{$directories{$dir}{target}}) {
         if ($directories{$dir}{subdir} && @{$directories{$dir}{subdir}}) {




Bei Bedarf kann das Diagramm noch auf einen anderen Server hochgeladen werden:

crontab -e: Aufruf per localhost, damit die temp_ingolstadt-day.png Datei erstellt wird (alle 7min).
*/7 *    *   *   *     curl http://localhost/cgi-bin/mrtg-rrd.cgi/temp_ingolstadt.html >/dev/null 2>&1

temp.sh: anpassen, siehe auch http://sebastianhemel.blogspot.de/2015/01/temperatursensor-ds18b20-raspberry-pi.html
ncftpput -f /home/pi/ftp.cfg /temp /var/www/mrtg/temp_ingolstadt-day.png


Danke an das Tutorial von http://kopfkino.irosaurus.com/tutorial-monitoring-mit-mrtg-rrd-support-auf-raspberry-pi-debian-wheezy, welches als Basis für diesen Eintrag diente.