유무선공유기 해킹

wisdom·2021년 5월 6일
2

적고 보니 두서 없이, 자세하지 않게 정리가 된 것 같다. 요즘은 일도 바쁘고 이것저것 벌여 놓은 일이 많아서 정돈된 글을 적기가 참 힘들다. 추후 여유가 생기면 해당 포스팅을 다시 다듬어야겠다.

취약점 탐지 전략

어택 벡터

  • 부팅 과정 중 개발자의 실수
  • 입력 받는 대상 파악
    • 입력을 가할 수 있는 부분이 취약점을 얻어낼 수 있는 부분
    • 대표적으로 웹페이지 쪽
  • 논리적 취약점
    • 부팅 시퀀스에서 실수한 부분
    • 플래그 값을 가지고 서로 다른 액션을 하는데, 플래그가 쉽게 바뀔 수 있는 경우
  • 버퍼 오버플로우, 포맷 스트링 등..

디버깅

  • 취약점을 찾아서 분석 + 쉘코드 작성을 해서 공략을 하려고 해도, 한 번에 되기 쉽지 않다.
  • 디버깅을 해야 공격코드의 문제점 등을 파악할 수 있다.
  • 익스플로잇 코드를 만들기 전에도 디버깅을 통해서 취약점을 찾거나, 공격 설계를 하거나 할 수 있다.

부팅과정 분석

  • 보통은 /etc/init.d/rcS 스크립트가 실행된다.

프로세스 목록

  • 프로세스 목록을 확인하면 공격 벡터로 삼을만한 부분을 예측할 수 있다.
  • upnp, httpd, /sbin/dhcpd ...

Boa Web Server

  • /var/boa_vh.conf
  • 웹서버 종류에 따라서 이미 웹서버에 알려진 취약점이 있을 수 있다.
  • 특정 임베디드용 웹서버가 올라가 있다? → 버전 확인 → 알려진 취약점 탐색
  • 알려진 취약점을 공격해서 익스플로잇
  • 개발용 cgi 등은 백도어로 쓰일 수 있다.

/home/httpd

  • index.html
  • login/login.cgi 등을 호출
  • boa 웹서버 설정 내용을 보면 Alias가 존재하기도 한다.

CGI

  • IPTIME은 필요한 내용들만 구현해서 쓴다고 한다.

CGI는 실행 파일

  • CGIC로 만든 애플리케이션이라고 생각하면 된다!
  • 요즘은 CGI 개발을 잘 안 하고, Python이나 Go 등 사용하기 쉽고 개발 생태계가 활성화 되어있는 것들을 사용한다.
  • 스크립트도 가끔 쓰인다.

정적 분석

  • CGI를 가지고 취약점 탐색
  • 입력 받는 부분, 장비 내에서 실행되는 바이너리 등
  • strcpy, sprintf, system, strcat, execl, getenv
  • 바운더리 체크를 하지 않고 버퍼를 복사하는 경우
  • 환경변수에 긴 문자열을 넣어서 쓸 수도 있다.

동적 분석

  • 실제로 CGI를 실행하면서 어떤 함수들이 호출되는지를 쉽게 파악할 수 있는 도구들을 이용
    • ltrace : 라이브러리 호출 보여줌
    • strace : 시스템 호출 보여줌
    • gdb : 디버깅
  • 에뮬레이터, 백도어, UART 등을 이용해서 쉘을 활용하며 동적으로 분석
  • 동적 분석을 하기 위해서는 바이너리를 빌드해서 올려야 하는 경우가 대부분
    • 판매용 제품에 디버깅 툴을 넣어 놓지는 않기 때문
    • 이유 : 필요 없어서, 디버깅 툴은 사이즈를 많이 잡아먹기 때문

ARM 기반 디버깅

필요한 도구 : gdb, strace, ltrace

  • static으로 빌드한 경우 바로 실행을 할 수 있다.
  • qemu 이미지로 만들어서 돌려볼 수 있긴 한데 실제로 이렇게까지 할 필요는 없다.
  • 예전에는 실행을 하려면 별도의 패키지를 설치해야 했는데, 요즘은 바로 실행 가능하다.

strace 컴파일

  • 디버깅 툴이 기본적으로 안 올라가 있다.
  • 장비에서 동적으로 분석을 하기 위해서는 컴파일을 하거나, 컴파일 된 것을 구해야 한다.
  • 인터넷을 뒤져보면 누가 static으로 빌드해서 올려놓은 것들이 종종 있다. 그걸 이용하거나 직접 빌드를 해야 한다.

프로세스 실행 모니터링

strace -i -f -p PID -e trace=execve
  • 시스템 콜 호출 확인

gdb & gdbserver 컴파일

임베디드 쪽을 한다고 하면 꼭 필요한 지식

  • strace, ltrace는 없어도 되지만 gdb 없이는 동적으로 분석할 수 없다.
  • gdbserver를 보통 타겟에다가 넣고, gdb는 크로스 컴파일을 한다.
  • gdbserver를 쓰면 네트워크나 시리얼 포트를 이용해서 데스크탑 gdb와 연결을 해야 한다.

gdbserver를 왜 쓰느냐?

  • gdb를 빌드해서 올리기 어려운 환경일 수도 있다.
  • gdb 자체가 사이즈가 꽤 크다.
  • 아니면 gdb를 타겟용으로 빌드하는데 문제가 생길 수도 있다.
  • 즉, 제품을 개발할 수 있는 환경을 그대로 구성하지 못하면 디버깅 하기 매우 어렵다.

