LINUX 기초/FTZ

[리눅스 기초] F.T.Z trainer 6 ~ trainer 10

renne 2022. 5. 8. 19:24

<trainer6>

cat 파일이름

 - 파일의 내용을 출력하는 명령 ex) cat /etc/passwd

*패스워드 파일(passwd): 한 서버를 사용하는 사용자들의 모든 정보를 기록해 놓은 파일

위의 문자열들은 ":"에 의해 7개의 필드로 나뉘어 있다.

1번 필드 서버에 로그인할 때 사용되는 아이디(계정)
2번 필드 패스워드가 적혀있던 부분. 리눅스 이전 버전에서는 암호화된 문자열이 나타났으나, 해커들이 문자열 해독을 계속 만들어냈다. 따라서 리눅스 프로그래머들은 리눅스 6.0 이후부터 두 번째 필드에는 x라는 문자만 보여주고, 사용자들의 패스워드는 /etc/shadow라는, 관리자 권한을 가진 사람만 열 수 있는 파일에 모았다.
3번 필드 사용자는 로그인을 할 때 아이디를 사용하지만 컴퓨터는 숫자를 선호하기 때문에, 우리가 root라고 입력하면 컴퓨터는 패스워드 파일을 열어보고 '지금 들어오는 사용자는 0이란 사용자'라고 판단한다.
4번 필드 해당 사용자가 속해있는 그룹(그룹에 대해선 trainer9에서 배운다.)
5번 필드 사용자의 이름
6번 필드 해당 사용자가 로그인에 성공했을 때, 기본으로 위치하게 되는 디렉토리
7번 필드 사용자가 처음 로그인했을 때, 실행되게 할 프로그램

 

<trainer7>

*리눅스는 서버의 용도로 사용되기 때문에, 수시로 새로운 데이터들이 업데이트된다. 따라서 데이터들이 손실되는 것을 방지하기 위해 '백업'을 하는 것이 필수이다.

 

*백업한다: 하드에 들어있는 데이터를 다른 곳으로 복사하여 안전하게 보관한다.

 

tar 명령

- 파일을 합치고 해제하는 명령

 

tar cvf 합칠파일 합칠파일들

 - Create: 새로운 파일을 만드는 옵션

 - View: 압축이 되거나 풀리는 과정을 출력하는 옵션

 - File: 파일로 백업을 하겠다는 옵션

 

tar cvf songs.tar * : 현재 디렉토리에 있는 모든 파일(*)을 songs.tar라는 파일로 합친다.

songs.tar의 용량은 40960으로, 세 파일의 용량을 더한 것(12416 + 6964 + 9328 = 28708) 보다 크다. 따라서 tar 명령은 파일을 압축하지 않고 그냥 합치는 명령이며, 압축된 파일을 복구하는 속도가 매우 빠르다.

 

tar xvf 해제할파일

 - eXtract: 압축을 해제하는 옵션

 

gzip 명령

 - 파일을 압축하는 명령

 - 한 번에 한 개의 파일만 압축할 수 있다.

 - 보통 tar 명령으로 여러 파일들을 하나의 파일로 합치고, 그 파일을 gzip 명령으로 압축한다.

 

gzip 파일이름

 - 파일을 압축한다.

songs.tar 파일이 songs.tar.gz로 변하면서 용량이 40960에서 11589로 줄었다.

 

gzip -d 파일이름

 - 파일을 해제한다.

 

압축 파일의 확장자

tar  tar 프로그램을 사용하여 여러 파일들이 합쳐진 파일
gz  gzip 프로그램을 사용하여 압축한 파일
tar.gz  tar 프로그램을 사용하여 파일들을 합친 후 gzip 프로그램을 사용하여 압축한 파일
tgz  tar.gz를 합쳐서 tgz라는 확장자로 만들 때도 있다.

 

songs.tar.gz 파일을 압축 해제하는 방법

1. gzip -d songs.tar.gz → songs.tar로 해제된다.

2. tar xvf songs.tar → 합쳐진 파일들이 다시 생성된다.

 

<trainer8>

우리가 만드는 파일에는 크게 2가지 종류가 있다.

1. 일반 텍스트 파일: 글자로만 이루어진 파일. cat 명령을 사용하여 내용을 출력한다. 예) linux.txt

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

 

텍스트 파일 생성 방법

1. cat > 파일이름.txt 입력

2. 내용을 작성한다.

3. Ctrl + D

 

 > 

 - redirection. 방향을 전환한다. 왼쪽에서 출력되는 것을 받아서 오른쪽으로 입력하겠다.

 - 리눅스에서는 보통 실행 결과를 모니터로 출력한다. 예를 들어, cat이라고 입력하고 아무 글자를 입력하면, 그대로 모니터에 나타난다. 따라서 리다이렉션을 사용하여 그 입력 결과를 모니터가 아닌 파일로 보내는 것이다.

