2012년 11월 28일 수요일

Log2Timeline 을 이용한 타임라인 그래프 - 활용편

Log2Timeline 을 이용한 데이터 추출에 대해서 알아보았다. 이번에는 추출한 데이터로 직접 타임라인 그래프를 만들어보자.

우선, 저번 예제에서는 기본으로 CSV 로 추출되는 것을 소개했었고 추출된 CSV 를 이용해 엑셀 같은 곳에서 활용하면 된다. 하지만 이미 언급했듯이 추출된 데이터들을 효과적으로 사용하는데 있어서는 한계가 있다고 했다. 이번 타임라인 그래프도 제한된 화면에 단지 많은 내용이 나타나다 보니 실질적으로 분석가 입장에서는 부족함이 있다.

조금 더 낳은 방법을 추후에 소개하도록 하고, 오늘은 이렇게 사용될 수 있다는 부분을 알아두면 될것 같다. 타임라인 표현에 Simile-Widget 을 사용하였다.  이것을 사용한 이유는 log2timeline 에서 출력 형태로 simile 을 지원해 주기 때문이다.

Simile 위젯에 대한 세부 정보는 다음 사이트를 참고하길 바란다.


http://www.simile-widgets.org/timeline/

사용하기 위해서는 간단히 -o 로 출력 형태를 simile 로 지정해 주면 된다.

# log2timeline -f pcap -o simile -w example.xml timeline.pcap
-----------------------------------------------------------------
      [WARNING]
No timezone has been chosen so the local timezone of this
machine is chosen as the timezone of the suspect drive.

If this is incorrect, then cancel the tool and re-run it
using the -z TIMEZONE parameter to define the suspect drive
timezone settings (and possible time skew with the -s parameter)

(5 second delay has been added to allow you to read this message)
-----------------------------------------------------------------
Start processing file/dir [timeline.pcap] ...
Starting to parse using input modules(s): [pcap]
Local timezone is: Asia/Seoul (KST)
Local timezone is: Asia/Seoul (KST)
Loading output module: simile

example.xml 로 파일이 저장되었다. -z 로 타임존을 지정해 주지 않아서 경고메시지가 나타나고 로컬 컴퓨터의 기본 타임존을 사용하였다. example.xml 파일을 한번 들여다 보자.



화면과 같이 XML 로 구성되어 있는 파일이다.  이벤트의 시간, 타이틀 정보등이 보인다. 이제 이 데이터를 이용해 타임라인을 만들어주기 위한 파일을 만들어야 한다.

다음과 같이 test.html 파일을 만들어 본다.



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <script>Timeline_urlPrefix = "http://static.simile.mit.edu/timeline/api-2.3.1/";;</script>
        <script src="http://static.simile.mit.edu/timeline/api-2.3.1/timeline-api.js?bundle=true" type="text/javascript"></script>
        <script>
        var tl;
        function onLoad() {
        var eventSource = new Timeline.DefaultEventSource();
        var bandInfos = [
        Timeline.createBandInfo({
             eventSource:    eventSource,
    date: "Nov 10 2012 00:00:00 GMT",
            width:          "80%",
            intervalUnit:   Timeline.DateTime.MINUTE,
            intervalPixels: 100
        }),
        Timeline.createBandInfo({
            overview:       true,
            eventSource:    eventSource,
    date: "Nov 10 2012 00:00:00 GMT",
            width:          "20%",
            intervalUnit:   Timeline.DateTime.HOUR,
            intervalPixels: 200
        })
        ];
        bandInfos[1].syncWith = 0;
        bandInfos[1].highlight = true;
        tl = Timeline.create(document.getElementById("my-timeline"), bandInfos);
        Timeline.loadXML("/example.xml", function(xml, url) { eventSource.loadXML(xml, url); });
        }

        var resizeTimerID = null;
        function onResize() {
            if (resizeTimerID == null) {
                resizeTimerID = window.setTimeout(function() {
                    resizeTimerID = null;
                    tl.layout();
                }, 500);
            }
        }
        </script>    
    </head>

    <body onload="onLoad();" onresize="onResize();">
        <div id="my-timeline" style="height: 300px; border: 1px solid #aaa"></div>
        <noscript>
        This page uses Javascript to show you a Timeline. Please enable Javascript in your browser to see the full page. Thank you.
        </noscript>
    </body>

 </html>



위 HTML 파일을 그대로 저장하고 색상을 지정해 표시한 부분만 변경하면 기본적으로 타임라인 그래프 생성하는데 큰 문제는 없다.  createBandInfo 에서 각 이벤트의 출력 시작 날짜를 지정해 준다. 타임라인 데이터의 표시할 시간 형태를 정의하게 되는데 MINUTE, HOUR, DAY, MONTH 와 같은 형태로 사용할 수 있다. 여러분들이 로드하는 패킷 데이터의 시간 분포 형태에 따라 적절히 선택해 주면 된다.

그리고 마지막으로 앞서 만든 XML 파일 명을 지정해 주면 끝이다. 브라우저를 통해 해당 HTML 파일을 로드하면 다음과 같은 화면을 볼 수 있다.


여기서 사용한 패킷 데이터가 특정 시간에 크게 패킷이 모여있다 보니 표현하는데 다소 한계가 있다.

