사이트 내 전체검색
해킹의 단계별 접근 방법
로빈아빠
https://cmd.kr/server/771 URL이 복사되었습니다.

본문


[1]-Setuid의 개념

[2]-리다이렉션
[3]-디렉토리의 구조
[4]-인터넷 수퍼서버 INET
[5]-쉘 명령을 실행하고 싶을땐?
[6]-해킹의 5단계
[7]-Race Condition을 이용한 해킹 기법
[8]-포맷 스트링 어택(format string attack) 해킹 기법
[9]-모의해킹게임
[10]-모의 해킹 게임 해커즈랩 레벨2 -> 레벨3
[11]-리눅스 해킹 툴 총집합 - 포트스캐너
[12]-두근두근 실정 해킹
[13]-두근두근 실전 해킹 - 데몬의 버전 확인
[14]-리모트 해킹 - 25번 포트를 이용하여 공격하는 방법
[15]-리모트 해킹 - sendmail 8.9.3 버그를 이용한 해킹의 실 예
[16]-리모트 해킹 - cgi를 통한 해킹의 실 예
[17]-리모트 해킹 - php 파일 업로드 취약점의 실 예
[18]-로컬 해킹
[19]-해킹 흔적지우기
[20]-백도어 생성법

샘플1 

Setuid의 개념

setuid는 멀티 유져 시스템인 유닉스/리눅스에서만 볼 수 있는
독특한 개념입니다.

이해를 돕기 위해 다음과 같은 예를 준비하였습니다.
01.gif

위의 예는 영철이가 수강증으로 인해 병철의 권한을
대신하는 것을 보여줍니다.
이와 비슷하게 리눅스 사용자들은 setuid으로 인해
일시적으로 다른 유져의 권한을 얻을 수 있게 됩니다.
그럼 이 setuid가 리눅스 시스템에 어떤 식으로 적용되는지
직접 리눅스를 사용하면서 익혀봅시다.

먼저 윈도우의 시작 버튼을 누른 후 - 실행 메뉴를 클릭 합니다.
창이 뜨면 열기에 telnet ftz.hackerschool.org를 입력한 후
엔터 키를 누릅니다.

02.gif 

[ 윈도우 텔넷 프로그램을 사용하여 ftz에 연결하는 모습 ]

그럼 이와 같은 화면이 나타날 것입니다.
여러분은 지금 이 책을 구입한 독자들과
해커스쿨 홈페이지 이용자들에게 제공되는
리눅스 서버에 접속한 것입니다.

 [ ftz에 접속된 화면 ]
03.gif 

백문이 불여일견, 백견이 불여일행.
앞으로 여러분은 이런 식으로 책과 실제 리눅스 서버를
오가면서 해킹을 학습하게 될 것입니다.
(귀찮으면 그냥 책만 보아도 상관없습니다.) 

이제 id 부분에 realhack 이라고 입력하고,
password 부분에는 youngjin 이라고 입력합니다.
패스워드가 입력되지 않는다고 당황하지 마세요!
단지 여러분 눈에 보이지만 않을 뿐이지
패스워드는 정확히 입력되고 있는 것입니다.  

성공적으로 로그인되었다면 다음과 같은
쉘 프롬프트(shell prompt)를 만날 수 있을 것입니다.

04.gif

[ 성공적으로 로그인 된 화면 ]

자 이제 쉘 프롬프트에 whoami라고 입력해봅시다.
그럼 다음과 같이 자신의 권한에 대한 정보를 얻을 수 있습니다.

05.gif

[ 자신이 누구인지 알 수 있다. - whoami ]

그럼 이번엔 chapter1/setuid 라는 디렉토리로 이동해봅시다.

06.gif

[ chapter1/setuid 디렉토리로 이동 ]

ls -al을 입력하면 다음과 같은 세 개의 파일을 볼 수 있을 것입니다.

중간생략...

샘플2

리다이렉션

다이렉션(direction)이란 "방향"을 뜻하고
리(re)란 "다시"를 의미합니다.
따라서 리다이렉션을 해석하면,
"방향을 재 지정해 준다." 정도가 될 것입니다.
그럼 어떤 경우에 리다이렉션이 필요하게 되는지 알아봅시다.

출력 리다이렉션

