2010년 6월 29일 화요일

파일 데이터 다루는데 이만한 도구 없다! 맥가이버 칼이 파일까지...

패킷 분석을 진행하다 보면, 다양한 분석이 필요한 경우가 많다. 패킷을 통해 전송된 데이터를 분석하거나
HEX 값을 바이너리로 변환하거나 등 파일이 추출된 경우 분석하기 위한 다양한 작업이 이어진다.
예를 들어, 패킷파일을 통해 다음의 데이터가 전송된 경우를 보자.

C0C6BD13A42E8523CD25BBE5493E09CB9333C7A06E4A0894C7A582C166B193BAC68EE5005F64114E
F59F630F1B164D51956CE802F380B4E7E6852B5D0F72A6C8E896B4142C80B6356F2D75FEBF4803DC
3D122EAF0CCE0536B01A7211997B770E580BF8F089A94DEE5BE0A4FF9B5CF1A08D368EA6A6E37302
BAE3B68F19ABA2466A2C46A55875DA19BB89184EDE60F9494664EAD9FE29F7E15CE797036F79B4B2

어떤 데이터로 보이는가? 알수없는 의미의 데이터? 암호화된 데이터? 등. 우리는 사전정보를 모르고
패킷파일을 분석하였기 때문에 어떤것인지 알 수 없다. 패킷분석을 통해서 모든 것을 알아낼 수는 없는 것이다.
다만, 최대한 어떤 형태인지 파악은 가능할 것이다. 운이 좋으면 그 형태를 넘어 무엇인지도 알 수 있다.

이번은 어떤 데이터를 해독하는 과정을 설명하기 보단, 파일 데이터등을 다루는데 유용한 도구를 소개하고자 함이다. 위 데이터를 보면 눈썰미가 좋은 사람이라면 HEX 값 이라는 것을 추정해 볼 수 있다. (물론 아닐 수도 있다) 그럼 이 HEX 값이 어떤 실행가능한 형태의 데이터라면 바이너리로 변환이 필요한데, 막상 변환하려고
하면 방법을 모르고 헤매는 경우가 많다. 이럴때 유용하게 사용될 수 있는 SFK(Swiss File Knife) 가 있다.

막상 쉬어보이고 찾으면 쉽게 나올거 같지만, 꼭 필요할땐 정보 찾기가 힘들다 ^^

파일은 다음의 경로에서 다운받을 수 있다.

이 포스팅에서 이용한 예제는 리눅스 기반에서 사용하였지만, 윈도우(Window) 에서도 사용 가능하다는 점!

자, 그럼 위 데이터 값을 tt 라고 저장하고 바이너리로 변환하기 위한 방법은 아래와 같다.

# ./sfk-linux.exe filter tt +hextobin out.dat
26 lines converted, 0 skipped, 1024 output bytes.
md5: 19b5646577f8aeb567a717ac3e84c5d4

tt 의 데이터는 hex 값이니 이것으로 바이너리로 변환하여 out.dat 로 기록하라는 것이다.
그리고 out.dat 를 살펴보면 제대로 변환된 것을 확인할 수 있다. 막상 변환하고 보니 실행파일
형태로는 보이지 않는 어떤 임의의 값으로 추정된다.

