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

 * 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 관련 주제를 살펴본다.

Nmap 사용하기

 * Nmap 사용하기

 * 당신은 Nmap을 네트웍에 침입하는 도구로 생각할 지도 모른다. 처음에 Nmap이 나왔을 때는, 이 툴은 해킹 툴로 사용됐지만, 곧 IT 전문가도 이 툴을 사용하기 시작했다. 왜냐하면,  이 툴은 네트웍에 대한 훌륭한 정보를 제공해 주기 때문이다. IT전문가가 이툴을 사용해서 할 수 있는 일은 다음과 같다.

 – 자신의 네트워크 감사(audit) : 이 애플리케이션을 사용하면, 안전하지 못한 포트를 사용하고 있는 호스트를 빠르게 찾아낼 수 있다.
 – 방화벽 설정 테스트 : Nmap을 사용하면 방화벽이 특정 포트들을 잘 막고 있는지 여부를 확인할 수 있다.
 – 수상한 원격지 시스템 파악 : 비록 당신을 스캐닝한 시스템에 대해 역으로 포트 스캔을 하는 것이 바람직한 것은 아니지만, 이것을 함으로써 누가 당신의 시스템에 침입하려는지를 빠르게 알 수 있다.
 – 라우터와 스위치 설정 검사 : TCP/IP 에는 하나의 echo 요청을 보내서, 모든 호스트가 그것에 응답하게 하는 내장 기능이 있다. 이 기능을 사용하면 모든 호스트가 기본 게이트웨이에 접근할 수 있는지를 테스트 할 수는 있지만, 악의의 사용자가 이것을 악용할 수 있다. 악의적인 사용자는 여러 툴을 사용해서 당신의 네트워크에서 다른 네트워크로 공격하게 할 수 있다.

 그러니까 누군가가 Nmap을 사용해서 당신의 시스템을 스캔할 수도 있다.
 그렇지만 이 툴을 잘만 이용하면 당신의 네트워크를 보호하는데 큰 도움이 된다.

 * Nmap은 단지 포트 스캐너일까?

 Nmap은 본질적으로 GSS(Gnome Service Scan)와 같은 호스트 스캐너이다. 그렇지만 사람들이 Unix 기반의 스캐너 중에서 이 툴을 가장 많이 쓰는 이유는 다음과 같은 부가 기능이 있기 때문이다.

 – 빠른 핑(ping) 및 포트 스캔 기능 : 당신은 시스템이 살아있는지 여부와 어떤 포트를 사용하고 있는지를 알 수 있다.
 – 운영체제 핑거프린팅(fingerprinting) : Nmap은 자신이 스캔하는 호스트의 운영 체제를 추측하는 기능이 있다. 이것은 비록 추측이긴 하지만, 많은 정보에 기반을 둔 추측이므로 매우 정확하다. 왜냐하면, Nmap은 수 많은 운영체제에서 뽑아낸 TCP, UDP, IP 응답 데이터베이스를 갖고 있기 때문이다. Nmap은 원격지 시스템에 특정 패킷을 보내 본 다음, 거기서 돌아오는 응답을 데이터베이스와 비교한다. 운영 체제 벤더들이 TCP/IP를 구현할 때, Request for Commecnts(RFCs)라고 불리는 문서들을 참고한다. 이 문서는 www.faqs.org/rfcs/index.html 에서 구할 수 있다. 그렇지만 이 문서에 따라 구현한 TCP/IP가 각 벤더마다 조금씩 다르다.
 Nmap은 이 차이점을 구분해서 운영 체제를 판단한다.
 – 순서 번호 추측(sequence prediction) : 모든 TCP 통신에서는, 각 시스템이 자신이 보내는 패킷의 순서 번호를 관리한다. 이 순서 번호는 TCP 3-way handshake 과정에서 결정된다. Nmap은 이 순서 번호를 추측할 수 있다. Windows NT 4.0 서비스 팩 5 이전 버전과 같은 시스템에서는, 이 순서 번호가 랜덤 값이 아니었기 때문에 쉽게 추측할 수 있었다. 과거게, 해커들은 이런 시스템들의 간단한 TCP 순서 번호를 추측해서, TCP 연결을 가로채는데 사용했다.
 Nmap은 이런 순서 번호를 추측할 수 있는지를 검사해 준다. 리눅스 최근 버전과 같은 운영체제들은, 순서 번호를 랜덤으로 생성하기 때문에 이 번호를 추측하기가 매우 어렵다.
 – TCP 기반 연결을 다양하게 흉내냄 : TCP 연결을 맺을 때, 일정 시간(수 밀리초)동안 handshake를 수행한다. 많은 방화벽에서는, 특정 내부 시스템으로 향하는 초기 SYN 패킷을 버린다. 왜냐하면 네트워크 관리자들은 외부 호스트에서 내부 호스트로 접속하는 것(방화벽을 통하지 않고)을 바라지 않을 경우가 많기 때문이다. 대부분의 스캐너는 SYN 패킷을 사용해서 검사를 하기 때문에, 중간에 패킷이 버려지는 경우가 많다.
 Nmap은 방화벽에서 허용하는 패킷을 사용해서 포트 스캔을 할 수 있기 때문에, 방화벽 내부에 있는 호스트 들고 검사할 수 있다.
 – 스푸핑(spoofing) 기능 : 많은 네트워크 관리자는 누가 자신의 네트워크를 스캔했는지 알려고 한다. Nmap의 스푸핑 기능을 사용하면, 악의적인 사용자는 자신의 시스템을 다른 호스트인것처럼 가장할 수 있다. 그래서 시스템 관리자들은 무고한 사람을 공격자로 착각할 수도 있다. IT 전문가들은 이 기능을 사용해서 방화벽 구성을 테스트할 수 있다.
 – 스캔 속도와 순서 조절 기능 : 많은 침입 탐지 시스템(Instrusion Detection System, IDS)애플리케이션은 네트워크 호스트들이 순서대로 스캔 공격을 받고 있을 때 경고를 발생한다. 또, 몇몇 호스트가 짧은 시간 안에 스캔을 받을 경우에도 경고를 발생한다. Nmap을 사용하면, 당신은 공격을 천천히 할 수 있다. 악의적인 사용자는 이 기능을 사용해서 침입 탐지 시스템을 피할 수 있다.
 IT 전문가는 방화벽이나 침입 탐지 시스템을 감사(audit)하는데 이 기능을 사용한다.
 – 출력을 텍스트 파일에 저장하는 기능 : 이 기능을 사용하면, Nmap의 출력을 다른 프로그램에서도 사용할 수 있고, 나중을 위해 저장해 둘 수도 있다.
 – 텍스트 파일에서 입력 정보를 읽는 기능 : 이 기능을 사용하면 입력 정보를 텍스트 파일로부터 읽을 수 있다.

 * Nmap을 받아 설치하기

 Nmap은 별다른 라이브러리를 사용하지 않기 때문에, 여러 Unix 시스템에서 동작할 수 있다. 일반적으로, Red hat 시스템에서는 tarball보다 RPM을 사용하는 것이 좀 더 안정적이다. Nmap의 경우는, 컴파일시 줄 수 있는 옵션이 없기 때문에, tarball 파일을 쓰는 장점이 없다. 그래서 당신의 배포판용 RPM이 나와 있다면 RPM을 사용하는 것이 좋다. 참고로 우분투에서는 다음의 명령어를 사용한다.

 $ sudo apt-get install nmap

 * 자주 사용하는 Nmap 옵션

 Nmap의 장점의 하나는, 여러 용도로 사용할 수 있다는 것이다. 당신은 이 툴을 내부 네트워크에 있는 시스템의 포트를 검사할 때 사용할 수도 있고, 외부 네트워크에 있는 원격지 시스템의 운영체제를 알아내느느데 사용할 수도 있다.이 툴을 사용해서 시스템을 한번만 검사할 수도 있고, 대화형 모드에서 여러번 검사할 수도 있다.
 다음절에 나오는 두가지 스캔 옵션은, 다양한 스캐닝 어플리케이션에서 많이 사용하는 것들이다. 그렇지만 이 옵션들은 SYN을 사용하기 때문에 방화벽에서 버려질 수 있다. 또한, 방화벽이나 IDS 애플리케이션에서 이 스캔 정보를 로그로 기록할 수도 있다.

 P0 : 기본적으로 Nmap은 ICMP 메시지를 각 원격지 호스트에 전송한다. 이 옵션을 사용하면 Nmap은 ICMP 메시지를 전송하지 않는다. 이 옵션은 ICMP 메시지에 응답하지 않는 시스템들이 실제로 네트워크와 연결돼 있지 않은지 검사할 때 유용하다. 당신이 이 옵션을 사용할 때는, Nmap에서 제공하는 정보가 정확하지 않을 수도 있다는 것을 염두에 두어야 한다.

 -sP : Nmap에서 오직 ICMP 만을 사용하여 표준 핑(ping) 스캔을 하게 한다. Nmap 옵션중에, 앞에 -s가 분은 것은 스텔스(stealth)옵션이라고 하는데, 이것은 방화벽이나 IDS에 발각되지 않게 패킷을 보내는 것을 의미한다.

 -PT : Nmap에서 다른 호스트를 핑(ping)할 때, ICMP대신 TCP 패킷을 사용하게 한다. 이 옵션은 방화벽에서 ICMP와 TCP 패킷을 제대로 막는지 테스트할 때 유용하게 쓸 수 있다. 당신이 -PT 옵션을 사용하면, Nmap은 TCP ACK 패킷을 보낸다. 그리고 상대방 호스트에서 RST 패킷을 보내기를 기다린다. 많은 방화벽에서는 ACK와 RST 패킷을 지나가도록 허용하기 때문에, 당신은 스캔을 잘 수행할 수 있을 것이다.

 -sT : 원격지 시스템의 각 포트에 완전한 TCP 연결을 맺는다.(3-way handshake를 모두 수행한다.)

 -sS : TCP의 SYN 기능을 사용한다. TCP에서 연결을 시작할 때, 한 호스트는 다른 호스트에게 연결을 원한다는 의미로 SYN 패킷을 보낸다. Nmap이 SYN 패킷을 보내면, 이 때는 half-open 연결이 성립된다.(-sT에서 수행하는 3-way handshake를 모두 수행하지 않았다는 뜻이다.). 다른 호스트가 그 연결을 계속 진행하고 싶지 않다는 메시지를 보낼 경우에도, Nmap은 포트가 열려 있는지를 판단할 수 있는 많은 정보를 얻을 수 있다.

 -O : Nmap이 운영 체제 버전을 추측하도록 한다. 이 기능을 사용하면 악의적인 사용자들이 호스트의 운영체제를 파악할 수 있고, 그 운영체제와 관련된 공격들을 수행할 수 있다. 그래서 이 기능은 Nmap을 유명하게 만든 이유의 하나가 되었다. Nmap은 운영 체제 서명(Signature)데이터베이스를 사용한다. Nmap은 스캔을 한 뒤 정보를 얻어서, 데이터베이스에 있는 정보와 비교한다. Nmap의 개발자들은 이 서명(Signature) 데이터베이스를 최신의 것으로 유지하기 위해 많은 노력을 하고 있다. 각 운영 체제마다 TCP/IP 구현이 조금씩 다른데, Nmap은 이 정보를 운영체제를 판단하는 기준의 하나로 사용한다.

 -v : Nmap을 verbose 모드로 만든다. 이 모드에서는 Nmap이 원격지 호스트에 보내는 정보, 원격지 호스트에서 응답하는 정보들을 자세히 알 수 있다. 당신이 -v -v 옵션을 사용하면, Nmap에서는 더 많은 정보를 출력할 것이다.

 * 적용 예제

 당신의 로컬 네트워크에 있는 호스트 중에서 동작하고 있는 호스트들을 알고 싶다고 하자. 당신의 네트워크 주소가 10.100.100.0 이고, 서브넷 마스크가 255.255.255.0 이라고 하자.
 그러면 다음의 명령을 실행하면 된다.

 $ nmap -sP 10.100.100.0/24

 당신이 -v 옵션을 사용하면, 동작하지 않는 시스템의 목록도 볼 수 있따. 만약 원격지 호스트에 핑(ping)을 보내려 하는데 중간에 있는 라우터나 방화벽에서 ICMP 패킷을 허용하지 않는다면, -sT 옵션을 사용하는 것이 좋다.
 다음 명령은 TCP half-open 스캔을 수행하고, 운영 체제의 정보를 알아낸다. 이 때, 호스트에 핑(ping)을 보내지는 않는다.

 $ nmap -sS -O -p0 host

 당신이 -v 옵션을 추가하면, Nmap이 어떻게 동작하는가에 대한 더 많은 정보를 얻을 수 있다.

 * 전체 네트워크와 서브넷 스캔하기

 당신이 전체 네트워크를 스캔하고 싶을 때는, Nmap에서 지원하는 와일드 카드(*)와 Classlwss Internet Domain Routing(CIDR) 표기법을 사용하면 된다. Nmap은 표준 와일드 카드인 “*.”을 사용한다. CIDR 표기법이란, class C 서브넷 마스크인 255.255.255.0 을 나타내기 위해 /24 를 사용하는 방법이다. 이 숫자의 의미는, 서브넷 주소의 시작 비트부터 24개가 1 이라는 뜻이다. 나머지 8bit 는 네트워크의 각 노드를 구분하는데 사용된다. 172.16.0.0/18 은 서브넷은 하나의 class B 네트워크(172.16)을 4개의 서브넷(172.16.0, 172.16.64, 172.16.128, 172.16.192)으로 나눈다.
 이 때, 각 서브넷은  14 bit의 노드 번호를 사용할 수 있다.

 $ nmap -P0 -oN output.txt 172.167.0.0/16 .”*.*”
 $ nmap -P0 -oN output.txt 192.168.0.0/24

 위 예제와 같이, 와일드 카드를 사용할 때는 큰 따옴표를 사용해서 묶어야 한다. 그렇지 않으면 리눅스는 이것을 파일 이름 와일드 카드로 해석하기 때문에, 현재 디렉토리에 있는 파일 중 이 패턴에 맞는 파일을 덮어 쓸 수 있다. 당신이 원한다면 작은 따옴표를 써도 된다.
 위 명령들은 특정 네트워크 전체를 스캔한 뒤, 결과를 output.txt에 저장한다. CIDR 표기법을 사용하면 커스텀(custom) 서브넷 마스크를 사용하는 네트워크를 스캔할 수 있다. 예를 들어, 당신의 네트워크 주소가 172.16.0.0/8 이고, 서브넷 마스크가 255.0.0.0 이라 하자.
 이 서브넷을 스캔하려면, 다음 명령을 실행하면 된다.

 $ nmap -P0 -oN output.txt 172.168.0.0/8

 * 선별적인 스캔

 당신이 전체 서브넷에 있는 특정 포트들만을 검사하고 싶다고 하자. 그러자면 웹 서버나 DNS 서버와 같은, 특정 서비스만을 선ㅌㅊ택해서 스캔할 수 있더ㅏ. 다음 명령을 실행하면 된다.

 $ nmap -sX -p 22,53 -oN acornpub.txt 192.168.0.0/24

 * 참고

 다음 운영체제들은 “Xmas”스캔에 제대로 응답하지 않는다.(Xmas 스캔이란, Nmap에서 사용하는 스캔 방법의 하나로, TCP의 여러 bit(FIN, PSH, URG 등)를 모두 설정한 패킷을 보내는 방법이다. 이렇게 모든 비트를 설정한 모양이, 크리스마스 트리에 붙어 있는 전구 모두에 불이 켜진 모습과 비슷하다고 해서 Xmas 스캔이 됐다.) 왜냐하면, 이들은 표준 RFC를 따르지 않기 때문이다.
 Microsoft, CISCO, FreeBSD나 NetBSD가 아닌 모든 BSD 시스템, IRIX, HP/UX

 * 스텔스 기능을 추가
 위에서, Nmap이 스캔하는 것을 방화벽에 들키지 않기 위해 스텔스(stealth)기능을 사용하는 것을 봤다. 위에서 소개한 방법 말고도, 여러가지 스텔스 옵션이 있다.

 -sF : FIN 비트가 설정된 TCP 패킷을 사용해서, Nmap은 호스트의 모든 포트에 패킷을 보낼 수 있다.

 -sX : “Xmas 트리” 옵션으로 불리는데, 이 옵션을 사용하면 TCP의 FIN, URG, PUSH 플래그가 설정된다.

 -sN : “Null 스캔”이라 불린다. 이 옵션을 사용하면 TCP의 모든 플래그를 끈 패킷을 보낸다. 만약 시스템에서 이 패킷에 대한 응답을 하면, Nmap은 이 호스트가 동작중인지 알 수 있고, 돌아온 패킷을 분석하여 여러 정보를 얻어낼 수 있다. Microsoft 시스템들은 이 패킷에 응답하지 않기 때문에, 이 옵션을 사용하면 Microsoft 시스템과 다른 시스템들을 구분할 수 있다.

 -D : 이 옵션을 사용하면 스캔의 출발지 주소를 당신이 지정하는 주소들로 바꿀 수 있다. 해커들은 이 옵션을 사용해서, 시스템 관리자들이 스캔 공격의 출발점을 알지 못하게 한다. 당신이 관리자라면, 이 기능을 사용해서 침입 탐지 시스템이나 방화벽이 스캔 공격을 잘 찾아내는지 테스트할 수 있다. -D 옵션을 사용할 때에는, 가짜 호스트들을 쉼표로 구분해야 한다.

