hint 파일의 내용은 다음과 같다.

setuid 함수로 level 13 계정의 uid로 바꿔주고 있고, gets 함수로 입력을 받는다. 입력을 받는 str의 크기는 256바이트 이지만, 입력값에서 제한을 하고 있지 않기 때문에 bof 취약점이 발생할 수 있다. 정상적인 입력값을 받는다면 문자열을 입력받고, 입력값을 그대로 출력해주는 프로그램이다. 

파일 목록을 보면 attackme라는 파일이 있었고, 그 파일을 tmp 디렉토리로 복사하여(권한문제 때문) gdb로 main 함수를 확인하며 다음과 같다.

str의 크기는 256이지만 264 만큼의 크기를 확보하고 있기에 str 256바이트에 dummy 8바이트가 들어가는 것 같다. str의 시작점에서 ret까지의 거리는 str의 크기 256 + dummy(8) + SFP(4) = 268이다. 전 문제 처럼 환경변수에 쉘 코드를 넣고, RET에 환경변수의 주소를 넣어 level 13 계정의 쉘을 딸 수 있을 것 같다.

사용한 쉘 코드는 전 문제와 동일하다.

\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

SHELL12 라는 이름으로 환경변수를 만들어 쉘 코드를 넣어주었다.

다음과 같은 코드로 쉘 코드를 넣은 환경변수의 주소를 알아낼 수 있다.

페이로드를 넣을 때는 전 문제와 달리 프로그램 실행 후 값을 입력받는 방식이기 때문에 "넣을 값"; cat | ./attackme의 형식으로 실행하면 넣을 값이 attackme 실행후 값으로 들어가고, 값을 입력할 수 있게 된다.

따라서  다음과 같이 payload를 작성하면 쉘을 딸 수 있다.

$ (python -c 'print "A"*268+"\x18\xfe\xff\xbf"'; cat) | ./attackme

 

'Project H4C Study Group' 카테고리의 다른 글

[Project H4C][pwnable.kr] collision  (0) 2021.03.30
[Project H4C][pwnable.kr] fd  (0) 2021.03.30
[Project H4C] FTZ (8 ~11)  (0) 2021.03.27
[Project H4C] FTZ (1 ~ 7(문제오류))  (0) 2021.03.24
[Project H4C] C언어 코딩도장(14)  (0) 2021.03.23

Level 8

문제의 힌트는 다음과 같다.

find 명령어의 size 옵션을 활용해서 2700 용량을 가진 파일을 찾을 수 있었다. 크기 뒤에 b, c, k, w를 붙여 확인해본 결과 2700은 바이트 단위임을 알 수 있었다.

찾은 found.txt 파일을 열어보니 다음과 같이 level9의 shadow 파일임을 알 수 있었다.

파일의 내용을 존 더 리퍼라는 패스워드 크랙 툴을 이용하여 크랙하면 다음과 같은 비밀번호를 얻을 수 있다.

 

Level 9

문제의 hint파일의 내용은 다음과 같다.

bof파일을 통해 level10의 권한을 얻어야 하는것 같고, buf2의 앞 두글자가 go와 같으면 시스템 함수를 실행시켜 주는 것 같다. 입력값은 buf로 받고 있는데, buf의 크기는 10인데, 입력값 제한을 40으로 하고 있어서 bof가 발생한다.

gdb로 main함수를 보면 다음과 같다.

입력값은 ebp - 40에 들어가고 있고, strncmp로 비교하는 값은 ebp-24 에 들어가고 있다. ebp - 40이 buf이고, ebp-24가 buf2인 것이다. 메모리 공간이 16만큼 차이가 나므로 프로그램을 실행하고 입력할 때 16개만큼 다른 값으로 채우고, go를 넣으면 buf2에 go가 들어가서 조건문을 만족시킬 수 있다.

 

Level 10

시스템에서 프로세스의 메모리는 그 프로세스만 접근이 가능하지만, 공유 메모리를 사용하게 되면 다른 프로세스에서도 메모리에 접근할 수 있다.  공유메모리의 key_t값이 주어졌기 때문에 이 키 값의 공유메모리를 사용하는 프로그램을 만들어서 대화 내용이 있는 메모리에 접근할 수 있을 것 같다.

다음과 같이 C코드를 작성하여 위 힌트의 대화방과 같은 키값을 사용하여 메모리를 공유하는 프로그램을 만들어 줬다.

