다음 글은 제가 작성한 글이 아닙니다.
어느 곳에서 퍼온 글입니다.

정확한 출처를 알지 못하여 이곳에 기록하지 못했습니다.

공격자의 입장에서 시스템에 침입하기 위해 제일 먼저 하는 행위는 바로 해당 네트워크 및 시스템에 대한 스캔이다. 광범위한 스캔을 통해서 현재 어떠한 서버가 네트워크에 연결되어 있는지 또한 각각의 서버에서는 어떠한 서비스가 제공중이며 이러한 서비스를 통해서 해당 시스템이 웹 서버인지, db서버인지 혹은 메일 서버인지등 어떠한 목적으로 운영되는지도 추측할 수 있게 된다. 반대로 서버 관리자의 입장에서는 자가 스캔을 통하여 자신이 운영하는 서버가 자신이 알지 못하는 사이 다른 포트가 열려 있는지 등을 확인할 수 있다. 이러한 스캔 기능을 제공하는 툴은 많은 프로그램들이 공개되어 있는지 이러한 프로그램중 nmap이라는 프로그램이 가장 많은 기능을 제공하면서 또한 많이 사용되는 프로그램이다.

nmap의 특징

1. nmap은 GPL 라이센스에 의해 무료로 다운로드 받아 사용할 수 있다.
2. nmap은 사용방법이 직관적이고 매우 쉽다.
3. nmap은 하나의 호스트에 대한 포트 스캔뿐만이 아니라 네트워크 주소값을 입력하였을 때는 전체 네트워크에 대하여 스캔할 수 있다. 이를테면 대상 네트워크가 192.168.1.0/24 라고 한다면 192.168.1. 대역의 C Class 전체를 검색하게 된다.
4. 각종 포트 스캐닝 알고리즘을 이용하여 거대한 네트워크를 고속으로 스캔 할 수 있다.

nmap의 기능

1. TCP 연결 검사 – 탐색할 각 포트들에 대한 세 가지 TCP handshake(SYN, ACK-SYN, ACK) 모두를 호출하는 운영체제 자체의 connect() 시스템을 사용한다. 연결에 실패할 경우(즉 서버가 SYN 패킷에 대한 응답으로 ACK-RST를 보내 왔을 경우) 포트가 닫혀있다는 것을 뜻한다. 이 방법은 루트 권한을 요구하지 않으며 또한 가장 빠른 검사 방법중 하나이다.
2. TCP SYN 검사 – 만약 검사 대상 호스트에서 ACK-SYN 패킷이 돌아온다면 nmap은 즉시 ACK와 함께 완벽한 형태의 handshake를 시도하지 않고 RST패킷을 보낸다. 이런 형태의 ‘Half-open’연결은 더 작은 로그 파일을 만든다. 그러므로 SYN 검사는 TCP 연결 검사보다 효율이 떨어진다. 이 방법의 검사는 nmap보다는 커널이 관여하는 부분이 많으므로 nmap을 루트 권한으로 실행시켜야 사용할 수 있다.
3. TCP FIN 검사 – 이 검사는 nmap이 하나의 FIN(final) 패킷을 보낸다. 만약 대상 호스트의 TCP/IP 스택이 RFC-793 기준을 따른다면 열려있는 포트는 패킷을 받아들일 것이고 닫힌 포트는 RST를 보내올 것이다.
4. TCP NULL 검사 – FIN 검사 방식과 비슷하지만 FIN 대신 TCP 플래그가 없는 패킷(null packet)을 보낸다. 이 방식 역시 위에서 언급한 RFC-793 명시 기준을 따른다.
5. TCP Xmas Tree 검사 – 역시 FIN 검사와 비슷하나 FIN 패킷을 보내는 대신 PSH와 URG 플래그(final, push 데이터 그리고 urgent)를 가진 패킷을 보낸다. 이 방식 역시 위에서 언급한 RFC-793 명시 기준을 따른다.
6. UDP 검사 – UDP는 비연결형 프로토콜이다. UDP는 TCP 검사처럼 handshake 방식으로 연결하지 않는다. 그러나 대부분의 운영체제는 UDP 포트가 닫혀있을 때 TCP/IP 스택이 ICMP ‘Port Unreachable’ 패킷을 되돌려주도록 되어있다. 그러므로 ICMP 패킷이 되돌아오지 않는다면 UDP 포트가 열려있다고 생각하면 된다. 그러나 탐색 패킷뿐만 아니라 ICMP 패킷 역시 반드시 도달한다는 보장이 없기 때문에 nmap은 일반적으로 패킷 전송의 실패를 줄이기 위해 스캔하고자 하는 각 포트에 대해 여러 개의 UDP 패킷을 보낸다. nmap의 UDP 검사의 정확도는 대상 호스트의 운영체제에 따라 매우 변화가 많다.
7. RPC 검사 – 이 방식은 다른 형태의 스캔 방식과 결합해서 사용된다. namp은 RPC(remote procedure call) 서비스 호스팅을 통해 포트가 열려있는지 확인한다.
8. 핑 테스트(Sweep)

다운로드 및 설치

http://www.insecure.org/nmap/ 에서 최신버전을 다운받는다.

-소스 설치 시 방법

#./configure
#make
#make install

nmap 실행파일은 /usr/local/bin/nmap 형태로 설치되는데 nmap을 실행하여 설치한 버전으로 정상적으로 실행되는지 확인한다. 아울러 /usr/local/share/nmap/ 디렉토리에 있는 nmap-os-fingerprints 파일은 스캐닝하고자 하는 시스템의 운영체제와 버전 정보를 인식할 수 있게 된다. 또한 nmap-services 파일에는 /etc/services 파일과 함께 각종 tcp/udp 포트에 대한 서비스 이름이 정의되어 있다.