그런데 여기서 잠깐! 위와 같이 화면이 나타나지 않는 분이 있을 것이다. 필자도 처음에 안나와서 왜 그럴까 봤더니 타임존 문제였다. XML 데이터에서 Asia/Seoul 을 GMT 로 변경해 주니 잘 나타났다.

다음번에 시간이 더 허락된다면 Simile 에서 좀더 효과적인 패킷 타임라인을 고민해 보고자 한다. 일단 다음을 기약하며 오늘은 여기까지 ~ :-)

/Rigel

2012년 11월 26일 월요일

Log2Timeline 을 이용한 타임라인 데이터 추출 - 기본편

Log2Timeline 은 데이터에서 타임라인을 만들어 볼 수 있도록 데이터를 생성해준다. 타임라인은 시간대로 나열해 주기 때문에 포렌식 분석하는데 있어서 중요하게 이용되는 부분이기도 하다. 여기에 PCAP 모듈도 있어 PCAP 데이터를 파싱하여 CSV 및 기타 여러 출력형태로 만들어준다. 하지만 Log2Timeline 의 PCAP 파싱 데이터는 그다지 만족스럽지는 못했다. 일단 앞으로 계속 개선될 것이고, 패킷 데이터를 타임라인 형태로 만들어 이용해 볼 수 있다는 개념 자체에 의미를 두자.

우선, 관련 사이트는 다음과 같으며 다운로드 받을 수 있다:

http://log2timeline.net/
https://code.google.com/p/log2timeline/

Log2Timeline 설치 및 기본 사용법 


설치는 어렵지 않다. 펄로 만들어져 있으므로 펄에 익숙한 분들에겐 어렵지 않다. 압축파일을 해제하고 다음과 같은 순서로 진행하면 된다.

# perl Makefile.PL
# make
# make install (as root user)

사용에 있어서 알아두어야 할 옵션으로 -f  와 -o 가 있다. -f 는 입력으로 지정할 데이터 포맷을 나타내고, -o 는 출력 형태를 지정한다. 지원하는 포맷 및 출력형태는 각 옵션 뒤에 list 라고 사용하면 된다.

즉, 입력 데이터 포맷 데이터를 보고 싶은 경우는 -f list 를 사용하면 된다. 상당히 많은 포맷 형태를 지원하고 있다. PCAP 데이터는 제일 하단에 보인다. PCAP 외 다양한 것을 지원하니 포렌식에 이용할때 참고하길 바란다.


마찬가지로 출력 형태도 -o list 로 사용하면 된다.


기본적으로 CSV 로 출력이 된다. -z 는 타임존을 지정하는 것이며, 기본 사용은 아래와 같다:


# log2timeline -f pcap  output.pcap -z Asia/Seoul

우선 출력결과를 한번 살펴보자

# log2timeline -f pcap output.pcap

Start processing file/dir [output.pcap] ...
Starting to parse using input modules(s): [pcap]
Local timezone is: Asia/Seoul (KST)
Local timezone is: Asia/Seoul (KST)
Loading output module: csv
date,time,timezone,MACB,source,sourcetype,type,user,host,short,desc,version,file
name,inode,notes,format,extra
04/02/2012,09:39:09,KST,MACB,NEt,PCAP file,Time Written,-,192.168.10.27,TCP pack
et flags [0x18: PUSH ACK ] 192.168.10.27:3389 -> 192.168.10.40:58274 seq [137323
8656],TCP packet flags [0x18: PUSH ACK ] 192.168.10.27:3389 -> 192.168.10.40:582
74 seq [1373238656],2,output.pcap,16778486,-,Log2t::input::pcap,src-ip: 192.168.
10.27 dst-ip:
04/02/2012,09:39:09,KST,MACB,NEt,PCAP file,Time Written,-,192.168.10.40,TCP pack
et flags [0x10: ACK ] 192.168.10.40:58274 -> 192.168.10.27:3389 seq [3832965561]
,TCP packet flags [0x10: ACK ] 192.168.10.40:58274 -> 192.168.10.27:3389 seq [38
32965561],2,output.pcap,16778486,-,Log2t::input::pcap,src-ip: 192.168.10.40 dst-
ip:


-w 로 저장할 파일을 지정하지 않아 화면으로 출력이 되었는데, 패킷 데이터를 파싱하여 CSV 로 만들어 준다. 아쉬운 것은 많은 필드가 따로 구분이 되지 않고 크게 몇개 정도로만 나뉘어져 있어서 패킷 데이터를 분석하기에는 한계가 있고 전체적인 흐름을 살펴보는 정도로만 보아야 할 것이다.

블로그에서 이와 비슷한 형태로 여러개를 다룬적이 있으니 "그래프" 로 검색하면 다양한 글을 추가로 확인할 수 있고, CSV 를 이용하면 다음 글도 도움이 될 것이다.

와이어샤크(WireShark)의 그래프 기능 활용하기 - 고급편



SQLite 로 저장하여 SQL 쿼리로 조회해 보기 


