2010년 8월 31일 화요일

첫번째 CaseStudy, 어느 기업의 급격한 UDP 트래픽 증가

첫번째 CaseStudy 를 소개한다. 어떤 것을 소개할까 하다, 일반 기업에서 발생한 사례 하나를 소개해
보고자 한다. 흔히 요새는 알수없는 트래픽이 급격히 증가하면, 이거 악성코드에 의한 것이 아닐까 하고
생각하는 경우가 많다. 과거와는 달리 악성코드에 의한 트래픽 영향을 겪어 봐서 그런가 이런 의심부터
시작하고 분석을 거기에 초점을 맞추는 경우가 있다.

이번 Case도 누가 해킹하여 발생한 것이 아니냐, 악성코드를 심어 놓은 것이 아니냐 하는 의견이 있었다.
일단 분석대상인 이 패킷에는 다음과 같은 다양한 트래픽이 포함되어 있었다.

- ARP
- NetBIOS
- UDP
- 일반 사용 트래픽 (웹 과 같은)

그중에서도 가장 유독 눈에 띄게 관찰되는 부분이 UDP 였다. 그런데 증상은 항상 지속적으로 나타나지
않는다는 점이며, 일시적으로 나타났다 사라진다고 한다. 사실 지속적 증상없이 이렇게 일시적으로만
나타나는 경우가 분석에 제일 곤란한 부분이다.


패킷파일은 우선 와이어샤크로 분석을 진행했다. Protocol Hierarchy Statistics 로 발생한 트래픽을 살펴보니
UDP 의 사용이 가장 컸고, 그래프를 만들어 살펴봐도 위 그림과 같이 UDP 가 차지하는 비중이 꽤 높게 나타났다. 전체적인 관점에서 보다보면 이 외에도 다른것 까지도 다 의심의 범위에 속하긴 하였지만,
여기서는 일단 범위가 UDP 로 조금은 좁혀진 상태에서 이야기 하도록 한다.

UDP 를 살펴보니 두가지 종류 형태의 UDP가 관찰되었다.

- DATA 가 256 바이트인 UDP 이며 255.255.255.255 로 브로드 캐스트 주소 (목적지)
- Payload 를 1400 바이트로 채운 UDP

패킷파일 화면 일부를 보면 아래와 같이 이상하게 보일만큼 단시간내에 많은 내용이 있었다.

워낙에 많은 데이타 이다 보니 주욱 대충 살펴보면 DATA 상에서는 의심스러운 문자열 같은건 발견하지 못했다.
여러분도 아시겠지만, 데이터가 아주 큰 경우는 세밀하게 분석하자면 한도 끝도 없다. 전체적인 관점에서
먼저 살피는데, 알수없는 문자열들의 조합으로만 이루어져 있어 눈에 잘 들어오지가 않는다. 그런데 필자의
눈에 하나 잡힌 것이 있었다. 바로 아래와 같은 문자열이다.

헤더 첫 부분에서 JFIF 라는 문자열이다. 검색해 보았더니, JPEG File Interchange Format 이란다. 그럼 이미지 형태의 데이터가 아닐까 추측을 해 보았다.
왜 이렇게 더 생각할 수 있었던 이유는 이 패킷을 전달받은 곳이, 하드웨어적인 영상을 찍는 업체였기 때문이다. 그럼 느낌이 오지 않는가 ?
- 일시적으로 UDP 패킷이 크게 증가하는데,
- UDP 페이로드가 JFIF 관련한 것이고
- 패킷덤프를 뜬 곳이 이런 영상 관련 업체라는 점.

일단 UDP Follow Stream 을 통해 연결된 패킷을 모으고, 해당 데이터를 바이너리로 저장해 보았다. 물론, UDP 와 관련한 헤더는 수동으로 제거 시켜버렸다. 그리고 이미지 뷰어를 통해 살펴보니, 아래와 같은 이미지가 나타난다.
아니, 이건 무엇인가? 얼핏봐도 이미지 파일인걸로 추정해 볼 수 있으며, 사무실 형태의 윤곽이 잡힌다. 문제해결에 실마리가 될 결정적 단서가 될수도 있는 것이다. 전달된 UDP 데이터를 완벽하게 복원하지는 않았지만, 대략 복구해 낸 것으로도 이미지임을 알 수 있었다. 이렇게 분석해 낸 정보로 정리했는데, 확인 결과
개발자들의 테스트가 사무용 네트워크에서 일어나며 트래픽이 크게 발생된 것이었다.

즉, 발생된 내부에서는 내부 개발자들에 의한 일시적인 트래픽 증가로 의심하지 않았고,
다른 분석가들에 의해 내부 해킹되어 악성코드가 심어져 있어 통신에 의해 일시적으로 공격명령을 내린다는
형태의 가설이 설정되어 있었던 것이다. 처음 분석 의뢰를 받았을때, 그런 사전 정보를 기준으로 하다보니
혼란스러운 부분이 있었다.  결과의 원인을 해킹/악성코드 이슈로 정의해 놓고 분석을 하다 보니, 모든 관련된
것을 그쪽으로 맞춰 생각하기 쉬어질 수 있다.  

실제로 분석을 하다 보면 내부의 원인에 의해 발생되는 문제가 크다. 해당 담당자들이 내부에서 발생되는
트래픽을 정확히 이해하고 있다면 좀더 빠른 접근을 통해 해결될 수 있었을 텐데, 아쉬운 부분이기도 하다.
내부적으로 우선 발생한 것이 아닌지 면밀한 조사가 선행되어야 분석이 빨라지게 된다. 의뢰받아
분석을 하는 분석가 입장에서는 그곳의 네트워크 구성과, 어떤 형태의 트래픽이 발생되는지 등등의 형태를
모르기 때문이다. 그러므로 처음부터 분석해 나가며 하나씩 다 파악해야 하다보니 분석이 더디어 지게 된다.

물론, 특징적인 형태가 한눈에 보인다면 쉽게 해결될 수도 있겠지만, 엄청난 트래픽 데이터와 싸우려면
여간 지치는게 아니다. 하여튼 이번 CaseStudy 사례는 기업에서 급격히 발생한 UDP 트래픽이 있었고,
초기에 다른분석가들에 의해 악성코드에 의한 것으로 좁혀졌지만, 실제 패킷 포렌직을 통해서 확인해 보니
내부 개발자들에 의해 발생된 트래픽으로 확인이 된 것이다.

어떻게 첫번째 CaseStudy 가 여러분들에게 도움이 되었는지 모르겠다.

[참고]
1. JPEG File Interchange Format

2010년 8월 27일 금요일

VIM 의 플러그인을 활용해 기능을 확장해 보자.

VI 를 사용하다 보면 뛰어난 기능에도 놀라지만, 플러그인을 활용하면
활용범위를 더욱 넓힐 수가 있다. 그 중에 두 가지를 한번 소개해 보고자 한다.

1) 트리형태 구조로 편집할 파일을 빨리 찾아보자.

