강좌
클라우드/리눅스에 관한 강좌입니다.
보안 분류

리눅스보안관리를 위한 기본 스캐너 NMAP

작성자 정보

  • 구돌 작성
  • 작성일

컨텐츠 정보

본문

리눅스보안관리를 위한 기본 스캐너 NMAP

 

공격자의 입장에서 시스템에 침입하거나 공격하기 위하여 가장 먼저 하는 행위는 바로 해당 네트워크 및 시스템의 정보획득을 위한 스캔(scan)작업이다.

 

다양한 스캔을 통해서 현재 어떠한 서버들이 네트워크에 연결되어 있는지, 또한 이러한 스캔 작업을 통하여 각각의 서버에서는 어떠한 서비스가 제공 중이며 이러한 서비스를 통하여 해당 시스템이 웹 서버인지, db서버인지 혹은 메일 서버인지 등과 어떠한 목적으로 운영되는지도 추측할 수 있게 된다.

 

 

반대로 서버 관리자의 입장에서는 자가 스캔(self scan)을 통하여 자신이 운영하는 서버가 자신이 알지 못하는 사이에 다른 포트가 열려있지는 않은지 등을 확인할 수 있다.

 

인터넷에는 이러한 스캔 기능을 제공하는 많은 프로그램들이 공개되어 있는데, 많은 프로그램 중 nmap(Network Mapper)이 가장 많은 기능을 제공하면서 또한 많이 사용되고 있어 가히 스캐너의 표준이라 할 수 있다.

 

심지어 nmap“matrix reloaded” 라는 영화에서 취약한 서버를 스캔하는 장면에서 사용되기도 하였다. 이번 장에서는 nmap을 기준으로 제공 기능과 작동 원리 및 활용 방안에 대해 알아보도록 하자.

 

3b355c34672ce69b14ca82e7dd749886_1659410917_7484.png
 

[그림] matrix reloaded의 한 장면

 

 

nmap은 다음과 같은 특징을 가지고 있다.

 

 

nmapGPL 라이센스에 의해 자유롭게 다운로드 받아 사용할 수 있다.

 

 

nmap은 사용방법이 직관적이고 매우 쉽다. 아래에서 사용 방법을 살펴볼 것이다.

 

 

nmap은 하나의 호스트에 대한 포트 스캔뿐만 아니라 네트워크 주소값을 입력하였을 때는 전체 네트워크에 대하여 스캔할 수 있다.

 

이를테면 대상 네트워크가

192.168.1.0/24라고 한다면 192.168.1. 대역의 C Class 전체를 검색하게 된다.

 

 

각종 포트스캐닝 알고리즘을 이용하여 거대한 네트워크를 고속으로 스캔 할 수 있다.

 

그러나 스캔 타입에 따라 오직 root 권한으로만 실행 가능한 경우도 있다.

 

 

시스템의 OS뿐만 아니라 데몬 버전등도 함께 스캔할 수 있는 등 다양한 기능이 계속적 으로 추가되고 있다.

 

 

 

 

9.6.1 다운로드 및 설치

 

최근 nmap은 기본적으로 설치되어 있지만 만약 설치되어 있지 않을 경우 nmap의 홈페이지인 http://nmap.org/에서 최신버전을 다운로드하여 설치하면 된다.

 

 

tar.bz2 형식의 프로그램을 설치해도 되고, 아래와 같이

rpm -Uvh http://download.insecure.org/nmap/dist/nmap-x.xx-1.i386.rpm

rpm 형식의 프로그램을 다운로드하여 설치해도 된다.

 

 

여기에서는 소스파일을 다운로드하여 설치해 보기로 하자. 먼저 nmap을 설치하고자 하는 서버에서

wget http://download.insecure.org/nmap/dist/nmap-x.xx.tar.bz2

으로 다운로드 후 압축을 해제한다.

 

압축이 풀린 디렉토리에서 다음과 같이 설정 한 후 컴파일하여 설치하면 된다.

 

 

 

 

[root@server src]# tar jxvfp nmap-x.xx.tar.bz2

[root@server src]# cd nmap-x.xx

[root@server nmap-x.xx]# ./configure ; make; make install

 

컴파일하여 설치하면 nmap/usr/local/bin/nmap 형태로 설치되는데, nmap을 실행하여 정상적으로 실행되는지 확인해 보기 바란다.

 

아울러 /usr/local/share/nmap/ 디렉토리에 있는 nmap-os-fingerprints 파일은 스캐닝하려는 각종 서버의 OS정보가 정의되어 있으며 이 파일을 근거로 스캔하고자 하는 시스템의 OS와 버전 정보를 인식할 수 있게 된다.

 

 