출력을 CSV 가 아닌 SQLite 로도 저장할 수 있다. 파일 형태의 DB 로 기본적인 SQL 쿼리문을 사용할 수 있다. 어떤 면에서는 쿼리를 이용하면 유용한 데이터 추출도 가능한 부분이 있다.

사용하기 전에 SQLite 모듈이 설치되어 있어야 하는데, 펄에서 아래와 같이 설치할 수 있다.

$ sudo perl -MCPAN -e shell
cpan> install DBI
cpan> install DBD::SQLite

그런데, 필자의 경우 실행시에 다음과 같은 에러가 발생하였다.

[LOG2T] This file is dealt with on line-by-line basis (traditional LOG file parsing), meaning one timestamp object per line
[Log2Timeline] Error occured while parsing output.pcap - The processing has died and therefore it will not be further processed.
However the tool will continue running, trying to parse the next file.
The error that got displayed by the tool is:
Can't call method "execute" on an undefined value at /usr/local/share/perl/5.12.4/Log2t/output/sqlite.pm line 437.

일단 급하게 살펴보니 extra 로 정의된 데이터를 입력하는 것인데, DB 레코드를 살펴보니 PCAP 입장에서는 크게 중요하지 않은것 같아 주석처리를 하였다. ^^;;

# vi /usr/local/share/perl/5.12.4/Log2t/output/sqlite.pm

437 라인의 부분을 임시로 주석처리하여 실행가능

           # execute it
            $self->{'insert_extra'}->execute(
                $sid,

                #$self->{'db'}->quote( $i ),
                #$self->{'db'}->quote( $t_line->{'extra'}->{$i} )
                $i,
                $t_line->{'extra'}->{$i}
                         );

일단 이렇게 하면 정상적으로 실행은 가능하다. -o 로 sqlite 출력 형태를 지정하고 결과를 살펴보자.

# log2timeline -f pcap -o sqlite -w t.sql output.pcap -v -z Asia/Seoul
[LOG2TIMELINE] Testing time zone Asia/Seoul
Start processing file/dir [output.pcap] ...
Starting to parse using input modules(s): [pcap]
[LOG2T] Testing the existence of /usr/local/share/perl/5.12.4/Log2t/output/sqlite.pm
[LOG2T] Setting host timezone (Asia/Seoul)
[LOG2TIMELINE] Testing host time zone Asia/Seoul
[LOG2T] Setting output timezone (Asia/Seoul)
[LOG2TIMELINE] Testing output time zone Asia/Seoul
[LOG2T] Using output: sqlite
Loading output module: sqlite
[LOG2T] Loading input modules (pcap)
[DEBUG] Adding the module pcap.
[LOG2T] Loading module Log2t::input::pcap
[LOG2t] Parsing a single file.
[LOG2T] Starting to parse file output.pcap
[LOG2T] This file is dealt with on line-by-line basis (traditional LOG file parsing), meaning one timestamp object per line
[LOG2T] Parsing of file is completed
DBI::db=HASH(0x23b69f0)->disconnect invalidates 3 active statement handles (either destroy statement handles or call finish on them before disconnecting) at /usr/local/share/perl/5.12.4/Log2t/output/sqlite.pm line 293.
[LOG2T] Done.

t.sql 로 파일이 저장되었는데, 해당 SQLite 를 살펴보기전에 output.cap 의 기본 데이터를 살펴보자.

# capinfos output.pcap
File name:           output.pcap
File type:           Wireshark/tcpdump/... - libpcap
File encapsulation:  Ethernet
Packet size limit:   file hdr: 65535 bytes
Number of packets:   21221
File size:           14749276 bytes
Data size:           14409716 bytes
Capture duration:    430 seconds
Start time:          Mon Apr  2 09:39:09 2012
End time:            Mon Apr  2 09:46:19 2012
Data byte rate:      33531.74 bytes/sec
Data bit rate:       268253.91 bits/sec
Average packet size: 679.03 bytes
Average packet rate: 49.38 packets/sec
Strict time order:   True

총 패킷 건수가 21,221 건이다.  저장한 SQLite 파일을 열어보기 위해서는 SQLite 가 설치되어 있어야 하는데, 패키지 설치 프로그램을 이용하면 쉽게 설치가 가능하다.

데이안 / 우분투의 경우라면

# apt-get install sqlite3 로 하면 된다. SQLite 는 윈도우에서도 사용가능하다. 그러므로 만들어진 t.sql 은 윈도우에서도 당연이 접근 가능하다.

접근할 데이터 파일을 지정하고 실행하면 바로 확인이 가능하다.

# sqlite3  t.sql
SQLite version 3.7.7 2011-06-23 19:49:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
extra     host      records   super     tagged
filename  info      source    tag  

.tables 로 해당 DB 에 존재하는 테이블 정보를 확인할 수 있다.

sqlite> select count(*) from records;
21221

레코드 정보를 카운트 해보니 21,221 건이 맞다. 패킷파일 데이터를 제대로 다 파싱한 모양이다.

sqlite> .schema records
CREATE TABLE records (
  rid INTEGER PRIMARY KEY AUTOINCREMENT,
  short TEXT,
  detailed TEXT,
  srcid INTEGER,
  legacy INT,
  inode INTEGER,
  description TEXT,
  time INTEGER,
  user TEXT,
  fid INTEGER,
  sid INTEGER,
  hid INTEGER,
  hidden INT DEFAULT 0 );
