유닉스 기반의 환경에서 그래픽적으로 이쁘게 볼 수 있는 네트워크 모니터링인 EtherApe 를 소개해 볼까 한다. EtherApe 는 와이어샤크와는 용도가 조금 다르다. 와이어샤크와 같이 프로토콜 별로 세부적인 분석을 수행하기 보다는 전체적인 네트워크 흐름을 비주얼하게 볼 수 있는 것으로 생각하면 된다. 예를 들면, 호스트와의 링크 연결이 트래픽 크기만큼 보여준다준지 아래 그림과 같이 한눈에 흐름을 시간에 따라 보여주기도 한다.
설치는 아래 경로에서 바이너리를 다운로드 받거나 또는 소스코드를 받을 수 있다.
http://etherape.sourceforge.net/download.shtml
APT 패키지 사용자라면 " apt-get install etherape" 와 같이 쉽게 설치할 수 있다. 화면 구성은 위 그림과 같이 간단하다. 왼쪽에 탐지된 프로토콜 종류가 나오고 오른쪽에는 비주얼하게 역동적으로 화면이 움직인다. 라이브로 바로 인터페이스의 흐름을 보여주거나 또는 PCAP 파일을 열어서도 볼 수 있다. 각 노드를 선택하면 프로토콜 같은 정보를 볼 수도 있다. 아래 화면은 프로토콜 구성을 살펴본 것이다.
색상별로 프로토콜이 나뉘어져 있어 쉽게 눈에 들어온다. 비주얼 하게 표시해 주는 것이 네트워크 흐름을 읽어 들이면서 비주얼하게 계속 보여주는 것이므로, 어느 시점에 갑자기 트래픽이 크게 증가하는 형태와 같은 것에서는 텍스트 형태로 보는 것보다는 시각적으로 쉽게 파악할 수 있다. 또, 보고서 용도로 화면 일부를 사용해도 좋을것 같다. 아무래도 와이어샤크에서는 EtherApe 보다는 시각적으로 더 좋지는 않기 때문에 유용할 것이다.
사용한 PCAP 파일은 패킷 덤프를 뜨면서 IP 주소는 랜덤하게 생성하고, TCP, UDP 포트는 고정시켰다. 이런 사용방법은 여기서 tcpdpriv 를 찾아보면 사용방법을 찾아볼 수 있다.
오픈소스의 여러 다양한 네트워크 분석도구가 입맛을 딱 맞춰줄 수는 없지만, 한 도두가 아닌 다양한 여러가지 도구를 이용하면 상용분석 도구 이상으로 효과적인 분석이 가능하다는 점만은 잊지 말자.
2011년 5월 10일 화요일
2011년 2월 10일 목요일
네트워크 포렌직 도구 NetworkMiner 1.0 업데이트
네트워크 포렌직도구인 NetworkMiner 를 소개한 적이 있다. 최근에 1.0 버전이 나와서, 사용중인 분들은 업데이트 하기를 바란다. NetworkMiner 는 실시간으로 트래픽에 대한 기본적인 포렌직을 수행할 수도 있고, PCAP 파일을 불러들여 살펴볼 수도 있다.
네트워크 포렌직이라는 것을 처음 접해 본다면, NetworkMiner 가 도움이 될 것이다. 패킷 정보를 이용해 운영체제를 추정해 보고, 흥미로운 데이터를 추출해 낼 수 있는 기능이 있다.
이번 1.0 버전은 TCP reassembly 성능이 향상되었고, 기타 버그 Fix 등이 되었으며, 세부적인 내용은 파일안에 포함되어 있는 ChangeLog 파일을 살펴보기 바란다.
NetworkMiner 의 기본적인 내용은 다음 글에서 소개하고 있으니 참고하면 된다.
네트워크 포렌직 분석 도구(NetworkMiner)를 이용한 패킷파일 데이터 분석하기
꾸준히 업데이트가 이뤄지고 있으니 앞으로도 계속 기대해 보도록 하자. ^^
네트워크 포렌직이라는 것을 처음 접해 본다면, NetworkMiner 가 도움이 될 것이다. 패킷 정보를 이용해 운영체제를 추정해 보고, 흥미로운 데이터를 추출해 낼 수 있는 기능이 있다.
이번 1.0 버전은 TCP reassembly 성능이 향상되었고, 기타 버그 Fix 등이 되었으며, 세부적인 내용은 파일안에 포함되어 있는 ChangeLog 파일을 살펴보기 바란다.
NetworkMiner 의 기본적인 내용은 다음 글에서 소개하고 있으니 참고하면 된다.
네트워크 포렌직 분석 도구(NetworkMiner)를 이용한 패킷파일 데이터 분석하기
꾸준히 업데이트가 이뤄지고 있으니 앞으로도 계속 기대해 보도록 하자. ^^
2011년 1월 27일 목요일
와이어샤크 1.5.0 개발버전 공개
와이어샤크 1.5.0 개발 버전이 공개되었다. 1.4 에 비해 새로운 기능은 다음과 같다 :
- text2pcap 과 비슷한 텍스트 덤프파일을 Import 할 수 있음
- 패킷리스트에서 컬럼을 숨길 수 있음
- SMB 오브젝트를 익스포트 할 수 있음
- TShark 에서 iSCSI 응답 시간을 출력할 수 있음
- 캡쳐 옵션화면에서 컴파일된 BPF 코드 캡쳐 필터를 출력
- TCP 와 UDP 세션을 Ctrl+, Ctrl+. 로 뒤 앞으로 이동할 수 있음
- 패킷 길이가 기본 컬럼으로 포함됨
- DCE/RPC, SMB 와 같은 다양한 파서에서 적합한 UTF-16 문자열을 표시할 수 있음
- 그래프 화면에서 PNG 이미지로 저장할 수 있음
화면을 보면, 메뉴중에 Internals 라는 새로운 것이 보인다. Dissector tables 라는 메뉴를 클릭해 보면, Dissector 에 대해서 정보를 확인해 볼 수 있다.
이외 새롭게 지원하는 프로토콜은 아래와 같다
ADwin, ADwin-Config, Apache Etch, Aruba PAPI, Constrained Application Protocol (COAP), Digium TDMoE, Ether-S-I/O, FastCGI, Fibre Channel over InfiniBand (FCoIB), Gopher, Gigamon GMHDR, IDMP, Infiniband Socket Direct Protocol (SDP), JSON, LISP Data, MikroTik MAC-Telnet, Mongo Wire Protocol, Network Monitor 802.11 radio header, OPC UA ExtensionObjects, PPI-GEOLOCATION-GPS, ReLOAD, ReLOAD Framing, SAMETIME, SCoP, SGSAP, Tektronix Teklink, WAI authentication, Wi-Fi P2P (Wi-Fi Direct)
2010년 12월 2일 목요일
네트워크 패킷 인젝션,캡쳐 도구 Packit
네트워크 패킷을 인젝션하고 캡쳐할 수 있는 도구 Packit(Packet toolkit) 을 소개한다.
앞서 소개했던 많은 도구들과 같이 인젝션하기에 유용한 도구이다.

