본문 바로가기

Pwnable/FTZ

[ProjectH4C] [Write-up] 해커스쿨 FTZ Training 0~5

#Trainer 0

해커스쿨 FTZ에는 문제를 풀기 전에 기본 지식을 알려주기 위해 trainer가 존재한다. trainer는 총 10단계로 이루어져 있다.

 

해커스쿨 FTZ를 사용하려면 먼저 레드햇 리눅스가 설치된 가상머신과 ftz.iso 파일이 있어야 하는데 아래의 주소에서 받을 수 있다.

blog.naver.com/wnsgus821/222028256853

 

실행 환경은 MacOS Katalina 10.15.6이다.


 

 

설치를 마치고 나서 리눅스를 실행 했을 때 다음과 같은 화면이 나오면, ftz login: root  password: hackerschool로 입력해서 접속한다.

접속이 완료되었으면 ifconfig 명령어를 이용해 ip주소를 검색한다.

 

eth0 부분의 inet addr를 기억해두면 된다. 이제 터미널로 와서 ssh 통신을 이용해 접속해준다. 명령어는 다음과 같다.

 

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes128-cbc trainer1@192.168.234.128

입력하면 비밀번호를 입력하라 하는데, trainer1의 비밀번호는 trainer1이다. 이제부터 리눅스에 대한 기초 공부를 시작하면 된다.

 

 

 


 

#Trainer 1 

 

 

 

 

프롬프트는 [접속id@접속주소 현재디렉토리]로 구성되어 있다.

 

리눅스를 이용하면 콘솔창에 명령어를 입력해서 사용하는 경우가 많은데, 사용하다보면 현재 내가 어느 위치에 있는지, 가고자 하는 곳이 어디인지 헷갈릴 수가 있다. 그 때 ls 명령어를 사용하면 현재 디렉토리에 있는 모든 디렉토리와 파일들을 출력해준다.

 

 

파일과 디렉토리를 출력했지만, 무엇이 파일이고 무엇이 디렉토리인지 알 수가 없다. 이러한 경우 ls에 -l 옵션을 주면 해당 파일이 디렉토리인지 파일인지가 함께 출력된다.

아까는 이름만 출력되었지만 이번엔 좀 더 복잡하게 출력되었다.

start.txt를 가지고 설명하자면, 맨 앞의 -rw-rw-r-- 은 권한을 나타내준다. 10자리 중 맨 앞의 자리는 해당 파일이 파일인지 디렉토리인지를 알려준다. 만약 해당 파일이 디렉토리라면 d로 표시되고 디렉토리가 아니면 -로 표시된다. 그 뒤에 9자리는 사용권한을 나타낸다. 3자리씩 끊어서 보면 rw- / rw- / r--이 되는데, 앞의 3자리가 소유자, 중간의 3자리가 그룹에 포함된 유저, 뒤의 3자리가 그 외의 유저에 관한 권한을 뜻한다. r은 read(읽기), w는 write(쓰기), 예시에는 없지만 3번째에는 x가 들어가는데 x는 execute(실행)에 관련된 권한이다. 이를 기반으로 보면, start.txt는 디렉토리가 아닌 파일이며, 소유자에겐 읽고 쓸 수 있는 권한이, 그룹 유저에게도 읽고 쓸 수 있는 권한이, 그 외의 사용자에게는 읽을 권한만이 주어지게 된다.

중간에 trainer1 trainer1 은 권한에 관한 정보를 보여주며, 이는 추후에 배울 예정이라고 한다. 그 뒤에 779는 해당 파일의 크기를 의미한다.

파일인지 디렉토리인지는 맨 앞이 d인지 -인지만 보면 된다. d이면 디렉토리, -이면 파일이다. 그리고 날짜 앞에 오는 숫자들이 각 파일의 용량을 뜻한다. 

 

la -a는 숨김파일까지 모두 출력할 수 있다. 리눅스에서 파일을 숨김 처리 하는 법은 파일이름 앞에 점(.)을 붙이는 것이다.

 

-a 옵션과 -l 옵션을 합쳐서 하나의 옵션 -al으로 만들어줄 수 있다. 이는 숨김 파일까지 모두 보여주고, 각 파일의 상세한 정보들까지도 출력해준다.

 

trainer2의 비밀번호를 알려주고 연결이 끊겼다. 이제 trainer2로 로그인 하면 된다.

 

 

 

 

#Trainer 2

 

pwd : 현재 디렉토리의 경로를 출력해준다.

경로를 출력할 땐 최상위 디렉토리인 / 부터 현재 디렉토리까지를 출력한다.

 

cd 디렉토리 : 현재의 위치를 이동시켜준다. 디렉토리 이름을 써서 사용할 수도 있고, 한 단계 위에 있는 디렉토리로 이동할 때는 이름 대신 ..(점 2개)을 이용해서 이동할 수도 있다.

 