CREATE INDEX record_time ON records(time);
CREATE INDEX user_name ON records(user);

.schema 로 레코드 필드를 확인해 보니 위와 같다.

sqlite> select * from records limit 1;
1|TCP packet flags [0x18: PUSH ACK ] 192.168.10.27:3389 -> 192.168.10.40:58274 seq [1373238656]|TCP packet flags [0x18: PUSH ACK ] 192.168.10.27:3389 -> 192.168.10.40:58274 seq [1373238656]|1|15|0|Time Written|1333327149||1|0|1|0

레코드 테이블에서 데이터 1건만 출력을 해 보았다. CSV 로 저장했던것과 비슷한 형태로 데이터가 저장되어 있다.

sqlite> select count(*) from records where short like '%192.168.10.27%';
971

192.168.10.27 로 short 필드에서 Like 검색을 해 보았고, 카운트를 확인해 보니 971 건 이었다. 데이터가 세부적으로 나뉘어져 있지 않고 크게 들어가 있다 보니 일단 Like 검색을 해야만 했다.

sqlite> select distinct hostname from host;
0.0.0.0
XX.226.51.63
XX.45.215.14
XX.45.215.149
XX.45.215.207
XX.45.215.55
XX.45.229.150
XX.45.229.71
XX.9.164.197

이번에는 호스트 테이블에서 hostname 필드에 대해 distinct 했다. 즉, Unique 한 IP 목록만을 출력하도록 한 것이다.

sqlite> select count(distinct hostname) from host;
130

출력 데이터가 많아서 count 를 이용해 해당 패킷 파일에서 Unique 한 IP 건수는 몇개인지 확인해 본 것이다.

SQL 에 익숙한 사용자라면 보다 다양한 형태로 데이터를 조회해볼 수가 있다. DB 화 되어 있으면 나름 유용한 부분이 분명 있지만, 데이터가 세부적으로 나뉘어 저장되어 있지 않아 가치가 반감된게 아쉬운 부분이다. 추후, DB 저장으로 좀더 뛰어난 도구를 찾아보고 다시 한번 소개해 보고 싶다.

지금까지 Log2Timeline 에 대해서 소개해 보았는데, PCAP 데이터 분석으로는 다소 한계가 있다. 오히려 와이어샤크 같은 곳에서 필드를 구분해 저장하는 것이 더 낳아보이기까지 하다.
그래도 알아두면 다른 로그파일 분석에서도 유용할 것이다.

다음번에는 Log2Timeline 을 이용해 타임라인 그래프를 만들어 보는 것을 소개해 보고자 한다. 이렇게 데이터만 뽑고서 끝낼 수는 없지 않은가?  :-)

/Rigel

2012년 11월 23일 금요일

NMAP 의 친구 NPING 으로 패킷생성을 자유롭게

스캐너로 유명한 NMAP 의 친구 Nping 을 소개한다. Nping 은 네트워크 패킷 생성 도구이자, 그 응답의 시간측정, 분석 기능을 제공한다. Nping 은 다양한 프로토콜을 지원하고 각 프로토콜의 헤더를 조정할 수 있다. Ping 과 같이 어렵지 않게 사용할 수 있다. 네트워크 성능 측정에도 이용될 수 있는데, ARP Poisong, DoS 공격 등과 같은 트래픽 생성도 가능하다. Nping 은 2009년 구글 Summer of Code 로 부터 처음 시작되었다고 한다.

주요기능은,
- TCP, UDP, ICMP, ARP 패킷 생성
- 여러개의 호스트 및 포트 지정 가능
- Non 루트 유저를 위한 모드 제공
- 고급사용을 위한 에코모드
- 이더넷 프레임 생성 지원
- IPv6 지원
- 리눅스, 맥, 윈도우 에서 동작
- 자유롭게 커스트마이징이 가능한 점

다운로드는 Nmap 페이지에서 받을 수 있으며, 링크 경로는 다음과 같다:

http://nmap.org/download.html


Nping 도움말을 보면 누구나 쉽게 사용할 수 있을만큼 어렵지 않다. 다양한 옵션이 존재하고 몇 가지 사용 예제를 살펴보자.


1. ICMP 타입이 time 인 트래픽 전송 

--icmp-type 으로 옵션을 정할 수 있고 --delay 라는 것을 사용해 약간의 지연을 사용하였다.

