차근차근/Linux

리눅스 공부

예쁜꽃이피었으면 2014. 9. 5. 10:32

https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=48&ved=0CEgQFjAHOCg&url=http%3A%2F%2Fneoray.tistory.com%2Fattachment%2Fhk69.txt&ei=oA8JVOH2FdfV8gXMgoCwBQ&usg=AFQjCNFANDEjd2r9FKUsg-_BkjJh_WPxJQ&bvm=bv.74649129,d.dGc&cad=rjt




리눅스공부.txt




ls : 파일보기

   ls 옵션 -a 숨겨진 파일보기 -l 파일정리해서보기


pwd : 경로 확인


cd .. : 상위경로로 이동


cd *디렉토리명*(*빼고입력) : **안의 디렉토리로 이동 


mkdir : 디렉토리 만들기


rmdir : 디렉토리 지우기


cp (파일1) (파일2) : 파일1을 파일2라는 이름으로 복사


rm : 지우기


mv : 이름 바꾸기


w : 서버에 접속한 사람보기


finger :

         옵션 : -l 사용자들의 자세한정보


tty : 자신의 터미널 확인


ifconfig : 아이피보기


write : 대화하기 ex: write ID /dev/pts/pts 번호


whoami : 자신이 누구인지 (자신에 대한 정보)


id : 자세한 자신에 대한정보


cat - 파일 병합과 내용 보기 (화면상에서 파일내용 보기)


uname : 시스템 정보 보기

               옵션 -a : 전부보기