test.txt 파일에 내용을 입력하고 Ctrl + D 키를 누른다.

test.txt 파일이 생성됐다.

text.txt 파일의 내용을 출력한다.

 

지금처럼 서버에 test.txt 파일이 있을 때, cat > test.txt를 입력하고 내용을 입력하면, 기존의 내용은 모두 사라지고 새로 입력 내용으로 파일이 만들어진다. 기존의 내용을 보존시키면서 내용을 추가로 입력하기 위해서는 리다이렉션을 두 번 사용한다.

 

프로그램 소스 파일 생성, 컴파일, 실행 방법

1. cat > program(소스파일이름).c 입력 (C언어 파일)

2. 소스 코드를 작성한다.

3. Ctrl + D

4. gcc -o program(실행파일이름).exe program(소스파일이름).c 입력 (컴파일)

5. 에러가 없다면 성공적으로 컴파일된 것이다.

6. pwd 명령을 통해 파일의 절대 경로를 알아낸다.

7. 절대 경로의 끝에 파일 이름을 더해서 입력하면 실행이 된다. 절대 경로를 사용하지 않고 파일 이름만 입력하면 "잘못된 명령입니다 (command not found)"라고 나온다.

8. 절대 경로를 입력하는 대신, 현재 디렉토리를 의미하는 "."를 입력하면 간편하게 실행 가능하다.

 

*절대경로: 최상위 디렉토리인 루트(/)에서부터 시작되는 경로 ex) /home/guest/public_html/

*상대경로: 자신이 위치한 디렉토리를 기준으로 따지는 경로 ex) public_html/

 

<trainer9> 

*리눅스는 윈도우와는 달리 한 서버에 여러 사용자가 접속하여 사용한다. 만약 여러분이 이 FTZ 서버에 개인 아이디를 가지고 있다고 해보자. 그럼 여러분은 개인 계정에 할당된 공간에 여러 파일을 생성하게 될 것이다. 그러다 보면 다른 사람이 보면 안 되는 비밀 파일을 올리게 되는 경우도 있을 것이다. 리눅스에서 다른 사람이 나의 파일에 접근하지 못하도록 어떻게 막을까?

 

*이때 나오는 개념이 권한(permission)이다. 리눅스를 사용하게 되면 permission denied라는 에러 메세지를 많이 만나게 될 것인데, 이것은 당신의 권한 밖에 있는 파일을 건드렸다는 뜻이다.

 

*리눅스는 각 사용자마다 특별한 권한을 부여하여, 그 권한의 범위를 넘어서지 않는 파일들만 제어할 수 있도록 설정된다.

 

리눅스의 사용자

유저 user  나 자신
 만약 내가 hello라는 아이디로 로그인을 하면 나는 hello라는 유저가 된다.
그룹 group 모든 유저는 하나 이상의 그룹에 속한다.
임의로 그룹을 변경하지 않는 한, 모든 유저는 자신의 유저네임과 같은 이름의 그룹에 속한다.
아더 other 유저와 그룹을 제외한 다른 모든 사람
루트 root 절대적인 권한을 가지고 있는 사용자
어떤 권한에도 구애받지 않고 파일들을 제어할 수 있다.
이 루트 권한을 얻기 위해 하는 일이 해킹이다

 

id 명령

[trainer9@ftz trainer9]$ id
uid=2009(trainer9) gid=2009(trainer9) groups=2009(trainer9)
2009 컴퓨터는 사용자들에게 자기가 알아보기 쉬운 숫자를 부여하고 그 숫자로 누가 누구인지 판단한다.
즉, trainer9 = 2009 이다.
uid User ID
gid Group ID
특별한 일이 없는 한, uid와 gid는 항상 같다.
groups 현재 자신이 속해 있는 그룹
임의로 변경하지 않는 한, 기본적으로 uid와 같은 그룹에 속하게 된다.

 

파일의 권한 정보 분석

[trainer9@ftz trainer9]$ ls -al test1
-rwxrwxrwx	1	trainer9	trainer10	5 10월 20 21:35	test1
r (read) w (write) x (execute)
읽기 권한 쓰기 권한 실행 권한

 

① rwx 유저의 권한
② rwx 그룹의 권한
③ rwx 아더의 권한
④ trainer9 유저
⑤ trainer10 그룹
⑥ test1 파일명

 

따라서 test1 파일은 유저, 그룹, 아더 모두에게 읽기, 쓰기, 실행 권한이 있는 파일이다.

 

