2010년 7월 27일 화요일

안드로이드(Android)폰에서 tcpdump 를 이용한 패킷덤프!

이전에 몇번 안드로이드 패킷과 관련한 글을 포스팅 하였다. 오늘은, 그간 직접 패킷덤프를 하지 못한 아쉬움이 있었는데, 직접 패킷 덤프를 한 사례를 소개한다. 패킷덤프 프로그램은 *NIX 환경에서 많이 사용하는
tcpdump 이다. 바로 이 tcpdump 를 안드로이드에서 동작시켜 보는 것이다.

와이어샤크 같은 GUI 환경은 아니지만, 그래도 충분하다. 동작시키기 위해서는 다음 2가지 요건이
갖춰져야 한다.

- 루트 권한
권한이 없는 상태에서 실행하면
You don't have permission to capture on that device 메시지를
- 안드로이드 환경에서 동작 가능한 tcpdump
다음 URL 에서 다운로드:
또는 첨부파일 다운




위 환경이 준비되었다면, 간단하다. tcpdump 파일을 휴대폰에 넣어주고 루트권한으로 실행만 해주면 된다.
필자가 사용하는 안드로이드 스마트폰은 국내에 처음으로 소개된 모토로이이다. 그간 루트권한을 얻을 수 있는 방법이 없어, 사용하지 못했는데. 이제야 가능해 졌다. 자 실행전에 'netcfg' 를 사용해 인터페이스 현황을 살펴보자.

usb0 는 휴대폰과 컴퓨터간 연결되어 할당된 주소이고, rmnet0 라고 하는 부분이 3G 사용할때 할당되는 인터페이스 이다. 10.163.36.86 IP 가 할당되어 있고, 서브넷은 255.0.0.0 이다. 자, 10.x.x.x/8 주소는 인터넷에서 라우팅되지 않는 Private Address 이다. 그러면 추측이 가능하다. rmnet0 에 할당되는 것이 Private 주소 이므로, 결국 통신이 될때는 NAT 를 거쳐서 통신이 될 것이다. 다음 프로그램은 Network Info II 라는 프로그램을 실행한 것인데, External IP 로 공인 IP 주소가 보인다. 실제 외부와의 통신은 이 IP 를 가지고 하게 되는 것이다.
네트워크 구성을 잠깐 살펴보았고, 이제 tcpdump 를 실행해 보자. 실행 해보니 *NIX 환경에서 실행되는 것과 같다. 그렇다면 원하는 대로 자유롭게 사용가능하다는 점!.









자 그럼 tcpdump 를 실행해 보면 아래 그림과 같이 통신 내용을 볼 수가 있다. 내부 IP 주소인 10.163.36.86 이 보인다. 그리고 외부 IP 주소도 보인다.

왠지 새로운 세상이 열리는 것 같다. 앞으로 해 볼수 있는 것이 많을것 같기 때문이다. 앞으로 차차 다뤄보기로 하고 마지막 이미지는 -c 카운터 옵션을 주고 20개의 패킷만 덤프하여 -w 옵션으로 /sdcard/moto.pcap 으로 저장하라는 것이다. 사실 계속 보여지는 덤프 화면을 볼 수는 없고, 저장하여 살펴보는 것이 가장 적절한 방법이다. 화면도 작고, 명령어 하나 타이핑 치는게 불편하다.
그래도 이동중에도 어디서든 패킷 분석을 할 수 있으니 이것은 장점이다. 3G 뿐만 아니라 WiFi 도 당연히 가능하다. 이것으로 할 수 있는 것은 여러분의 상상으로 맡긴다. 언제나 휴대하고 가지고 다닐 수 있는 ' 작은 패킷 분석기'를 몸에 하나 지니고 다닌다 라고 생각하면 된다.

참고로 캡쳐된 패킷파일은 이전에 소개한 클라우드 기반 형태의 웹 패킷 분석기를 이용하면 그래픽 환경으로
조금은 더 낳은 분석 환경을 제공할지도 모른다.

앞으로 저와 함께 모바일 패킷 세계로 GoGo 해요~
단, 악의적인 사용은 안됩니다.

P.S Capture Size 가 제한되므로 -s 옵션을 통해 덤프할 패킷의 길이를 지정해주세요. -s 1514 와 같이.

