Petualangan di Scraping S3 — Bagian 1
Anda tidak akan percaya dengan file aneh yang dibagikan orang di bucket S3. Hal-hal yang seharusnya tidak mereka lakukan. Hal-hal yang seharusnya tidak mereka lakukan .

Baru bulan ini saya melihat file seperti:
- Kunci lisensi untuk perangkat lunak perusahaan.
- Dokumen Excel dari konferensi terkait media yang berisi nama, email, dan nomor telepon karyawan media lokal di 9 negara bagian berbeda.
- Dokumen Powerpoint untuk divisi Amerika Latin dari sebuah perusahaan teknologi besar bertanda "Proprietary and Confidential" (Bahasa Spanyol saya agak berkarat) yang menurut saya mencantumkan biaya/biaya/margin untuk layanan yang diusulkan.
- 45.000–50.000 dokumen PDF yang berisi PII pelanggan (nama lengkap, alamat email, nomor telepon, dan lokasi) untuk perusahaan yang gulung tikar dalam 2 tahun terakhir. (Saya telah melaporkan bucket tersebut ke AWS Support dan akan membahas masalah ini secara lebih mendetail JIKA mereka mengambil tindakan dan melindungi data dalam waktu dekat.)
- Pemindaian resolusi tinggi SIM, kartu asuransi, dan STNK seseorang dari 2015–2016. (Dalam upaya kesopanan, saya mencoba menghubungi orang ini dengan mencarinya di LinkedIn dan Google hanya untuk menemukan seseorang dengan nama, tanggal lahir, dan alamat yang sama dihukum pada tahun 2021 atas kejahatan yang cukup serius dan sekarang menjalani hukuman, dengan demikian Saya tidak akan kehilangan tidur karena dokumennya yang berusia 7 tahun beredar di Internet).
Saya menduga selama 10 tahun terakhir bahwa orang akan lebih siap dan memiliki alat yang lebih baik untuk mengunci konten mereka dan hanya membagikan apa yang seharusnya dibagikan. Saya salah. Jadi mengapa repot 10 tahun kemudian untuk mengulang kegiatan ini? Untuk kesenangan dan kesadaran. Sudah beberapa tahun sejak saya menulis sejumlah besar kode jadi saya ingin meninjau kembali dan mempertajam beberapa keterampilan.
Bagaimana Anda Bisa Melihat File Bucket?
Pertama, saya ingin mengidentifikasi bucket S3 yang mungkin ada di wilayah AWS tertentu (us-east, us-west, dll.) Jika saya memiliki nama yang valid untuk bucket, saya dapat mencobanya di browser web dan lihat apakah itu mencantumkan isi ember. Itu tidak berarti file itu sendiri dapat dilihat, tetapi setidaknya biarkan saya melihat jalur file untuk penyelidikan file tersebut di masa mendatang.
Misalnya, jika nama bucket “MyObviouslyFakeBucket” dapat dilihat secara publik dan terletak di wilayah AWS “US East 1”, Anda berpotensi melihat konten di browser web Anda dengan mengunjungi https://myobviouslyfakebucket.s3.us-east-1. amazonaws.com/
Ini akan mengembalikan daftar yang mirip dengan gambar yang sebagian disunting berikut ini.

Dalam dokumen XML yang ditampilkan sebagai hasilnya, Anda dapat melihat entri file di bawah setiap tag "Konten". Untuk setiap simpul "Konten" ada simpul
"Kunci" yang menampilkan jalur file dan nama setiap file. Jadi untuk file "interesting-text-file.txt" Anda berpotensi menguji akses ke file tersebut dengan menambahkan jalur ke akhir URL keranjang seperti berikut:
https://myobviouslyfakebucket.s3.us-east-1.amazonaws.com/interesting-text-file.txt
Jika file dapat dilihat, file akan terbuka di browser atau memicu pengunduhan otomatis (bergantung pada jenis file dan browser Anda). Jika Anda tidak memiliki akses, Anda akan melihat hasil XML yang pada dasarnya menampilkan pesan “Akses Ditolak”.
Terlepas dari upaya terbaik AWS, masih ada orang yang menyetel konten agar dapat dilihat secara publik padahal seharusnya tidak. Saya belum bekerja dengan S3 dalam beberapa tahun jadi saya mungkin melewatkan sesuatu, tetapi tampaknya ada beberapa langkah yang terlibat sebelum keranjang Anda dapat dengan mudah dihitung dan dilihat di browser web.
Saat membuat keranjang baru, "Blokir semua akses publik" dicentang secara default. Anda harus menghapus centangnya dan kemudian memilih kotak centang "Saya mengakui" lebih jauh ke bawah. Lihat di bawah.