ltrace 컴파일

  • 컴파일시 에러가 매우 많이 나온다. buildroot를 이용하는 것을 권장
  • buildroot를 이용하면 ltrace, strace 다 쉽게 얻을 수 있다.

Buildroot & Yocto

yocto : 요즘 많이 쓰는 임베디드쪽 빌드 시스템

  • 이미 세팅이 되어 있는 내용들이 있음 like Makefile
    • Makefile은 일종의 스크립트 처럼 빌드 절차를 나열해 놓고, 미리 정의된 내용이 실행되어 결과물을 쉽게 얻을 수 있는 아주 기본적인 빌드 시스템이다.
    • yocto도 비슷하다.
  • yocto에서의 Makefile 같은 것을 레시피라고 한다.
  • 레시피에 나와 있는 것을 그대로 쓰면 똑같은 결과물이 나온다.
  • yocto에서 빌드를 하면 부트로더, 커널, 파일시스템 등을 정해진 설정대로 쉽게 만들 수 있다.

장점 : 어떤 환경에서든 똑같은 결과물을 낼 수 있다!

  • yocto가 나오기 전에 썼던 빌드 시스템이 Buildroot이다.
  • 여기서도 부트로더, 커널, 루트파일시스템을 다 빌드할 수 있다.
  • yocto는 방대한 시스템을 전체적으로 다 빌드해주는 대신, 설정을 임의로 할 수 있는 부분이 별로 없다.
  • 반면 buildroot는 거대한 시스템 보다는 작은 시스템에 맞춰진 툴이다.
  • 특정 타겟에 고정되어 있다기 보다는 유도리 있게 설정할 수 있게끔 기능을 제공한다.
  • 지금도 간단한 시스템에는 많이 쓰인다고 한다.

외부 파일 다운로드

어떤 툴들이 존재하는지 확인을 해야 함

  • wget, nc, scp, ftp, rz
  • /sbin/http
/sbin/http get http://IP/gdb > gdb
  • http 프로토콜을 사용해서 웹페이지나 파일을 다운로드 받을 수 있다.
  • 네트워크가 안 되더라도 시리얼 프로토콜로 연결할 수 있다.

임베디드 기기의 용량 문제

  • 램 파일시스템(RAMFS)을 사용해서 파일을 다운로드 받아서 실행할 수 있다.
  • 이것 조차도 얼마 안 남아있을 수도..
  • 최소 16MB~32MB 정도?

발견된 취약점

  • 원격 관리용 백도어
  • netdetect.cgi의 원격 bof 취약점
  • 그 외
    • smtp command injection
    • httpd
    • apcpd
  • 시간 지나면 금방 패치된다.

원격 관리용 백도어

관련 슬라이드는 해커스쿨 Home Router Hacking 자료를 참고

  • 2007년도에 이슈가 되었다.
  • 내부 명령 실행, 파일 열람 모두 가능
  • 디버깅과 개발 시 편의성을 위해 만들어진 페이지
  • 패스워드(Key) - 리버싱을 통해 알아낼 수 있다.
  • strings로 봤을 때 안 나오게 하려고 쪼개 놓은 경우도 있지만 리버싱 하면 다 나온다.
  • 커맨드를 입력하면 system으로 실행되게끔 해준다.
  • /etc/iconfig.cfg
  • remote_support=1로 활성화
  • cgi 호출하면서 리버싱으로 알아낸 키 값을 넣어주면 커맨드가 실행된다.

Remote Buffer Overflow

관련 슬라이드는 해커스쿨 Home Router Hacking 자료를 참고

  • 코딩을 잘못 해서 발생한 취약점
  • Timepro.cgi == Netdetect.cgi 심볼릭
    • Netdetecgt.cgi로 접근을 하면 관리자 암호 없이도 접속이 가능
  • 관리자 권한을 체크하지 않기 때문에 굉장히 크리티컬한 취약점이다.

URL 파라미터 처리부

  • 인자를 넘겨줄 때, 환경변수를 가져올 때 strcpy를 사용해서 복사한다.

  • 위와 같이 인자를 길게 넘겨주고strace로 보면 SIGSEGV가 발생해 있을 것이다.
  • 이런 식으로 실행 흐름의 중요한 역할을 하는 메모리 영역을 덮어 쓴다.

  • 입력한 commit 값이 복사가 되면서 버퍼도 다 차고, 스택 영역의 레지스터 값들도 overwrite 된다.

쉘코드

  • 쉘코드를 아무데나 올릴 수는 없다.
  • 보안 시스템 체크
    • ASLR : 메모리 주소 값 랜덤화
    • DEP : 스택 힙 실행 권한 제거
  • 스택 덤프
    • ASLR, DEP가 둘 다 없는 경우 스택에 쉘코드 주입
    • cgi 실행시 스택 덤프를 해보면, 스택에 어떤 데이터가 저장되는지 확인할 수 있다.
    • User-Agent 값이 존재 → 여기에 값을 넣자
  • 최종 대상 선정
    • User-Agent

  • User-Agent 변수에 쉘코드를 넣음

Ref

profile
블로그 이전 -> wisdom-lee.xyz

0개의 댓글