시스템/시스템 보안 19

Buffer Overflow-2

[소스코드 1]- Buffer Overflow공격을 진행하기 전에 우선 아래의 소스코드를 분석해본다.- Callee인 Func함수에서의 스택 구조는 아래와 같다. 0012FB68 BUF[4] 공간 => Test 0012FB6C EBP => sta 0012FB70 RET => ck B 0012FB74 uffe 0012FB78 r Ov 0012FB7C er F 0012FB80 low 0012FB84 0000 0012FB88 0000 ... ...- memcpy함수를 실행하면 EBP는 물론 RET까지 attack배열의 문자열로 덮어 버린다. 즉, memcpy함수는 Buffer Overflow에 취약한 함수임을 알 수 있다. [소스코드 2]- 그렇다면 RET값을 임의의 값으로 변경할 수 있지 않을까? 라는 의문..

Buffer Overflow-1

- 실습은 RedHat에서 진행한다.- 2편으로 넘어가기 전에 공격이 어떤식으로 진행되는지 간단하게 살펴본다. 자세한건 2편부터 소개한다. [실습 1]- 우선 아래와 같은 코드를 bof.c라는 이름으로 작성하여 분석해본다. - 작성한 bof.c파일을 컴파일해준다. (gdb를 사용할 것이기 때문에 꼭 -g옵션을 넣어줘야 한다.) - gdb를 실행한다. (-q 옵션은 gdb를 처음에 실행할때 나오는 문구를 보여주지 않는 옵션이다.) - 브레이크 포인트를 걸기 전에 소스 코드를 한번 확인한다. - strcpy함수가 6번째 줄에 위치해 있으므로 6에 브레이크 포인트를 걸어준다. - AAA인자를 넘겨 실행한다. - argv[1]에 넘겨준 AAA가 잘 들어갔는지 확인한다. - buffer을 확인해보니 아직 strc..

RET값 변조

* 문제)-> 다음 코드에서 RET 값을 적절히 변경하여 첫 번째 printf함수가 아닌 다음 printf함수가 수행되도록 수정해본다. * cdecl 함수호출 규약에서의 풀이- 일단 아래와 같이 코드를 바꿔주면 문제를 해결할 수 있다. - 우선 main함수에서 0040101C가 Func함수, 00401029가 첫 번째 printf함수, 00401036이 두 번째 printf함수라는 것을 확인한다.- 첫 번째 함수를 건너 뛰고 두 번째 함수를 실행시켜야 하기 때문에 RET값을 첫 번째 printf함수를 실행하고 난 뒤의 주소로 바꾸어 줘야 한다. - 포인터 연산으로 RET값을 바꾸기 전에는 아래와 같이 RET값이 정상적으로 들어가져 있다. - 포인터 연산을 한 뒤에는 두 번째 함수를 실행하기 바로 전의 주..

패스워드 크래킹

* 패스워드 크래킹 - 해당 시스템에 저장되어 있는 비밀번호를 알아내는 기술 * 암호화 - 데이터 전송 시 데이터가 손실되거나 변경되는 것을 방지하기 위해 데이터를 변환하여 전송하는 방법 - 대칭형 DES, 비대칭형 RSA * 해시 - 임의의 데이터로부터 짧은 전자지문을 만들어내는 방법 - 해시 함수는 데이터를 자르고 치환하거나 위치를 바꾸는 방법을 사용해 결과를 만들어 냄 - 리눅스 - md5(취약) - 왼도우 - lm, ntlm -> ntlmv2 * 패스워드 크래킹 방법 1. Brute Force Attack - 패스워드에 사용될 수 있는 문자열의 범위를 정하고 그 범위 내에서 가능한 모든 값을 대입 - 언젠간 뚫림 - 시간이 상대적으로 오래 걸림 2. Dictionary Attack - 패스워드로 ..

SetUID와 권한상승

* 파일과 디렉터리 생성 시 기본 권한- 파일 -> 644- 디렉터리 -> 755 * 파일, 디렉터리의 기본 생성 최고 권한(umask 활용)파일 -> 666 (chmod로 실행권한 줄 수 있음 -일반 파일에 실행권한을 부여 하면 파일 색(실행 파일)이 연두색으로 변함)디렉터리 -> 777 * /etc/profile 파일- umask 설정 돼 있음 * SetUID- 프로그램 실행 시 파일 소유자의 권한으로 실행 * /etc/shadow 파일의 접근권한- ---------- 권한 설정이 안 돼있어도 소유자(root)는 열람 가능 * /usr/sbin/passwd 명령어의 접근권한- rwsr-xr-x- 비밀번호를 바꿀때는 /etc/shadow파일에 접근해야 하는데 SetUID를 통하여 일반 사용자들도 /et..