또한 nmap-services 파일에는 /etc/services 파일과 같이 각종 tcp/udp 포트에 대한 서비스이름이 정의되어 있다.

 

 

 

 

9.6.2 nmap 사용방법

 

nmap의 기본 사용형식은 아래와 같다. 제공되는 옵션은 man 페이지나 nmap을 실행하면 알 수 있다.

 

 

 

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

 

[스캔타입]

nmap에는 여러 가지 스캔타입이 있는데 가장 중요하고 많이 사용되는 몇 가지만 살펴보자.

-sS : TCP SYN 스탤스 포트 스캔 방식으로서 완전한 tcp 세션을 만들지 않기 때문에 "half-open 스캔"이라고 하기도 한다.

 

이는 스캔하고자 하는 목적지로 SYN 패킷을 발송한 후 목적지로부터 SYN|ACK 패킷을 받으면 포트가 열려있다고 판단하고, RST 패킷을 받으면 닫혀있다고 판단한다.

 

만약 SYN|ACK 패킷을 받으면 즉각 RST 패킷을 보냄으로써 스캔이 로그에 남지 않도록 한다.

 

왜냐하면 tcp의 경우 기본적으로 3 way handshake가 성립되어야 로그에 남는데, RST로 응답하여 3 way handshake를 성립하지 않기 때문이다.

 

그러나 별도의 설정이 되어 있는 방화벽이나 IDS등에서는 로그가 남을 수 있다.

 

스탤스 스캔에는 이외에도 FIN 스캔, Null 스캔, XMAS 스캔 등이 있는데, 스탤스 스캔은 오직 root만이 시도할 수 있다.

 

 

-sT : TCP connect() 포트 스캔으로 connect() 함수를 이용하여 connect()가 성공하면

해당 포트는 리슨(open) 상태이고 실패하면 포트는 리슨하지 않는 것(closed)으로 판단한다.

 

이 방법은 가장 기본적인 tcp 스캔 형태로서 root뿐만이 아니라 일반유

저들도 사용할 수 있으며 스캔 시 로그가 남게 된다.

 

 

 

-sU : UDP 포트 스캔방식으로서 이는 어떠한 udp 포트가 열려있는지 스캔하고자 할 때 사용된다.

 

 

이 방법은 각각의 포트에 데이터는 없고 헤더만 있는 0 byteudp 패킷 을 보낸 후 각각 어떻게 반응하는지를 보고 판단하게 된다.

 

 

 

 

type 3, code 3ICMP port unreachable 메시지를 수신할 경우 해당 포트는 닫혀 있는 것이라고 판단한다.

 

code 3 이외의 다른 에러 메시지(type 3, code 1, 2, 9, 10)를 수신할 경우 앞단의 방화벽이나 라우터에서 filter되었다고 판단하게 된다.

 

 

udp 로 회신을 받을 경우 포트는 열려 있는 것이라고 판단하게 된다.

 

 

 

아무런 응답이 없는 경우

이러한 경우는 open|filtered 라고 판단하게 되는데 이는 포트가 오픈되어 있을 수도 있고 패킷필터에 의해 차단되어 있을 수도 있기 때문인데 이러한 경우는

Versions scan의 의미인 -sV 옵션으로 재검색해 보아 오픈/필터링 여부를 확 인해 보면 된다.

 

 

 

또한 udp스캔의 문제점은 RFC에 의해 리눅스등 대부분의 UNIX 호스트들은 ICMP 에러의 비율을 제한하거나 차단하고 있기 때문에 스캐닝 결과가 매우 느리게 된다는 점이다.

 

이를테면 Windows는 전혀 제한이 없음에도 리눅스 2.4.x 커널의 경우에는 net/ipv4/icmp.c 파일에 정의된 대로 “destination unreachable” icmp 메시지를 1 초당 1회로 제한하고 있는데, 참고로 이 값은 커널 레벨 튜닝으로 변경 가능하다.

 

따라서 이론적으로 보았을 때 리눅스에서 65,536개의 포트를 udp 스캔하려면 18시 간이 소요하게 된다.

 

 

 

-sP : 이는 Ping Scan이라고 하는 방법으로 포트의 오픈유무에 대한 테스트를 진행하는 것이 아니라 해당 IP 주소로 icmp echo request 패킷을 발송한 후 응답이 오면 해당 호스트가 네트워크에 연결되어 있다고 판단하는 방법이다.

 

