Abenteuer in S3 Scraping – Teil 1

Nov 29 2022
Sie würden nicht glauben, welche seltsamen Dateien die Leute in S3-Buckets teilen. Dinge, die sie wahrscheinlich nicht sollten.

Sie würden nicht glauben, welche seltsamen Dateien die Leute in S3-Buckets teilen. Dinge, die sie wahrscheinlich nicht sollten. Dinge, die sie definitiv nicht sollten.

AWS, S3

Erst diesen Monat habe ich Dateien gesehen wie:

  • Lizenzschlüssel für die Software eines Unternehmens.
  • Excel-Dokument einer medienbezogenen Konferenz mit Namen, E-Mail-Adressen und Telefonnummern lokaler Medienmitarbeiter in 9 verschiedenen Bundesstaaten.
  • Powerpoint-Dokument für eine lateinamerikanische Abteilung eines großen Technologieunternehmens mit der Aufschrift „Proprietary and Confidential“ (mein Spanisch ist etwas eingerostet), von dem ich glaube, dass es Kosten/Gebühren/Margen für vorgeschlagene Dienstleistungen auflistet.
  • 45.000–50.000 PDF-Dokumente mit personenbezogenen Daten von Kunden (vollständige Namen, E-Mail-Adressen, Telefonnummern und Standorte) für ein Unternehmen, das in den letzten 2 Jahren seine Geschäftstätigkeit eingestellt hat. (Ich habe den Bucket dem AWS-Support gemeldet und werde das Problem ausführlicher besprechen, WENN sie Maßnahmen ergreifen und die Daten in naher Zukunft schützen.)
  • Hochauflösender Scan des Führerscheins, der Versicherungskarte und der Fahrzeugregistrierung einer Person aus den Jahren 2015–2016. (In einem Versuch des Anstands habe ich versucht, diese Person zu kontaktieren, indem ich sie auf LinkedIn und Google nachgeschlagen habe, nur um jemanden mit demselben Namen, Geburtsdatum und derselben Adresse zu finden, der 2021 wegen eines ziemlich schweren Verbrechens verurteilt wurde und nun eine Strafe absitzt Ich werde nicht den Schlaf verlieren, weil seine 7 Jahre alten Dokumente im Internet da draußen sind).

Ich bin in den letzten 10 Jahren davon ausgegangen, dass die Leute besser ausgerüstet sind und über bessere Werkzeuge verfügen, um ihre Inhalte zu sperren und nur das zu teilen, was geteilt werden sollte. Ich lag falsch. Warum sich also die Mühe machen, diese Aktivität 10 Jahre später zu wiederholen? Für Spaß und Bewusstsein. Es ist auch schon ein paar Jahre her, seit ich eine nennenswerte Menge an Code geschrieben habe, also wollte ich einige Fähigkeiten überdenken und schärfen.

Wie können Sie die Dateien eines Buckets anzeigen?

Zuerst wollte ich vorhandene S3-Buckets identifizieren, die möglicherweise in einer bestimmten AWS-Region (USA-Ost, USA-West usw.) vorhanden sind. Wenn ich einen gültigen Namen für einen Bucket hätte, könnte ich ihn in einem Webbrowser ausprobieren und Sehen Sie, ob der Inhalt des Eimers aufgelistet ist. Das bedeutet nicht, dass die Dateien selbst angezeigt werden können, aber lassen Sie mich zumindest die Dateipfade für die zukünftige Untersuchung dieser Dateien sehen.

Wenn beispielsweise der Bucket-Name „MyObviousFakeBucket“ öffentlich sichtbar wäre und sich in der AWS-Region „US East 1“ befindet, könnten Sie möglicherweise den Inhalt in Ihrem Webbrowser sehen, indem Sie https://myobviousfakebucket.s3.us-east-1 besuchen. amazonaws.com/

Dies würde eine Auflistung ähnlich dem folgenden teilweise redigierten Bild zurückgeben.

Dateien, die im myoffensichtlich gefälschten Bucket S3-Bucket enthalten sind.