# xxd out.dat
0000000: c0c6 bd13 a42e 8523 cd25 bbe5 493e 09cb  .......#.%..I>..
0000010: 9333 c7a0 6e4a 0894 c7a5 82c1 66b1 93ba  .3..nJ......f...
0000020: c68e e500 5f64 114e f59f 630f 1b16 4d51  ...._d.N..c...MQ
0000030: 956c e802 f380 b4e7 e685 2b5d 0f72 a6c8  .l........+].r..
0000040: e896 b414 2c80 b635 6f2d 75fe bf48 03dc  ....,..5o-u..H..
0000050: 3d12 2eaf 0cce 0536 b01a 7211 997b 770e  =......6..r..{w.
0000060: 580b f8f0 89a9 4dee 5be0 a4ff 9b5c f1a0  X.....M.[....\..
0000070: 8d36 8ea6 a6e3 7302 bae3 b68f 19ab a246  .6....s........F

SFK 에는 파일을 다루기 위한 다양한 기능이 많은데, 패킷 관련한 같은 작은 기능도 있다.
예를 들어 아래명령을 보면

# ./sfk-linux.exe udpdump
sfk udpdump [-showle] [...] port

   create human-readable hexdump of UDP socket input,
   for debugging of UDP network applications.

   options:
      -showle  highlights line ending characters CR and LF.
      -wide    dumps 32 input bytes per line.
      -lean    dumps 16 input bytes per line.
      -echo    echo received packets back to sender.
      -pure    lists flat hex characters:
               53464B2D544553540D0A
      -hexsrc  lists hex comma separated values:
               0x53,0x46,0x4B,0x2D,0x54,0x45,0x53,0x54,0x0D,0x0A,
      -decsrc  lists decimal comma separated values:
               83,70,75,45,84,69,83,84,13,10,
      -flat    no hexdump at all, dump characters as they come.
      -nohead  does not show the "received n bytes" message.

   example:
     sfk udpdump 5000
        waits on port 5000 for incoming udp packages.

그렇다, UDP 데이터를 덤프하기 위한 기능을 제공한다. 아래는 UDP 덤프를 하는 것인데 5000 번 포트로
ECHO 기능을 수행하는 것이다. 에코기능이라 하면 받은 데이터를 그대로 다시 리턴해 주는 것이다.

# ./sfk-linux.exe udpdump -echo 5000
[waiting on port 5000 for data.]
[received 21 bytes:]
 >30332030 32203031 20303020 30302030< 03 02 01 00 00 0 00000000
 >30203131 0A<                         0 11.            00000010
[echoing back]

위와 같은 결과를 받았는데, 전송한 것은 아래와 같다.

# echo "03 02 01 00 00 00 11" | nc -vv -u localhost 5000
localhost [127.0.0.1] 5000 (?) open
03 02 01 00 00 00 11
^C sent 21, rcvd 21

로컬호스트 5000 번으로 03 02 01 00 00 00 11 을 전송하니 그대로 다시 돌아왔다. 이런 기능은 애플리케이션
개발이나 기타 용도로 사용하는데도 유용할 것이다.

간단히 HTTP 서버 동작을 하는 기능도 있다. httpserv 옵션을 사용하면 되는데, 기본 포트를 80 번으로 바인딩 하려고 하였지만 이미 사용중이어서 다른 포트인 8080 으로 리스닝을 시도한다.

# ./sfk-linux.exe httpserv
note : cannot bind on port 80, using alternative port 8080.
SFK Instant HTTP Server. For help, type "sfk httpserv -help".
Waiting on port 8080.
^[[A> connect from 127.0.0.1
> GET /test HTTP/1.0

자, 8080 으로 접속하여 시도해 보니, 역시나 접속이 잘 된다.

# telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test HTTP/1.0

HTTP/1.1 404 no such file

404 no such file: test
Connection closed by foreign host.

아까 위에서 udpdump 를 보았는데, tcpdump 도 있다. UDP 가 아닌 TCP 다.

# ./sfk-linux.exe tcpdump 5000
waiting on port 5000 for connections.
[got connection]
[received request from back with 13 bytes:]
 >54455354 202C2048 4148410D 0A<       TEST , HAHA..    00000000
[received request from back with 1 bytes:]
 >04<                                  .                00000000

# telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
TEST , HAHA
^]
telnet> quit
Connection closed.

이번에는 다른 것으로 로컬호스트 5000 번에 접속하여 GET 요청을 하였다. 이때, Host 필드도 주어
패킷인사이드를 지정하였는데,  앗!! 패킷인사이드 블로그 정보가 출력된다.
분명 로컬호스트로 접속하였는데 어찌. 정보가~ 출력되는가.

# telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Host:packetinside.com

HTTP/1.1 200 OK
Date: Tue, 08 Jun 2010 02:39:36 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8

2c38
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Packet Inside/?ㅽ듃?뚰겕 ?⑦궥遺꾩꽍 釉붾줈洹?/title>
<link rel="stylesheet" type="text/css" href="http://rs.textcube.com/service/blog/style/blogDefault.css" />
<link rel="stylesheet" type="text/css" href="http://fs.textcube.com/blog/5/58149/skin/1/style.css" />

이렇게 가능한 것은 forward 기능을 사용하여 패킷인사이드로 트래픽을 포워드 시켰기 때문이다.

# ./sfk-linux.exe tcpdump 5000 -forward packetinside.com:80
waiting on port 5000 for connections, to forward to packetinside.com:80.
[forward-connected to packetinside.com:80]
[received request from back with 16 bytes:]
 >47455420 2F204854 54502F31 2E310D0A< GET / HTTP/1.1.. 00000000
[forwarded 16 bytes]
[received request from back with 23 bytes:]
 >486F7374 3A706163 6B657469 6E736964< Host:packetinsid 00000000
 >652E636F 6D0D0A<                     e.com..          00000010
[forwarded 23 bytes]
[received request from back with 2 bytes:]
 >0D0A<                                ..               00000000
[forwarded 2 bytes]
[received reply from front:]ec]
 >48545450 2F312E31 20323030 204F4B0D< HTTP/1.1 200 OK. 00000000
 >0A446174 653A2054 75652C20 3038204A< .Date: Tue, 08 J 00000010
 >756E2032 30313020 30323A34 303A3332< un 2010 02:40:32 00000020
 >20474D54 0D0A5365 72766572 3A204170<  GMT..Server: Ap 00000030
 >61636865 0D0A436F 6E6E6563 74696F6E< ache..Connection 00000040
 >3A20636C 6F73650D 0A547261 6E736665< : close..Transfe 00000050
 >722D456E 636F6469 6E673A20 6368756E< r-Encoding: chun 00000060

이외, 파일의 MD5 기능이나

# ./sfk-linux.exe md5 readme.txt
683e317301cbb32e942f0f7cc2e958d5        readme.txt

HEX 덤프를 하여 보거나

# ./sfk-linux.exe hexdump readme.txt
readme.txt :
 >74686973 20697320 74686520 73666B20< this is the sfk  00000000
 >62696E61 72792066 6F72206C 696E7578< binary for linux 00000010
 >2E0D0A0D 0A2D2020 706C6561 73652072< .....-  please r 00000020
 >656E616D 6520746F 20277366 6B272062< ename to 'sfk' b 00000030

파일의 문자열 정보등을 볼 수가 있다.

# ./sfk-linux.exe strings bin.dat

SFK 는 너무나 많은 기능을 가지고 있어서, 파일 데이터를 다루는데 있어서는 부족함이 없을 것이다.
이름에서 말해주는 것과 같이 파일을 다루는 분석을 수행한다면 필요한 도구가 될 것이라 생각한다.

From Rigel

2010년 6월 25일 금요일

패킷 분석기 웹(Web)속으로 들어가다 - 웹 기반 패킷분석

일전에 클라우드기반의 패킷 저장 창고 및 분석 기능을 제공하는 PCAPR 서비스를 소개한적이 있다. 이번에는 우리가 자주 사용하는 와이어샤크와 같은 패킷분석 화면을 제공해주는 서비스를 소개한다. 간단하게
생각하면, 패킷 분석기가 웹 기반이라고 생각하면 된다.

이름은 CloudShark 이며, 사이트는 아래로 방문하면 된다.

http://www.cloudshark.org/

간단한 구성으로 이뤄져 있는데, PCAP 파일을 선택하여 업로드 하면 아래와 같은 화면을 볼 수 있다.
거의 생김새가 와이어샤크랑 닮았다. 패킷 분석기를 설치하지 못하는 경우와 같은 상황이라면
CloudShark 가 유용하게 이용될지도 모른다. 또는 모바일 폰에서도 브라우징이 되는 경우도 가능할 것이다.
패킷 분석기가 없다고 걱정할 필요 없이, 웹 기반의 클라우드샤크 서비스를 이용할 수 있는 것이다.

그러나, 아직 제한은 있다. 파일 업로드 사이즈가 512K 로 제한되어 있다. 또, 패킷 데이터가
해당 서비스에 업로드 되므로 민감한 내용이 포함된 패킷 데이터라면 올리지 않는 것이 좋겠다. 현재
이 서비스는 tshark 를 이용하고 있다고 한다. (역시 와이어샤크!)
그러므로 tshark 에서 읽기가 가능한 패킷 파일이라면 마찬가지로 서비스가 가능하다는 것이다.
지금은 단순히 뷰 하는 정도의 서비스이다. 패킷 데이터를 자동으로 분석해 내주는 시스템은 아니니
착각하지 않도록 :-)

2010년 6월 23일 수요일

와이어샤크를 윈도우 서비스로 등록하여 자동실행 하기

컴퓨터가 부팅되면서 자동으로 패킷 캡쳐를 시작하게 할 수 없을까? 하는 의문에서 이번 포스팅을
작성하였다. 필자가 궁금하였다기 보다, 주변에서 이를 궁금해 하는 경우를 봤고 생각을 하다 보니
다음과 같이 방법이 압축되었다.

우선, 가장 간단한 방법으로는 앞서 포스팅에서 바로가기 아이콘을 만드는 경우를 소개했다.
바로가기 아이콘에서 바로 시작되도록 옵션을 조정하면 시작 폴더에 넣어두는 것으로 간단히
해결은 될 것이다.

또 다른 방법은 와이어샤크를 윈도우 서비스 형태로 등록하는 것이다. 그렇다면 백 그라운드로
자연스럽게 동작시킬 수 있으므로 좀더 Smooth 한 동작이 된다.
그런데 수동으로 직접 동작시키는 방법 말고, 자동으로 이렇게 시작시켜야 할 필요가 있을까?
각자 필요에 의해서 다르겠지만, 몇몇의 경우는 유용할 것 같다. 시스템 한대를 패킷 덤프 용도로
사용하는 경우 라든지 또는 윈도우 시스템이 다 부팅된 후 실행하는 것이 아니라, 서비스로 미리
시작시켜 악성코드와 같은 분석시에 먼저 패킷 덤프를 하는 경우다. 예를 들어, 악성코드 분석을
하는데 악성코드가 부팅되면서 자동으로 올라오게 되어 있다. 시작되기 전에 패킷 형태를 보고 싶을때
이런 경우 서비스로 등록시키면 원하는 패킷 데이터를 얻을 수도 있다.

물론 이것은 악성코드의 동작 형태에 따라 달라지기 때문에 모든 경우에 해당은 안된다. 다만
하나의 방법으로 이런것도 있구나 하구 머리속에 담아두자

자 서두는 이쯤에서 줄이고, 서비스로 등록하는 방법에 대해 알아보자.
일단 instsrv.exe, srvany.exe 파일이 필요하다. 이 파일은 윈도우 리소스 키트에 포함된 것으로
다음의 경로를 통해 다운로드 받는다.


다운받은 파일을 설치하면 윈도우의 프로그램 폴더 밑에 리소스 키트 폴더가 생성되어 있다.
이 안에 해당파일이 들어 있다. 동작의 편의를 위하여 두 파일을 윈도우 시스템 폴더인

c:\windows\system32 아래에 복사해 넣어둔다.

그리고 instsrv 로 서비스를 등록한다. 아래 옵션은 WireSharkService 라는 이름으로 등록하는 것이다.

C:\Play>instsrv WireSharkService "c:\windows\system32\srvany.exe"
The service was successfuly added!

Make sure that you go into the Control Panel and use
the Services applet to change the Account Name and
Password that this newly installed service will use
for its Security Context.

WireSharkService 라는 이름으로 서비스를 등록하는데 기본 이미지는 srvany.exe 가 되는 것이다.

등록 후, 윈도우의 시작->실행에서 regedit 를 실행하자! 즉 레지스트리 편집기를 실행하게 되는 것이다.
그리고 다음 경로의 레지스트리를 찾아 들어간다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WireSharkService


그리고 WireSharkService 에서 오른쪽을 클릭하여 "새로만들기 -> 키(K)" 를 선택하고
이름을 Parameters 로 저장한다.
다음 Parameters 에서 오른쪽을 선택하고 "새로만들기 -> 문자열 값" 을 선택후
Application 이름을 만들고 값 데이터로 아래와 같이 넣어준다.

C:\Program Files\Wireshark\tshark.exe -w c:\play\service.pcap

앞서 instsrv 를 통해 만든 서비스에 파라미터를 만들고 실행될 애플리케이션으로 tshark.exe 를 지정한 것이다.
tshark.exe 의 경로는 각자 시스템에 맞게 설정하고 사용한 옵션은 -w 로 c:\play 아래에 service.pcap 으로 저장되게 하였다. 결국은 srvany.exe 가 tshark 를 자식 프로세스로 형태로 실행해 주는 것이다.

무한정 패킷 데이터를 저장할 수 없으므로 다음과 같은 옵션을 사용하면 더욱 좋다

C:\Play>net start WireSharkService
WireSharkService 서비스를 시작합니다..
WireSharkService 서비스가 잘 시작되었습니다.

서비스를 만들었으면 net 명령어로 서비스를 쉽게 실행시킬 수 있다. 실행되고 -w 로 지정한 경로에
보면 파일이 존재할 것이다. 바로 패킷 파일이 저장이 되고 있는 것이다. 그러면 서비스로 등록되었으니
부팅 후에도 자동 실행이 가능하다. 만들어진 서비스는 제어판->관리도구->서비스 에서도 확인하여
쉽게 볼 수 있다.

그런데 여기서 잠깐! 그러면 무작정 데이터를 저장할 것인가. 앞서 소개한 와이어샤크의 옵션을 기억한다면
나눠서 저장하는 것도 가능하다라는 것이 머리속에 스치지 않는가 ? 아래 옵션을 추가로 사용하면 1메가 단위로 3개 파일로 저장이 이뤄진다. filesize 의 값은 1024 바이트 즉, 1K 기준이다.

 -b filesize:1024 -b files:3

와이어샤크의 GUI 를 실행해 보면 패킷 캡쳐 시작 전에 여러 옵션을 지정할 수 있는데, 그것이 커맨드형태로
사용할 수 있는 것으로 보면된다. 윈도우 환경의 저장옵션은 아래 글을 참고한다.


이외 캡쳐 필터를 사용해 tcp 만 저장한다든지 캡쳐 필터 옵션을 사용할 수 있다. 캡쳐 필터 옵션도 여기서
찾아볼 수 있다.

지금까지 살펴본 것으로 어렵지 않게 와이어샤크를 서비스로 등록하여 사용할 수 있을 것이다.
추가적으로 sc.exe 를 사용하여 서비스 정보를 더 알아볼 수 있는데 그냥 참고하길 바란다.

sc.exe 는 ftp://ftp.microsoft.com/reskit/win2000/sc.zip 에서 받을 수 있다.

C:\Play>sc query WireSharkService

SERVICE_NAME: WireSharkService
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE,PAUSABLE,ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

sc.exe 로 서비스도 만들수 있는데, 왜 이걸로는 안될까? 다음과 같이 사용하면 일단 서비스로 만들 수 있다.

C:\Play>sc create WireSharkService binPath= "C:\Program Files\Wireshark\tshark.exe -w c:\play\test.pcap -q" DisplayName= "WireShark Service"
[SC] CreateService SUCCESS

그러나 실행을 해보면 정상적 실행이 안될것이다. 앞선 경우에서는 srvany.exe 를 통해서 실행된 것이고
이것은 직접적으로 와이어샤크를 통해 실행한 차이가 있다. 만약, 아파치 웹 서버와 같이 서비스 모드를
지원한다면 아래와 같이 사용이 가능하다.

C:\Play>sc.exe create ApacheService
   binPath= "C:\local\apache\bin\httpd.exe -k runservice"
   DisplayName= "Apache Server"

[SC] CreateService SUCCESS

이건 서비스를 만드는 또 다른 방법을 참고 차원에서 소개한 것이므로, 와이어샤크를 이용한 경우에는
srvany.exe 를 이용하는 방법을 따르길 바란다.

P.S tshark 에 대해서는 시간이 주어지는 대로 자세하게 소개할 것이다. :-)