TCP,UDP,ICMP,IP,ARP,RARP 그리고 이더넷 헤더등 거의 모든 것을 정의할 수 있어,
방화벽, 침입탐지시스템, 트래픽 테스트와 같은 곳에 이용할 때 유용하게 사용될 수 있을 것이다.
Packit 의 버전은 현재 1.0 이며 설치를 하기 위해서는 libnet 1.1.2 이상의 라이브러리와
libpcap 라이브러리또한 필요하다.
소스파일의 다운로드는 다음의 경로에서 할 수 있다:
APT 패키지 사용자라면,
# apt-get install packit 으로 쉽게 설치도 가능하다.
사용에는 큰 어려움이 없으나, 다만 옵션이 상당히 많다. 이 뜻은 세부적으로
정의할 수 있다는 뜻이된다. 기본 사용방법은 아래와 같다:
usage: packit -m mode [-options] 'expression'
사용할 때 모드가 있다는 것을 주의해야 하는데, 모드에 따라서 옵션이 달라지기 때문이다.
옵션에는 capture, inject, trace 가 있으며 기본모드는 inject 이다.
1. 패킷 캡쳐
자주 사용할 만한 패킷 캡쳐 옵션 몇가지를 정리해 보면 아래와 같다
-c count 캡쳐할 카운트 수를 지정
-e 링크 레이어 헤더 데이터 출력
-i interface 네트워크 인터페이스 지정
-n 호스트 주소를 이름으로 변환하지 않음
-r file 패킷을 읽을 파일 지정
-s snaplen 패킷 캡쳐할 snaplen 데이터 사이즈 정의 (기본:68 바이트)
-w file 패킷 파일 저장
-X 헥사와 아스키로 데이터 출력
사용 옵션들을 보면 패킷인사이드에서 여러번 다뤘던 도구들과 큰 차이는 없다.
특히 tcpdump 에 익숙하다면 더욱 그럴것이다.
사용예제>
#packit -m capture -c 100 -i eth0 -w /data/packetinside.pcap
#packit -m cap -nX 'tcp and port 80'
2. 패킷 인젝션
기본적으로 인젝션 되는 패킷의 옵션은 아래와 같으며, 옵션만 봐도 크게 어렵지는 않다.
-t protocol 인젝트할 프로토콜 타입 지정 : TCP, UDP, ICMP, ARP (기본은 TCP)
-c count 인젝션에 몇 개의 패킷을 사용할 것인지 정의
-i interface 네트워크 인터페이스
-w interval 각 패킷을 보내는 간격 시간 (기본 : 1초)
-h 패킷을 보낸 후, 응답을 프린트 해줌 * 필요에 따라 유용한 기능
-v Verbose 모드로 세부적으로 정보를 출력함
-p payload 인젝션 할 페이로드를 지정, HEX 는 '0x' 로 시작하며 각 값의 구분은 공백으로 함
ASCII : -p 'hello world, packetinside.com'
HEX: -p '0x 40 40 40 90 90 90 0d 0a'
-Z length 인젝트할 패킷의 사이즈 정의
-t 로 프로토콜을 지정한 후 각 프로토콜 마다 사용가능한 옵션을 이용하면 되는데
IP,TCP,UDP,ICMP,ARP,이더넷 헤더 옵션을 가지고 있다.
여기서 각 옵션을 일일이 설명하기는 힘들고, packit 의 간단한 도움말을 보면 쉽게 알 수 있다.
TCP/UDP header options
-a ack Acknowledgement number
-D port Destination port (Range format: start-end)
-F flags Flags (format: -F UAPRSF)
-q seq Sequence number
-S port Source port (Default: Random)
-u urg Urgent pointer
-W size Window size (Default: 65535)
ICMPv4 header options
General:
-C code Code (Default: 0)
-K type Type (Default: 8)
Echo(0) / Echo Reply(8):
-N id ID number
-Q seq Sequence number
Unreachable(3) / Redirect(5) / Time Exceeded(11):
-g gateway Redirect gateway host (ICMP Redirect only)
-j address Original source address
-J port Original source port
-l address Original destination address
-L port Original destination port
-m ttl Original time to live
-M id Original ID number
-O tos Original type of service
-P proto Original protocol (Default: UDP)
Mask Request(17) / Mask Reply(18):
-N id ID number
-Q seq Sequence number
-G mask Address mask
Timestamp Request(13) / Timestamp Reply(14):
-N id ID number
-Q seq Sequence number
-U ts Original timestamp
-k ts Recieved timestamp
-z ts Transmit timestamp
IP header options
-d address Destination address
-f Don't fragment
-n id ID number
-o tos Type of service
-s address Source address
-T ttl Time to live (Default: 128)
-V ipproto IP protocol number (RAWIP only)
ARP header options
-A op Operation type (Default: 1 (ARP request))
-x address Source protocol address
-X hwaddr Source hardware address
-y address Destination protocol address
-Y hwaddr Destination hardware address
Ethernet header options
-e ethaddr Source ethernet address
-E ethaddr Destination ethernet address
옵션은 위와 같으며, 패킷인사이드 블로그를 열심히 보신 분들이라면 옵션을 이해하는데
어려움이 없을 것이다. 몇가지 예제를 보도록 하자.
다음은 출발지 소스는 8.8.1.1 로 하고 목적지는 192.168.0.1 로 보내는데 총 10개의 패킷을
보낸다. -h 옵션은 응답도 출력하도록 한 것이다. -h 옵션이 주어지지 않으면,
단순히 전송하는 정보만 출력할 것이다.
# packit -t icmp -s 8.8.1.1 -d 192.168.0.1 -c 10 -h
Mode: Packet Injection using device: eth1
-| SND 1 |------------------------------------------------------------------
Timestamp: 10:28:54.469954
ICMP header: Type: Echo Request(8) ID: 5854 Seqn: 56577
IP header: Src Address: 8.8.1.1 Dst Address: 192.168.0.1
TTL: 128 ID: 53261 TOS: 0x0 Len: 28
-| No Response From Peer |--------------------------------------------------
아래는 TCP 패킷을 보내는 것으로 목적지 포트 80에 TTL은 111 그리고 페이로드는 0x40 을
보낸 것이다.
# packit -t TCP -s 192.168.0.253 -d 192.168.0.200 -S 403 -D 80 -T 111 -p '0x 40'
Mode: Packet Injection using device: eth1
TCP header: Src Port: 403 Dst Port(s): 80 Flag(s): None
Window: 65535
IP header: Src Address: 192.168.0.253 Dst Address: 192.168.0.200
TTL: 111 ID: 49354 TOS: 0x0 Len: 41
Writing packet(s) (1): .
-| Packet Injection Statistics |--------------------------------------------
Injected: 1 Packets/Sec: 1.0 Bytes/Sec: 41.0 Errors: 0
그리고 다음은 ARP 패킷을 만들어 전송한 것이다. 우선 -t 로 ARP 타입을 지정해 주고
-A 1 은 ARP Request 를 뜻하고 -x 는 보내는 IP 주소 -X 보내는 이더넷 주소를 정의한 것이다.
# packit -t arp -A 1 -x 1.2.3.4 -X 5:4:3:2:1:0
Mode: Packet Injection using device: eth1
ARP header: Type: Request(1)
Sender: Protocol Address: 1.2.3.4 Hardware Address: 5:4:3:2:1:0
Target: Protocol Address: 0.0.0.0 Hardware Address: 0:0:0:0:0:0
Writing packet(s) (1): .
-| Packet Injection Statistics |--------------------------------------------
Injected: 1 Packets/Sec: 1.0 Bytes/Sec: 42.0 Errors: 0
여기서는 간단한 형태로만 만들어 패킷을 전송하지만, 사용하고자 하는 목적에 따라서
다양하게 만들어 볼 수 있다. 옵션을 여러개 사용하여 복잡해 보이지만,
막상 사용해 보면 옵션등이 사용하려는 목적을 대충 추정해 볼 수 있어 심플하게 패킷을 전송할 수 있다.
여기 블로그에서 언급한 많은 도구들 중에서 어떤것이 자기에게 더욱 적합한지는 여러분들이 판단하길 바란다.
From Rigel
2010년 10월 25일 월요일
Scapy 의 다양한 기능을 익혀보자 - 두번째
Scapy 는 앞서 언급했듯이 파이썬(Python) 기반의 프로그램이다. 그러므로 파이썬에 익숙치 않은 사용자라면
이게 무엇인가 하고 혼란스럽기도 하다. 일반적인 컴퓨터 언어의 기본지식이 있는 사용자라면,
어렵지 않게 이해할 수 있는 부분이니 예제를 몇 개 보는 것만으로도 충분히 이해가 될 것이다. 첫번째 이야기에서 언급한 대로 간단히 설치를 하고 아래 예제대로 몇 가지를 직접 실행해 보자. 그러면 금방 이해가 되고, 머리속에 기억이 오래 남을 것이다.
1. Scapy 의 설정 정보 살펴보기
Welcome to Scapy (v1.1.1 / -)
>>> conf
Version = v1.1.1 / -
ASN1_default_codec = <ASN1Codec BER[1]>
AS_resolver = <__main__.AS_resolver_multi instance at 0xaa69a4c>
BTsocket = <class __main__.BluetoothL2CAPSocket at 0xaa0f89c>
IPCountry_base = 'GeoIPCountry4Scapy.gz'
L2listen = <class __main__.L2ListenSocket at 0xaa0f74c>
L2socket = <class __main__.L2Socket at 0xaa0f6ec>
L3socket = <class __main__.L3PacketSocket at 0xaa0f6bc>
auto_fragment = 1
checkIPID = 0
checkIPaddr = 1
checkIPsrc = 1
check_TCPerror_seqack = 0
color_theme = <DefaultTheme>
countryLoc_base = 'countryLoc.csv'
debug_dissector = 0
debug_match = 0
ethertypes = </etc/ethertypes/ >
except_filter = ''
gnuplot_world = 'world.dat'
histfile = '/root/.scapy_history'
iface = 'eth1'
manufdb = </usr/share/wireshark/wireshark/manuf/ >
mib = <MIB/ >
nmap_base = '/usr/share/nmap/nmap-os-fingerprints'
noenum = <Resolve []>
p0f_base = '/etc/p0f/p0f.fp'
padding = 1
prog = Version = v1.1.1 / -
display = 'display'
dot = 'dot'
hexedit = 'hexer'
pdfreader = 'xpdf'
psreader = 'gv'
tcpdump = '/usr/sbin/tcpdump'
tcpreplay = 'tcpreplay'
wireshark = 'wireshark'
promisc = 1
prompt = '>>> '
protocols = </etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip ipv6_opts xtp ipv6_route igmp igp ddp etherip xns_idp ipv6_frag vrrp gre ipcomp encap ipv6 iso_tp4 sctp ipencap rsvp hip udp ggp hmp idpr_cmtp fc skip st icmp pup manet isis rdp l2tp ipv6_icmp udplite egp ipip ipv6_nonxt eigrp idrp rspf ospf vmtp>
queso_base = '/etc/queso.conf'
resolve = <Resolve []>
route = Network Netmask Gateway Iface Output IP
127.0.0.0 255.0.0.0 0.0.0.0 lo 127.0.0.1
192.168.0.0 255.255.255.0 0.0.0.0 eth1 192.168.0.240
0.0.0.0 0.0.0.0 192.168.0.200 eth1 192.168.0.240
conf 를 해 보면 현 세션의 설정 정보를 볼 수 있다. 설정정보의 변경은 간단하게 할 수 있는데, 만약 iface 의 네트워크 인터페이스를 바꾸고자 할 경우에는 conf.변수 = '값' 과 같이 사용하면 된다. 아래는 eth1 을 eth0 으로 변경해 본 것이다.
>>> conf.iface = 'eth0'
2. Scapy 를 이용해서 패킷 덤프도 해 보자.
sniff() 를 이용하면 패킷 덤프를 할 수 있다. 아래 화면은 sniff 를 한 후 Ctrl+C 를 눌러 중지하였더니 TCP 274 건 UDP 16 건이 탐지 되었다. 또 sniff 에 필터를 걸거나, count 옵션을 통해 몇 개까지 덤프를 한 후 중지할 것인지 지정할 수 있다. 기록된 데이터는 따로 특정 이름 변수에 담지 않아, '_' 에 기록되어 있다. _ 를 프린트 해 보면 패킷 정보가 출력이 된다.
>>> sniff()
^C<Sniffed: UDP:16 TCP:274 ICMP:0 Other:10>
>>> sniff(filter="tcp and port 80", count=15)
<Sniffed: UDP:0 TCP:15 ICMP:0 Other:0>
>>> print _
[<Ether dst=00:01:36:2e:0b:a7 src=08:00:27:69:4f:90 type=0x800 |<IP version=4L ihl=5L tos=0x0 len=610 id=7385 flags=DF frag=0L ttl=64 proto=tcp chksum=0x464d src=192.168.0.240 dst=74.53.201.162 options='' |<TCP sport=45659 dport=www seq=772295791 ack=1844792927 dataofs=8L reserved=0L flags=PA window=4006 chksum=0x3356 urgptr=0 options=[('NOP', None), ('NOP', None), ('Timestamp', (296792, 1784140432))] |< ....(생략)
3. 복잡한 건 싫어, 간단한 요약 정보 살펴보기
위에 기록된 정보를 a 라는 변수에 할당하였고, nsummary() 를 이용해 출력해 보았더니 보기 쉽게 한 라인 단위로 요약된 정보를 나타내준다. 각 라인 정보는 배열로 들어가 있어, 원하는 배열 정보를 출력해 볼수도 있다.
5번째 있는 정보를 출력한다면 a[5] 와 같이 입력하면 된다.
>>> a = _
>>> a.nsummary()
0000 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www PA / Raw
0001 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 A
0002 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 PA / Raw
0003 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www A
0004 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 A / Raw
0005 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www A
0006 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 A / Raw
0007 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www A
0008 Ether / IP / TCP 192.168.0.240:37088 > 72.14.213.95:www PA / Raw
0009 Ether / IP / TCP 192.168.0.240:47910 > 69.174.57.101:www S
0010 Ether / IP / TCP 192.168.0.240:47911 > 69.174.57.101:www S
0011 Ether / IP / TCP 72.14.213.95:www > 192.168.0.240:37088 PA / Raw
0012 Ether / IP / TCP 192.168.0.240:37088 > 72.14.213.95:www A
0013 Ether / IP / TCP 69.174.57.101:www > 192.168.0.240:47910 SA
0014 Ether / IP / TCP 192.168.0.240:47910 > 69.174.57.101:www A
>>> a[5]
<Ether dst=00:01:36:2e:0b:a7 src=08:00:27:69:4f:90 type=0x800 |<IP version=4L ihl=5L tos=0x0 len=52 id=7387 flags=DF frag=0L ttl=64 proto=tcp chksum=0x4879 src=192.168.0.240 dst=74.53.201.162 options='' |<TCP sport=45659 dport=www seq=772296349 ack=1844794757 dataofs=8L reserved=0L flags=A window=4006 chksum=0x518b urgptr=0 options=[('NOP', None), ('NOP', None), ('Timestamp', (296905, 1784175402))] |>>>
>>>
4. 패킷 구성 세부정보를 살펴본다. 어떻게, show() 명령어로..
a 에 기록되어 있는 5번째 내용을 트리구조와 비슷하게 살펴볼 수 있다. show() 를 이용해 언제든지 필요할때 마다 패킷의 구성정보를 살펴보자.
>>> a[5].show()
###[ Ethernet ]###
dst= 00:01:36:2e:0b:a7
src= 08:00:27:69:4f:90
type= 0x800
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 52
id= 7387
flags= DF
frag= 0L
ttl= 64
proto= tcp
chksum= 0x4879
src= 192.168.0.240
dst= 74.53.201.162
options= ''
###[ TCP ]###
sport= 45659
dport= www
seq= 772296349
ack= 1844794757
dataofs= 8L
reserved= 0L
flags= A
window= 4006
chksum= 0x518b
urgptr= 0
options= [('NOP', None), ('NOP', None), ('Timestamp', (296905, 1784175402))]
5. str() 로 문자열 정보 보기
>>> str(a[13])
"\x00\x016.\x0b\xa7\x08\x00'iO\x90\x08\x00E\x00\x01\xf8\xadL@\x00@\x06\xe4:\xc0\xa8\x00\xf0J}\x9bc\xd1x\x00PP&7\xdcj!.F\x80\x18\x01m\xa0=\x00\x00\x01\x01\x08\n\x00\x06\x9a\xb1\x9c5<\xd0GET / HTTP/1.1\r\nHost: google.com\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.9) Gecko/20080528 Epiphany/2.22\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\nCookie: rememberme=false; PREF=ID=ca4bab229fe11b17:TM=1264000421:LM=1264000421:S=ydhaQuYz7bGA7OEL\r\n\r\n"
6. hexdump() 로 16진수 HEX 값 보기
>>> hexdump(a[13])
0000 00 01 36 2E 0B A7 08 00 27 69 4F 90 08 00 45 00 ..6.....'iO...E.
0010 01 F8 AD 4C 40 00 40 06 E4 3A C0 A8 00 F0 4A 7D ...L@.@..:....J}
0020 9B 63 D1 78 00 50 50 26 37 DC 6A 21 2E 46 80 18 .c.x.PP&7.j!.F..
0030 01 6D A0 3D 00 00 01 01 08 0A 00 06 9A B1 9C 35 .m.=...........5
0040 3C D0 47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 <.GET / HTTP/1.1
0050 0D 0A 48 6F 73 74 3A 20 67 6F 6F 67 6C 65 2E 63 ..Host: google.c
0060 6F 6D 0D 0A 55 73 65 72 2D 41 67 65 6E 74 3A 20 om..User-Agent:
0070 4D 6F 7A 69 6C 6C 61 2F 35 2E 30 20 28 58 31 31 Mozilla/5.0 (X11
0080 3B 20 55 3B 20 4C 69 6E 75 78 20 69 36 38 36 3B ; U; Linux i686;
....(생략)
7. 사용가능한 명령어는 무엇이 있을까?
Scapy 에서 사용가능한 명령어가 무엇이 있는지 궁금할때는 lsc() 를 쳐 보자. 그리고 추가 도움말이 필요할때는 help() 가 있다.
>>> lsc()
sr : Send and receive packets at layer 3
sr1 : Send packets at layer 3 and return only the first answer
srp : Send and receive packets at layer 2
srp1 : Send and receive packets at layer 2 and return only the first answer
srloop : Send a packet at layer 3 in loop and print the answer each time
srploop : Send a packet at layer 2 in loop and print the answer each time
sniff : Sniff packets
p0f : Passive OS fingerprinting: which OS emitted this TCP SYN ?
arpcachepoison : Poison target's cache with (your MAC,victim's IP) couple
send : Send packets at layer 3
sendp : Send packets at layer 2
traceroute : Instant TCP traceroute
arping : Send ARP who-has requests to determine which hosts are up
ls : List available layers, or infos on a given layer
lsc : List user commands
queso : Queso OS fingerprinting
nmap_fp : nmap fingerprinting
report_ports : portscan a target and output a LaTeX table
dyndns_add : Send a DNS add message to a nameserver for "name" to have a new "rdata"
dyndns_del : Send a DNS delete message to a nameserver for "name"
is_promisc : Try to guess if target is in Promisc mode. The target is provided by its ip.
promiscping : Send ARP who-has requests to determine which hosts are in promiscuous mode
8. Traceroute 로 IP 경로 추적하기
흔히 경로 추적에 사용하는 traceroute 를 scapy 에서도 그대로 사용할 수 있다.
>>> traceroute("packetinside.com")
Begin emission:
************************Finished to send 30 packets.
******
Received 30 packets, got 30 answers, remaining 0 packets
211.245.21.34:tcp80
1 192.168.0.200 11
2 218.146.42.254 11
3 121.140.24.161 11
4 218.146.42.253 11
5 112.190.34.93 11
6 218.145.33.197 11
7 112.174.48.158 11
8 211.44.125.129 11
9 118.221.4.17 11
10 211.108.63.138 11
11 58.229.17.78 11
12 114.202.0.198 11
13 211.245.21.34 SA
14 211.245.21.34 SA
15 211.245.21.34 SA
16 211.245.21.34 SA
...(생략)
9. 프로토콜의 각 레이어 구성하기
위에서는 몇 가지 유용한 명령어들을 알아 보았는데, 실질적으로 내가 패킷파일을 구성하기 위해서는 어떻게 해야 하는지 소개해 보고자 한다. 패킷파일을 들여다 보면 형태에 따라 다르지만 크게,
이더넷 헤더 , IP 헤더, TCP/UDP 헤더, 애플리케이션 헤더 등이 있다.
그럼 이 각 헤더를 구성하는 아래의 예제를 들여다 보자.
>>> IP()
<IP |>
>>> Ether()/IP()/TCP()
<Ether type=0x800 |<IP frag=0 proto=tcp |<TCP |>>>
>>> Ether()/IP()/TCP()/"GET /HTTP/1.1\r\nHost: packetinside.com\r\n\r\n"
<Ether type=0x800 |<IP frag=0 proto=tcp |<TCP |<Raw load='GET /HTTP/1.1\r\nHost: packetinside.com\r\n\r\n' |>>>>
>>> hexdump(_)
0000 FF FF FF FF FF FF 00 00 00 00 00 00 08 00 45 00 ..............E.
0010 00 51 00 01 00 00 40 06 7C A4 7F 00 00 01 7F 00 .Q....@.|.......
0020 00 01 00 14 00 50 00 00 00 00 00 00 00 00 50 02 .....P........P.
0030 20 00 4E BE 00 00 47 45 54 20 2F 48 54 54 50 2F .N...GET /HTTP/
0040 31 2E 31 0D 0A 48 6F 73 74 3A 20 70 61 63 6B 65 1.1..Host: packe
0050 74 69 6E 73 69 64 65 2E 63 6F 6D 0D 0A 0D 0A tinside.com....
>>>
>>> str(IP())
'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
>>> str(TCP())
WARNING: No IP underlayer to compute checksum. Leaving null.
'\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00'
>>> a=Ether()/IP(dst="www.google.com")/TCP()/"GET /index.html HTTP/1.0 \n\n"
>>> a
<Ether type=0x800 |<IP frag=0 proto=tcp dst=Net('www.google.com') |<TCP |<Raw load='GET /index.html HTTP/1.0 \n\n' |>>>>
Ether() 은 이더넷 헤더를 IP() 는 IP 헤더를 의미한다. Ethere()/IP() 와 같이 사용하면 이 두 헤더를 만들어 주는 것이다. 구성된 헤더는 hexdump 로도 확인해 볼 수 있고, str 로도 각 헤더별 구성을 볼 수 있다. 예제를 보는 것 만으로도 대충 동작 형태의 감이 잡힐 거이다. 여러분들이 필요한 헤더를 원하는 대로 가져다 붙이면 되는 것이다.
10. 패킷 구성 조금 더 깊게 들여다 보기
조금더 패킷구성에 대해서 살펴보자. 헤더 마다 세부적으로 값들을 다 조정할 수 가 있는데, 아래는 b 에 IP 헤더를 집어 넣는데 목적지 주소는 192.168.100.100 으로 하고 있다. 목적지 주소만을 보기 위해 b.dst 를 사용했고, b.ttl 을 통해 ttl 을 볼 수도 있다. ttl 값을 128 로 변경하였다가 그 값을 다시 삭제한 것도 보인다.
TCP 도 마찬가지로 c 에 할당하고 flags 값을 설정해 보기도 하고 , 목적지와 출발지 포트도 설정했다. 그리고
z 라는 변수에 IP()/TCP() 로 만들어 넣었더니.
어라~ 이상하다. 내가 설정한 정보하고는 다르다. 여기서 주의할 것이. 이것은 단지 IP/TCP 기본 헤더정보를 넣은 거이다. 우리가 만든 정보를 넣은것이 아니므로 , x 변수에 넣은 것과 같이
x=b/c 와 같이 넣어주고 x.show() 로 확인해 보면 정상적으로 다 들어가 있는 것을 볼 수 있다.
>>> b=IP(dst="192.168.100.100")
>>> b
<IP dst=192.168.100.100 |>
>>> b.dst
'192.168.100.100'
>>> b.ttl
64
>>> b.ttl="128"
>>> b
<IP ttl='128' dst=192.168.100.100 |>
>>> del(b.ttl)
>>> b
<IP dst=192.168.100.100 |>
>>>
>>> c=TCP()
>>> c
<TCP |>
>>> c.flags="PA"
>>> c.flags
24
>>> c
<TCP flags=PA |>
>>> c.dport=80
>>> c.sport=2080
>>> c
<TCP sport=2080 dport=www flags=PA |>
>>> z=IP()/TCP()
>>> z
<IP frag=0 proto=tcp |<TCP |>>
>>> z.show()
###[ IP ]###
version= 4
ihl= 0
tos= 0x0
len= 0
id= 1
flags=
frag= 0
ttl= 64
proto= tcp
chksum= 0x0
src= 127.0.0.1
dst= 127.0.0.1
options= ''
###[ TCP ]###
sport= ftp_data
dport= www
seq= 0
ack= 0
dataofs= 0
reserved= 0
flags= S
window= 8192
chksum= 0x0
urgptr= 0
options= {}
>>> x=b/c
>>> x
<IP frag=0 proto=tcp dst=192.168.100.100 |<TCP sport=2080 dport=www flags=PA |>>
>>> x.show()
###[ IP ]###
version= 4
ihl= 0
tos= 0x0
len= 0
id= 1
flags=
frag= 0
ttl= 64
proto= tcp
chksum= 0x0
src= 192.168.0.240
dst= 192.168.100.100
options= ''
###[ TCP ]###
sport= 2080
dport= www
seq= 0
ack= 0
dataofs= 0
reserved= 0
flags= PA
window= 8192
chksum= 0x0
urgptr= 0
options= {}
>>>
11. 패킷 전송하기
첫번째 이야기에서도 간단하게 패킷 전송을 다뤄보았다. 앞에서 만든 x 변수를 send 를 통해 쉽게 전송했다. 이 뜻은, 여러분이 필요한 형태로 패킷을 아주 쉽게 만들 수 있다는 것이다. 그리고 send 를 통해 전송을 하고.
이외 파일로 저장된 패킷파일을 바로 불러들여 전송을 시킬 수도 있다.
>>> send(x)
.
Sent 1 packets.
>>> sendp(rdpcap("/home/debian/test.pcap"))
WARNING: DNS RR prematured end (ofs=45, len=42)
WARNING: DNS RR prematured end (ofs=50, len=42)
WARNING: more DNS RR prematured end (ofs=45, len=42)
..........................................................................................................................................
Sent 138 packets.
>>>
Scapy 의 주요한 몇 가지 기능과 사용방법에 대해서 알아보았는데, 굳이 설명이 없더라도
소개한 예제만 보고도 기능이 충분히 이해가 될 것이다. 파이썬 기반이라도 설명을 했기 때문에
다양한 프로그램적인 요소를 접목하기도 아주 쉽다. 일단은 이 정도만 알아두어도
Scapy 를 이용해 활용하기에는 큰 무리가 없을 것이며, 더 많은 기능은 Scapy 사이트에서 문서를 참고해 보기 바란다. 더욱 많은 기능에 놀랄지도 모르겠다. :-)
마지막으로 세번째 이야기에서는 Scapy 를 프로그램 관점에서 소개해 보도록 하겠다.
From Rigel.
[Scapy 연관글]
2010년 10월 20일 수요일
강력한 패킷 조작 프로그램 Scapy 를 소개한다 - 첫번째
Scapy
지금까지 패킷분석과 관련한 많은 도구들을 언급하였는데, 이 도구를 미처 소개하지 못했다.
강력한 기능과 프로그램적인 면에서도 뛰어난 도구인데말이다. 필자가 오늘 소개하고자 하는 도구는
Scapy 라는 것이다. Scapy 는 인터렉티브하게 패킷을 조작할 수 있는 강력한 기능을 제공하며,
수 많은 프로토콜의 디코딩 기능과 수정된 패킷을 전송할 수 있는 기능등을 포함하고 있다.
이 도구의 큰 장점은 다양한 기능을 수행할 수 있는 것인데, 우리가 흔히 스캐닝을 하거나, 패킷덤프를
하거나, 원격 시스템의 Alive 유무를 점검 또는 공격 패킷등을 만들고자 할때 사용하는 도구들이
다 달라진다. 예를 들면, hping, nmap, arpsoof, tcpdump, tshark, p0f 등의 여러 도구의 기능들 말이다
하지만 Scapy 는 이 도구 하나로 가능하다. 너무 강력한 도구인양 소개한 것일까?
사용용도에 따라 달라지겠지만 무척이나 편리한 기능을 갖고 있는 것은 사실이다. 다만 사용하는데 있어서는
일반적인 도구에 비해서는 사용방법이 처음에는 힘들 수도 있다. Scapy 는 파이썬을 기반으로
작성되어 있는데, 사용형태가 파이썬에서 코드를 사용하는 것과 같이 사용할 수 있으므로
파이썬에 익숙해져 있는 사용자라면 더 없이 편할 것이다. 또한, Scapy 모듈을 이용하여,
파이썬에서 패킷을 핸들링 하는 프로그램을 작성한다면 간단하게 그 기능을 이용할 수 있어
개발자 관점에서도 유용하다.
뛰어나다는 설명보다도 일단 직접 경험해 보는 것이 빠르다. 바로 설치해 보고 각 기능을
사용해 보면 앞서 얘기한 것들이 이해가 될 것이다.
1. 설치
Scapy 2.x 이상의 버전에서는 파이썬 2.5 이상이 필요하다. 그리고 libpcap, libdnet 이 필요하다.
보통 많은 경우에는 이런것들이 이미 설치되어 있으므로 사용하는데 큰 문제는 없을 것이다.
다음의 경로에서 파일을 다운로드 받을 수 있다:
$ unzip scapy-latest.zip
$ cd scapy-2.*
$ sudo python setup.py install
하는 것으로 쉽게 설치가 된다. 파이썬에 익숙한 사용자라면 어렵지 않을 것이다. 또는,
각 시스템에서 제공하는 패키지가 있다면 그것을 이용해도 좋다.
# apt-get install scapy
* 참고로 윈도우 기반에서 사용하고자 한다면, 다음의 문서를 참고하여 실행해 보길 바란다.
http://www.secdev.org/projects/scapy/doc/installation.html#platform-specific-instructions
2. 간단한 사용 예
실행하게 되면 다음과 같은 화면을 볼 수 있다.
# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.1.0)
>>>
(설치되어 있는 모듈 및 환경에 따라, 경고 메시지가 뜰 수 있는데 무시하고 사용 가능하다.단, 해당 모듈 기능을 사용하지 않는 한)
몇 가지 간단한 기능을 살펴보자!
>>> ls()
ARP : ARP
BOOTP : BOOTP
CookedLinux : cooked linux
DHCP : DHCP options
DNS : DNS
DNSQR : DNS Question Record
DNSRR : DNS Resource Record
....
현재 지원하는 레이어 형태를 볼 수 있다. 쉽게 보면 프로토콜 이다.
다음은 존재하는 PCAP 파일을 오픈하는 것이다. 오픈할 파일을 " 없이 사용하는 경우는 다른 형태로 이해한다.
오픈 후에는 파싱되어 메모리 상에 다 들어가 있으므로 바로 바로 필요한 내용을 꺼내 사용할 수 있다.
>>> a=rdpcap(test.pcap)
Traceback (most recent call last):
File "<console>", line 1, in <module>
NameError: name 'test' is not defined
>>> a=rdpcap("test.pcap")
>>> a
<test.pcap: TCP:2040 UDP:0 ICMP:0 Other:0>
>>>
파일 전송도 할 수 있는데, 원하는 형태로 마음대로 수정하여 전송이 가능하다. 각 프로토콜 레이어 별로 정보를 기록하고 헤더를 붙일 수 있다. 아래의 경우는 IP 헤더에서 목적지를 1.2.3.4 로 설정하고, ICMP 헤더를 붙인 것이다.
>>> send(IP(dst="1.2.3.4")/ICMP())
.
Sent 1 packets.
전송하기 전 tcpdump 로 확인한 내용을 보면, 목적지 1.2.3.4 로 ICMP 패킷이 전송된걸 확인할 수 있다.
# tcpdump -v icmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
09:07:36.479199 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto ICMP (1), length 28) packet > 1.2.3.4: ICMP echo request, id 0, seq 0, length 8
이 정도에서 간단한 맛보기를 언급하고 다음 이어지는 두번째 편에서 좀더 세부적으로 Scapy 기능을 알아보도록 하겠다. 계속 이것저것 소개할 것이 많은데, 정리하고 쓰자니 시간이 꽤 걸리는 거 같다. 이래서 정리는 인내가 필요해지는 것 같다 :-)
2010년 10월 12일 화요일
와이어샤크 1.4.1, 1.2.12 버전 릴리즈
와이어샤크의 최신버전이 릴리즈 되었다. 이번에 릴리즈 된 버전은
1.4.1 과 1.2.12 버전이다.
ASN.1 BER 해석기의 취약점이 해결되었고, 유저 인터페이스 관련한 몇 가지
버그들이 해결되었다. 1.4.1 버전에서는 다음 프로토콜 지원 기능이 업데이트 되었다.
ASN.1 BER, ASN.1 PER, EIGRP, GSM A RR, GSM Management, GSM MAP, GTP, GTPv2, ICMPv6, Interlink, IPv4, IPv6, IPX, LDAP, LLC, MySQL, NAS EPS, NTLMSSP, PN-IO, PPP, RPC, SDP, SLL, SSL, TCP
이외 업데이트 된 세부적인 내용은 다음 경로를 참고하면 된다.
http://www.wireshark.org/docs/relnotes/wireshark-1.4.1.html
또한, 와이어샤크 1.0 버전에 대해서는 더 이상 지원이 이뤄지지 않는다. 공식적인
지원이 끝난만큼, 1.0 사용자들은 1.4 버전으로 업그레이드 할 것을 권고한다.
2010년 10월 4일 월요일
윈도우환경에서 실시간 그래프를 통해 트래픽을 감시해 보자.
윈도우환경에서 간단히 트래픽 상태를 살펴볼 수 있는 도구 하나를 소개한다.
이름은 iTraffic Monitor 이며, 네트워크 모니터링과 간단한 리포팅을 해준다. 아래 이미지는 사용 예로,
그래프에 현재 사용량을 나타내준다. 네트워크 모니터링을 많이 해 보신 분이라면 MRTG 를 본적이 있을 것이다. 그것과도 조금은 흡사한 형태로 표시된다.