In dem daraufhin angezeigten XML-Dokument sehen Sie unter jedem „Contents“-Tag Dateieinträge. Für jeden „Contents“-Knoten gibt es einen
„Key“-Knoten, der den Dateipfad und den Namen jeder Datei anzeigt. Daher könnten Sie für die Datei „interesting-text-file.txt“ möglicherweise den Zugriff auf die Datei testen, indem Sie den Pfad wie folgt an das Ende der Bucket-URL anhängen:

https://myobviousfakebucket.s3.us-east-1.amazonaws.com/interesting-text-file.txt

Wenn die Datei angezeigt werden konnte, wurde sie im Browser geöffnet oder ein automatischer Download ausgelöst (abhängig vom Dateityp und Ihrem Browser). Wenn Sie keinen Zugriff hatten, würden Sie ein XML-Ergebnis sehen, das im Wesentlichen eine „Zugriff verweigert“-Meldung zeigt.

Trotz aller Bemühungen von AWS gibt es immer noch Leute, die Inhalte öffentlich sichtbar machen, obwohl sie dies nicht sollten. Ich habe seit ein paar Jahren nicht mehr mit S3 gearbeitet, daher fehlt mir vielleicht etwas, aber es scheint MEHRERE Schritte zu geben, bevor Ihr Bucket einfach aufgezählt und in einem Webbrowser angezeigt werden kann.

Beim Erstellen eines neuen Buckets ist standardmäßig „Alle öffentlichen Zugriffe blockieren“ aktiviert. Sie müssen es deaktivieren und dann das Kontrollkästchen „Ich bestätige“ weiter unten aktivieren. Siehe unten.

Datenschutzeinstellungen für den neuen S3-Bucket.

Selbst wenn mein Bucket so konfiguriert war, dass er nicht den gesamten öffentlichen Zugriff blockierte, als ich zwei Beispieltextdateien hinzufügte, konnte ich den Bucket-Inhalt immer noch nicht in meinem Webbrowser auflisten, bis ich eine JSON-Bucket-Richtlinie hinzufügte, die ausdrücklich öffentlichen Zugriff gewährte.

{
    "Version": "2012-10-17",
    "Id": "Policy1669653712601",
    "Statement": [
        {
            "Sid": "Stmt1669653708988",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::myobviouslyfakebucket"
        }
    ]
}

Gesamtkonzept

Wie listet man also Eimerinhalte auf, ohne zufällig zu raten? Meine beiden wichtigsten Optionen, um dies über einen einzelnen Bucket-Namen meiner eigenen Erfindung hinaus zu erreichen, waren die Verwendung einer Wörterbuchdatei, die entweder mit dem AWS SDK oder einfachen HTTP GETs gepaart ist.

Ich habe mich entschieden, Java-Code mit einfachen HTTP-GETs für eine erste Version zu schreiben. Dadurch wurde das Erlernen des aktualisierten AWS Java SDK v2 überflüssig. Das letzte Mal, als ich das AWS Java SDK verwendet habe, war es in v1 und es hat sich so viel geändert, dass ich nicht wollte, dass eine Lernkurve meinen Fortschritt verzögert. Ich konnte auch die Notwendigkeit vermeiden, AWS-Anmeldeinformationen einzurichten, um das SDK zu verwenden, und alle SDK-spezifischen Fehler oder Kuriositäten, die während des Tests aufgetreten sind. Halte es einfach.

Ich begann mit einer vorhandenen Wörterbuchdatei, die ich aus einem früheren persönlichen Projekt hatte. Dies war eine flache Textdatei mit einem Wort pro Zeile. Irgendwann habe ich es in 8 oder 10 separate Dateien aufgeteilt, wobei jede Datei die Einträge für 1–3 Buchstaben enthält, abhängig von der Anzahl der Einträge. Dadurch konnte ich eine kleinere Anzahl von Einträgen gleichzeitig einfacher verarbeiten. Sie können online nach einer Wörterbuchdatei suchen, da viele verfügbar sind.

Ich skizzierte die Schritte, die ich zum Programmieren benötigte, auf 2 Haftnotizen. Sie waren wie folgt:

  • Analysieren Sie die Wörterbuchdatei, um jeden Worteintrag abzurufen.
  • Erstellen Sie für jedes Wort in der Liste die zu überprüfende URL, indem Sie das Wort als Bucket-Name und die AWS-Region verwenden (vorerst fest auf „US East 1“ codiert).
  • Versuchen Sie, eine Verbindung zur URL herzustellen, um eine GET-Operation auszuführen.
  • Rufen Sie den vom Server gesendeten Antwortcode ab.
  • Wenn der Antwortcode Erfolg anzeigte (der Bucket existiert), füge das Wort einer Datenstruktur hinzu.
  • Speichern Sie die erfolgreichen Wörter in der Datenstruktur zur späteren Untersuchung in einer flachen Textdatei.