공유메모리를 생성하려면 sys/shm.h 헤더파일과 sys/ipc.h헤더파일을 사용해야 한다. shmget 함수로 7530 키를 가진 공유 메모리를 생성할 수 있고 shmat 함수로 공유메모리 프로세스에 접근할 수 있다. 메모리 주소를 반환하며 SHM_RDONLY옵션을 사용하면 읽기 전용이다. 메모리에 저장된 값을 출력하면 다음과 같은 내용이 나와 level11의 비밀번호를 알 수 있다.

 

Level 11

hint파일의 내용은 다음과 같다.

파일 목록을 보면 attackme 라는 파일이 있는 것을 확인할 수 있다.

힌트 파일의 내용이 attackme 파일의 소스코드 인 것 같다. 인자로 문자열을 받고 있고 인자로 받은 문자열을 str에 저장하고, str을 출력하는 프로그램이다. 

문제 파일을 gdb로 실행하면 권한에 의한 오류가 발생하기 때문에 파일을 복사하여 복사한 파일을 분석해야 한다.

gdb로 main 함수를 보면 다음과 같다.

ebp - 264를 사용하는 것으로 보아 256크기의 str 변수에 8바이트의 dummy가 들어가는 것 같다. 쉘 코드를 str에 넣고, str에서 bof를 발생시켜 ret까지 덮은 후에 ret에 str의 주소를 넣어 쉘 코드를 실행시킬 수 있을것 같아서 시도해보니 str의 주소가 프로그램을 시작할때마다 무작위로 바뀌는 aslr 보호 기법이 적용되어 있어서 불가능할 것 같다.

다른 방법을 찾아보다 환경변수는 리눅스 시스템에 저장되어 있기 때문에 한번 설정하면 주소가 바뀌지 않아서 환경 변수에 쉘 코드를 넣고 ret에 환경변수의 주소를 덮으면 쉘을 딸 수 있다고 한다.

사용한 쉘 코드는 다음과 같다.

\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

다음과 같이 export 명령으로 환경변수에 쉘 코드를 넣을 수 있다. 환경변수 이름은 SHC로 하였다. 또한 env 명령으로 설정한 환경변수를 확인할 수 있다.

환경변수의 주소는 stdlib.h 헤더의 getenv()함수로 알아낼 수 있다. 다음과 같이 c코드를 짜고 컴파일하여 실행하면 설정한 환경변수의 주소를 알아낼 수 있다.

이제 str크기(256) + dummy(8) + SFP(4) = 268만큼 덮고 ret에 저 주소를 리틀엔디언 방식으로 덮으면 쉘을 딸 수 있다.

'Project H4C Study Group' 카테고리의 다른 글

[Project H4C][pwnable.kr] fd  (0) 2021.03.30
[Project H4C] FTZ 12  (0) 2021.03.29
[Project H4C] FTZ (1 ~ 7(문제오류))  (0) 2021.03.24
[Project H4C] C언어 코딩도장(14)  (0) 2021.03.23
[Project H4C] C언어 코딩도장(13)  (0) 2021.03.23

Level 1

level 1에 접속하여 파일 목록을 확인하면 hint파일이 있는 것을 확인할 수 있다.

hint 파일을 읽어보면 "level2 권한의 setuid가 걸린 파일을 찾는다." 라고 쓰여 있다.

파일을 찾는것은 find 명령어를 통해 찾을 수 있으며 -user 옵션을 통해 파일 소유자를, -perm 옵션은 권한을 의미하며 4000 권한은 setuid가 설정되어 있음을 의미한다. 따라서 다음과 같은 명령어로 힌트로 주어진 파일을 찾을 수 있다.

$ find / -user level2 -perm -4000 2>/dev/null

2>/dev/null은 표준에러(2)가 발생하면 /dev/null(리눅스의 휴지통)으로 넣어준다는 의미이다.

명령어를 실행하면 다음과 같은 결과가 나온다.

/bin/ExecuteMe 파일을 실행하면 level2 권한으로 명령어를 실행시켜준다고 나오고, /bin/bash 명령을 입력하면 level2의 쉘을 딸 수 있다.

 

Level 2

hint 파일을 읽어보면 텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다고 한다.

level3 권한으로 setuid가 걸려있는 파일을 확인해보면 다음과 같다.