댓글 41개:

  1. 휴대폰만 있으면 못하는게 없군요.

    패킷덤프도 쉽게하구.

    좋은정보 감사합니다

    답글삭제
  2. @나그네 - 2010/07/29 19:36
    이제는 스마트폰 하나만 있으면 안되는게 없을정도로 빠르게 변화하고 있네요. 과연 이것이 좋은 용도로 사용될 수 있을지, 아니면 의도하지 않게 다르게 이용될지는 앞으로 지켜보죠 ^^

    답글삭제
  3. 비밀 댓글 입니다.

    답글삭제
  4. ./tcpdummp: permission dined => 이 오류에 대해서 아시나요?^^

    루팅도 했고 파일 권한도 변경했는데용..

    답글삭제
  5. @Anonymous - 2010/09/03 11:45
    네, 단말기에서 직접 실행한 것입니다. 링크걸린 tcpdump 를 복사해 넣으시고 실행하시면 됩니다. Permission dined 메시지도 나오지 않을 것입니다. su 로해서 루트권한을 얻으신 다음에 실행하셨나요? 일반 리눅스에서 사용하시는 것 같이 사용하실 수 있는 것이라 실행에 큰 문제는 없습니다.

    답글삭제
  6. 지금 하신 안드로이드상에서 패킷덤프 과정과 자료들을 어디가면 더 볼수 있을까요? 좀더 상세히 알고 싶습니다.

    답글삭제
  7. 비밀 댓글 입니다.

    답글삭제
  8. @굴희 - 2010/09/03 13:46
    오랜만에 들렀다가 이전에 드렸던 질문에 대해 답변달구가용~ ㅋㅋ tcpdump가 xbin이나 bin 디렉토리 밑에 (실행권한이 있는 디렉토리) 있어야지 실행이 되더라고요 :)

    답글삭제
  9. @굴희 - 2010/09/03 13:46
    추가 정보 감사합니다 :-)

    답글삭제
  10. 혹시 프로미스큐어스 모드변경도 가능한가요?

    답글삭제
  11. 세부적으로 찾아보진 않았지만,루팅 상태에서 덤프한다면 promiscuous 모드로 기본 동작 아닐까요? 물론, 단말기 인터페이스마다 다를 수는 있지만, 굳이 막아 놓지 않는다면 말이죠.
    일단,잠깐 확인해 보았습니다. /sys/devices/virtual/net/tiwlan0 에서 flags 를 보면 0x1003 인데, 이 값은 off 상태입니다. 그러나 tcpdump 로 인터페이스 덤프를 시작하면, 이 flags 값은 0x1103 으로 변경됩니다. 1103은 On 상태를 뜻합니다.

    코드에서 PROMISC 는 0x100 으로 정의되어 있죠.

    #define IFF_PROMISC 0x100 /* receive all packets

    도움이 되셨길 바래요 ^^

    답글삭제
  12. 분명 su했는데도 퍼미션 디나인? 됬다고 나오는거
    sbin에다 넣으니까 너무잘됨;;
    이유를 모르겠음..;;;;
    그리고 그거 다른 폴더에 있을때 group이랑 other 은 실행 둘다되는데
    소유자만 rwx 다 안됨 오류뜸,.

    답글삭제
  13. 저도 permission denied 오류가 나왔는데요
    다들 sbin으로 옮기셨다고 하는데

    어떻게 옮겨야 하나요?;;
    mv 명령어를 사용했더니 cross device link 라고 나오더군요.
    따로 tcpdump를 내장메모리에 넣을 순 없는건가요? ㅠ

    답글삭제
  14. mount 로 확인해 보셨을때, sbin 이 있는 폴더쪽이 write 가 가능한 상태인가요? 사용하시는 단말기 형태에 따라서 환경이 다르다 보니 확인이 필요할거 같습니다. /system 폴더가 read only 되어 있는 경우는 옮길 수가 없습니다. 아래와 같은 형태로 /system 을 rw 할 수 있도록 재마운트 하여야 합니다.

    # mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system

    그리고서 cp 로 복사해서 넣어보시기 바랍니다.

    답글삭제
    답글
    1. mount를 쳐보시면 /system의 마운트 자체가 ro로 되있네요. ls -l로 확인해도 쓰는게 허용된 것처럼 나오는데 말이죠.

      갤3 LTE기준으로는;

      #mount -o rw,remount -t yaffs2 /dev/block/mmcblockop9 /system
      하시고 cp /sdcard/tcpdump /system/xbin 하니까 됩니다. 물론 파일속성도 바꾸셔야 겠지요.

      좋은 정보 리겔님에게 감사드립니다.

      삭제
    2. 저도 감사드립니다. ^^

      삭제
  15. tcpdump가 실행은 되는대 저장이 안되요...
    왜그러는건지 ㅜㅜ

    답글삭제
    답글
    1. -w 옵션을 통해 지정한 곳이 저장이 가능한 곳인가요? 실행은 되었는데 저장이 안된다면 저장되는 위치에 Write 권한이 있는지 확인해 보세요.
      # mount 로 확인하면 마운트 된 위치의 권한을 확인할 수 있습니다. 일반적으로 SD 카드쪽으로 위치를 지정해 저장하시면 큰 문제는 없을것으로 보입니다 :-)

      삭제
  16. 안녕하세요 글 너무 잘읽었습니다.
    커널 init에 tcpdump 를 등록해서 커널이 부팅되자마자 자동으로 패킷을 덤프 뜨도록 할수도 있을까요?

    답글삭제
    답글
    1. 안녕하세요, 답변이 늦었습니다.
      개인적인 생각으로는 init.rc 에 등록해서 가능할것 같습니다. 서비스로 등록하든 어떻게 하면.. 그런데 일부 단말기에서는 부팅하면 init.rc 같은걸 다시 원래대로 복구하기도 합니다. 이런 부분은 단말기와 기타환경에 따라 달라질거 같은데요, 제가 여유가 되면 제 단말기로 한번 테스트 해보고 공유해 드리겠습니다.

      삭제
    2. init.rc 에 등록해 tcpdump 뜨는거 얼른해주세효
      현기증난단 말이에요 ㅋㅋ

      삭제
    3. 안녕하세요, 현기증이 많이 나고 계시군요 :-)

      그때 올려주신이후 가지고 있는 테스트 폰에서 간단히 테스트 해보았는데 제가 가진 것이 부팅되면서 다시 init.rc 스크립트 같은걸 복원을 시킵니다. 단말기에서 루트 파일 수정 방지를 위해 자동으로 원래 복원을 시켜서 이것까지 고치려면 이미지 파일을 수정해야 하고 좀더 복잡해 질것 같습니다. 시간이 없어서 거기까지는 해 보지 못했네요 ㅜ.ㅜ 일단 그렇게 하면 될거 같습니다. init 스크립트에 다음과 같은 형태로 서비스로 등록시켜서 실행을 시킵니다. 다만 이 init 스크립트가 restore 되지 않게만 하면 됩니다.

      # Enable tcpdump-service
      service netdump-service /system/xbin/tcpdump -i any -C 5 -p -s 0 -w /sdcard/netdump.cap
      disabled

      테스트 해 보시고자 하는 단말기와 롬을 확인해 보신 후 그에 맞게 수정을 하면 될거 같습니다. 일단 다음 URL 을 참고해 보세요.

      http://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc
      http://www.androidenea.com/2009/08/init-process-and-initrc.html

      삭제
    4. 답변감사합니다~
      시간 내주셔서 해주시다니.. 블로그 자주 애용할께요! ㅎㅎ
      항상 좋은정보 감사합니다!

      삭제
    5. 안녕하세요 운영자님 ^^
      빠른답변 감사드립니다.. 이렇게 빨리달아주실줄 몰랐는데
      정말 감사드립니다 ㅎㅎ
      에러나는 부분에 대해선 운영자님의 말씀이 맞는거 같습니다.
      wireshark 앱을 이용해서 잡았을때는 rmnet_usb0 이 잘 잡혔거든요 ㅠㅠ

      그렇다면 네트워크 인터페이스 명을 바꿀수 있다면
      그것이 가장 빠른방법이 될꺼 같은데 ㅎㅎ 예를들면 rmnet_usb0을 rmnet0 이라던지 usb 라는 부분만 없애면 될듯한데..
      그게 가능할까요? ㅠㅠ
      안드로이드 뿐만이 아니라 리눅스에서도 네트워크 인터페이스명을 바꿔본적이없어서.. 상당히 곤란하네요.. 구글링을 몇시간째 하고있는데.. 제가 부족해서인가.. 자료도 안보이구요 ㅠㅠ
      도와주세요~ 운영자님 ㅠㅠ

      삭제
    6. 안녕하세요 운영자님 제가 방금 해결해서 자문자답 하겠습니다.
      일단 운영자님 조언대로 pcap 라이브러리에서 네트워크 인터페이스를 usb bus 이름으로 인식해서
      에러가 발생한것이 맞는거 같구요
      그래서 저는 인터페이스명을 rmnet_usb0 이 아닌 rmnet0 으로 바꾸고 tcpdump -i rmnet0 을 하니 잘잡히네요 ㅎㅎ

      인터페이스 명은

      ip link set [oldname] name [newname]

      명령어를 이용해서 바꿨습니다~
      운영자님 조언아니였으면 하루종일 삽질만 했겠는데요~
      앞으로도 블로그 자주 들리겠습니다!
      좋은 정보 감사드립니다 ㅎㅎ

      삭제
    7. 와~ 축하드립니다.

      결국은 성공하셨군요 ^^
      다른 분들도 참고하세요.

      삭제
  17. 안녕하세요 운영자님 블로그정말 잘보고 있습니다~ 알차고 좋은정보가 너무 많네요 ㅎㅎ 제가 galaxy s4 lgU+ 단말기에 알려주신 방법으로 tcpdump 를 이용해서 패킷을 덤프해 보려고 하는데.. rmnet_usb0(얘가 10.xxx.xxx.xx)정규아이피 인것 같습니다.
    tcpdump -i rmnet_usb0 명령어를 줘서 떠볼려고 하는데..
    tcpdump can't get usb bus index from 라는 에러 메시지가 나오네요..
    어떡해야될까요..

    답글삭제
    답글
    1. 안녕하세요,

      일단 제가 갤럭시 s4 를 가지고 있지 않아서 정확히 판단하기가 힘드네요. netcfg 로 확인한 인터페이스가 rmnet_usb0 이라는 것이죠? pcap 라이브러리에서 네트워크 인터페이스를 usb bus 이름으로 인식하여서 발생하는 것으로 판단됩니다. 인터페이스 이름이 rmnet0 과 같이 되어 있었다면 아마 문제가 없었을것 같은데요. 이 부분은 저도 찾아봐야 할거 같습니다.

      삭제
  18. 갤3 이용자인데요, xbin으로 옮기려고 #mount ~~~ 했는데
    cp 명령어가 없대요??? 이거 어떻게 해야나요 ㅠㅠ

    답글삭제
  19. 검색해봤더니 cp 안되면 cat ~ > ~ 하라고 하던데
    그것은 Read-only file system 오류가 나네요,
    #mount ~ remount 잘 한거같은데요 ㅠㅠ

    답글삭제
  20. 안녕하세요 운영자님,
    tcpdump 실행하면 계속 "No such device exists"라고만 떨어지는데 혹시 이 현상에 대해 알고계신 것이 있는지 궁금합니다. 구글링해도 root 이용자인지 확인해보라고 하는데... 당연히 root로 들어가 있습니다. adb root 로도, 직접 단말에 들어가서 터미널을 띄우고 su - 한 후 실행해도 마찬가지 결과입니다.

    현재 갤3 CM 커스텀롬을 사용하고 있으며 혹시 상기 댓글처럼 rmnet_usb0 인터페이스 이름 문제인가 싶어서 -i rmnet0 으로 옵션을 바꾸어도 같은 결과가 나오네요...

    참고로 tPacketCapture를 사용하면 문제는 없습니다...

    답글삭제
    답글
    1. netcfg 로 확인했을때 인터페이스 명이 rmnet0 과 같이 확인이 되나요? 메시지 의미대로라면 인터페이스 명에 해당하는 디바이스가 존재하지 않는것 같습니다. tcpdump -i any 로 한번 시도해 보시겠어요.
      질문주신 사항만으로는 정확히 판단하기가 어렵네요.

      삭제
  21. 이걸로 주위사람 휴대폰 아이피를 알아낼수있나요?

    답글삭제
    답글
    1. 본인이 연결되어 있는 네트워크에서 패킷덤프를 한다는 것입니다. 주의 사람의 휴대폰 IP 를 알아낸다는 것은 조금 다른 접근이 필요한 것이네요. 주위에서 같은 통신사의 네트워크 또는 같은 무선 AP 에 연결되어 있다면 같은 네트워크 대역을 사용하고 있을 수 있겠다고는 추정할 수 있습니다.

      삭제
  22. 안녕하세요 저는 컴맹이나다름없는데요 . . 폰으루다운은받았지만 압축도풀었지만 실행하는방법을모르겠어요 열기를눌러도 그냥 그림판 주소록 텍스트 이런걸로만 열라고하는데 도아주세요 ㅠㅠ4년이나지난거지만 답변달아주실거라 믿어봐요

    답글삭제
    답글
    1. 컴맹이나 다름없으신데 패킷을 캡처하실 일이 있으신지 궁금합니다.

      스크린샷에서 보인 화면은 탐색기같은 것으로 '열기' 명령을 실행시킨 것이 아니라 폰을 루팅한 다음 terminal 앱을 실행시켜서 스크린 샷에 있는 명령을 타이핑해서 실행시킨 것입니다. 10개월이나 지난거지만 혹시나 도움이 되실까 해서 답을 달아봅니다.

      삭제
  23. 운영자님 제가 이게안되서 비트샤크라는 어플을받았는데 기능은같은건가요?

    답글삭제
  24. 안녕하세요, ㅠㅠ 제가 adb로 tcpdump를 실행해서 rnmet0 인터페이스로 패킷캡쳐를 했는데 2계층레이어가 linux cooked capture로 되어있네요 ㅠㅠ 혹시 이더넷 레이어로 뜨게 할 수 없을까요?

    답글삭제
  25. 안녕하세요, 운영자님. adb를 이용해서 tcpdump -i rmnet0 인터페이스로 패킷을 캡쳐했는데 와이어샤크로 켜서 보니 이더넷 레이어가 linux cooked layer로 뜨네요 ㅜㅜ 이더넷 레이어로 변경할 수는 없을까요?

    답글삭제