쉘 프롬프트에 ls -al을 입력해 봅시다.
그럼 당연히 현재 디렉토리의 파일 목록이 화면으로
출력될 것입니다. 하지만 저는 그것을 화면이 아닌
다른 곳으로 출력되게 하고 싶습니다.
이럴 때 사용하는 것이 바로 출력 재 지정(리다이렉션) 입니다.

07.gif

이렇게 입력하면 ls -al의 결과는 화면이 아닌
list.txt 라는 파일로 저장이 됩니다.

실제 그렇게 되는지는 list.txt을 열어보면 알게 될 것입니다.

08.gif

이것은 ls의 매뉴얼을 howto.txt 라는 파일로
리다이렉션 해준 명령입니다.

리다이렉션을 이용하여 파일 만들기

자 이제 가장 효과적으로 리다이렉션을
사용하는 방법을 알려주겠습니다.

먼저 쉘 프롬프트에 cat 이라고 입력해 봅시다.
이어서 아무 문자열이나 계속해서 입력해 봅시다.
그럼 cat 명령에 의해 자신의 입력한 문자열이
다시 한번 출력되는 것을 볼 수 있습니다.
컨트럴 키와 D 키를 동시에 누르면 입력은 종료됩니다.

09.gif

[ cat 명령의 사용 - 자신이 입력한 문자열이 출력된다. ]

이제 다음과 같은 명령을 입력해 봅시다.

10.gif

자 또 다시 아무 문자열이나 마구 입력해 봅시다.
하지만 이번엔 자신이 입력한 것이 메아리 치지 않습니다.
그렇습니다. 리다이렉션에 의해 메아리 쳐야할
문자열들이 test.txt 에 저장이 되고 있는 것입니다.

11.gif

컨트럴-D 키를 눌러 종료한 후 test.txt 파일의 내용을
확인해 봅시다.
자신이 입력한 문자열들이 그대로 저장되어 있을 것입니다.

이것은 문서 파일을 작성할 때나 C언어의 소스 파일을
작성할 때 유용하게 사용되니 꼭 기억하기 바랍니다.

12.gif

중간 생략...

샘플 3 - 디렉토리의 구조

최 상위 디렉토리(루트)로 이동한 후 ls -al를 입력하면
많은 디렉토리들을 볼 수 있습니다.
이제 그것들이 어떤 역할을 하는 디렉토리인지에
대해서 알아봅시다.

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

         ex) bash, ping, ls, mkdir, mv ....

- boot : 리눅스 부팅 관련 파일들과, 커널이란 것이 들어있습니다.

커널 - 리눅스의 심장부 역할을 하는 파일로서 CPU,디스크,
          프린터등의 하드웨어를 제어하는 임무를 합니다.

- dev  : 이곳은 컴퓨터에 설치된 하드웨어에 관한 정보들이 파일 형태로            저장되어 있는 곳입니다.

- etc  : 많은 중요한 파일들이 이곳에 들어가 있습니다. 패스워드 파일,
           쉐도우 파일, 그 외 대부분의 리눅스 설정 파일 등등.

- home : 일반 사용자들의 디렉토리가 들어가는 곳입니다.
              guest, mirable,realhack 등등의 계정이
              모두 이 디렉토리 안에 속해 있습니다.

- ~/public_html : 일반 사용자들의 홈페이지 파일이
                         들어가 있는 곳입니다.

- lib  : 많은 라이브러리 파일들이 들어가 있습니다.

라이브러리-재 사용이 가능하도록 미리 작성된 미리 컴파일된
                함수의 모음입니다.

- mnt  : mount 명령을 사용하여, 마운트 시킨 시디롬,
           플로피 디스켓등이 들어가는 디렉토리.

마운트 - 리눅스에선 드라이브 개념이 없습니다.
            윈도우나 도스에선 드라이브를 변경하기 위하여
            A:, B:, ... D: 등등의 명령을 사용하지만,
            리눅스에선 mount 명령을 이용하여
            드라이브 안의 파일들을 특정 경로로
            탑재(mounting) 시킵니다.

예를 들어 시디롬 안에 test.dat 라는 파일이 하나
들어있다고 해봅시다. 이제 마운트 명령어를 이용해
cdrom 의 파일을 /mnt/cdrmo 이란 경로로
탑재시켜 보겠습니다.

[root@ftz /root]# mount /dev/cdrom /mnt/cdrom  

[root@ftz /root]# cd /mnt/cdrom

