CTF[5일차]

정지범·2024년 12월 10일
0

CTF

목록 보기
5/9
참고
※참고 자료는 드림핵을 이용하였습니다.
※드림핵의 로드맵대로 공부할 예정입니다.
※스스로를 위해 정리한 참고 자료입니다.

문제 baby-linux

Description
리눅스 명령어를 실행하는 웹 서비스가 작동하고 있습니다.
해당 웹 서비스의 코드가 첨부파일로 주어집니다.

flag.txt 파일을 찾아 출력하여 플래그를 획득하세요!

플래그 형식은 DH{...} 입니다.

#코드 첨부파일 내용
#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template

APP = Flask(__name__)

@APP.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        user_input = request.form.get('user_input')
        cmd = f'echo $({user_input})'
        if 'flag' in cmd:
            return render_template('index.html', result='No!')

        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('index.html', result=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('index.html', result='Timeout')
        except subprocess.CalledProcessError:
            return render_template('index.html', result='Error')

    return render_template('index.html')

if __name__ == '__main__':
    APP.run(host='0.0.0.0', port=8000)

1. 문제 상황

  • Flask 애플리케이션에서 사용자 입력을 쉘 명령어로 실행할 수 있는 기능이 구현되어 있음.
  • 입력 창에 명령어를 입력하면 서버에서 실행되어 결과를 반환함.
  • 예를 들어, ls나 cat 명령어를 입력하면 서버의 파일이나 디렉터리 내용을 확인 가능.

2. 발견한 취약점

2.1. 명령어 인젝션 가능성
  • 사용자 입력값이 필터링 없이 쉘 명령어로 실행되므로 공격자가 임의 명령어를 실행할 수 있음.
    예를 들어:
    • ls를 입력해 디렉터리 구조 탐색 가능.
    • cat 명령어로 파일 내용을 읽을 수 있음.
2.2. 특정 파일 차단 로직 존재
  • flag.txt라는 파일에 접근하려고 시도하면 "No!!"라는 메시지가 출력됨.
  • Flask 코드에서 특정 문자열(예: flag)을 포함한 명령어를 차단하는 로직이 있는 것으로 보임.

3. 실험 과정

3.1. 디렉터리 탐색
  • ls 명령어를 입력해 파일 및 디렉터리 구조를 탐색.
  • 결과: dream/hack/hello 디렉터리 발견.
3.2. 파일 확인
  • ls를 통해 hint.txt 파일 존재 확인
  • cat hint.txt를 통해 ./dream/hack/hello 파일이 존재함을 확인.
  • ls -l ./dream/hack/hello경로에 flag.txt 파일이 존재함을 확인.
  • cat ./dream/hack/hello/flag.txt 실행 시 차단됨("No!!" 출력).
3.3. 차단 우회 시도
  • flag 문자열을 우회하거나 다른 방식으로 파일에 접근하려는 다양한 방법을 시도함:
  • 파일 이름 생략(cat ./dream/hack/hello/fla*)을 하니 flag 값이 나옴.

4. 보안적 취약점 정리

명령어 인젝션
  • 사용자의 입력값이 필터링 없이 실행되므로 공격자가 시스템 명령어를 통해 민감한 정보에 접근 가능.
불완전한 차단 로직
  • 특정 문자열(예: flag)만 차단하고 있으나, 파일 이름 변형이나 우회 방법으로 접근 가능.
시스템 정보 노출
  • 명령어 결과가 그대로 반환되므로, 서버 파일 구조와 민감한 정보를 쉽게 탐색 가능.

이번 글에서는 코딩을 시작하는 발걸음이 되는 소스 코드 편집기 사용법을 알아보고, 기본적인 C 코드를 컴파일하여 실행하는 과정을 살펴 보겠습니다.

Visual Studio Code

  • 비주얼 스튜디오 코드(Visual Studio Code, 이하 VS Code)는 Windows, macOS, Linux에서 사용 가능한 소스 코드 편집기입니다.
  • 기본적으로 JavaScript, TypeScript, Node.js를 지원하며 확장 프로그램(Extension)을 통해 C, Java, Python 등 100개 이상의 언어를 지원합니다.
  • 가볍고 무료인데 다양한 기능을 제공하여 많은 사람들이 사용하고 있습니다.
  • 개발을 할 때만 소스 코드 편집기를 사용한다고 생각하는 것은 큰 오해입니다.
  • 해킹 공부를 할 때도 직접 익스플로잇 코드 혹은 스크립트를 작성해야 하는 경우가 많습니다.

Visual Studio Code - Tips

ㅁ 커맨드 팔레트

커맨드 팔레트(Command Palette)는 VS Code에 존재하는 기능을 키보드 입력으로 검색하고 실행할 수 있는 간편한 명령 처리 기능입니다.
View-Command Palette... 혹은 단축키 Ctrl+Shift+P로 열 수 있습니다.

ㅁ 터미널

VS Code 내에서 빠르게 명령어를 실행할 수 있는 터미널(Terminal) 창이 존재합니다.
View-Terminal 혹은 단축키 Ctrl+`로 터미널 창을 엽니다.

리눅스 VM 🐧 VS Code

  • 대부분의 드림핵 강의가 리눅스 환경을 필요로 하기 때문에 앞서 리눅스 VM을 구축했습니다.
  • 그런데 VM에서 코딩을 하다 보면 속도가 느리거나 불편한 경우가 있습니다.
  • 이번 강의에는 편리한 코딩을 위해 VS Code 편집기를 리눅스 VM에서 사용할 수 있도록 연결하겠습니다.

리눅스 VM (VirtualBox) 🐧 VS Code

VirtualBox로 리눅스 VM을 구축한 경우 다음과 같이 연결합니다.

리눅스 VM에 ssh 서버 설치

리눅스 VM에서 VS Code 편집기를 사용한다는 것은 호스트 머신에서 리눅스에 원격으로 접속한 상태로 VS Code를 사용한다는 것과 같습니다.
원격 접속을 하기 위해서는 ssh를 이용합니다.

먼저 리눅스 VM의 터미널에 아래 명령어를 입력하여 업데이트를 진행하고, ssh 서버를 설치합니다.

sudo apt update
sudo apt upgrade
sudo apt-get install openssh-server

리눅스 VM 포트 포워딩

※ VirtualBox로 우분투 22.04.5 lts 실행 시 해상도가 자꾸 깨져서
vmware로 다시 설치 후 진행 ※

1. 우분투 네트워크 세팅

:우분투 22.04 마우스 우클릭 > Setting 클릭 > Network Adapter > Custom에서 NAT 선택

2. VMware 네트워크 설정

: Edit 클릭 > Virtual Network Editor 클릭 > NAT 선택 후, Change Setting 클릭


: NAT 선택 후, NAT Settings 클릭

NAT Settings에서 Add 버튼 클릭 후, 두 번째 사진과 같이 설정하기

  • Host Port : 접근할 포트번호 (unknown 포트번호 사용하기)
  • Virtual Machine IP address : 본인 우분투 IP 주소(우분투 들어가서 터미널에 ipconfig 하면 나옴)
  • Virtual Machine Port : 본인 우분투 포트번호(web은 80, ssh는 22)

  • 포트는 ssh 이므로 22로 설정

VS Code 설정: Remote - SSH 설치

이제 VS Code에서 리눅스 ssh 서버로 접속하기 위한 설정을 진행하겠습니다.

VS Code 좌측 Extensions 탭을 열어 ssh를 검색합니다. Remote - SSH extension를 클릭하고 Install 버튼을 눌러 설치합니다. 아래와 같이 Uninstall 버튼이 뜨면 정상적으로 설치가 완료된 것입니다.

VS Code 설정: SSH config 파일 구성

이제 Remote - SSH의 기능을 실행할 수 있습니다. 리눅스 ssh 서버로의 연결을 등록하기 위해 Ctrl+Shift+P로 아래와 같이 커맨드 팔레트를 열고, ssh를 검색합니다.


목록에서 Remote-SSH: Open SSH Configuration File…을 클릭한 뒤 기본 config 파일 경로인 ~/.ssh/config를 선택하여 ssh config 파일을 엽니다.


config 파일은 여러 ssh 서버에 간편하게 접속할 수 있도록 호스트, 포트, 키 파일 등의 옵션을 미리 지정해 두는 파일입니다. 기본 config 파일은 ~/.ssh/config 경로에 존재합니다. 만약 config 파일이 없다면 해당 경로에 생성하면 됩니다.
접속할 호스트를 등록하는 기본 구성은 다음과 같습니다.

Host [접속할 호스트 이름]
    HostName [호스트 IP 주소]
    Port [접속할 포트]
    User [호스트 사용자 이름]
    IdentityFile [접속시 사용할 개인 키 파일 경로]

ssh 개인 키(private key) 파일은 ssh-keygen 등을 이용하여 생성할 수 있습니다. 현재 ~/.ssh 경로 아래 개인 키 파일이 존재한다고 가정하며, 키 파일 생성 과정은 자세히 다루지 않겠습니다.

VS Code 설정: 리눅스 ssh 서버 연결

이제 생성한 호스트에 접속하기 위해 커맨드 팔레트에서 Remote-SSH: Connect to Host…를 클릭하고 앞서 작성한 Host 이름을 클릭합니다.

새 윈도우가 열리고 윈도우 상단에 사용자 암호를 입력하는 창이 뜨면 리눅스 사용자의 암호를 입력하고 엔터를 눌러 접속을 완료합니다.

  • 아까 config에 본인이 설정한 HostName이 뜰겁니다!

VS Code 사용

Open Folder를 클릭하고 원하는 디렉토리를 선택한 뒤 암호를 한 번 더 입력합니다. 이제 리눅스 환경에 존재하는 파일들을 VS Code에서 열고 수정할 수 있습니다. 테스트로 Desktop 디렉토리에 a.txt 파일을 생성하고 내용을 작성한 뒤 저장하겠습니다.

  • 그럼 아래와 같이 리눅스 환경에 a.txt 파일이 생성되고, 작성한 내용도 잘 반영된 것을 볼 수 있습니다!




출처 및 참고문헌

https://jihyeong-ji99hy99.tistory.com/161

https://hi-sojeong.tistory.com/101

https://learn.dreamhack.io/449#11

profile
안녕하세요

0개의 댓글