IT 이야기2009. 11. 6. 10:15
외부에서 Nmap을 접속하게 되면 25/tcp, 80/tcp, 53/udp가 열려 있음을 알 수 있다. 2,200개의 잘 알려진 포트를 통해 nmap은 mail server(SMTP), webserver(HTTP) 그리고 name server(DNS)등에 대한 응답을 받고 대부분이 정확한 응답값을 보여준다. 하지만 타켁호스트가 포트를 바꿨을 수 있으므로 당신은 전적으로 이것에 의존하면 안된다.

설사 Nmap이 맞다고 해도 SMTP, HTTP, 그리고 DNS에 대한 많은 정보를 얻을 수 있는 것은 아니다. 당신이 당신의 클라이언트나 친구의 호스트를 검색할때 어떠한 메일서버를 쓰는지 혹은 DNS서버가 어떤 것인지가 궁금할 것이다. 어떤 버전의 서버인가를 통해 그 취약점을 알 수 있기 때문이다. 버전의 탐색을 통해 당신은 원하는 정보를 얻을 수 있게 될 것이다.

스캔을 통해 TCP나 UDP의 오픈상태임을 확인후에 버전 탐색을 통해 정확히 해당포트로 어떠한 서비스가 이루어 지는지 알 수 있다. nmap-service-probes 데이타베이스를 통해 다양한 포트의 다양한 서비스 매칭해봄으로 어떠한 서비스가 이루어지고 있는지 짐작할 수 있다. Nmap 은 서비스 프로토콜(예: ftp, ssh, telnet, http)에 대해 정의하고 프로그램 이름(예: ISC BIND, Apache httpd, Solaris telnetd)에 대해 정의하고, 버전넘버, 호스트이름, 장비타입 (예: printer, router)에 대해 정의하고, OS형태에 대해 정의하고, 그 외 자질구레한 것들(X 서버가 열려있는지, SSH의 프로토콜 버전, 또는 KaZaA의 사용자이름)에 대해 정의하게 된다. 물론 Nmap이 모든 정보를 제공하지는 않는다. 만약 Nmap이 OpenSSL과 컴파일되어 있다면, 암호화되어 있는 층 뒤의 서비스에 대해 탐색하게 될 것이다. RPC 서비스가 탐지된다면, 자동으로 RPC grinder(-sR)이 RPC프로그램과 버전을 알기 위하여 탐색되어진다. 몇몇 UDP포트는 탐지가 불가능할때는 open|filtered상태로 남게 된다. 버전탐지가 이루어진다면 open으로 표현될 것이고 그렇지 않다면 open|filtered로 표현될 것이다. TCP에서의 open|filtered도 같은 형태로 진행된다. 주목할 점은 Nmap -A는 다른 어떠한 스캔보다 우선해서 스캔하게 된다. 버전 스캔은 다음에 좀더 자세히 다루게 된다.

Nmap이 응답은 받았지만 데이타베이스에서 매칭되는 자료를 찾지 못할때는 특별한 자료와 주소를 남기게 되므로 차후에 개인적으로 탐지가 가능하다. Nmap은 3,000개의 패턴에 350개의 포르토콜을 매치시킨다.

버전탐지는 다음과 같은 옵션으로 실행된다.

-sV (version detection) : 위에서 나열했던것 같이 버전 탐지 옵션이다.

--allports(모든 포트의 스캔) : 기본으로 Nmap은 TCP 9100포트를 생략하는데 이는 프린터가 사용하므로 HTTP GET 요청이나 SSL session 요청을 많이 이루기 때문이다. 이런 형태는 Exclude를 사용하던가 아니면 --allports를 사용해서 모든 포트를 스캔할 수 도 있다.

--version-intensity (버전스캔의 감도 조절) : 버전스캔 사용시 Nmap은 여러번의 탐색을 보내는데 낮은 수의(낮은감도의) 탐색은 일반적으로 사용되는 포트의 스캔에 적합하고 높은 수일수록 희귀한 서비스의 사용을 찾아내는데 적합하다. 높은 번호일수록 정확하게 찾아낼 확률이 높다. 감도는 0과 9사이의 값을 지정해야 하고 기본값은 7이다. nmap-service-probe ports를 통한 스캔은 위의 감도가 무시된다.

