nmap 사용법

2007/02/15 21:22

공격자의 입장에서 시스템에 침입하기 위해 제일 먼저 하는 행위는 바로 해당 네트워크 및 시스템에 대한 스캔이다. 광범위한 스캔을 통해서 현재 어떠한 서버가 네트워크에 연결되어 있는지 또한 각각의 서버에서는 어떠한 서비스가 제공중이며 이러한 서비스를 통해서 해당 시스템이 웹 서버인지, 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 스캔을 수행한다는 의미이다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'컴퓨터 이야기 > Network Program' 카테고리의 다른 글

nmap 사용법  (0) 2007/02/15
putty - ssh 접속프로그램  (0) 2007/02/14

밴스 컴퓨터 이야기/Network Program NMAP, NMAP 사용법, Solaris

솔라리스 - APM 설치시 필요한 패키지 목록

2007/02/14 12:19

apache:
ÃÑ 121844
drwxr-xr-x   2 root     other        512  2¿ù 12ÀÏ  12:04 ./
drwxr-xr-x   5 root     other        512  2¿ù 12ÀÏ  17:02 ../
-rw-r--r--   1 root     other    23882752  2¿ù 12ÀÏ  11:53 apache-2.0.59-sol9-x86-local
-rw-r--r--   1 root     other    24821248  2¿ù 12ÀÏ  12:02 db-4.2.52.NC-sol9-intel-local
-rw-r--r--   1 root     other     947200  2¿ù 12ÀÏ  12:01 expat-1.95.5-sol9-intel-local
-rw-r--r--   1 root     other    1333760  2¿ù 12ÀÏ  12:02 gdbm-1.8.3-sol9-intel-local
-rw-r--r--   1 root     other    11309568  2¿ù 12ÀÏ  12:02 openssl-0.9.8d-sol9-x86-local

mysql:
ÃÑ 288196
drwxr-xr-x   2 root     other        512  2¿ù 12ÀÏ  12:05 ./
drwxr-xr-x   5 root     other        512  2¿ù 12ÀÏ  17:02 ../
-rw-r--r--   1 root     other    72281088  2¿ù 12ÀÏ  12:01 gcc-3.4.6-sol9-x86-local
-rw-r--r--   1 root     other    1830912  2¿ù 12ÀÏ  11:59 libgcc-3.4.6-sol9-x86-local
-rw-r--r--   1 root     other    2351616  2¿ù 12ÀÏ  12:00 libiconv-1.11-sol9-x86-local
-rw-r--r--   1 root     other    50307584  2¿ù 12ÀÏ  12:00 mysql-5.0.27-sol9-x86-local
-rw-r--r--   1 root     other    13026304  2¿ù 12ÀÏ  11:59 ncurses-5.6-sol9-x86-local
-rw-r--r--   1 root     other    6121472  2¿ù 12ÀÏ  12:00 shutils-2.0.15-sol9-intel-local
-rw-r--r--   1 root     other    1467904  2¿ù 12ÀÏ  12:05 zlib-1.2.3-sol9-x86-local

php:
ÃÑ 66660
drwxr-xr-x   2 root     other        512  2¿ù 12ÀÏ  12:04 ./
drwxr-xr-x   5 root     other        512  2¿ù 12ÀÏ  17:02 ../
-rw-r--r--   1 root     other    20479488  2¿ù 12ÀÏ  12:04 libxml2-2.6.26-sol9-x86-local
-rw-r--r--   1 root     other    13614080  2¿ù 12ÀÏ  12:04 php-5.2.0-sol9-x86-local

크리에이티브 커먼즈 라이선스
Creative Commons License

밴스 컴퓨터 이야기/Solaris sToRy APM 설치, Solaris

Tcp Wrapper 설치방법

2007/02/14 12:17

설치 OS : Solaris 8,9

기본 디렉토리 : /usr/local/bin

다운로드 : http://www.sunfreeware.com

1. tcpwrapper 란?

현재에는 방화벽등 각종 보안장비들을 이용하여 서버에 대한 보안을 실시 하고 있다. 더군다나 서버기반에서는 Secure OS를 설치하여 보안에 대응하고 있다. 하지만 금액이 비싸고, 프리웨어중 서버기반하에 실행되는 보안프로그램이 부족한 편이다. 그리하여 예전에 리눅서 버전부터 꾸준한 인기를 얻고 있는 tcpwrapper 에 대해서 알아보려고 합니다.