현재 내 컴퓨터에서 사용되는 트래픽을 실시간적으로 모니터링 하거나, 일/주/월 별 사용량등을 파악하는데는 유용할 것이다. 화면은 간단하게 구성되어 있어, 어렵지 않게 사용할 수 있다. 화면에서 오른쪽 마우스를 클릭하면 몇가지 메뉴를 선택할 수가 있다.
이 프로그램을 사용하기 위해서는 Winpcap 이 설치되어야 하며, 다운로드는 다음의 경로에서 할 수 있다.
2010년 9월 6일 월요일
와이어샤크에서 2기가 이상의 파일이 열리지 않는다면...
패킷파일을 다루다 보면 보통은 우리가 패킷파일을 오픈하고 살펴볼 수 있는 크기의 파일이 많다.
너무 파일이 커 버리면 분석하는것 자체도 힘들기 때문에..
[관련글] 2010/01/27 Rigel 100 기가 가 넘는 패킷 파일이라고 ?
그런데 때로는 패킷파일이 생각 이상으로 커지기도 한다. 필자가 이전에 쓴 포스팅에서는 100 기가가
넘는 패킷파일도 있었다고 이야기 하였다. 이번에는 그 정도까지는 아니지만, 대략 2기가가 넘는 파일을
읽어 들이려고 했을때 아래와 같은 에러 메시지를 얻을 수가 있다. (물론, 와이어샤크를 기준으로 했을때이다)
capinfos: Can't open /tmp/test.pcap: Value too large for defined data type
와이어샤크에서는 기본적으로 2기가 이상의 파일을 읽어들일 수가 없다. 이유는 int32 값을 사용하고 있기 때문인데, int32 의 값 범위는 아래와 같다.
−2,147,483,648 to 2,147,483,647
그래서 2기가 정도로 제한된 것이다. 일단 간단하게 나마 해결책은 64비트로 변경해 주는 것이다. 새롭게 다시 컴파일을 해 주면 되는데 아래와 같이 설정후에 컴파일을 다시 해 보자.
CFLAGS=-D_GNU_SOURCE\ -D_FILE_OFFSET_BITS=64 ./configure --enable-wireshark=no --without-zlib
Build profile binaries : no
Use pcap library : yes
Use zlib library : no
Use pcre library : no
Use kerberos library : no
./configure 다음의 옵션은 여러분들의 필요에 따라 맞게 사용하면 되고, 중요한 것이 앞쪽에서 CFLAGS 에 설정한 FILE_OFFSET_BITS 를 64로 설정한 것이다. 64 비트로 했을때의 값은 아래와 같다.
−9,223,372,036,854,775,808 to +9,223,372,036,854,775,807
큰 파일을 오픈하는데는 걱정하지 않을 수준이다.
컴파일을 하고, 파일을 읽어보자. (여기서는 tshark 를 사용하지 않고 기본 정보를 얻기 위해 capinfos 를 사용하였다.)
# ./capinfos /tmp/test.pcap
File type: Wireshark/tcpdump/... - libpcap
File encapsulation: Ethernet
Number of packets: 2936376
File size: 3062134522 bytes
Data size: 3015152482 bytes
Capture duration: 310 seconds
Start time: Tue Aug 31 05:10:43 2010
End time: Tue Aug 31 05:15:53 2010
Data byte rate: 9737875.87 bytes/sec
Data bit rate: 77903006.99 bits/sec
Average packet size: 1026.83 bytes
Average packet rate: 9483.46 packets/sec
짜잔. 위 예와 같이 3기가 파일도 이제는 오픈이 된다. 이와 관련한 비공식 패치는 아래 참고의 2번을 참고하기 바란다.
[참고]
1. 2147483647
2. 와이어샤크 int32 패치
2010년 9월 5일 일요일
ProcNetMonitor 로 트래픽을 유발하는 프로세스를 쉽게 찾아보자.
윈도우에서 사용 가능한 프로세스 네트워크 모니터 도구가 있어 소개한다. 여러가지 도구들이 있긴 한데, 오늘은 이 도구가 사용하기도 아주 쉽고, 유용할거 같다는 생각이 든다. 윈도우에서 악성코드에 감염되었다고 가정해보자. 그리고, 트래픽 확인을 위해 와이어샤크를 통해 네트워크 트래픽이 발생되고 있음을 확인한다. 그런데, 윈도우의 어떤 프로세스가 이 트래픽을 유발하고 있는지 알기가 어려운 것이다. 특정 프로세스에서 발생하면 쉬운데,
정상 서비스 프로세스에 인젝션 되어 발생되면 까다로워진다.
아래 프로그램은 각 프로세스별로 TCP, UDP, 연결 카운트를 보여주고 있다. 즉, 이 카운트가 크게 증가되었거나 하면 해당 프로세스를 의심해 볼 수 있다. 프로세스를 클릭하여 살펴보면, 어디로 연결되었는지 세부 정보를 확인해 볼 수가 있다. 이 도구의 사용방법을 설명할 것도 없이 워낙에 심플해서, 처음 이런류의 프로그램을 접하는 분들이라도 알 수 있을 정도이다.