nmap 사용방법

nmap의 기본 사용형식은 아래와 같다.

nmap [스캔타입] [옵션] <대상 목적지 호스트나 네트워크>

스캔타입

-s : TCP SYN 스텔스 포트 스캔 방식으로서 완전한 tcp 세션을 만들지 않기 때문에 half-open 스캔이라고 하기도 한다. 스캔하고자 하는 목적지로 SYN 패킷을 발송한 후 목적지로부터 SYN|ACK 패킷을 받으면 포트가 리슨한다고 판단하고 RST 패킷을 받으면 리슨하지 않는다고 판단한다. 만약 SYN|ACK 패킷을 받으면 RST 패킷을 보냄으로써 스캔이 로그에 남지 않도록 한다.

-sT : TCP connect() 포트스캔으로 connect() 함수를 이용하여 connect()가 성공하면 해당 포트는 리슨 상태이고 실패하면 포트는 리슨하지 않는 것으로 판단한다. 이 방법은 가장 기본적인 tcp 스캔 형태로서, root 뿐만이 아니라 일반유저들도 사용할 수 있으며 스캔시 로그가 남게 된다.

-sU : UDP 포트 스캔방식으로서 이는 어떠한 udp 포트가 열려있는지 스캔하고자 할 때 사용된다. 이 방법은 각각의 포트에 0 byte의 udp 패킷을 보낸 후 만약 ICMP port unreachable 메시지를 수신하면 해당 포트는 닫혀 있는 것이고 그렇지 않으면 포트는 열려 있는 것이라고 판단하는 것이다. 하지만 대부분의 유닉스 호스트들은 ICMP 에러의 비율을 제한하고 있기 때문에 스캐닝 결과가 매우 느리게 된다. 이를테면 리눅스의 경우 destination unreachable message의 경우 4초당 80회로 제한하고 있다.

-sP : ping 스캔방식으로서 해당 네트워크에서 어떠한 호스트가 살아 있는지를 알고 싶을 때 사용한다. 이 옵션을 사용할 경우 nmap은 지정한 네트워크의 모든 IP 주소로 ICMP echo request packet을 발송한 후 응답이 오면 해당 네트워크에 연결되어 있다고 판단한다. 그러나 일부 사이트의 경우 안전을 위해 icmp echo request 패킷을 차단하는 경우도 있다. 이러한 경우에는 80번과 같은 특정한 포트번호로 TCP ack 패킷을 보내어 만약 RST 패킷을 받았다면 해당 시스템은 살아있다고 판단한다.

-sF, -sX, -sN : 스텔스 FIN, Xmas, Null 스캔 방식으로 SYN 패킷을 차단한 방화벽을 통과하거나 스캐닝을 탐지하는 프로그램들이 인식하지 못하도록 할 수 있다. 만약 FIN 패킷을 발송하여 RST 패킷이 응답하면 해당 포트는 닫혀 있는 것이고 그렇지 않고 아무런 응답이 없으면 이 포트는 열린 것으로 판단한다.

스캔옵션

-O : TCP/IP fingerprinting을 이용하여 원격지의 운영체제를 판별한다.
-p <포트범위> : 스캔할 포트를 지정한다.

포트 범위 예) ‘1-1024,1080,6666,31337’
위와 같은 경우 1번부터 1024까지의 포트와 1080,6666,31337 포트를 스캔한다.

-F : /usr/local/share/nmap/nmap-services 파일에 정의되어 있는 포트만 스캔한다.
-v : 상세한 정보를 보여준다.
-P0 : ICMP echo requests를 차단한 방화벽등을 스캔할 때 사용한다.
-n/-R : DNS 질의를 하지 않는다.
-S <IP 주소>/-e <장치 이름> : 스캔시 사용할 소스주소나 네트워크 인터페이스 이름을 지정한다.

스캐닝 결과의 의미

nmap으로 스캔을 하면 해당 호스트의 포트에 대한 서비스 이름과 포트번호, 상태(state) 그리고 프로토콜등을 알려준다. state는 ‘open’이나 ‘filtered’ 또는 ‘unfiltered’로 정의되는데 Open은 해당 호스트의 포트로 accept() 접속할 수 있는 것. 다시 말해 포트가 열려 있음을 의미한다. 또한 Filtered는 호스트 앞단의 방화벽이나 라우터등에서 해당 포트를 필터링하였거나 포트가 열려있는지에 대해 알 수 없다는 것을 뜻한다.

실제 포트 스캔 예

앞에서 살펴본 옵션을 가지고 직접 포트 스캔에 응용해보자.

#nmap -v 192.168.0.1

이 옵션은 192.168.0.1에 대해 tcp 포트 스캔을 하도록 한다. -v옵션을 설저하면 좀더 상세한 정보를 확인할 수 있다.

#nmap -sS -O 192.168.0.1/24

192.168.0.1/24 네트워크, 즉 192.168.0.1부터 192.168.0.254까지 255개의 IP에 대해 SYN 스캔을 한다. 또한 -O옵션을 설정하여 호스트가 어떠한 운영체제로 작동하는지에 대해서도 질의하였다.

#nmap -sX -p 22,53,110,143,4564 192.168.*.1-127

192.168.0.0/16 B 클래스 대역의 모든 IP 주소중 끌자리가 1부터 127까지의 모든 IP주소에 대해 sshd, DNS, pop3d, imapd 그리고 4564번 포트에 대한 X-mas 스캔을 수행한다는 의미이다.