[root@ftz cdrom]# ls

test.dat   <- cdrom 안의 파일이 /mnt/cdrom/ 으로 탑재되었습니다.

[root@ftz cdrom]#

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

- root : 일반 사용자의 디렉토리는 /home 아래 존재하지만,
           루트의 홈 디렉토리는 따로 이곳에 저장됩니다.

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

- tmp  : 임시로 파일을 저장하는 디렉토리로서, 권한에
           상관없이 누구나 이 디렉토리에 파일을 생성할 수 있습니다.

sticky bit - 누구나 특정 디렉토리에 파일을 생성할 수
                있다는 말은 반대로 누구나 그 디렉토리 안의
                파일을 삭제할 수 있다는 말이 됩니다.
                이것을 방지하게 위해 sticky bit라는 것이
                나타났는데, 이것을 설정해 놓으면
                누구나 파일을 생성할 수 는 있지만 지우는 것은
                그 파일의 생성자만 할 수 있게됩니다.

drwxrwxrwt    3 root     root         3072 Oct 16 15:58 tmp

-> /tmp 디렉토리엔 sticky bit이 걸려있습니다.
     (퍼미션 정보 가장 오른쪽의 't')

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

- var  : 시스템 운영 중에 생성되는 각종 임시 파일들이
           들어가 있으며, 외부 접속에 대한 로그 파일들이
           바로 이곳에 저장됩니다.

샘플 4 - 인터넷 수퍼서버 INET

나의 리눅스에 telnet 접속을 가능하게 해주는
telnet 서버가 작동중이라고 해봅시다.
그리고 어떤 이가 외부에서 윈도우 텔넷 접속 프로그램을
통해 나의 서버에 요청을 보낸다고 합시다.
그럼 telnet 서버는 그 요청을 받고 로그인 작업을 할 것입니다.

13.gif

[ 대기 상태에 있다가 요청을 받고 작업을 하는 텔넷 서버 ]

그럼 이번엔 외부로부터의 접속이 없을 때를 생각해 봅시다.

14.gif

[ 요청이 없어 그냥 놀고만 있는 텔넷 서버 ]

이와 같이 telnet 서버는 할 일이 없음에도
불구하고 cpu 효율만 낭비하게 될 것입니다.

telnet 서버뿐만 아니라, 다른 서버들도 함께
작동중이라면 더 심각해집니다.

15.gif

[ 할 일 없이 자원만 낭비하는 서버들 ]

이런 것을 방지하게 위해 생겨난 것이 바로
인터넷 수퍼서버 inet 입니다.

inet 은 일단 모든 서버들을 종료시켜 놓은 후..

16.gif

[ 서버들을 재우는 inet ]

외부의 요청이 있을 때만 해당 서버를 깨워서 실행시킵니다.

17.gif

[ 요청이 들어 왔을 때만 실행되는 ftp server ]

이렇게 하면 쓸데없는 자원 낭비는 없어지게 되는 것입니다.

샘플5 - 쉘 명령을 실행하고 싶을 땐?

X-window 역시 MS-window처럼 마우스 하나로
거의 모든 것을 해결 할 수 있습니다.
하지만 수동으로 프로그램을 설치할 때나
간단 간단한 쉘 명령들을 실행할 때처럼
/bin/bash를 불러와서 작업을 해야할 필요가 종종 생깁니다.

바로 이럴 때 사용하는 것이
X-window 전용 쉘인 xterm 입니다.
바탕화면의 아이콘 중 term 자가 들어가는 것을 찾아서
클릭 해 보세요. 그럼 다음과 같은 터미널이 생성될 것입니다.

18.gif

[ X-window용 쉘인 xterm의 모습 ]

xterm 말고 hanterm 이란 것도 있는데 이것은
한글 사용이 가능한 터미널입니다.
따라서 앞으로 xterm 보단 hanterm을 사용하는 일이
훨씬 많을 것입니다.

외부로 프로그램들을 실행시킬 수 있다!

X-window 관련 프로그램들의 특징 중 하나가
바로 내 컴퓨터가 아닌 다른 사람의 컴퓨터로
특정 프로그램을 실행시킬 수 있다는 것입니다.
단, 다음과 같은 조건들이 만족되어야 합니다. 

- 상대방의 컴퓨터로 실행될 프로그램의 조건

실행 옵션 중에 -display 란 것이 있어야 한다.