[trainer9@ftz trainer9]$ ls -al test2
-rwxr-x--x	1	guest	trainer1	104 10월 20 21:08	test2

test2 파일은 guest라는 uid를 가진 사용자에게 읽기, 쓰기, 실행 권한이 있다.

test2 파일은 trainer라는 gid를 가진 사용자에게 읽기, 실행 권한이 있다.

test2 파일은 guest와 trainer1를 제외한 사용자들에게 실행 권한만 있다.

 

* 읽기 권한이 없다면 cat 명령으로 파일 내용을 보려고 할 때, permission denied가 나온다.

* 쓰기 권한은 파일의 수정 권한이다. cat >> 명령을 통해 내용을 덧붙이거나, 편집기를 통해 내용을 편집할 수 있다.

 

실행 권한

* 윈도우나 도스에서는 확장자를 보고 파일의 종류를 구분했다. 예를 들면, 확장자가 exe, bat, com인 파일이 실행 파일이다.

* 그러나 리눅스에서는 확장자만 보고 실행파일인지 아닌지 구분할 수 없다. 예를 들면, linux.exe 파일이 실행되는지 안 되는지 알 수 없다.

 

[trainer9@ftz trainer9]$ ls -al /etc/shadow
-r--------	1 root	root	3170	Sep 10	2011 /etc/shadow

 - 리눅스에서 실행 파일인지 아닌지는 실행 권한인 'x' 문자의 유무로 판단한다.

 

<trainer10>

해킹에는 두 가지 종류가 있다.

Remote 해킹

 - 해킹하고자 하는 서버에 아이디를 가지고 있지 않을 때, 아이디를 얻고자 시도하는 것

 - 무작위로 아이디와 비밀번호를 입력하는 것, 데몬의 취약점을 공략하는 것, 게시판이나 방명록을 이용하는 것 등 여러가지 방법이 있다.

 

Local 해킹

 - 해킹하고자 하는 서버에 일반 계정을 가지고 있을 때, 루트 권한(관리자 권한)을 얻고자 시도하는 것

 - 해킹할 때는 루트 권한을 얻는 것이 핵심이기 때문에 Remote 해킹보다 중요하다.

 - SetUID가 걸린 파일을 조작하여 루트 권한을 얻을 수 있다.

 

SetUID

 - Set: 변경하다

 - UID: User ID

 - 일시적으로 자신의 ID를 변경하는 것

 - SetUID가 걸린 파일을 실행하면 나의 아이디가 변경되고, 파일의 실행이 끝나면 원래의 아이디로 돌아온다.

 

다음의 예를 통해 일시적으로 자신의 ID가 변경되는 상황을 이해해보자.

1. 비밀번호는 shadow 파일에 저장되어 있다. shadow 파일은 루트에게만 수정 권한이 있다.

2. 친구에게 비밀번호를 들킨 나는 passwd 명령을 통해 비밀번호를 바꾸었다.

3. 나에게는 루트 권한이 없는데, 어떻게 shadow 파일의 내용을 수정한 것일까?

 

자신의 암호를 변경하는 passwd 파일에는 루트 권한의 SetUID가 걸려있어서, 일반 사용자는 passwd 파일을 실행하는 동안에 루트로 일시적인 아이디 변경이 된다.

 

루트는 파일들에 필요한 만큼만 루트 권한을 제공하고, 파일의 실행이 끝나면 다시 권한을 가져가 버린다. 하지만 옥의 티처럼 멍청한 파일들이 있기 마련인데, 이 멍청한 파일을 속여서 루트 권한을 획득하는 방법해킹 기법이다.

 

파일에 SetUID가 걸렸는지 확인하는 방법

[trainer10@ftz trainer10]$ ls -al /usr/bin/passwd
-r-s--x--x	1 root	root	22312	Sep 26 1999	/usr/bin/passwd*

-r-s--x--x에서 s가 SetUID를 의미한다.

x(실행 권한)이 있어야 할 부분에 s가 들어가 있는데, 이는 s가 x를 포함하고 있기 때문이다.

 

/usr/bin/passwd 파일은 root에게 읽기, 실행 권한이 있고, root 그룹에게 실행 권한만 있고, 아더에게 실행 권한만 있다.

하지만 root에게 SetUID가 걸려있기 때문에, 어느 사용자든 파일을 실행할 때 root의 권한을 갖게 된다.

 

서버 전체에서 SetUID가 걸린 파일을 찾는 방법

[trainer10@ftz trainer10]$ find / -perm -4000

 

/ 에서부터 적어도 SetUID가 걸린 모든 파일을 찾아라

 

-perm : permission, 권한을 찾는 옵션

 4 : SetUID

 000 : rwx 모두