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 를 이용하면 다음 글도 도움이 될 것이다.
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