editor을 실행시키면 vim 텍스트 에디터가 실행된다.

vim 텍스트 에디터에서는 ! 뒤에 명령어를 사용하면 쉘 명령어를 사용할 수 있다.

! id로 level3 사용자 권한으로 명령어를 실행한다는 것을 알 수 있다.

! my-pass로 level3의 비밀번호를 확인할 수 있고 ! /bin/bash로 쉘을 딸 수 있다.

 

Level 3

hint 파일을 읽어보면 다음과 같다.

C 코드를 읽어보면 인자의 갯수가 2가 아니면 if문이 실행되면서 printf함수로 출력하고 프로그램을 종료한다. cmd라는 배열에 dig @와 argv[1] 인자로 준 값, 이후 문자열이 들어가고 있고 시스템 함수로 cmd 배열의 문자열을 실행한다. autodig 프로그램을 실행하면서 인자로 명령어를 넣어줘야 하는데 이미 앞에서 dig 명령어가 사용되고 있기 때문에 동시에 여러 명령어를 사용하려면 세미클론을 사용하여 인자를 전달하면 된다.

autodig 프로그램은 find명령어로 찾으면 다음과 같은 곳에 있다.

autodig를 실행하고 인자로 ";/bin/bash;"를 넣어주면 level4의 쉘을 딸 수 있고, my-pass 명령어로 비밀번호를 확인할 수 있다.

 

Level 4

hint 파일을 보면 "누군가 /etc/xinetd.d/에 백도어를 심어놓았다.!" 라고 한다.

해당 경로의 파일 목록을 보면 다음과 같이 backdoor파일을 확인할 수 있다.

backdoor파일의 내용을 보면 다음과 같다.

finger 이라는 서비스를 통해 level5의 권한으로 /home/level4/tmp/backdoor이라는 서버 파일을 실행한다. 

finger 명령어는 리눅스에서 사용자의 계정정보를 확인하는 명령어이다. finger을 실행하면 backdoor 파일의 내용으로 인해 /home/level4/tmp/backdoor 파일이 실행될 것 같다.

tmp 폴더로 이동하여 backdoor 파일을 만들어야 한다.

시스템함수로 my-pass 명령을 실행하는 c 코드를 작성하고 gcc로 컴파일 하고 finger명령어를 실행하면 비밀번호를 알 수 있다.

 

Level 5

hint 파일을 읽어보면 다음과 같다.

힌트의 level5 파일은 level6 계정 권한으로 setuid가 걸려있음을 확인할 수 있다.

level5를 실행하고 /tmp 디렉토리를 확인해보면 level5.tmp라는 임시파일이 없다. 임시파일을 만들고 삭제시켜주는것 같다.

생성되는 임시파일을 이용하여 권한상승을 하는 레이스 컨디션 공격 기법이 있다고 한다.

레이스 컨디션(Race Condition)은 한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상이라고 한다. 레이스 컨디션을 이용한 공격은 취약 프로그램이 생성하는 임시 파일의 이름을 파악하고, 그 임시파일과 같은 이름의 파일을 생성히고 이 파일에 심볼릭 링크를 생성한 후 원본 파일을 지운다. 원본 파일이 지워진 상태에서 취약한 프로그램이 심볼릭 링크를 건 파일과 같은 파일을 생성할 때를 기다렸다가 심볼릭 링크를 이용해 파일의 내용을 변경한다. 

이 문제의 경우 취약한 파일은 level5 이고, 임시파일의 이름은 level5.tmp가 된다.

tmp 디렉토리에 level5.tmp에 심볼릭 링크로 연결할 파일을 하나 만들고 심볼릭 링크로 연결했다.

이후 level5를 실행하면 심볼릭링크로 연결된 level5에 level5.tmp의 내용이 저장되고 /tmp/level5파일의 내용을 확인하면 다음 레벨의 비밀번호를 확인할 수 있다.

 

Level 6

level6 계정으로 접속하면 다음과 같은 힌트가 나오고, 텔넷 접속 서비스가 나온다.

번호를 입력하면 ssh 연결이 끊기고, ctrl + c로 현재 프로그램을 종료하려고 하면 ctrl + c를 사용할 수 없다고 한다. 

