CVE-2017-15048 Buffer-Overflow

2020. 5. 18. 03:131-DAY 분석

최근에 코로나로 인해 화상채팅수업이 뜨고있다. zoom은 화상채팅 서비스를 지원하는 프로그램으로 

현 상황에서는 그나마 코로나가 확산되는걸 막아주는 역할을 하기도 한다.

 

하지만 zoom회사는 보안적으로 문제가 너무 많아 다른 화상채팅 앱을 이용하는데 

과연 어떠한 취약점이 있었는지 파보고 싶어서 찾아보던 중 exploit-db에서 익숙한 이름의 친구를 발견했다.

 

바로 이 CVE였다 ^^~

##출저 Exploit-db.com ##

Stack을 기반으로한 버퍼 오버플로우!

Pwnable에 처음 입문할때 지겹도록 풀어보았던 BOF 문제가 눈에 들어왔다.

그래서 오늘은 너로 정했다! 라고 생각하며 분석을 시도해보았다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

영향을 받는 버전은 Linux용 줌 클라이언트이고 버전은 2.0.106600.0904(zoom_amd64.deb) 라고한다.. (버전이 참 길다)

 

그리고 애초에 Stack-Based Buffer Overflow 라고 적혀있어서 우리는 BOF라는것 부터 먼저 알아보고 가도록 하겠다.

 

BOF(Buffer-Overflow)란?

버퍼 크기를 넘치게 임의적으로 조작하여 발생하는 취약점이다.

입력한 문자열을 저장하기 위해 선언한 배열 (ex:char buf[1024])의 크기보다 더 길게 입력하게 된다면

다른 인접 메모리를 덮어쓰게되는 취약점이다.

 

BOF에 취약한 함수들로는 strcpy, gets, scanf, sprintf, vsprintf...등등 

공통적으로 처리하는 문자열의 범위를 설정해주지 않는다는 점이다!

즉 내가 입력할 입력값에 대한 길이를 확인하지 않는다는 것이다.

 

현재는 그에 대한 대응방안으로 입력값에 대한 검증 방안들이 많이 나온 상태이다

 

푸는 방법으로는 쉘코드를 EXPORT EGGSHELL  = /x12/x5a...~이런식으로 환경변수를 정해주어 푸는 방법과

NOP Sled 형식이라해서 SetUID 권한을 가진 파일이 실행되는 중간에

NOP을 이용해 RET값을 변조해 관리자 권한을 획득하는 방법(환경변수를 정의하지 않고 입력해줌)

그리고 가장 기초적인 디버깅 했을때 bof가 일어나는 배열까지의 거리를 계산하고 

구한 거리에다가 RET값을 입력해주는 형식이 있다.

 

아래의 코드는 NOP Sled 형식이나 환경변수를 등록해주는 방법을 사용한 흔적은 딱히 보이지 않는다

그래서 배열까지의 거리를 계산하여 Retrun이후 실행할 코드의 주소를 입력하는 형식으로 exploit 을 진행해볼것이다.

 

그리고 아래 파일의 gdb는 peda gdb와 비슷한 gef gdb를 사용하고 있다. 

gef는 gdb기능을 확장하여 분석과 exploit을 쉽게 도와준다.

exploit-db 사이트에서 가져온 코드이다. 아주 익숙한 구문이 보인다...

gef>  r $(python -c 'print "A"*1048 + "BBBBBBBB"')  

"A"*1048 + "BBBBBBBB"라는 명령어 실행 결과를 입력 해준다는 소리이다!

메모리의 구조는 1040+8+4 가 될것인데 리턴주소 4byte를 빼준다면 1048개의 아무숫자를 넣어주고 그다음 

BBBBBBBB를 넣어주는 구조인것 같다.

 

그리고 gef>  x/5i $pc <- 이것은 5개의 명령어를 pc라는 함수에서 가져오겠다라는 뜻이다

 

gef>  x/s $rdi
    0x7fffffffd330: ""
    gef>  x/s $rsi
    0x7fffffffdc35: 'A' <repeats 1048 times>, "BBBBBBBB"

x/s $rdi 는 rdi(목적지) 레지스터에 있는 문자열을 출력해주는데 0x7fffffffd330: ""이 나왔다

 

x/s $rsi 는 rsi(근원지) 레지스터에 있는 문자열을 출력해주는데

0x7fffffffdc35: 'A' <repeats 1048 times>, "BBBBBBBB"가 나왔다.

gef>  i f  <<<<<이건 무슨 명령어인지 잘 모르겠다... 함수의 정보를 알려주려고 한것일까?

 

gef> ni <<<이건 아마도 nexti 라는 명령어로 예상이 되는데

ni는 라인 하나를 실행하되 함수 호출문은 건너 뛴다는 의미이다.

 

0x00000000004025ab in main () 은 ni를 실행하기 전 0x4025a6에 bp를 걸고

call   0x4010f0 <strcat@plt>에서 명령을 수행하고 와서 아래의 0x4025a6로 넘어간것이다.

 

그 결과 rip=0x4025a6 에서 0x4025ab로 바뀌었고

저장된 rip의 내용이 0x7ffff7216f45 에서 0x4242424242424242로 바뀌었다.

 

여기서 42는 B를 HX로 바꾼값이 들어가 있는것을 볼 수 있다.

 

##여기서부턴 추측###

B값을 넣는것처럼 실행하고 싶은 메모리의 주소를 넣는다면 ni 다음 주소의 저장된 주소가

내가 원하는 임의의 값으로 바꿀 수 있다는 생각이 들었다.

 

즉 !! 공격자는 이 코드를 실행함으로써 영향을 받는 응용프로그램들을 악용할 수 있다는 것이다.

---물론 실패하면 서비스가 거부되겠지만 ---

 

음... 내가 zoom launcher 2.0.106600.0904를 pef로 직접 분석해보았다면

더욱 명확한 해답을 얻을 수 있었을텐데 너무너무 아쉽다!

 

그리고 사실 BOF는 PWNABLE에 입문하면서 가장 처음 배운 내용이라 자신있엇는데

1-DAY로 분석하는데만 2일이 넘게 걸렸다.(그것도 확실하게 분석한것도 아닌거같다.)

 

아직 나는 너무나도 부족하다.

'1-DAY 분석' 카테고리의 다른 글

Exploit-db를 이용한 cve-2016-1960,cve-2017-5375 분석  (0) 2020.05.06
cve-2016-0189 exploit 시도..  (4) 2020.05.06