Home
System Hacking
📦

[ShaktiCTF 2025][BOX] Shocking-news

Type
CTF
년도
2025
Name
ShaktiCTF
분야
Box
세부분야
Box
2025/07/28 06:34
1 more property

# Description

Are you just another customer here , or do you have in you, what it takes to see beyond the ordinary? Things might look ordinary on the outside , but inside, lies a mangled web of shocking secrets. Should you choose to take the quest and discover what others can't , follow along, and what you are seeking , shall be revealed .
Plain Text
복사

# 분석

처음보는 유형의 문제였다. 접근했던 방법과 생각했던 내용 모두를 기술해보겠다.
문제를 다운받고 압축을 풀어보면 .ova 확장자를 가지는 파일을 하나 던져준다.
일단 HxD로 까보면 ovf라는 데이터가 있는걸 볼 수 있고 파일 확장자 정보를 일단 먼저 찾아보자.
1.
.ova
개방형 가상 어플라이언스(OVA) 은 단일 파일 아카이브의 OVF 패키지
2.
ovf
가상 시스템을 설명하는 XML, 이름, 하드웨어, 패키지 설명 등등…
라고 되어 있고 아카이브라는 점과 여러 정보를 담고 있는 것으로 보아 일단 ZIP 파일로 확장자를 변경해본다.
여기서 주목해야하는 부분은 vmdk 파일이다.
vmdk 파일은 흔히 VMWare, Virtual Box등 가상화 소프트웨어에서 가상 하드 디스크를 내보내는 방식이다.
자 이제 해당 파일을 VMWare에서 열어보자.

VMWare Open

Open a Virtual Machine을 클릭해서 실행한다.
대충 설정해주고 Import 설정해준다.
생성 완료되면 실행해준다.
리눅스가 실행되는 것을 볼 수 있다.

File System 분석

실행하면 Alice 라는 User로 로그인하게 설정되어 있다.
비밀번호를 모르니 일단 File System 먼저 확인하기 위해 VMShutdown 한 뒤 FTK Imager를 실행한다.
Add Evidence Item... 클릭, Image File 클릭
Browse로 아까 만든 vmdk 파일 오픈 뒤 Finish 클릭
열린 파일을 쓱 보다 alice 파일 시스템을 Export Files...를 눌러 alice 자체를 추출한다.
그리고 /etc/passwd/etc/shadow를 들어간다.

Login

/etc/passwd
/etc/shadow
rootalicepasswordcrack하려고 했지만 실패했다.

Password Reset

FTK Imager로 필요한 파일은 일단 다 추출했다.
이제 FTK를 꺼주고 VM실행하고 Shift + E를 연타한다.
부르토더에 진입한 뒤 e를 눌러준다.
옵션 편집 페이지가 나오면 밑으로 쭉 내린다.
밑에 linux에 인자를 rorw로 변경하고 quite splash $vt_hadnoffinit=/bin/bash로 변경한다.
수정한 뒤 Crtl + X를 눌러서 실행한다.
bash로 접속하면 passwd 명령어를 통해서 비밀번호를 변경해준다.
passwd root 1234 1234 passwd alice 1234 1234
Bash
복사
변한 한 뒤 reboot -f를 입력해 재부팅한다.
재부팅되면 비밀번호를 입력하여 로그인하면 문제를 풀기위한 1차적 준비는 끝났다.

# 문제 분석

해당 문제를 분석해본 nc로 특정 가상 서버에 접속하여 질문에 해당하는 답을 VM에서 분석해서 넣으면된다.

Q1) 활성화 된 포트

Q1) Which ports are open (Answer in ascending order of port numbers , separated by commas)? Format: XX,..
Plain Text
복사
확인을 위해 netstat를 설치해준다.
Answer: 22, 80
Plain Text
복사

Q2) 상점 이름

Q2) 해당 도메인에 호스팅된 상점의 이름은 무엇입니까? (공백으로 구분된 카멜 케이스) 형식: Abcd Efgh Ijklmno
Plain Text
복사
http80 port가 열려있는 것으로 보아 웹 서버가 열려있는 걸 볼 수 있다.
http://127.0.0.1로 접속하면 나온다.
Answer: Donut Heaven
Plain Text
복사

Q3) API 주소

Q3) Which endpoint helped you find the user credentials? Format: /path/to/the/endpoint
Plain Text
복사
웹 서버의 API임으로 /var/www로 접근하여 tree 명령어를 입력한다.
Answer : /cgi-bin/test.cgi
Plain Text
복사

Q4) CVE 번호

Q4) What vulnerability seems to affect the kernel of the target system? (Enter a CVE number,Bash version number) ?
Plain Text
복사
자 여기서 부터 추측을 하면서 분석을 해야한다.
kernel에 영향을 미치는 CVE를 제출하는 것 + access.logerror.log가 존재하는 것으로 보아 web servertest.cgi와 취약점을 exploit했다고 생각할 수 있고 bash version number을 넣어라는 것을 통해 bash취약점에 영향을 미친다고 볼 수 있다.

access.log

access.log 파일에서 test.cgi를 검색하면 아래와 같이 68 line에서 특정 쉘 스크립트를 실행한 것을 볼 수 있다.
127.0.0.1 - - [20/Sep/2024:01:16:16 +0530] "GET /cgi-bin/test.cgi HTTP/1.1" 500 803 "-" "() { :; }; echo; echo; /bin/bash -c 'echo vulnerable'"
Plain Text
복사
해당 공격구문을 복사해서 그대로 검색하면 Shellshock 취약점임을 알 수 있고, CVE-2014-6271임을 알 수 있다.
이제 bash version을 확인하면 4.3.0이다.
Answer : CVE-2014-6271,4.3.0
Plain Text
복사