Analysieren Sie die Wörterbuchdatei

private void populateList(List<String> words, String dictionaryFile) {

   BufferedReader br = null;
   try {
      br = new BufferedReader(new FileReader(new File(dictionaryFile)));
      String line;
      while ((line = br.readLine()) != null) {
         words.add(line);
      }

   } catch (Exception e) {
      e.printStackTrace();
   } finally {
      try {
         if (br != null) {
            br.close();
         }
      } catch (Exception e) { }
   }
}

Erstellen Sie die URL

String currentRegion = "us-east-1";
int wordSize = words.size();

for (int i = 0; i < wordSize; i++) {

   String bucketName = words.get(i);
   
   String sUrl = "https://" + bucketName + ".s3." + currentRegion + ".amazonaws.com";
   URL url = new URL(sUrl);

   // do something with the URL
}

Führen Sie eine GET-Operation durch

String sUrl = "https://" + bucketName + ".s3." + currentRegion + ".amazonaws.com/";
URL url = new URL(sUrl);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();

Rufen Sie den Antwortcode ab und speichern Sie ihn

int respCode = connection.getResponseCode();

if (respCode == 200) {
   code200s.add(bucketName + "," + currentRegion);
}

Speichern Sie die gültigen Bucket-Namen

private void writeCode200s(List<String> validBuckets, String parentDirectory) {

   if(validBuckets == null || validBuckets.isEmpty()) {
      return;
   }
        
   BufferedWriter bw = null;
   
   try {
      File parentDirectory = new File(parentDirectory);
      if (!parentDirectory.exists()) {
         parentDirectory.mkdirs();
      }

      FileWriter writer = new FileWriter(new File(parentDirectory, "valid_buckets_" + System.currentTimeMillis()+ ".txt"));
      bw = new BufferedWriter(writer);
      
      for (int i = 0; i < validBuckets.size(); i++) {
         String bucketName = validBuckets.get(i);

         bw.write(bucketName);
         bw.newLine();
      }

   } catch (Exception e) {
      e.printStackTrace();
   } finally {
      try {
         if (bw != null) {
            bw.close();
         }
      } catch (Exception e) { }
   }
}

Das ist es. Einfach und unkompliziert. Es ist vielleicht nicht die eleganteste Lösung, aber es hat funktioniert und war eine Basis, um es mir zu ermöglichen, es zu erweitern und zu verbessern. Ich habe Tausende gültiger S3-Buckets identifiziert, indem ich einfach mehrere Buchstaben des Alphabets abgekratzt habe. Bereits bei meinen ersten Versuchen habe ich Kataloge mit MP3-Dateien, Millionen von Bildern, unzählige Protokolldateien und mehr gefunden.

Ich habe seitdem meinen Test-Bucket „myobviousfakebucket“ gelöscht, also zögern Sie nicht, den Namen zu beanspruchen, wenn Sie ihn wollen. In den nächsten Teilen dieser Artikelserie werde ich zusätzliche Schritte zur Verbesserung dieser Lösung hervorheben, wie zum Beispiel:

  • Handhabung und Speicherung von Antwortcodes für Buckets außer 200 (OK) und was sie bedeuten und was Sie mit diesen Informationen tun können.
  • Verwenden Sie die Liste der gültigen Bucket-Namen, um zu sehen, ob Sie die Liste der Dateien in diesem Bucket aufzählen können.
  • Analysieren der Liste der Bucket-Dateien, um den Pfad und Namen einzelner Dateien zu erfassen.
  • Filtern Sie Dateien nach Dateierweiterung, um unerwünschtes Rauschen zu ignorieren.
  • Paginieren von Dateiergebnissen für S3-Buckets mit mehr als 1000 Dateien.
  • Überprüfen von Dateilisten, um festzustellen, ob einzelne Dateien heruntergeladen werden können.