tcpwrapper는 호스트기반에서 IP를 기준으로 접근 수락 및 제어를 할수 있습니다. tcpwrapper에 영향을 받는 서비스의 목록은 /etc/inetd.conf 파일에 있는 서비스 데몬들이다. 솔라리스 10버젼에는 기본적으로 OS에 포함되어 나오며, 솔라리스 8,9버젼을 아래와 같이 설치를 하시면 됩니다. 


< tcpwrapper 설치 >

1. 패키지를 웹페이지로부터 다운로드 합니다.

  - http://www.sunfreeware.com/


2. FTP를 이용하여 설치하고자 하는 서버에 업로드 합니다.


3. 패키지를 추가합니다

[test:/]pkgadd -d tcp_wrappers*

다음과 같은 패키지를 사용할 수 있습니다.

  1  SMCtcpwr     tcp_wrappers

                  (sparc) 7.6


처리할 패키지(들)를 선택하십시오.(또는 모든 패키지를

처리하려면'all'을 입력하십시오.) (default: all) [?,??,q]: all

패키지 예 <SMCtcpwr>(을)를 </tcp_wrappers-7.6-sol8-sparc-local>에서 처리 중


tcp_wrappers

(sparc) 7.6

Wietse Venema

디렉토리 </usr/local>(을)를 패키지의 기본 디렉토리로 사용

## 패키지 정보 처리 중

## 시스템 정보 처리 중

   6개 패키지 경로 이름이 이미 제대로 설치되어 있습니다.

 

## 디스크 공간 요구 검증 중

## 이미 설치되어 있는 패키지와의 충돌 여부를 확인하고 있습니다.

## setuid/setgid 프로그램 점검

tcp_wrappers(을)를 <SMCtcpwr>(으)로 설치


## 1째 (전체: 1) 부분 설치

/usr/local/bin/safe_finger

/usr/local/bin/tcpd

/usr/local/bin/tcpdchk

/usr/local/bin/tcpdmatch

/usr/local/bin/try-from

/usr/local/doc/tcp_wrappers/BLURB

/usr/local/doc/tcp_wrappers/Banners.Makefile

/usr/local/doc/tcp_wrappers/CHANGES

/usr/local/doc/tcp_wrappers/DISCLAIMER

/usr/local/doc/tcp_wrappers/Makefile

/usr/local/doc/tcp_wrappers/README

/usr/local/doc/tcp_wrappers/README.IRIX

/usr/local/doc/tcp_wrappers/README.NIS

/usr/local/include/tcpd.h

/usr/local/lib/libwrap.a

/usr/local/man/man3/hosts_access.3

/usr/local/man/man5/hosts_access.5

/usr/local/man/man5/hosts_options.5

/usr/local/man/man8/tcpd.8

/usr/local/man/man8/tcpdchk.8

/usr/local/man/man8/tcpdmatch.8

[ 클래스 <none> 검증 ]


<SMCtcpwr>(이)가 성공적으로 설치되었습니다.

[test:/]

4. 호스트 파일의 수정

  - hosts.allow 파일을 새로 생성하고 인가하고자 하는 IP만 기록한다.

/etc/hosts.allow

in.telnetd : 192.168.0.1 22.132.2.

in.ftpd : 22.132.2.

 위의 설정파일의 내용은 192.168.0.1을 승인하고 22.132.2.에 해당하는 255대에 대해      서도 접근승인을 하는 설정입니다.

  - hosts.deny 파일을 새로 생성한다. 기본적으로 모든 서비스 거부로 기록한다.

/etc/hosts.deny

ALL:ALL

5. /etc/inetd.conf 의 수정

 - 대개의 경우 telnet, ftp 의 대한 IP 접근 제어를 하려 할것이다. telnet, ftp 부분을 아래와 같이 변경한다.

telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd

ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  in.ftpd

shell   stream  tcp     nowait  root    /opt/sbin/tcpd  in.rshd

login   stream  tcp     nowait  root    /opt/sbin/tcpd  in.rlogind

finger  stream  tcp     nowait  nobody  /opt/sbin/tcpd  in.fingerd

위의 설정중 원하는 부분만 수정을 하도록 한다.

6. 설정 파일의 점검

 - tcpdchk : 현재 설정되어 있는 상황을 점검할수 있다.

[root@tgs] tcpdchk -v   

Using network configuration file: /etc/inetd.conf


>>> Rule /etc/hosts.allow line 6:

daemons:  in.telnetd

clients:  192.168.0.1

access:   granted


>>> Rule /etc/hosts.deny line 9:

daemons:  ALL

clients:  ALL

access:   denied

 

- tcpdmatch : 실제로 IP가 접근거부/수락이 어떻게 되는지 테스트한다.