- 그 프로그램을 받아들일 컴퓨터의 조건

Xserver 가 실행 중이어야 한다.

xhost 명령을 사용하여 접근 허용 목록에
해당 ip를 추가 시켜야 한다.(리눅스일 경우에만 해당)

(ex. xhost +211.195.119.179)

Xserver란? X-window의 DISPLAY를 관리하는 서버이며,
이것을 가능하게 해주는 프로그램은
/usr/X11R6/bin/xdm 입니다.
( xmd - X Display Manager )

그런데 여기서 한가지 의문점이 생깁니다.
"굳이 다른 사람의 프로그램을 내 컴퓨터에서
실행해야 할 이유가 있을까?"
그래 프로그램이 필요하면 다운로드 받으면 되지
왜 남의 신세를 져야 합니까.

하지만 해당 프로그램이 "상대방의 권한"으로
실행된 다는 것을 생각해본다면 말이 달라집니다.
즉, xterm이나 hanterm을 내가 받을 수만 있다면
나는 상대방의 shell 권한을 얻게 되는 것입니다.

그리고 이것은 계정이 없는 상태에서 타겟 컴퓨터의
권한을 얻는 리모트 어택(Remote Attack)에 요긴하게 사용됩니다.

샘플 6 해킹의 5단계

 

(1) 정보수집

해킹 하고자 하는 타겟을 정했다면 가장 먼저 해야 할 일은
그것에 대한 정보를 수집하는 것입니다.
정보가 자세하면 자세할수록 해킹에 성공할 확률은 높아집니다.

필자는 보통 다음과 같은 순서로 타겟의 정보를 탐색합니다.

1. 포트 스캐닝

- 포트 스캐닝이란 해당 IP의 컴퓨터에 열려있는 포트들을
검색하는 것을 말합니다.
집에 대문이 열려 있다면 다른 사람이 그것을 통해
들어올 수 있을 것입니다.
마찬가지로 컴퓨터에 포트가 열려있다면 그것을 이용해
해킹을 하는 것이 가능해집니다.

2. 데몬 프로그램들의 정보 확인

- 데몬이란 각 시스템에 관련된 작업을 하는 것으로서
'서비스'라고 이해해도 좋습니다.
예를 들어 파일 전송을 가능케 해주는 FTP 서비스를
제공하는 것은 FTP 데몬입니다.
마찬가지로 여러분이 ftz에 텔넷 접속을 할 수 있는 것은
ftz에 텔넷 데몬이 작동 중이기 때문입니다.

데몬을 좀 더 정확하게 말한다면 부팅 시 자동으로 실행된 후
셧다운이 되기 전까지 백그라운드로 작업되는 프로그램입니다.
여기서 백그라운드로 실행된다는 것은 우리 눈에 보이지 않는
상태로 실행된다는 것을 의미합니다.
이런 데몬 프로그램은 크게 두 가지로 나뉘어 지는데
kerneld나 crond처럼 포트에 관련되지 않고 실행되는 것과
ftpd, httpd, named처럼 해당 포트를 연 후 그곳에서
작동하는 프로그램입니다.
이 두 가지 데몬 중 우리가 눈여겨봐야 할 것은
역시 포트를 연 후 그곳에서 작동하는 것입니다.

포트 스캐닝 후 특정 포트가 열려있다는 것이 확인되면
그 다음 해야 할 일은 해당 포트에 작동중인 프로그램이
무엇이며, 그 버전은 어떻게 되느냐에 대해 알아내는 것입니다.

만약 21번 포트가 열려있는 것이 확인되었다고 해봅시다.
그럼 일단 /etc/services에 정의된 포트 리스트에 의해
그곳에 ftp 프로그램이 작동 중일 것이란 걸 예상할 수
있을 것입니다.
이제 실제 21번 포트에 작동 중인 프로그램을 확인하기 위해
우리는 다음과 같은 작업을 해야합니다.

중간 생략..

(2) 리모트 어택

리모트 어택은 계정을 가지고 있지 않은 서버의 쉘을
얻고자 하는 시도입니다.