위 그림과 같이 cd .. 을 실행한 후에 현재 경로를 출력해 보면 /home/trainer2 에서 /home으로 이동된 것을 확인 할 수 있다.

한 단계 아래로 내려갈 때에는 디렉토리의 이름을 사용해야 한다.

 

후에 pwd를 출력하면 경로가 다시 /home/trainer2가 된것을 볼 수 있다.

 

 

최상위 디렉토리로 한번에 이동하려면 cd /를 실행하면 된다.

 

한 번에 한 단계씩 이동하는 것 뿐 아니라, 위와 같이 여러 단계의 디렉토리를 한번에 넘어갈 수도 있다.

현재의 위치에 디렉토리를 추가하는 명령어는 mkdir 이다.

 

[mkdir 디렉토리이름]

 

해당 디렉토리에 mkdir linuxer를 이용해 linuxer라는 디렉토리를 만들고 ls -al 명령어를 입력하면 다음과 같이 linuxer 디렉토리가 출력되는 것을 확인할 수 있다.

 

반대로 디렉토리를 삭제할 때에는 [rmdir 디렉토리이름] 을 이용해서 삭제하면 된다.

 

 

파일을 복사하는 명령어는 [cp 복사원본 복사사본]이다. 현재 디렉토리에서 복사원본을 복사사본이라는 이름으로 복사해준다. 

 

삭제해줄 때에는 [rm 파일이름] 을 이용해서 삭제해주면 된다.

 

 

파일의 이름을 바꾸고자 할 때에는 [mv 원본이름 바꿀이름] 으로 사용하면 된다.

 

 

 

 

 

#Trainer 3

 

현재 서버에 접속한 유저들을 보려면 [who] 또는 [w] 명령어를 이용한다.

 

내가 구축한 서버에 root로 접속했고, trainer3이라는 아이디를 통해 접속했기 때문에 유저가 두 명밖에 없다.

who 명령어로 출력한 정보들의 의미는 다음과 같다.

 

  • USER : 사용자의 이름. 로그인 할 때의 id가 출력된다.
  • TTY : 어떠한 방식으로 접속했는지가 출력된다. tty로 나타나면 콘솔로 접속한 것이고, pts로 나타나면 터미널로 접속했다는 의미이다. trainer3을 보면 pts 뒤에 0이라는 숫자가 있는데, 해당 유저가 서버에 터미널로 접속한 몇 번째 유저인지를 뜻한다. 
  • FROM : 해당 유저의 ip주소를 나타낸다. root는 콘솔로 접속하여서 ip가 나타나지 않는다.
  • LOGIN@ : 해당 유저가 로그인 한 시간을 나타낸다.
  • IDLE : 사용자가 얼마나 오랫동안 아무 입력도 없이 가만히 있었는지를 나타낸다.
  • JCPU : 사용자가 CPU를 얼마동안 사용하지 않았는지를 나타낸다.
  • PCPU : WHAT 필드에 있는 명령이 얼마나 지연되었는지를 나타낸다.
  • WHAT : 사용자가 어떠한 명령을 사용하고 있는지를 나타낸다.

 

-tty : 자신의 터미널이 무엇인지 확인할 수 있다.

 

 

-ifconfig : 접속한 서버의 ip주소를 출력해준다.

현재 서버에 접속한 다른 사용자와 대화를 할 수도 있다. 우선 터미널을 새로 열어서 guest라는 이름으로 접속한다. 이 때 guest의 비밀번호는 guest이다. 그리고나서 trainer3 계정으로 who 명령어를 통해 접속자를 확인한다. 

 

guest가 로그인되어 있는 것을 볼 수 있다. 대화를 하기 위한 명령어는 다음과 같다.

[write ID /dev/pts/pts번호]

guest의 포트번호가 1이기 때문에 write guest /dev/pts/1 로 실행하면 된다.

trainer3에서 해당 명령어를 사용하면 trainer3은 입력 대기 상태가 되고 guest의 창에 이런 문구가 뜬다. 이 때, trainer3에서 아무 메세지나 입력해본다.

 

trainer3에서 메세지를 보낼 때마다 guest로 전송된다. 이 때, 한글을 입력했을 땐 \244\261 처럼 보내졌는데, 아마 해당 서버에서 유니코드를 지원하지 않는다던가... 등의 이유로 그럴 가능성이 높다.

 

[wall 내용] 명령어를 이용해 해당 서버에 접속한 모든 유저들에게 메세지를 보낼 수 있다.

test라는 메세지가 전송된 것을 볼 수 있다. wall을 이용한 메세지는 root 계정에게도 전송된다.

 

 

#Trainer 4

 