다시 level6 계정으로 접속해서  힌트만 보이는 화면에서 ctrl + c를 누르면 현재 프로그램이 강제 종료되고 프롬프트가 나온다. 파일 목록을 확인해보면 password 파일이 있고 password파일을 확인해보면 level7계정의 비밀번호를 알아낼 수 있다.

 

Level 7

hint 파일을 보면 다음과 같은 내용이 나온다.

level7 을 실행해보면 wrong.txt가 존재하지 않는다는 메시지가 나오면서 문제를 더이상 진행할 수 없다.

 

'Project H4C Study Group' 카테고리의 다른 글

[Project H4C] FTZ 12  (0) 2021.03.29
[Project H4C] FTZ (8 ~11)  (0) 2021.03.27
[Project H4C] C언어 코딩도장(14)  (0) 2021.03.23
[Project H4C] C언어 코딩도장(13)  (0) 2021.03.23
[Project H4C] PLT, GOT  (0) 2021.03.21

Lesson 8

우리가 만들 수 있는 파일에는 크게 두가지 종류가 있다.

일반 텍스트 파일은 글자로만 이루어진 파일이다. 이러한 텍스트 파일은 cat 명령어로 출력한다.

프로그램 소스 파일은 컴퓨터 언어로 입력한 파일이며 컴파일 이라는 과정을 거쳐 실행 가능하도록 만든 후 사용한다.

텍스트 파일은 다음과 같이 생성할 수 있다.

1. 쉘 프롬프트에서 cat > 파일이름.txt 라고 입력

2. 원하는 내용 작성

3. control + D키 입력

1번 과정에서 > 문자는 리다이렉션 이라고 부르며 cat의 결과를 모니터가 아닌 파일로 보내는 것이다.

리다이렉션을 한 번 사용하면 새로운 파일이 만들어지지만, 기존의 내용을 보존시키면서 글자를 추가하려면 다음과 같이 리다이렉션을 두 번 사용하면 된다.

cat >> 파일이름.txt

 

소스 파일을 만드는 방법도 텍스트 파일과 동일하지만 언어를 컴퓨터 언어인 C언어로 작성한다는 차이가 있다.

C언어로 소스 작성이 끝났으면 컴파일을 해야 프로그램을 실행할 수 있다.

컴파일은 다음과 같이 진행한다.

gcc -o 프로그램이름 소스파일이름 

프로그램을 실행할때는 만들어진 프로그램이 있는 경로에서 실행해야 한다. 내가 만든 프로그램의 이름은 program.exe 이기 때문에 /home/trainer8/program.exe 를 입력하면 프로그램이 실행된다. 또한 현재 디렉토리를 의미하는 . 을 이용하여 ./program.exe처럼 상대경로로 현재 디렉토리에 있다면 바로 실행할 수 있다.

 

Lesson 9

리눅스는 각 사용자마다 특별한 권한을 부여하여 그 권의 범위를 넘어서지 않는 파일들만 제어할 수 있도록 설정되어 있다. ls -al 명령으로 파일들의 권한에 대한 정보를 출력할 수 있다.

리눅스의 권한에는 4가지 종류의 사용자가 있다.

    • user(유저) : 아이디로 로그인 한 자기 자신을 의미한다.
    • group(그룹) : 모든 유저는 하나 이상의 그룹에 속하게 된다. 그 그룹을 따로 변경하지 않는 한 자신의 유저네임과 같은 이름의 그룹에 속하게 된다.
    • other(아더) : 유저와 그룹을 제외한 모든 다른 사람을 의미한다.
    • root(루트) : 절대적인 권한을 가진 사용자이다. 어떤 권한에도 구애받지 않고 파일들을 제어할 수 있다.

id 라는 명령을 사용하면 다음과 같이 출력된다.

uid는 User ID의 약자이다. id라는 명령을 통해 현재 로그인한 계정의 uid는 2009라는 것을 알 수 있다.

gid는 group ID의 약자이다. 다른 사람을 자신의 gid를 가진 그룹에 속하게 할 수 있고, 특별한일이 없는 한 gid는 항상 uid와 같다.

groups는 현재 자신이 어떤 그룹에 속해있는지 말해준다. 임의의 변경이 없으면 기본으로 uid와 같은 그룹에 속하게 된다.

