'tcp'에 해당되는 글 2건

  1. TCP 패킷 캡쳐 프로그램..
  2. TCP 기본 연결, 종료 과정

TCP 패킷 캡쳐 프로그램..

TCP 패킷을 캡쳐하는 프로그램은 여러가지가 있는데..
windows에서는 winpcap 설치가 필요없는 SmartSniff을 써왔습니다.

그런데, unix 계열로 넘어 오면서 다양한 플랫폼을 지원하는 ethereal을 쓰게 되네요.
windows용도 있는데, winpcap를 사용한다는 단점이 있지만, SmartSniff와는 비교할 수 없을 정도로 기능이 막강하네요.

제일 마음에 드는 기능은 unix에서 패킷을 캡쳐해서 파일로 저장하고,
그 파일을 windows용 ehtereal에서 열어 보면 TCP패킷에 대한 기본적인 분석까지 됩니다.



unix에서 tcpdump를 이용해 파일을 만드는 예제

tcpdump -nns 1514 -w weird_traffic.cap 'dst host 192.168.10.25 and tcp and port 42'

/usr/local/sbin/tcpdump -nns 1514 -w packet_err.cap 'host 192.168.10.25 and tcp and port 80'

/usr/local/sbin/tcpdump -nns 1514 -w packet_perr.cap 'host 192.168.10.25 and tcp'

TCP 기본 연결, 종료 과정


netstat의 State 필드에 표시되는 TCP 상태표시가 갖는 의미를 알아봅시다.
RFC 793 문서에 있는 TCP 기본 연결, 종료 과정을 보면 이해가 더 빠를 거라 생각한다.
 
-----------------------------------------------------------
# netstat -atn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address    State
... 생략 ...
tcp    0   0 0.0.0.0:25       0.0.0.0:*       LISTEN   <-- 포트가 열렸음
tcp    0   0 192.168.123.10:32799  207.46.106.141:1863  ESTABLISHED <-- 서로 연결중
tcp    0   0 192.168.123.10:32794  218.xxx.xx.xx:22   ESTABLISHED
tcp    0   0 192.168.123.10:32802  207.46.108.46:1863  CLOSE_WAIT <-- 종료 대기중
tcp    0   0 192.168.123.10:33244  211.xxx.xx.x:80    ESTABLISHED
... 생략 ...
-----------------------------------------------------------
 
1) TCP 연결관련 상태
 
* RFC 793문서에 나온 기본적인 TCP 연결 과정

   TCP A                           TCP B

 1. CLOSED                           LISTEN
 2. SYN-SENT  --> < SEQ=100>< CTL=SYN>          --> SYN-RECEIVED
 3. ESTABLISHED <-- < SEQ=300>< ACK=101>< CTL=SYN,ACK>   <-- SYN-RECEIVED
 4. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>     --> ESTABLISHED
 5. ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>< DATA> --> ESTABLISHED

LISTEN   : 데몬이 요청을 발을 수 있도록 연결 요구를 기다리는 상태.
            즉, 포트가 열려있음을 의미. http(80), mail(25), ftp(21), telnet(23) 등 위에서 포트 25(mail)이 메일을 받을 수 있도록 열려 있는 상태.
            윈도우즈에서는 LISTENING으로 표시
SYN_SENT  : 로컬에서 원격으로 연결 요청(SYN 신호를 보냄)을 시도한 상태
SYN_RECV  : 원격으로 부터 연결 요청을 받은 상태.
            요청을 받아 SYN+ACK 신호로 응답은 한 상태이지만 ACK는 받지 못했다.
           netstat로 확인할 때 SYN_RECV가 상당히 많다면 TCP SYN 플러딩(Flooding) 공격일 가능성이 있다.
           윈도우즈와 솔라리스에서는 SYN_RECEIVED으로, FreeBSD는 SYN_RCVD으로 표시
ESTABLISHED : 서로 연결이 되어 있는 상태
            위에서 192.168.123.10의 포트 32794과 218.xxx.xx.xx의 포트 22(ssh)이 서로 연결되어 있는 상태

2) TCP 종료관련 상태

* 정상적인 연결 종료 과정

   TCP A                          TCP B

 1. ESTABLISHED                       ESTABLISHED
 2. (Close)
   FIN-WAIT-1 --> < SEQ=100>< ACK=300>< CTL=FIN,ACK> --> CLOSE-WAIT
 3. FIN-WAIT-2 <-- < SEQ=300>< ACK=101>< CTL=ACK>   <-- CLOSE-WAIT
 4.                             (Close)
   TIME-WAIT  <-- < SEQ=300>< ACK=101>< CTL=FIN,ACK> <-- LAST-ACK
 5. TIME-WAIT  --> < SEQ=101>< ACK=301>< CTL=ACK>   --> CLOSED
 6. (2 MSL)
   CLOSED                           

FIN_WAIT1  : 소켓이 닫히고 연결이 종료되고 있는 상태. 원격의 응답은 받을 수 있다.
            솔라리스에서는 FIN_WAIT_1로 표시