Properties 를 누르면 프로세스에 대한 속성을 확인해 볼 수 있으며, Export 를 하면 프로세스 리스트를 HTML 파일로 저장할 수 있다. 다운로드는 다음의 경로에서 할 수 있다.
그리고, 이 프로그램이외에 분석에 유용하게 사용할 만한 도구들도 몇가지 있으므로, 한번 살펴보기 바란다.
패킷을 분석하는데는 그 목적이 있고, 그 목적을 달성하기 까지는 용도에 따라서 이러한 도구가 유용하게 사용될 것이다.
2010년 9월 1일 수요일
와이어샤크 1.4.0 정식 버전 공개
6월초 와이어샤크 1.4.0rc1 버전이 공개된 후, 드디어 1.4.0 정식버전이 공개되었다.
정식버전과 함께 1.4.0rc2 버전도 공개되었으니, 이제 1.2.X 를 뒤로 하고,
1.4.0 의 새로운 기능들을 느껴보기 바랍니다.
몇가지 변경된 기능에 대해서는 저번 1.4.0rc1 에서 소개한적이 있고요,
다운로드는 다음의 경로에서 가능합니다.
세부적인 릴리즈 노트는 다음을 참고하세요.
[주요변화]
- 와이어샤크의 메인 화면에서 컬럼을 쉽게 이동할 수 있거나, 오른쪽 클릭을 통해 조정이 가능
- 파이썬 스크립트 지원
- 많은 부분에서 메모리 누수 버그 Fix (그래서 그런가, 처리가 조금 자연스러운듯)
- 와이어샤크 1.4 버전에서는 윈도우 2000을 지원하지 않음. 그러므로 윈도우 2000 에서는 1.2 나 1.0 버전을 이용해야 함
- Manually Resolve Address 기능
- 유용하게 이용할 수 있는 부분인데, IP 를 특정 이름으로 변경시켜 놓을 수 있다. 예를들어, 172.16.1.254 라는 것을 쓰고 있다면 이 기능을 통해 Internal Router 이런식으로 바꿀 수 있다.
- 'Ignore Packet' 기능, 필요없는 패킷에서 오른쪽 클릭을 통해 무시해 버릴 수 있다.
- 시간 표시가 이제는 시:분:초 형태로 출력된다.
- 유닉스와 리눅스 환경의 와이어샤크에서 캡쳐 버퍼 사이즈를 설정할 수 있다.
- 와이어샤크에서 바로 JPEG 파일을 오픈할 수 있음
JPEG 파일을 와이어샤크로 던져보면 알 수 있다. - 새로운 프로토콜 지원
- 이외 기타 등등
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월 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월 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
라벨:
네트워크,
네트워크 포렌직,
분석도구,
와이어샤크,
운영체제,
원격 OS 판단,
지문,
패킷분석,
Fingerprint,
fingerprinting,
IP주소,
Network Forensic,
nmap,
p0f,
passive os fingerprinting,
TCP/IP,
tcpdump
2010년 7월 23일 금요일
와이어샤크 개발버전 1.4.0RC1 의 새로운 기능을 느껴보자.
6월초에 1.4.0 RC1 에 나왔는데, 여러분들에게 소개한다는 것이 깜빡 잊었다.
현재 사용하는 Stable 버전이 1.2.9 이고, 개발 버전이 1.4.0 이다. 기존까지는 계속 개발 버전으로 나오다
6월초네 RC1 버전이 처음으로 릴리즈 된 것이다. 어느정도 안정화 단계에 들어간것 같으니
멀지않은 시기에 정식버전이 나오리라 생각된다.
외관적으로 크게 변화된 것은 별로 없고, 느낌상으로는 속도가 좀 빨라진것 같다.
몇가지 새롭거나 업데이트 기능을 소개하면 다음과 같다 :
(새롭게 바뀐 기능을 웹에서 찾기가 힘들어, 어떤 기능들이 새로워졌는지 찾는데 시간이 걸렸다. :-) )
- 와이어샤크의 메인 화면에서 컬럼을 쉽게 이동할 수 있거나, 오른쪽 클릭을 통해 조정이 가능
- 파이썬 스크립트 지원
- 많은 부분에서 메모리 누수 버그 Fix (그래서 그런가, 처리가 조금 자연스러운듯)
- 와이어샤크 1.4 버전에서는 윈도우 2000을 지원하지 않음. 그러므로 윈도우 2000 에서는
1.2 나 1.0 버전을 이용해야 함 - Manually Resolve Address 기능
유용하게 이용할 수 있는 부분인데, IP 를 특정 이름으로 변경시켜 놓을 수 있다.
예를들어, 172.16.1.254 라는 것을 쓰고 있다면 이 기능을 통해 Internal Router 이런식으로 바꿀 수 있다. - 'Ignore Packet' 기능, 필요없는 패킷에서 오른쪽 클릭을 통해 무시해 버릴 수 있다.
- 시간 표시가 이제는 시:분:초 형태로 출력된다.
- 유닉스와 리눅스 환경의 와이어샤크에서 캡쳐 버퍼 사이즈를 설정할 수 있다.
- 와이어샤크에서 바로 JPEG 파일을 오픈할 수 있음
JPEG 파일을 와이어샤크로 던져보면 알 수 있다. - 새로운 프로토콜 지원
- 이외 기타 등등
몇 가지 분석에 유용한 기능들도 보이고, 계속 발전해 나가는 와이어샤크를 보니 역시 최고의 패킷 분석기 다워 보인다. 말로는 설명하기 다 힘드니, 궁금한 분들은 직접 사용해 보며 느껴보기를 바란다.

