티스토리 뷰

IPTIME 펌웨어 분석, 쉘 접근 및 telnet 접속 (버전 9.72 까지)

구버전 이후부터 9.72버전까지 이 방법으로 쉘에 접근 가능합니다.
이후 상위 버전부터는 IPTIME 측에서 해당 기능을 제거했습니다.
(시스템 관리 - 펌웨어 업그레이드 - 수동으로 다운그레이드 가능)

이 글에서 소개하는 방법은 IPTIME측에서 원격 A/S 및 디버깅을 위해 기기에 숨겨둔 기능으로,
관리 페이지에 비밀번호가 걸려있고, 시스템 관리 - 기타 - 원격 지원 기능이 꺼져 있으면 작동하지 않으며,
펌웨어의 취약점은 아닙니다.

프로그램(python 코드) : http://jochiwon.tistory.com/6

1. IPTIME 펌웨어 내려받기


ARM 프로세서를 사용하는 공유기 중 원격 지원 기능을 사용 가능한 가장 마지막 펌웨어를 내려받자.
(굳이 ARM 을 이용하는 이유는 IDA 의 Pseudocode기능을 이용해서 좀 더 빠른 바이너리 분석을 하기 위함이다.)

2. 펌웨어 파일 추출 및 파일 확인



binwalk 로 펌웨어 파일을 각 구역별로 떼어내고,

sasquatch 로 주요 시스템 파일이 담긴 Squashfs 파일시스템을 추출한다.

(unsqashfs 를 이용하게 되면 종종 superblock 오류로 추출이 원활하게 되지 않는다.)





파일 시스템의 최상단은 리눅스와 흠사한 구조를 이루고 있다.



공유기 설정 페이지는 HTTP를 통해서 서비스되는데, 공유기에서는 일반적인 웹 서비스를 위한 php와 같은 언어를 사용하지 않고,

미리 컴파일되어 있는 cgi 파일을 HTTP 서비스 데몬을 통해 실행하게 된다.

Filesystem Flag 를 보면 알 수 있듯이, 모든 cgi파일에 x 권한이 포함되어있는것을 알 수 있다.


IPTIME 구버전 시절 웹 페이지로 디버깅 화면 접근이 가능했었고, 이번에도 그렇지 않을까 하는 추측으로, 이 cgi 파일들 중 어딘가에 디버깅 기능 내지 쉘 접속 기능이 숨겨져 있을 것이다.


그리고 하나 더, 파일들 중 절반 가량이 심볼릭 링크 되있으며, 분석해야할 파일은 그리 많지 않다.