[참고자료]
1. How to Create User-Defined Service
2. Tshark Manual
3.와이어샤크 시작을 '바로가기'를 통해 더욱 쉽게 실행해 보자!

2010년 6월 22일 화요일

윈도우 7에서 텔넷(telnet) 기능 사용하기

무사히 컨퍼런스를 잘 마치고 돌아왔습니다. :-)  이제 다시 포스팅을 시작해야죠.
오늘은 어느 웹 사이트를 방문하다 분석이 필요해서 telnet 을 사용하려고 하는데, 시스템에 없어서
다른 분들도 이와 같은 상황에 많이 부딪히지 않을까 하여 패킷분석과는 조금 다른 얘기를 꺼냅니다.

회사에서의 작업은 윈도우 XP 를 사용하는데, 집 데스크탑은 윈도우 7을 쓰고 있지요. 그냥 거의 기본적으로만
사용을 하고 있습니다. 많은 작업을 안 하다 보니까요. 그런데 도스창을 열고 telnet 을 사용하려고 하니
왠걸 없다고 나오네요. 네트워크 분석 작업을 하다보면 telnet 같은 도구는 유용하게 많이 쓰이거든요.

찾다보니 윈도우7 에서는 아래와 같이 telnet 기능을 활성화 시킬 수 있습니다.
- 제어판 이동
- 프로그램 선택
- 프로그램 및 기능에서 윈도우 기능 사용/사용 안 함 선택
- 리스트에서 텔넷 클라이언트 선택후 확인

