본문 바로가기

FTZ. System Hacking

시스템 해킹 테크닉(1) - 리눅스 관련 기본

▶ 리눅스 루트 디렉토리와 하위 디렉토리의 설명

 

각각의 디렉토리의 역할에 대해 간단히 알아보자.

(1) bin :  이곳에는 가장 필수적인 리눅스 실행 파일들이 들어가 있다.

(2) boot : 리눅스 부탕 관련 파일들과, 리눅스의 심장인 커널이란것이 들어있다.

(3) dev : 이곳은 컴퓨터에 설치된 하드웨어에 관한 정보들이

 파일 형태로 저장되어 있다.

(4) etc : 많은 중요한 파일들이 이곳에 들어가 있다.

패스워드 파일, 쉐도우 파일, 그 외 대부분의 리눅스 설정 파일

(5) home : 일반 사용자들과 디렉토리가 들어가 있다.

(6) lib : 많은 라이브러리 파일들이 들어가 있다.

(7) mnt : mount 명령을 사용하여, 마운트 시킨

시디롬, 플로피 디스켓등이 들어가는 디렉토리다.

(8) proc : 프로레스들이 파일 형태로 저장되는 디렉토리이다

(9) root : 일반 사용자의 디렉토리는 /home 아래 존재하지만,

 루트의 홈 디렉토리는 따로 이곳에 저장된다.

(10) sbin : 기본 명령을 제외한 시스템 관리용 실행 파일들이 들어있는 디렉토리이다.

(11) tmp : 임시로 파일을 저장하는 디렉토리로서, 권한에

  상관없이 누구나 이 디렉토리에 파일을 생성할 수 있다.

(12) usr : 다양한 응용 프로그램들이 설치되어 있는 곳이다.

(13) var : 시스템 운영 중에 생성되는 각종 임시 파일이다.

 

▶ 중요한 역할을 하는 파일

 

- /etc/passwd : 한 서버를 사용하는 사용자들의 모든 정보를 기록해 놓은 파일이다.

root     :     x     :     0     :     0     :     Admin     :     /root     :     /bin/bash

' : ' 는 각 필드를 구분해주는 문자이다. (총 7개로 나뉨)

첫번째 필드, root는 서버에 로그인할 때 사용되는 아이디이다.

두번째 필드, x는 암호가 저장된 부분이다. x는 그냥 보여주기 식이며,

사용자들의 패스워들 모아서 새로운 파일 /etc/shaow라는 파일을 만들었고, 관리자 권한을 가진사람이 아니면 펼쳐 볼 수 조차 없다.

세번째 필드 네번째 필드, 컴퓨터가 인식하는 유저의 번호와 그룹 번호라고 생각하면 된다.  root 사용자는 0이란 사용자고, 0이란 그룹에 속해있다고 판단한다.

다섯번째 필드, 사용자의 이름이 들어간다.

여섯번째 필드, 로그인했을 때 기본적으로 위치하는 디렉토리를 말해준다.

일곱번째 필드, 사용자가 처음 로그인했을 때 실행되게 할 프로그램이다.

 

- /etc/shadow : 사용자들의 패스워드가 들어있다. 아무나 보지 못한다.

- /etc/services : 서버가 어떤 어떤 서비스를 하는중인지 보여준다.

- /etc/issue.net : 처음 접속될 때 나오는 화면

- /etc/motd : 로그인 후에 나오는 메세지가 들어있다.

- ~/public_html : 각 사용자들의 홈페이지 파일이 들어가 있다.

 

▶ 서버에 아이디가 있는 상태에서 정보를 캐낼 때 가장먼저 하는것이 커널 버젼을 보는것이다. 커널 버젼을 보려면 uname -a 를 입력하면 된다.

 

▶ 리눅스에는 많은 버젼이 있다. 많은 종류의 OS 중 어떤 버젼인지 확인하기위해서는 #cat /etc/*release 라고 입력하면 된다.

 

▶ 한 프로그램에 그 프로그램이 실행되기 위해 존재하는 부속 파일들을 합쳐서 패키지라고 부른다.  패키지들의 버젼을보고도 해킹이 가능한지 아닌지 판단할 수 있다.