이것은 보통 데몬의 버그를 이용하여 이루어집니다.
앞의 정보 수집 과정에서 각 데몬에 실행중인 프로그램과
버젼을 확인할 수 있고, 그것에 어떤 버그가 있고
어떤 식으로 구현되며 공격되는지에 대한 정보는
exploit 관련 사이트들에서 찾아볼 수 있습니다.
만약 해당 데몬이 루트 권한으로 돌아가고 있다면
단번에 루트 획득이 가능하며 로컬 어택 과정이 생략됩니다.

exploit이란?

"세상에 완벽한 인간은 존재할 수 없다.
모든 프로그램들은 인간에 의해서 만들어진다.
고로 세상에 완벽한 프로그램이란 있을 수 없다."

어떤 프로그램이던 간에 버그는 있기 마련입니다.
버그란 프로그래머의 실수로 얘기치 못한 오동작을
유발하는 프로그램 상의 허점을 말합니다.

만약 데몬으로 작동하는 프로그램이나 root의 권한으로
setuid가 걸려있는 프로그램에 버그가 발견된다면
해커들은 그것을 이용하여 해킹을 시도합니다.
보통 해커들은 C언어나 쉘 스크립트를 이용하여
그것을 공격하며, 그렇게 완성된 하나의 공격 프로그램을
우리는 exploit이라고 부릅니다.

exploit 사이트들

중간 생략...

(3) 로컬 어택

리모트 어택에 성공하여 해당 서버의 쉘을 획득하였다면,
이제 해야할 것은 루트 획득이며 그것을
로컬 어택이라 부릅니다.
보통 서버 내의 잘못된 설정이나 root 권한으로 setuid가
걸려있는 파일을 이용하여 루트 권한을 획득할 수 있습니다.
현재 대부분의 setuid가 걸린 프로그램이 취약점을
가지고 있고 그에 대한 exploit도 공개되어 있습니다.
따라서 리모트 어택에만 성공한다면
로컬 어택은 식은 죽 먹기입니다.

19.gif

(4) 흔적 지우기

루트 권한을 획득하였다면 그 권한을 이용하여 재빨리
자신의 흔적을 제거해야 합니다.
흔적을 지우는 방법은 크게 두 가지로 나눠 볼 수 있습니다.
첫째, 서버내의 모든 흔적을 통째로 삭제하는 방법.
이것은 가장 쉽고 빠른 방법이긴 하나 관리자에게
서버가 해킹 당했다는 사실을 알게 해줍니다.
둘째, 자신의 접속 기록만 제거하는 방법.
이것을 하려면 프로그래밍 능력이 필요합니다.
하지만 인터넷에서 쉽게 구할 수 있는 툴 들이
그 수고를 대신해줄 수 있습니다.

만약 해킹 후 실수로 흔적을 지우지 않고 나와버린다면
여러분은 전화벨이 울릴 때마다 긴장해야 할 것입니다.
(그들은 아마 당신에게 자진 출두를 요청할 것입니다.)

(5) 백도어 생성

흔적을 지우고 볼일을 다 보았다면 이제 해야 할 것은
백도어 생성입니다.

백도어란 해킹에 성공한 서버에 쉽게 재침입할 수 있도록
고의로 숨겨 놓는 홀(hole) 혹은 프로그램을 말합니다.
예를 들어 여러분은 서버에 접속한 후
"give me the root" 라고 입력하는 것만으로
루트권한을 얻을 수 있도록 백도어를 심을 수 있습니다.

샘플 7 - Race Condition을 이용한 해킹 기법

리눅스는 멀티 프로세스 운영체제입니다.
즉 하나의 명령이 실행되고 있을 때 동시에 또 다른
명령이 실행될 수 있다는 말입니다.
Race Condition은 이 멀티 프로세스라는
리눅스(유닉스)의 특징을 이용한 해킹 기법이며 최근에도
종종 문제가 되고 있습니다.
간단한 예로 관리자가 /tmp 디렉토리에서
test.c 라는 파일을 작성한다고 가정해 봅시다.

20.gif

그런데 이 때 마침 mirable 이라는 사용자가
/tmp 디렉토리에서 다음과 같은 심볼릭 링크를
만든다면 어떻게 될까요?

21.gif

그럼 관리자가 입력하는 내용은 심볼릭 링크로 인해
test.c가 아닌 /etc/passwd 파일에 기록될 것입니다.
따라서 /etc/passwd 파일이 손상되어 버리는 것입니다.

이번엔 조금 현실성 있는 경우를 생각해 봅시다.
다음의 예는 실제 Race Condition 기법으로 문제가
되었던 프로그램입니다.