그러나 microsoft.com과 같이 보안상의 이유로 icmp echo request 패킷을 차단 하는 경 우가 있으므로 이러한 경우에는 80번과 같은 특정한 포트번호로 tcp ack 패킷을 보

낸 다음 만약 rst 패킷을 받았다면 해당 시스템은 살아있다고 판단하는 것이다.

 

, 이 방법은 해당 호스트가 네트워크에 연결되어 있는지 만을 체크하는 것일 뿐 포트에 대한 스캔은 아니며 아래와 같이 icmp 패킷과 tcp 패킷을 함께 보낸 후 응답을 기다리는 것을 알 수 있다.

 

둘 중 한 응답이 오면 해당 호스트는 네트워크에 연결된 것으로 판단한다.

 

물론 다운된 호스트나 iptables와 같은 상태추적(stateful) 방화벽에서 차단된 호스트는 둘 다 응답하지 않을 것이다.

 

상태추적(stateful) 방화벽에서 ack 패킷이 차단되는 이유는 7장을 참고하기 바란다.

 

 

 

20:17:09.811763 eth0 < scanner > server: icmp: echo request

20:17:09.811810 eth0 > server > scanner: icmp: echo reply

20:17:09.811820 eth0 < scanner.42996 > server.www: . 318744094:318744094(0) ack 666871326 win 2048 [tos 0x8]

20:17:09.811850 eth0 > server.www > scanner.42996: R 666871326:666871326(0) win 0 (DF) [tos 0x8]

 

그러나 tcp ping이 반드시 ack 패킷을 이용하여야 하는 것은 아니다. 아래와 같이 실 행하면 172.26.1.0/29 대역에 대해 소스포트는 53, 목적지 포트는 25번으로 한 SYN 패킷을 보내어 스캔한다는 내용이다.

 

이렇게 하면 일부 잘못 설정된 방화벽에서는 정상적인 DNS 트래픽으로 인식될 수 있을 것이다.

 

 

nmap -sP PS25 172.26.1.0/29 g 53

이때의 패킷을 tcpdump로 캡처하면 아래와 같이 보일 것이다.

 

 

10:52:02.083065 192.168.5.20 > 172.26.1.1: icmp: echo request

10:52:02.083260 192.168.5.20.domain > 172.26.1.1.smtp: S 948961283:948961283(0) win 4096

 

-sF,-sX,-sN : 각각 스탤스 FIN, Xmas, Null 스캔 방식으로서 SYN 패킷을 차단한 방화 벽을 통과하거나 스캐닝을 탐지하는 프로그램들이 인식하지 못하도록 할 수 있다.

 

FIN 스캔의 경우 FIN 패킷을 발송하여 RST 패킷이 응답하면 해당 포트는 닫혀 있는 것이고, 그렇지 않고 아무런 응답이 없으면 이 포트는 열린 것으로 판단한다.

 

Xmas 스캔은 SYN, FIN, ACK, URG, PSH, RST가 설정된 패킷을 발송하는 것인데, 많은 비트가 설정된 것이 마치 크리스마스 트리 같다는 의미에서 유래되어 Xmas 스캔이라 불린다. 물론 정상적인 상황에서는 보이지 않은 패킷이다.

 

Null 스캔은 아무런 tcp flag 없이 패킷을 발송하는 것이다.

 

공격자 입장에서는 스캔을 해도 로그에 남기가 어렵고, 방화벽을 통과할 수 있다는

장점이 있지만 역시 이를 실행하려면 루트 권한이 필요하며 Windowscisco 계열 의 운영 체제에서는 제대로 작동하지 않아 스캔 결과를 100% 신뢰할 수는 없다.

 

-A : 최근에 새롭게 추가된 이 타입은 일종의 버전스캐닝으로서 이전의 스캔이 단순히 포 트의 open 여부를 스캔하는 것이었다면 이 옵션은 이와 더불어 오픈된 각 데몬의

버전정보도 함께 스캔하는 것이다.

 

-A 옵션 대신 OS fingerprinting을 위한 -O옵션과 버전정보를 위한 “-sV” 옵션을 함께 사용하여 "-O -sV"와 같이 사용해도 된다.

 

이 기능은 아직도 개발 중이므로 새로운 기능이 계속적으로 추가되고 있는데, 아래는 버전정보 스캔의 예를 보여주고 있다.

 

# nmap -A server.com

 

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 3.6.1p2 (protocol 1.99)

23/tcp open telnet Linux telnetd

25/tcp open smtp Sendmail 8.12.11.20060308/8.12.11

80/tcp open http Apache httpd 1.3.26 ((Unix) PHP/4.0.5)

 