NERDtree 플러그인으로 아래 그림과 같이 왼쪽 편은 디렉토리 목록이
트리형태로 나오고 오른쪽 화면은 편집화면이다. 때로는 많은 파일을 처리해야
하는 경우가 있다. 이럴때 탐색기 같이 좌측 화면에서는 편집할 파일을 찾아
선택하면 우측 화면에 표시가 된다.

다음의 경로에서 다운받고, 압축파일을 사용자 디렉토리의 .vim 아래에 풀면 된다.
그러면 plugin, doc 폴더에 각각 들어간다.

실행은 아래와 같이 하면 되고, 각 창간의 이동은 Ctrl-w(w 두번 반복) 로 할 수 있다.

:NERDtree [경로]
세부적인 사용방법은 doc 파일안에 있는 설명서를 참고하면 된다.
파일편집을 많이 하는 사용자에게는 유용한 플러그인이 될 것이다.

2) 파이썬 코드를 폴더 형태로 접어보자.

파이썬 코드를 작성하다 보면, 특히 함수가 많은 경우에는 라인은 점점 길어지게 된다.
이럴때 유용하게 사용할 수 있는 것이, 함수를 폴더 형태같이 접었다, 필수 있는 형태의
기능이다. 아래 예제는 213라인 인데 한눈에 딱 들어오게 보인다. 각 함수를 정의한 부분이
폴더같이 접혀 있기 때문이다.

사용하기 위해서는 다음 파일을 다운로드 받아 plugin 에 넣어 놓고 사용하면 된다.

전체 폴더를 한번에 펴려면 Shift-f 를 누르면 되고, 특정한 함수 부분만 펼치려면
해당 라인이 표시된 곳으로 가서 f 를 누르면 된다. 파이썬으로 작업을 많이 하는
사용자에게는 나름 편리할 것이다.

2010년 8월 25일 수요일

플러그 형태의 하드웨어 봇! 전원만 연결하면 OK!

재미있는 도구 하나를 소개하고자 한다. 이름은 플러그 봇(Plug Bot) 이다. 옆 이미지의 그림인데, 하드웨어 형태의 봇이라고 생각하면 된다 :-)
현재 플러그 봇은 리서치 형태로 진행되고 있는 것인데, GPL 라이센스로 추후에 공개할 예정이라고 한다. 일단 이것은 모의해킹과 같은 형태로 이용하기 위해 개발하였다고 한다.  

이것의 사용방법은 아주 간단한데. 목표가 되는 곳에 가서 벽면의 전원에 꼽아 주기만 하면 된다. 무선이나 이더넷으로 연결이되게 되고, 외부에서 스크립트를 실행하거나 응용프로그램을 실행할 수 있게 된다. 테스트를 수행한 결과는 안전하게 암호화되어 전송이 된다고 한다.  하드웨어 스펙을 보면 다음과 같다 :

- 1.2GHz 프로세스 (ARM 기반)
- 512 MB 램
- 5 와트 파워
- 802.11b
- 기가비트 이더넷
- 블루투스
- 마이크로 SD 카드 슬롯

갖출건 다 갖춘 미니 컴퓨터다. 여기에는 리눅스, 펄, PHP, MySQL 이 이미 설치되어 있고, 스캔엔진의 사용 및 리눅스의 많은 스크립트나 명령어를 실행할 수 있다고 한다.  외부에 의해 네트웍이 차단되어 있다고 가정하고, 이 플러그 봇을 내부의 어딘가에 연결을 시키면 내부 네트워크 자원에 접근할 수 있는 경로가 생길 수도 있다. 물론 이 앞에는 사전에 연결 가능한 구성이 존재하여야 하고, 아웃바운드로 연결될 네트워크도 허용 되어야 할 것이다.  많은 기업에서는 방화벽 설정을 Inbound 는 차단을 많이 하지만 Outbound 는 많이 오픈을 하고 있다는 점이다. 즉, 이런 여러 환경 구성이 맞아 떨어지면 이 '플러그 봇' 의 사용도 문제 없을 것이다.

만약 집에다 플러그 봇을 꼽아 놓고 사용한다면 무엇을 할 수 있을까?
내 집에 설치된 봇을 통해 DDoS 에 이용 되거나, 해킹의 우회경로로 이용된다면 ? ^^ 상상은 여러분들한테 맡기겠다. 추가적인 정보는 다음 사이트를 방문해 보길 바란다.


2010년 8월 24일 화요일

안드로이드 DB 파일 접근시 'file is encrypted or is not a database' 메세지가 나온다면..

안드로이드 플랫폼에서 사용하는 DB 는 sqlite 이다. 파일 DB 로서는 꽤 많이 사용되고 있다.
일단 sqlite 는 파일 DB 라서 사용하기 편하다. 그냥 DB 파일을 이래저래 옮기기도 편하고,
SQL 을 그대로 사용할 수 있으니 말이다. 안드로이드에서도 sqlite 를 사용하고 있는데, 처음 사용하는
분들이 아래와 같은 에러를 겪는 경우가 있다.

# sqlite mmssms.db
Unable to open database "mmssms.db": file is encrypted or is not a database

이 경우는 sqlite 버전이 구 버전이 아닌지 확인해 보아야 한다.
# sqlite -version
2.8.17

안드로이드에서 사용하는 SQLite 의 버전은 3 이기 때문이다. 파일의 앞 부분을 살펴보면 확인이 가능하다.
# hexdump -C mmssms.db | more
00000000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
00000010  04 00 01 01 00 40 20 20  00 00 0b a3 00 00 00 00  |.....@  ........|
00000020  00 00 00 00 00 00 00 00  00 00 00 39 00 00 00 01  |...........9....|
00000030  00 00 00 00 00 00 00 12  00 00 00 01 00 00 00 2f  |.............../|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
그래서 아래와 같이 3.X 버전으로 실행하면 문제없이 DB 접근이 가능해 진다.
# sqlite3 mmssms.db
SQLite version 3.5.9
Enter ".help" for instructions

또는 파일 명령어를 통해서 3 버전인걸 확인이 가능하다.
# file mmssms.db
mmssms.db: SQLite 3.x database, user version 47

흔히 위와 같이 에러를 겪는 경우, 그냥 별 생각없이 sqlite 로 치고 접근하면서 많이 발생한다. 3 버전이므로
sqlite3 로 접근하거나, sqlite 를 sqlite3 로 심볼릭링크를 걸어 사용하기 바란다.

OpenSSH 5.6/5.6p1 버전 릴리즈

Verbophobia | OpenSSH

이미지출처 : www.blyon.com

OpenSSH 5.6 버전이 릴리즈 되었습니다. OpenSSH 는 SSH 프로토콜 1.3, 1.5 그리고 2.0 을 완벽하게 지원하고 있으며 더불어 아주 많이 사용되고 있습니다. 설마 아직도 telnet 을 이용해 터미널을 접속하시는 분들은 없으시겠죠?

이번 5.6 버전은 몇가지 기능과 버그들이 Fix 되었습니다. 자세한 변경 내용은 아래 릴리즈 노트를 참고하시기 바랍니다 :