먼저, 공유기 설정 메인 페이지 URL이 (http://192.168.0.1/cgi-bin/timepro.cgi?tmenu=main_frame&smenu=main) 이고 용량이 가장 큰 것으로 보아 핵심 파일이 timepro.cgi 라고 추측해 먼저 분석을 시작한다.


3. CGI 바이너리 파일 리버싱


IDA에서 timepro.cgi 바이너리 파일을 로드한다.



이전에는 내부 함수를 모두 strip하지 않고 그대로 펌웨어를 배포했었는데, 현재는 외부 호출 함수를 제외하고 내부 함수를 모두 strip해 놓았다.

결국 내부 함수의 이름이 없으므로, 다른 방법이 없다면 함수를 하나씩 살펴볼 수 밖에 없다.

옛날에 분석한 기억을 되살려, 디버그 페이지를 호출하는 함수를 찾아보자.


원격 지원 기능을 켜면 "remotesupport" 값이 공유기로 넘어가는데, GET 또는 POST방식인지, 인자의 이름이 무엇인지는 중요하지 않다.
바이너리 파일에서 이 값을 참조하는 함수를 찾는다.



0x019E3C 에서 remotesupport 값을 받았을 경우 실행되는 Pseudocode이다.
sub_11380함수를 보면


외부 함수로 "remote_support" 를 인자로 전달하고 있는데,

얼추 함수 이름으로 보아 설정값을 저장한다고 추측해볼 수 있다.

원격 지원 기능은 저 설정값이 true 일때 실행될 것이기 때문에, 해당 함수를 찾는다.


"remote_support" 값을 참조하는 함수를 찾는다.



외부 함수로 설정값을 불러오는 역할을 하는 것으로 추측되는 함수를 찾았고,

이 함수를 참조하는 3개의 함수 중 현재 원격 지원 설정값을 가져와 html에 렌더링해주는 함수2개를 제외한 나머지 함수 1개를 찾을 수 있다.


펌웨어 버전 (~ 9.12)


펌웨어 버전 (9.14 ~ 9.72)


GET방식 (query값) 의 "aaksldkfj" 이름의 값을 가져와 비교하는데, 리버싱 과정에서 문자열로 찾지 못하게 난독화 해 놓았다.

펌웨어 버전 (~ 9.12 까지) : #notenoughmineral^

펌웨어 버전 (9.14 ~ 9.72) : !@dnjsrurelqjrm*&    -> 한글로 하면 원격디버그

가 "aaksldkfj" 값으로 받는 인증키이다. (하나씩 비교하는 값은 ASCII 데이터)


하지만 timepro.cgi 로 접속하면 디버그 화면이 뜨지 않는데, 아직 접속 URL을 확인하지 않았다.

본 함수를 호출하는 곳을 참조하면,




v2 값이 어떤 데이터를 담고 있는지는 확인해보지 않았지만, 감으로 파일 이름이라고 치면,

호출된 파일 이름이 "/cgibin/d.cgi" 일 때 sub_103A0 (디버그 스크린 함수) 를 실행하고 있다.


글 위에서 /cgibin 디렉터리의 파일들을 찍어 두었는데,

d.cgi 파일이 timepro.cgi 파일로 심볼릭 링크가 되어 있기 때문에 이러한 구성이 가능한 것이다.



4. 원격 디버그 화면 확인


접속한다. 

크롬을 이용하는것이 좋다. URL에 특수문자가 들어갈 때 IE는 수동으로 url 인코딩을 해주어야 한다.

자신의 공유기 펌웨어에 맞추어 키를 입력하자. 펌웨어 버전은 메인 화면에 있다.


http://MY_IPTIME_ADDR/cgi-bin/d.cgi?aaksldkfj=#notenoughmineral^

http://MY_IPTIME_ADDR/cgi-bin/d.cgi?aaksldkfj=!@dnjsrurelqjrm*&


만약 공유기 보안 설정을 세션으로 설정한 경우,

http://MY_IPTIME_ADDR/sess-bin/d.cgi?aaksldkfj=#notenoughmineral^

http://MY_IPTIME_ADDR/sess-bin/d.cgi?aaksldkfj=!@dnjsrurelqjrm*&



읽고 싶은 파일이 있으면 File Name 칸에 입력.

실행하고 싶은 명령줄이 있으면 Command Name 칸에 입력.

3번째 칸에 인증키를 다시 한번 입력한다. (html 뜯어보면 알 수 있다.)

Show 를 누르면


IPTIME 에서 숨겨놓은 기능을 이용해 쉘에 접근할 수 있다.



5. Telnet 접속


펌웨어 안에 내장된 telnet 데몬을 실행한다. 기기 또는 펌웨어 버전마다 서버 파일이 들어있지 않는 경우도 종종 있다.

또한 9,72부터 이하의 몇몇 버전은 telnetd 데몬 파일이 내장되어 있어도 공정 테스트 모드가 아니면 실행이 불가능하게 되어 있다.


(최신 버전에서 추가된 코드 - 공정 테스트 모드가 아니면 아무 출력 없이 바로 종료된다.)


먼저 방화벽을 해제해 준다. 

/sbin/iptables -A INPUT -p tcp --dport 23 -j ACCEPT


다음은 telnetd 데몬을 실행한다.

현재까지 확인된 경로는 아래와 같다. (펌웨어 버전, 기기마다 각각 telnetd 파일의 경로가 다름)


/bin/telnetd -i MY_IPTIME_ADDR -l /bin/sh

/bin/utelnetd -i MY_IPTIME_ADDR -l /bin/sh


/usr/bin/telnetd -i MY_IPTIME_ADDR -l /bin/sh

/usr/bin/utelnetd -i MY_IPTIME_ADDR -l /bin/sh


/sbin/telnetd -i MY_IPTIME_ADDR -l /bin/sh

/sbin/utelnetd -i MY_IPTIME_ADDR -l /bin/sh

/sbin/at -i br0 -l /bin/sh


성공적으로 실행되었는데도(ps로 확인) 접근이 되지 않는다면 iptables 가 /sbin 에 없는 것이다.

iptables 가 위치한 곳을 찾아 방화벽을 다시 설정해 주어야 한다. 위에 언급한 경로 중 하나에 있다.


접속되면 아이디는 root, 비밀번호는 없다. 이건 옛날 초기버전때 만들었던 프로그램.







댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함