Thursday, June 4, 2020

Tripwire-Cronjob deaktivieren

Mitunter installieren Debianpakete Cronjobs in /etc/cron.*, um wiederkehrende Aufgaben auszuführen. Damit solch ein Cronjob (Script) ausgeführt wird, muss das Executable-Bit gesetzt sein. Entfernt man dieses, wird der Cronjob nicht mehr ausgeführt.

Mit dpkg-statoverride(1) kann man sich über Eigentümerschaft und Modus von Dateien hinwegsetzen und damit das Executable-Bit eines Cronjob entfernen:

dpkg-statoverride --add root root 644 /etc/cron.daily/tripwire

Der Vorteil von dpkg-statoverride(1) ist, dass die Hinwegsetzungen auch Paket-Aktualisierungen und -Neuinstallationen überdauern. Was sonst, bei durch die Paketverwaltung verwalteten Dateien, nicht der Fall ist.

Mit dpkg-statoverride --remove <path/to/file> kann man auf diese Weise selbst gesetzte Eigentümerschaft und Modus wieder entfernen und dpkg-statoverride --list listet alle Hinwegsetzungen auf.

PS: Ich habe dies für /etc/cron.daily/tripwire getan, da ich zwar Tripwire installiert habe, damit aber nicht das lokale System überwachen will. Sondern Tripwire nur nutze, um lokal ein anderes entferntes System zu überwachen (diesen Server hier) und mich die lokalen Tripwire Reports stören. Wofür der Cronjob da ist.
Zur Überwachung des entfernten Systems kopiere ich mittels SSH und rsync die Dateien und lasse dann Tripwire drüber laufen, wie im Linux Security Cookbook von O’Reilly gezeigt. Was auch gleichzeitig noch ein Backup sein kann…
Alternativ könnte man wohl auch die lokale Tripwire Policy entsprechend erweitern. Aber das will ich nicht, da mein Workflow etwas anders ist.

Saturday, May 23, 2020

Marc Dutroux, QAnon Pizzagate und das Adrenochrom

Ganz ähnlich der QAnon Pizzagate Verschwörungstheorie und Verleumdungsaktion, vermuten auch Anhänger der Adrenochrom-Verschwörung, dass der „Deep State“ Kinder entführt und foltert (Um Adrenalin im Blut der Kinder herauszuziehen und damit ihren Alterungsprozess zu verlangsamen).

Marc Dutroux [dy’tʁu] (* 6. November 1956 in Ixelles/Elsene in der Region Brüssel) ist ein belgischer Mörder und Sexualstraftäter, der zu lebenslanger Haft verurteilt wurde. Er hat bis Mitte der 1990er-Jahre mehrere Kinder und Jugendliche im Alter von 8 bis 19 Jahren entführt und sexuell missbraucht sowie einen seiner Komplizen und zwei von ihm entführte junge Frauen im Alter von 17 und 19 Jahren ermordet. Zwei entführte achtjährige Mädchen verhungerten eingesperrt, während er im Gefängnis war.

Dutrouxs Komplizin und damalige Ehefrau Michelle Martin wurde zu 30 Jahren Gefängnis verurteilt und ist 2012 nach 16 Jahren verbüßter Strafe entlassen worden. Michel Lelièvre, ein weiterer Komplize von Dutroux, wurde nach 23 Jahren Haft 2019 auf Bewährung entlassen. Bernard Weinstein, ein weiterer Hauptkomplize von Dutroux, wurde von ihm vergiftet.

Wegen eklatanter Fehler bei den Polizeiermittlungen, 27 auf mysteriöse Weise verschwundenen Zeugen und Unstimmigkeiten beim Gerichtsverfahren, wurde von vielen Menschen vermutet, dass Dutroux Teil eines Kinderschänderringes war, dessen Hintermänner nie bestraft wurden. 1996 demonstrierten deswegen 400.000 Belgier in Brüssel gegen das Vorgehen der Behörden im Fall Dutroux beim “Weißen Marsch”.

Theorien über die Hintergründe der Taten