--version-lignt (light모드) : 이 옵션은 --version-intensity 2와 같은 목적으로 사용한다. 이는 light모드를 좀더 빠르게 스캔하지만 정확히 인지하는 면에서는 떨어지는 성능을 보인다.

--version-all (모든 서비스의 스캔) : --version-intensity 9와 같은 걸로 하나하나의 서비스에 대해 스캔하게 된다.

--version-trace(버전스캔 활동의 추적) : 이 옵션을 통해 어떠한 일을 하는지 디버깅 할 수 있다. --packet-trace와 함께 사용할 수 있다.

-sR (RPC 스캔) : 이 옵션은 다른 옵션과 함께 사용 가능하다. open으로 판명된 모든 포트에 대해 SunRPC프로그램 NULL명령어를 보내고 이를 통해 이들이 RPC인지 혹은 RPC이면 어떠한 서비스와 버전을 사용하는지 스캔하게 된다. 그러므로 해당 호스트가 방화벽 뒤에 있다고 해도 rpcinfo -p와 같은 정보를 얻게 된다. RPC스캔에서는 패킷의 변형이 불가능하고 -sV를 통해 자동적으로 실행되게 된다.

원본링크:http://nmap.org/book/man-version-detection.html
Posted by 구텐모르겐
IT 이야기2009. 10. 29. 09:55


-sU (UDP 스캔) : 대부분의 서비스들이 TCP를 이용하지만 UDP도 널리 사용되고 있고 대표적으로 DNS, SNMP, DHCP를 들수 있다. UDP스캔은 TCP스캔보다 느리고 어렵기도 하지만 몇몇 네트워크 관리자들은 이러한 포트들을 무시하고는 한다. 이것은 큰 실수 이고 침입가능한 UDP포트는 공격자들에게 탐지될 것이고 이를 적극 활용할 것이다. Nmap은 이러한 UDP포트를 일련화 시켜 사용가능하다.UDP스캔은 -sU의 명령어로 사용 가능하다. SYN스캔(-sS)과 같은 TCP스캔과 혼용가능하다.UDP스캔은 빈 UDP패킷을 공격포트로 보낸다. 만약 ICMP포트가 'unreachable error'에러가 난다면 해당 포트는 닫힌 상태이다. 다른 포트들의 'unreachable error'에러는 filtered라고 표현되고 종종 open으로 표현되기도 한다. 만약 전송후에 응답이 없을 경우에는 open|filtered로 분류되고 이는 open이거나 패킷필터가 통신을 막고 있다는 뜻이다. 버전탐지 명령어(-sV)로 해당포트가 open인지 filtered인지 구분가능하다.

UDP의 가장 큰 장점은 스캔의 속도가 빠르다는 것이다. Open과 filtered의 포트는 대부분 응답을 보내지 않고 UDP패킷은 대부분 타임아웃이 되고 패킷이 도중에 유실된걸로 봐서 다시 전송하게 된다. Closed포트들은 더 문제가 되는 이유는 이는 unreachable이라는 메세지를 보내기 때문이다. 대부분의 연결은 SYN패킷을 보냄으로 응답하게 되는데, ICMP포트에 대해서는 unreachable라는 메세지를 보내지를 않는다. Linux나 Solaris는 특히나 이에 대해 엄격하다. 예로써 Linux2.4.20은 일초에 한번씩밖에 ICMP에 대해 응답하지 않는다.

Nmap은 이러한 제한을 인식하고 타겟호스트가 패킷을 드랍하지 않게 무작위로 보내지 않고 천천히 보내게 된다. 불행히도 Linux형태의 서버에 패킷을 보내면 65,536포트를 스캔하는데 18시간이 걸릴것이다. 이러한 스캔시간을 단축하고자 UDP를 사용하는데 병렬방식으로 빠르게 스캔하고 잘 알려진 포트만 우선 스캔하는 방식을 사용하고 있고 방화벽 뒤의 시스템을 스캔하고자 하거나 느린 타겟호스트에 관해서는 --host-timeout명령어로 피해갈 수 있다.

