Bandit Level 4 → Level 5

Minchae Kim·2023년 5월 1일
0

📌 Level 4 → Level 5


https://overthewire.org/wargames/bandit/bandit5.html

🚩 Level Goal

The password for the next level is stored in the only human-readable file in the inhere directory. Tip: if your terminal is messed up, try the “reset” command.

🚩 Problem Solving

곧장 cd 명령어를 사용해서 inhere 경로로 이동한 후, ls로 확인해보면 상당한 파일들이 존재한다.

🔹 Process

상당한 양의 파일들을 확인하기 위해서 file 명령어를 사용해 data file임을 알아낼 수 있었다.

file ./-file01
→ ./-file01: data

이후 cat 명령어를 사용하여 출력해보니, 정말 말 그대로 "human-readable" 하지 않은 내용이 들어있었다. 많은 양의 파일들을 전부 읽어내어 password를 찾아내는 것도 하나의 방법이겠지만, 추후 정말 무한대에 가까운 파일들을 만나게 된다면 충분히 문제가 될 수 있을 것 같아, 다른 명령어를 사용해보기로 했다.

file ./*
→ (생략)
→ ./-file07: ASCII text

*(asterisk)를 사용하여 file07만 ASCII text라는 것을 알아냈다. 해당 파일을 cat 명령어로 열어보니 password를 구할 수 있었다.

🔹 Password

Bandit5 Password : lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR

📌 Linux Commands


  • Commands you may need to solve this level : ls , cd , cat , file , du , find

🚩 ./* (asterisk, 별표)

리눅스에서 ./* 명령어는 현재 경로의 모든 것을 의미한다. * 기호는 영어로 'Asterist'라고 한다.

🚩 file

file 명령어는 지정된 파일의 종류(type)를 확인하는 명령어이다. file 명령어는 /usr/share/file 디렉토리의 magic 파일을 참조하여 파일 종류를 표시해준다. 이전 단계에서 다루었던 명령어이지만, 이번에는 option을 추가했다.

🔹 file 옵션

  • -C : 매직 파일의 포맷을 검사하는 옵션
  • -f : 많은 파일들을 한 번에 확인하기 위하여 파일 리스트인 목록 파일을 만들어서 그 안에 입력된 모든 파일을 한꺼번에 확인하는 옵션
  • -m : 지정된 매직 파일로 대상 파일을 확인하는 옵션

📌 Linux Concept


🚩 File System

파일 시스템(File System)은 파일에 이름을 붙이고 저장, 탐색을 위해 파일을 어디에 위치 시킬 것인지 나타내는 체계이다. 즉, 파일들이 디스크 상에서 구성되는 방식을 뜻한다. 이는 리눅스 뿐만 아니라 거의 모든 OS가 지원하고 있다.

🔹 EXT(Extended File System)

리눅스는 윈도우와 달리 Ext(Extended File System)을 사용한다.

Ext의 모든 내용을 다루기에는 너무 deep하기에, 실무에서 자주 사용되는 내용 위주로 간단하게 적어보았다.

🔹 Boot Sector

MBRBoot Loader가 저장되어 있는 구간이다.

  • MBR : OS가 어디에, 어떻게 위치해 있는지 식별해서 주기억 장치에 적재될 수 있게 해주는 정보와 하드 디스크가 포맷될 때 나뉘어지는 각 파티션의 위치에 관한 정보를 가지고 있다.
  • Boot Loader : 부트로더는 부팅되기까지의 부팅 전 과정을 진행하고, MBR에 저장한다.

🔹 Block Group

Block들의 모임으로, Super Block부터 Data Blocks까지의 block들로 구분된다. 모든 block group은 Super BlockGroup Descroptors의 복제본을 가져서 파일 시스템의 meta data(데이터에 관한 구조화된 데이터)의 정보를 보호한다.

  • Super Block : 파일 시스템에서 사용되는 주요 설정 정보들이 기록되는 영역이다. (block size, block group의 개수, 총 block의 개수)
  • Group Descriptors : 파일 시스템 내의 모든 블록 그룹들에 대한 정보를 기록한다.
  • inode : 파일 또는 디렉터리를 기술하는 데이터 구조이다. 파일의 데이터 블록이 파티션에서 어디에 위치해 있는지 등의 주요 데이터를 가지고 있다. 리눅스에서는 ls -il 명령어를 사용하여 확인할 수 있다.

🔹 리눅스 파일 시스템의 종류

저널링 기능이 들어간 EXT3와 실무에서 많이 사용하는 EXT4XFS에 대해 간단하게 정리해보았다.

🔸 EXT3

저널링 기능이 도입되어 데이터 복구 기능이 강화되었다고 한다. 데이터를 디스크에 기록하기 전, 저널에 수정 사항을 기록한다. 데이터 기록 전, 시스템 크래쉬나 갑자기 전원이 나가도 저널의 기록을 복구할 수 있다. (볼륨 크기와 서브 디렉터리 수는 생략하도록 하겠다.)

  • 저널링 시스템 : 파일 시스템의 저널(로그)에 기록하는 방식을 사용하는 파일 시스템이다. 파일의 정확성 체크가 매우 빠르고 정확하게 이루어진다는 것이 장점이다.

🔸 EXT4

파일 시스템의 축소와 확장이 자유로우며, 온라인 디스크 조각 모음 기능이 추가되었다고 한다.

🔸 XFS

Extent 기반이 탄탄해서 고성능 대용량 파일 시스템에 가장 적합하다. EXT4가 지닌 모든 기능들이 지원된다. 다만 XFS는 증설할 수 있지만, 축소가 불가능하다. (파일 시스템의 축소와 확장이 자유롭다고 해도 파일 시스템을 축소하는 작업은 권하지 않는다고 한다. 파일 시스템의 축소로 인한 meta data 불일치 가능성이 존재하기 때문이다.)

🚩 Linux Partition

디스크 공간의 분할을 의미하는 것으로, 하드 디스크 드라이브의 기억 공간을 별도의 데이터 영역으로 분할하는 것을 말한다. 디스크가 여러 개의 파티션으로 나뉘면, 다른 카테고리의 디렉터리와 파일들은 다른 파티션에 저장된다.

리눅스 파티션을 하는 가장 큰 이유는, 디스크 공간을 나누고 사용하는 공간 간의 간섭을 없애기 위함이다. 또한 서로 다른 공간에 서로 다른 OS를 설치할 수 있으며, 보호 목적 하에 파티션을 나누어 사용하기도 한다.

🔹 Partition의 종류

리눅스 파티션은 아래 적힌 용도로 생성된다. 서버를 사용하려는 목적에 따라 원하는 파티션을 구성하여 시스템을 구성하는 것이 바람직하다.

🔸 /root

/root 파티션은 단일 사용자 모드로 수행하기 위해 필요한 핵심 시스템 파일이 저장된다. 핵심 기능들이 보호되도록 다른 파일 시스템과 분리해두는 경우가 많다.

🔸 /boot

/boot 파티션은 리눅스 커널 이미지, 맵, 파일 등을 저장한다.

리눅스 커널 : Linux OS의 주요 구성 요소이자, 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스.
커널 공간이라는 자신만의 작은 작업 공간에서 메모리를 할당하고 저장되는 모든 항목을 추적한다. (3개의 layer 구성 : 하드웨어 - Linux 커널 - 사용자 프로세스)

리눅스 커널 이미지 : 커널이 하나의 파일로 디스크에 저장되어 있는 것.
커널은 원래 파일에 저장되어 있는 것이 아니라, 컴퓨터가 꺼지기 전까지 항상 메모리에 존재한다. 그러므로 디스크에 저장되어 있는 파일은 커널 그 자체가 아닌, 커널의 내용을 담고 있는 것이다.
Linux system에서는 디스크 공간을 낭비하지 않고, 로딩 시간을 줄이기 위해 압축된 형태의 커널 이미지를 사용한다.

커널과 커널 이미지는 추후 자세히 다루는 것이 좋을 것 같다. Bandit 공부로만 간단하게 넘어갈 수 있는 내용이 아닌 듯 하다.

🔸 /var

/var 파티션은 Spool Directory와 로그 파일을 저장한다. 부주의할 경우, 매우 큰 파일이 생길 여지가 있으므로 별도의 파티션으로 분리한다.

  • Spool Directory :

🔸 /tmp

/tmp 파티션은 사용자 응용 프로그램에서 임시 파일을 저장하는 곳으로 사용된다. /var 파티션과 마찬가지로, 큰 파일이 생성될 수 있으므로 파티션으로 분리해서 사용한다.

🔸 /home

/home 파티션은 사용자의 home directory로 사용하게 될 서버의 목적에 따라 적절한 용량으로 파티션을 분리하는 것이 바람직하다.

🔸 SWAP

SWAP 파티션은 가상 메모리를 저장하며, 보통 RAM 크기의 2배로 사용한다.

🔹 Partition 보기

linux에서 partition을 보기 위해서는 각종 명령어를 사용하여 확인할 수 있다. 위에서 언급되지 않은 device file은 물론, cat /etc/fstab 명령어를 이용하여 모든 파티션의 정보를 확인할 수 있다. df 명령어에 사용자가 용량을 편리하게 볼 수 있게 하는 옵션인 -h를 사용하면, 현재 파일 시스템 디스크 공간을 확인할 수 있다. (파티션으로 나누어진 디스크 확인 가능)

🚩 /usr directory

/usr 계층은 파일 시스템의 주요 섹션 중 하나이다. 이 계층에는 '시스템이 아닌 사용자'가 실행할 프로그램이 저장되며, 해당 계층에는 반드시 read-only 데이터만 존재해야 한다. FHS(파일 시스템 계층 구조) 간에 데이터의 공유가 가능한 데이터들이 포함되는데, 특정 host에 따라 달라지거나 시간에 따라 달라지는 정보들은 다른 계층에 저장된다. 또한 규모가 큰 소프트웨어 패키지들이 /usr 계층의 하위 디렉터리들을 직접적으로 사용해서는 안 된다.

🔹 Requirements

/usr 계층은 대게 6가지의 하위 디렉터리를 갖고 있는데, 그 종류와 역할은 아래와 같다.

  • include : C 프로그램에서 포함되는 헤더 파일들이 위치한다.
  • lib : 라이브러리들이 위치한다. (cron 등)
  • local : 기본 OS에서는 필요하지 않는 실행 가능한 파일들, 라이브러리들이 위치한다.
  • sbin : 사용자에 의해 실행되는 시스템 데몬, 시스템 유틸리티가 위치한다.
  • share : 아키텍쳐에서 독립된 데이터 파일들이 위치한다. (vim, zsh 등)
  • bin : 일반적인 유틸리티, 프로그래밍 툴과 함께 대부분의 사용자 명령어가 위치한다. (cd, python, curl 등)

/usr/bin, /usr/share와 같이 나타낸다. find 명령어를 설명할 때 앞서 언급했던 /usr/share/file directory는 /usr/share 디렉터리의 하위 항목 정도로 이해하면 될 것 같다.

profile
The Bloom of Youth

0개의 댓글