* psad를 이용한 포트 스캔 탐지.

 TCP/IP 슈트 전체를 모두 구현하면 대규모의 복잡한 코드가 되며, 이러한 복잡도는 정탐 시도에서 서비스 거부 공격에 이르는 모든 공격의 좋은 목표가 된다.

 포트 스캔은 원격 목표에서 정보를 얻기 위한 중요한 기술로 psad는 기본적으로 리눅스 시스템을 위한 고급 포트 스캔 탐지 기능을 제공할 목적으로 개발됐다.

 3장에서와 마찬가지로 시스템을 포트 스캔하기 위해 Nmap을 사용한다. 그러나 이번에는 스캔 목표가 iptables 로그를 분석하기 위한 psad를 실행 중이다. Nmap을 사용해서 다음과 같은 종류의 포트 스캔을 생성하고 이를 psad가 어떻게 탐지하는지 알아보자.

 TCP connect() 스캔
 TCP SYN이나 반개방 스캔
 TCP FIN, XMAS, NULL 스캔
 UDP 스캔

 먼저 psad를 실행시키자.

 NMAP과 왕복시간.

 이 절의 스캔 예제 대부분에서 Nmap의 시간 관련 옵션(예를 들어 -T와 –max-rtt-timeout)은 Nmap이 얼마나 빨리 목표를 스캔할 수 있는지에 영향을 미친다. iptables는 로컬 스택이 각 스캔 탐사에게 전송할 수 있는 응답을 강하게 제한하기 때문에 Nmap이 절대로 받지 못한 응답을 기다리는 시간을 제한하는 것이 좋다. 예를 들어 Nmap이 포트 5000으로 SYN 패킷을 전송하는 경우 iptables는 이것을 버리기 때문에 목표 스택은 절대 Nmap이 기다리는 SYN/ACK이나 RST/ACK를 전송하지 않는다. (–max-rtt-timeout 옵션을 사용해서) Nmap이 이러한 응답을 기다리는 시간을 줄임으로써 시스템 스캔에 필요한 전체 시간을 단출할 수 있다(–max-rtt-timeout 값의 적절한 상향 값을 결정하는 방법 중 하나는 스캔 시작 전에 목표까지의 왕복 시간을 측정하기 위해 ping 유틸리티를 사용하는 것이다).

 – TCP connect() 스캔

 Nmap TCP connect() 스캐닝 모드(-sT)는 유닉스 방식의 운영체제에서는 특권을 가지지 않은 사용자도 이를 사용할 수 있다. 우선 목표 IP 주소 X.X.X.X에 대한 TCP connect() 스캔을 살펴보자.

soft-ftp:/etc# nmap -sT -n 117.17.172.120 –max-rtt-timeout 500

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-07-01 23:34 KST
Interesting ports on 117.17.172.120:
Not shown: 1672 filtered ports
PORT    STATE  SERVICE
20/tcp  closed ftp-data
21/tcp  open   ftp
22/tcp  open   ssh
43/tcp  closed whois
53/tcp  closed domain
80/tcp  open   http
443/tcp closed https
873/tcp closed rsync

 chd 1672 개 이상의 포트를 스캔 했지만, iptables 가 connection 시도의 대부분을 버리기 때문에 예상대로 거의 전부 필터링됐다. 스캔이 끝나면 psad가 스캔을 탐지했는지 알아보기 위해 /var/log/message 파일을 보자.