2010년 7월 20일 화요일
IP 주소의 위치정보를 활용하여 멋진 그래프 만들기
패킷파일을 열어보면 IP 정보들이 가득하다. 필요에 따라 IP 주소를 Whois 하여 찾아보고, 어느 국가의 것인지, 어느 기관의 것인지 알아볼 수 있다. 오늘은 패킷 파일의 IP 주소의 위치정보를 좀더 쉽게 확인할 수 있는 방법을 소개해 보고자 한다. 일단 도구가 필요한데, IPLocation 이라는 것을 받아보자.
[IPLocation 소개] http://writequit.org/projects/iploc/
IPLocation 은 각 IP 주소를 쿼리하여 위치 정보를 리턴해주는데, 보여주는 정보의 형태가 CSV 이다. 루비로 만들어져 있는 스크립트 형태이며, 사용하기 위해서는 루비 PCAP 라이브러리가 필요하다.
루비 PCAP 라이브러리는 다음의 경로에서 받을 수 있다.
PCAP 라이브러리의 컴파일은 ruby extconf.rb 를 실행해 주면 된다.
# ruby extconf.rb
checking for socket() in -lsocket... no
checking for gethostbyname() in -lxnet... no
checking for hstrerror()... yes
checking for pcap.h... yes
checking for pcap_open_live() in -lpcap... yes
checking for pcap_compile_nopcap()... yes
creating Makefile
그러면 위와 같이 Makefile 이 만들어지고 make 명령어를 통해 컴파일을 시작한다.
# make
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP -D_FILE_OFFSET_BITS=64 -fPIC -I/usr/local/include -c icmp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP -D_FILE_OFFSET_BITS=64 -fPIC -I/usr/local/include -c ip_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP -D_FILE_OFFSET_BITS=64 -fPIC -I/usr/local/include -c packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP -D_FILE_OFFSET_BITS=64 -fPIC -I/usr/local/include -c Pcap.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP -D_FILE_OFFSET_BITS=64 -fPIC -I/usr/local/include -c udp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP -D_FILE_OFFSET_BITS=64 -fPIC -I/usr/local/include -c tcp_packet.c
cc -shared -o pcap.so icmp_packet.o ip_packet.o packet.o Pcap.o udp_packet.o tcp_packet.o -L. -L/usr/lib -L/usr/local/lib -lruby1.8 -lpcap -lpthread -ldl -lcrypt -lm -lc
컴파일이 되었다면 make install 하는 것으로 쉽게 설치가 끝난다.
# make install
/usr/bin/install -c -m 0755 pcap.so /usr/local/lib/site_ruby/1.8/i486-linux
/usr/bin/install -c -m 644 ./lib/pcaplet.rb /usr/local/lib/site_ruby/1.8
/usr/bin/install -c -m 644 ./lib/pcap_misc.rb /usr/local/lib/site_ruby/1.8
자,이제 IPLocation 을 실행해 보자. 실행하면, 바로 패킷 캡쳐모드로 발견되는 IP 주소에 대한 정보를 보여준다.
Inbound 와 Outbound 로 나뉘어 보여지게 되며, 중지는 CTRL-C 를 누르면 된다.
# ./iploc.rb
Aggregating...CTRL-C to finish (if in live capture mode).
^CInbound Addresses:
168.126.63.1,KOREA, REPUBLIC OF (KR),(Unknown city),,,27
201.76.40.2,(Unknown Country?) (XX),(Unknown City?),,,1
75.126.229.92,UNITED STATES (US),(Unknown city),,,1
174.133.246.194,UNITED STATES (US),Houston TX,29.7687,-95.3867,2
189.126.108.2,(Unknown Country?) (XX),(Unknown City?),,,1
203.119.29.1,CHINA (CN),(Unknown city),,,1
89.253.195.102,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,1
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,86
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
174.129.200.54,UNITED STATES (US),Seattle WA,47.6218,-122.35,27
213.248.61.180,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,4
192.33.14.30,UNITED STATES (US),(Unknown city),,,4
Outbound Addresses:
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,11
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
301 packets received by filter
95 packets dropped by kernel
그럼 어떤 옵션들이 있는지 살펴보자.
# ./iploc.rb -h
Usage: iploc.rb [ -dnv ] [ -i interface | -r file ]
[ -c count ] [ -s snaplen ] [ filter ]
Options:
-n do not convert address to name
-d debug mode
-v verbose mode
도움말은 아주 간단하다. 대략 어떤 형태의 옵션인지 추측이 가능할 것이다. -r 은 파일을 읽어 들이고, -c 는 카운트 만큼 동작하고 중지하며 필터는 tcpdump 와 같은 필터를 걸때 사용하는 것이다. 저장되어 있는 패킷파일이 있다면 -r 옵션을 통해 기록되어 있는 IP 주소의 위치 정보를 알 수 있다.
# ./iploc.rb -v -r fake.pcap
Aggregating...CTRL-C to finish (if in live capture mode).
Inbound Addresses:
93.186.124.94,(Unknown Country?) (XX),(Unknown City?),,,31
91.207.192.25,UNITED KINGDOM (GB),(Unknown city),,,10
125.56.214.113,(Unknown Country?) (XX),(Unknown City?),,,4
72.14.203.100,UNITED STATES (US),Mountain View CA,37.402,-122.078,3
188.124.7.155,TURKEY (TR),Bursa,40.1833,29.0667,5
66.249.89.104,UNITED STATES (US),Mountain View CA,37.402,-122.078,61
188.124.7.156,TURKEY (TR),Bursa,40.1833,29.0667,5
209.190.85.9,INDONESIA (ID),Gombong,-6.1167,107.117,12
[생략]
너무 많은 경우에는 -c 옵션을 통해 제한하면 카운트 만큼만 보여준다.
# ./iploc.rb -v -r fake.pcap -c 100
이렇게 얻은 정보는 유용하게 사용될 수 있는데, 결과로 나온 형태가 CSV 라는 점에 주목해야 한다.
CSV 로 얻었으니, 내가 원하는 형태로 가공하여 사용할 수 있다. 보고서에 이용하는 것이라면 그래프등으로
변환하면 더욱 유용할 것이다. 필자는 이렇게 얻어진 CSV 데이터를 오픈오피스(OpenOffice)를 통해 가공해 보았다. CSV 파일을 로드하고, 구분자 옵션으로 콤마를 선택한다. 그러면 아래 그림과 같이 이쁘게 분리가 된다.