아주 오래된 버젼의 /bin/mail 프로그램에 해당되는 예입니다.
이 /bin/mail 프로그램을 사용하여 한 사용자에게 메일을 보내면
그 내용이 /var/spool/mail 에 저장된 다는 것을
전에 배웠습니다.
만약 한 사용자가 mirable 이라는 사용자에게 hello 라는
내용의 메일을 보낸다면,
그 내용은 /var/spool/mail/mirable 이라는 이름의 파일로
저장이 되는 것입니다.

그럼 mirable에게 편지를 보내면서 재빨리
/var/spool/mail/mirable 파일을 /etc/passwd 로
심볼릭 링크를 시켜 버린다면?
/bin/mail 프로그램은 setuid가 걸려 있는 프로그램이기 때문에
root 권한으로 편지의 내용이 /etc/passwd 파일에
기록될 것입니다.
따라서 만약 hacker::0:0::/tmp:/bin/bash 라는 내용이 담긴
편지를 보낸다면 루트 권한의 암호가 없이
로그인 가능한 hacker 라는 사용자가 추가될 것입니다.

사실 지금까지 설명한 기법은 Race Condition 이라기 보다는
심볼릭 링크를 이용한 해킹 기법이라고 하는 게 더 정확할 것입니다.
진짜 Race Condition 해킹 기법은 다음과 같은 상황에서
구현할 수 있습니다.

역시 실제로 문제가 되었던 구 버젼의 /bin/ps 프로그램은
실행 도중 /tmp 디렉토리에 ps_data 라는 파일을 생성합니다.
하지만 이 프로그램의 특징은 심볼릭 링크를 이용한 해킹을
방지하기 위해. ps_data 라는 파일이 생성되기 직전에
이 ps_data라는 이름의 파일이 이미 존재하는 지를 파악한다는
점입니다.
만약 그 파일이 존재한다면 그 파일을 삭제해 버린 후 새로운
ps_data 파일을 생성합니다.
따라서 심볼릭 링크를 이용한 해킹이 전혀
통하지 않게 되는 것입니다.

하지만 이런 방어 법에는 다음과 같은 허점이 존재합니다.
즉, ps_data 파일이 이미 존재하는지를 확인하는 작업과
그것을 지우는 작업 그리고 새 파일을 생성하는 작업 사이사이에
우리가 직접 느낄 수는 없지만 아주 작은 시간 간격이
남기 마련이라는 것입니다.

ps_data 파일 존재 여부 확인

(시간 간격)

존재한다면 ps_data 파일을 삭제

(시간 간격)

새로운 ps_data 파일 생성

따라서 두 번째 시간 간격인 ps_data 파일이 삭제된 직후에
또 다시 해커가 ps_data 파일을 생성하면,
ps_data 파일을 미리 삭제하는 작업은 무의미해 질 것입니다.

ps_data 파일 존재 여부 확인

(시간 간격)

존재한다면 ps_data 파일을 삭제

(시간 간격)   <---- 이 시간을 이용하여 해커의 ps_data 파일 생성

새로운 ps_data 파일 생성

그럼 어떻게 위 두 번째의 시간 간격의 타이밍을
알아낼 수 있을까요.
이것에 대한 특별한 방법이 있을 것만 같지만 그렇지 않습니다.
즉, 그냥 무식하게 /bin/ps 프로그램을 오랫동안 반복하여
실행시키고, 또 동시에 해커의 ps_data 파일을 반복하여
생성하면 언젠가는 위의 타이밍에 매치 되어 해커가 원하는
결과를 얻게 되는 것입니다.

따라서 /bin/ps 프로그램과 해커의 프로그램이
오랫동안 경쟁(Race) 상태(Conditon)에 놓이게 되기 때문에
이 기법의 이름이 Race Conditon인 것입니다.

그럼 직접 위의 이론을 적용시켜 봅시다.

먼저 다음과 같은 소스 파일을 만듭니다.

중간 생략..

샘플 8 - 포맷 스트링 어택(format string attack) 해킹 기법

 

포맷 스트링 어택은 printf() 계열의 함수의 오용에서 나타나는 문제점을 이용한 공격으로, 공격 기법 자체는 오래 전에 발견되었으나 최근들어 많은 주목을 받는 공격 방법입니다. 이제 포맷 스트링 어택의 원리에 대해 설명하고 실제로 적용하는 방법을 설명해 보겠습니다.

 