8월23일에 릴리즈 된 따뜻한 내용입니다. 우리나라 기준으로는 오늘이겠죠 :-)

2010년 8월 22일 일요일

패킷포렌직 - '우리가 만날 카페의 이름을 알아내라' 문제풀이

두번째 패킷문제를 내고, 첫 문제보다 많은 분들이 답을 풀어주셨습니다. :-)

첫번째로 문제의 정답을 제출하신 분은 '무적코만도' 님 이십니다. 코만도님외 코알라님,불독형사님께서도 정답을 맞춰주셨습니다. 모두 축하드립니다 ^.^

이번 문제는 쉽게 출제하였는데요, 정답은 패킷인사이드 로고 파일안에 숨겨져 있습니다. 로고파일의 뒷 부분에
Secret Message: What is the worlds deepest sea? 문자열이 들어 있었습니다. 일반 이미지 파일안에 문자열을 숨겨서 넣은 것입니다. 이런 형태는 스테가노그래피(Steganography)로 불리는데 이미지나 오디오 파일과 같은 디지털매체에 메시지를 숨기는 것입니다.  문자열은 이미지파일만 열어봐도 아래그림과 같이 금방 확인이 됩니다:

[그림] 윈도우의 메모장을 통해 파일을 열어본 화면

만약, 이 문자열이 이렇게 바로 보이는 형태가 아니라 암호화 되어 있거나, 조금 다른 형태로 바뀌어져 있었다면 더욱 알기가 힘들었을 것이다.  첫 문제인 만큼 쉽게 알아볼 수 있도록 하였는데, 문제가 차츰 거듭될수록 더 어려워질 것이다. :-) 아, 문자열은 바로 정답을 넣은것이 아니라 세계에서 가장 깊은 바다가 어디인것인가를 물어보는 메시지였다. 구글링을 해 보면 '마리아나' 해구라는 것을 금방 찾을 수 있다. 즉, 문제에서 이미지 파일을 통해 만날 장소를 뜻하는 메시지를 넣어놓았고, 그들이 만날 최종 장소는 마리아나 카페가 되었던 것이다.

자 정답은 이렇다 치고, 어떻게 문제의 정답을 찾을 수 있을까 하는 부분에 대해서 얘기를 해보자. 문제는 사실 어렵지 않은데, 이것을 찾는 것이 다소 어렵게 느껴질 수 있다. 하지만, 처음에 패킷덤프를 해보라는 문제의 힌트를 제시하였다. 패킷덤프를 시작하고, 패킷인사이드에 접속하고 덤프 파일을 열어보자.

몇백개의 패킷으로 내용이 많긴 한데, 여기서 적절히 걸러낼 수 있는 경험치가 필요한 것이다. 패킷을 대충 훑어보면 이상한 점을 찾아볼 수도 있고, 너무 내용이 많아서 어려울수도 있다. 앞서 말한것과 같이 패킷인사이드 로고에 정답이 들어있는데, 이상하게도 해당 이미지파일이 조작된 형태라고 나오는 메시지를 확인할 수 있다. 추가힌트에서도 말했지만 Malformed Packet 이라는 것을 볼 수 있다. 이미지파일이 열려서 보이기는 하는데, 이미지 파일의 끝 부분에 그냥 추가한 형태다 보니 구조가 달랐던 것이다.  이렇게 일일이 다 봐서 찾을 수도 있지만, 더 쉬운 방법은 와이어샤크에서 Expert Infos 를 클릭해 보면 더 쉽게 찾아 볼 수 있다. 주욱 보다 보면, 유독 빨간색으로 선명하게 Malformed Packet 라인을 볼 수 있기 때문이다.

[그림] 와이어샤크의 Expert Infos 를 통해 찾아본 화면

이 기능을 통해 찾아보니 너무 쉽게 찾을 수가 있었다. 문제에서도 쉽게 정답이 들어있는 파일을 찾을 수 있도록 이런 힌트를 남겨놓은 것이다. 좀더 정교하게 파일을 작성할 수도 있겠지만, 의도적으로 Malformed Packet 형태가 보이도록 만들어 놓은 것이다.

이번 문제를 통해 다음을 익힐 수 있도록 한 것이다.
- 조작된 형태의 파일  
- 스테가노그래피
- 패킷파일 분석능력
- 어떤 방법을 통해 빨리 정답을 알아낼 수 있는가? (Expert Infos, 필터 등)
- 끈기

P.S 문제 정답자 분들에게 선물이라도 드릴 수 있으면 좋을텐데, 아직은 마련되어 있지 않습니다.^^ 기회가 되면 선물도 준비해 보겠습니다. 선물 후원이 가능하신분은 댓글 부탁드립니다 :-)
아, 그리고 아직 이미지파일은 그대로 이니 아직 문제를 풀어보시지 못했다면 지금 해보세요.

[참고]
1. 마리아나 해구
2. 스테가노그래피
3. 무적코만도님의 문제풀이 요약

다음은 첫번째로 정답을 제출하신 무적코만도님이 기술하신 내용을 요약한 것입니다.
패킷인사이드에 올려져 있는 여러 내용들이 참고가 되어 아래와 같은 방법으로 확인하였다고 합니다.
처음에는 찾느라, 눈이 벌개질 만큼 뚫어져라 보셨는데 그래도 첫번째 정답 제출의 영광을 가지셨습니다.

- 덤프된 패킷을 와이어샤크로 열어서 Statistics > Conversations > TCP 부분확인하며
각 연결된 세션을 하나하나 Follow TCP Stream 보면서 확인
- 패킷인사이드 이미지의 속성을 확인, 에디터로 열어서 확인
- 와이어샤크의 File -> Export ->Objects -> HTTP 순으로 오브젝트 리스트를 뽑아서 확인
- Malformed Packet : PNG 파일 확인

이전에 소개한 포스팅에서 HTTP 의 오브젝트를 확인하는 방법을 이용하셨는데,
빨리찾기 위한 좋은 방법입니다 :-)

2010년 8월 21일 토요일