Jul  1 23:51:01 seclab psad: scan detected: Y.Y.Y.Y -> X.X.X.X tcp: [1-65301] flags: SYN tcp pkts: 1498 DL: 4
 Jul  1 23:51:06 seclab psad: scan detected: Y.Y.Y.Y -> X.X.X.X tcp: [44-13701] flags: SYN tcp pkts: 51 DL: 4

 psad syslog 메시지에서는 출발지와 목적지 IP 주소, 스캔된 TCP 포트의 범위(1 ~ 655301), 전송된 플래그(이 경우 SYN), 전송된 전체 패킷 수, psad가 이 스캐너에 할당한 위험 수준(DL:4)을 확인할 수 있다.

 이 경우 psad가 감시한 패킷 수는 1498 + 51개이며 이는 (/etc/psad/psad.conf 에 DANGER_LEVEL4 변수로 정의된) 위험 수준 4에 도달하기 위한 1500개를 넘는 수치이다. psad는 메일 경고도 생성하며 메일 경고에는 한 줄짜리 syslog 메시지에 담을 수 있는 것보다 훨씬 더 많은 정보가 포함된다.

 스캔하기 위해 psad가 사용한 iptables 로그 메시지를 보기 위해서 /var/log/psad/fwdata 파일을 살펴보자.