# nping --icmp --icmp-type time --delay 500ms 192.168.163.131

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-12 08:13 KST
SENT (0.0476s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (0.0545s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6091 iplen=40
SENT (0.5477s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (0.5503s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6092 iplen=40
SENT (1.0479s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (1.0504s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6093 iplen=40
SENT (1.5490s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (1.5494s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6094 iplen=40
SENT (2.0491s) ICMP 192.168.163.1 > 192.168.163.131 Timestamp request (type=13/code=0) ttl=64 id=29186 iplen=40
RCVD (2.0503s) ICMP 192.168.163.131 > 192.168.163.1 Timestamp reply (type=14/code=0) ttl=128 id=6095 iplen=40

Max rtt: 6.901ms | Min rtt: 0.326ms | Avg rtt: 2.694ms
Raw packets sent: 5 (200B) | Rcvd: 5 (200B) | Lost: 0 (0.00%)
Tx time: 2.00268s | Tx bytes/s: 99.87 | Tx pkts/s: 2.50
Rx time: 3.00379s | Rx bytes/s: 66.58 | Rx pkts/s: 1.66
Nping done: 1 IP address pinged in 3.12 seconds

2. 포트 8001 번에 TCP 데이터를 포함해 한번 전송하기 


# nping --tcp --data "0xAAAAAAAA" -p 8001 -c 1 192.168.163.131

HEX 문자열을 이용하는 경우는 --data  를 사용하고 문자열을 나열하는 경우는 --data-string 을 이용한다.

# nping --tcp --data-string "PacketInside.com" -p 8001 -c 1 -v4 192.168.163.131

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-12 08:27 KST
SENT (0.0549s) TCP [192.168.163.1:32834 > 192.168.163.131:8001 S seq=3357278597 ack=0 off=5 res=0 win=1480 csum=0xA0C0 urp=0] IP [ver=4 ihl=5 tos=0x00 iplen=56 id=3146 foff=0 ttl=64 proto=6 csum=0xa6a0]
0000   45 00 00 38 0c 4a 00 00  40 06 a6 a0 c0 a8 a3 01  E..8.J..@.......
0010   c0 a8 a3 83 80 42 1f 41  c8 1c 01 85 00 00 00 00  .....B.A........
0020   50 02 05 c8 a0 c0 00 00  50 61 63 6b 65 74 49 6e  P.......PacketIn
0030   73 69 64 65 2e 63 6f 6d                           side.com    

만약 data 크기를 지정하는 경우 --data-length 옵션도 같이 사용한다.

3. 목적지 호스트 포트 80, 443 에 TCP 패킷 전송

# nping -c 1 --tcp -p 80,433 packetinside.com

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-12 08:35 KST
SENT (0.1624s) TCP 192.168.10.40:18421 > 216.239.34.21:80 S ttl=64 id=37098 iplen=40  seq=3387806461 win=1480
SENT (1.1626s) TCP 192.168.10.40:18421 > 216.239.34.21:433 S ttl=64 id=37098 iplen=40  seq=3387806461 win=1480

Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 2 (80B) | Rcvd: 0 (0B) | Lost: 2 (100.00%)
Tx time: 1.00146s | Tx bytes/s: 79.88 | Tx pkts/s: 2.00
Rx time: 2.00254s | Rx bytes/s: 0.00 | Rx pkts/s: 0.00
Nping done: 1 IP address pinged in 2.20 seconds


4. 포트 범위를 지정하여 TCP 패킷 전송 

# nping 192.168.163.135 -c 1 --tcp -p 133-135

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:06 KST
SENT (0.0915s) TCP 192.168.163.1:19166 > 192.168.163.135:133 S ttl=64 id=20239 iplen=40  seq=1059400174 win=1480 
RCVD (0.0919s) TCP 192.168.163.135:133 > 192.168.163.1:19166 RA ttl=128 id=4388 iplen=40  seq=0 win=0 
SENT (1.0921s) TCP 192.168.163.1:19166 > 192.168.163.135:134 S ttl=64 id=20239 iplen=40  seq=1059400174 win=1480 
RCVD (1.0925s) TCP 192.168.163.135:134 > 192.168.163.1:19166 RA ttl=128 id=4390 iplen=40  seq=0 win=0 
SENT (2.0937s) TCP 192.168.163.1:19166 > 192.168.163.135:135 S ttl=64 id=20239 iplen=40  seq=1059400174 win=1480 
RCVD (2.0942s) TCP 192.168.163.135:135 > 192.168.163.1:19166 SA ttl=128 id=4391 iplen=44  seq=705789072 win=8192 <mss 1460>

5. TCP 패킷 생성시 좀더 다양하게 옵션 조절하기 


출발지 IP 는 -S 로 지정하고 ID 값을 9999 그리고 TTL 은 225 로 설정하였다. --badump-ip 를 사용해 의도적으로 잘못된 체크섬 값을 사용하게 했다. 거기다 MTU 도 점보 프레임 크기인 9000 을 사용했다.

# nping -S 1.1.1.1 --id 9999 -ttl 225 --badsum-ip --mtu 9000 --tcp -p 135 192.168.163.133

No.     Time           Source                Destination           Protocol Length Info
   1027 1817.197206000 1.1.1.1               192.168.163.133       TCP      60     24613 > epmap [SYN] Seq=0 Win=1480 Len=0

세부적인 데이터를 tshark 를 통해 다음과 같이 살펴보자. 의도한 대로 데이터가 잘 만들어져 전송되었는지 말이다.

Frame 1027: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface 0
Internet Protocol Version 4, Src: 1.1.1.1 (1.1.1.1), Dst: 192.168.163.133 (192.168.163.133)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
    Total Length: 40
    Identification: 0x270f (9999)
    Flags: 0x00
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    Fragment offset: 0
    Time to live: 225
    Protocol: TCP (6)
    Header checksum: 0x4c91 [correct]
    Source: 1.1.1.1 (1.1.1.1)
    Destination: 192.168.163.133 (192.168.163.133)
Transmission Control Protocol, Src Port: 24613 (24613), Dst Port: epmap (135), Seq: 0, Len: 0
    Source port: 24613 (24613)
    Destination port: epmap (135)
    [Stream index: 57]
    Sequence number: 0    (relative sequence number)
    Header length: 20 bytes
    Flags: 0x002 (SYN)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Nonce: Not set
        .... 0... .... = Congestion Window Reduced (CWR): Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...0 .... = Acknowledgment: Not set
        .... .... 0... = Push: Not set
        .... .... .0.. = Reset: Not set
        .... .... ..1. = Syn: Set
            [Expert Info (Chat/Sequence): Connection establish request (SYN): server port epmap]
                [Message: Connection establish request (SYN): server port epmap]
                [Severity level: Chat]
                [Group: Sequence]
        .... .... ...0 = Fin: Not set
    Window size value: 1480
    [Calculated window size: 1480]
    Checksum: 0x8604 [validation disabled]

0000  00 0c 29 8b 6f f8 00 50 56 c0 00 08 08 00 45 00   ..).o..PV.....E.
0010  00 28 27 0f 00 00 e1 06 4c 91 01 01 01 01 c0 a8   .('.....L.......
0020  a3 85 60 25 00 87 20 7c 3c be 00 00 00 00 50 02   ..`%.. |<.....P.
0030  05 c8 86 04 00 00 00 00 00 00 00 00               ............

6. ARP 패킷 전송 


# nping 192.168.163.135 -c 2 --arp

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:13 KST
SENT (0.0630s) ARP who has 192.168.163.135? Tell 192.168.163.1
RCVD (0.0634s) ARP reply 192.168.163.135 is at 00:0C:29:8B:XX:XX
SENT (1.0636s) ARP who has 192.168.163.135? Tell 192.168.163.1
RCVD (1.0640s) ARP reply 192.168.163.135 is at 00:0C:29:8B:XX:XX

7. ECHO 클라이언트/서버

1) --echo-server 로 동작시킨다. passphrase 로 public 을 사용하였다.

# nping --echo-server "public" -vvv

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:16 KST
Packet capture will be performed using network interface eth0.
Waiting for connections...
Server bound to 0.0.0.0:9929
[1353626220] Connection received from 192.168.163.135:49275
[1353626220] Good packet specification received from client #0 (Specs=9,IP=4,Proto=6,Cnt=5)
[1353626220] NEP handshake with client #0 (192.168.163.135:49275) was performed successfully
[1353626225] Client #0 (192.168.163.135:49275) disconnected

2) 이후 클라이언트에서 --echo-client 로 TCP RST 패킷을 전달하였다. 위 에코서버 로그에서 접속상태를 확인할 수 있다.

C:\play>nping --echo-client "public" 192.168.163.1 --tcp --flags rst

Starting Nping 0.6.01 ( http://nmap.org/nping ) at 2012-11-23 08:16 대한민국 표
준시
SENT (0.6870s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (1.7030s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (2.7190s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (3.7340s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480
SENT (4.7500s) TCP 192.168.163.135:50411 > 192.168.163.1:80 SR ttl=64 id=41968 i
plen=40  seq=133370060 win=1480

참고로 윈도우 사용자는 NMAP 을 설치하면 해당 프로그램 경로안에 NPING 을 찾을 수 있다.

2012년 11월 16일 금요일

Capstats 로 네트워크 인터페이스 통계 정보 수집하기

Capstats 는 Bro-IDS 에서 배포하는 작은 인터페이스 상태 정보 수집 도구이다. libpcap 을 이용한 것으로 네트워크 인터페이스에서 발생하는 트래픽 정보를 간단히 보여준다. 다운로드는 다음의 경로에서 할 수 있다.

http://www.bro-ids.org/downloads/release/capstats-0.18.tar.gz

컴파일을 하기 위해서는 cmake 가 설치되어 있어야 한다.  우분투 계열이면 apt-get 으로 쉽게 설치 가능하다.

# apt-get install cmake

그리고, 컴파일을 다음과정을 거치면 어려움 없이 쉽게 컴파일이 완료된다.

# ./configure
# make
# make install

사용방법 또한 아주 간단하다. 인터페이스를 지정하고 -I 로 얼마 주기로 정보를 출력할 것인지 시간만 정해주면 된다. -f 를 이용하면 BPF 스타일의 필터를 사용할 수 있고 -n 은 지정한 값 만큼만 출력해주고 중단한다. -w 를 사용하면 패킷을 파일로도 저장할 수 있어, 간단히 패킷 덤프용으로도 사용가능하다.

# capstats -i eth0 -I 1

1352159800.380532 pkts=14 kpps=0.0 kbytes=6 mbps=0.1 nic_pkts=2906 nic_drops=0 u=0 t=14 i=0 o=0 nonip=0
1352159801.380637 pkts=2 kpps=0.0 kbytes=0 mbps=0.0 nic_pkts=2908 nic_drops=0 u=0 t=2 i=0 o=0 nonip=0
1352159802.380823 pkts=10 kpps=0.0 kbytes=0 mbps=0.0 nic_pkts=2918 nic_drops=0 u=2 t=8 i=0 o=0 nonip=0
^C1352159803.374389 pkts=3 kpps=0.0 kbytes=0 mbps=0.0 nic_pkts=2921 nic_drops=0 u=0 t=2 i=0 o=0 nonip=1
1352159803.374402
=== Total

1352159803.374442 pkts=2921 kpps=0.0 kbytes=984 mbps=0.0 nic_pkts=2921 nic_drops=0 u=398 t=2299 i=0 o=14 nonip=210


위 예는 인터페이스 eth0 을 모니터링 하고 -I 로 1초마다 정보를 출력하도록 설정한 것이다. 라인별 각 필드 정보는 다음과 같다:

pkts: Interval 기간에 capstats 가 본 패킷 개수
kpps: 초당 패킷 개수
kbytes: 지정된 Interval 동안 발생한 KBytes
mbps: 초당 Mbits
nic_pkts: libcap 의 pcap_stats() 에 보고된 패킷 개수
nic_drops:libpcap 의  pcap_stats() 에 보고된 Drop 패킷 개수
u: UDP 패킷 개수
t: TCP 패킷 개수
i: ICMP 패킷 개수
nonip: non-IP 패킷 개수


간단하게 네트워크 인터페이스 상황을 모니터링할때 유용하다.

[참고]
1. Capstats 추가 정보

http://www.bro-ids.org/documentation/components/capstats/README.html

2012년 11월 9일 금요일

MS사의 새로운 네트워크 분석기, Message Analyzer

오늘은 마이크로소프트사의 새로운 네트워크 분석기 Message Analyzer 를 소개하고자 한다. 이미 블로그에서 MS 에서 만든 Network Monitor 3.x 를 소개한 적이 있다. 이 것의 연속선상으로 네트워크 트래픽이라는 것에만 초점을 두지 않고 메시지 분석이라는 영역으로 넓혀 만들어진 것이 Message Analyzer 이다.

2012년9월에 퍼블릭하게 베타로 공개되었는데, 이제서야 공유한다. 9월 베타로 공개되었을때 공유해야지 하고 생각만 하고 있다가 필자의 게으름으로 이제서야 이 글을 쓰고 있다.

주요한 기능으로는,
- 프로토콜 메시지에 대한 검증과 파싱 기능
- 다양한 시스템과 엔드포인트 레벨의 메시지 캡쳐
- 그리드 형태의 요약 출력
- 메시지의 그룹핑
- 다양한 타입 로그를 브라우징 할 수 있는 기능 (.cap, etl, .txt)
- 페이로드의 자동 리어셈블리
- 텍스트로그의 임포트를 통해 키/값 형태로 파싱
- "추적 시나리오" 형태 기능 제공

무엇보다 직접 사용해 보는것이 기능을 익히는데 가장 빠른 방법이다. 다운로드는 다음의 경로에서 가능하다.

https://connect.microsoft.com/site216

다운로드 받기 위해서는 connect 에 가입해야 한다. 왼쪽 메뉴에 보면 Download 를 선택하면 다운로드 받을 수 있는 파일 리스트들이 나타난다. Network Monitor 도 보인다. 하지만 이번에 우리가 설치할 파일은 Message Analyzer 이므로 해당 파일을 다운로드 받아 설치하면 된다. 참고로 "Message Analyzer Intro PPT" 도 받아 보면 이해하는데 더욱 도움이 될것 같다.

처음 설치하고 실행하면 다음과 같은 화면을 볼 수 있다. 몇 가지가 있는데 아래는 인터페이스를 선택하고 패킷캡쳐를 시작하도록 설정할 수 있다. 와이어샤크에서 패킷 캡쳐 전 인터페이스 선택하고 필터를 적용하는 화면하고 비슷한 역활이다.



다음은 패킷 캡쳐 메인화면이다. 상단의 메뉴는 아이콘이 크게 배치되어 있고 심플하다. 생각보다 메뉴는 많이 보이지 않는다. 중간쯤 패킷 하나를 세부적으로 보았고 거기서 스택을 선택하면 프로토콜 스택별로 나타난다. 그리고 이어지는 다른 패킷도 그룹핑되어 함께 보인다.
왼쪽 하단에는 각 필드의 길이와 타입, 비트 정보가 나열되어 있고 오른쪽 하단에는 HEX 값과 ASCII 값을 볼 수 있다. 다른 탭이 하단에 또 있는데 조합이 가능한 데이터는 직접 보여준다. 예를들어 사진 이미지 같은 정보는 바로 확인이 가능하다.

처음 사용시에는 다소 어렵게 느껴지기도 하였다. 와이어샤크에 익숙해져 있는 면이 있을수도 있겠지만, 정보형태가 개발자나 패킷을 좀더 세부적으로 분석하는 사용자들에게 어울릿듯한 느낌을 받았다.


눈에 띄는 기능으로는 좌측화면에서 오른쪽을 클릭하면 창을 하나 더 만들 수 있는데 아래 그림은 프로토콜 대쉬보드를 만든것이다. 프로토콜별 막대 그래프와 시간대별 사용량  그리고 원형 그래프 프로토콜 요약 정보도 보인다. 이거 하나는 깔끔해 보인다. 와이어샤크의 이쁘지 않은 그래프 정보에 비하면 이건 아주 깔끔해 보인다.


마지막으로 다른 창을 만들어 보았다. 시퀀스 하게 매치되는 뷰 형태로 보여주는 것으로, 앞서 설명한 기능중에 하나로 "추적 시나리오" 가 여기에 해당한다. 사전에 정의되어 있는 시나리오를 선택하여 동작시킨 것으로 연관된 정보가 나열된다.


지금은 주요 기능정도만 여러분들에게 설명을 드렸다. 아직 깊게 살펴보지 않아, 어떤 유용한 기능이 더 있는지는 살펴보아야 겠지만, 추적 시나리오 같은 기능은 유용하지 않을까 싶기도 한다.

사실 어떤 도구든 누가 사용하느냐에 따라 도구의 활용가치가 크게 달라진다. 나에겐 보잘것 없어 보이는 도구도 다른 누군가에는 아주 유용하기도 하다. 여러분이 사용하는 도구를 제대로 이해하고 활용하려면 살짝 드러나는 겉 기능만 이용할 것이 아니라 충분히 그 기능을 이해해야 하고 응용할 수 있어야 한다.

앞으로 Message Analyzer 의 발전을 기대해 본다.

/Rigel

[참고]
1. 마이크로소프트 네트워크 모니터의 프로세스별 통신 상태

2012년 11월 6일 화요일

안드로이드 폰에 리눅스(BackTrack5) 올리기

집에서 장난감 대용으로 사용하고 있는 소니에릭슨 X10 안드로이드 단말기에 리눅스를 올려보았다. 정확히 말하면 BackTrack5 를 올려 본 것이고 일단은 동작 한다. 설치는 어렵지 않게 진행할 수 있었다. 복잡한 방법으로 롬을 올리는 것이 아니라, 해당 이미지를 복사해 놓고   몇 가지 실행하는 것만으로 쉽게 된다. 그렇기 때문에 단말기에 있는 모든 파일도 그대로 유지할 수 있다. 루팅된 단말기를 가지고 있다면, 아래 참고에 적어놓은 주소를 통해서 어렵지 않게 해 볼 수 있을 것이다.

실행하면 옆 화면과 같이 BackTrack 실행화면이 나온다. 안드로이드 단말기에서 화면을 보니 나름 느낌이 다르다. 메뉴는 보는 것과 같이 여러가지 도구들이 보인다. 참고로, 이 BackTrack 이미지는 용량 이슈로 모든 것을 다 포함하고 있지는 않다.

일단 속도는 느렸다. 단말기가 오래되기도 하였고, 움직이면서 실행하는데 있어서는 끈기를 가지고 실행해야 한다 :-)

아래 화면은 패킷 스니핑을 해 본것이다. 패킷 블로그 답게 이 부분을 빼 먹어서는 안될것 같아 실행해 보았다. 블로그에서도 소개한 ettercap 을 이용한 것이다.


느려서 그렇지 일단은 실행이 된다. 단말기만 빠르다면 앞으로 이동하면서 패킷덤프를 손쉽게도 할 수 있을것이다. 자, 그럼 브라우징은 어떨까?  아래 화면과 같이 브라우징도 OK 다. 한글도 잘 표시되었고 패킷인사이드 페이지가 잘 나타난다.


이상 간략한 실행기였고 설치방법은 하단의 URL 을 참고하면 된다. 앞으로 재미있는 내용은 다시 한번 공유하도록 하겠다. :-)

[참고]
1. 소니에릭슨 X10 에서 BackTrack5 설치하기
http://forum.xda-developers.com/showthread.php?t=1074169

2012년 11월 4일 일요일

리눅스 패키지 포맷 다른 패키지 포맷으로 변환하기

이미지 출처: http://tenoch.scimexico.com

사용하고자 하는 프로그램이 특정 패키지로만 제공되는 경우 다른 패키지로 변환하여 설치가 가능한 방법이 있다. Alien 은 다른 리눅스 패키지 포맷 형태로 변환해 준다.

예를 들어, NMAP 의 경우 RPM 으로 패키지를 제공해 준다. 소스를 다운로드 받아 설치할 수도 있고, 기존 배포판을 이용하는 방법도 있을 수 있겠지만, 리눅스 배포판은 항상 최신의 버전을 제공하지는 못한다.
Alien 은 RPM, deb, slp, pkg, tgz 의 패키지 형식을 지원하며, 사용방법도 아주 간단하다.

데비안 계열이라면 우선 apt-get 를 이용해 쉽게 alien 을 설치할 수 있다.

#apt-get install alien

다운로드 받은 rpm 패키지를 deb 로 변경하는 경우 다음과 같이만 해 주면 된다. 옵션을 따로 지정하지 않은 이유는 deb 가 디폴트이기 때문이다.

#alien xxx.rpm

xxx.deb 가 만들어질 것이고 dpkg 를 통해 해당 패키지를 인스톨 해 주면 된다.

#dpkg -i xxx.deb

이제 패키지 포맷에 신경쓰지 말고 편하게 이용해 보자.