(Language : xml)
pchero@MyNote:~$ sudo nmap -sF -v 192.168.3.0/24 -D 21.125.23.122

Starting Nmap 4.53 ( http://insecure.org ) at 2008-08-06 14:56 KST
Initiating ARP Ping Scan at 14:56
Scanning 215 hosts [1 port/host]
Completed ARP Ping Scan at 14:56, 2.31s elapsed (215 total hosts)
Initiating Parallel DNS resolution of 215 hosts. at 14:56
Completed Parallel DNS resolution of 215 hosts. at 14:56, 0.01s elapsed
Initiating Parallel DNS resolution of 1 host. at 14:56
Completed Parallel DNS resolution of 1 host. at 14:56, 0.01s elapsed
Initiating FIN Scan at 14:56
Scanning 192.168.3.1 [1714 ports]
Completed FIN Scan at 14:56, 14.18s elapsed (1714 total ports)
Host 192.168.3.1 appears to be up … good.
Interesting ports on 192.168.3.1:
Not shown: 1712 closed ports
PORT   STATE         SERVICE
22/tcp open|filtered ssh
23/tcp open|filtered telnet
MAC Address: 00:11:88:4D:3D:82 (Enterasys)

Initiating ARP Ping Scan at 14:56
Scanning 40 hosts [1 port/host]
Completed ARP Ping Scan at 14:56, 0.85s elapsed (40 total hosts)
Initiating FIN Scan at 14:56
Scanning 192.168.3.215 [1714 ports]
Completed FIN Scan at 14:56, 0.14s elapsed (1714 total ports)
Host 192.168.3.215 appears to be up … good.
All 1714 scanned ports on 192.168.3.215 are closed

Read data files from: /usr/share/nmap
Nmap done: 256 IP addresses (2 hosts up) scanned in 18.069 seconds
           Raw packets sent: 8021 (321.858KB) | Rcvd: 6918 (287.378KB)

 당신이 ME 옵션을 지정한다면, 당신의 시스템 정보가 IDS 로그에 남을 가능성을 더욱 적어진다.

 192.168.3.0/24 네트워크를 스캔하려고 하는데, 이 네트워크에 있는 방화벽에서 모든 SYN 패킷을 거부한다면, 다음 명령을 실행한다.

(Language : xml)
$ nmap -sF -v 192.168.3.0/24

 다음 명령은 위와 똑같지만, 스캔 공격을 하는 시스템의 주소를 다른 호스트의 주소로 바꿔 놓는다.

(Language : xml)
$ nmap -sF -v 192.168.3.0/24 -D www.hostname.com,www.hostwebserver.com,ME

 Nmap을 사용하면서, -sX와 -sN 옵션이 당신이 스캔하고자 하는 호스트에 맞는지를 테스트하기 바란다. TCP 옵션을 사용할 때는, 한번에 하나의 옵션만을 사용할 수 있다는 것도 알아두자.
 그러니까 당신은 한 명령에서 -sF 와 -sS 옵션을 모두 사용할 수 없다.

 * 텍스트 파일에 저장하고 텍스트 파일에서 읽기

 스캔을 하면 그 결과가 상당히 길 때가 있다. 예를 들어, 당신이 253개의 호스트가 있는 네트워크의 모든 포트를 스캔한다면, 당신은 화면에서 그 결과를 다 볼 수 없을 것이다. 결과가 너무 많기 때문에, 터미널을 아무리 스크롤해도 모자랄 것이다.
 Nmap에서는 다음과 같은 옵션을 사용해서 출력을 텍스트 파일에 저장할 수 있다.
 -oN filename : 스캔 결과를 텍스트 파일에 저장해서 나중에 볼 수 있게 한다.
 -oM filename : 스캔 결과를 바이너리 포맷으로 저장한다. 당신이 네트워크를 스캔한 다음, 이 결과 파일을 Cheops나 IDS에서 사용할 수 있다.
 -iL : Nmap에서 텍스트 파일을 읽어들이게 한다. 예를 들어, 당신이 여러 IP주소나 호스트 이름이 저장된 텍스트 파일을 갖고 있다면, 명령행에서 주소를 지정하는 대신 이 파일 이름을 지정할 수 있다.
 예를 들어, 당신이 Nmap 출력을 file.txt에 저장하고 싶을 때, 다음과 같이 실행하면 된다.

(Language : xml)
$ nmap -v -oN file.txt -O host.yourhosrt.com

 * 방화벽과 침입 탐지 시스템 테스트

 당신은 방화벽이나 IDS가 설치된 네트워크에서 Nmap을 사용하고 싶을 때도 있을 것이다. 그럴 경우에, 당신의 스캔 정보가 쉽게 탐지되지 않고, 또 방화벽에서 버려지지 않기를 바랄 것이다.
 이런 경우 다음 옵션을 사용할 수 있다,
 -f : 스캔하는 패킷을 작은 IP 조각으로 나눈다. 이렇게 하면, 방화벽에서 패킷들을 잡아내서 로그로 남기기가 어려워진다.
 -S address 이 옵션을 사용하면, 스캔 공격이 시작된 출발지 주소를 지정할 수 있다. 원래 이 옵션을 만든 이유는, 어떤 운영체제는 자신의 주소를 Nmap에게 알려주지 않았기 때문이다. 그렇지만 이 옵션은 자신의 주소를 속이는 데도 사용될 수 있다. 일반적으로, 이 옵션을 사용해서 공격 출발지 주소를 속일 때, -e -P0 옵션을 같이 사용한다. -e 옵션은 사용할 인터네이스를 지정한다(보통은 eth0). -P0 옵션은, 앞에서 본 것처럼 핑(ping)스캔을 수행하지 않도록 한다.
 -D 옵션도 스캔 공격의 출발지 주소를 속일 수 있다는 면에서 이 옵션과 유사하다.
 -g port : 기본적으로 Nmap은 스캔 공격을 하기 위해 임시 포트(즉, 1024 위의 포트)를 사용한다. 많은 방화벽에서는 이 포트들을 막고 있다. 그렇지만 방화벽에서 내부로 들어오는 트래픽 중 특정한 포트(80, 110, 53과 같은)를 허용할 때도 많다. 이 옵션을 사용하면 방화벽에서 허용하는 포트를 사용할 수 있다. 그래서 방화벽을 통과해서 스캔 공격을 할 수 있다.

 * 스캔을 공격한 출발지 주소 속이기

 당신 시스템의 IP 주소가 192.168.3.4 라고 하자. 그런데 당신을 스캔 공격을 할 때 출발지 주소를 20.20.20.20으로 속이고 싶다. 이렇게 주소를 속여서 pchero라는 시스템을 스캔하려면 다음과 같이 한다.

(Language : xml)
$ nmap -S 20.20.20.20 -e eth0 -P0 -sS -v pchero

 -P0(ping을 보내지 않음)와 -sS(TCP SYN 스텔스 포트 스캔) 옵션을 사용하면, Nmap은 ping 패킷을 보내지 않고 TCP 기반의 스캔을 한다. -sS 옵션을 사용했기 때문에, 방화벽에서 스캔을 탐지할 확률이 낮아진다. 물론, 많은 방화벽에서 초기 SYN 패킷을 필터링 하긴 하지만.
 스캔을 할 때, 출발지 포트를 53으로 하고 싶다면 다음 명령을 실행한다.

(Language : xml)
$ nmap -g 53 -S 20.20.20.20 -e eth0 -P0 -sS -v pchero

 * 스캔 속도 조절하기

 많은 침입 탐지 시스템에서는, 포트 스캔을 발견할 경우 경고를 발생시킨다. 당신은 Nmap의 -T 옵션을 사용해서 IDS를 테스트 할 수 있다. 이 옵션을 사용하면, 패킷을 일정 시간 간격으로 보낸다. 이렇게 긴 시간에 걸쳐서 스캔을 수행하면, IDS는 스캔을 판단하기가 어려울 것이다.
 이 옵션에 인자로 올 수 있는 것은 다음의 6개 이다.
 paranoid : Nmap이 패킷을 5분 간격으로 보내게 한다. paranoid 대신 숫자 0을 써도 된다.
 sneaky : Nmap이 패킷을 15초 간격으로 보내게 한다. sneaky 대신 숫자 1을 써도 된다.
 plite : Nmap이 패킷을 0.4초 간격으로 보내게 한다. polite 대신 숫자 2를 써도 된다.
 normal : 기본 설정으로, 목적지 호스트로부터 응답을 받는 즉시 다른 패킷을 보낸다. normal 대신 숫자 3을 써도 된다.
 aggressive와 insane : 이 옵션들을 사용하면 스캔을 빠르게 수행할 수 있다. 그래서 핑(ping)이나 포트 스캔을 빠르게 하고자 할 때는 이 옵션을 사용할 수 있다. 그렇지만 이 옵션을 사용하면 너무 많은 트래픽을 발생시켜서 네트워크에 많은 부담을 준다는 것을 염두에 두기 바란다. aggressive 대신 숫자 4를 사용해도 되고, insane 대신 숫자 5를 사용해도 된다.

 * Paranoid 옵션으로 스캔하기.

 특정 호스트에 대해 paranoid 스캔을 하려면, 다음 명령을 실행한다.

(Language : xml)
$ nmap -S 20.20.20.20 -e eth0 -P0 -sS -v T paranoid pchero

 이 스캔은 시간이 많이 걸린다는 것을 알아두자. 왜냐하면, paranoid 옵션은 패킷을 5분 간격으로 보내기 때문이다.

(Language : xml)
– 당신이 Nmap을 실행할 때, 스캔이 끝날 때까지 많은 시간이 걸릴 경우가 있을 것이다. 보통, 이렇게 되는 이유는 당신이 Nmap에서 일정 시간을 기다리라는 옵션을 줬기 때문이다. 때때로, 당신과 스캔 대상이 되는 호스트 사이에 있는 방화벽이나 라우터 때문에 스캔이 느려지기도 한다. 당신이 Nmap을 사용할 때 여러 옵션을 사용하거나, 또는 여러 원격지 시스템을 스캔한다면, 스캔하는데 몇 분이 걸릴 것이다.

 * Nmap을 대화형(interactive)모드에서 사용

 지금까지, 당신은 Nmap을 사용해서 하나의 명령만을 실행했다. Nmap의 대화형(interactive) 모드를 사용하면, 다음과 같은 두 가지 일을 할 수 있다.

(Language : xml)
– 여러 Nmap 스캔을 수행할 수 있다.
– 시스템에서 Nmap이 실행중이라는 것을 숨길 수 있다. 이 모드에서 제공하는 스푸핑 기능을 이용하면, Nmap을 다른 프로그램(vi, named, sendmail 등)인 것처럼 속일 수 있다.

 Nmap을 대화형 모드로 실행하려면 다음 명령을 실행한다.

(Language : xml)
$ nmap –interactive

 그러면 당신은 다음 프롬프트를 보게 될 것이다.

(Language : xml)
nmap>

 여기서, 당신은 Nmap 명령들을 실행할 수 있다.
 대화형 모드는 paranoid 옵션을 사용할 때 매우 유용하다. 예를 들어, 당신은 몇 개의 paranoid 스캔을 동시에 진행할 수 있다. 이 작업은 며칠이 걸릴지 모르는 일이다. 그래서 이것을 백그라운드에서 실행한 다음, 나중에 스캔이 끝났을 때 결과 파일만 확인하면 된다. 이런 스캔을 하려면 상당히 오랜 시간이 필요하기 때문에, 해커의 입장에서는 스캔을 수행하는 프로세스를 숨길 필요가 있다. 시스템 관리자들은, Nmap의 대화형 모드에서 제공하는 스푸핑 기능을 사용할 일은 없을 것이다.
 그렇지만 관리자들은 겉으로는 정상적인 것처럼 보이는 프로세스도 Nmap 프로세스일 가능성이 있다는 사실을 알아둬야 한다.

Nmap을 이용한 네트워크 스캐닝과 방어하기(Scanning and Defending Networks with Nmap)

Nmap을 이용한 네트워크 스캐닝과 방어하기
(Scanning and Defending Networks with Nmap)

 한 컴퓨터 시스템을 크래킹하기 위해서는 우선 계획이 필요하다. 크래커는 목표로 하는 서버를 찾아야 하고, 그 다음에 머신에 어떤 port가 열려있는지, 시스템이 문제를 해결하기 전에 찾아야 한다.

 이것은 일반적으로 스캐닝이라고 하는 것으로, 스캐닝을 통하여 네트워크상에 있는 머신을 찾고, 무슨 port가 열려있는가를 보기 위해 그 머신들을 테스트하는 작업(art)을 하게 된다. 크래커가 공격을 시작하기 전 첫번째 전략은 바로 네트워크와 호스트들을 스캐닝하는 것이다. Nmap과 같은 툴을 이용한 스캐너들 즉, “나쁜 놈들(bad guys)”은 네트워크를 둘러보고 취약한 목표를 찾는다. 한번 이런 목표들이 확인되면, 침입자는 열린 port를 스캔할 수 있다. Nmap은 또한 TCP stack fingerprinting을 이용하여 정확하게 스캔당한 머신의 타입을 결정할 수 있다.

 이 문서는 각각의 네트워크에 대한 크래커의 시야를 파악하고, 보안 관리자가 자신의 사이트를 조사할 수 있도록, Nmap의 사용법에 대해 다루고 있다. 침입자 또한 같은 툴을 이용하고 있으므로, 관리자는 그들처럼 자신의 사이트가 어떻게 보이는지 알 수 있을 것이다. 하나하나 설명해 나가면서 여러분의 시스템 보안에 이 문서가 도움이 될 수 있길 바란다.

 Nmap은 GNU General Public License(GPL)에 속하며, http://www.insecure.org/nmap 에서 무료로 다운로드 받을 수 있다. tar로 묶인 소스화일, 혹은 rpm으로 된 것도 있다. 필자가 이 문서를 쓰는 시점에서 안정버전은 2.12이다. 약간의 그래픽이 첨가된 프로그램도 있지만, 이 문서에서는 command-line에서의 Nmap 사용법에 대해서만 중점을 두겠다.

 Nmap의 사용법은 꽤 단순하다. command-line에서의 Nmap의 옵션(flag)은 -s 를 붙이는데 스캔의 타입에 따라 다르다. 예를 들어 ping scan에서는 “-sP”이다. 옵션 다음에는 목표 호스트 또는 네트워크를 명시해 준다. Nmap의 성능은 루트로 실행했을 때 가장 최고가 된다. 왜냐하면 일반유저는 Nmap이 활용하는 custom packet을 만들 수 있는 능력이 없기 때문이다.

 Nmap은 타겟을 설정함에 있어 매우 유연한 동작을 보인다. 네트워크 주소 값을 지정할 때 /mask를 덧붙여서 써주면 간단하게는 하나의 호스트, 혹은 전체 네트워크를 스캔할 수 있다. 만약 “victim/24″라고 목표를 지정한다면 네트워크 C class를 검색하고, 또한 “victim/16″이라고 한다면 B class를 검색하게 된다.

 덧붙여서 Nmap은 wild cards(*)를 이용하여 네트워크 검색이 가능하다. 예를 들어 192.168.7.* 는 192.168.7.0/24 이라고 했을 때와 같은 결과 값을 얻을 수 있게 된다. 혹은 192.168.7,1,4,8-12 와 같이 subnet에 있는 호스트를 선택적으로 스캔하는 것도 가능하다.

 * Ping Sweeping

 침입자들은 Nmap을 가지고 전체 네트워크의 타겟 들을 훑어볼 수가 있다. 이는 보통 “-sP”라고 써줌으로써 ping scan을 하는 것이다. 일반적으로 Nmap은 ICMP echo와 TCP ACK를 각 호스트에 보내어 검색을 한다. 그러면 Nmap이 보낸 패킷에 반응을 한 호스트들이 나타나게 된다.

pchero@MyNote:~$ nmap -sP 192.168.3.0/24

Starting Nmap 4.53 ( http://insecure.org ) at 2008-08-06 00:38 KST
Host 192.168.3.1 appears to be up.
Host 192.168.3.215 appears to be up.
Nmap done: 256 IP addresses (2 hosts up) scanned in 2.378 seconds

 아마도 때때로 여러분은 단지 ICMP echo request를 보낼 필요없이 시스템이 동작하는지 만을 파악하길 원할 것이다. 이런 경우 목표 네트워크를 스캔하기 위해서 TCP “ping”을 사용한다.

 TCP “ping”은 목표 네트워크의 각각의 머신에게 ACK를 보낸다. 각 머신들은 TCP RST를 이용하여 응답하게 된다. TCP “ping”을 이용한 스캔을 위해서는 “-PT”라는 옵션을 첨가해주면 된다. 이번의 예제에서 80번 tcp port(http)를 target port로 이용해 보도록 하겠다. 이것은 목표의 라우터들 심지어 firewall 조차도 아마 통과할 수 있을 것이다. 주의할 것은 머신이 살아있는지 죽어있는지를 결정하는데 호스트의 target port가 열려있을 필요가 없다는 것이다. 다음에 보이는 것이 실행의 예이다.

pchero@MyNote:~$ sudo nmap -sP -PT80 192.168.3.0/24

Starting Nmap 4.53 ( http://insecure.org ) at 2008-08-06 00:44 KST
Host 192.168.3.1 appears to be up.
MAC Address: 00:11:88:4D:3D:82 (Enterasys)
Host 192.168.3.215 appears to be up.
Nmap done: 256 IP addresses (2 hosts up) scanned in 3.462 seconds

 침입자들은 목표 네트워크의 머신이 살아있는지 알 때, 으레 다음 단계로 port scanning을 한다.

 port scanning의 여러가지 타입들이 Nmap을 통해 제공된다. (TCP connect, TCP SYN, Stealth FIN, Xmas Tree, Null, UDP scan 등)

 * Port Scanning

 Nmap은 connect() system call을 이용해 목표 호스트의 지정한 port에 접속을 하고, TCP의 3-way handshake를 완결 짓기 때문에 TCP 접속을 이용한 침입자는 쉽게 탐지된다. 호스트 머신의 Log 기록들에 침입자에 의해 열려진 port들이 나타날 것이다. TCP connect scan은 -“sT” flag를 이용하여 사용한다.

pchero@MyNote:~$ sudo nmap -sT 192.168.3.0/24

Starting Nmap 4.53 ( http://insecure.org ) at 2008-08-06 00:49 KST
Interesting ports on 192.168.3.1:
Not shown: 1524 filtered ports, 189 closed ports
PORT   STATE SERVICE
23/tcp open  telnet
MAC Address: 00:11:88:4D:3D:82 (Enterasys)

All 1714 scanned ports on 192.168.3.215 are closed

Nmap done: 256 IP addresses (2 hosts up) scanned in 8.599 seconds

 

 * Stealth Scanning
 
 만약 공격자가 목표 머신의 시스템 로그 기록에 그가 요청한 것들을 남기지 않고 스캔하길 원한다면 무엇을 해야 할까? TCP SYN scans는 목표 머신에 log기록을 거의 남기지 않는다. SYN scan은 TCP 연결경로의 첫번째 패킷으로 SYN packet을 보냄으로써 시작한다. 열린 port들은 SYN|ACK 로 응답을 할 것이다. 그러나 이때 공격자가 ACK대신 RST를 전송하면 연결은 종료되게 된다. 장점을 3-way handshake가 절대 완성되는 않는다는 것과 이런 타입의 로그 기록을 남기는 사이트는 거의 없다는 것이다. 한편 닫혀있는 port들은 RST와 함께 처음의 SYN에 응답할 것이고 Nmap은 그 호스트의 port가 닫혀 있는다는 것을 결정할 수 있게 된다. SYN scan은 “-sS” flag를 이용하여 실행한다.

pchero@MyNote:~$ sudo nmap -sS 192.168.3.0/24

Starting Nmap 4.53 ( http://insecure.org ) at 2008-08-06 00:54 KST
Interesting ports on 192.168.3.1:
Not shown: 1712 closed ports
PORT   STATE    SERVICE
22/tcp filtered ssh
23/tcp open     telnet
MAC Address: 00:11:88:4D:3D:82 (Enterasys)

All 1714 scanned ports on 192.168.3.215 are closed

Nmap done: 256 IP addresses (2 hosts up) scanned in 27.168 seconds

 비록 SYN scan이 더 알아챌 수 없을지라도, 몇 가지 침입 탐지 대책들을 이용하여 탐지해 낼 수 있다. Stealth FIN, Xmas Tree, 그리고 Null scan들은 packet filter나 firewall 들을 피하는데 사용되어 진다. 이런 3가지 스캔들은 닫힌 port들을 위해 RST를 리텀하고, 열린 포트들을 packet를 버린다. FIN “-sF” 스캠은 FIN packet을 각각의 port로 보낼 것이고, 한편 Xmas Tree scan “-sX”는 FIN, URG, PUSH flag를 모두 켠다. 그리고 Null scan “-sN”은 모든 flag를 끈다.
 TCP 표준들에 Microsoft는 순종하고 있지 않기 때문에 FIN, Xmas Tree, 그리고 Null scan은 오직 Microsoft 운영체제가 아닌 경우에서만 영향을 발휘한다.

 * UDP Scanning

 만약 침입자가 exploit(역자 주 : 크래커들이 시스템을 칩임하기 위해 사용하는 특정한 프로그램들을 지칭함)를 위해 특정 rpcbind hole 이나 cDc Back Orifice 같은 UDP hole을 찾는다면, 그/그녀는 어떤 UDP port가 열려있는지 알기를 원할 것이다.
 침입자는 UDP scan “-sU”를 사용하여 호스트에 어떤 UDP port가 열려있는지 알 수 있다. 만약 호스트에서 “port unreachable” 메시지를 리턴하면 그 포트는 닫혀있는 것으로 간주된다. 대부분의 UNIX 호스트들은 ICMP 에러의 비율을 제한하고 있기 때문에 이런 방법은 시간을 많이 소비하게 된다. 다행히도 Nmap은 이런 비율을 탐지하고 그 자신의 속도를 낮추어 거부했을 때의 메시지로 인해 목표가 오버플로어 되지 않도록 한다. 다음은 UDP scan의 실행결과이다.

pchero@MyNote:~$ sudo nmap -sU 192.168.3.0/24

Starting Nmap 4.53 ( http://insecure.org ) at 2008-08-06 01:02 KST
Interesting ports on 192.168.3.1:
Not shown: 1485 closed ports
PORT    STATE         SERVICE
67/udp  open|filtered dhcps
161/udp open|filtered snmp
520/udp open|filtered route
MAC Address: 00:11:88:4D:3D:82 (Enterasys)

Interesting ports on 192.168.3.215:
Not shown: 1486 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
5353/udp open|filtered zeroconf

Nmap done: 256 IP addresses (2 hosts up) scanned in 8.846 seconds

 * OS Fingerprinting

 종종 침입자는 특정한 플랫폼에서만 실행되는 exploit를 실행하기 위해 그와 유사한 윤영체제를 찾을 것이다. 일반적으로 TCP/IP fingerprinting은 “-O”옵션을 포함하여 원격으로 운영체제를 탐지해낸다. 이것은 ping scan을 제외한 port scan과 결합하여 사용해야만 한다. Nmap은 호스트에 다른 타입의 조사를 행하여 OS를 찾아낸다. 원격으로 OS를 탐지해내기 위한 다른 방법과 마찬가지로 ICP initial Sequence Number(ISN)의 패턴을 찾기 위해 SYN packet과 함께 선언하지 않은 flag를 리모트 호스트로 보내고, BOGUS flag는 원격 호스트의 그 반응이 어떤 종류인가를 입증하기 위해 FIN 조사같은 기능을 사용한다. 그것은 TCP stack에서 포함하고 있고 이를 Fingerprinting하게 된다. 본 문서에서 stack fingerprinting 까지 논의하는 것은 한계가 있으므로 관심이 있는 사람은 Nmap의 저자인 Fyodor에 의해 쓰여진 문서를 찾아보기 바란다.
(http://www.insecure.org/nmap/nmap-fingerprinting-aricle.html)

 Nmap의 OS 탐지기능의 특징은 매우 정확하며, SYN scan을 포함하여 솔라리스 2.7 머신의 stack을 fingerprinting해서 증명하는 것과 같은 일에 효과적인 도구이다.

# nmap -sS -O
192.168.7.12
Starting nmap V. 2.12 by Fyodor
(fyodor@dhp.com, www.insecure.org/nmap/)
Interesting
ports on comet (192.168.7.12):
Port    State
      Protocol  Service

7        open
       tcp         echo

9        open
       tcp         discard

13      open        tcp
        daytime

19      open        tcp
        chargen

21      open        tcp
        ftp


TCP Sequence Prediction: Class=random positive
increments
                         Difficulty=17818
(Worthy challenge)
Remote operating system guess:
Solaris 2.6 – 2.7
Nmap run completed — 1 IP
address (1 host up) scanned in 5 seconds

 TCP Sequence Prediction 부분을 주의해서 보기 바란다. -O 옵션을 주어 Nmap을 실행시키게 되면 TCP Sequence Prediction이 얼마나 어려운지도 알려준다. 이것은 침입자가 호스트의 공격할 수 있는 위험성에 대한 정도로써 얼마나 침입할 가치가 있는가를 포함하고 있기도 하다.

 * Ident Scanning

 침입자는 종종 root로 돌아가는 web server와 같은 프로세스를 공격 대상으로 삼을 때가 있다. 만약 타겟이 identd를 돌리고 있다면 침입자는 Nmap을 사용하여 httpd 데몬이 어떤 소유자로 실행되고 있는지 찾아낼 수 있다. 이는 TCP connect scan에 “-I”옵션을 포함하여 실행한다. 아래에 한 리눅스 웹서버를 스캔 한 예가 있다.

# nmap -sT -p
80 -I -O www.yourserver.com
Starting nmap V.
2.12 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap/)

Interesting ports on www.yourserver.com (xxx.xxx.xxx.xxx):

Port    State       Protocol
 Service         Owner

80      open        tcp
       http            root

TCP Sequence Prediction: Class=random positive increments

                          Difficulty=1140492
(Good luck!)
Remote operating system guess:
Linux 2.1.122 – 2.1.132; 2.2.0-pre1 – 2.2.2

Nmap run completed — 1 IP address (1 host up) scanned
in 1 second

  만약 당신의 웹서버가 실수로 root로 실행되도록 설정되었다면, 당신에게 회사에세 밤샐 일이 생길지도 모근다.

 루트로 아파치를 실행시키는 것은 나쁜 보안 습관이다. /etc/inetd.conf 에서 auth 부분을 주석 처리해서 ident 요청을 막아두어야 한다. 그리고 inetd를 재 실행 시킨다. ident 요청을 막는 다른 방법은 ipchains나 다른 firewall을 이용하여 당신의 네트워크에 장벽을 설치하는 것이다. 이것은 어떤 데몬이 누구의 소유로 동작하는지 당신의 사이트를 조사해보려는 호기심 많은 무뢰한들을 막을 수 있을 것이다.

 * Options

 이런 scan들에 덧붙여서 Nmap이 제공하는 무수한 옵션들을 소개하겠다. 그 중 하나가 “-PT”이다. 우리는 이미 위에서 다루었다. 이 옵션은 타겟 머신이나 네트워크의 일반적으로 filter되지 않은 port들을 TCP ping으로 직접 ping scan할 때 사용된다. 유용한 옵션으로 “-Po”가 있다. Nmap은 port scan을 하기전에 TCP “ping”과 ICMP echo 모두를 이용하여 타겟을 ping 할 것이다. 만약 사이트에서 ICMP와 TCP 검색을 막아 놓았을 경우 보통 스캔되지 않을 것이다. 그래서 “-Po” 옵션을 이용하면 처음에 ping을 하지 않고 호스트를 스캔 하도록 Nmap에서 지원하고 있다.

 한가지, 독자가 한번 사용하면 습관처럼 사용하게 될 옵션이 있다. 바로 “-v” 자세한 옵션이다. 이 옵션은 모든 스캔 타입들과 함께 사용할 수 있다. 이 옵션을 한번 혹은 두 번 사용해서 타겟 머신에 관한 보다 더 자세한 정보를 얻을 수 있다.

 특정한 port를 타겟으로 삼는 기능은 “-p”옵션을 이용하여 실행된다. 예를 들어 침입자가 당신의 웹서버를 ftp(port 21), telnet(port 23), name service(port 53), 그리고 http(port 80)에 관해 조사하고, 어떤 OS를 쓰는지 까지 알길 원한다면 다음과 같은 SYN scan을 이용할 것이다.

 # nmap -sS -p
21,23,53,80 -O -v www.yourserver.com

 * 결론

 침입자가 Nmap을 사용하여 어떤 측정을 했겠는가? Scanlogd, Countney, 그리고 Shadow와 같은 수많은 툴 들이 존재한다. 그러나 이런 툴을 사용하는 것이 실무에서 일하는 관리자들의 지식을 대신할 순 없다. 스캔은 종종 침입의 전조로 나타나기 때문에 사이트들은 그들의 머신에 대해 감시와 제어를 우선시해야 한다.

 Nmap을 이용해 각자의 사이트를 감시함으로서, 시스템과 네트워크 관리자들은 잠재적인 침입자들이 당신의 사이트를 조사하는 것들을 발견할 수 있다. 자,,이제 당신의 라우터들 구석에 Nmap과 함께 리눅스 박스를 설치하고, 펭귄 군단의 하나로써 스캐닝을 시작하자!.

 출처 : http://www.linuxlab.co.kr/docs/00-05-2.htm