-sY(SCTP INIT 스캔) : SCTP는 TCP나 UDP의 대체 프로토콜로 사용되고 있고 이들의 특성을 대부분 수용하고 있으며 multi-homing이나 multi-streaming과 같은 새로운 기능도 있다. 대부분 SS7/Sigtran과 관련해 사용되던 서비스 이지만 다른 용도로도 많이 쓰인다. SCTP INIT는 TCP스캔과 같다. 빠르게 스캔하고 방화벽에 방해받지 않고 수천개의 포트를 수초안에 스캔하게 된다. 절대 연결을 맺지 않는 관계로 SYN스캔과 같이 INIT스캔도 방해받지 않으면서 몰래 스캔할 수 있다. 또한 다른 스캔과 같이 open, closed, filtered상태로 나타나게 된다.

이 기술은 종종 반만 연 스캔이라고도 하는데 SCTP는 연결을 완료하지 않기 때문이다. INIT를 보내고 당신이 응답을 원하는 것처럼 기다린다. INIT-ACK로 응답이 오면 포트는 open의 상태라는 것이고 ABORT는 호스트컴퓨터가 듣지 않고 있다는 뜻이다. 만약 여러번의 시도끝에 응답이 없다면 포트는 filtered로 정의되게 된다. ICMP unreachable error에러가 나올때도 같은 filtered라는 상태로 나타난다.

-sF; -sX (TCP NULL, FIN, 그리고 Xmas스캔) : 다음의 나열된 스캔들은 TCP RFC의 open과 closed 사이에서의 미묘한 차이에 대해 탐험할 수 있다. RFC793문서의 65페이지에 보면 "만약 포트가 closed의 상태이면 유입되는 패킷은 RST가 없다고 보면 되는데 이는 RST가 있으면 응답을 하기 때문이다." 그리고 다음 페이지에 보면 SYN, RST, ACK의 응답이 없이 open이라고 나오면 "당신은 아마 접근이 가능하지 않지만, 원한다면 패킷을 버리고 다시 접속하시오"라고 말한다.

RFC문서에 비추어 스캔을 해보면, SYN, RST, ACK가 없는 패킷에 대해 만약 포트가 닫혀있다면 RST응답이 있을 것이고 open이라면 아무 응답도 없을 것이라고 나와 있다. 위의 모든 명령어가 포함될 수는 없지만 다음과 같이 nmap은 스캔가능하다.

Null scan (-sN) : 아무런 비트도 보내지 않는다.
FIN scan (-sF) : TCP FIN비트를 설정한다.
Xmas scan (-sX) : FIN, PSH, URG플래그를 사용한다. 크리스마스 트리처럼

이러한 스캔타입은 TCP 스캔과 매우 유사하다. RST패킷을 받는 다면 포트는 closed로 나타나고 응답이 없다면 open|filtered로 나타난다. 만약 ICMP unreachable error메세지가 나오면 이는 filtered라는 뜻이다.

이러한 스캔의 장점은 non-stateful 방화벽이나 패킷필터 라우터에 몰래 접근할 수 있다는 점이다. 또한 이는 SYN스캔보다도 좀도 은밀히 접근한다. 하지만 이것에 너무 의존하지 말자. 요즘의 IDS는 이러한 시도를 잡아낼 수 있다. 단점은 모든 시스템이 RFC793문서를 문자그대로 따르지 않는다는 것이다. 종종 시스템은 open이나 closed에 상관없이 RST패킷을 보내기도 한다. 이렇게 되면 모든 포트가 closed로 나오게 된다. 이러한 시스템들은 MS Windows, Cisco, BSDI 그리고 IBM OS/400등이다. 대부분의 유닉스 시스템에서는 오히려 잘 작동한다. 또다른 단점은 filtered된 포트에 대해 open인지 아닌지를 구분해내지 못해서 보통 open|filtered로 나타낸다는 것이다.

원본링크:http://nmap.org/book/man-port-scanning-techniques.html
Posted by 구텐모르겐
IT 이야기2009. 10. 21. 03:16