tcpdump 컴파일 오류 - undefined reference to `pcap_parse'

앞서 소개한 포스팅에서 최신 버전의 tcpdump 로 확인하기 위하여 컴파일을 수행하다 발생한 에러에 대해 공유하고자 한다. 아마 개발 환경이 다 갖춰진 환경에서 컴파일이 되었다면 문제가 없었을 수도 있는 상황이었는데, 새로운 시스템에서 컴파일을 진행하다 보니 가벼운 문제가 있었다.

일단, libpcap 1.1.1 최신버전을 컴파일을 한후 다시 tcpdump 를 컴파일 하는 과정에서 아래와 같은 에러가 발생하였다.

./../libpcap-1.1.1/libpcap.a(gencode.o): In function `.L154':
gencode.c:(.text+0x7a4): undefined reference to `pcap_parse'
collect2: ld returned 1 exit status

pcap_parse 가 undefined 라고 나오는데, 오브젝트 파일에서 심볼을 확인해 보았더니 문제가 없었다. config.log 를 살펴보니

configure:9759: gcc -o conftest -DINET6 -g -O2   conftest.c ./../libpcap-1.1.1/libpcap.a   >&5
./../libpcap-1.1.1/libpcap.a(gencode.o): In function `.L154':
gencode.c:(.text+0x7a4): undefined reference to `pcap_parse'
collect2: ld returned 1 exit status
configure:9765: $? = 1
configure: failed program was:

확실히 에러를 확인할 수 있었다. 일단, pcap 라이브러리의 문제가 의심되어 모두 싹 지우고 새롭게 컴파일을 하고 tcpdump 컴파일을 다시 하니, 깔끔하게 된다. 아니, 특별히 건드린 부분도 없는데 말이다.

이전에 컴파일 상황은 bison, flex 같은것이 설치되어 있지 않아, configure 를 해 보고 없는 것이나 make 에서 없는 것을 그때그때마다 설치해 진행한 상황이었다. 그래서 이 부분이 꼬였었나 보다.

문제를 해결하고 보니 참 허무하다. 다시 쏵 지우고 컴파일을 한 것 밖에 없는데 말이다. 처음에는 이것저것 다 뒤져보느라 약간 시간을 허비했는데, 역시나 처음으로 부터 다시 돌아가 시작하는 것이 정답이었던 것인가 -.-

이런 에러를 똑같이 경험하실 분들을 위해 기록을 남겨놓으니 참고하길 바란다. 컴파일 전에 다음과 같은 부분이 설치 되어 있는지 먼저 확인하고 진행하면 큰 무리 없을 것이다.

flex
bison

우분투/데비안 계열 사용자라면 다음과 같은 형태면 문제 없을 것이다.

# apt-get install build-essential flex bison
그럼, 같은 에러를 겪은 분들에게 도움이 되기를 바라며.

P.S 구글링 해보면 비슷한 에러메시지가 나오기에 도움이 되지 않을까 생각한다.

2010년 8월 18일 수요일

2년여만에 새롭게 나온 Vim 7.3 버전

Kyle Usbeck

이미지출처 : www.cs.drexel.edu

유닉스 환경에서 많이 사용되는 에디터 프로그램인 VI. 윈도우용으로도 나와 있어 많이 사용되는 에디터이다. 유닉스 시스템을 사용한다면 VI 는 기본적으로 사용할 것이다.
이중에서도 Vim (Vi IMproved) 이 많이 사용되는데 7.2 버전이 나온 후,
2년 여 만에 7.3 버전이 나왔다. 많은 버그들이 픽스 되었고, 주요한 변화는 아래와 같다:
- Persistent undo and undo for reload
- Blowfish encryption, encryption of the swap file
- Conceal text
- Lua interface
- Python 3 interface

스왑파일도 암호화가 되고, Lua 와 파이썬 3 인터페이스가 지원된다. VI 는 아주 많이 사용하고
있는데, 사실 파이썬, 펄, 루비와 같은 인터페이스가 지원되는 줄은 몰랐다. 이번 업데이트
사항을 보고 이래저래 다시 살펴보니 내가 알고 있는 것 이상으로 더욱 많은 기능이 있었다.
그래도 남들 이상으로 다양한 기능을 많이 사용한다고도 생각했지만, 역시나 전체의 일부분만
사용하고 있던 셈이었다. 일반적으로 사용되는 프로그램의 기능중 주요 기능만 일부 사용되는 경우가 많은데
그 프로그램을 제대로 알고 있다면 사용할 수 있는 기능의 범위는 아주 넓어질 것이다.

일단 최신버전의 다운로드는 다음의 경로에서 할 수 있다.
http://www.vim.org/

그리고 오른쪽 메뉴에 *NiX Geek 라는 새로운 메뉴를 만들었다. 이곳에는 리눅스/유닉스 시스템과 관련한
팁 및 유용한 도구 등 다양한 것을 소개해 보고자 한다.
앞으로 이것저것 할것이 많으니 큰일이긴 하다 ^^

패킷덤프시 프로그램에 따라 캡쳐 사이즈가 달라진다.

패킷 덤프시 가끔 Snaplen 과 관련하여 착각하는 분들이 있어 소개하고자 한다. 일전에도 포스팅된
글에서 잠깐 소개를 하였던 것 같은데, 다시한번 보도록 하자!

패킷덤프를 하였는데, 이상하게 Payload 가 다 포함되어 있지 않고, 어딘가 짤려 있는듯한 패킷파일을
봤다면 패킷 덤프시의 길이가 제대로 정의되어 있는지 확인이 필요하다.

와이어샤크는 기본적으로 덤프 길이가 Length 길이의 최대치인 65535 로 지정되어 있어서, 따로
작게 지정하지 않는 한 이슈가 없다. 그런데 유닉스 환경에서 tcpdump 를 이용하는 경우 미처 깜빡하고
넘어갈 수 있다. 다음의 경우를 보자.

아래버전은 3.9.8 버전이다.
# tcpdump -V
tcpdump version 3.9.8
libpcap version 0.9.8

-c 옵션을 통해 10 개의 패킷만 덤프해 보았는데, capture size 가 96 바이트로 나온다.
# tcpdump -c 10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

하지만 -s 옵션을 통해 지정하면 해당 크기만큼 덤프가 가능하다.
# tcpdump -c 10 -s 1514
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 1514 bytes

바로 이런 차이로 덤프는 제대로 되었는데, 페이로드가 완벽하게 기록되지 않는 이유가 여기에 있는 것이다.
하지만, tcpdump 최신 버전에서는 변경되었다.

# ./tcpdump -V
tcpdump version 4.1.1
libpcap version 1.1.1

# ./tcpdump -c 10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

위와 같이 따로 지정하지도 않았는데, 기본 사이즈가 65535 바이트로 지정되어 있다. 최신 버전을 이용하는
경우 신경 안 써도 되지만, 이전 버전을 사용하는 사용자라면 이점 주의하길 바란다!

2010년 8월 17일 화요일

데비안의 17번째 생일을 축하합니다. :-)

제가 좋아하는 리눅스중 하나인 데비안이 17살을 맞이했습니다.
오랜 기간만큼 많은 유저층을 확보하고 있고, 가장 인기있는 리눅스 배포판중에 하나인
우분투도 데비안을 기반으로 하고 있죠. 25,000 개 이상의 패키지와 870 여명이 넘는
데비안 개발자들. 오픈소스를 위해 힘쓰는 그들.
17번째 생일을 정말 축하해요, 데비안.

Debian 5.0 - The universal operating system

아, 그리고 인터넷 익스플로러도 15주년이 되었다고 하네요. 1995년 8월 16일 Internet Explorer 1
이 나온이후로.

2010년 8월 15일 일요일

패킷포렌직 두번째 이야기, 우리가 만날 카페의 이름를 알아내라

주말들은 잘 보내셨는지요? 요새 참 더운 날씨죠.
패킷인사이드에서 패킷 Contest 로 문제 한번을 낸적이 있습니다. 재미있어 하시는 분들고 있고,
앞으로 계속 해달라는 요청도 있기에 짬짬히 계속 해 보려고 합니다. 문제를 통해서 패킷 분석에
더 쉽게 다가갈 수 있기도 하고, 거기에 재미까지 더할수도 있으니까요.

두번째 문제 아주 쉽게 준비해 보았습니다. 다음의 문제를 한번 들어보세요.

패킷인사이드를 운영하는 R씨에게 어느날 연락이 왔다. 연락온 사람은 R 씨와도 친하게 지내는 A씨.
큰 사업을 운영하고 있는 A 씨는 최근 큰 기업인수를 앞두고 기업간 신경전이 치열하다고 한다.
그리고 내부에 스파이가 있는거 같다고 한다. 만나서 자세한 이야기를 하자고 하고, 만나기로 한다.
R 씨는 만날 장소는 자기가 운영하는 사이트에 2010년8월15일 XX 경에 올려 놓겠다고 한다.
그들은 인터넷,통신 감청의 이유로 지금까지 이런 방법을 통해 만날 장소를 결정했다고 한다. 사업가인
A 씨도 쉽게 알 수 있었던 이 통신 방법은 간단한 것이라 생각된다. 하지만, 남들은 이렇게 하고 있을줄은
생각을 못했겠지?

메인 페이지라 해봤자 평소와 다른 것은 없다. 이번에 만날 장소는 카페라고 하며, 이 카페의 이름을
알 수 있다고 한다.  과연 어디일까?

문제를 풀어서 어떤식으로 알 수 있었는지 댓글을 달아주세요. 모범 답안은 문제풀이때
소개하도록 하겠습니다.

지금 PacketInside.com 메인 페이지에서 정답을 찾아보세요. 패킷 덤프를 해 보면 문제의 정답을 찾는데
수월하겠죠?
   
8월22일(일) 까지 받도록 하겠습니다. 댓글로 정답을 남길시에는 비밀댓글로 남겨주세요. 상황에 따라서는 더
빨리 종료할 수도 있습니다.


2010년 8월 12일 목요일

패킷덤프중 프로세스 강제종료는 일부 데이터손실을 가져올 수 있다.

tcpdump 를 이용하여 패킷을 여러개 기록한 경우가 있다. 이상하게도 이전 포스팅에서 소개한 것과 같이 패킷파일을 열어보려고 하면 'appears to have been cut short in the middle of a packet' 메시지가 나타났지만, 어떤 경우는 아예 데이터가 없거나 일부분만 있는 경우가 나타났다.

일부는 기록이 되었는데, 100% 완벽하게 기록이 되지 못했던 것이다. 이유인즉, kill -9 로 프로세스를 kill 하면서 발생하는 문제였다. tcpdump 옵션을 찾아보니 이를 해결할 옵션이 보인다. 바로 -U 옵션이다.

-U 옵션은 Output 버퍼에 기록되어 기록되기 보다는 바로 디스크에 기록이 된다는 점이다. 데이터를 바로바로 기록할 수 있으므로, 내용 하나하나가 중요한 경우에는 필요한 옵션이다.

       -U     Make  output  saved  via  the  -w  option ``packet-buffered``; i.e., as each packet is
              saved, it will be written to the output file, rather than being written only when  the
              output buffer fills.

              The  -U flag will not be supported if tcpdump was built with an older version of libpcap
              that lacks the pcap_dump_flush() function.

다만, 디스크에 바로 기록하기 때문에 디스크 IO 요청은 늘어난다. 이런점은 고려하여 사용여부를 결정해야 한다.

이 -U 옵션을 좀더 살펴보기 위해 tcpdump 소스코드를 살펴보았다. 일반적인 기록에는 pcap_dump 가 사용되는데 -U 옵션은 pcap_dump_flush 가 사용되고 있다.

    pcap_dump((u_char *)dump_info->p, h, sp);
#ifdef HAVE_PCAP_DUMP_FLUSH
    if (Uflag)
        pcap_dump_flush(dump_info->p);
#endif

    --infodelay;
    if (infoprint)
        info(0);
}

사용되는 libpcap 의 소스코드를 살펴보면 pcap_dump_flush 에는 fflush 로 기록을 하고 있고 , pcap_dump 는 fwrite 를 통해 기록을 하고 있다는 차이점이 있다.


[fflush 이용]

int
pcap_dump_flush(pcap_dumper_t *p)
{

    if (fflush((FILE *)p) == EOF)
        return (-1);
    else
        return (0);
}

[fwrite 이용]

void
pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
{
    register FILE *f;
    struct pcap_sf_pkthdr sf_hdr;

    f = (FILE *)user;
    sf_hdr.ts.tv_sec  = h->ts.tv_sec;
    sf_hdr.ts.tv_usec = h->ts.tv_usec;
    sf_hdr.caplen     = h->caplen;
    sf_hdr.len        = h->len;
    /* XXX we should check the return status */
    (void)fwrite(&sf_hdr, sizeof(sf_hdr), 1, f);
    (void)fwrite(sp, h->caplen, 1, f);
}

그렇기 때문에 kill 로 그냥 프로세스를 종료할 시에는 버퍼 내용이 다 기록된 반면 -9 옵션을 통해 kill 하는 경우 버퍼내용이 기록되지 않으면서 데이터가 완벽하게 기록이 안되는 경우가 발생한 것이다.

패킷 데이터를 덤프하는 경우, 그리고 데이터 내용이 중요한 경우에는 이점을 참고하기 바란다. 정말 패킷이 흘러간 내용이 없는 것으로 판단 착오를 할수도 있기 때문이다. libpcap 을 이용하는 패킷 덤프 프로그램에서는 이런 경우가 있을 수 있으므로 머리속에 기억해 놓자!


2010년 8월 10일 화요일

CaseStudy의 시작, 패킷 분석의 이유와 거기서 무엇을 얻어낼 것인가?

이 블로그의 큰 주제는 '패킷' 이다. 패킷말고도 다양한 관련 주제 또는 그 이외의 것들도 다루고 있지만,
그래도 패킷관련한 글이 가장 많다. 많은 사람들이 패킷 분석을 검색하다 이 곳을 방문하고,
나는 방문하는 분들을 위해 이 글을 적고 있다. '패킷' 이라는 원론적인 것을 생각해 보자. 패킷은 무엇일까?
네트워크 상에서 흘러다니는 흐름의 한 작은 구분이다.
인터넷이라고 말하는 이것들이 네트워크를 통해 전송되고, 네트워크 상에서 이 것들은 패킷이라고 불리는
작은 것으로 쪼개져 전송된다. 바로 우리가 분석하고자 하는 대상이 이 것들인데, 이 패킷을 통해서
그럼 무엇을 얻을 수 있는 것일까?  

분석하고자 하는 대상과 목적에 따라서 달라질 것이다. 이론적으로만 본다면, 네트워크를 통해서
흘러다닌 것은 모두 기록할 수 있고, 그 기록된 데이터를 분석한다면 내가 원하는 것의 결과를
얻어낼 수 있을것이다. 흔히들 패킷분석이라고 하면 무엇을 말하는 것일까?  사실 범위가 너무 넓다.
우리가 쉽게 접하고 사용하는 인터넷 상에서만 흘러다니는 패킷으로만 한정지어도 수 많은
프로토콜과 각기 다른 데이터로 정말로 넓다.

막연히 수 메가가 되는 패킷파일을 던져주고 이거 패킷분석좀 해봐라고 하면 참 답답하기 그지 없다.
그 패킷파일안에는 다양한 네트워크 형태와 프로토콜, 애플리케이션 데이터들이 있는데, 도대체
무엇을 분석하라는 것인가? 분석에는 왜 분석이 필요한가의 이유가 있어야 한다. 그리고 패킷 분석
대상의 범위가 명확해야 하고, 네트워크 구성정보등이 주어져야 한다.

업무의 필요에 따라 패킷분석을 통해 문제의 원인을 알아내고, 그 문제를 해결하는데 패킷 분석이
큰 도움을 주기도 하고, 오히려 더 이해하기 힘든 상황을 주기도 한다. 패킷분석만이 모든 문제의
해결책이 되지는 않기 때문이다. 패킷분석을 하는 당신은 패킷 분석가이다. 다양한 직책이 있겠지만,
지금 분석을 하고 있는 당신은 패킷분석가(Packet Analyst)로 정의하고 싶다.

패킷 분석가인 당신에게 스마트 해 질 것을 주문해 보고 싶다. 패킷파일은 어찌보면 판도라의 상자와도
같다. 너무나 많은 비밀이 숨겨져 있기도 하고, 모르는 것 투성이다. 범위에 따라서도 분석형태가 달라진다.
네트워크 접속/문제 해결을 위한 것, 보안 관점의 이슈, 프로토콜의 문제, 애플리케이션의 문제 파악등 너무 다르다.

그렇기 때문에 앞으로, 우리가 풀어나가야 할 대상인 '패킷' 이라는 것을 다양한 관점에서 풀어나가기 위한
CaseStudy 를 소개하고자 하는 것도 여러분들에게 도움이 될까 하여 나의 경험을 공유하고자 한다.
너무나 많은 사례가 있기 때문에, 내가 소개하는 것은 아주 일부분에 불과하다. 그렇기 때문에
여러분들의  경험했던 다양한 사례도 함께 공유해 주면 소개하여 많은 이들이 참고할 수 있도록
만들어 나가려고 한다.

많은 패킷 분석가를 만들어 내는 것에 패킷인사이드가 일조하였으면 하는 바람에서 이 블로그가
탄생하였고, 언제까지 지속될 수 있을지 모르겠지만 어디 한번 시작해 보자!

From Rigel

2010년 8월 9일 월요일

인터넷 서핑시 내 흔적의 기록을 지우는 IPFlood

인터넷을 하면서 가장 많이 사용하는 것중에 하나가 웹 브라우저 일 것이다. 각 사이트를 방문하게 되면,
나의 IP 주소가 해당 웹 서버에 기록으로 남게된다. 어찌보면 IP주소 또한 개인 정보이기도 하다. 자 그러면 이러한 흔적없이, 좀더 안전하게 웹 서핑을 할 수 있는 방법은 무엇이 있을까? 대표적인 방법이 프록시 서버를 이용하는 것이다. 직접적으로 웹 접속을 하는 것이 아니라 프록시를 거쳐서 한번 사용하는 것이다. 하지만, 기본적으로 프록시에서는 추가적인 헤더 필드를 통해 원래의 IP 주소를 넘기기도 한다. 이런 정보도 남기지 않는 유/무료의 프록시가 있기도 하다. 또, 회사 내부에서 NAT 를 사용한다면 대표IP 를 통해 인터넷을 이용하게 될 것이다.

개인이 집에서 사용할 수 있는 또 다른 방법의 하나로 플러그인을 소개한다. 파이어폭스 브라우저를 이용할 경우 이 플러그인이 조금은 더 안전하게 사용할 수 있게 해줄것이다. IPFuck 이라는 이름으로 사용되었지만, 설치하는 페이지를 보면 IPFlood 라고 나온다. 아마 이름이 약간은 거칠어서 그런거 아닐까 생각한다.

http://ipfuck.p4ul.info/

위 사이트에서 Test it! 를 클릭해 보면 IP 관련한 정보가 나온다.

이것의 원리는 간단하다. 접속시에 헤더 정보만을 수정해 주는 것이다. 헤더 정보라 함은 HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP 등이다. 그러므로 완벽하게 흔적을 지워주는 것은 아니다. 다만이 정보로 실제 IP 등을 추정하므로 어느정도는 충분히 흔적의 기록을 지우는데 유용하다. 플러그인을 설치하면 아래 창과 같은 것을 볼 수 있다.

설치를 완료하고, Test It! 페이지를 다시 클릭해 보자. 그러면 아래와 같이 IP 정보가 랜덤하게 기록되어 있는 것을 볼 수 있다. 즉, 프록시 관련한 HTTP 헤더의 IP 주소를 임의로 설정한 것이다.










이런 정보를 가지고 실 IP 를 판단하는 경우에는 이 플러그인이 유용할 것이다. 다만, 이 플러그인은 파이워폭스 브라우저에서 사용가능하다.

2010년 8월 6일 금요일

HTML 형태의 패킷 분석 보고서는 어떤가요?

지금까지 소개한 패킷분석 프로그램은 대부분 텍스트 형태였다. 만약 HTML 형태로 나오면 어떨까?
분석대상에 따라서 달라지겠지만, 때로는 간단하게 텍스트 형태가 편할 수도 있고, 데이터 내용이 많으면
좀더 쉽게 정리되어 볼 수 있는 HTML 형태가 편할수도 있을 것이다. 이것은 분석가의 판단에 따라서
상황에 맞는 것을 선택하면 된다.

일단, 지금 소개하고자 하는 것은 'pcapline' 이라는 것으로 패킷을 분석해 HTML 형태로 만들어주며
세션별로도 구분해준다. pcapline 은 파이썬으로 작성되어 있으며, 다음 경로에서 받을 수 있다.


실행은 분석할 PCAP 파일을 지정해 주는 것으로 끝난다.

# ./pcapline.py test.pcap
[*] Pcapline v0.9
[*] Processing pcap
[*] Generating report

분석이 완료되고 리포트가 생성되면 해당 폴더(실행한 파일이름의 output )에 아래와 같이 서브디렉토리가 존재하고 index.html 이 있다.

# ls -l
total 120
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0001
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0002
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0003
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0004
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0005
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0006
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0007
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0008
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0009
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0010
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0011
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0012
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0013
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0014
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0015
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0016
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0017
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0018
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0019
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0020
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0021
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0022
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0023
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0024
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0025
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0026
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0027
drwxr-xr-x 2 rigel rigel 4096 2010-07-28 23:37 0028
-rw-r--r-- 1 rigel rigel 8010 2010-07-28 23:37 index.html

index.html 을 브라우저에서 읽어들이면 아래와 같은 분석 보고서를 볼 수 있다. 호스트별로 구분되어 있고, 전송된 데이타량 그리고 해당 패킷이 어떤것인지 나타난다. 여기서 이제 각 Flow 를 선택하게 되면 세부적인 정보를 더 볼 수 있게 된다. (참고로, 여기서 사용된 것은 랜덤하게 IP 를 변경한 것이다)


세부 정보를 선택했더니, 더 자세한 내용들이 나타난다. 스트링 데이터도 볼 수 있고, HEX 값도 볼 수 있다.
각 요약 정보는 굳이 설명하지 않더라도 어떤 내용인지 쉽게 이해가 될 것이다.
HTML 형태의 보고서로 만들어 주므로 웹 브라우저 등이 있어야 하는 불편함은 있지만, 어떤 면에서는 더욱 쉽게 내용을 확인할 수 있는 방법을 제공해 준다. 파이썬이 설치되어 있다면 한번 사용해 보는 것도 괜챦다.

혹시 프로그램이 제대로 실행되지 않는다면, 설치된 파이썬 버전은 어떻게 되는지 확인해 보자. 파이썬 2.5 버전을 사용하는 경우에는 실행시 오류가 발생된다. 최신 버전인 2.7 을 사용하면 문제 없을 것이다. (2.6 도 OK)

2010년 8월 4일 수요일

리눅스 환경의 간단한 와이어샤크 컴파일은...

바로 전 포스팅에서 tshark 를 약간 수정하여 사용하는 부분에 대해서 설명하였다.


여기에 추가로 컴파일 과정에 대해서 간단히 덧붙이고자 한다. 컴파일은 *NIX 환경에서 한 것이고, 컴파일 전에
필요한 패키지들이 있다. 나의 경우는 기본으로 설치된 리눅스 환경에서, 필요한 패키지는 다음과 같은 것들이 있었다.

bison
flex
pkg-config
libglib

APT 패키지 설치가 가능한 환경이라면,
# apt-get install bison 과 같이 쉽게 설치가 가능하므로, ./configure 를 하는 과정에서 무엇이 없다고 하면
# apt-cache search pkg_name 으로 해서 찾아보면 쉽게 설치가 가능하다. X-Windows 가 설치되어 있지 않아
굳이 GUI 기반의 와이어샤크는 필요없었기에 --enable-wireshark=no 옵션으로 컴파일을 제외했고, GTK 도
사용안 하므로 --disable-gtktest 옵션을 주었다.

그럼 다음과 같이 컴파일을 위한 환경 준비를 위해 configure 를 실행해 주면 된다.

$ ./configure --enable-wireshark=no --disable-gtktest
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
.
. (삭제)
The Wireshark package has been configured with the following options.
                    Build wireshark : no
                       Build tshark : yes
                     Build capinfos : yes
                      Build editcap : yes
                      Build dumpcap : yes
                     Build mergecap : yes
                    Build text2pcap : yes
                      Build idl2wrs : yes
                      Build randpkt : yes
                       Build dftest : yes
                     Build rawshark : yes

             Install dumpcap setuid : no
                        Use plugins : yes
                    Use lua library : no
                   Build rtp_player : no
                        Use threads : no
             Build profile binaries : no
                   Use pcap library : yes
                   Use zlib library : yes
                   Use pcre library : no
               Use kerberos library : no
                 Use c-ares library : no
               Use GNU ADNS library : no
                Use SMI MIB library : no
             Use GNU crypto library : no
             Use SSL crypto library : no
           Use IPv6 name resolution : yes
                 Use gnutls library : no
     Use POSIX capabilities library : no
                  Use GeoIP library : no
$ make
$ make install


위 결과를 보는 것과 같이 와이어샤크는 컴파일하지 않는다고 "no" 가 나왔고 기타, 다른 라이브러리나
컴파일 되는 패키지 정보가 나온다. 즉, 본인이 사용하고자 하는 기능에 따라 해당 라이브러리도 있어야 되므로
configure 시 적절히 추가해 주어야 한다. 예를 들어, GeoIP 를 사용하겠다고 하면 --with-geoip=[경로] 옵션이
필요하게 된다. 사용가능한 옵션은

$ ./configure --help

로 확인할 수 있다. 와이어샤크는 오픈소스인 만큼 소스를 자유롭게 사용가능하므로 원하는 형태로
자유롭게 기능을 추가하거나 제거할 수 있다. 바로 이것이 오픈소스의 매력이며,
여러분들만의 와이어샤크를 만들어 볼 수 있는 기회를 줄것이다.

이전 포스팅에서 사용한 컴파일에 대해서 간략하게 소개한 것이므로, 좀더 깊게 컴파일 과정을 소개할 기회가
되는 대로 준비하겠다.

2010년 8월 2일 월요일

패킷 오픈 중 'appears to have been cut short in the middle of a packet' 메시지가 나타난다면..

와이어샤크 또는 tshark 를 사용하다 보면 패킷이 중간에 끊기어 다음과 같은 메시지를 보는 경우가 있다.

$ tshark -q -z io,phs -r test.pcap
tshark: "test.pcap" appears to have been cut short in the middle of a packet.

tshark 를 사용해 로드하는데 메시지가 패킷중간이 잘린것 같다고 나온다. GUI 환경의 와이어샤크에서도
이런 메시지가 나온다. 이유는, 코드 상에서 로드하다가 이런 경우가 발생되면 빠져나가도록
되어 있기 때문이다. 하지만 때로는, 어쩔수 없이 이런 패킷을 많이 봐야 할 경우도 생긴다.
(와이어샤크로 보는 경우라면 말이다)
특히 유닉스 상에서 덤프를 하는데 tcpdump 와 같이 패킷 덤프를 저장하다가 kill 로 해당 프로세스를 죽이지 않고 kill -9 와 같이 하는 경우는 이런 경우가 종종 발생한다.

일단 소스를 재 컴파일 해야 하는데, 일단 tshark 를 기준으로 설명한다. GUI 기반으로 컴파일 하려면 이것저것 더 필요한 것들이 많아서 귀차니즘으로 tshark 를 기준으로 한다. 물론, GUI 환경으로 컴파일이 다 준비되었다면 똑같이 wireshark 소스코드를 찾아 바꾸면 될 것이다.

와이어샤크 최신버전인 1.2.9 의 경우는 tshark.c 의 2279 라인을 보면 된다.

    case WTAP_ERR_SHORT_READ:
      cmdarg_err("\"%s\" appears to have been cut short in the middle of a packet.",
                 cf->filename);
//      break;    ---> 이 부분을 "//" 로 주석처리한다.
        return 0;     ---> 그리고 리턴 시켜준다.

break; 라고 되어 있는 부분을 주석처리 하면 된다. 이것은 일부로 에러가 발생해도 계속 동작하도록
수정하는 것이다. 나의 경우는 이런 것이 필요하여 코드를 보다가 이렇게 간단히 수정하여 사용하고 있다.

아래와 같이 실행하면 에러 메시지는 나와도 결과를 볼 수 있다. 필요하면 좀더 자기 입맛에 맞도록 수정하면 된다.
# ./tshark -q -z io,phs -r test.pcap
tshark: "test.pcap" appears to have been cut short in the middle of a packet.

===================================================================
Protocol Hierarchy Statistics
Filter: frame

frame                                    frames:394341 bytes:49686922
  eth                                    frames:394341 bytes:49686922
    ip                                   frames:394341 bytes:49686922
      tcp                                frames:394318 bytes:49683678
        http                             frames:78864 bytes:31308464
          data-text-lines                frames:39431 bytes:26418684
      udp                                frames:23 bytes:3244
        dns                              frames:20 bytes:2499
        nbdgm                            frames:3 bytes:745
          smb                            frames:3 bytes:745
            mailslot                     frames:3 bytes:745
              browser                    frames:3 bytes:745
===================================================================
필요에 의해서 간단하게 언급을 해 보았는데, 기회가 되면 다음번에 컴파일 과정에 대해서도 소개하도록 하겠다.

2010년 8월 1일 일요일

패킷정보로 원격지 시스템의 운영체제를 추정한다 - p0f

패킷 분석을 하는 과정에서 IP 를 추적하다 보면, 이 IP 에서 운영하는 서비스는 어떤 시스템하에서 운영하는지 정보를 알아야 하는 경우가 있다. 분석하는 과정에서 운영체제 정보가 도움이 된다면 말이다.
이럴때 사용할 수 있는것이 Fingerprint 방식이다. 이 단어의 뜻만 보면 '지문'이라는 것이다. 즉, 네트워크 상에서 갖는 각 특성, 지문이라고 할 수 있는 이 정보들을 이용하여 정보들을 추측하는 것이다.

어떻게 이런것이 가능할까? 운영체제 마다 네트워크 통신 과정에서 사용되는 각 값들이 약간씩 차이를 가지고 있고, 바로 이런 정보를 이용하는 것이다.  TCP/IP Fingerprinting 의 경우 다음의 값들이 이용된다:

  • Initial packet size (16 bits)
  • Initial TTL (8 bits)
  • Window size (16 bits)
  • Max segment size (16 bits)
  • Window scaling value (8 bits)
  • "don't fragment" flag (1 bit)
  • "sackOK" flag (1 bit)
  • "nop" flag (1 bit)
즉, 이런 정보가 사전 정의된 정보를 이용하여 추정할 수 가 있는 것이다. 여러가지 도구들이 있는데, 대표적인 것은 스캐너로 많이 이용하는 nmap 도 있다. 오늘은 p0f 라는 도구를 소개할 것이다. 다운로드는 다음의 경로에서 할 수 있다: (윈도우 환경에서도 cygwin 을 이용하면 사용 가능하다)


사용방법은 간단하다. 기본적으로 옵션없이 실행하면, 기본 인터페이스에서 흐르는 트래픽을 검증하여 보여준다. 이렇게 되면 너무나 많은 정보가 나타나므로 필터를 사용하여 제한을 할 수가 있다. 이 필터는 tcpdump 에서 사용하는 스타일의 것과 같다 ( 와이어샤크에서는 출력필터가 아닌 캡쳐 필터와 같다)

아래 옵션은 인터페이스 eth0 에서 호스트 주소가 192.168.115.5 번으로 필터를 한 것이다.

# p0f -i eth0 ip host 192.168.115.5
p0f - passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski <lcamtuf@dione.cc>, W. Stearns <wstearns@pobox.com>
p0f: listening (SYN) on 'eth0', 262 sigs (14 generic, cksum 0F1F5CA2), rule: 'ip'.
192.168.115.5:3464 - Windows 2000 SP4, XP SP1+
  -> 192.168.115.3:22 (distance 0, link: ethernet/modem)

해당 IP 의 운영체제가 윈도우 2000 SP4 또는 XP SP1 이상이라고 표시를 하였다. 이렇게 탐지된 정보는 아래와 같은 룰이 있기 때문이다.

65535:128:1:48:M*,N,N,S:.:Windows:2000 SP4, XP SP1+

각 의미는 무엇일까? p0f 를 설치한 파일에 이런 Fingerprint 정보가 있는데, 파일을 열어보면 아래와 같이 포맷형태를 볼 수 있다. ( /etc/p0f 에서 p0fa.fp , p0f.fp , p0fr.fp 파일을 볼 수 있다)

# Fingerprint entry format:
#
# wwww:ttt:D:ss:OOO...:QQ:OS:Details
#
# wwww     - window size (can be * or %nnn or Sxx or Txx)
#        "Snn" (multiple of MSS) and "Tnn" (multiple of MTU) are allowed.
# ttt      - initial TTL
# D        - don't fragment bit (0 - not set, 1 - set)
# ss       - overall SYN packet size (* has a special meaning)
# OOO      - option value and order specification (see below)
# QQ       - quirks list (see below)
# OS       - OS genre (Linux, Solaris, Windows)
# details  - OS description (2.0.27 on x86, etc)

즉, 위 정보를 요약해 보면 윈도우 사이즈는 65535 이고, TTL 값은 128 Framgement 값이 셋팅되어 있고 SYN 패킷 사이즈는 48 바이트라는 것이다. 막상 각 포맷을 알아보면 이렇게 간단하다.
탐지된 패킷을 세부적으로 한번 살펴보자.

80 번포트로 전달된 SYN 패킷이고 패킷길이, TTL, Fragment 값등을 보면 사전에 정의된 룰 파일과 동일하다.
운영체제마다 다른 이전 정보들만 알 수 있다면 대략적으로 추정이 가능하다는 것이다. 하지만, 이 정보만으로 100%  추정할 수는 없다. 그렇기 때문에 이 정보만을 믿고 확신해서는 안된다. 그래도 큰 관점에서 윈도우나, 리눅스 등 넓은 관점에서는 대략 생각해 볼 수 있다.

다음은 윈도우 7에서 탐지된 정보이다. 하지만,  p0f 에서 탐지되는 것은 Windows XP/2000 이다.

192.168.0.220:50879 - Windows XP/2000 (RFC1323+, w+, tstamp-) [GENERIC]
  Signature: [8192:128:1:52:M1460,N,W8,N,N,S:.:Windows:?]
  -> 192.168.0.223:23 (distance 0, link: ethernet/modem)
192.168.0.220:50879 - Windows XP/2000 (RFC1323+, w+, tstamp-) [GENERIC]
  Signature: [8192:128:1:52:M1460,N,W8,N,N,S:.:Windows:?]
  -> 192.168.0.223:23 (distance 0, link: ethernet/modem)
192.168.0.220:50879 - Windows 2000 SP2+, XP SP1+ (seldom 98)
  -> 192.168.0.223:23 (distance 0, link: ethernet/modem)

어떤식으로 TCP/IP Fingerprinting 이 되는지 대략 이해는 되었을 것이라 믿는다. 이런 정보를 활용하면 네트워크 포렌직을 하는데 도움이 될 것이다.

[참고]
1. Remote OS detection via TCP/IP Stack FingerPrinting
2. TCP/IP Stack Fingerprinting