Hackerschool 8

FTZ Level의 비밀번호를 알고 싶다면?

​간혹 FTZ비밀번호가 필요할때가 있습니다. 그럴때 블로그를 뒤질 필요 없이 직접 구축한 FTZ에서 비밀번호를 알아내는 방법을 알려드리겠습니다. FTZ에는 자신의 비밀번호를 알아내기 위한 my-pass가 있습니다. 이 명령어는 /bin/에 위치하며 gdb로 분석하면 됩니다. [root@BOF /root]# gdb -q /bin/my-pass (gdb) set dis intel(gdb) disas mainDump of assembler code for function main:0x8048468 : push %ebp0x8048469 : mov %ebp,%esp0x804846b : sub %esp,80x804846e : call 0x80483a8 0x8048473 : mov DWORD PTR [%ebp-4],..

[*] level 3

다음 코드는 autodig의 소스이다. #include #include #include int main(int argc, char **argv){ char cmd[100]; if( argc!=2 ){ printf( "Auto Digger Version 0.9\n" ); printf( "Usage : %s host\n", argv[0] ); exit(0); } strcpy( cmd, "dig @" ); strcat( cmd, argv[1] ); strcat( cmd, " version.bind chaos txt"); system( cmd ); } 이를 이용하여 level4의 권한을 얻어라. more hints. - 동시에 여러 명령어를 사용하려면?- 문자열 형태로 명령어를 전달하려면?문제 소스를 분석해 보..

Hackerschool/FTZ 2015.01.29

[*] level 2

level1과 마찬가지로 처음 로그인을 하면 hint파일이 있습니다. 힌트 파일을 보면 [level2@BOF level2]$ lshint public_html tmp[level2@BOF level2]$ cat hint 텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데... [level2@BOF level2]$ 텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는군요. 일단 리눅스 편집기중 vi를 위주로 설명하겠습니다. vi를 사용중에 쉘에 명령을 실행시키거나 쉘로 잠시 나갈수가 있습니다. 결론만 말하면 vi에서 insert mode가 아닐때 ":!"를 입력하고 쉘 명령어를 입력하면 명령어가 쉘에서 실행이 됩니다. 또한 :sh을 입력하면 잠시 쉘로 나갑니다. 쉘로 나간 다음 escape커맨드나 exi..

Hackerschool/FTZ 2015.01.29

[*] Level1

로그인을 하고 들어가면 hint파일이 있습니다. hint파일을 읽어보면 [level1@BOF level1]$ lshint public_html tmp[level1@BOF level1]$ cat hint level2 권한에 setuid가 걸린 파일을 찾는다. [level1@BOF level1]$level2 권한에 setuid가 걸린 파일을 찾는다. 라네요. 자 그럼 제가 위에 강조해놓은걸 보세요. level2권한, setuid, 찾는다. 먼저 "찾는다"는 명령어가 있습니다. find[1]라는 리눅스 명령어입니다. (다른 카테고리에 올려놓겠습니다.) 그 외, level2권한, setuid는 find라는 명령어의 옵션으로 주면 됩니다. [level1@BOF level1]$ find / -user level2 ..

Hackerschool/FTZ 2015.01.29

[*] cobolt - small buffer + stdin

처음 소스를 보시면 gremlin과 상당히 유사함을 볼수 있습니다. 16바이트 배열선언 배열에 문자열을 받고 출력. 하지만 파라미터값을 strcpy로 배열에 저장했던 gremlin과는 달리 이 문제는 gets를 통해서 프로그램 실행중 직접 입력을 받습니다. 그럼 내부를 분석해 볼게요. - 스택에 16바이트의 공간을 할당하고 - eax에 배열의 시작주소를 복사하여 - gets함수로 입력을 받고 - 출력 네. gremlin과 매우! 비슷합니다. 게다가 gremlin때와 같은 환경이기 때문에 libc의 주소도 같습니다. payload를 짤 필요도 없게 되는군요. 그럼 여기서 고민해야 될건 어떻게 gets함수에 stdin을 넘겨주냐가 되겠군요. 사실 BOF원정대를 풀기 시작하신분은 이미 다 알고계신 내용이겠지만..

[*] gremlin - small buffer

처음 파일목록을 보면 gate와 마찬가지로 프로그램과 소스파일이 있습니다. 소스를 확인해 보면 먼저 힌트를 보면 - small buffer라는 군요. 소스를 확인해 보니 배열 buffer의 크기가 16바이트로 매우 작다는것을 확인할수 있습니다. 다음은 소스를 분석해 보겠습니다. - 먼저 16바이트의 배열 buffer를 선언합니다. - 다음은 gate와 마찬가지로 파라미터의 갯수를 확인하고 - strcpy를 실행시키고 - buffer를 출력합니다. 이번에는 배열의 크기가 작기 때문에 쉘코드를 이용한 단순 BOF공격이 아닌 다른 방법을 생각해 봐야겠습니다. 작은 버퍼의 크기에서도 충분히 할수 있을만한 공격을 생각하다보니 저는 RTL방법을 사용하도록 하겠습니다. 그럼 이제 공격 방법을 설계해보도록 하겠습니다...

[*] gate - simple BOF

처음 gate로 접속을 하면 gremlin이라는 프로그램과 그 소스파일이 있는것을 확인할수 있습니다. 소스를 확인해 보면, 먼저 힌트를 분석해 볼게요.- simple BOF간단한 BOF공격을 하면 되나봅니다. 소스를 분석해 볼게요. - buffer라는 256바이트의 배열을 선언을 한다음 - 파라미터의 갯수가 1개이면 프로그램을 종료 - 2개 이상일시 2번째 파라미터를 buffer에 저장 - buffer를 출력 여기서 BOF공격을 시도하기 위해선 strcpy함수의 취약점을 공격하면 될거같습니다. * strcpy의 취약점 - 이 함수는 문자열의 길이를 제한하지 않아 입력받는 모든 문자열을 변수에 저장하게 됩니다. - 이는 선언된 변수의 크기보다 큰 문자열이 입력될 경우 Overflow현상을 일으키게 됩니다...