Bahkan dengan ember saya dikonfigurasi untuk tidak 'memblokir semua akses publik' ketika saya menambahkan dua file teks sampel, saya masih tidak dapat mencantumkan konten ember di browser web saya sampai saya menambahkan kebijakan ember JSON yang secara eksplisit memberikan akses publik.
{
"Version": "2012-10-17",
"Id": "Policy1669653712601",
"Statement": [
{
"Sid": "Stmt1669653708988",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::myobviouslyfakebucket"
}
]
}
Pendekatan Keseluruhan
Jadi bagaimana Anda membuat daftar konten ember tanpa menebak secara acak? Dua opsi utama saya untuk mencapai ini di luar satu nama keranjang dari penemuan saya sendiri adalah menggunakan file kamus yang dipasangkan dengan AWS SDK atau HTTP GET sederhana.
Saya memilih untuk menulis kode Java menggunakan HTTP GET sederhana untuk versi pertama. Ini menghindari kebutuhan untuk mempelajari AWS Java SDK v2 yang diperbarui. Terakhir kali saya menggunakan AWS Java SDK adalah v1 dan cukup banyak perubahan sehingga saya tidak ingin kurva pembelajaran menunda kemajuan saya. Saya juga dapat menghindari keharusan menyiapkan kredensial AWS untuk menggunakan SDK dan kesalahan atau keanehan khusus SDK apa pun yang muncul selama pengujian. Tetap sederhana.
Saya mulai dengan file kamus yang saya miliki dari proyek pribadi sebelumnya. Ini adalah file teks datar dengan satu kata per baris. Pada satu titik saya memecahnya menjadi 8 atau 10 file terpisah dengan setiap file berisi entri untuk 1–3 huruf tergantung pada jumlah entri. Ini memungkinkan saya untuk memproses lebih sedikit entri sekaligus dengan lebih mudah. Anda dapat mencari file kamus secara online karena ada banyak tersedia.
Saya membuat sketsa langkah-langkah yang saya butuhkan untuk memprogram pada 2 catatan tempel. Mereka adalah sebagai berikut:
- Parsing file kamus untuk mengambil setiap entri kata.
- Untuk setiap kata dalam daftar, buat URL untuk diperiksa menggunakan kata tersebut sebagai nama keranjang dan wilayah AWS (untuk saat ini diberi kode keras ke “US East 1”).
- Coba sambungkan ke URL untuk melakukan operasi GET.
- Ambil kode respons yang dikirim dari server.
- Jika kode respons menunjukkan keberhasilan (bucket ada), tambahkan kata ke struktur data.
- Simpan kata-kata yang berhasil dalam struktur data ke file teks datar untuk penyelidikan nanti.
Parse file kamus
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) { }
}
}
Bangun 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
}
Lakukan operasi GET
String sUrl = "https://" + bucketName + ".s3." + currentRegion + ".amazonaws.com/";
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
Ambil kode respons dan simpan
int respCode = connection.getResponseCode();
if (respCode == 200) {
code200s.add(bucketName + "," + currentRegion);
}
Simpan nama bucket yang valid
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) { }
}
}
Itu dia. Sederhana dan lugas. Ini mungkin bukan solusi yang paling elegan, tetapi berhasil dan menjadi dasar untuk memungkinkan saya memperluas dan memperbaikinya. Saya mengidentifikasi ribuan bucket S3 yang valid hanya dengan menggores beberapa huruf abjad. Dari beberapa upaya pertama saya, saya menemukan katalog file MP3, jutaan gambar, file log yang tak terhitung jumlahnya, dan banyak lagi.
Saya telah menghapus keranjang pengujian saya "myobviouslyfakebucket" jadi jangan ragu untuk mengklaim namanya jika Anda menginginkannya. Dalam beberapa bagian selanjutnya dari rangkaian artikel ini saya akan menyoroti langkah-langkah tambahan untuk menyempurnakan solusi ini seperti:
- Menangani dan menyimpan kode respons untuk bucket selain 200(OK) dan artinya serta apa yang dapat Anda lakukan dengan info tersebut.
- Menggunakan daftar nama bucket yang valid untuk melihat apakah Anda dapat menghitung daftar file dalam bucket tersebut.
- Mem-parsing daftar file bucket untuk menangkap jalur dan nama file individual.
- Saring file dengan ekstensi file untuk mengabaikan kebisingan yang tidak diinginkan.
- Memberi nomor hasil file untuk bucket S3 dengan lebih dari 1000 file.
- Memeriksa daftar file untuk melihat apakah file individual dapat diunduh.