trainer 4에선 최상위 디렉토리에 존재하는 디렉토리들에 대해서 배운다. 최상위 디렉토리에 있는 것들은 리눅스를 설치하면 기본적으로 생성되는데, 각 디렉토리마다 역할이 있다.

  • bin : 리눅스에서 사용할 수 있는 명령어들을 저장하는 디렉토리로, ls, rmdir 등등의 명령어가 저장되어 있다.
  • boot : 리눅스 부팅에 관련된 파일과 커널이 들어있다.
  • dev : 컴퓨터에 설치된 장치들에 관한 정보가 파일 형태로 저장되어 있다.
  • etc : 중요한 정보들을 저장한다. 패스워드 파일, 쉐도우 파일, 리눅스 설정 관련 파일 등등이 저장되어 있다.
  • home : 유저의 디렉토리가 저장되는 공간이다. 
  • lib : 라이브러리 파일들이 저장되어 있다.
  • mnt : mount 명령어를 통해 마운트 한 cd-rom, 플로피 디스크 등이 저장되어 있다.
  • proc : 프로세스들이 파일의 형태로 저장되어 있다.
  • root : 일반 사용자의 디렉토리는 /home 아래에 저장되지만 루트의 디렉토리는 이 곳에 저장된다.
  • sbin : bin에 저장된 기본 명령어들을 제외한 시스템 관리용 명령어가 저장되어 있다. 해당 디렉토리에 저장된 명령어는 루트 권한으로 사용해야 한다.
  • tmp : 파일을 임시로 저장하는 디렉토리이다. 
  • usr : 응용프로그램들이 설치되어 있는 디렉토리이다.
  • var : 시스템 운영 중에 생성되는 임시 파일들과 외부에서의 접속에 대한 로그가 저장된다.

디렉토리가 너무 많고 디렉토리마다 저장되어 있는 파일도 많지만, 중요한 역할을 하는 파일만 간추려보면 다음과 같다.

  • /etc/passwd : 사용자들에 대한 정보가 간략하게 들어있다.
  • /etc/shadow : 사용자들의 패스워드가 들어있다. 아무나 볼 수 없도록 설정되어있다.
  • /etc/services : 서버가 어떠한 서비스를 하고 있는지 볼 수 있다.
  • /etc/issue.net : 서버에 처음 접속하면 나오는 화면을 설정할 수 있다.
  • etc/motd : 로그인 후에 나오는 메세지를 설정할 수 있다.
  • ~/public_html : 각 사용자들의 홈페이지가 저장되어있다.

 

 

1. ls 명령어는 리눅스 기본 명령어이기 때문에 /bin 디렉토리에 저장되어 있다.

2. 접속할 때 trainer4 계정으로 접속했기 때문에, 홈 디렉토리는 /home/trainer4가 된다.

3. 프로그램의 설정 파일들은 /etc에 저장된다.

4. 서버에 접속했을 때 나오는 메세지는 etc 디렉토리 아래에 있는 issue.net 파일이다.

5. /etc/shadow 파일은 사용자들의 비밀번호가 저장되어 있는 파일이고, 아무나 열어볼 수 없다.

 

 

 

 

#Trainer 5

나의 정보를 출력하려면 [whoami] 명령어를 사용하면 된다. 

현재 trainer5로 접속했기 때문에 trainer5가 출력된 것을 볼 수 있다.

 

정보를 출력하는 명령어는 whoami 말고 id도 존재한다.

 

whoami를 출력했을 때보다 더 많은 정보가 나온다.

 

etc 디렉토리에 있는 passwd 파일은 사용자들의 암호를 저장한 파일이였다. 이를 cat 명령어를 통해 출력하면 해당 서버에 등록되어 있는 사용자의 정보를 전부 볼 수 있다. 

맨 앞의 단어들이 사용자의 아이디를 뜻한다는 것만 알고 넘어간다.

 

uname -a 명령어를 입력하면 해당 서버의 커널 버전을 알 수 있다. 해당 서버의 커널 버전은 2.4.20이다. 

커널이란 리눅스 운영체제의 핵심으로, 운영체제 내에서 혹은 응용 프로그램 수행시에 필요한 여러 서비스를 제공해주는 역할을 한다. 커널 버전에 따라 시스템의 성능도 차이가 난다. 

 

리눅스 운영체제는 버전이 굉장히 많은데, 기본적인 기능에는 별 차이가 없지만 버전마다 설치되어 있는 패키지의 종류는 다 다르다. 해당 서버의 OS를 확인하는 명령어는 cat /etc/*release 이다.

 

해당 서버의 버전은 레드햇 리눅스 9라고 출력이 된다. 리눅스는 버전마다 패키지의 종류가 다르다고 하였는데, 해당 서버의 패키지에 대한 정보를 출력하는 명령어로 rpm -qa가 있다. 명령어를 실행하면 굉장히 많은 패키지들이 출력되는데, 패키지의 버전을 보고 해킹이 가능한지 불가능한지 판단할 수가 있다. 해당 서버의 cpu 정보도 출력할 수 있다. 명령어는 cat /proc/cpuinfo 이다.

 

서버의 cpu 정보.

 

나의 cpu 정보.

 

해당 서버는 내 컴퓨터에 열려있기 때문에, 서버의 CPU가 실제 CPU와 같은 것을 볼 수 있다.