프로세스와 스택

 

앞의 Stack overflow 공격을 설명할 때에 스택이 무엇이고,
프로세스가 실행할 때 메모리는 어떤 구조로 관리되며,
C 언어에서 함수를 호출할 때 스택을 어떻게 이용하는지
알아본 바 있습니다. 대략적으로 복습해 보면 스택이란
데이터를 저장하는 방법의 하나로써,
데이터가 들어가는 순서와 나오는 순서가 반대가 되는
구조를 말한다.
그리고 프로세스가 실행 될때 커널은 그 프로세스를
위한 공간을 할당하며 그중 일부가 스택입니다.
프로세스는 스택에 함수의 실행에 필요한 정보와 함수의 인자,
그리고 지역 변수들을 넣는다고 했다.
이 과정을 좀 더 자세히 알아봅시다.

     // List 1.  "stack.c"

1:   void func( int a, int b, int c )

2:   {

3:       int i;

4:       char str[20];

5:   }

 

6:   int main( int argc, char *argv[] )

7:   {

8:       func( 1, 2, 3 );

9:   }

우선 이 프로그램이 실행되면, 가장 먼저 6번 행부터 실행됩니다. 6 번행은 main() 함수를 호출하는데 커널은 main() 함수를 호출하기 전에, 함수의 실행에 필요한 데이터와 함수의 인자를 먼저 스택에 push 합니다. 즉, 6번 행에서의 Stack 은 다음과 같은 구조가 됩니다.

중간 생략...

샘플9 모의 해킹 게임

해커스쿨 레벨1 -> 레벨2

먼저 레벨2 권한에 setuid가 걸린 프로그램이 있는지 찾아봅니다.

22.gif

뒤에 2>(표준 에러 의미) /dev/null 을 붙인 이유는
퍼미션이 허락되지 않아서 출력되는 에러메시지를
쓰레기통으로 보내기 위해서입니다.
2> /dev/null을 제거하고 위의 명령을 실행시켜 보면
왜 그것이 필요한지 알게 될 것입니다.

이제 /bin/ExcuteMe라는 파일을 한번 실행해 봅시다.

그럼 다음과 같은 화면이 나타납니다.

23.gif

위의 상태에서 입력되는 하나의 명령은 level2의 권한으로
실행된다고 했습니다.
따라서 my-pass를 입력하면 level2 권한의 패스워드가
출력될 것이고, /bin/bash 를 카피한 후 level2로 권한을 맞춘 뒤
chmod 명령으로 setuid를 주면 level2 권한의 쉘을
얻게 될 것입니다. 하지만 위 두개의 명령은 사용할 수
없도록 막아 놓았다는 것을 알 수 있습니다.
그럼 도대체 어떤 방법으로 level2의 권한을 획득할 수 있을까요?

만약 쉘(shell)이 우리가 입력한 명령을 해석하는
하나의 "프로그램" 이라는 것을 알고 있다면 이 문제는
쉽게 해결될 것입니다.
즉, 쉘은 명령어를 해석하는 역할을 하는 프로그램입니다.
따라서 level2의 권한으로 이 프로그램을 실행하게 되면
level2 권한의 명령어 해석기를 얻게 되는 셈입니다.
성공했다면 my-pass 라고 입력하여 level2의 패스워드를
볼 수 있습니다.

샘플10 모의 해킹 게임 해커즈랩 레벨2 -> 레벨3

< 문제 >

24.gif

< 해결 >

level3 권한에 setuid가 걸린 파일을 찾아봅시다.

25.gif

/usr/bin/alert 이란 파일이 발견되었습니다. 실행해 봅시다.

26.gif

more 라는 프로그램은 사용자가 한 화면에 볼 수 없는
긴 텍스트 문서를 잘라서 보여주는 역할을 합니다.
하지만 이 프로그램에 보안상 문제점이 있다고 하는데...
혹시나 하는 마음으로 more 프로그램의 설명서를 읽어봅시다.

27.gif

쭉 읽어 내려가다 보면 4번째 페이지에서
너무너무 고마운 명령을 볼 수 있을 것입니다.

28.gif

그것은 바로 more 사용 도중에 쉘 명령을 실행할 수 있는
! 또는 :! 커맨드입니다.