Q5) 호스트 이름

Q5) What is the hostname of the target system ? (Complete domain name in lowercase) Format: domain.name
Plain Text
복사
hostname 명령어를 통해서 호스트 이름을 가져옵니다.
Answer : domain1.com
Plain Text
복사

Q6) alice 유저 정보 노출 시스템 명령어

Q6) Which system command exposes the credentials for alice user? Format: command
Plain Text
복사
해당 부분을 이해하기 위해서는 ShellShock 취약점을 먼저 이해해야한다. 자세한 내용은 아래 Reference 참고
간단하게 설명하면 아래와 같다.
1.
cgi-bin을 통해 웹 서버가 Bash 기반 스크립트 실행 후 client에 전달
2.
조작된 환경변수 삽입시 서버는 환경 변수에 전달된 명령어 실행
3.
인증 없이 원격에서 임의 명령어 실행
이제는 시나리오를 먼저 세우고 분석을 진행해야한다.(침해 분석을 처음해봐서 시나리오 기반으로 접근)
일단 쉘을 획득한 것은 자명하다. 그럼 bash에 접근했다는 것이고 .bash_history를 보자
bash_history
8.7 KB
대충 공격자가 침입한 것 같은 시점부터 보면 env 명령어를 가장 먼저 실행한 것을 볼 수 있다.
cd /usr/lib/cgi-bin/ ls ./vuln.sh ./test.cgi ls -al env x='() { :;}; echo Oh No!' bash_shellshock -c "echo Testing!"
Plain Text
복사
ShellShock 취약점은 환경 변수와 관련된 취약점임으로 넣어보면 정답이다.
Answer : env
Plain Text
복사

Q7) Privilege Escalate Binary

Q7) Which binary had the SUID bit set that helped you escalate to root and under which directory ? ( Path to binary and directory separated by comma) Format: /path/to/binary/with/suid,/directoryname
Plain Text
복사
권한 상승한 Binary를 찾아보자 사실 여기서 제일 많이 시간이 소요된 것 같다.
일단 권한 상승을 하는 Binary 먼저 찾아보자
find / -perm -4000 -type f 2>/dev/null
Plain Text
복사
저기 있는 모든 binary에 대해서 분석했지만 일단 정답만 작성해본다…
일단 .bash_history로 돌아와서 사용한 command를 분석해보자
일단 해커 관점으로 생각해봤을 때 bash —version을 통해서 version을 확인한 다음 ShellShock 취약점을 이용했을 것이다.
실제로 245line에 보면 version을 확인했다.
다음으로 vi/root/root.txt에 접근하고 cat으로 읽지만 실제로 명령어를 실행해보면 vi로는 접근되지만 cat으로는 읽을 수 없다.
정리해보면 심볼릭 링크로 vivim.tiny에 걸려있는걸 볼 수 있고 vi는 루트 권한을 위임받는다.
vi를 통해 잘 쓰가 쓰까해서 공격자 관점에서 쉘을 획득하는 시나리오를 생각해봤다.
which vi /usr/bin/vi ls -al /usr/bin/vi /usr/bin/vi -> /etc/alternatives/vi ls -al /etc/alternatives/vi /etc/alternatives/vi -> /usr/bin/vim.tiny
Plain Text
복사
.bash_history를 다 분석하면서 vi를 통해서 뭘 수정했는지 따라가보면
/etc/sudoers.d/newrules를 접근하는데 파일로 존재하지는 않는다.
더 밑으로 쭉 분석해가면 /etc/sudoers.d/alice에 접근한다.
root passwd1234로 변경했기 때문에 su를 통해서 root로 변경한 뒤cat /etc/sudoers.d/alice로 파일을 읽어본다.
위 내용을 해석해보면 vi를 통해서 /tmp에서 실행하는 파일은 root 권한을 위임한다는 뜻이다.
위 명령어로 root 권한 탈취가 가능하다.
sudo /usr/bin/vi /tmp/test -c '!sh'
Plain Text
복사
Answer : /usr/bin/vi,/tmp
Plain Text
복사

Q8) webserver name

Q8) Which webserver is running on port 80? Format: Webservername
Plain Text
복사
curl을 통해 Server Header를 본다.
Answer : Apache2
Plain Text
복사

Q9) 파일 내용

Q9) What are the contents of the file1.txt for alice ? Format: contentofthefile
Plain Text
복사
file1.txt만 읽으면 된다.
Answer : ff3a265203a475f18d12baeab71b9a00
Plain Text
복사

Q10) 루트 파일 내용

Q10) What are the contents of the root flag file ? Format: contentofthefile Answer: $
Plain Text
복사
다시 권한 상승 취약점을 통해 읽는다.
Answer: 172346606e1d24062e891d537e917a90
Plain Text
복사

# Payload

from pwn import * p = remote("43.205.113.100", 8901) p.sendline("22,80") p.sendline("Donut Heaven") p.sendline("/cgi-bin/test.cgi") p.sendline("CVE-2014-6271,4.3.0") p.sendline("domain1.com") p.sendline("env") p.sendline("/usr/bin/vi,/tmp") p.sendline("Apache2") p.sendline("ff3a265203a475f18d12baeab71b9a00") p.sendline("172346606e1d24062e891d537e917a90") p.interactive()
Python
복사

# Flag

ShaktiCTF{$H0CK!ng_8uT_YoU_H4CK3D_7h3_boXx!!}
Plain Text
복사

# Reference