선택 화면은 아래와 같습니다. 윈도우7 정품 구매 사용자니 이 화면 정도는 올려도 되겠죠? :-)


윈도우 7 사용자분들은 참고하세요. 아 그리고 제가 웹 사이트를 분석하는 과정에서 설치했다고 했죠.
브라우저에서 악성 페이지라 나타나 직접 확인해 보는 과정에서 사용했답니다. 이 얘기는 조만간
다시 포스팅할께요. 이전에 소개한 압축된 웹 페이지와도 연관되는 내용입니다.

From Rigel

2010년 6월 15일 화요일

네트워크 트래픽에서 많이 보이는 SSDP 프로토콜의 정체는?

패킷 분석을 하다보면, SSDP(Simple Service Discovery Protocol) 프로토콜을 보는 경우가 많다.
M-SEARCH * HTTP/1.1, NOTIFY * HTTP/1.1 과 같은 것이다. 생긴것은 HTTP 프로토콜과 같은데
SSDP 프로트콜이라 나온다. HTTP 로 필터를 걸어서 보아도 나타난다.
이것은 UPnP 구성의 일부이다. UPnP 는 Universal Plug and Play 로 네트워킹 프로토콜이다. UPnP의
목적은 네트워크 상에서 디바이스들이 쉽게 연결이 될수 있도록 하고자 함이다.  예를들어, UPnP 를 이용한
시나리오를 가정하면 티비에서 쇼핑 관련한 상품이 나오고 광고 메시지가 나오고 있다. 이때 해당 메시지를
클릭하면 관련 정보가 이메일로 전달되고, 프린터는 50% 할인 쿠폰을 출력한다. 이건, UPnP 포럼에 있는
제품 시나리오 중에 하나이다. 주로 UPnP 는 가정의 홈 네트워킹을 타겟으로 하고 있다.

자세한 내용은 UPnP 포럼인
http://www.upnp.org 를 방문해 보기 바란다.