Device type: general purpose

Running: Linux 2.6.X

OS details: Linux 2.6.17 - 2.6.20

Uptime: 31.257 days (since Fri Feb 15 18:26:30 2008)

 

 

[스캔옵션]

 

-O : TCP/IP fingerprinting을 이용하여 원격지의 운영체제를 판별한다.

 

또한 일부 시스템 에서는 재부팅 된 지 얼마나 되었는지의 정보도 보여준다.

 

원격지의 OS를 판별하기 위해서 대상 서버에 각각 아래와 같은 패킷을 발송한 후 응답 패킷을 분석하여 어떤 정보와 매칭이 되는지 결정하는 것으로 각 OS의 정보는 nmap-os-fingerprints 파일 에 정의되어 있다.

 

 

# TseqTCP 순서번호에 대한 테스트를 진행한다.

 

 

# T1은 열린 포트에 몇 가지 옵션을 설정한 SYN 패킷을 발송해 본다.

# T2은 열려진 포트에 NULL 패킷을 발송해 본다.

# T3은 열려진 포트에 SYN|FIN|URG|PSH 패킷을 발송해 본다.

# T4은 열려진 포트에 ACK 패킷을 발송해 본다.

# T5은 닫힌 포트에 SYN 패킷을 발송해 본다.

# T6은 닫힌 포트에 ACK 패킷을 발송해 본다.

# T7은 닫힌 포트에 FIN|PSH|URG 패킷을 발송해 본다.

# PU는 닫힌 포트에 UDP 패킷을 발송해 본다.

 

nmap 외에도 원격지 OS를 스캔하는 많은 프로그램들이 있다.

 

 

이를테면, Nmap-ringv2의 경우 SYN 패킷을 발송 후 SYN/ACK 재전송을 얼마만의 시간간격으로 하는지, FIN_ACK 발송 후 FIN_ACK 재전송을 얼마 만에 하는지 등을 이용해 분석하고, Xprobe2의 경우 ICMP echo request, ICMP timestamp, ICMP address mask, ICMP information, ICMP port unreachable에 대해 어떻게 응답 하 는지를 분석하여 OS를 판별한다.

 

이러한 OS-fingerprint를 차단하기 위해서는 방화벽을 설치하여 비정상적인 패킷을 차단하거나 커널 패치 또는 튜닝을 통해 TCP/IP stack을 변조하면 되는데, 이러한 종류의 project로서 ippersonality(http://ippersonality.sourceforge.net/)가 있지만 아쉽게도 현재는 업데이트 되고 있지 않다.

 

-p <포트범위> : 스캔할 포트 또는 포트범위를 지정한다.

 

포트범위 예) '1-1024,1080,6666,31337'

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

 

 

만약 특정한 udptcp 포트만을 스캔하려면 아래와 같이 지정하면 된다.

 

 

 

"-p U:53,111,137,T:21-25,80,139,8080"

 

-F : 65536개의 포트대신 /usr/local/share/nmap/nmap-services 파일에 정의되어 있는 1,200여개의 포트에 대해서만 스캔하여 빠른 결과를 알려준다.

 

 

 

-v : 상세한 정보를 보여준다.

 

 

-P0 :기본적으로 nmap은 스캔시 ICMP echo request를 발송하는데, 방화벽에서 이를 차단한 경우가 많아 icmp 패킷 없이 스캔하고자 할 때 사용한다.

 

 

-n/-R : 해당 IP에 대해 reverse DNS 질의를 하지 않거나(-n) 하도록(-R) 한다.

 

이외에도 너무나 많은 옵션과 기능을 제공하고 있는데, 좀 더 자세한 내용은 man 페이지를 참고하기 바란다.

 

 

[스캐닝 결과의 의미]

 

nmap으로 스캔을 하면 해당 호스트의 포트에 대한 서비스 이름과 포트번호, 상태(state) 그리고 프로토콜 등을 알려준다.

 

state'open'이나 ‘close', 'filtered' 또는 'unfiltered'등이 올 수 있는데, 각각이 의미하는 바는 다음과 같다.

- Open

이는 tcpudp의 해당 호스트의 포트로 accept() 접속이 가능함을 즉 포트가 열려있음을 의미한다.

 

포트스캔의 주목적이 바로 이렇듯 오픈된 포트를 찾아내는 것이라고 할 수 있다.

 

- closed

이는 nmap을 통해 해당 서버의 특정 포트에 접근할 수는 있지만 실제로 해당 포트에는 특정 응용 프로그램이 리슨하지 않고 있음을 의미한다.

 