이후, 데이터가 로드되었으니 자기 입맛에 맞게 만들어 사용하면 된다. 아래 예제는 데이터를 나라별로 정렬하여 통계를 내 본것이다.

텍스트 파일 보다는 훨씬 깔끔하고, 분포를 쉽게 볼 수 있다. IPLocation 을 통해 나온 그 데이터의 결과만 보지 말고 다양하게 활용할 수 있는 방법을 생각해 보면 무궁무진하다. 비싼 도구 없이도 오픈소스만으로도 멋진 보고서를 만들어 보도록 하자.
참고로, 위 내용과 관련한 이전 포스팅을 참고하면 도움이 될 것이다.
- 2010/05/28 Rigel 와이어샤크(WireShark)의 그래프 기능 활용하기 - 고급편
- 2010/05/24 Rigel 와이어샤크(WireShark)의 그래프 기능 활용하기 - 기본편
- 2010/03/23 Rigel 와이어샤크에서 위치정보 이용하기 - 접속국가를 쉽게 알 수 있다면...
2010년 7월 6일 화요일
WinPcap 4.1.2 버전 릴리즈
WinPcap 이 2009년 10월 말 이후로, 최근에 (2010년7월2일) 업데이트 되었다. 참 오랜만의 업데이트 이다.
WinPcap 4.1.2 버전이며 다운로드는 아래의 경로에서 할 수 있다.
이번 릴리즈에서는 몇몇 OS 에서 발생되었던 Crash 의 원인인
드라이버의 버그가 픽스 되었다. 이번 버전의 주요 변경된 내용은
ChangeLog 를 확인해 볼 수 있다.
업데이트가 귀챦으신 분들은 그냥 넘어가도 되겠다. 큰 Major 변화는 있지 않기 때문이다.
2010년 7월 5일 월요일
네트워크 포렌직 분석 도구 - Xplico 에게 분석을 맡겨라!
트래픽 패킷 데이터 분석은 때로는 어려운 일이다. 특히나 분석 데이터가 아주 많을 경우와, 전달받은
패킷데이터의 네트워크 구조를 모르는 경우에는 더욱 그러하다. 앞서 소개한 포스팅에서 설명한 몇가지 도구들이 있기는 한데, 딱히 성에 차지는 않는다. 하지만, 현재 개발중이며 앞으로 더욱 발전해 나가리라 믿는 몇 가지 분석도구들이 있다. 오늘은 그 중에서도 Xplico 라는 것을 소개하고자 한다.
세부정보는 아래 사이트에서 얻을 수 있으며, 도구 이외에도 유용한 정보들을 얻을 수 있을 것이다.
일단 Xplico 의 목적은 인터넷 트래픽 데이터에서 정보를 추출하는 것이다. 예를 들면, POP3, IMAP, SMTP 와 같은 메일 관련 프로트콜에서 메일 정보를 수집한다든지, HTTP 프로토콜에서 웹 관련 정보를 얻는다거나 VoIP 관련 프로토콜을 통해 음성 데이터 정보를 얻는등 인터넷 트래픽 데이터가 모든 대상이 된다.
다만, 현재 나와있는 모든 프로토콜을 지원하지는 않으나 일반적으로 우리가 이용하는 프로토콜을 지원하므로 사용에는 큰 문제가 없다. 참고로 Xplico 홈페이지에서 보면 Xplico 는 네트워크 프로토콜 분석기라고 하지 않는다. 네트워크 포렌직 분석 도구로 언급하고 있다. 앞으로 나 또한 여러분들에게 지속적으로 소개하고 연구해나가고자 하는 방향도 네트워크 포렌직으로 맞춰질 것이다.
무엇보다 이 도구가 궁금한 분들은 다음 경로에서 스크린샷을 통해 미리 기능을 맛 볼 수 있다.
설치방법은 여기서는 생략하고, VirtualBox 이미지를 이용한 간단한 방법을 소개한다. (가상 이미지만 실행하면 되니 기능을 맛보기에는 얼마나 편한 방법인가 ^^)
(소스코드 또는 패키지, VirtualBox 이미지를 받을 수 있다)
이미지를 받은 경우 실행 후, 유저아이디,패스워드, 루트패스워드는 xplico 이며
쉘에서 /opt/xplico/script/sqlite_demo.sh 를 실행하면 데모 형태로 동작된다.
실행한 창에서는 분석되는 데이터 정보등의 통계를 볼 수 있다.
tcp: running: 0/0, subflow:1/50, tot pkt:7966
udp: running: 0/0, subflow:416/450, tot pkt:8316
http: running: 15/148, subflow:0/0, tot pkt:861
pop: running: 0/0, subflow:0/0, tot pkt:0
로컬컴퓨터에서 TCP/9876 포트로 동작하게 되어
브라우저를 띄우고 http://localhost:9876 으로 접속만 하면 Xplico 화면을 쉽게 볼수 있다.
세션 정보들을 보면 HTTP, FTP, DNS, Undecoded 탭에 정보가 있는 것이 보인다.
왼쪽 옆에는 각 메뉴들이 보이는데, 해당 메뉴를 클릭하면 이용가능한 정보가 나온다.
![]() | ![]() |