우리가 UPnP 를 지금 자세히 알고자 함은 아니고, SSDP 를 알아가는 과정에서 나오는 것이다. SSDP 는
유니캐스트와 멀티캐스트를 이용하며 기본적으로 UDP 1900 에 239.255.255.250 멀티캐스트 주소를 이용한다.
HTTP 와 완전히 똑같은 아니며, 그 형태는 크게 비슷하다. 큰 차이점은 TCP 를 이용하는 것이 아니라
UDP 를 사용하는 것이다. SSDP 의 시작은 다음 3가지 중에 한개로 시작된다.
  • M-SEARCH * HTTP/1.1
  • NOTIFY * HTTP/1.1
  • HTTP/1.1 200 OK
SSDP 의 세부적인 사항을 알고 싶다면 다음 문서가 도움이 될 것이다.
http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf

SSDP 의 세부적인 내용은 여기서 더 설명하지는 않도록 하겠다. 자. 패킷을 분석하는 관점에서 보면
여러 다양한 트래픽 정보가 쏟아져 나오기 때문에 이런것들이 무엇인지 정확히 알아야 분석이 가능한 것이다.
내가 알고 있는 형태의 트래픽이면 "아 ~ 이건 이번 분석과 관련이 없는거야" 하고서 쉽게 넘어가지만
처음 보고, 본인이 알수없는 형태의 트래픽에 부딪히면 분석하는데 시간이 많이 소요된다.

이미 앞서 언급했지만, 불필요한 패킷은 제외하고 분석을 시작하는 것이 빠르게 원인파악을 할 수 있는
지름길이므로 평소에 본인이 사용하는 네트워크 환경에는 어떤 트래픽들이 흐르고 있는지 파악해 보고
알아두는 것이 좋다. SSDP 를 소개한 이유도 내부 네트워크 상에서 발생되는 트래픽의 한
종류이고 많이 보아왔을 것이라 판단되었기 때문이다.  그렇다면 이런것은

http and !(udp.dstport == 1900) 와 같이 필터를 적용하면 제외하고 HTTP 프로토콜을 볼 수 있다.

2010년 6월 12일 토요일

패킷인사이드 주인장, 1주일간 잠시 자리 비웁니다 :-)

6월13일부터 18일까지 미국 플로리다주의 마이애미에서 열리는 보안컨퍼런스인 FIRST(Forum of Incident Response and Security Teams) 에 참석합니다.

해당 기간에는 패킷인사이드에 포스팅하기가 쉽지 않을것 같은데요,1주 넘게 혹시 포스팅이 되지 않더라도 이해해 주세요.

참고로 FIRST 는 국제침해사고대응팀 협의체로 전세계의 많은 기업,
정부 기관들이 가입되어 있습니다. 매년 한차례식 연례 정기 컨퍼런스가 열리고 있고요, 소규모로 기술 세미나도 열립니다. 관심있는 분들은
http://www.first.org 에 방문해 보세요. 한국에서는 총 6팀 기관이 정식 멤버로서 활동하고 있답니다.

한국에 돌아오는 그 날까지 모두 건강하세요!

2010년 6월 10일 목요일

Ngrep 을 활용한 패킷 데이터 추출

*NIX 환경을 접해본 사용자라면 grep 이라는 도구가 익숙할 것이다. 주어진 패턴에
매칭되는 것이 있으면 출력을 해주는 기능이다. 정규식 표현도 가능하고, 상당히
많이 사용되는 도구중에 하나이다. 이 grep 을 네트워크 기준에서 사용할 수 있는 것이
ngrep 이다. 말 그대로 network grep 이다. grep 과 비슷한 기능을 수행하는데,
다만 네트워크 환경에서 유용하게 사용할 수 있도록 디자인 된 것이다. 이더넷 인터페이스
에서 모니터링을 하고 PCAP 파일에서 grep 을 수행하고, 대충 이런 기능이 있다는 것만
들어도 유용하게 사용할 수 있지 않을까 생각이 들지 않나?

다운로드는 다음의 사이트에서 받을 수 있다.


세부적인 옵션별 사용법은
# man ngrep 을 통해 살펴보면 되고, 몇 가지 사용예제를 소개하겠다. 아 참고로,
윈도우 환경에서도 사용이 가능하다!

와이어샤크와 같은 도구이외 간단하게 네트에서 발생되는 상황 파악 및 원하는 패턴이
감지되는지 사용하기 유용할 것이다.

사용법은 간단한데

ngrep [옵션] [매칭할 패턴] [ BPF 스타일 Filter ] 와 같다.

예를 들어, 매칭할 패턴없이 포트 80번에 대해서 모니터링 하고자 한다면 우리가 흔히
앞서 소개한 와이어샤크 캡쳐 필터 형태와 같이 port 80 을 사용하면 된다.

# ngrep port 80
interface: eth0 (59.6.XX.XX/255.255.255.192)
filter: (ip or ip6) and ( port 80 )
####
T 59.6.XX.XX:58339 -> 66.199.XX.XX:80 [AP]
  POST /oms.php HTTP/1.0..Host: 66.199.2XX.XX..User-Agent: XML..Content-Length: 129..Co
  ntent-Type: application/x-www-form-urlencoded..Via: 1.0 localhost (squid/3.0.STABLE8).
  .
#
T 59.6.XX.XX:58339 -> 66.199.XX.XX:80 [AP]
  data=hv7ROPo0hN6TT3OuFat2j31FP3UE2uVDcXD903ulBKZyB8bnVohEDNW0mJT+0Jnplbyi6nsSKJLPQNe5S
  Y1MWNROxBqZWIbwZFfGpfBRgQZ==