샘플11 리눅스 해킹 툴 총집합 - 포트스캐너

ASCAN

nmap 과는 달리 포트스캔의 최소 기능만 가지고 있는
간단하며 그만큼 사용하기 쉬운 스캐너입니다.

ASCAN의 설치

ascan은 보통 ascan.tar.gz과 같은 압축 파일 형태로
배포됩니다. 압축을 해제시키는 명령은 다음과 같습니다.

*.gz : gzip -d filename

*.tar : tar xvf filename

-x : extract의 약자로 해제라는 의미입니다.

-v : 해제 과정을 보여줍니다.

-f : 파일 상태의 압축을 해제합니다.

29.gif

[ *.tar.gz 형태로 된 파일의 압축을 해제 시키는 장면 ]

위와 같이 *.tar.gz 파일은 먼저 tar로 해제시킨 후
다시 일반 파일로 해제시켜 주어야 합니다.
또 위의 과정은 tar의 z 옵션으로 한번에 해결할 수도 있습니다.

30.gif

[ 한번에 *.tar.gz 파일을 해제시키는 모습 ]

ASCAN의 실행

ASCAN을 사용하여 포트 스캔을 하는 방법은 매우 간단합니다.

31.gif

[ ASCAN의 사용 방법 ]

샘플12 두근두근 실정 해킹

문이 몇 개나 있나.. - 정보 수집

모든 서버가 똑같은 방법으로 해킹 되지 않는다는 것
정도는 말하지 않아도 알 것입니다.
보안이 철저한 서버가 있는 반면, 아예 보안 쪽으론
신경도 안 쓰는 서버도 있습니다.
해킹의 제 1단계인 정보 수집은 바로
해당 서버(서버 관리자)가 보안에 어느 정도 관심이
있는지를 알아내는 과정입니다.

포트 스캐닝

앞서 배운 많은 종류의 포트 스캐너 중 마음에 드는 것을 하나 골라
hackerschool.org를 스캔해 봅시다.

32.gif

[ nmap을 사용하여 hackerschool.org를 스캔한 모습 ]

결과를 보면 21, 23, 25, 80, 110 등의 서비스에
꼭 필요한 포트만 열려있습니다.
따라서 이와 같은 서버는 어느 정도 보안 관리가 되어있는
곳이라는 것을 알 수 있습니다.

반면에 다음의 서버를 봅시다.

33.gif

[ 보안 관리가 제대로 되어있지 않은 서버 ]

전혀 쓸데가 없는 포트들이 많이 열려있는 것을
확인할 수 있습니다.
따라서 이곳의 관리자는 서버 관리에 관심이 없거나
실력이 없는 것 둘 중 하나일 것입니다.

샘플13 두근두근 실전 해킹 - 데몬의 버전 확인

포트가 열려 있다는 것은 그곳에 프로그램이
작동 중이라는 얘기입니다.

따라서 이제 해야할 일은 포트에 하나 하나씩 직접 접속하여
프로그램과 그것의 버전을 확인하는 것입니다.

34.gif

[ telnet을 사용하여 21번 포트에 접속 ]

2.6.0 버전의 wu_ftp 프로그램을 사용하고 있다는 것을
볼 수 있습니다.

참고로 이 버전엔 외부에서 루트를 획득할 수 있는
버그가 존재합니다.
여기서 다시 한번 이 서버의 관리자가 얼마나 보안 의식이
없는지를 알 수 있습니다.

이번엔 23번 포트에 접속해 봅시다.

35.gif

[ 23번 포트에 접속 ]

리눅스 버전이 그대로 노출되어 있습니다.
이런 건 /etc/issue.net을 편집해서 숨겨 주어야 합니다.

이번엔 또 25번 포트에 접속해 봅시다.

36.gif

[ 25번 포트에 접속 ]

25번 포트엔 메일 서버가 작동 중입니다.
프로그램은 sendmail 8.9.3으로 비교적 최신 버전이긴 하나
역시 버그를 가지고 있는 것은 마찬가지입니다.

53번 포트에는 bind라는 프로그램이 작동 중인데,
이것은 텔넷 접속으로 버전을 확인할 수 없고,
dig라는 명령을 사용해야 합니다.

37.gif

<

댓글목록

등록된 댓글이 없습니다.

1,139 (20/23P)

Search

Copyright © Cmd 명령어 3.145.196.150