여기 글로서는 표현하는데 한계가 있으므로 직접 경험해 보는 것이 좋을것 같다. 본인이 분석할 대상의
PCAP 파일을 집어놓고 어떤 정보가 분석되어 출력되는지 사용해 보면 과연 이 도구가 나에게 유용할 것인지
판단해 볼 수 있을 것이다. 와이어샤크와 같은 분석도구보다는 형태별로 정보를 나누어 쉽게 볼 수 있도록
해주므로 정보를 빨리 찾아볼 수도 있다. 단, 그렇다고 이 도구만을 믿어서는 안된다. 엄연히 분석하여
찾고자 하는 대상에 따라서 사용될 도구는 달라진다.
패킷분석에 익숙하지 않은 사용자라면 이 도구가 오히려 패킷분석에 쉽게 접근할 수 있는 통로가 될 수도 있을것이다. 이 판단은 여러분에게 맡긴다.
난 단지 앞으로 여러분들에게 많은 것을 소개하고, 분석과정을 계속 만들어나갈 뿐이다.
참고로, 여기서 테스트로 이용된 PCAP 파일은 와이어샤크 샘플페이지의 PCAP 데이터를 사용한 것이다.
From Rigel
라벨:
네트워크,
네트워크 포렌직,
분석도구,
와이어샤크,
패킷,
패킷분석,
Network Forensic,
pcap,
virtualbox,
Xplico
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
피드 구독하기:
글 (Atom)