Laut der ZDF-Reportage Die Spur der Kinderschänder – Dutroux und die toten Zeugen von 2001 verstarben in der Zeit zwischen Dutrouxs Verhaftung und dem Prozess 27 Zeugen unter teils mysteriösen Umständen, unter ihnen mehrere Ermittler, die mit dem Fall betraut waren, und weitere Personen, die gegen Dutroux aussagen wollten.[10][11][12] Der Staatsanwalt Hubert Massa, Hauptankläger im Dutroux-Prozess, beging im Juli 1999 Suizid; am Tag zuvor hatte er angeblich vom belgischen Justizminister umfassende Handlungsvollmachten erhalten.[13] Er hinterließ keinen Abschiedsbrief oder andere Hinweise auf den Grund seines Suizids, ein nachvollziehbares Motiv konnte nicht ermittelt werden.[14] Eine Obduktion wurde nicht durchgeführt.[15]

Die Verstrickungen führten zu diversen Theorien darüber, dass Dutroux keineswegs ein Einzeltäter gewesen sein soll, sondern im Auftrag eines Pädophilennetzwerkes gehandelt haben soll, welches Verbindungen bis in höchste belgische Regierungskreise gehabt und eine vollständige Aufklärung des Falls systematisch verhindert habe.[16][17] Die Belgierin Anneke Lucas behauptete im Januar 2017, bereits 1974 von einem Mann gefoltert worden zu sein, der später Mitangeklagter im Dutroux-Prozess gewesen sei, und bestätigte Verbindungen des mutmaßlichen Netzwerkes zu Spitzenbeamten und Kabinettsmitgliedern.[18][19] Auch an der Aufklärung des Falles mitwirkende Personen bestätigten, dass Ermittlungen behindert worden und der Fall bis heute nicht vollständig habe geklärt werden können.[20]

Psychiatrische Bewertung

Ein abschließendes psychiatrisches Gutachten wurde von drei Psychiatern und einem Psychologen erstellt, die am 5. Mai 2004 als Zeugen vor dem Schwurgericht erschienen.[42] Sie kamen zu dem Schluss, dass Dutroux nicht als pädophil einzustufen sei, vielmehr sei er ein gegenüber Gewalt empfindungsloser Psychopath, der aus Machtstreben und Geldgier gehandelt habe, allerdings voll schuldfähig sei.[43][44][45]

Das Machtstreben des Angeklagten äußerte sich auch in einem geltungssüchtigen Auftreten, das er seit seiner Verhaftung an den Tag legte. So erzählte er Geschichten von kleineren oder größeren „Netzwerken“. Cheffahnder Michel hatte vor dem Schwurgericht ausgesagt: „Er freute sich über die gesellschaftliche Aufregung, die seine Affäre verursachte.“[27] Auch hatte Dutroux sich vor seinen Gutachtern wiederholt mit seinen in den 1990er Jahren begangenen Entführungs- und Vergewaltigungstaten gebrüstet.[46] Bei seinem dreistündigen Schlusswort trat Dutroux „hart und anklagend, beleidigt und höhnisch und selbstgerecht“ auf, wobei er ein konfuses „Gespinst aus Lügen, Halbwahrheiten und Manipulationen“ präsentierte.[47]

Das Urteil

Am 22. Juni 2004 gab das Gericht das Strafmaß bekannt: Dutroux musste für drei Giftmorde – an seinem Komplizen Weinstein sowie an den zwei von ihm entführten jungen Frauen Eefje Lambrecks und An Marchal – lebenslänglich ins Gefängnis. Bereits in der Woche zuvor hatten die Geschworenen geurteilt, dass Dutroux die zwei Jugendlichen entführt und getötet habe. Trotz mehrfacher Appelle seines Verteidigers hüllte sich Dutroux, dessen Sexualstraftaten gegenüber den drei Morden in den Verhandlungen nur untergeordnete Bedeutung hatten, über die angeblichen Hintermänner seiner Taten aus Kreisen der Politik weiterhin in Schweigen, obwohl er in den acht Jahren von seinem Geständnis bis zu seiner letzten vor Gericht verlesenen, 21-seitigen Erklärung ständig davon redete,[47] Teil eines größeren Netzwerks gewesen zu sein.

Dutrouxs Ex-Gattin Michelle Martin erhielt 30 Jahre Gefängnis für die fahrlässige Tötung der Mädchen Russo und Lejeune durch Verhungernlassen.