cat /etc/*release : OS 버전 확인하기


rpm -qa : 패키지 정보얻기


cat /proc/cpuinfo : CPU 정보수집하기


":" :필드 구분점

"*" : 모든파일

tar : 리눅스 압축명령어

       사용법: "합치기   :  tar cvf 합칠파일 합칠파일들"

                   "해제하기 :  tar xvf 해제할파일"


                   옵션을 간단하게 정리하면


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

                  x - eXtract : 압축을 해제시키는 옵션.

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

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

         EX:) tar cvf songs.tar * :  현재 디렉토리에 있는 모든파일<*>을 songs라는 새로운 파일로 합쳐라


gzip : 리눅스 압축명령어 

        gzip은 한번에 한개의 파일만 압축가능

       사용법 : gzip "파일이름" : ("빼고)"안에 적힌파일을 압축 

                    gzip -d "파일이름" : ("빼고)"안에 적힌파일을 압축해제

=================================================================================

passwd 파일설명


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


첫번째 필드에는 root라고 적혀 있습니다.

이것은 서버에 로그인할 때 사용되는 아이디(계정)

을 말해줍니다.


여러분은 지금 trainer6이라는 아이디로 로그인

하셨죠? 따라서 패스워드 파일에서 여러분의 정보

를 찾아보면,


trainer6:어쩌구:저쩌구:쿵짝:뽕짝:아싸:아쭈


의 형식으로 되어있을겁니다.


또 다시 돌아가서..


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


이제 두번째 필드를 봅시다. 어라? 두번째 필드는

상당히 썰렁하군요. 달랑 x란 문자 하나만 있습니다.

이 두번째 필드는 사실 패스워드가 적혀있는 부분이었

습니다.


리눅스 버젼 5.0 까지는 이곳에 2VBcuBs6VQ79gR 처럼

암호화된 문자열이 들어가 있었고, 다른 사람들이 이

패스워드를 보아도, 위와같이 알아보기 힘든 글씨로

암호화가 되어있기 때문에 전혀 위험하지 않았답니다.


하지만, 해커들이 저런 눈앞의 떡을 가만 놔둘리가

없었겠지요?


해커들은 곧 암호화된 문자열을 해독하는 프로그램을

만들었습니다. 요즘 "크래커" 라고 불리우는 것들이

바로 그것이고, 암호화된 문자열들은 크래커 앞에서

무용지물이 되어 버리고 말았습니다.


후에 리눅스를 제작하는 사람들은 훨씬 복잡한 방법

으로 패스워드를 암호화 시켜버렸습니다.


$1$3JXT0ktF$pRXzOx5TupamGjkw0dkyq. 과 같은 문자열이

바로 그것이지요.

하지만, 항상 뛰는자 위엔 나는자가 있는 법.

저런 암호화된 문자열 역시 얼마 가지 않아 해커들

앞에 무릎을 꿇어버리게 됩니다.


그 뒤로 새로운 암호화 기법이 나타나고, 해커들은

또 그것을 눌러버리고, 또 나타나고, 또 눌러버리고,

이런일이 계속 반복되다가, 리눅스 프로그래머들은

드디어 색다른 방법을 생각해 냈습니다.


바로 두번째 필드의 패스워드를 싹 없애버리고 x라는

문자만 달랑 보여주는 방법이었습니다.


그리고 그들은 사용자들의 패스워드만 모아서 새로운

파일을 만들었고, 그것이 바로 /etc/shadow 라는 파일

이었습니다. 그 다음 그 쉐도우 파일을 관리자 권한을

가진 사람이 아니면 펼쳐 볼 수 조차 없도록 만들어

버렸답니다.


이 방법은 패스워드의 크랙을 피하는 가장 완벽한

방법으로 채택되어 리눅스 6.0 이후 지금까지 계속

사용되어지고 있습니다.

만약 여러분이 그 쉐도우 파일을 열어보려고 한다면

다음과 같은 에러 메세지가 출력될 것입니다.


[guest@ftz guest]$ cat /etc/shadow

cat: /etc/shadow: 허가 거부됨

[guest@ftz guest]$


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


이번엔 세번째와 네번째 필드에 대해서 배워봅시다.


위의 사용자는 로그인을 할 때 root라는 이름을 사용

합니다.


이 root라는 단어는 인간들이 사용하기 쉬운 단어

입니다.


하지만 컴퓨터는 영어보단 숫자를 더 좋아해서 이런

단어가 아닌 숫자를 사용하여 사용자를 판단한답니다.


따라서 우리가 root라고 입력하면 컴퓨터는 패스워드

파일을 열어보구서, "지금 들어오는 녀석은 0 이란

녀석이다." 라고 생각해 버리지요.


또한 세번째에 이어 네번째에도 0이란 숫자가 있는데,

이것은 해당 사용자가 속해있는 그룹을 말해줍니다.

(그룹에 대해선 training 9에서 배웁니다.~)

즉 정리해보자면 컴퓨터는 우리가 root라고 입력하면 

"아! 지금 들어오는 녀석은 0이란 녀석이고, 0이란 그룹에 속해있구나!"

라고 판단하게 되는것이죠


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


다섯번째 필드는 너무 쉽습니다. 사용자의 이름을

말해주는 부분이죠. 위의 Admin은 관리자 라는 뜻의

단어이구요.


대학의 서버들은 모든 학생들에게 리눅스 계정을

주기 때문에 저 다섯번째 필드에 그 학생의 실명이

들어가 있답니다.


여섯번째 필드는 해당 사용자(위에선 root) 가 로그

인에 성공 했을 때 기본으로 위치하게 되는 디렉토리

를 말해줍니다.


따라서 root라는 아이디로 로그인에 성공하면 /root

로 자동으로 들어가게 되지요. 여러분 같은 경우엔

/home/trainer6 에 들어가게 되겠지요?

(나중에 직접 passwd 파일을 열어보세요!)


이제 마지막 7번째 필드는 사용자가 처음 로그인

했을 때 실행되게 할 프로그램을 말합니다.

==================================================================================

<디렉토리 설명>


- bin : 필수 리눅스 실행파일 (ls ,rm 등)

- boot : 리눅스 부팅 관련파일, 리눅스커널

- dev : 컴퓨터에 설치된 하드웨어에 관한 정보가 파일형태로 저장

- etc : 패스워드 파일, 쉐도우 파일, 리눅스설정파일등 많은 중요한파일들

- home : 일반 사용자들의 디렉토리 들어감 (guest 등)

- lib : 라이브러리 파일들

- mnt : mount 명령써서 마운트시킨 CD롬. 플로피디스켓등이 들어가는 디렉토리

- proc : 프로세스들이 파일형태로 저장되는 디렉토리

- root : Root 즉 관리자 계정의 홈디렉토리

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

- tmp : 임시파일저장 디렉토리 권한에 상관없이 이 디렉토리에 파일생성가능

- usr : 다양한 응용 프로그램이 설치되어있는 곳

- var : 시스템 운영중에 생성되는 각종 임시파일들이 있고 외부접속에 대한 로그파일들이 이 곳에 저장

==================================================================================

<중요파일 설명>


- /etc/passwd    : 사용자들에 대한 간단한 정보가 들어있습니다.


- /etc/shadow    : 사용자들의 패스워드가 들어있습니다. 아무나 보지 못하도록 설정되어있지요.


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


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

                          해커스쿨의 F.T.Z에 오신걸 환영합니다!

                           라는 문구도 이 곳에 들어가 있습니다.


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


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

                          보통 해킹에 성공하면 이 파일을 수정하여,

                           hacked by xxx 라는 문구를 남깁니다.

==================================================================================

리눅스에서 파일 압축,해제하기


(압축파일 종류)

" tar    : tar 프로그램을 사용하여 압축된 파일로서,

           사실 압축이 아닌 여러 파일들이 하나로 뭉쳐져

           있는 파일입니다. "


" gz     : gzip 프로그램을 사용하여 압축된 파일입니다 "


" tar.gz : tar 프로그램을 사용하여 파일을 합친 후,

           또 다시 gzip 을 사용하여 압축을 한 파일이라고

           예상할 수 있겠지요? "


" tgz    : 위의 tar.gz 을 합쳐서 tgz라는 확장자로 만들 때

           도 있답니다. "


(압축방법)

tar : 리눅스 압축명령어

       사용법: "합치기   :  tar cvf 합칠파일 합칠파일들"

                   "해제하기 :  tar xvf 해제할파일"


                   옵션을 간단하게 정리하면


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

                  x - eXtract : 압축을 해제시키는 옵션.

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

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

         EX:) tar cvf songs.tar * :  현재 디렉토리에 있는 모든파일<*>을 songs라는 새로운 파일로 합쳐라


gzip : 리눅스 압축명령어 

        gzip은 한번에 한개의 파일만 압축가능

       사용법 : gzip "파일이름" : ("빼고)"안에 적힌파일을 압축 

                    gzip -d "파일이름" : ("빼고)"안에 적힌파일을 압축해제

==================================================================================

- 텍스트 파일 생성법


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

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

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


위와 같은 과정을 거치면 새로운 파일이 뚝딱 생성이 됩니다.

그런데 1번에서 나온 cat > 파일이름.txt 이 무슨뜻인지 배우고

넘어갑시다. 여기서 중요한건 '>' 바로 이 문자인데, 이것은

"리다이렉션" 이라고 읽으며 "방향을 전환한다" 라는 뜻을 가지고

있습니다.


"방향을 전환한다?" 이게 무슨 말일까요. 리눅스에선 보통 실행

결과를 모니터로 출력합니다. 예를 들어 그냥 cat 이라고 입력한

후 아무 글자나 마구 입력하면, 그대로 모니터로 나타나죠.


이제 우리는 리다이렉션을 사용하여, 그 입력 결과를 모니터가

아닌 파일로 보내버립니다. 즉, 출력의 방향을 전환한거죠.

'>' 이것은 왼쪽으로 입을 허~ 하니 벌리고 있습니다. 이것을

해석하면 "나는 왼쪽에서 출력되는것을 받아서 오른쪽의 입력

으로 보내버리겠다" 가 된답니다.

이제 다시 " cat > 파일이름.txt " 를 보시면 어떤 의미인

이해가 가실겁니다.


바로 "우리가 cat 명령을 사용하여 입력하는 모든 글자들을

모아모아서 파일이름.txt 로 보내버려라" 가 되는거죠.


그리고 리눅스에서 "이제그만!" 을 의미하는 컨트럴+D키를

누르면, 우리가 입력한 글자들이 들어있는 파일이름.TXT가

생성 되는거죠.


이제 다시 " cat > 파일이름.txt " 를 보시면 어떤 의미인

이해가 가실겁니다.


바로 "우리가 cat 명령을 사용하여 입력하는 모든 글자들을

모아모아서 파일이름.txt 로 보내버려라" 가 되는거죠.


그리고 리눅스에서 "이제그만!" 을 의미하는 컨트럴+D키를

누르면, 우리가 입력한 글자들이 들어있는 파일이름.TXT가

생성 되는거죠.


모든 파일들은 보통 이런식으로 만들게 되구요, 여러분이

나중에 이것 저것 배우시다 보면 "편집기" 라는 것을

알게 되실거에요. 그 편집기를 사용하면 더욱 빠르고 쉽게

파일을 생성할 수 있답니다. 나중에 해커스쿨의 강좌실에서

배우도록 하죠~!


이번엔 리다이렉션을 연속 두번 사용하는 방법을 배워봅시다.


만약 지금처럼 서버에 test.txt 라는 파일이 있을 때,

여러분이 cat > test.txt 라고 입력을 하면 기존의 내용은

몽땅 사라지고 새로운 내용으로 파일이 다시 만들어 진답니다.


그럼 기존의 내용은 보존시키면서 글자를 써 넣을려면 어떻게

할까요? 바로 리다이렉션을 두번 사용하면 되죠~!



test.txt 란 파일이 이미 있고, 그 안에 내용이 있을 때,


" cat >> test.txt "


라고 입력을 하면, test.txt 의 뒤에 새로운 내용은 추가

시킬 수 있게 됩니다.


진짜 그렇게 되는지 직접 해봅시다.


< cat >> test.txt 라고 입력한다. >

< 말들을 적고 엔터를 한번 누른다음에 컨트럴 키와 D키를 동시에 누른다. >


지금까지 보통 텍스트 파일을 만드는 방법을 배워보았습니다.


이번엔 프로그램 소스 파일을 만들고, 컴파일, 그리고 그것을

실행하는 방법까지 배워봅시다.


먼저 소스를 만드는 방법은 일단 텍스트를 만드는 방법과 똑같습니다.

하지만 그냥 한글이나 영어가 아니고 컴퓨터가 알아 들을 수 있는

C언어로 작성을 한다는 차이점이 있답니다.


ex:) program이라는 C언어 파일을 만드려면

       cat > program.c 라고 입력한다.


이것이 바로 프로그램 소스라는 것입니다.


즉, 프로그램의 근원 이라는 뜻이죠. 알에서 병아리가 깨어

나는 것처럼. 우리가 만들려고 하는 프로그램이 병아리라면

바로 이 소스가 알이 되는거죠.


알이 부화하여 병아리가 되는것처럼, 우리는 "컴파일" 이라는

과정을 거쳐서 소스를 프로그램으로 만든답니다.


컴파일 하는 방법은 다음과 같습니다.


- 컴파일 방법 : 쉘 프롬프트에 다음과 같이 입력한다.

(Gcc컴파일러로 컴파일 할때 기준)

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


ex:) program.c 를 program.exe 로 컴파일하려면

      gcc -o program.exe program.c 라고 입력한다


마지막으로 파일을 실행시키는 방법을

배워봅시다.


도스에서는 파일을 실행 시킬 때, 그냥 그 디렉토리로 이동한

다음에 파일이름만 입력하면 실행이 됐었습니다.


하지만 리눅스는 조금 다르답니다. 그 파일이 있는 절대경로를

모두 입력시켜줘야만 실행이 되죠.


절대경로란 최상위 디렉토리인 루트(/) 에서 부터 시작되는

경로를 말합니다. ( ex. cd /home/guest/public_html/ )


반대로 리눅스에는 상대경로라는 것도 있는데 이것은 자신이

위치한 디렉토리를 기준으로 경로를 따지는 것을 말합니다.

( ex. cd public_html/ )


절대 경로를 보는 방법은 트레이닝1에서 배웠습니다. 바로 pwd

명령이 그것이죠.


pwd 라고 입력한다.


제대루 실행이 되었나요?


그런데 이렇게 프로그램 하나를 실행시키기 위해 절대경로를

쭈욱 써 넣어줘야 된다니 너무 귀찮으시죠?


그래서 프로그램을 간단하게 실행시킬 수 있는 팁을 하나

알려드리겠습니다


리눅스에선 '.' 이 "현재 디렉토리" 를 의미한다는 것을

전에 배웠습니다.


따라서 절대경로를 주욱 쓰지 않고도 이 '.'을 사용하면 아주

간단하게 프로그램을 실행시킬 수 있는거죠.


다음과 같이 입력하면 되겠죠?


" ./program.exe "

==================================================================================

권한에 대한 정보를 분석하는 방법을

배워보겠습니다.


권한에 대한 정보는 멀지 않은곳에 있답니다. 바로,

우리가 트레이닝1에서 배운 ls -al 명령을 사용하여

파일들의 권한에 대한 정보를 출력시킬 수 있습니다.


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


그것들은 바로 "유져", "그룹", "아더", "루트" 입니다.


유져: 이것은 자신을 의미합니다. 만약 제가 mmung2라는

      아이디로 로그인을 하면 저는 mmung2라는 유져가

      됩니다. 마찬가지로 제가 guta라는 아이디로 로그

      인을 하면, 저는 guta라는 유져가 되는거지요.


그룹: 모든 유져는 하나 이상의 그룹에 속하게 됩니다.

      임의로 이 그룹을 변경하지 않는 한 모든 유저는

      자신의 유저네임과 같은 이름의 그룹에 속하게 됩니다.


아더: 이것은 유져와 그룹을 제외한 모든 다른 사람을

      의미합니다.


루트: 루트는 여러분이 아시다시피 절대적인 권한을 가지고

      있는 사용자입니다. 이 루트 권한을 가지고 있는 자는

      어떤 권한에도 구애받지 않는 상태로 파일들을 제어할

      수 있게됩니다. 이 절대적인 루트 권한을 얻기위해

      이것저것 가리지 않고 하는일이 바로 여러분이 배우고자

      하는 "해킹"이랍니다.


<ID 분석법>


id 라는 명령어를 입력했을때


[trainer9@ftz trainer9]$ id

uid=2009(trainer9) gid=2009(trainer9) groups=2009(trainer9)

[trainer9@ftz trainer9]$


uid -> 이것은 User ID의 약자 입니다.

뒤의 2009라는 숫자는 어떤 의미인지 지난번에 배웠죠?

컴퓨터는 영어보다는 숫자를 더욱 좋아해서, 사용자들에게

자기가 알아보기 쉬운 숫자를 부여하고, 그 숫자로 누구인지

판단을 한다고 했습니다.

이 id 라는 명령을 통해서 trainer9 = 2009 라는 것을 알수

있습니다.


gid -> 이것은 Group ID의 약자 입니다.

각 유져마다 gid를 가지고 있고, 다른 사람을 자신의 gid를

가진 그룹에 속하게할 수 있습니다. 특별한 일이 없는 한

gid는 항상 uid와 같습니다.


groups -> 이것은 현재 자신이 어떤 그룹에 속해 있는지를

말해줍니다. 임의로 변경을 하지 않으면 기본으로 자신의

uid와 같은 그룹에 속하게 됩니다.


<권한 분석법>


ls -al을 입력했을때


-rwxrwxrwx    1 trainer9 trainer10        5 10월 20 21:35 test1


일단 이 부분은 기억하실 겁니다.


이 부분의 문자를 보고 디렉토리인지 아닌지를 알 수

있었지요. 이제 우리가 보아야 할 부분은 그 오른쪽으로

주욱 이어지는 rwxrwxrwx 이 곳입니다.


여기서 재미있는 부분이 있죠? 똑같은 문자가 3번씩이나

반복이 됩니다.


rwx rwx rwx


이것이 바로 권한에 관한 정보이며, 순서대로 "유져의 권한", "그룹의 권한", "아더의 권한" 을 의미합니다.


그리고 영문자 r, w, x 는 순서대로 읽기권한(r), 쓰기권한(w), 실행권한(x)을 의미하구요.


그럼 유져와 그룹, 아더가 누구인지 어떻게 알까요?


-rwxrwxrwx    1 trainer9 trainer10        5 10월 20 21:35 test1

                ~~~~~~~~~~~~~~~~~~

          그것은 바로 이 부분에 있습니다~.


-rwxrwxrwx    1 trainer9 trainer10        5 10월 20 21:35 test1

                   ↑

        이것이 바로 유져!

                            ↑

                       이것은 그룹!


그리고 이 둘을 제외한 모든 아이디는 자동으로 아더가 되는거지요.


다음과 같은 순서로 분석을 합니다.


-rwxrwxrwx    1 trainer9 trainer10        5 10월 20 21:35 test1

  ③ ⑤ ⑦         ②       ④                            ①



① test1 라는 파일은...


② trainer9 라는 uid를 가진 사용자에게...


③ 읽기(r),쓰기(w),실행(x) 권한이 있고...


④ trainer10 이라는 gid를 가진 사용자에게도...


⑤ 읽기(r),쓰기(w),실행(x) 권한이 있고...


⑥ trainer9와 10을 제외한 모든 사람에게도...


⑦ 읽기(r),쓰기(w),실행(x) 권한이 있다.


즉, 이 test1라는 파일은 아이디를 가지고 있는 사람이라면 누구나

마음데로 변경할 수 있는 파일이라는 것을 알 수 있습니다.


이번엔 다른파일


-rwxr-x--x    1 guest trainer1       104 10월 20 21:08 test2

  ③ ⑤ ⑦        ②     ④                             ①



① test2 라는 파일은...


② guest 라는 uid를 가진 사용자에게...


③ 읽기(r),쓰기(w),실행(x) 권한이 있고...


④ trainer1 이라는 gid를 가진 사용자에게는...


⑤ 읽기(r) 와 실행(x) 권한만 있고...


⑥ 그리고 guest 와 trainer1을 제외한 사용자들에게는...


⑦ 오직 실행(x)권한만 있다.



여기서 잠깐 실행권한에 대해 알아봅시다. 실행권한?

뭐 그런 권한이 다 있나~


일단 읽기 권한은 쉽죠. 이 읽기 권한이 없다면 cat 명령으로

파일 내용을 볼려구 할 때, Permission Denied 가 나오겠죠.


쓰기 권한은 그 파일의 수정권한을 말합니다. 쓰기 권한이

있는 파일에는 cat >> 명령을 이용하여 내용을 덧붙일 수도있고,

편집기를 사용하여 내용은 편집할 수도 있게 됩니다.


이제 실행권한을 알아봅시다. 윈도우나 도스에서는 어떤 파일이

데이타 파일이고 어느것이 실행파일인지 확장자를 보고 구별을 했죠?


예를 들어 확장자가 exe, bat, com 인 파일이 바로 실행파일이었죠.


하지만 리눅스에서는 이 확장자만 보고 실행파일인지 아닌지를 알

수 없답니다. 예를들어 linux.exe 라는 파일은 이름만 보고 실행이

되는지 안되는지를 알 수 없어요.


그럼 어떻게 실행파일인지 아닌지를 구분하냐.. 바로 실행권한인

'x' 라는 문자가 있는지 없는지를 보고 판단한답니다.

트레이닝1에서 d가 있으면 디렉토리, 없으면 파일이었던 것과 같죠?

==================================================================================

<SetUID에 대하여>

마지막으로 Local 해킹시 핵심이 되는 SetUID에

대하여, 알아봅시다.


Local 해킹?

해킹에는 두 가지가 있습니다. 하나는 Remote 해킹,

이것은 자신이 해킹하고자 하는 서버에 아이디를 가지고 있지

않을 때, 아이디를 얻고자 시도하는 것을 말합니다.


다른 하나가 Local 해킹, 이것은 해킹하고자 하는 서버에 일반

계정을 가지고 있을 때, 관리자 권한(root)를 얻고자 시도하는

것을 말합니다.


Remote 해킹 방법엔 여러가지 방법이 있습니다. 무작위로 아이디와

비밀번호를 입력하여 접속하는 방법에서 부터, 데몬의 취약점을

공략하여 접속하는 방법. 심지어 게시판이나 방명록을 이용하여 접속

하는 방법까지. 방법은 수십가지가 넘습니다.


하지만 이번시간엔 Remote 해킹이 아닌 Local 해킹을 배웁니다


관리자(root) 권한을 얻지 않는 한 해당 서버는 단지

그림의 떡일뿐이니까요.


아, 그런데 관리자 권한은 왜 얻냐고요? 만약 여러분이

F.T.Z에 guest 계정으로 로그인하여 관리자 권한을 획득

하였다고 해봅시다.(관리자 권한 획득 = 해킹 성공)


그럼 그 순간 F.T.Z은 여러분의 것이 되어 버립니다.

관리자 권한을 얻은 여러분은 F.T.Z의 홈페이지도 마음데로

변경할 수 있고, 트레이닝은 물론 레벨의 내용도 몽땅

수정할 수 있게될 뿐더러, 저희의 중요한 파일들도 다운로딩

하여 가져갈 수 있게됩니다. (물론 지금 말한것들은 해킹이

아니고 크래킹입니다!)


그럼 도대체 평범한 계정을 가지고 있는 상태에서 어떤

방법으로 관리자 권한을 얻을 수 있을까요?

                                   .

                                   .

                                   .


해답은 바로 SetUID에 있습니다. 우리는 이 SetUID가

걸린 파일을 조작하여, 관리자 권한을 얻을 수 있게

됩니다.


그럼 과연 SetUID란 무었인가!


Set이란 말은 "변경하다" 란 뜻을 가지고 있고, UID는

여러분도 아시다시피 User ID의 약자 입니다.

따라서 SetUID는 "ID를 변경한다." 라고 해석이 됩니다.


설명하자면 SetUID는 일시적으로 자신의 ID를 변경하는

것을 말합니다.      ~~~~~~~~~~~~~~~~~~~~~~~~~~~


그럼 왜 일시적으로 자신의 아이디를 변경할까요? 다음의

예를 한번 봅시다.


1. NEORAY는 F.T.Z에 로그인 하려고 텔넷을 실행했다.


2. 주소를 입력하고, 아이디와 비밀번호를 입력했다.


3. NEORAY는 트레이닝에서 배운것을 떠올리며 "아 나의

   비밀번호도 쉐도우 파일로 쏘옥 들어가 있겠구나"

   하고 생각했다.


4. 앗, 이럴수가 뒤를 쳐다보니, 친구 Pildoc가 몰래

   NEORAY의 비밀번호를 훔쳐보고 있었다.


5. NEORAY는 Pildoc를 내쫓고, passwd 명령을 사용하여

   자신의 패스워드를 바꾸어 버렸다.


6. 어라? 여기서 NEORAY는 이상한 점을 발견했다. "나의

   패스워드는 쉐도우 파일에 있다, 그런데 내가 지금

   패스워드를 변경했으니, 쉐도우 파일의 패스워드도

   변경이 되었을 것이다. 하지만 쉐도우 파일은 오직

   루트에게만 수정 권한이 있는데 어떻게 내가 그

   내용을 변경한걸까?"


자, 정말 그렇네요? 쉐도우 파일은 오직 루트만이 제어할

수 있는데, 어떻게 NEORAY가 그 내용을 변경한 것일까요?


이 문제의 답이 바로 SetUID에 있답니다.


바로 자신의 암호를 변경하는 passwd 파일에 루트 권한의

SetUID가 걸려있어서. 일반 사용자들이 그 passwd 파일을

실행하는 동안에는 "루트로의 일시적인 아이디 변경" 이

되는것입니다.


결국 쉐도우 파일은 NEORAY의 권한이 아닌 루트의 권한으로

변경이된 셈이지요.


이제 SetUID에 대한 감이 조금 오시나요? 정리하자면 다음과

같습니다.


1. SetUID는 파일에 걸리는거구나!.


2. SetUID가 걸린 파일을 실행하면 나의 아이디가 변경되는구나!.


3. 파일의 실행이 끝나면 다시 원래의 아이디로 돌아오는구나.!


그럼 이 SetUID가 걸린 파일은 passwd 하나일까요?

아닙니다. 리눅스나 유닉스에는 보통 이 SetUID가 걸린

파일이 수십개가 됩니다.


그럼 그 수십개의 파일이 폭탄을 손에 쥐고 있는 셈이

되어버립니다. 왜냐구요? 다음의 예를 또 봅시다.


1. 나는 루트이다.


2. 나는 할 일이 너무 많아서, passwd, sendmail, crontab

   등등의 파일에게 나의 권한을(SetUID) 나누어 주고, "이것은

   위험한 것이니 절대 남에게 넘겨주지 말라!" 라고 당부

   했다.


3. 구타가 로그인을 하였다. 구타는 sendmail의 SetUID를

   보고 "너무 멋있네요, 제가 한번만 구경해도 될까요?"

   라고 말했다.


4. sendmail은 루트의 경고를 무시하고, "그럼 잠깐만 구경

   해보세요~" 라고 말하고 SetUID를 넘겨주었다.


5. 못된 구타는 sendmail의 아구리를 한방 먹이고 SetUID를

   들고 멀리멀리 도망갔다.


지금까지의 과정이 일반적인 관리자 권한을 획득

하는 방법을 묘사한 것입니다.


실제로 리눅스에 저렇게 멍청한 파일은 없겠죠?


딱 필요한 만큼만 관리자 권한을 제공하고, 그 일이

끝나면 낼름 다시 권한을 가져가 버립니다.


하지만 옥의 티처럼, 그 중에서도 멍청한 파일들은 있기

마련입니다.


해커들은 바로 "어떻게 하면 그 멍청한 파일들을 속여서,

관리자 권한을 획득할까" 하고 하루종일 고심한답니다.


그리고 "아하! 이런 방법은 어떨까?" 하고 새로운 방법을

연구하여 그것에 성공하면, 그것은 "새로운 해킹 기법"

으로 세상에 나타나는거죠.


지금까지 발견된 기법인, "레이스컨디션", "IFS버그",

"링크버그", "버퍼 오버플로우", "포맷 스트링 어택"

등등이 바로 그것이구요.


또한 이러한 버그에 의해 루트 권한을 넘겨준 파일은

"userhelper", "imwheel-solo", "restore", "screen"

등 수 없이 많습니다. (모두 멍청한 파일들이죠.^^)


해커스쿨 로그인 메뉴에 Local Exploit이란것이 있는데

바로 그것이 지금까지 발견된 해킹 기법을 모아 놓은

것이랍니다.


그럼 그 많은 기법중 예로 버퍼 오버플로우에 대해

간단하게 알아봅시다.


joe 라는 파일이 있습니다. 이 파일은 루트의 권한으로

SetUID가 걸려있습니다.


그럼 이 SetUID가 걸린 파일은 passwd 하나일까요?

아닙니다. 리눅스나 유닉스에는 보통 이 SetUID가 걸린

파일이 수십개가 됩니다.


그럼 그 수십개의 파일이 폭탄을 손에 쥐고 있는 셈이


이 joe는 문서 편집을 할 때 사용하는 파일로

"joe filename" 이라고 입력하면 해당 파일의

편집 화면이 출력됩니다.


그런데 이 joe라는 파일은 약간 멍청합니다.

왜냐면 joe filename 에 filename이 1000자가

넘어버리면 프로그램이 제대로 실행되지가

않습니다.


해커들은 이것을 이용하여 joe에 대한 버퍼 오버

플로우 기법을 개발하였습니다.


바로 1000자를 넣어 프로그램에 에러가 날 때의

그 순간을 이용하여 /bin/bash 파일을 실행하도록

조작합니다.


따라서 joe 파일이 실행되는 동안에 루트의 아이디로

변경되고, 그 상태에서 /bin/bash를 실행하니,

결과적으로 루트 권한의 쉘이 획득되었습니다.!


위의 과정은 수작업으로는 불가능 하고 "버퍼 오버

플로우 기법" 을 구현하려면 C언어를 할 줄 알아야만

합니다.


프로그램에 에러가 나는 순간이나, 메모리의 장소등등

을 손으로 직접 계산할 수는 없으니까요.


따라서 많은 사람들이 해킹을 하려면 C언어를 배우라고

하는 것입니다.       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~


이처럼 SetUID가 걸려있는 파일들은 항상 해킹의 두려움

속에 살고있답니다.


그럼 이 SetUID가 걸려있는지 아닌지는 어떻게 알아보나?

이제부터 이것에 대해 배워 봅시다.


 passwd 파일에 걸린 SetUID를 확인해 본다면...


ls -al /usr/bin/passwd 를 입력한다.


[trainer10@ftz trainer10]$ ls -al /usr/bin/passwd

-r-s--x--x   1 root     root        22312 Sep 26  1999 /usr/bin/passwd*

[trainer10@ftz trainer10]$


네 그럼 여기서


-r-s--x--x   1 root     root        22312 Sep 26  1999 /usr/bin/passwd*


   ↑


짜짠. 이 부분에 우리가 배우지 않은 문자가 있습니다.

우리가 배운 문자들은 분명 d,r,w,x 이 네가지 인데 웬

s가 붙어 있습니다?


이 s가 바로 SetUID를 의미합니다. 저 부분은 x(실행권한)

이 있어야 할 부분인데 s가 들어가 있습니다.


그것은 바로 s가 x를 포함하고 있기 때문이지요.


따라서 위의 파일은 분석하면 다음과 같습니다.


</usr/bin/passwd 파일은 root에게 읽기와 실행(s가 x를

포함하기때문)이 있고, root라는 그룹에게는 실행 권한만

있고, 위를 제외한 사용자들에게도 실행 권한만 있다.


" 하지만 root 에게 SetUID가 걸려있기 때문에 어느 사용자

이던간에 저 파일을 실행할 때는 root의 권한을 갖게된다." >


이제 좀 아셨나요??

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

배워 봅시다.


find / -perm -4000 을 입력한다.



대충 이렇게 나왔다 칩시다


/bin/su

/sbin/mingetty

/usr/bin/smbpasswd

/usr/bin/sperl5.00503

/usr/bin/passwd

/usr/bin/crontab

/usr/bin/perl

/usr/bin/perl5.00503

/usr/bin/lpq

/usr/bin/lpr

/usr/bin/screendump

/usr/bin/ yppasswd

/usr/sbin/sendmail

/usr/sbin/chpasswd

/usr/sbin/kbdconfig

/usr/sbin/crond

/usr/sbin/ftpck

/usr/sbin/ftprestart

/usr/sbin/grpconv

/usr/sbin/newusers

/usr/sbin/rootflags

/usr/sbin/userdel

/usr/X11R6/bin/SuperProbe

/usr/X11R6/bin/hanterm

/usr/X11R6/bin/XF86_SVGA

/usr/X11R6/bin/XF86_VGA16

/usr/X11R6/bin/startxim

/usr/X11R6/bin/makeg

/usr/X11R6/bin/wdwrite

/usr/X11R6/bin/bitmap

/usr/X11R6/bin/resize

/usr/X11R6/bin/dga

/usr/X11R6/bin/cmap

/usr/X11R6/bin/editresm

/usr/X11R6/bin/gccmakedeptune

/usr/X11R6/bin/gvim



일단 명령어 궁금하죠??


< find / -perm -4000 >


이것을 해석하면 다음과 같습니다.


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


위에서 4000앞에 붙은 -가 바로 "적어도"를 의미하며,

-perm 은 "권한을 찾겠다" 라는 옵션입니다. 그 뒤의 '4' 자가

바로 SetUID를 의미하며, '000'은 rwx 모두를 의미합니다.


이왕 배우는거 find 명령에 대해 조금 더 자세하게 배워봅시다.


옵션 :  -perm   권한과 일치하는 파일을 찾는다.

                ex) find / -perm 4755

        -name   이름과 일치하는 파일을 찾는다.

                ex) find / -name cat

        -user   유져와 일치하는 파일을 찾는다.

                ex) find / -user mmung2

        -group  그룹과 일치하는 파일을 찾는다.

                ex) find / -group guta


위의 옵션들은 서로 조합하여 동시에 사용할 수도

있습니다.


ex) find / -user root -perm -4000

-> 루트의 권한으로 SetUID가 걸린 파일을 찾아라.


이제 해커스쿨의 레벨별 해킹을 통과하는 방법을

알려드리며, 마지막 트레이닝을 마칩니다..


1. 자신의 아이디가 level3이라고 해보자.


2. level4로 넘어가기 위해서, level4의 권한으로

   SetUID가 걸린 파일을 찾는다.

   -> find / -user level4 -perm -4000


4. 그럼 한개 이상의 파일이 발견될 것이다.


5. 그 파일은 임의로 작성된 "멍청한 파일" 이다.


6. 그 파일을 이용하여 level4의 쉘을 얻으면 성공!.


7. my-pass 라고 입력하면 level4의 패스워드가..

==================================================================================

반응형

'차근차근 > Linux' 카테고리의 다른 글

linux tomcat log 한글 깨짐현상  (0) 2014.09.18
리눅스 /etc/hosts.conf  (0) 2014.09.18
톰캣 tomcat 재실행 재시작  (0) 2014.09.17
소유권과 허가권  (0) 2014.09.04
php exec 웹상에서 실행문제. 도와주십시오  (0) 2014.09.04