Jul  1 23:50:41 seclab kernel: [3742118.695465] DROP IN=eth0 OUT= MAC=00:21:5e:4e:bb:da:00:11:88:42:99:43:08:00 SRC=Y.Y.Y.Y DST=X.X.X.X LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=37394 DF PROTO=TCP SPT=50333 DPT=25 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A240A475B0000000001030304)
Jul  1 23:50:41 seclab kernel: [3742118.695615] DROP IN=eth0 OUT= MAC=00:21:5e:4e:bb:da:00:11:88:42:99:43:08:00 SRC=Y.Y.Y.Y DST=X.X.X.X LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=35732 DF PROTO=TCP SPT=43748 DPT=3389 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A240A475B0000000001030304)
Jul  1 23:50:41 seclab kernel: [3742118.695676] DROP IN=eth0 OUT= MAC=00:21:5e:4e:bb:da:00:11:88:42:99:43:08:00 SRC=Y.Y.Y.Y DST=X.X.X.X LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=44122 DF PROTO=TCP SPT=47712 DPT=1723 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A240A475B0000000001030304)
Jul  1 23:50:41 seclab kernel: [3742118.696293] DROP IN=eth0 OUT= MAC=00:21:5e:4e:bb:da:00:11:88:42:99:43:08:00 SRC=Y.Y.Y.Y DST=X.X.X.X LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=931 DF PROTO=TCP SPT=45962 DPT=389 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A240A475B0000000001030304)

  이제 로그를 분석해보자.

 먼저 출력 인터페이가 빈칸인 문자열 OUT= 은 로그 메시지를 생성한 패킷이 iptables INPUT 체인 내에서 LOG 규칙과 매칭됐는지 아니면 커널에서 라우팅 계산을 수행하기 전에 어떤 체인(예를 들어 raw 테이블의 PREROUTING 체인)의 LOG 규칙과 매칭됐는지 알려준다.

 iptables 로깅 형식은 LOG 규칙을 포함하는 iptables 체인을 명시적으로 포함하지 않기 때문에 위 로그 메시지로부터는 패킷이 INPUT 체인과 PREROUTING 체인 중 어느 쪽으로부터 기록됐는지 알 수 없다. 그러나 iptables 정책이 PREROUTING이나 POSTROUTING 체인보다는 INPUT, FORWARD, OUTPUT 체인에 더 많은 기본 LOG 규칙을 두기 때문에 psad는 오든 iptables 로그 메시지에 다음과 같은 규칙이 적용된다고 가정한다.

 – 출력 인터페이스를 포함하지 않는 메시지는 INPUT 체인에서 기록된 것이다.
 – 입력 인터페이스를 포함하지 않는 메시지는 OUTPUT 체인에서 기록된 것이다.
 – 입력과 출력 인터페이스를 모두 포함하는 메시지는 FORWARD 체인에서 기록된 것이다. 

 그러므로 앞서 논의한 TCP connect() 스캔의 경우 psad는 스캔이 INPUT 체인을 통해 기록됐다고 가정하며, iptables.sh 스크립트가 생성한 iptables 정책으로부터 따져보면 이것이 사실임을 알 수 있다. 출발지 IP 주소 Y.Y.Y.Y 는 로그 메시지에 포함되므로 psad는 스캔이 시작된 지점을 알 수 있다.

 – 때때로 스캔이 정교하게 스푸핑될 수 있기 때문에 이 IP 주소가 스캔의 실제 출발지라고 전적으로 믿을 수 없다는 사실을 기억하자. Nmap은 루트로 실행될 때 미끼(decoy) 옵션(-D)을 사용해서 스푸핑된 스캔을 전송할 수 있으며, Idle 스캔은 필수 구성 요소로 IP 스푸핑을 사용한다.

  다음으로 굵게 표시된 PROTO=TCP 와 이후의 항목들을 조합해 보면 스캔된 프로토콜과 포트, 사용된 플래그 등을 알 수 있다. 이 예에서 스캔 수행자는 TCP 포트에 관심이 있으며, 스캔 패킷은 SYN 플래그만을 설정하고 있다.

 앞선 connect() 스캔에서는 총 1672 개의 포트를 스캔했지만 /var/log/psad/fwdata 파일에 기록된 iptables 로그 메시지는 1498 + 51 개 뿐이라는 것을 상기하자. 이 차이는 iptables가 로그 메시지를 생성하는 속도와 Nmap으로부터의 SYN 패킷 재전송이라는 두 가지 요소에서 기인한다. 내부적으로는 iptables는 커널 내의 고리 버퍼에 기록하기 때문에 이전 메시지를 명명된 파이프 /var/lib/psad/psadfifo 에 기록하기 전에 새로운 메시지로 고리 버퍼를 덮어쓸 수 있을 정돞포 트래픽 속도가 빠르다면 이전 메시지는 손실된다. 트레이드 오프는 몇 개의 로깅 메시지를 잃는 대신 시스템이 어느 정도 안정된 수준을 유지하며 작업을 지속할 수 있다는 것이다.(이는 좋은 트레이드오프로 볼 수 있다). Nmap은 주로 응답하지 않는 포트당 하나의 재시도 패킷을 전송하기 때문에 이 예의 스캔에서 Nmap은 실제로 이보다 더 많은 패킷을 전송했다.

 – TCP SYN 이나 반개방 스캔

 이제 Nmap의 SYN(또는 반개방) 스캔 방법을 살펴보자. SYN 스캔은 Nmap이 특권 사용자에 의해 실행될 때의 기본 스캔 방식이다(실제로 이 스캔을 포함한 기타 흥미로누 Nmap 스캔 방식이 원시 소켓으로의 접근을 필요로 하기 째문에 특권 사용자만이 실행할 수 있다).

 목표 시스템의 iptables 방화벽이 TCP 포트 80으로 전송되는 모든 SYN 패킷을 버리게 설정됐기 때문에 네트워크상에서 SYN 스캔은 정규 TCP connect() 스캔과 거의 동일하게 보이는데, 이는 스캐너의 TCP 스택이 응답해야 하는 SYN/ACK 패킷이 거의 없기 때문이다. 동일한 출발지 주소로부터의 SYN 패킷을 볼 수 있을 뿐 그 밖의 어떤 것도 볼 수 없다.

 이러한 논증이 이론적으로는 일반적으로 정당해 보이지만 실제로는 SYN 스캔과 connect() 스캔 모두에서 iptables이 초기 SYN 패킷을 버림에도 불구하고 두 스캔간에는 몇 가지 중대한 차이점이 존재한다. 이러한 차이점은 SYN 스캔 모드의 Nmap이 전송한 SYN 패킷과 Nmap connect() 스캔을 통해 TCP 스택 자체가 전송한 SYN 패킷과 Nmap connect() 스캔을 통해 TCP 스택 자체가 전송한 SYN 패킷의 특정 패킷 헤더 항목에 존재한다. 3장에서 살펴보았듯이 SYN 스캔보다 connect() 스캔에 의해 전송되는 TCP 옵션이 훨씬 더 많다.

 아래 명령어를 통해 IP 주소가 X.X.X.X 에 대한 SYN 스캔을 시작한다.