위는 ls -al 로 test1 이라는 파일을 확인한 것이다. rwxrwxrwx를 보면 rwx rwx rwx 로 3문자씩 끊었을 때 각각 유저, 그룹, 아더의 권한을 의미한다. 영문자 r, w, x는 순서대로 읽기(r), 쓰기(w), 실행(x) 권한을 의미한다. 위 예시에서 trainer9 자리가 유저, trainer10 자리가 그룹을 의미한다. 이 둘을 제외한 모든 아이디는 아더이다.

따라서 위의 test1 파일은 trainer9 라는 uid를 가진사람과 tranier10이라는 gid를 가진 사용자, 이 둘을 제외한 다른 모든 사람들에게 읽기, 쓰기, 실행 권한이있다. 즉 아이디가 있는 모든 사용자는 이 파일을 마음대로 접근하고 변경할 수 있다.

위 test2 파일의 경우 guest라는 uid를 가진 사용자는 읽기, 쓰기, 실행 권한이 있고, trainer1 이라는 gid를 가진 사용자는 읽기 실행 권한이 있고, 이 둘을 제외한 다른 모든 사용자는 실행 권한만 갖는다.

 

읽기 권한은 cat 명령으로 파일을 볼 수 있는 권한이고, 쓰기 권한은 그 파일의 수정 권한이다. 실행권한은 윈도우에서 exe 파일처럼 실행할 수 있는 파일로 리눅스에서는 확장자로는 실행파일인지 확인할 수 없고, 권한에서 x라는 문자가 있는지 확인하고 판단해야 한다.

 

루트 권한만 접근할 수 있는 shadow 파일의 권한은 다음과 같다.

 

Lesson 10

해킹방식에는 Local 해킹과 Remote 해킹 두가지 종류의 방식이 있다.

Remote 해킹은 자신의 해킹하고자 하는 서버에 아이디가 없을 때 아이디를 얻고자 시도하는 것이다.

Local 해킹은 해킹 하고자 하는 서버에 일반 계정이 있을 때 관리자 권한을 얻고자 시도하는 것이다.

 

SetUID는 일시적으로 자신의 ID를 변경하는 것을 말한다. passwd 명령어를 사용하여 패스워드를 바꾸는 경우 shadow파일은 루트만 수정권한이 있는데 일반 사용자도 패스워드를 변경할 수 있다. 이러한 경우 passwd에 SetUID가 걸려 있어 passwd 파일을 실행하는 동안 루트로 일시적인 아이디 변경이 되는 것이다.

SetUID는 필요한 만큼만 관리자 권한을 제공하고 그 일이 끝나면 다시 가져가는 것이 일반적이지만 SetUID가 걸린 파일들을 통해서 관리자 권한을 완전히 가져오게 될수도 있다.

버퍼 오버플로우의 경우 루트 권한으로 SetUID가 걸려 있는 파일에 프로그램의 에러를 발생시키고 에러가 나는 순간 /bin/bash 파일을 실행하게 조작하여 프로그램이 실행되는 동안 루트 아이디로 변경되고, 그 상태에서 /bin/bash를 실행해 루트 권한의 쉘을 획득하는 공격이다.

 

다음과 같이 x권한이 올 자리에 s가 있으면 SetUID가 설정된 것이다. s는 x(실행권한)도 포함한다.

이 파일은 모든 사용자에게 실행권한이 있지만 root에 SetUID가 걸려있기 때문에 어느 사용자가 저 파일을 실행해도 루트의 권한을 갖는다.

find / -perm -4000 의 명령을 사용하면 서버 전체에서 SetUID가 걸린 모든 파일을 찾을 수 있다. 위 명령을 해석하면 / 에서부터 적어도 SetUID가 걸린 모든 파일을 찾으라는 명령이다. 4는 SetUID를 의미하며 000은 rwx모두를 의미한다.

find 명령의 옵션은 다음과 같다.

  • -perm : 권한과 일치하는 파일을 찾음
  • -name : 이름과 일치하는 파일을 찾음
  • -user : 유저와 일치하는 파일을 찾음
  • -group : 그룹과 일치하는 파일을 찾음

위 옵션들을 조합하여 사용할 수 도 있다. find / -user root -perm 4000은 루트 권한으로 SetUID가 걸린 파일을 찾는 것이다.

FTZ의 이후 레벨별 문제들은 다음 레벨로 SetUID가 걸린 파일을 찾아서 그 파일을 이용하여 그 레벨의 쉘을 얻으면 된다. 쉘을 얻고 my-pass를 입력하면 해당 계정의 패스워드를 확인할 수 있다.