패키지 버젼 정보를 얻는 방법은  #rpm -qa 이다.

 

▶ 해당 서버의 cpu 정보를 수집하는 방법은 #cat /proc/cpuinfo 이다.

 

▶ 파일의 종류에는 2가지가 있다.

첫째, 일반 텍스트 파일. 이것은 말 그대로 글자로만 이루어진 파일로서, 예를들어 "README.TXT'가 그런것이다. 이런 일반 텍스트 파일은 #cat명령어를 사용하여 내용을 출력한다.

둘째, 프로그램 소스 파일. 프로그램 소스란 컴퓨터 언어로 입력한 파일을 말하며, 이것 역시 텍스트 파일이긴 하지만 #cat 명령어가 아닌 "컴파일"이란 과정을 거쳐 실행 가능하도록한 후 사용한다.

 

# 텍스트 파일 생성법

1. 쉘 프롬프트 상태에서, cat > 파일이름txt 라고 입력한다.

2. 원하는 내용을 써내려간다.

3. 컴트럴키와 D키를 동시에 누른다.

위와 같은 과정을 거치면 새로운 파일이 생성된다. '>'는 리다이렉션이라고 읽으며 "방향을 전환한다" 라는 뜻을 가진다. 즉 보통 실행결과를 모니터로 출력하지만 '>'즉, 리다이렉션을 이용하면 파일에 저장할 수 있다.

여기서 만약 추가하고 싶은 내용이 있어서 #cat > test.txt 를 한다면 기존 내용은 없어지고 추가하려했던 내용만 남아있을 것이다. 그럴때는 #cat >> test.txt '>>' 이렇게 해주면 기존내용에 추가적으로 내용이 들어가게 된다.

 

# 프로그램 소스 파일 생성법 및 실행

먼저 소스를 만드는 방법은 일단 텍스트를 만드는 방법과 똑같다. 하지만 그냥 한글이나 영어가 아닌 컴퓨터가 알아 들을 수 있는 c언어로 작성한다.

간단하게 10+20을 계산하는 출력프로그램을 만들어 보자.

이제 이 파일을 "컴파일"을 과정을 거쳐 소스 프로그램을 만든다.

컴파일 방법 : "gcc -o 프로그램이름 소스파일이름 "

프로그램 실행방법 : "절대경로 파일이름"

 

 

▶권한

 

리눅스는 윈도우와는 달리 한 서버에 여러 사용자가 접속하여 사용하게 된다.

개인 아이디가 있고 그 개인 계정에 할당된 공간에, 이것저것 필요한 문서들을 올리고, 홈페이지도 만드는 등등 여러 중요한 파일들을 생성하게된다. 또 남이 봐서는 안되는 나만의 비밀 문서나 프로그램을 올리게 되는 경우도 있다. 이때 리눅스는 권한이라는 것으로 다른 사람이 나의 파일에 접근하지 못하도록 한다. 리눅스를 사용하게 되면 Permission Denied(접근거부)라는 메세지를 많이 만난다. 이처럼 리눅스는 각 사용자마다 특별한 권한을 부여하여, 그 권한의 범위를 넘어서지 않는 파일들만 제어할 수 있도록 설정되어 있다. 따라서 내가 만약 나만의 아이디를 사용하여 로그인한 후 일기나 패스워드 내용이 담긴 파일들을 만들어도 다른사람(루트 제외)은 그것을 볼 수 없다. 따라서 권한의 개념은 해킹에 있어서 가장 핵심적인 부분이다.

그 권한에 대한 정보를 분석하는 방법을 배워보자. 먼저 #ls -al 명령을 사용하면 파일들의 권한에 대한 정보를 출력할 수 있다.

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

(1) 유저 : 이것은 자신을 의미한다. 만약 내가 hyun이라는 아이디로 로그인 하면 나는 hyun이라는 유져가 된다. 또 kim이라는 아이디로 로그인을 하면 kim유져가 되는 것이다.

