S3 스크래핑의 모험 — 1부
사람들이 S3 버킷에서 공유하는 이상한 파일을 믿지 못할 것입니다. 아마 하지 말아야 할 것들. 절대 하지 말아야 할 것들 .
이번 달에만 다음과 같은 파일을 보았습니다.
- 회사 소프트웨어의 라이센스 키.
- 9개 주에 있는 현지 미디어 직원의 이름, 이메일 및 전화번호가 포함된 미디어 관련 회의의 Excel 문서입니다.
- 제안된 서비스에 대한 비용/수수료/마진이 나열되어 있다고 생각되는 "독점 및 기밀"(제 스페인어는 약간 녹슨 것임)이라고 표시된 주요 기술 회사의 라틴 아메리카 사업부의 Powerpoint 문서입니다.
- 지난 2년 동안 폐업한 회사의 고객 PII(성명, 이메일 주소, 전화번호 및 위치)가 포함된 45,000~50,000개의 PDF 문서. (버킷을 AWS Support에 보고했으며 가까운 시일 내에 조치를 취하고 데이터를 보호하면 문제에 대해 더 자세히 논의할 것입니다.)
- 2015~2016년 누군가의 운전면허증, 보험 카드 및 차량 등록증의 고해상도 스캔. (예의를 갖추기 위해 LinkedIn과 Google에서 이 사람을 검색하여 연락을 시도했지만 이름, 생년월일 및 주소가 같은 사람을 찾았습니다. 2021년에 상당히 심각한 범죄로 유죄 판결을 받았고 현재 복역 중입니다. 나는 그의 7년 된 문서가 인터넷에 떠돌아다니는 것에 대해 잠을 설치지 않을 것입니다.)
나는 지난 10년 동안 사람들이 콘텐츠를 잠그고 공유해야 할 것만 공유할 수 있는 더 나은 도구와 장비를 갖추게 될 것이라고 생각했습니다. 내가 틀렸어. 그렇다면 왜 10년 후에도 이 활동을 반복해야 할까요? 재미와 인식을 위해. 상당한 양의 코드를 작성한 지 몇 년이 되었기 때문에 다시 방문하여 일부 기술을 연마하고 싶었습니다.
버킷의 파일을 어떻게 볼 수 있습니까?
먼저 특정 AWS 지역(us-east, us-west 등)에 있을 수 있는 기존 S3 버킷을 식별하고 싶었습니다. 버킷에 대한 유효한 이름이 있으면 웹 브라우저에서 시도하고 버킷의 내용이 나열되어 있는지 확인하십시오. 그렇다고 해서 파일 자체를 볼 수 있다는 의미는 아니지만 적어도 나중에 해당 파일을 조사할 수 있도록 파일 경로를 볼 수 있게 해 주세요.
예를 들어 버킷 이름 "MyObviouslyFakeBucket"이 공개적으로 볼 수 있고 AWS "US East 1" 지역에 있는 경우 https://myobviouslyfakebucket.s3.us-east-1을 방문하여 웹 브라우저에서 콘텐츠를 볼 수 있습니다. amazonaws.com/
이렇게 하면 부분적으로 수정된 다음 이미지와 유사한 목록이 반환됩니다.
결과로 표시되는 XML 문서에서 각 "Contents" 태그 아래의 파일 항목을 볼 수 있습니다. 각 "Contents" 노드에는
각 파일의 파일 경로와 이름을 표시하는 "Key" 노드가 있습니다. 따라서 "interesting-text-file.txt" 파일의 경우 다음과 같이 버킷 URL 끝에 경로를 추가하여 파일에 대한 액세스를 잠재적으로 테스트할 수 있습니다.
https://myobviouslyfakebucket.s3.us-east-1.amazonaws.com/interesting-text-file.txt
파일을 볼 수 있으면 브라우저에서 열리거나 자동 다운로드를 트리거합니다(파일 유형 및 브라우저에 따라 다름). 액세스 권한이 없는 경우 기본적으로 "액세스 거부" 메시지를 표시하는 XML 결과를 볼 수 있습니다.
AWS의 최선의 노력에도 불구하고 콘텐츠를 공개적으로 볼 수 없도록 설정하는 사람들이 여전히 있습니다. 몇 년 동안 S3로 작업하지 않았기 때문에 누락된 부분이 있을 수 있지만 웹 브라우저에서 버킷을 쉽게 열거하고 볼 수 있으려면 여러 단계를 거쳐야 하는 것 같습니다.
새 버킷을 만들 때 기본적으로 "모든 공개 액세스 차단"이 선택되어 있습니다. 선택을 취소한 다음 더 아래에 있는 "확인합니다" 확인란을 선택해야 합니다. 아래를 참조하십시오.
2개의 샘플 텍스트 파일을 추가할 때 '모든 공개 액세스를 차단'하지 않도록 버킷을 구성한 경우에도 명시적으로 공개 액세스를 부여하는 JSON 버킷 정책을 추가할 때까지 웹 브라우저에 버킷 콘텐츠를 나열할 수 없었습니다.
{
"Version": "2012-10-17",
"Id": "Policy1669653712601",
"Statement": [
{
"Sid": "Stmt1669653708988",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::myobviouslyfakebucket"
}
]
}
전반적인 접근
그렇다면 무작위로 추측하지 않고 어떻게 버킷 내용을 나열합니까? 내 발명품의 단일 버킷 이름 이상으로 이를 달성하기 위한 두 가지 주요 옵션은 AWS SDK 또는 간단한 HTTP GET과 쌍을 이루는 사전 파일을 사용하는 것이었습니다.
나는 첫 번째 버전에 대해 간단한 HTTP GET을 사용하여 Java 코드를 작성하기로 선택했습니다. 이렇게 하면 업데이트된 AWS Java SDK v2를 배울 필요가 없습니다. 마지막으로 AWS Java SDK를 사용했을 때는 v1이었고 충분히 변경되어 학습 곡선으로 인해 진행이 지연되는 것을 원하지 않았습니다. 또한 SDK를 사용하기 위해 AWS 자격 증명을 설정하지 않아도 되고 테스트 중에 발생한 SDK 관련 오류나 이상한 점을 피할 수 있습니다. 간단하게 유지하십시오.
이전 개인 프로젝트에서 가지고 있던 기존 사전 파일로 시작했습니다. 이것은 한 줄에 한 단어씩 있는 일반 텍스트 파일이었습니다. 어느 시점에서 나는 항목 수에 따라 1-3개의 문자에 대한 항목을 포함하는 각 파일을 8개 또는 10개의 개별 파일로 나누었습니다. 이를 통해 적은 수의 항목을 한 번에 더 쉽게 처리할 수 있었습니다. 사용 가능한 사전 파일이 많으므로 온라인에서 사전 파일을 검색할 수 있습니다.
프로그래밍에 필요한 단계를 포스트잇 2장에 스케치했습니다. 그들은 다음과 같았습니다.
- 사전 파일을 구문 분석하여 각 단어 항목을 검색합니다.
- 목록의 각 단어에 대해 해당 단어를 버킷 이름으로 사용하여 확인할 URL과 AWS 지역(현재 "US East 1"로 하드 코딩됨)을 구성합니다.
- GET 작업을 수행하려면 URL에 연결해 보십시오.
- 서버에서 보낸 응답 코드를 검색합니다.
- 응답 코드가 성공을 나타내면(버킷이 있음) 데이터 구조에 단어를 추가합니다.
- 나중에 조사할 수 있도록 데이터 구조의 성공한 단어를 플랫 텍스트 파일에 저장합니다.
사전 파일 구문 분석
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) { }
}
}
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
}
GET 작업 수행
String sUrl = "https://" + bucketName + ".s3." + currentRegion + ".amazonaws.com/";
URL url = new URL(sUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
응답 코드 검색 및 저장
int respCode = connection.getResponseCode();
if (respCode == 200) {
code200s.add(bucketName + "," + currentRegion);
}
유효한 버킷 이름 저장
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) { }
}
}
그게 다야. 간단하고 간단합니다. 가장 우아한 솔루션은 아닐 수 있지만 작동했으며 이를 확장하고 개선할 수 있는 기반이 되었습니다. 몇 개의 알파벳 문자를 긁어모아 수천 개의 유효한 S3 버킷을 식별했습니다. 처음 몇 번의 시도에서 MP3 파일, 수백만 개의 이미지, 셀 수 없이 많은 로그 파일 등의 카탈로그를 찾았습니다.
그 이후로 내 테스트 버킷 "myobviouslyfakebucket"을 삭제했으므로 원하는 경우 자유롭게 이름을 주장할 수 있습니다. 이 기사 시리즈의 다음 몇 부분에서는 이 솔루션을 향상시키는 다음과 같은 추가 단계를 강조합니다.
- 200(OK) 이외의 버킷에 대한 응답 코드 처리 및 저장과 그 의미 및 해당 정보로 수행할 수 있는 작업.
- 유효한 버킷 이름 목록을 사용하여 해당 버킷의 파일 목록을 열거할 수 있는지 확인합니다.
- 버킷 파일 목록을 구문 분석하여 개별 파일의 경로와 이름을 캡처합니다.
- 파일 확장자로 파일을 필터링하여 원하지 않는 노이즈를 무시합니다.
- 파일이 1000개가 넘는 S3 버킷에 대한 파일 결과 페이지 매기기.
- 개별 파일을 다운로드할 수 있는지 확인하기 위해 파일 목록을 확인합니다.

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