따라서 이러한 정보를 통해 서버의 up/down유무 및 OS detection등을 할 수 있게 된다.

 

 

따라서 사용하지 않는 포트는 방화벽에서 필터링하는 것이 좋다.

 

 

- Filtered

이는 호스트 앞단의 방화벽이나 라우터 등에서 포트를 필터링하여 nmap이 포트의 오픈 유무에 대해 알 수 없다는 것을 뜻한다.

 

그런데, 이 스캔 결과는 local에서 스캔 했는지 또는 원격지에서 했는지에 따라 결과가 다르게 나올 수 있다.

 

이를테면 127.0.0.1에서 리슨하고 있는 서비스의 경우 로컬에서 스캔하면 open으로 포트가 열린 것으로 보이지만 원격지에서 스캔하면 127.0.0.1에 접근할 수 없으므로 열려 있지 않은 것으로 보이기 때문이다.

 

또한 방화벽 등이 설치되어 있어 특정한 IP에서만 열려있는 서비스가 있을 경우에는 리슨하고 있어도 보이지 않을 수 있다.

 

- unfiltered

이는 ACK스캔을 이용하여 스캔할 때 보이는데, nmap이 해당 포트까지 접근할 수는 있지만 실제로 오픈되어 있는지 여부를 알 수 없는 경우이다.

 

따라서 이러한 경우에는 syn 스캔이나 FIN스캔 등 다른 방법을 함께 이용하여야 한다.

 

- open|filtered

이는 nmap이 오픈되어 있는지 아니면 필터링 되어 있는지 알 수 없는 경우에 해당하며 특히 특정 요청에 대해 아무런 응답 패킷이 없는 경우가 이에 해당한다.

 

- closed|filtered

이는 nmap이 해당 포트가 닫혀있는지 필터링 되어 있는지 알 수 없는 경우에 해당하며 “IP ID idles 스캔할 때에만 보이게 된다.

 

 

 

 

[실제 포트스캔 예]

 

이제 지금까지 앞에서 살펴본 옵션을 가지고 포트스캔을 직접 실습해 보자.

 

# nmap -v 192.168.1.1

 

이 옵션은 192.168.1.1에 대해 tcp 포트 스캔을 하도록 한다.

 

-v 옵션을 설정하면 스캔 속도 및 패킷전송내역 등 좀 더 상세한 정보를 확인할 수 있다.

 

 

# nmap -sS -O 192.168.1.0/24

 

192.168.1.10/24 네트워크, 192.168.1.1부터 192.168.1.255까지 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 스캔을 수행한다는 의미이다.

 

 

 

지금까지 nmap을 이용한 포트스캔에 대해 살펴보았다.

이처럼 포트스캔을 이용하면 정상적인 시스템에서는 어떠한 서비스가 작동중인지 알 수 있다.

 

그리고 만약 해킹을 당하였다면 그 시스템에서는 LKM기반의 커널 백도어가 설치되어 있거나 psnetstat등의 파일이 변조되어 있을 가능성이 있으므로 psnetstat 자체를 신뢰할 수 없기 때문에 어떤 포트가 실제로 리슨하고 있는지를 알 수 없는 경우가 있다.

 

따라서 이러한 경우 nmap과 같은 스캔 툴을 이용하여 포트스캔을 통해 어떤 포트에 백도어가 설치되었는지 등을 알 수도 있게 된다.

 

 

 

그리고 nmap과는 비슷하지만 약간 다른 개념의 amap이라는 재미있는 프로그램이 있다.

 

예를 들어, 만약 원격지의 시스템에 접근할 수 없는 상황에서 특정한 포트에 어떤 응용 프로그램이 리슨하고 있는지 알기 위해서는 amap이라는 별도의 프로그램을 이용할 수 있는데, amaphttp://www.thc.org/releases.php에서 다운로드 할 수 있으며 이 프로그램을 이용하면 이를테면 2,000번을 사용하는 오라클이나 4,000번을 사용하는 SSL도 인식할 수 있다.

 

 

아래와 같이 amap을 실행하였을 경우 192.168.10.3500-800번 사이에서 리슨하고 있는 포트가 어떤 서비스인지 알려준다.

 

 

 

# ./amap -q 192.168.10.3 500-800

Protocol on 192.168.10.3:592/tcp matches ssh

Protocol on 192.168.10.3:521/tcp matches smtp

Protocol on 192.168.10.3:523/tcp matches ftp

Protocol on 192.168.10.3:700/tcp matches ssl

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 전체 회원수 59,499 명
  • 전체 게시물 31,134 개
  • 전체 댓글수 11,895 개