(2) 그룹 : 모든 유져는 하나 이상의 그룹에 속하게 된다. 임의로 이 그룹을 변경하지 않는 한 모든 유저는 자신의 유저네임과 같은 이름의 그룹에 속하게 된다.

(3) 아더 : 이것은 유저와 그룹을 제외한 모든 다른 사람을 의미한다.

(4) 루트 : 루트는 절대적인 권한을 가지고 있는 사용자이다. 이 루트 권한을 가지고 있는 자는 어떤 권한에도 구애받지 않는 상태로 파일들을 제어할 수 있게된다. 이 절대적인 루트 권한을 얻기위해 이것저것 가리지 않고 하는일이 바로 해킹이다.

 

먼저, 지금 어떤유져로 로그인 되어있고, 어떤 그룹에 속해있는지 알아보자.

그럼 #id라는 명령어를 입력해보자

(1) uid 이것은 User ID의 약자이다. 2009는 컴퓨터가 이 로그인 한 유저를 인식하는 숫자이다.

(2) gid 이것은 Group ID의 약자이다. 각 유져마다 gid를 가지고 있고, 다른 사람을 자신의 gid를 가진 그룹에 속하게 할 수 있다. 특별한 일이 없는 한 gid는 항상 uid랑 같다.

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

 

다음으로, 가장 중요한 파일의 권한 정보를 분석하는 방법을 배워보자.

#ls -al 을통해 파일의 권한 정보를 알 수 있다.

맨앞 -rwxrwxrwx 가 중요한데 - 부분은 파일인지 디렉터리인지 확인하는 것이다. d가있으면 디렉터리 없으면 파일이다. 다음 rwx가 반복되고 있다. rwx순서대로

첫번째 rwx는 "유져의 권한",  두번째 rwx는 "그룹의 권한", 세 번째 rwx는 "아더의 권한"을 의미한다. 여기서 r은 읽기권한, w는 쓰기권한, x는 실행권한을 뜻한다.

trainer9(유져) trainer10(그룹) ---> 이 둘을 제외한 모든 아이디는 자동으로 아더가 된다. 자그럼 이것을 토대로 분석을 해보면

(1) test1이라는 파일은

(2) trainer9라는 uid를 가진 사용자에게

(3) rwx 읽기,쓰기,실행 권한이 있고

(4) trainer10라는 gid를 가진 사용자에게

(5) rwx 읽기,쓰기,실행 권한이 있고

(6) trainer9와 trainer10을 제외한 모든 사람 즉, 아더에게도

(7) rwx 읽기,쓰기,실행 권한이 있다

즉, 이 test1이라는 파일은 아이디를 가지고 있는 사람이라면 누구나 마음대로 변경할 수 있는 파일이라는 것이다.

 

한번 더 연습해보자.

(1) test2 라는 파일은

(2) guest 라는 uid를 가진 사용자에게

(3) rwx 읽기,쓰기,실행 권한이 있고

(4) trainer1 라는 gid를 가진 사용자에게는

(5) r-x 읽기,실행 권한이 있고

(6) guest와 trainer1을 제외한 사용자들에게(아더)는 오직 x실행 권한만 있다.

 

#이제 각각의 권한 rwx에 대해 알아보자.

(1) 읽기권한(r) - 이 읽기권한이 없다면 명령어 #cat으로 파일 내용을 볼려고 할 때 Permission Denied가 나온다.

(2) 쓰기권한(w) - 파일의 수정권한을 말한다. 쓰기 권한이 없으면 vi를 통한 편집이 불가능 하고 또 cat >> 리다이렉션을 통한 덧붙이기도 불가능 하다.

(3) 실행권한(x) - 대표적인 실행파일은 땡떙땡.exe가 잇다. 하지만 이름만 보고 실행이 되는지 알 수 없다. 실행권한인 'x'라는 문자가 있는지 없는지 보고 판단한다.

 

여기서 패스워드를 관리하는 파일인 shadow라는 파일을 보자. 위에 shadow 파일은 관리자(루트)가 아니면 볼 수 조차 없다고 했다.

보면 root만이 r(읽기권한)을 가지고 있는 것을 확인 할 수 있다.

 

 