Lesson 4

최 상위 디렉토리의 디렉토리 종류와 역할은 다음과 같다.

  • bin : 필수적인 리눅스 실행 파일들이 저장된 위치(ls, rm등)
  • boot : 리눅스 부팅 관련 파일, 커널 이 들어있는 곳
  • dev : 컴퓨터에 설치된 하드웨어 관련 정보들이 파일 형태로 저장되어 있는 위치
  • etc : 패스워드 파일, 쉐도우 파일, 리눅스 설정 파일 등이 들어 있는 위치
  • home : 일반 사용자들의 디렉터리가 들어가는 위치
  • lib : 라이브러리 파일들이 들어있는 위치
  • mnt : mount 명령을 사용하여 마운트 시킨 시디롬 등이 들어가는 위치
  • proc : 프로세스들이 파일 형태로 저장되는 위치
  • root : 루트 계정의 홈 디렉토리
  • sbin : 기본 명령을 제외한 시스템 관리용 실행파일이 들어있는 디렉토리
  • tmp : 임시로 파일을 저장하는 디렉토리, 권한 관계없이 누구나 파일을 생성할 수 있다.
  • usr : 다양한 응용 프로그램들이 설치되어 있는 디렉토리
  • var : 시스템 운영 중에 생성되는 각종 임시 파일들, 외부 접속에 대한 로그 파일들이 저장되는 위치

리눅스의 중요한 역할을 하는 파일들은 다음과 같다.

  • /etc/passwd : 사용자들에 대한 간단한 정보
  • /etc/shadow : 사용자들의 패스워드가 암호화하여 저장됨
  • /etc/services : 서버가 어떤 서비스를 하는 중인지 보여줌
  • /etc/issue.net : 처음 접속할 때 나오는 화면( FTZ의 경우 해커스쿨의 F.T.Z에 오신걸 환영합니다! 라는 문구)
  • /etc/motd : 로그인 후에 나오는 메시지
  • ~/public_html : 각 사용자들의 홈페이지 파일

다음은 FTZ의 퀴즈와 답이다.

 

 

Lesson 5

whoami : 접속한 자기 계정이 누구인지 확인하는 명령어

id: 접속한 계정에 대한 더 많은 정보

cat : 파일을 읽는 명령어

다음은 cat명령어로 /etc/passwd 파일을 읽은 것의 일부이다.

각 줄의 가장 왼쪽의 단어가 사용자들의 아이디 이다.

 

커널은 리눅스의 심장부 역할을 하는 파일로, 커널 버전에 따라 리눅스의 성능 차이가 발생할 수 있다. 같은 버전의 리눅스라도 커널 버전이 높다면 속도도 빨라지고, 안정성도 높아진다.

uname -a 명령으로 커널 버전을 확인할 수 있다.

위 FTZ의 경우 커널 버전은 2.4.20이고, 2.2.18이전 버전의 모든 커널들은 취약점을 가지고 있다고 한다.

root권한은 리눅스나 유닉스에서 모든 파일을 관리하는 절대적인 관리자 권한이다. 리눅스는 여러명의 사용자가 동시에 작업을 하기에 자신에게 권한이 부여된 파일만 제어할 수 있지만, 루트 권한을 가진 사용자는 어떠한 권한에도 구속되지 않고, 서버를 조정할 수 있다.

 