Nmap은 계속적으로 기능이 업그레이드 되었고 포트스캔에 대한 기능도 효율적으로 바뀌었지만 중요한 것들은 변함이 없다. 기본적인 nmap 명령어는 1660개의 TCP포트를 스캔한다. 다른 포트스캔 프로그램들은 open이나 closed로 표현되는 것에 반해 nmap은 open, closed, filtered, unfiltered, open|filtered, closed|filtered로 나뉘게 된다.

이러한 상태들은 그 자체로는 의미가 없지만 nmap에서는 타겟호스트에 대한 설명이 포함되어 있다. 예를들어 같은 네트워크에서 nmap으로 135/tcp를 스캔할 경우 open으로 나올수 있지만 인터넷에서 스캔할 경우에는 filtered로 나올 수 있다.

다음의 6가지로 nmap은 타겟호스트의 상태를 구분한다.

open : TCP나 UDP 혹은 SCTP와 같은 포트를 사용하는 프로그램을 서치하게 된다. 이러한 포트를 찾는 것이 포트스캔의 가장 주요한 목적이다. 보안에 신경을 쓰고 있는 사람이라면 이러한 포트들이 공격루트가 되는 것은 인지하고 있다. 공격의 의도를 가지고 있거나 단순한 호기심으로 접근하는 사람들은 이런 open포트에 관심을 가지게 되고 관리자들은 이러한 포트들을 적법한 사용자들에게 서비스를 제공하는 한도내에서 제한한다. 포트를 open상태로 놓는것은 네트워크 상에서 통신이 가능한 상태이므로 해당 포트를 이용하는 서비스를 제공할 수도 있다.

closed: closed는 접근가능하다라는 의미이다. (즉, 호스트가 탐색패킷을 받았고 응답했다는 뜻이기 때문이다) 하지만 어떠한 프로그램이 해당포트를 사용하는지는 알 수 없다. 이러한 포트는 해당 IP주소의 컴퓨터가 살아있음을 보여주고 OS 버전을 알려주기도 한다. closed상태에서는 외부의 접근이 가능하므로 관리자는 방화벽을 통해 이를 차단할 필요가 있고 공격자는 filtered라는 메세지를 받을 것이다.

filtered : nmap은 filtered라는 리포트를 통해서 호스트가 어떠한 상태인지 알 수 없다. 이는 패킷이 필터링되었기 때문인데 이는 방화벽에 막혔을 수도 있고 라우터의 룰에 의해 차단되었을 수 있고 혹은 호스트의 방화벽소프트워어때문일 수도 있다. 이러한 최소한의 정보도 얻지 못하는 포트들은 공격자들을 무기력하게 만든다. 때로는 ICMP에러메세지를 보내기도 하지만 대부분의 패킷들은 drop되고 무시된다. 이러한 상태에서는 nmap은 재차 탐색을 시도하는데 네트워크가 혼잡해서 일수도 있기 때문이다. 이 상태에서는 스캔의 속도가 급격히 떨어지게 된다.

unfiltered : unfiltered는 해당포트가 접근 가능하다는 뜻이다. 하지만 nmap은 이것이 open인지 closed인지 구분할 수는 없다. 다만 방화벽에서 맵핑시에 룰셋으로 사용되는 ACK스캔일때 이 상태를 알려준다. Window Scan, SYN scan, FIN scan을 통해서 해당포트가 open인지 closed인지 알아 볼 수 있다.

open|filtered : 포트가 open인지 filtered인지 알 수 없을 때 다음과 같은 상태로 표시된다. 이러한 상태는 해당포트가 응답이 없거나 중간에서 드랍되었기 때문이다. 그러므로 nmap으로는 open인지 filtered인지 알수 없다. UDP, IP protocol, FIN, NULL 그리고 Xmas스캔을 통해 자세히 알아볼수 있다.

closed|filtered : 포트가 closed인지 filtered인지 알수 없을때 다음과 같은 상태로 표시된다.

원문링크: http://nmap.org/book/man-port-scanning-basics.html
Posted by 구텐모르겐