FIN_WAIT2  : 로컬이 원격으로 부터 연결 종료 요구를 기다리는 상태.
           솔라리스에서는 FIN_WAIT_2로 표시
CLOSE_WAIT : 원격의 연결 요청을 받고 연결이 종료되기를 기다리는 상태.
            원격으로 부터 FIN+ACK 신호를 받고 ACK 신호를 원격에 보냈다.
TIME_WAIT  : 연결은 종료되었으나 원격의 수신 보장을 위해 기다리고 있는 상태.
           이 상태를 특히 자주 보게되는 Apache에서 KeepAlive를 OFF로 해둔 경우,  Tomcat 서버를 쓰는 경우 등
LAST_ACK  : 연결은 종료되었고 승인을 기다리는 상태
CLOSED   : 완전히 연결이 종료된 상태

※ 위의 FIN_WAIT1, FIN_WAIT2, CLOSE_WAIT 3개 상태는 연결 종료를 위해 서로간에 신호를 주고받는 과정에 나타나는 상태로 이해하면 된다.
  종료 요청을 한 곳에서는 FIN_WAIT1, FIN_WAIT2, TIME_WAIT 상태가 종료 요청을 받는 곳에서는 CLOSE_WAIT, LAST_ACK 상태가 표시된다.

3) 기타

CLOSING   : 연결은 종료되었으나 전송도중 데이타가 분실된 상태
UNKNOWN   : 소켓의 상태를 알 수 없음

솔라리스의 netstat 명령에서는 다음 2개의 상태를 더 표시한다.

IDLE    : 소켓이 열렸지만 binding 되지 않은 상태
BOUND    : listen이나 연결을 위한 준비 상태

※ 참고 문서 
- netstat 맨페이지(linux, solaris)
- RFC 793 ( http://www.ietf.org/rfc/rfc0793.txt )

출처 : 커피닉스( http://coffeenix.net/ )
작성 : 좋은진호
출처 : http://sinilyu.linuxstudy.pe.kr/qaboard/QaBoardContentProcess.php3?page=6&no=780&s_name=&s_value=




자신의 컴퓨터와 연결되었거나 연결될 목록을 프로토콜과 함께 보여주는 명령어

유닉스나 윈도우에는 사용자 컴퓨터의 네트워크의 상태를 알려주는 netstat라는 명령어가 있다. 즉 어떤 포트가 열려 있고 어떻게  사용되고 있는지 모두 알 수가 있고 이 명령어를 잘 활용하면 맨손으로도 해킹을 감지해 낼 수 있습니다. 그러나 사용자의 대부분은  netstat란 명령어를 모르고 있는것 같아 이번에는 netstat명령어의 사용법을 익힘으로써 다른 소프트웨어 도움을 받지 않고  해킹을 감지해 내는 능력을 길러봅니다.

1. netstat로 알아보는 내 컴퓨터의 포트상태
c:>netstat
Proto    Local Address    Foreign Address    State
TCP     acy7807:1023       211.233.45.89:80     ESTABLISHED

- Proto : 현재 사용한 프로토콜
- Local Address : 현재 열려 있는 사용자 컴퓨터의 IP/호스트 네임과 사용중인 포트
- Foreign Address : 현재 사용자의 컴퓨터에 접속되어 있는 IP/호스트 네임과 사용중인 포트
- State : 연결 상태를 나타내는 것
  - ESTABLISHED : 현재 연결되어 있다는 뜻
  - LISTENING : 연결을 위하여 접속을 기다리는 상태
  - TIME_WAIT : 이미 해당 사이트와 연결이 종료되었거나 다음 연결을 위해 기다리는 상태
  - SYN_SENT : 접속하기 위해 패킷을 보냈다는 뜻



2. netstat옵션 배우기
c:>netstat ?

netstat -a : 연결된 혹은 연결을 기다리고 있는 모든 포트를 보여줍니다. -a 옵션이 없으면 연결된 목록만 보여주는데, -a 옵션을 주면 연결되었거나 연결을 기다리는 목록을 모두 보여줍니다.

netstat -n : 통상 연결 목록이 컴퓨터 이름이 나오는데, -n 옵션을 주면 컴퓨터 이름 대신 ip 주소가 뜹니다.

netstats -an or -na : 컴퓨터와 연결되었던 혹은 연결을 기다리는 목록을 ip 주소로 바꾸어서 보여줍니다.

이제 netstat 명령을 알았으니 가끔씩 실행시켜주면 됩니다. netstat 명령으로 검색했을 때 알 수 없는 포트가 있거나,  포트중에 31337, 12345, 54321과 같이 트로이 목마가 사용하는 포트가 하나 열려 있거나 열려진 포트로 특정 IP가 접 속해 있다면 이는 십중팔구 해킹인 것입니다.


///// 응용 /////
#netstat -nap (열려 있는 모든 포트)
#netstat -l 또는 netstat -nap | grep LISTEN (LISTEN 되는 모든 포트)
#netstat -nap | grep ESTABLISHED | wc -l ( 모든 서비스 동시 접속자 수)
#netstat -nap | grep :80 | grep ESTABLISHED | wc -l ( 웹 동시 접속자 수)