▶SetUID

해킹에는 두 가지가 있다. 하나는 Remote 해킹인데 이것은 자신이 해킹하고자 하는 서버에 아이디를 가지고 있지 않을 때, 아이디를 얻고자 시도하는 것이다.

다른 하나는 Local 해킹인데 이것은 해킹하고자 하는 서버에 일반 계정을 가지고 있을 때, 관리자 권한(root)를 얻고자 시도하는 것이다.

Remote 해킹 방법엔 여러가지 방법이 있다. 무작위로 아이디와 비밀번호를 입력하여 접속하는 방법부터, 데몬의 추약점을 공략하거나, 게시판이나 방명록을 이용하여 접속하는 등 수십가지가 있다.

그런데 Remote해킹보다 중요한건 local 해킹이다. 관리자의 권한을 없는 한 해당 서버는 그렇게 큰 의미가없다. 이떄 local해킹에 핵심이 되는 것이 SetUID이다.

 

그럼 SetUID란? Set 이란 말은 "변경하다" 란 뜻을 가지고 있고, UID는 User ID의 약자이다. 즉, 일시적으로 자신의 ID를 변경하는 것이다.  예를들어 나의 패스워드는 shadow파일에 있다. 그런데 #passwd 명령을 통해 비밀번호를 변경할 수 있다.

오직 루트에게만 수정 권한이 있는데 그 내용을 변경할 수 있는 것은 바로 SetUID이다 즉, passwd 파일에 루트 권한의 SetUID가 걸려있어서, passwd파일을 실행하는 동안 "루트로 일시적인 아이디 변경"이 이루어 지는 것이다. 그리고 파일 실행이 끝나면 다시 원래의 아이디로 돌아온다. 이 특성을 이용하여 할 수 있는 해킹은 무수히 많다

예를들어 "joe filename"이라고 입력하면 해당 파일의 편집 화면이 추력된다.   근데filename이 1000자가 넘어버리면 프로그램이 제대로 실행되지가 않는다. 그래서 해커들이 이를 이용하여 joe에 대한 버퍼 오버플로우 기법을 개발했다. 바로 1000자를 넣어 프로그램에 에러가 날 때의 그 순간을 이용하여 /bin/bash 파일을 실행하도록 조작하는 것이다. 따라서 joe파일이 실행되는 동안 루트의 아이디로 변경되고, 그 상태에서 /bin/bash를 실행하면, 결과적으로 루트 권한의 쉘이 획득되는 것이다. 이 오버플로우 기법을 구현하려면 c언어를 할 줄 알아야한다.

그럼 passwd 파일에 걸린 SetUID를 확인해 보자.

 

위의 내용을 보면 처음보는 실행권한 부분에 s라는 것이 눈에 띈다 이것이바로 SetUID를 의미한다. 따라서 위파일을 분석하면 다음과 같다.

/usr/bin/passwd 파일은 root에게 읽기와 실행이 있고, root라는 그룹에게는 실행 권한만 있고, root를 제외한 사용자들에게도 실행 권리만 있다. root에게 SetUID가 걸려있기 때문에 어느 사용자이던간에 저 파일을 실행할 때는 root의 권한을 갖게 된다.

그럼 SetUID가 걸린 파일을 찾는 방법을 알아보자 . #find라는 명령어로 찾을 수 있는데 자주 사용되므로 옵션을 잘 이해하고 있는 것이 좋다.

#find / -perm -4000 --->> / 에서 부터, 적어도 SetUID가 걸린 모든 파일을 찾아라라는 뜻이다. 4000앞 '-'가 적어도를 뜻하며 -perm은 권한을 찾겠다는 옵션이다.

숫자 '4'가 SetUID를 으미하며, '000'은 rwx모두를 의미합니다.

find 명령의 옵션에대해 좀 더 살펴보자면 다음과 같다.

위의 옵션은 서로 조합하여 사용도 가능하다 예를들자면 ,

#find / -user root -perm -4000 --> 루트의 권한으로 SetUID가 걸린 파일을 찾는다.