soft-ftp:/etc# nmap -n X.X.X.X –max-rtt-timeout 500

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-07-02 01:01 KST
Interesting ports on X.X.X.X:
Not shown: 1672 filtered ports
PORT    STATE  SERVICE
20/tcp  closed ftp-data
21/tcp  open   ftp
22/tcp  open   ssh
43/tcp  closed whois
53/tcp  closed domain
80/tcp  open   http
443/tcp closed https
873/tcp closed rsync

Nmap finished: 1 IP address (1 host up) scanned in 19.909 seconds

 /var/log/message 파일을 보면 psad가 이 스캔을 탐지 했음을 알 수 있다.

Jul  2 01:17:54 seclab psad: scan detected: Y.Y.Y.Y -> X.X.X.X tcp: [5-61439] flags: SYN tcp pkts: 1002 DL: 4
Jul  2 01:18:01 seclab psad: scan detected: Y.Y.Y.Y -> X.X.X.X tcp: [2-65301] flags: SYN tcp pkts: 1166 DL: 4
Jul  2 01:18:06 seclab psad: scan detected: Y.Y.Y.Y -> X.X.X.X tcp: [7-44334] flags: SYN tcp pkts: 469 DL: 4

  3차례에 걸쳐 1500 개가 넘는 패킷이 전송됐으며, 이는 psad.conf 파일의 DANGER_LEVEL4 보다 크기 때문에 스캐너는 위험 수준 4에 도달했다.

 connect() 스캔에서와 같이 목표 시스템의 iptables는 tmzosdml SYN 패킷을 기록했다.

Jul  2 01:18:02 seclab kernel: [3747359.638824] DROP IN=eth0 OUT= MAC=00:21:5e:4e:bb:da:00:11:88:42:99:43:08:00 SRC=210.125.219.48 DST=117.17.172.120 LEN=44 TOS=0x00 PREC=0x00 TTL=53 ID=14339 PROTO=TCP SPT=61604 DPT=1413 WINDOW=4096 RES=0x00 SYN URGP=0 OPT (020405B4)

이번에는 iptables 로그 메시에서 TCP connect() 스캔과 다른 부분을 굵게 나타냈다. 이 항목과 이들이 connect() 스캔과 다른 이유는 다음과 같다.

 – LEN : IP 헤더의 길이 항목으로 실제 TCP 스택은 SYN 패킷에 connect() 스캔을 통해 전송하는 SYN 패킷보다 더 많은 옵션을 포함하기 때문에 SYN 스캔이 14 바이트만큼 짧다.

 – TTL : IP 헤더의 해킷 유지 시간(TTL, Time-to-Live) 값은 TCP connect() 스캔 동안 클라이언트 시스템의 실제 IP 스택에 의해 항상 동일한 값으로 초기화된다. 그러나 SYN 스캔 시 Nmap은 TCP SYN 패킷을 직접 생성하기 때문에 TTL 값을 어떤 값으로도 설정할 수 있으며, Nmap은 37과 60 사이의 TTL 값 중 하나를 무작위로 선택한다.

 – WINDOW : Nmap이 SYN 스캔 동안 설정하는 TCP 윈도우 크기는 1024, 2048, 3072, 4096 중 하나다. 반면 실제 TCP 스택은 TCP 연결을 항상 윈도우 크기 5840으로 초기화한다.

 – OPT : TCP 헤더의 옵션 부분은 Nmap SYN 스캔의 경우가 훨씬 더 짧다. 이 예에서 Nmap은 최대 세그먼트 크기 옵션만을 사용하며 이를 1460으로 설정한다. 대부분의 실제 TCP 스택은 최대 세그먼트 크기 외에도 타임스탬프, 연산 없음(NOP), 선택적 승인이 가능한지 여부(SACK)와 같이 다수의 옵션을 전송한다.

 * psad 를 이용한 경고와 보고.

 psad는 일단 iptables에 대해 수상한 하나의 이벤트나 이벤트들이 발생했다고 판단하면 관리자에게 경고한다. psad 의 목표는 관리자가 적절한 응답을 선택할 수 있게 최대한 많은 정보를 제공하는 것이다.

 – psad 메일 경고.

 메일 메시지는 syslog 경고보다 훨씬 더 많은 정보를 포함할 수 있으며, 어디서나 확인할 수 있고 휴대폰이나 기타 휴대 장비와 잘 통합돼 있기 때문에 메일은 psad의 제 1차 경고 기법이다.