[root@tgs]tcpdmatch in.telnetd 192.168.0.1

client:   address  192.168.0.125

server:   process  in.telnetd

matched:  /etc/hosts.allow line 6

access:   granted

 

192.168.0.125번 IP에서 telnet 접근이 가능함을 볼 수 있다.

7. /etc/inetd.conf 의 재시작

# ps -ef |grep inet

# kill -HUP <inet-PID>

8. 접속에 대한 테스트

  - 보통 hosts.allow 에 등록이 되어 있지 않으면 telnet, ftp를 해도 프롬프트에 대한 응답이 없다.

< Solaris 10 에서의 TCP Wrapper 의 설정 >

1. 현재의 tcpwrapper 의 설정확인

   # inetadm -p

     tcp_wrappers=false

     - 솔라리스 10은 기본적으로 false로 설정되어 있다.


2. 호스트 파일의 수정

  - 위의 4번 사항과 동일하다


3. tcpwrapper 의 시작설정

 # inetadm -M tcp_wrappers=true


4. 설정 파일의 점검

  - 위의 7번항목과 동일하다


5. tcpwrapper 의 중지

# inetadm -M tcp_wrappers=false

크리에이티브 커먼즈 라이선스
Creative Commons License

밴스 컴퓨터 이야기/Solaris sToRy Solaris, tcp_wr

x86, sparc 에서 installboot 사용법

2007/02/12 22:06

[1] 기능

디스크 파티션(partition)에서 부트블럭(BootBlock)의 인스톨한다.

boot 프로그램인 ufsboot은 부트 영역의 파티션에 있는 부트 블록에 의해 메모리로 로드 되어진다. 이때 부트 영역이란 root와 usr 파일 시스템을 의미한다.

ufs 부트의 플랫폼(platform) 대상은 /usr/platform/`uname -i`/lib/fs/ufs 디렉토리에서 확인할 수 있다.


[2] 형식

SPARC 시스템      /usr/sbin/installboot bootblk raw-disk-device

X86 시스템       /usr/sbin/installboot pboot bootblk raw-disk-device

다음은 명령어에서 사용되어지는 옵션들에 대한 설명이다.

bootblk 부트블록 코드(code)의 이름
raw-disk-device 부트블록 코드가 인스톨 되어질 디스크 디바이스 명
(반드시 raw 디바이스를 사용 해야 한다.) SCSI나 IPI 드라이브라면 c?t?d?s?형식이고, IDE 드라이브라면 c?d?s?형식
pboo 부트 파일 파티션 명


SPARC의 경우 ufs 부트 블록이 슬라이스(slice) 0, 타겟(target) 1, 콘트롤러(Controller) 1일 경우 부트블럭의 인스톨 :

# /usr/sbin/installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c1t1d0s0

X86의 경우 ufs 부트 블록이 슬라이스 2번, 타겟 0, 콘트롤러 1일 경우 부트블럭의 인스톨 :

# /usr/sbin/installboot /usr/platform/`uname -i`/lib/fs/ufs/pboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c1t0d0s2

 
크리에이티브 커먼즈 라이선스
Creative Commons License

밴스 컴퓨터 이야기/Solaris sToRy installboot, Solaris

x86 solaris 9 에서 시디롬 싱글모드 부팅방법 및 패스워드 변경

2007/02/12 21:29
1. x86의 경우는  cdrom 싱글로 들어가기 위해 일단 cmos의 부팅 우선순위에서 cdrom 이 최고 우선순위가 되도록 설정하세요.  
 
2.1번 시디를 넣고 부팅을 시도하다가 장치 선택하는 configuration 모드에 진입하면 cdrom 을 체크 하시고 F2를 눌러 진행하세요.  
 
3. 1. solaris interactive 하고 2.custom jumpstart 메뉴가 나올시에 엔터치지 마시고 b -s 를 입력하세요.  
 
4.부팅이 진행되어 프로프트가 나오면  
 
TERM=dtterm  
EDITOR=/usr/bin/vi  
export TERM EDITOR  
 
작업을 해 주시고  
 
5.mount /dev/dsk/c0d0s0 /a  
 
 /a 로 디스크를 마운트하세요.  
 
6.vi /a/etc/shadow 파일을 열어서 패스워드 부분을 제거하시고 저장하신뒤에 빠져나오시면 됩니다.  
크리에이티브 커먼즈 라이선스
Creative Commons License

밴스 컴퓨터 이야기/Solaris sToRy Solaris, 시디롬 싱글 모드, 패스워드