###
T 66.199.XX.XX:80 -> 59.6.XX.XX:58339 [AP]
  HTTP/1.1 200 OK..Date: Tue, 08 Jun 2010 23:43:32 GMT..Server: Apache/1.3.42 (Unix) mod
  _gzip/1.3.26.1a PHP/5.2.12 with Suhosin-Patch..X-Powered-By: PHP/5.2.12..Expires: Mon,
   26 Jul 1997 05:00:00 GMT..Last-Modified: Tue, 08 Jun 2010 23:43:32 GMT..Cache-Control
  : no-store, no-cache, must-revalidate..Cache-Control: post-check=0, pre-check=0..Pragm
  a: no-cache..Connection: close..Content-Type: application/xml; charset=UTF-8....z+Xaau
  gyuuSvEib0Hft72iB+UUo05ulQZyzowC3iRvgzDcn2XINUYfSW4KKZ+5jz3Pyo9WQFPJGKB4+/VJMKWNcA30yS
  TObgOxLJ47MdjTxvCMPjHS/4r6R02nTDNcNa8AxRgCIoeYJ5tcNdWXOj/dE9h2BsyKRG+ebP7f6tygdCulsi1+
  s3P1ACgUub2l+iwOIQuBJ4yEZ2tcfNTinyB8URXOISwNk7JY/lYrsi3xdHQxUblHlhvual7F6wiaGB9wuOn3vO
  EL9ClMVEBWtNc7qd5DDpU/fJlfxRl1KGNcZHWrYNod+reJA6iS8LVQgC7U2NHK4wd60DXi5ls5rGtXq86I4cJC

#######^Cexit
15 received, 0 dropped

이번에는 우리에게 익숙한 PCAP 파일에서 원하는 패턴을 찾아보자. fake.pcap 에서 GET 이
들어가 있는 문구를 찾는 것이다.

# ngrep -I fake.pcap GET
input: fake.pcap
match: GET
###############
T XX.XX.3.101:1040 -> 66.249.XX.XX:80 [AP]
  GET / HTTP/1.1..Accept: */*..Accept-Language: en-us..Accept-Encoding: gzip, deflate..User-Ag
  ent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)..Host: google.com..Connection:
  Keep-Alive..Cookie: PREF=ID=8fa388f82bd5ab0a:TM=1274085704:LM=1274085704:S=w1R5HKZJTTO-Gmsf.
  ...
########
T XX.XX.3.101:1041 -> 66.249.XX.XX:80 [AP]
  GET / HTTP/1.1..Accept: */*..Accept-Language: en-us..Accept-Encoding: gzip, deflate..User-Ag
  ent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)..Cookie: PREF=ID=8fa388f82bd5ab
  0a:TM=1274085704:LM=1274085704:S=w1R5HKZJTTO-Gmsf..Connection: Keep-Alive..Host: www.google.
  com....
###################
T XX.XX.3.101:1042 -> 66.249.XX.XX:80 [AP]
  GET /ig/f/qXu29BUALEY/intl/ALL_kr/homepage_v3.css HTTP/1.1..Accept: */*..Referer: http://www
  .google.co.kr/..Accept-Language: en-us..Accept-Encoding: gzip, deflate..User-Agent: Mozilla/
  4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)..Host: www.google.co.kr..Connection: Keep-Al
  ive..Cookie: PREF=ID=b47af622bcc79368:U=11de8e3df8e3084c:NW=1:TM=1274085705:LM=1274085706:S=
  Wcbcl0vOfuoFL6of; NID=34=JYDtXd2p_OuHGvzlI-nQIq6KMwtHFAb4wr81asW6ODKZa_AOu1ixpIzTvtmnjQ-Qqux
  py-ASgNd8a4_-cKbX2Pn24v04t3h34t23ZwBE69sH_-c-M4Mf2F-HNpPccbYB....


GET 명령어가 아니라 이번에는 HEX 값을 찾아보자. 찾고자 하는 패턴은 MS DOS 파일의
매직 헤더진 0x4d5a 이다. 아래는 EXE 파일의 헤더 구조의 구조체로 제일 첫번째 오프셋에
있는 signature 부분을 탐지하고자 하는 것이다. HTTP 을 통해서 무언가 윈도우 EXE 파일을
받는다면 이 패턴이 포함되어 있기 때문이다. 2바이트 밖에 안되는 작은 값이라서
실질적으로 많은 결과값이 나올 수 있다. 단지, 여기서는 하나의 예로서만 소개하겠다.

struct EXE {
  unsigned short signature; /* == 0x5a4D */
  unsigned short bytes_in_last_block;
  unsigned short blocks_in_file;
  unsigned short num_relocs;
  unsigned short header_paragraphs;
  unsigned short min_extra_paragraphs;
  unsigned short max_extra_paragraphs;
  unsigned short ss;
  unsigned short sp;
  unsigned short checksum;
  unsigned short ip;
  unsigned short cs;
  unsigned short reloc_table_offset;
  unsigned short overlay_number;
};

-x 옵션은 ASCII 뿐만 아니라 HEX 형태로도 출력을 보여주는 것이고 -X 는
텍스트 패턴 매칭이 아니라 HEX 값으로 패턴 매칭을 해준다.

# ngrep -I fake.pcap -xX '0x4d5a' port 80
input: fake.pcap
filter: (ip or ip6) and ( port 80 )
match: 0x4d5a

이미지에서와 같이 MZ(0x4d5a) 라는 문구가 보이고
"This program cannot be run in DOS mode." 패턴은 윈도우 실행파일에서
많이 보이는 것이다. 대충 값을 보면 아, 윈도우 실행파일이구나 하고 추측이 가능하다.
(16진수인 HEX 를 표현할때 앞에 0x 라고 붙여준다)

그런데, MZ 로만 잡기에는 너무 많이 나오고 범위를 좀더 좁혀보자. HTTP 에서
다운로드 받는 다는 가정하에, 그렇다면 보통 HTTP 의 응답헤더 형태 기준으로 보면
응답헤더와 그리고 파일이 이어지는데. 이때 앞쪽에 개행 문자인 0x0d0a 가 붙는 경우가
일반적이다. 그래서 패턴을 0x0d0a 로 까지 넓혀 사용하면 출력되는 내용을 좀더
확실하게 좁힐 수 있다.

# ngrep -I fake.pcap -xX '0x0d0a4d5a' port 80

이외 정규 표현식을 사용하여 효과적으로도 쓸수 있는데, 아래 예는 GET, POST, HEAD, CONNECT
가 들어가 있는 패턴만을 찾는 것이다. 찾을때는 -d 옵션으로 디바이스인 eth0 을 지정했다.