Michel Lelièvre bekam wegen seiner Beteiligung an den Verbrechen eine Haftstrafe von 25 Jahren. Michel Nihoul erhielt eine Gefängnisstrafe von fünf Jahren, weil er Anführer eines Drogen- und Menschenhändlerringes gewesen sei. Vom Vorwurf der Beteiligung an den Frauen- und Kindesentführungen wurde er freigesprochen.

Weiterlesen und Quellen auf Wikipedia.

Die Spur der Kinderschänder – Dutroux und die toten Zeugen - Handlanger der Elite - ZDF Dokumentation

Der Fall Dutroux - WDR Reportage

Monday, May 11, 2020

Headless Browsing mit Chrome in Perl und Selenium::Remote::Driver

#!/usr/bin/env perl

use Data::Dumper;
use Selenium::Chrome;

my $driver = Selenium::Chrome->new(
    'extra_capabilities' => {
        'goog:chromeOptions' => {
            'args' => [
                'disable-gpu',
                'headless',
                'remote-debugging-port=9222',
                'window-size=1260,960',
            ],
        }
    }
);

$driver->get("https://www.google.de");

print Dumper ( $driver->get_title() );

END {
    $driver->shutdown_binary();
}

Port und Fenstergröße sollten frei wählbar sein.

Sunday, May 10, 2020

Tabbed Browsing mit Chrome in Perl und Selenium::Remote::Driver; Neue Browsertabs/Tabs öffnen

Auf der Suche nach einer Lösung wie in Selenium ein neuer Browsertab/Tab geöffnet wird und darin Tests ausgeführt werden können, findet man immer nur den Ansatz, die Tastenkombination CTRL+t an das body HTML-Element zu senden. Aber irgendwie funktioniert das nicht, oder ich habe einen Fehler gemacht.

Hier mal meine Lösung, die für mich funktioniert. Später tue ich es wohl nach https://gist.github.com/1nn3.

#!/usr/bin/env perl

use diagnostics;
use strict;
use utf8;
use warnings;

use Data::Dumper;
use Selenium::Chrome;
use Selenium::Remote::Driver;
use Selenium::Waiter;

my $driver  = Selenium::Chrome->new();
my $stay    = 0;
my @urls    = ( "https://www.golem.de", "https://www.heise.de",
    "https://www.pro-linux.de" );
my ( $page_load, $script, $implicit ) = $driver->get_timeouts();

