Những cuộc phiêu lưu trong S3 Scraping — Phần 1
Bạn sẽ không thể tin được những tệp kỳ lạ mà mọi người chia sẻ trong bộ chứa S3. Những điều họ có lẽ không nên. Những điều họ chắc chắn không nên.
Chỉ trong tháng này, tôi đã thấy các tệp như:
- Khóa cấp phép cho phần mềm của công ty.
- Tài liệu Excel từ một hội nghị liên quan đến truyền thông có chứa tên, email và số điện thoại của nhân viên truyền thông địa phương ở 9 tiểu bang khác nhau.
- Tài liệu powerpoint cho một bộ phận ở Mỹ Latinh của một công ty công nghệ lớn được đánh dấu là “Độc quyền và Bảo mật” (tiếng Tây Ban Nha của tôi hơi khó hiểu) mà tôi tin rằng chi phí/phí/lợi nhuận được liệt kê cho các dịch vụ được đề xuất.
- 45.000–50.000 tài liệu PDF chứa PII của khách hàng (tên đầy đủ, địa chỉ email, số điện thoại và địa điểm) của một công ty đã ngừng hoạt động trong 2 năm qua. (Tôi đã báo cáo bộ chứa cho Bộ phận hỗ trợ AWS và sẽ thảo luận vấn đề chi tiết hơn NẾU họ có hành động và bảo vệ dữ liệu trong tương lai gần.)
- Bản quét độ phân giải cao của giấy phép lái xe, thẻ bảo hiểm và đăng ký xe của ai đó từ năm 2015–2016. (Trong một nỗ lực lịch sự, tôi đã cố gắng liên hệ với người này bằng cách tra cứu anh ta trên LinkedIn và Google chỉ để tìm một người có cùng tên, ngày sinh và địa chỉ đã bị kết án vào năm 2021 về một tội danh khá nghiêm trọng và hiện đang thụ án, do đó Tôi sẽ không mất ngủ khi những tài liệu 7 năm tuổi của anh ấy xuất hiện trên Internet).
Tôi cho rằng trong 10 năm qua, mọi người sẽ được trang bị tốt hơn và có công cụ tốt hơn để khóa nội dung của họ và chỉ chia sẻ những gì nên chia sẻ. Tôi đã sai. Vậy tại sao phải bận tâm 10 năm sau để lặp lại hoạt động này? Đối với niềm vui và nhận thức. Cũng đã vài năm kể từ khi tôi viết bất kỳ lượng mã đáng kể nào nên tôi muốn xem lại và mài giũa một số kỹ năng.
Làm cách nào bạn có thể xem các tệp của nhóm?
Đầu tiên, tôi muốn xác định các bộ chứa S3 hiện có có thể có ở một khu vực AWS cụ thể (phía đông chúng tôi, phía tây chúng tôi, v.v.) Nếu tôi có một tên hợp lệ cho một bộ chứa thì tôi có thể dùng thử tên đó trong trình duyệt web và xem nó có liệt kê nội dung của thùng không. Điều đó không có nghĩa là bản thân các tệp có thể được xem, nhưng ít nhất hãy cho tôi xem đường dẫn tệp để điều tra các tệp đó trong tương lai.
Ví dụ: nếu tên bộ chứa “MyObviouslyFakeBucket” có thể xem được công khai và nằm ở khu vực AWS “Miền Đông Hoa Kỳ 1” thì bạn có thể xem nội dung trong trình duyệt web của mình bằng cách truy cập https://myobviouslyFakeBucket.s3.us-east-1. amazonaws.com/
Điều này sẽ trả về một danh sách tương tự như hình ảnh được chỉnh sửa lại một phần sau đây.
Trong tài liệu XML được hiển thị là kết quả, bạn có thể thấy các mục nhập tệp bên dưới mỗi thẻ "Nội dung". Đối với mỗi nút “Nội dung”, có một
nút “Khóa” hiển thị đường dẫn tệp và tên của từng tệp. Do đó, đối với tệp “interesting-text-file.txt”, bạn có thể kiểm tra quyền truy cập vào tệp bằng cách nối thêm đường dẫn vào cuối URL nhóm, chẳng hạn như sau:
https://myobviouslyfakebucket.s3.us-east-1.amazonaws.com/interesting-text-file.txt
Nếu tệp có thể xem được, tệp sẽ mở trong trình duyệt hoặc kích hoạt tải xuống tự động (tùy thuộc vào loại tệp và trình duyệt của bạn). Nếu bạn không có quyền truy cập, bạn sẽ thấy kết quả XML về cơ bản hiển thị thông báo “Truy cập bị từ chối”.
Bất chấp những nỗ lực tốt nhất của AWS, vẫn có những người đặt nội dung ở chế độ có thể xem công khai khi họ không nên. Tôi đã không làm việc với S3 trong một vài năm nên tôi có thể thiếu điều gì đó, nhưng dường như có NHIỀU bước liên quan trước khi nhóm của bạn có thể dễ dàng liệt kê và xem trong trình duyệt web.
Khi tạo một nhóm mới, tùy chọn “Chặn tất cả quyền truy cập công khai” được chọn theo mặc định. Bạn phải bỏ chọn nó và sau đó chọn hộp kiểm “Tôi xác nhận” ở phía dưới. Xem bên dưới.
Ngay cả khi bộ chứa của tôi được định cấu hình để không 'chặn tất cả quyền truy cập công khai' khi tôi thêm hai tệp văn bản mẫu, tôi vẫn không thể liệt kê nội dung bộ chứa trong trình duyệt web của mình cho đến khi tôi thêm chính sách bộ chứa JSON cấp quyền truy cập công khai một cách rõ ràng.
{
"Version": "2012-10-17",
"Id": "Policy1669653712601",
"Statement": [
{
"Sid": "Stmt1669653708988",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::myobviouslyfakebucket"
}
]
}
Cách tiếp cận tổng thể
Vậy làm cách nào để bạn liệt kê nội dung nhóm mà không phải đoán ngẫu nhiên? Hai tùy chọn chính của tôi để đạt được điều này ngoài một tên nhóm duy nhất do sáng chế của riêng tôi là sử dụng tệp từ điển được ghép nối với SDK AWS hoặc HTTP GET đơn giản.
Tôi đã chọn viết mã Java bằng cách sử dụng HTTP GET đơn giản cho phiên bản đầu tiên. Điều này giúp tránh phải tìm hiểu AWS Java SDK v2 đã cập nhật. Lần cuối cùng tôi sử dụng AWS Java SDK, đó là phiên bản v1 và đã có đủ thay đổi khiến tôi không muốn quá trình học tập trì hoãn tiến độ của mình. Tôi cũng có thể tránh phải thiết lập thông tin đăng nhập AWS để sử dụng SDK và tránh mọi lỗi hoặc điểm kỳ lạ dành riêng cho SDK phát sinh trong quá trình thử nghiệm. Giữ cho nó đơn giản.
Tôi bắt đầu với một tệp từ điển hiện có mà tôi có từ một dự án cá nhân trước đó. Đây là một tệp văn bản phẳng với một từ trên mỗi dòng. Tại một thời điểm, tôi đã chia nó thành 8 hoặc 10 tệp riêng biệt với mỗi tệp chứa các mục từ 1–3 chữ cái tùy thuộc vào số lượng mục. Điều này cho phép tôi xử lý số lượng mục nhỏ hơn tại một thời điểm dễ dàng hơn. Bạn có thể tìm kiếm trực tuyến tệp từ điển vì có rất nhiều tệp.
Tôi đã phác thảo các bước tôi cần để lập trình trên 2 ghi chú sau đó. Chúng như sau:
- Phân tích cú pháp tệp từ điển để truy xuất từng mục nhập từ.
- Đối với mỗi từ trong danh sách, hãy tạo URL để kiểm tra bằng cách sử dụng từ đó làm tên nhóm và khu vực AWS (hiện được mã hóa cứng thành “US East 1”).
- Thử kết nối với URL để thực hiện thao tác GET.
- Truy xuất mã phản hồi được gửi từ máy chủ.
- Nếu mã phản hồi cho biết thành công (nhóm tồn tại), hãy thêm từ đó vào cấu trúc dữ liệu.
- Lưu các từ thành công trong cấu trúc dữ liệu vào một tệp văn bản phẳng để điều tra sau này.
Phân tích tệp từ điển
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) { }
}
}
Xây dựng 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
}
Thực hiện thao tác NHẬN
String sUrl = "https://" + bucketName + ".s3." + currentRegion + ".amazonaws.com/";
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
Truy xuất mã phản hồi và lưu trữ
int respCode = connection.getResponseCode();
if (respCode == 200) {
code200s.add(bucketName + "," + currentRegion);
}
Lưu tên nhóm hợp lệ
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) { }
}
}
Đó là nó. Đơn giản và dễ hiểu. Nó có thể không phải là giải pháp tao nhã nhất, nhưng nó đã hoạt động và là cơ sở cho phép tôi mở rộng và cải thiện nó. Tôi đã xác định được hàng nghìn bộ chứa S3 hợp lệ chỉ bằng cách cạo vài chữ cái trong bảng chữ cái. Chỉ từ vài lần thử đầu tiên, tôi đã tìm thấy danh mục các tệp MP3, hàng triệu hình ảnh, vô số tệp nhật ký, v.v.
Kể từ đó, tôi đã xóa nhóm thử nghiệm của mình “myobviouslyfakebucket” vì vậy hãy thoải mái xác nhận tên nếu bạn muốn. Trong vài phần tiếp theo của loạt bài viết này, tôi sẽ nhấn mạnh các bước bổ sung để nâng cao giải pháp này, chẳng hạn như:
- Xử lý và lưu trữ mã phản hồi cho các nhóm ngoài 200(OK) và ý nghĩa của chúng cũng như những gì bạn có thể làm với thông tin đó.
- Sử dụng danh sách các tên nhóm hợp lệ để xem liệu bạn có thể liệt kê danh sách các tệp trong nhóm đó hay không.
- Phân tích cú pháp danh sách các tệp nhóm để nắm bắt đường dẫn và tên của các tệp riêng lẻ.
- Lọc tệp theo phần mở rộng tệp để bỏ qua tiếng ồn không mong muốn.
- Phân trang kết quả tệp cho bộ chứa S3 với hơn 1000 tệp.
- Kiểm tra danh sách các tệp để xem có thể tải xuống các tệp riêng lẻ hay không.

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