# ngrep -qd eth0 '^(GET|POST|HEAD|CONNECT)' 'tcp'
interface: eth0 (59.6.XX.XX/255.255.255.192)
filter: (ip or ip6) and ( tcp )
match: ^(GET|POST|HEAD|CONNECT)

T 59.6.XX.XX:57348 -> 208.73.XX.XX:80 [AP]
  POST /icons.php HTTP/1.0..Accept: */*..Content-Type: application/x-www-form-urlencoded..User
  -Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)..Host: images-base.com..Content-L
  ength: 265..Pragma: no-cache..Via: 1.0 localhost (squid/3.0.STABLE8)..X-Forwarded-For: 111.3
  .1.57..Cache-Control: max-age=259200..Connection: keep-alive....

T 59.6.XX.XX:54712 -> 208.73.XX.XX:80 [AP]
  POST /icons.php HTTP/1.0..Accept: */*..Content-Type: application/x-www-form-urlencoded..User
  -Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)..Host: images-base.com..Content-L
  ength: 265..Pragma: no-cache..Via: 1.0 localhost (squid/3.0.STABLE8)..X-Forwarded-For: 111.3
  .1.57..Cache-Control: max-age=259200..Connection: keep-alive....

이외 -O 옵션을 통해 pcap 파일로 저장이 가능하다.

# ngrep -O test.pcap port 80

다양한 기능을 지원하고 있어 네트워크에서 흘러 다니는 특정 패턴만을 찾는 경우에는
유용하게 사용할 수 있을 것이다. 전체 패킷을 다 감시하면서 저장하는 것이 아니라,
이런 패턴이 존재하는지 네트워크 상에서 쉽게 검증이 가능하다.

2010년 6월 9일 수요일

IPv4 주소 신규 할당 2011년10월 전후 중단 예상

이전 포스팅에서 IPv6 전환 준비에 대해서 소개한 적이 있다.
아직 읽어보지 못한 분들이라면 아래 글을 한번 참고하길 바란다.

우리가 사용하고 있는 IPv4 신규 주소 할당이 2011년 10월 전후로 중단이 예상되기 때문에,
빠른 준비가 필요하다. 그렇기 때문에 앞으로도 IPv6 와 관련한 글을 지속적으로 게시할 예정이다.
자, 일단 IPv4 주소가 얼마나 빠르게 소진되고 있는지 보고 싶다면 다음 링크를 클릭해
보시기 바란다.  자세하게 소개하고 있으니 IPv6 담당자 분들에게는 유용한 자료가 될 것이다.


또는 한국인터넷진흥원 홈페이지에 접속해도 정보를 얻을 수 있다.


옆 도표는 인터넷진흥원의 화면을 담은 것이다. 현재 예상되는 시점은 2011년 8월로 전체중에 6% 만이 남았다. 한국의 IPv4 주소 현황을 보면 전세계에서 5위가 될만큼 사용량이 크다.

이제 주소가 6% 밖에 남지 않았다는 것을 보면,
빨리 준비를 해야 하지 않을까 하는 생각이 들지 않나요? 이미 인터넷진흥원에서도 IPv4 주소 신규할당 중지 시점과 관련해 주요 ISP 에 공지를 내린것으로
알고 있다. 그만큼 이제는, 과거에 우리가 IPv6 아직도
멀었어 하고 생각만 하던 시기가 성큼 다가온 것이다.

어찌되었든 2011년 중/하반기에는 IPv4 주소 신규할당이 중지될 것으로 예상된다.

최소한 네트워크 장비나 기타 도입이 예정되어 있다면 IPv6 준비가 되어 있는 제품을 구매하여야 할 것이고, 서비스나 프로그램 배포시에도 IPv6 환경을 고려하여야 한다. IPv6 로의 전환이 생각보다 많은 자원이 필요하지는 않다. 구글의 경우만 해도 많은 서비스들이 IPv6 환경에 대응하고 있고, 구글이 말하기에도 생각보다 아주 큰 작업이라고는 하지 않고 있다.

앞으로 패킷 인사이드에서도 IPv6 를 준비하고자 기회가 될때마다 소개하려고 한다. 이제 패킷분석도 계속 보아오던 32비트의 IPv4 주소가 아니라 128 비트의 복잡한 주소를 보아야 한다. 지금 주소도 복잡한데, 이제 더 긴 주소를 보아야 하니 눈이 더 침침해 질것 같다 :-)

From Rigel

[참고자료]
1) IP 주소 관련, 인터넷진흥원 홈페이지
2) IPv4 할당과 관련한 동향 정보를 얻을 수 있음

2010년 6월 8일 화요일

맥(Mac) OS X 기반의 패킷 분석기, 그 이름은 코코아!

서핑을 하다 맥 기반의 패킷 분석기가 있어 소개한다. 이미 맥(Mac) 을 많이 사용하고 있는 유저라면
벌써 알고있을지도 모른다. 하지만, 여기에 차곡차곡 패킷분석 관련을 글을 소개하고 있으니 빠질 수는 없다.

이름은 귀엽게. 코코아 패킷 분석기이다. 앞서 소개한 것과 같이 Mac OS X 기반에서 동작하고 PCAP 패킷 포맷을 읽고, 캡쳐 및 저장을 할 수 있다. 기본적인 패킷 캡쳐, 필터 기능, 플러그인 기능등이 있다.
와이어샤크에 비하면 분석 기능은 부족해 보인다. 맥 환경이 없어 직접 코코아를 사용해 볼 수는 없어
자세히는 언급할 수 없지만, 제공하는 스크린샷을 통해 통해 보면 대충 기능 파악은 될 것이다.

[CPA 사이트]
http://www.tastycocoabytes.com/cpa/

CPA 는 Cocoa Packet Analyzer 의 약자이다. 맥 환경에서 사용해본 분이 계시다면 살짝 댓글로 의견을
남겨주세요. 또는 맥 기반의 다른 프로그램을 공유해 주셔도 좋습니다 :-)

2010년 6월 5일 토요일