서버에 설치된 OS는 cat 명령어로 /etc/*release라고 입력하면 확인할 수 있다.

Red Hat Linux 9 버전임을 확인할 수 있다.

 

패키지의 정보는 rpm -qa명령으로 확인할 수 있다.

위는 명령 실행 결과의 일부로 많은 패키지들이 깔려 있음을 확인할 수 있다.

 

cat명령어로 /proc/cpuinfo를 확인하면 서버의 cpu정보를 확인할 수 있다.

 

Lesson 6

/etc/passwd(이하 패스워드 파일)은 한 서버를 사용하는 사용자들의 모든 정보를 기록해 놓은 파일이다. 사용자의 아이디, 어떤 함호를 이용하여 로그인을하는지, 속한 그룹, 이름 등의 정보가 들어있다.

다음은 패스워드 파일의 root 계정이 있는 줄을 가져온 것이다.

: 은 필드를 구분해주는 문자이다.

첫 번째 필드는 로그인 할 때 사용되는 아이디이다. 두번째 필드는 원래 패스워드가 적혀있는 부분인데 리눅스 버전  6.0 이후 크래커들이 악용을 막기 위해 두번째 필드의 패스워드를 없애버리고 따로 모아 저장하는 /etc/shadow 라는 파일을 사용한다. /etc/shadow파일은 일반 사용자 계정들은 접근할 수 없다. 

세 번째 필드는 컴퓨터가 사용자를  인식하기 위한 숫자이다. 0은 root를 의미한다. 네번째 필드는 사용자가 속해있는 그룹을 말해준다. 

다섯번째 필드는 사용자 이름을 말해주는 부분이다. 위의 경우 관리자를 의미하는 Admin이 사용자 이름이다. 여섯 번째 필드는 해당 사용자가 로그인 성공했을 때 위치하게 되는 홈 디렉토리 이다. 7번째 필드는 사용자가 처음으로 로그인 했을 때 실행되게 할 프로그램이다. 위 처럼 로그인 했을 때 쉘이 실행되도록 하는 것이 일반적이다.

Lesson 7

리눅스는 서버의 용도로 사용되기 때문에 데이터들의 손실을 막기 위해 백업을 필수적으로 해야 하며 백업할 때는 압축 명령어 들이 사용된다.

tar은 여러개의 파일을 하나로 합치는 명령어이다. 옵션은 다음과 같다.

  • c - Create : 새로운 파일을 만듬
  • x : eXtract : 압축 해제
  • v : View : 압축이 되거나 풀리는 과정을 출력
  • f : File : 파일로서 백업을 하겠다는 옵션

따라서 파일을 합칠때는 cvf, 해제할 때는 xvf 를 사용한다.

위 명령은 현재 디렉토리의 모든 파일(*)을 songs.tar 이라는 이름으로 합친 것이다.

실제로 다음과 같은 파일이 생성됨을 확인할 수 있다.

위 만들어진 파일의 용량 부분을 보면 3개의 파일을 뭉쳤는데 용량은 오히려 더 증가하였다. tar은 압축하지 않고, 파일을 합쳐버리기만 할 때 사용된다. 또한 gzip은 한 번에 한개의 파일만 압축할 수 있기 때문에 여러개의 파일을 압축하려면 tar로 파일을 합친 뒤 압축해야 한다.

gzip을 사용하여 tar로 합친 파일을 압축하면 다음과 같이 용량이 줄은것을 확인할 수 있다.

tar과 gzip을 사용한 파일들의 확장자는 다음과 같다.

  • tar : tar 프로그램을 사용하여 하나로 합쳐진 파일
  • gz : gzip 프로그램을 사용하여 압축된 파일
  • tar.gz : tar프로그램을 사용하여 합친 후 gzip을 사용하여 압축한 파일
  • tgz : 위 확장자를 합쳐서 tgz로 사용할 때도 있다.

현재 디렉토리에는 다음과 같이 압축된 파일만 존재한다.

gzip에서 -d 옵션을 사용하면 gzip 압축을 해제할 수 있다.

tar에 xvf를 사용하여 tar을 해제할 수 있다.

 

Lesson 1

해커스쿨 서버는 현재 열려있지 않아서 로컬에 ftz 서버를 구축하고, ssh를 이용하여 접속했다. 

비밀번호를 입력하여 로그인 성공시 프롬프트가 나타나며 프롬프트는 명령 입력 대기 상태에서 명령을 기다린다.

프롬프트에는 접속 id, 서버, 현재위치의 정보가 있다.

프롬프트에 ls 명령어를 입력하면 다음과 같이 현재 디렉터리의 파일 목록을 확인할 수 있다.

ls 명령어에 -l 옵션을 추가하여 ls -l 을 입력하면 어떤것이 디렉터리이고, 어떤것이 파일인지 등 더 자세한 정보를 확인할 수 있다.

각 파일마다 구분되어 있는 필드에는 파일이 생성된 날짜 정보가 있고, 14698 같은 숫자들은 파일의 용량이다. tranier1 trainer1 과 같은 내용을 퍼미션에 관련한 정보이며 맨 첫번째 필드가 파일의 모드와 성격 정보를 가지고 있는데 가장 왼쪽의 문자가 - 면 일반 파일이고, d이면 디렉터리를 의미한다.

이후로 퀴즈가 나오는데 퀴즈 내용과 답은 다음과 같다.

ls명령어로는 보이지 않는 숨김 파일은 -a 옵션을 추가한 ls -a 명령어로 확인할 수 있다.

숨김 파일은 파일명 가장 앞에 . 이 붙어있다는 특징있다. 

ls 명령어는 ls -al 처럼 둘 이상의 옵션도 함께 사용할 수 있다. 함께 사용하면 사용하는 모든 옵션의 효과를 한번에 사용할 수 있다.

 

Lesson 2

자신이 현재 속해있는 디렉터리를 확인하려면 pwd 명령어를 이용하면 된다.

프롬프트에서 현재 위치의 정보는 앞의 경로는 생략하고 가장 뒤쪽의 경로만 나타내고 있다.

현재 경로에서 한 단계 위로 가려면 cd .. 명령어를 이용한다. 지금 경로에서 한단계 위로 가면 /home 가 되고 또 한단계 위로 가면 / 가 되는데, / 은 최상위 디렉토리이며 루트 디렉토리 라고도 한다.

경로를 내려갈때는 cd trainer2 처럼 디렉토리 이름을 붙이면 된다. 

.. 을 사용하지 않고 한번에 루트 디렉터리로 올라가려면 cd / 을 입력하면 된다. 또한 한 번에 trainer2 로 내려가려면 cd /home/trainer2처럼 루트 디렉토리부터 모든 경로를 입력하면 된다.

새로운 디렉토리를 만드는 명령어는 mkdir 이다. mkdir에 만들 디렉토리의 이름을 지정해주면 된다.

mkdir linuxer로 linuexer로 디렉토리를 만들면 ls 명령어로 확인 시 만든 디렉토리가 생성됨을 확인할 수 있다.

 

디렉토리를 삭제할 때는 rmdir이라는 명령어를 이용한다. 

rmdir linuxer을 입력하고 ls -al을 입력하면 linuxer 디렉터리가 삭제됨을 확인할 수 있다.

 

cp 명령어는 파일을 복사하는 명령어다. cp 파일1 파일2 와 같은 형태로 사용하면 파일1이 파일2의 이름으로 복사된다.

 

파일을 삭제하는 명령어는 rm이다. rm 복사사본을 입력하고 ls 명령어로 확인하면 파일이 삭제됨을 확인할 수 있다.

 

파일을 옮기는 명령어는 mv이다. mv명령어는 파일을 옮기는 것을 파일을 복사하고 원본 파일을 자동으로 삭제하는 것으로 처리하기 때문에 파일 이름을 변경할 때도 자주 사용된다.

mv 파일1 파일 2의 형식으로 사용하면 파일1의 이름이 파일2로 변경된다.

 

Lesson3

터미널은 ssh나 텔넷등의 서버를 통해 접속한 것이고, 콘솔은 부팅한 컴퓨터에 직접 접속한 것이라는 의미이다. 

 

w명령어를 사용하면 현재 서버에 접속한 사용자 목록을 확인할 수 있다.

첫번째 필드는 접속한 아이디를 나타낸다. 두번째 필드는 콘솔로 접속했는지, 터미널로 접속했는지 보여준다. tty면 콘솔접속, pts면 터미널 접속을 의미한다. 3번째 필드는 접속한 사람의 ip를 의미한다. 콘솔 접속한 경우 ip는 보이지 않는다. 4번째 필드는 로그인 시간이고, 5번째 필드는 지연시간으로 사용자가 얼마나 아무것도 입력을 안했는지 확인할 수 있다. 6번째 필드는 cpu를 사용한 지연 시간이고, 7번째 필드는 what 필드에 있는 명령이 지연된 시간, 8번째 필드는 현재 사용하고 있는 명령을 보여준다.

 

finger -l 명령어를 확인하면 사용자에 대한 좀 더 많은 정보를 확인할 수 있다.

 

tty 명령어를 사용하면 자신의 터미널 정보를 확인할 수 있다.

 

ifconfig 명령어를 사용하면 ip 정보를 확인할 수 있다.

 

write 사용자id /dev/pts/pts번호 의 명령어로 서버에 접속한 다른 사용자에게 메시지를 전달할 수 있다.

 

wall "내용" 의 명령어로 현재 접속한 모든 사용자에게 메시지를 전달할 수 있다.

+ Recent posts