[문제 풀이로 배우는 시스템 해킹 테크닉] level10.공유 메모리에 데이터 읽고 쓰기

이번 레벨의 문제를 풀기 전에 공유 메모리라는 것을 먼저 알아야 한다. 공유 메모리란 프로세스간에 공유해서 쓰는 메모리를 말한다. 프로세스는 각자 자신만이 사용할 메모리 공간을 할당해서 사용하기 때문에 다른 프로세스에서 사용하는 메모리 공간은 침범할 수 없도록 설계돼있다.그러나 프로세스 간 서로 데이터를 공유해야 하는 필요성 때문에 IPC라는 기법이 생겨났다. 큰 프로그램은 하나의 프로세스로 모든 사하을 구현하기 힘들기 때문에 여러 개의 프로세스로 기능을 분리해서 만들게 되는데 이렇게 기능을 분리하였기 때문에 서로 다른 프로세스 간에도 데이터를 공유해야 할 필요성이 있다.즉, 공유 메모리는 프로그램을 개발할 때 함수로 각종 기능을 분리하고 함수 간에 인자로 데이터를 전달하는 것과 개념상 비슷하며 프로그램..

[문제 풀이로 배우는 시스템 해킹 테크닉] level9. 버퍼 오버플로우

이번에도 힌트를 열어 확인해보면 /usr/bin/bof의 소스코드를 볼 수 있다.간단하게 해석하면 buf배열에 40바이트 이하의 키보드 입력을 받고 buf2배열에 go가 들어가 있으면 Good Skill이라는 문자열을 출력하고 level10권한 부여 후 배시셸을 실행시키는 코드이다.그런데 여기서 주의해서 봐야 할 점은 buf배열의 크기가 10바이트 라는 것이다.buf배열의 크기는 10바이트인데 fgets()함수로 40바이트 이하의 키보드 입력을 받고 있다. 힌트에서 얻은 소스코드를 bof.c라는 파일로 복사하고 지역 변수가 스택에 배치되는 위치를 알 수 있도록 아래와 같이 밑줄친 소스를 한줄 추가한다. 그리고 실행해보면 buf의 주소는 0xbffff7e0 buf2의 주소는 0xbffff7f0이라고 나온다..

[문제 풀이로 배우는 시스템 해킹 테크닉] level8. 리눅스 패스워드 파일 크랙

힌트를 확인해보면 shadow파일의 용량이 2700이라는 정보를 얻을 수 있다. find 명령으로 용랑이 2700인 파일을 찾아보면 /etc/rc.d/found.txt라는 파일이 눈에 띈다. -size 1b 512바이트 단위의 블록 사이즈 검색(디폴트) -size 10c 10바이트 사이즈 검색 -size 10k 10K바이트 사이즈 검색 -size 10w 10워드 사이즈 검색 /etc/rc.d/found.txt파일의 내용을 확인해보면 /etc/shadow파일의 형식과 동일한 것을 알 수 있다. 이를 john the ripper(로컬 패스워드 크랙용 툴)을 이용하여 크랙한다.참고적으로 hydra라고 하는 원격 패스워드 크랙용 툴도 있다.

[문제 풀이로 배우는 시스템 해킹 테크닉] level7. 암호화의 시작

level7계정으로 접속하여 힌트를 확인해본다. 힌트에서 제시한대로 /bin/level7명령을 실행하면 패스워드를 입력하도록 나온다.일단 모르기 때문에 아무 문자나 입력해본다.(로컬에서 구축한 ftz서버이기 때문에 wrong.txt가 없다고 나온다.)올바르지 않은 패스워드 입니다. 패스워드는 가까운곳에...--_--_- --____- ---_-__ --__-_-위와 같은 내용을 출력 받았다고 치고선 문제를 푼다.-을 1, _을 0으로 하여 2진수를 10진수로 변환한다음 아스키코드를 찾아보면 mate라고 나온다.1101101 1100001 1110100 1100101109 97 116 101m a t e 패스워드로 mate를 입력하면 level8의 패스워드가 나온다.