메뉴 건너뛰기

Hello :0

https://pierrekim.github.io/blog/2015-07-01-poc-with-RCE-against-127-iptime-router-models.html

해당 취약점은 iptime 9.58 이하의 거의 모든 장비에서 발생하는 것으로 확인되고 있으며, 아무런 권한 없이 쉘 명령어를 입력 할 수 있다.

사용자가 DDNS를 사용하고 있는 경우 WAN 상에서도 바로 명령어 실행이 가능
 

1. POC 코드

- 위 Html코드를 이용해서 Post로 데이터를 전송하여 쉘 명령어를 실행 할 수 있다.

- 공유기에 따라서 cgi-bin 부분이 sess-bin 으로 바뀔 수도 있다.

 

- 해당 스크립트를 실행시키면 현재 실행된 프로세스 목록을 확인 할 수 있다.

 

2. 취약점 확인

취약점은 펌웨어의 sbin 디렉터리에 존재하는 httpd에 존재한다. 일반적인 cgi 프로그램과 마찬가지로 공유기에서도 ScriptAlias를 이용하여 특정 디렉토리를 CGI 프로그램용으로 둔다.

- 여기에서는 bin 디렉터리를 /sess-bin/ 으로alias를 하는 것을 확인 할 수 있다.

 

- bin 디렉터리에는 단순 cgi 파일 뿐만 아니라 busybox파일과 그외의 시스템 명령어 바이너리가 존재 한다.

 

- ida를 이용해 httpd 파일을 뜯어 192.168.0.1을 url에 입력했을때 실행되는 부분을 찾아 보았다.

- trasnlate_uri 함수에서 /sess-bin/login_session.cgi 인지를 비교 한 후 패스워드가 존재 하면 auth_authorize로 넘어 가고 패스워드가 없는 경우 다른 경로로 이동하게 된다.

 

- init_cgi는 해당 취약점에서 중요한 부분인데 여기서 입력 cgi 환경 변수와 url 요청들과같은 것을 처리 한다.

 

-init_cgi 안에는 complete_env 함수가 존재하고 내부에서는 함수 내부에서 환경 변수를 저장한다.

 

- 문제가 되는 부분은 REQUEST_URI 부분으로 이부분은 우리가 요청한 sh로 저장이된다.

- 같은 cgi 디렉터리에 있기 때문에 sh도 일종의 url처럼 환경변수에 저장이 되고 나중에 이것이 시스템 명령어에 의해 실행이 된다.

 

취약점을 확인 하다보니, iptime에서 사용하는 httpd는 http://www.boa.org/ 제공하는 웹서버의 소스코드와 유사하였다.

 

- 위사진은 boa 웹서버의 소스코드 일부이며 execve(req->pathname, aargv, req->cgi_env);에서 req->pathname이 poc 코드에 있던 sh 명령어이다.

이것이 execv에 의해 post된 데이터와 환경변수에 의해 실행이되고 결과 값으로 쉘 명령어가 브라우저 상에 출력된다.

해당 취약점이 발견된 후 펌웨어 9.62에서는 cgi 디렉터리와 bin을 분리시켜 시스템 명령러가 실행되는것을 일단은 막아 두었다.