Message 1054537:
From root@A.B.C.D  Thu Jul  1 23:23:40 2010
X-Original-To: root@localhost
To: root@localhost
Subject: [psad-alert] DL5 src: 169.254.X.X dst: 255.255.255.255
Date: Thu,  1 Jul 2010 23:23:39 +0900 (KST)
From: root@A.B.C.D (root)

=-=-=-=-=-=-=-=-=-=-=-= Thu Jul  1 23:23:39 2010 =-=-=-=-=-=-=-=-=-=-=-=

* 스캔 위험 수준, 포트, 플래그——————————————-
         Danger level: [5] (out of 5)

    Scanned UDP ports: [67: 1 packets, Nmap: -sU]
       iptables chain: INPUT (prefix “DROP”), 1 packets

* 출발지와 목적지 IP 주소 ——————————————–
               Source: 169.254.X.X
                  DNS: [No reverse dns info available]

          Destination: 255.255.255.255
                  DNS: [No reverse dns info available]

* syslog 호스트명, 시간 간격, 요약 정보 ———————————
   Overall scan start: Tue Nov 24 21:47:43 2009
   Total email alerts: 167109
      Syslog hostname: seclab

         Global stats: chain:   interface:   TCP:   UDP:   ICMP: 
                       INPUT    eth0         0      36101  0     

* whois 데이터베이스 정보 ——————————————–
[+] Whois Information:

OrgName:    Internet Assigned Numbers Authority
OrgID:      IANA
Address:    4676 Admiralty Way, Suite 330
City:       Marina del Rey
StateProv:  CA
PostalCode: 90292-6695
Country:    US

NetRange:   169.254.0.0 – 169.254.255.255
CIDR:       169.254.0.0/16
NetName:    LINKLOCAL-RFC3927-IANA-RESERVED
NetHandle:  NET-169-254-0-0-1
Parent:     NET-169-0-0-0-0
NetType:    IANA Special Use
NameServer: BLACKHOLE-1.IANA.ORG
NameServer: BLACKHOLE-2.IANA.ORG
Comment:    This is the “link local” block. It was set
Comment:    aside for this special use in the Standards
Comment:    Track document, RFC 3927 and was further
Comment:    documented in the Best Current Practice
Comment:    RFC 5735, which can  be found at:
Comment:    http://www.rfc-editor.org/rfc/rfc3927.txt
Comment:    http://www.rfc-editor.org/rfc/rfc5735.txt
Comment:    It is allocated for communication between hosts
Comment:    on a single link. Hosts obtain these addresses
Comment:    by auto-configuration, such as when a DHCP
Comment:    server cannot be found.
Comment:    A router MUST NOT forward a packet with an IPv4
Comment:    Link-Local source or destination address,
Comment:    irrespective  of the router’s default route configuration
Comment:    or routes obtained from dynamic routing protocols.
Comment:    A  router which receives a packet with an IPv4
Comment:    Link-Local source or destination address MUST NOT
Comment:    forward the packet. This prevents forwarding of
Comment:    packets back onto the network segment from which
Comment:    they originated, or to any other segment.
RegDate:    1998-01-27
Updated:    2010-03-15

OrgAbuseHandle: IANA-IP-ARIN
OrgAbuseName:   Internet Corporation for Assigned Names and Number
OrgAbusePhone:  +1-310-301-5820
OrgAbuseEmail:  abuse@iana.org

OrgTechHandle: IANA-IP-ARIN
OrgTechName:   Internet Corporation for Assigned Names and Number
OrgTechPhone:  +1-310-301-5820
OrgTechEmail:  abuse@iana.org

