Im Juli beschloss der Sicherheitsforscher Vladimir Smitka, das Internet auf offene .git
Ordner zu ĂŒberprĂŒfen, nachdem kĂŒrzlich ein Ă€hnliches Audit fĂŒr tschechische und slowakische Internetdomains durchgefĂŒhrt worden war.

Wie das Sprichwort sagt: "Es ist nie passiert, und hier ist es wieder." Ich möchte Sie daran erinnern, dass vor 9 Jahren genau das gleiche mit dem russischen Segment des Internets zu .svn
das vom offenen .svn
Syndrom betroffen war. Das Folgende sind die Ergebnisse der sorgfÀltigen Arbeit eines tschechischen Forschers, Werkzeuge und Methoden.
GrĂŒnde fĂŒr die SicherheitslĂŒcke
Ein Angreifer kann aus dem .git
Verzeichnis viele wichtige Informationen fĂŒr die Sicherheit der Site .git
. So sieht ein typischer Projektbaum aus.
âââ HEAD âââ branches âââ config âââ description âââ hooks â âââ pre-commit.sample â âââ pre-push.sample â âââ ... âââ info â âââ exclude âââ objects â âââ info â âââ pack âââ refs âââ heads âââ tags
Dort können Kennwörter und ZugriffsschlĂŒssel fĂŒr verschiedene APIs, Datenbanken und Cloud-Dienste gespeichert werden.
Wie es sein sollte, .git
ein Versuch, den Ordner .git
zu öffnen, hÀufig einen HTTP 403-Fehler aus. Der Grund ist jedoch nur das Fehlen von index.html / index.php
und die Rechte zum automatischen Indizieren des Ordners, solange einzelne Dateien noch verfĂŒgbar sind . Um sicherzustellen, dass die Site nicht anfĂ€llig ist, sollten Sie die Seite /.git/HEAD
öffnen.
Diese Datei enthÀlt einen Link zum aktuellen Projektzweig.
$ cat .git/HEAD ref: refs/heads/master
Selbst wenn die automatische Indizierung von Verzeichnissen deaktiviert ist, können Sie den gesamten .git
Ordner problemlos wiederherstellen, indem Sie einzelne Dateien herunterladen und AbhĂ€ngigkeiten vom Prozessor fĂŒr regulĂ€re AusdrĂŒcke ermitteln, da die .git
Struktur klar definiert ist. Es gibt auch ein spezielles Tool - GitTools , das automatisch alle erforderlichen Aktionen ausfĂŒhrt .
Produktionsmittel
Trotz der KomplexitĂ€t und Ehrgeiz der Aufgabe waren die Kosten in Bezug auf Geld bescheiden. FĂŒr alles, fĂŒr alles, brauchte es 250 US-Dollar.
Server
Smithka mietete fĂŒr das Projekt 18 VPS und 4 physische Server. Ihm zufolge fiel seine Wahl nicht auf AWS, da die vollen Kosten des Dienstes unter BerĂŒcksichtigung des erwarteten gigantischen Verkehrsaufkommens, des erheblichen Speicherplatzes und der hohen CPU-Auslastung nicht einfach berechnet werden konnten. Der Preis fĂŒr gemietete VPS wurde im Voraus bekannt gegeben.
Liste der Domains
Die Liste basiert auf den Textprotokollen des OpenData Rapid7- Projekts im JSON
.
DNS-Datenbankschema weiterleiten { "$id": "https://opendata.rapid7.com/sonar.fdns_v2/", "type": "object", "definitions": {}, "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "timestamp": { "$id": "/properties/timestamp", "type": "string", "description": "The time when this response was received in seconds since the epoch" }, "name": { "$id": "/properties/name", "type": "string", "description": "The record name" }, "type": { "$id": "/properties/type", "type": "string", "description": "The record type" }, "value": { "$id": "/properties/value", "type": "string", "description": "The response received for a record of the given name and type" } } }
Nach einigen Filtern von TLDs und DomĂ€nen der zweiten Ebene hatte die Liste immer noch ĂŒber 230 Millionen EintrĂ€ge .
Als nÀchstes wurde die Datenbank in Blöcke von 2 Millionen DatensÀtzen aufgeteilt und die Last wurde unter Verwendung einer PHP-Anwendung auf verschiedene Server verteilt.
Software
Python hing an den asynchronen asynchronen Kommunikationsbibliotheken mit aiohttp als Arbeitstier . Ein Versuch, Requests und Urllib3 fĂŒr diese Zwecke zu verwenden, war erfolglos. Ersteres war möglicherweise geeignet, aber der Forscher verstand die ZeitĂŒberschreitungen in der Dokumentation nicht. Der zweite hat die Domain-Umleitung nicht bewĂ€ltigt und hat daher den Speicher auf den Servern ziemlich bald erschöpft.
Um die Plattform und das Profil anfĂ€lliger Websites zu identifizieren, verwendete Smitha das WAD- Dienstprogramm, das auf der Wappalyzer- Datenbank basiert - eine Erweiterung fĂŒr den Webbrowser, mit der Sie die auf der Seite verwendeten Technologien ermitteln können.
Einfache Befehlszeilenprogramme wie GNU Parallels
wurden ebenfalls verwendet, um die AusfĂŒhrungszeit des Handlers zu beschleunigen und zu verhindern, dass das Skript aufgrund eines Einfrierens angehalten wird.
cat sites.txt | parallel --bar --tmpdir ./wad --files wad -u {} -f csv
Ergebnisse
Der Scan dauerte 2 Wochen, als Ergebnis der Forscher:
- entdeckte 390.000 gefÀhrdete Websites;
- 290 Tausend E-Mail-Adressen gesammelt;
- 90.000 EmpfĂ€nger ĂŒber die gefundene SicherheitsanfĂ€lligkeit informiert.
Als Antwort auf seine BemĂŒhungen erhielt Smithka:
- 18 Tausend Fehler bei der NachrichtenĂŒbermittlung;
- etwa 2000 Dankesbriefe;
- 30 Fehlalarme mit Honeypot-Systemen;
- 1 Drohung, die kanadische Polizei anzurufen;

Die beliebteste Programmiersprache war PHP . Wenn Sie das Ergebnis jedoch auf den relativen Anteil eines bestimmten PL normalisieren, weicht PHP dem Vorsprung von Python und Node.js. Es ist jedoch nicht klar, wie zuverlÀssig solche Statistiken zur Bestimmung des Marktanteils einer bestimmten Programmiersprache sein können.
Apache steht ganz oben auf der Liste der Beliebtheit von Webservern, wobei Nginx an zweiter Stelle steht und der chinesische Klon Nginx Tengine plötzlich an dritter Stelle steht.
Das beliebteste Betriebssystem war Ubuntu , dann Debian und CentOS auf dem dritten Platz.

Die CMS-Nominierung stellte sich fast als Einzelschauspieler heraus, und dieser Schauspieler ist WordPress mit 85% aller gefundenen Plattformen.
Was kommt als nÀchstes?
Das Reparieren einer SicherheitsanfÀlligkeit ist einfach.
.htaccess
RewriteRule "(^|/)\.(?!well-known\/)" - [F]
.nginx
location ~ /\.(?!well-known\/) { deny all; }
apache22.conf
<Directory ~ "/\.(?!well-known\/)"> Order deny,allow Deny from all </Directory>
apache24.conf
<Directory ~ "/\.(?!well-known\/)"> Require all denied </Directory>
Caddyfile
status 403 /blockdot rewrite { r /\.(?!well-known\/) to /blockdot }