패킷 분석을 위한 패킷파일(PCAP), 여기서 구해보세요!

일전에 패킷 파일을 구하기 위한 글을 포스팅 한적이 있다. 네트워크 분석이라는 것은 해보고 싶은데,
내 컴퓨터에서만 패킷파일을 덤프하여 보자니 흥미롭지도 않고. 이럴때, 다양한 형태의 패킷파일을
살펴볼 수 있다면 분석 실력을 키우는데도 큰 도움이 될 것이다.

다음 글을 읽어보지 못한 사용자라면 한번 살펴보기 바란다.

- 패킷 저장창고를 활용해보자
- 네트워크 패킷캡쳐 샘플파일 어디 구할데 없나요?

필요한 패킷파일도 업무 또는 필요에 따라서 많이 달라진다. 범위가 워낙 넓기 때문에 이것은 당연한 것이다.
이전 포스팅에 이어 3군데를 소개하고자 한다.

1) Evil Fingers
보안쪽과 관련한 패킷파일을 구할 수가 있다. 예를 들면, 최근에 이슈가 되었던 Aurora 및 다양한 공격코드
패킷파일을 볼 수 있다. 패킷파일안에 실제 Payload 가 포함되어 있기 때문에 직접 공격코드를 얻을 수 있는 부분도 있겠지만, 그런것 보단 네트워크 관점에서 어떻게 취약점이 이용되고 , 그 과정이 어떻게 되었는지
살펴보며 공부할 수 있기를 바란다.

2) OpenPacket.org
취약점 관련 및 기타 패킷 파일을 얻을 수 있다.

3) PacketLife
네트워크 관련한 패킷 정보를 얻고 싶다면 이곳에서 찾아보시라. 다양한 프로토콜별 패킷 파일들을 찾아볼 수 있다.

항상 머리속으로만 기억하려니 자꾸 잊어버리고, 이번 기회를 통해서 정리하니 앞으로 머리속에서는 지워도 될것 같다 :-)

여하튼 이제 앞서 소개한 포스팅과 이번에 언급한 정보만 참고해도 왠만한 패킷파일은 찾을 수 있을 것이다. 이제 패킷 분석을 하기 위한 총알은 충분해 진 것 같다. 패킷파일이 없어서 못 한다고는 하지 못할 것이다. ^..^

패킷 분석의 세계로 Go~Go~

2010년 6월 3일 목요일

와이어샤크 시작을 '바로가기'를 통해 더욱 쉽게 실행해 보자!

와이어샤크를 매일 같이 주로 이용하는 분들에게 약간의 팁을 소개하고자 한다. 쉽고 간단하지만,
유용한 방법이 될 수 있다. 와이어샤크 바로가기를 이용해 원하는 기능을 바로 수행하는 것을 만드는 것이다.

실시간 분석화면창을 보는 경우 1) 와이어샤크를 실행하고 2) Capture 를 누르거나 또는 인터페이스를 선택한 후 패킷 캡쳐를 시작한다. 또는 캡쳐 필터 옵션을 주어 사용하기도 한다. 가끔식 사용하는 경우야, 별로 불편하지도 않겠지만 업무의 하나가 된다면 바로가기를 통해 조금은 더 쉽게 실행할 수 있다.

아래 이미지 화면을 보면 바탕화면에 바로가기를 만들어 놓은 것이다. 실시간 분석은 실행하면 바로
해당 인터페이스로 실시간 패킷 분석이 시작되고, 포트 80은 아이콘은 패킷 시작은 동일한데 80번 포트로 한정한 것이다. 즉, Capture Filter 옵션을 적용한 것이다.

첫 번째 예로 실시간 분석 바로가기를 살펴보자.

바로가기 설정은 아주 간단하다. 와이어샤크 바로가기를 만들고, 대상 필드에 실행할 옵션을 넣어주기만 하면 되는 것이다. 바로 패킷캡쳐를 시작하는 것이 -k 옵션이고 -i 는 인터페이스를 지정하는 것이다. 자, 그럼 인터페이스는 어떻게 알 수 있는가 ? 직접 실행시켜서 인터페이스 선택화면에서 인터페이스를 알 수 있다. 하지만 이 보다 더 편한 방법은 -D 옵션을 이용하는 것이다.

C:\Program Files\Wireshark>tshark -D
1. \Device\NPF_{E8D91E83-5F4F-4B62-BBB6-3A7FA9A2404E} (Sun)
2. \Device\NPF_{E849DA84-A4[삭제]BD12-157CFC55BD8B} (NVIDIA nForce MCP Network
ing Adapter Driver)

그러면 -i 뒤에 캡쳐를 원하는 인터페이스를 지정하면 된다. 그러면 바로가기에서 오른쪽 클릭을 하고 속성을 선택하여 대상(T) 이 되는 부분에 아래와 같이 지정하면 된다.

"C:\Program Files\Wireshark\wireshark.exe" -k -i \Device\NPF_{E849DA84-A444-4334-BD12-157CFC55BD8B}

그런데 인터페이스 이름이 길이다. 이때 더 쉽게 사용할 수 있는 방법이 그냥 번호를 기록하는 것이다.

"C:\Program Files\Wireshark\wireshark.exe" -k -i 2

훨씬 더 간단해 졌다 :-)

두 번째 예로, 캡쳐 필터는 어떻게 지정하여야 할까? -f 옵션을 사용하면 간단히 해결된다. -f "port 80" 과 같이 사용하면 80번 포트로만 패킷 캡쳐를 시작할 것이다.
캡쳐 필터는 원하는 대로 아주 다양하게 활용할 수 있을 것이다. 위에서 소개한 예 이외에 와이어샤크에서 지원하는 옵션을 통해 여러분이 수행하고 싶은 형태로 자유롭게 한번 만들어 보자!. 와이어샤크의 커맨드 실행 옵션은 와이어샤크 메뉴얼을 참고하거나 또는 다음 웹 페이지에서 찾을 수 있다.


자 이제 와이어샤크 시작을 더욱 쉽게 한번 만들어보자.