Linux tcpdump

 

tcpdump는 Linux, Solaris, mac OS등 Unix 계열의 운영체제에서 동작하며 libpcap라이브러리를 사용하여 패킷을 획득할 수 있는 툴이다.
windows용 tcpdump로는 Windump가 있다. (windows에서는 와이어샤크가 더 편리)

send me email if you have any questions.


tcpdump 주 목적 및 콘솔의 장점

tcpdump의 주 목적은 패킷 sniffing에 있다.
(네트워크 스캐닝 공격으로써 타겟의 정보를 수집하거나 적당한 타겟을 찾는데 주 목적을 두고 있다.)

ex) 공격자가 tcpdump를 이용하여 telnet server에 접속하는 접속자의 ID와 PASSWORD를 알 수 있음
와이어샤크는 gui로 정보를 보여주지만 tcpdump는 콘솔상에 출력한다. -> grep과 같은 명령어를 이용하여 보다 빠르게 필요한 정보를 파악할 수 있다.

Options

Syntax Description
-n host의 ip주소 출력
-A Ascii정보를 포함하여 출력
-s 패킷의 length값 설정 (default 262144bytes)
  가급적 캡쳐하고자 하는 프로토콜의 헤더사이즈에 맞춘다.
-i 캡쳐할 인터페이스를 지정 ex) tcpdump -i eth0
host 특정 ip에 대한 패킷을 수집 ex) tcpdump host 192.168.152.130
port 특정 port에 대한 패킷을 수집 ex) tcpdump port 22
-w 캡쳐한 패킷들을 파일에 저장 ex) tcpdump -n -A port 22 -w test
-r 패킷을 저장한 파일을 read ex) tcpdump -r test
-a Network & Broadcast 주소들을 이름들로 출력
-v 좀 더 많은 정보들을 출력
-vv ‘-v’보다 좀 더 많은 정보들을 출력
-vvv 16진수값 형태로 정보를 출력
-l 라인별로 출력

Flag

TCP flag TCPDUMP flag Description
SYN S tcp 연결의 첫 번째 부분인 세션 연결 요청
ACK ack 상대방으로부터 패킷을 받은 뒤에 알려주는 패킷
FIN F 수신 호스트와의 연결을 정상적으로 마칠 때 사용
RESET R 수신 호스트와의 연결을 즉시 종료하기 위해 사용
PUSH P 데이터를 즉시 목적지로 보내라는 의미
URGENT urg 긴급한 데이터가 다른 데이터보다 우선
Placeholder . 패킷이 SYN, FINISH, RESET, PUSH등의 플래그가 없는 경우 이 플래그가 세팅

Testing

그림1
port 80 패킷 수집

port 80번 패킷을 IP주소와 port, Ascii정보를 포함하여 수집하도록 명령

  • 3-way Handshaking
    1. 192.168.152.128(ubuntu)가 192.168.152.130(host)에 접속요청 패킷을 보낸것을 확인
    2. 192.168.152.130(host)가 192.168.152.128(ubuntu)에 응답패킷을 보낸것을 확인
    3. 192.168.152.128(ubuntu)가 192.168.152.130(host)에 다시 ack를 보내면서 연결 성립
  • 접속자의 OS및 사용 브라우저를 알 수 있다.
  • 쿠키 및 PHPSESSID를 수집 할 수 있다.

3-way Handshaking?
TCP는 장치들 사이에 논리적인 접속을 성립(establish)하기 위하여 three-way handshake를 사용한다.
TCP 3 Way Handshake는 TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.

PHPSESSID? 각 웹서버에 접속하는 세션마다 session id 가 발급이 된다.
웹서버는 사용자 접속시 session id 가 기존에 존재하는지 판단하고 존재하면 동일한 세션 접속이라고 인식하고 존재하지 않으면 session id를 재발급한다.
PHP에서는 PHPSESSID란 키값으로 세션아이디를 발급한다.
PHPSESSID는 쿠키에 저정하는 방법과 GET파라메터로 계속 넘기는 방법이 있다.

그림2
port 80 패킷수집 (세션 종료)

  • 클라이언트는 FIN으로 종료하고 서버가 ACK를 실행

  • 192.168.152.128(ubuntu)가 192.168.152.130(host)에 FIN flag를 보낸 것을 확인
  • 수신 호스트는 ACK로 다시 신호를 보냄으로써 세션 연결이 종료됨을 확인

그림3

  • 상황
    1. host(kali linux)에서 port 5001에 채팅 서버를 열었다.
    2. client(ubuntu)에서 접속하여 데이터를 전송하고 kali에서 패킷스니핑
  • tcpdump 결과
    1. 192.168.152.128(client)가 192.168.152.130(host)에 PUSH플래그와 함께 데이터를 전송함을 확인
    2. 192.168.152.130(host)가 192.168.152.128에 ACK 패킷을 보내면서 정상적으로 수신됨을 확인

테스트로 사용된 채팅 프로그램에는 데이터를 암호화하여 전송하는등의 보안이 전혀 되어있지 않기 때문에 유저가 보낸 데이터를 감청하는것이 가능하다.