검색결과 리스트
시스템 해킹에 해당되는 글 14건
- 2018.04.30 [FTZ] 해커스쿨 Level19
- 2018.04.27 [FTZ] 해커스쿨 Level17
- 2018.04.27 [FTZ] 해커스쿨 Level18
- 2018.04.24 [FTZ] 해커스쿨 Level15
- 2018.04.23 [FTZ] 해커스쿨 Level14
- 2018.04.17 [FTZ] 해커스쿨 Level13
- 2018.04.10 [FTZ] 해커스쿨 Level11
- 2018.04.08 [FTZ]해커스쿨 Level10
- 2018.04.06 [FTZ] 해커스쿨 level9
- 2018.04.03 [FTZ] 해커스쿨 Level7
글
[FTZ] 해커스쿨 Level19
[해커스쿨] Level19
1. level19로 접속을 해서 hint를 불러들이면 저렇게 간략한 소스코드를 볼 수 있다.
level18까지와는 다르게 setreuid()함수를 볼 수 없는데, 이건 buf사이즈만큼 값을 넣어주고 난 후, 넘어가는
부분에 setreuid()함수를 실행시켜서 권한을 얻어야 하는 추측이 든다.
쉘을 실행시키는 코드의 앞쪽에 setreuid의 기계어 코드를 넣어야 하고, 앞에있는 코드부터 읽고 실행을 하니깐
기계어 코드를 만들줄 알아야 한다.
2. level20의 권한을 얻을려면 level20의 uid로 설정을 하여야하고, 레벨20의 uid는 다음과 같이
확인하시면 됩니다. chaining return to lib 기법을 이용한다.
몇 가지 정보를 알아야 공격이 가능하다.
1. buf에서부터 ret까지의 거리
2. system(), setreuid() 함수의 주소를 획득
3. system 함수 내부에 존재하는 /bin/bs 주소 획득
4. setreuid 인자 정보
5. chaining를 위한 pop과 ret명령어 그룹
3. /home/level19 디렉토리 안에 attackme를 확인하면 ebp에서 변수 buf까지의
거리를 알 수 있다. 거리는 44다.
4. 위의 명령어를 입력해서 system() 함수와 setreuid() 함수가 메모리에 존재하는 주소지를
알아보자.
system 함수의 주소 = 0x4005f430
setreuid 함수의 주소 = 0x400f9cc0
그러면 이제 /bin/sh의 주소를 가지고 와보자.
5. binsh.c 파일을 작성해서 소스코드를 컴파일 해보자. 그러면 /bin/sh가 있는 주소지
가 출력이 된다.
6. setreuid를 사용하기 위해선 2개의 인자가 사용된다는 것을 알고 있다. 그러므로 pop2개와 ret1개로
구성된 chaining 명령어 그룹이 필요하다.
기본적인 페이로드의 구조는 [buf에서부터 ret까지의 거리] + [setreuid시작주소] + [PPR주소] + [ruid값] + [euid값] + [system 시작주소] + [4Byte 공간] + [/bin/sh주소]
7. 기본적인 페이로드의 구조의 주소지를 입력하면 level20으로 갈 수 있는 비밀번호를 획득할 수 있다.
we are just regular guys
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level17 (0) | 2018.04.27 |
---|---|
[FTZ] 해커스쿨 Level18 (0) | 2018.04.27 |
[FTZ] 해커스쿨 Level16 (0) | 2018.04.25 |
[FTZ] 해커스쿨 Level15 (0) | 2018.04.24 |
[FTZ] 해커스쿨 Level14 (0) | 2018.04.23 |
글
[FTZ] 해커스쿨 Level17
1. level17로 접속을 해서 hint를 불러들이면 위의 소스코드를 볼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> void printit(){ printf("Hello there!\n"); } main(){ int crap; void (*call)() = printit; char buf[20]; fgets(buf, 48, stdin) setreuid(3098,3098); call(); } | cs |
2. /home/level17 디렉토리에 있는 attackme 프로그램을 gdb 프로그램으로 디버깅을 하면
위와 같은 어셈블리어를 볼 수 있다.
1 | export shellcode=$(python -c 'print "\x90"*20+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"') | cs |
3. 위의 것을 프롬프트 창에 입력해주면 된다.
4. $ export
명령어를 입력하면 shellcode가 선언된 것을 확인할 수 있다. 환경변수를 선언하는 이유는
프로그램이 실행될 때마다 메모리 주소가 다르기 때문에 환경변수를 선언해 준다.
5. /tmp 디렉토리에 getenv.c를 만들어서 위의 코드를 입력해주고, getenv 컴파일한 후 실행시켜
준다. 실행시키면 아까 선언한 shellcode의 환경변수의 메모리주소를 알 수 있다.
6. 다시 /home/level17 디렉토리로 이동을 해서 입력해주면 level18의 비밀번호를 얻을 수 있다.
why did you do it
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level19 (0) | 2018.04.30 |
---|---|
[FTZ] 해커스쿨 Level18 (0) | 2018.04.27 |
[FTZ] 해커스쿨 Level16 (0) | 2018.04.25 |
[FTZ] 해커스쿨 Level15 (0) | 2018.04.24 |
[FTZ] 해커스쿨 Level14 (0) | 2018.04.23 |
글
[FTZ] 해커스쿨 Level18
해커스쿨 Level18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> void shellout(void); int main(){ char string[100]; int x = 0; int count = 0; fd_set fds; // fd_set 구조체는 File Descriptor (이하 FD) 를 저장하는 구조체 printf("Enter Your Command: "); fflush(stdout); // 입력 버퍼를 지움 while(1){ if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) // check의 값이 0xdeadbeef면 shellout() 함수를 실행한다. shellout(); else{ FD_ZERO(&fds); // 파일 디스크립터 구조체를 초기화 FD_SET(STDIN_FILEDNO, &fds); // 파일 소켓을 설정하는 함수 // select함수는 파일 디스크립터의 변화를 확인하는 함수 if(select(FD_SETSIZE, &fds, NULL, NULL, NULL) >= 1){ read(fileno(stdin), &x, 1); switch(x){ case '\r': case '\n': printf("\a"); break; case 0x08: count--; printf("\b \b"); break; default: string[count] = x; count++; break; } } } } } void shellsout(void){ setreuid(3099, 3099); execl("/bin/sh", "sh", NULL); } | cs |
select() 함수란? : http://yms2047.tistory.com/281
1. level18로 접속을 해서 hint를 불러들이면 상단과 같은 긴 소스를 볼 수 있다.
소스에서 check 변수의 값이 0xdeadbeef면 shellout 함수를 호출해 level19권한으로 /bin/sh 쉘이
실행된다. 하지만 string[100]보다 check 변수가 뒤에 존재해 일반적으로 BOF로는 문제가 해결 될 수
없다.
여기서 중요한 건 버퍼의 문자수를 조절해주는 count 변수가 0x08 입력이 들어오면 1감소한다.
그렇다면 배열의 인덱스가 -가 되도록 하면 앞의 메모리에 접근이 가능하다는 소리가 된다.
위의 변수를 스택으로 정리를 하면 이런 모양이다. 제일 하단 부분이 높은 주소이고, 제일 위의 상단이
낮은 메모리 주소지다.
2. /home/level18 디렉토리에 있는 attackme를 gdb 프로그램을 이용해서 열어서
어셈블리어 코드로 보는 부분이다. 소스코드가 길어서 어셈블리어도 무척 길다.
check 변수에서 부터 ebp까지는 104, string변수에서 부터 check까지의 거리는 = string[100] ~ ebp까지의 거리
= 100 - 104 = -4
check의 위치가 string보다 앞에 위치해 있는 것을 확인할 수 있다.
기본적인 페이로드는 [string에서부터 check까지의 거리 + 0xdeadbeef]다.
string에서부터 check까지의 거리인 -4는 0x08을 입력시 버퍼의 문자수를 조절해 주는 count 변수가 -1 되는 것을
역으로 돌아가는 방법을 사용해야한다.
3. level19의 비밀번호를 얻을 수 있다.
swimming in pink
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level19 (0) | 2018.04.30 |
---|---|
[FTZ] 해커스쿨 Level17 (0) | 2018.04.27 |
[FTZ] 해커스쿨 Level16 (0) | 2018.04.25 |
[FTZ] 해커스쿨 Level15 (0) | 2018.04.24 |
[FTZ] 해커스쿨 Level14 (0) | 2018.04.23 |
글
[FTZ] 해커스쿨 Level15
1. Level14에서 알아낸 비밀번호로 level15로 접속을 한다. 그래서 힌트를 열면 아래의 소스 코드를 볼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> main(){ int crap; int *check; char buf[20]; fgets(buf, 45, stdin); // buf에 45크기만큼 읽는다. if(*check == 0xdeadbeef){ // check 포인터가 0xdeadbeef면 if문 실행 setreuid(3096,3096); // level16의 프로세스 ID system("/bin/sh"); // /bin/sh 쉘 실행 } } | cs |
2. gdb 파일로 /home/level15/attackme 파일을 열면 위에 것 처럼 디스 어셈블링을 할 수 있다. 위에서 살펴보면
ebp에서 char[20]까지의 거리는 56, ebp에서 check까지의 거리는 16이다.
buf[20]에서 *check까지의 거리 = 56 - 16 = 40 이다.
1에서 보았던 것처럼 check 포인터가 가르키는 값이 deadbeef면 if문을 실행하는데, gdb에서 보면 deadbeef의 값이
비교되는 곳을 보면 main+32 줄에 보면 deadbeef 값이 있는 것을 볼 수 있다. 저 근처를 한 번보면 deadbeef의 값을 확인할 수
있다. 그래서 알애의 명령어를 한번 쳐보자.
(gdb) x/10x 0x80484b2
3. 그러면 저런 형태로 출력이 되면서 메모리 주소에 deadbeef가 들어가 있는 것을 확인 할 수 있다.
그래서 공격 주소는 0x080484b2가 된다.
4. 위의 명령어를 치면 level16으로 가는 비밀번호를 찾을 수 있을 것이다.
about to casue mass
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level18 (0) | 2018.04.27 |
---|---|
[FTZ] 해커스쿨 Level16 (0) | 2018.04.25 |
[FTZ] 해커스쿨 Level14 (0) | 2018.04.23 |
[FTZ] 해커스쿨 Level13 (0) | 2018.04.17 |
[FTZ] 해커스쿨 Level12 (0) | 2018.04.16 |
글
[FTZ] 해커스쿨 Level14
[해커스쿨] Level14
1. level13에서 알아낸 비밀번호로 level14로 접속을 한다. 접속을 해서 hint를 보면 아래의 프로그램 소스가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> #include <unistd.h> main(){ int crap; int check; char buf[20]; fgets(buf, 45, stdin); if(check == 0xdeadbeef){ setreuid(3095, 3095); system("/bin/sh"); } } | cs |
2. /home/level14 디렉토리에 있는 attackme 파일을 디스어셈블링을 하면 위에 처럼 뜬다.
main+29 를 통하여 check의 값은 ebp로부터 16만큼 떨어져 있는 것을 알 수 있었고 buf 변수는
ebp로부터 0x38(56) 만큼 떨어져 있는 것을 main+3을 통해 알 수 있다.
스택구조
attackme 소스에 선언된 변수를 스택 구조로 살펴보면 저렇게 된 것을 알 수 있다.
3, 40btye만큼 공간을 채워주고, 0xdeadbeef 만큼 채워주면 아래의 프롬프트 상태로 바뀌고 비밀번호를 찾으면 된다.
guess what
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level16 (0) | 2018.04.25 |
---|---|
[FTZ] 해커스쿨 Level15 (0) | 2018.04.24 |
[FTZ] 해커스쿨 Level13 (0) | 2018.04.17 |
[FTZ] 해커스쿨 Level12 (0) | 2018.04.16 |
[FTZ] 해커스쿨 Level11 (0) | 2018.04.10 |
글
[FTZ] 해커스쿨 Level13
[해커스쿨] Level13
1. level12에서 알아낸 비밀번호로 level13으로 접속을 한다.
2. /home/level13 디렉토리에서 hint 파일을 불러들이면 위의 프로그램이 있다.
변수 i는 0x1234567을 선언 받고, buf 배열을 1024byte의 크기만큼 가진다. 입력된 값이 1개 이상이면
buf파일에 argv[1]에 입력된 값을 복사하는 strcpy()함수를 실행시킨다.
3. attackme 프로그램을 gdb파일로 열었을 때 볼 수 있는 화면이다. main+3 줄에 보면
buf를 선언한 부분이 있다. main+19 줄에 보면 변수 i의 값이 선언이 되는 것을 볼 수 있다.
그리고 main+79 줄에 보면 0xfffffff4(%ebp) 레지스터에 값 $0x1234567과 같은지 비교를 한다.
4. 이전 level12에서 shellcode를 선언하듯이 똑같이 이번에도 shell코드를 선언해준다.
5. getenv.c로 파일을 작성하고, 디버깅을 해준다.
6. getenv.c로 목적파일 shell 파일로 컴파일을 해준 후 메모리의 주소를 알아낸다. 그러면 저 메모리 주소를 조합해서
attackme 프로그램을 실행시키면 된다.
7. 비밀번호를 알 수 있게 된다.
what that is nigga want?
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level15 (0) | 2018.04.24 |
---|---|
[FTZ] 해커스쿨 Level14 (0) | 2018.04.23 |
[FTZ] 해커스쿨 Level12 (0) | 2018.04.16 |
[FTZ] 해커스쿨 Level11 (0) | 2018.04.10 |
[FTZ]해커스쿨 Level10 (0) | 2018.04.08 |
글
[FTZ] 해커스쿨 Level11
[해커스쿨] Level11
1. level10에서 얻어낸 정보로 level11로 로그인을 한다. 로그인을 해서 hint를 보면 저런 소스가 보인다.
이 소스에서 보면 argv는 입력된 값이 입력되는 대로 들어간다. 하지만 변수 str는 256로 정의되어 있고,
strcpy함수를 통해서 str변수에 argv의 값을 넣는다. 그러면 256byte가 넘는 값을 넣으면 버퍼오버플로우가
발생이 된다는 게 예측이 된다.
2. /home/level11에서 attackme의 정보를 확인하면 권한이 level12에 있어서 권한을 얻으려면 다른 곳으로 프로그램을
복사해서 정보를 보는 게 좋다. 그래서 /home/level11/tmp 디렉토티로 attackme 프로그램을 복사한다.
3. attackme 파일을 디스어셈블링으로 파일을 열게 되면 이렇게 어셈블리 코드르 볼 수 있다. 3번째 줄에서
0x108이 있는데, 이 숫자는 16진수라서 10진수로 바꿔보면 264byte다. str변수는 256로 선언을 했는데 +8byte만큼
더 많다는 건 str 변수 크기 외의 다른 어떤게 공간이 더 생겼다는 말이 된다. 저 공간은 쓰레기 공간이라고 보자.
4. 위의 명령어를 입력하고, 확인을 하자. 그러면 입력했던 게 들어가 있는 게 확인이 된다. 이렇게 하는 이유는
버퍼상에 쉘코드를 올려서 쉘코드를 알아오는 방법은 프로그램은 실행될 때마다 메모리에 올라가는 주소지가
다르기 때문에 저렇게 쉘코드를 올려서 실행을 한다.
5. 버퍼를 알아오는 소스코드를 env.c 파일로 만들어서 env로 디버깅을 하자.
6. env 파일로 버퍼의 주소를 얻게 되고, /home/level11 디렉토리로 돌아가서 attackme 프로그램을 실행하자. 그리고
끝에 버퍼는 env 파일에서 알아온 걸로 넣으면 된다.
위의 메모리는 bffffeb5인데, 사용자들의 컴퓨터에서 나오는 것을 b5, fe, ff, bf로 해주면 된다. 왜 그렇냐면
인텔 계열의 메모리에서는 리틀 엔디안으로 값을 끝에서부터 거꾸로 읽기 때문에 저런 형식으로 넣어주어야 한다.
it is like this
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level13 (0) | 2018.04.17 |
---|---|
[FTZ] 해커스쿨 Level12 (0) | 2018.04.16 |
[FTZ]해커스쿨 Level10 (0) | 2018.04.08 |
[FTZ] 해커스쿨 level9 (0) | 2018.04.06 |
[FTZ] 해커스쿨 Level7 (0) | 2018.04.03 |
글
[FTZ]해커스쿨 Level10
1. level9에서 알아낸 걸로 접속을 하고, hint를 살펴본다.
hint를 보게 되면 두명의 사용자가 대화방을 이용하며 비밀스런 대화를 나누고 있다. 그 대화방은 공유
메모리를 이용하여 만들어졌으며, key_t의 값은 7540, 대화를 나눌 때 사용하는 변수명은 text라고 한다.
이를 이용해 두 사람의 대화를 도청하여 hall의 권한을 얻어라.
라는 힌트다.
일단 공유메모리를 먼저 살펴보자.
공유메모리란? 모든 프로세스(:12)는 자신의 업무를 수행하기 위해서 필요한 자료를 저장하기 위한 메모리 공간을 가지게 된다. 이러한 메모리공간에는 CPU에 의해 수행되는 명령어들, 프로그램 시작시 정의되고 초기화된 데이타, 프로그램 시작시 정의된다. 하지만 가끔은 여러개의 프로세스가 특정 메모리 공간을 동시에 접근해야할 필요성을 가질때가 있다.
출처 : https://www.joinc.co.kr/w/Site/system_programing/IPC/SharedMemory
2. 공유 메모리 명령어를 쉘 창에 입력해서 돌아가는 게 있는지 확인을 한다.
3. 위 코드를 입력하고 실행을 시켜보자. 그러면 암호를 알 수 있을 것이다.
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level12 (0) | 2018.04.16 |
---|---|
[FTZ] 해커스쿨 Level11 (0) | 2018.04.10 |
[FTZ] 해커스쿨 level9 (0) | 2018.04.06 |
[FTZ] 해커스쿨 Level7 (0) | 2018.04.03 |
[FTZ] 해커스쿨 level6 (0) | 2018.04.02 |
글
[FTZ] 해커스쿨 level9
1. level8에서 알아낸 비밀번호로 level9로 접속을 한다.
2. hint를 보니깐 이런 프로그램을 소스를 지닌 프로그램이 /usr/bin에 bof라는 프로그램이 존재한다.
프로그램 소스를 보면 char 변수타입으로 buf 배열과 buf2 배열이 있다.
buf는 40byte까지 입력을 받고, 입력을 받은 범위 안에서 buf2에 go란 문자가 들어가 있으면
아래의 문구를 출력하고, 아래의 함수가 호출이 된다.
setreuid()함수 설명 : https://nxmnpg.lemoda.net/ko/2/setreuid
3. /usr/bin 디렉토리로 들어가서 bof 파일을 확인을 한다. 여기서 설명을 하나 하자면 아까 전의 hint 부분에서
buf의 배열은 10byte만큼 크기를 지니지만 fets()함수는 40byte까지 값을 받아들인다. 그 말인 즉 buf를 초과해서 값을 입력받아
서 go가 buf2의 배열 안에 들어가면 된다는 소리다.
이런 식의 메모리에 공간을 차지하기 때문에 밑에 일일이 노가다를 한번 해보자.
4. 이러면 끝!
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level11 (0) | 2018.04.10 |
---|---|
[FTZ]해커스쿨 Level10 (0) | 2018.04.08 |
[FTZ] 해커스쿨 Level7 (0) | 2018.04.03 |
[FTZ] 해커스쿨 level6 (0) | 2018.04.02 |
[FTZ] 해커스쿨 Level5 (0) | 2018.03.30 |
글
[FTZ] 해커스쿨 Level7
[시스템해킹] 해커스쿨 Level7
1. level6에서 얻어낸 비밀번호로 level7에 접속을 한다.
2. hint를 실행시키면 여러가지의 힌트가 보여진다. 여러가지의 힌트가 있는데 패스워드는 가까운 곳에 존재하고, 상
상력을 총동원할 것. 2진수를 10진수로 바꿀 수 있는가? 계산기 설정을 공학용으로 바꾸어라가. 힌트다.
3. /bin/level7을 실행시켜보자. 패스워드를 입력하라는 메시지에 아무거나 입력을 해보자 틀렸다는 내용이 나오고,
이상한 표정이 뜬다. 표정이 뜨는데, 위에 패스워드는 가까운 곳에 있다고 하는데 왠지 밑에 있는 부분이 힌트인 것
같다. 가까운 곳에 있다는 데, 제일 밑에 있는 것 같다.
아까 힌트에서 2진수를 10진수로 바꾸라고 했는데, 표정이 2진수 인 것 같다.
[--_--_-] 1101101
[--____-] 1100001
[---_-__] 1110100
[--__-_-] 1100101
그러면 이제 계산기를 실행시켜서 공학용으로 바꾸고, 저 2진수를 입력하고, 10진수를 바꿔보자. 그리고
10진수로 바꾼 숫자가 있을 껀대 아스키 코드로 다시 바꿔보자. 그곳에서 힌트를 얻을 수 있다.
그리고 다시 /bin/level7을 실행시켜서 입력해보면 끝!
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ]해커스쿨 Level10 (0) | 2018.04.08 |
---|---|
[FTZ] 해커스쿨 level9 (0) | 2018.04.06 |
[FTZ] 해커스쿨 level6 (0) | 2018.04.02 |
[FTZ] 해커스쿨 Level5 (0) | 2018.03.30 |
[FTZ] 해커스쿨 Level4 (0) | 2018.03.28 |