# ARIN WHOIS database, last updated 2010-06-30 20:00
# Enter ? for additional hints on searching ARIN’s WHOIS database.
#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at https://www.arin.net/whois_tou.html
#
# Attention! Changes are coming to ARIN’s Whois service on June 26.
# See https://www.arin.net/features/whois for details on the improvements.

 * psad syslog 보고.

 메일 경고와 함께 syslog도 psad의 중요한 보고 기법이다. 보통 psad는 동작하는 동안 세 종류의 syslog 경고를 생성한다.

 – 정보 메시지

 psad는 주기적으로 psad가 수행한 관리 동작을 관리자에게 알려주기 위해 설계된 정보 syslog 메시지를 생성하며, 이에는 설정 파일 읽어오기와 이전 psad 실행으로부터의 스캔 정보 등이 있다.

 예를 들어 psad는 시작할때 다음과 같은 syslog 메시지를 생성한다.

Jul  1 23:50:13 seclab psad: imported valid icmp types and codes
Jul  1 23:50:13 seclab psad: imported p0f-based passive OS fingerprinting signatures
Jul  1 23:50:13 seclab psad: imported TOS-based passive OS fingerprinting signatures
Jul  1 23:50:13 seclab psad: imported auto_dl, got 0 IP addresses and 1 networks
Jul  1 23:50:14 seclab psad: imported original Snort rules in /etc/psad/snort_rules/ for reference info
Jul  1 23:50:14 seclab psad: imported 205 psad Snort signatures from /etc/psad/signatures
Jul  1 23:50:16 seclab psad: imported 239 scanning IP addresses from previous psad instance

 – 스캔과 서명 매칭 메시지

 syslog 메시지의 가장 중요한 부분은 스캔과 기타 수상한 트래픽에 대해 알려준다. 이러한 메시지는 출발지 IP 주소에서 포트, 프로토콜, 스노트 규칙 매칭에 이르는 모든 것을 포함하며, 다음과 같은 syslog 메시지는 psad 스캔 경고를 보여준다. 이 메시지는 psad가 탐지한 스캔 유형을 사용자가 식별할 수 있게 TCP 플래그 정보도 포함한다.

Jul  1 23:50:25 seclab kernel: [3742102.777745] DROP IN=eth0 OUT= MAC=ff:ff:ff:ff:ff:ff:00:25:11:48:00:69:08:00 SRC=X.X.X.X DST=255.255.255.255 LEN=68 TOS=0x00 PREC=0x00 TTL=128 ID=10689 PROTO=UDP SPT=1037 DPT=1947 LEN=48
Jul  1 23:50:41 seclab kernel: [3742118.698007] DROP IN=eth0 OUT= MAC=00:21:5e:4e:bb:da:00:11:88:42:99:43:08:00 SRC=X.X.X.X DST=Y.Y.Y.Y LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=42913 DF PROTO=TCP SPT=50650 DPT=1453 WINDOW=5840 RES=0x00 SYN URGP=0 OPT (020405B40402080A240A475B0000000001030304)

 – 자동 응답 메시지
 
 트래픽 출발지 IP 주소에 대해 iptables 차단 규칙을 적용함으로써 psad를 사용해서 수상한 트래픽에 응답할 수 있다. 이 기능은 기본적으로 비활성화돼 있다.

 * 정리

 6장에서는 Nmap을 이용해서 iptablesfw 시스템에 수행한 포트 스캔을 psad가 탐지하고 보고하는 것과 같은 psad 동작 측면을 소개했다. 메일 경고가 psad의 제1차 경고 기법이지만 psad는 syslog 경고도 제공한다. 7장에서는 iptables 로그 메시지를 통해 스노트 규칙과 매칭되는 트래픽의 탐지와 같이 좀 더 어려운 psad 관련 주제를 살펴본다.

Tags: , , , , ,

1 Comment on 6.psad 동작: 수상한 트래픽 탐지.

  1. 탱이 says:

    오랜만에 다시금 방화벽 책을 잡았다…

    열심히하자…!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.