print Dumper(
    Selenium::Waiter::wait_until {
        $driver->execute_script( "

// Das JavaScript wird auf der Seite ausgeführt, daher hierfür eine leere

function sleep(milliseconds) {
	return new Promise(resolve => setTimeout(resolve, milliseconds));
}

var tabs = [];
for (var i = 0; i < arguments.length; i++) {
	tabs.push(window.open(arguments[i]));
}

//await sleep($stay * 1000);

//for (var i = 0; i < tabs.length; i++) {
//	tabs[i].close();
//}

return tabs.length;
", @urls ) > -1
    },
    timeout  => $stay * 1000 + $script,
    interval => 0,
);

#sleep $stay;

my $handles = $driver->get_window_handles();
for ( my $i = 1 ; $i < scalar(@$handles) ; $i++ ) {

    #print Dumper($handles->[$i]);
    $driver->switch_to_window( $handles->[$i] );
    print Dumper( $driver->get_title() );
    $driver->close();
}

$driver->switch_to_window( $handles->[0] );
print Dumper( $driver->get_title() );

END {
    $driver->shutdown_binary();
}

Friday, March 20, 2020

Selenium: Automatisierung von Webanwendungen

Einstieg in die Automatisierung von Webanwendungen mit Selenium, Perl und Firefox.

Selenium ist ein Framework zur Automatisierung von Webanwendungen im Browser (hier Firefox). Es können damit viele Webseiten-und Blog-Engines automatisiert werden.

Der primäre Einsatzzweck von Selenium ist die Automatisierung von Web-Anwendungen zu Testzwecken. Es kann vor allem Entwicklern von Web-Anwendungen sehr viel Tipparbeit abnehmen – beispielsweise beim Ausfüllen von Webformularen – und macht das Testen von Webanwendungen dadurch schneller, flexibler und verlässlicher.
Aber Selenium ist nicht nur auf Tests beschränkt, auch webbasierte Administrationsaufgaben können (und sollten) damit automatisiert werden.

Selenium automatisiert Web-Browser. Das ist es! Was du mit dieser Kraft machst, liegt ganz bei dir.

Selenium WebDriver installieren

Selenium WebDriver ist der Nachfolger der offiziell abgelehnten Selenium Remote Control. Der Selenium Server (der sowohl von WebDriver als auch von Remote Control verwendet wird) akzeptiert Befehle als Selenese-Kommandos, oder über das Client-API, und leitet sie an den Browser weiter.
Dazu startet Selenium WebDriver den Browser Firefox, installiert die Erweitung webdriver.xpi für WebDriver support und warten am Socket localhost:4444/TCP auf Kommandos.

Eine Anbindung für Perl an das Client-API, ist mit dem CPAN-Modul Selenium::Remote::Driver verfügbar.

Unter Debian ist das Modul (noch) nicht vorhanden und es muss von CPAN installiert werden:

cpan -T -f -i Selenium::Remote::Driver

Wer möchte kann sich auch ein Debianpaket aus dem Modul bauen und dies über die Paketverwaltung installieren (Dazu muss das Paket pkg-perl-tools installiert sein).

env -i DEB_BUILD_OPTIONS="nocheck" cpan2deb Selenium::Remote::Driver

Firefox statt Selenium Standalone-Server verwenden

Sie können das Modul Selenium::Remote::Driver direkt verwenden, um Selenium WebDriver zu starten, es muss nur der entsprechenden Treiber installiert sein. Diese Methode erfordert weder die Installation des
JRE/JDK noch den Selenium Standalone-Server. Es muss nur die entsprechende Klasse für die Treiberkonstruktion verwenden: Selenium::Firefox.

Für Firefox muss der Proxy geckodriver zu installieren. Dieser stellt die vom WebDriver-Protokoll beschriebene HTTP-API für die Kommunikation mit Gecko-Browsern wie Firefox bereit.

Unter Debian kann das Paket firefoxdriver installiert werden:

apt install firefoxdriver firefox-esr

Ansonsten kopiert man das geckodriver Binary auch direkt inPATH und macht es ausführbar.

Ein Beispiel

use Data::Dumper;
use Selenium::Firefox;

my $driver = Selenium::Firefox->new(
  binary => '~/Downloads/geckodirver'
);
$driver->get('http://www.google.com');
print Dumper($driver->get_title);

my $query = $driver->find_element('q', 'name');
$query->send_keys('CPAN Selenium Remote Driver');

my $send_search = $driver->find_element('btnG', 'name');
$send_search->click;

# make the find_element blocking for a second
# to allow the title to change
$driver->set_implicit_wait_timeout(2000);

my $results = $driver->find_element('search', 'id');

print Dumper($driver->get_title);

END {
	$driver->quit;
}

Welche Funktionen das Modul bietet, zeigt die (englischsprachige) Dokumentation: http://search.cpan.org/dist/Selenium-Remote-Driver/

$driver->get

Navigiert zu einer bestimmten URL.

Usage:

$driver->get('http://www.example.net');

$driver->find_element

Sucht nach einem Element (XML/HTML) auf der Seite, ausgehend vom Wurzelelement im DOM-Baum.

Das Element wird als WebElement-Objekt zurückgegeben: http://search.cpan.org/dist/Selenium-Remote-Driver/lib/Selenium/Remote/WebElement.pm

Die Funktion erwartet zwei Argumente:

  1. Das Suchziel: Bezeichner unter dem das Element im Dokument gefunden werden kann
  2. Schema: Dieses Argument istoptional und hat den Standardwert xpath. Es kann eines der folgenden sein: class, class_name, css, id, link, link_text, partial_link_text, tag_name, name oder xpath

Usage:

$driver->find_element("//input[@name='name string']");

Wird kein Element gefunden, bricht das Skript mit einer Fehlermeldung ab. Soll stattdessen nur eine Warnung ausgegeben werden, muss eine der folgenden Funktionen benutzt werden:

  • find_element_by_class
  • find_element_by_class_name
  • find_element_by_css
  • find_element_by_id
  • find_element_by_link
  • find_element_by_link_text
  • find_element_by_name
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_xpath

Daneben gibt es noch die Funktion $driver->find_child_element. Diese sucht nach einem Element beginnend, ab einem anderen Element als Startpunkt im DOM-Baum. Die Funktion erwartet zwei Argumente:

  1. WebElement-Objekt: Startpunkt der Suche im DOM-Baum.
  2. Das Suchziel: Bezeichner unter dem das Element gefunden werden kann.

In einer XPath-Angabe darf keine absolute Angabe verwendet werden, um nach Kind-Elementen zu suchen. Verwenden Sie stattdessen die relative Angabe.

Usage:

my $start_element = $driver->find_element("//select[@name='ned']");
# note the usage of ./ when searching for a child element instead of //
my $child = $driver->find_child_element($start_element, "./option[@value='es_ar']");

Statt nur nach einem Element (dem ersten) zu suchen, kann auch nach allen Elementen, die auf das Suchmuster passen, gesucht werden. Dazu bietet das Modul die folgenden zwei Funktionen:

  • find_elements
  • find_child_elements

Diese funktionieren analog zu den oben genannten Funktionen, geben aber eine Liste der gefundenen Elemente zurück.

$element->send_keys

Sendet eine Sequenz von Tastendrücken an das Element.

Usage:

$element->send_keys('A', 'B', 'C', "Text");

Um spezielle Tastatur-Ereignisse zu senden, muss das Modul WDKeys benutzt werden:

use Selenium::Remote::WDKeys; # include the WDKeys module
$element->send_keys(KEYS->{'space'}, KEYS->{'enter'});

Alle verfügbaren Tastatur-Ereignisse sind unter https://github.com/teodesian/Selenium-Remote-Driver/blob/master/lib/Selenium/Remote/WDKeys.pm#L17 definiert.

$element->click

Klickt auf das Element.

Usage:

$element->click();

$element->get_attribute

Gibt den Wert eines Attributs zurück.

Die Funktion erwartet als Argument, den Namen des Attributs.

Usage:

my $attribute = $element->get_attribute('attribute name');

$element->get_text

Gibt den Wert von innerText/textContent zurück.

Usage:

my $text = $element->get_text;

XML Path Language (XPath)

XPath wird verwendet, um durch die Elemente und Attribute - dem sog. Document Object Model (DOM) - eines XML-Dokument zu navigieren. Es ist ein Teil des W3C XSLT-Standards. Siehe auch:

Zum untersuchen des DOM und erstellen von XPath-Angaben, eigenen sich die Firefox Erweiterungen/Add-ons FireXPath und Firebug.

Neuere Versionen von Firefox vereinen vieles im Add-on Web Developer und dann unter dem Menüpunkt Element untersuchen des Kontext-Menüs.

Formulardetails anzeigen lassen

Um die Bezeichner von Formularfeldern herauszufinden, eignet sich ebenfalls das Firefox Add-on Web Developer.

Headless browsing (Xvfb)

Mit dem Paket xvfb, können die Skripts auch headless ausgeführt werden. Xvfb stellt dazu einen X-Server zur Verfügung, welcher auf einem Computer ohne Anzeige usw. läuft.

Das Skript muss dann über den Wrapper xvfb-run gestartet werden:

xvfb-run --auto-servernum <script.pl> [OPTIONS…]

In Skripten kann auch folgender Shebang genutzt werden:

#!/usr/bin/env -S xvfb-run --auto-servernum perl

Und für Cronjob empfiehlt sich der Shebang:

#!/usr/bin/env -S lckdo -q filename.lock chronic xvfb-run -a sh

Dies legt die Lockdatei ~/filename.lock an und sperrt so das Skript um eine doppelte Ausführung zu unterbinden. Außerdem erfolgt eine Ausgabe nur im Fehlerfehl.

Cookies speichern und wieder setzen

use Storable qw(store retrieve);
use Fcntl 'O_RDONLY', 'O_RDWR', 'O_CREAT';
my $cookies_path = "./cookies";
# Cookies öffnen
my $cookies = ( -r $cookies_path ) ? retrieve($cookies_path) : [];
for ( @{$cookies} ) {
    eval {
        $_->{secure}   = 0;    # overwrite
        $_->{httponly} = 0;    # overwrite

        $driver->add_cookie(
            $_->{name},   $_->{value},  $_->{path},
            $_->{domain}, $_->{secure}, $_->{httponly}
        );
    };
    @_ && warn @_;
}

# Cookies speichern
store( $driver->get_all_cookies, $cookies_path );

Weblinks