IT 그리고 정보보안/Knowledge base

Nmap 스캐너

plummmm 2021. 4. 15. 21:14
반응형

스캐너의 대장 nmap에 대해 알아보자. nmap을 위한 책이 따로 있을 정도로 활용 범위가 높은 도구이다. 

실무에서도 당연히 활용도 높게 사용되어지고 있다.

 

이놈의 많은 기능들을 여기에 다 쓸 수 없기에.. 자주 사용되는 기능, 명령어들을 알아보자.

윈도우 환경은 따로 다운 받아야 하지만, https://nmap.org/ 

리눅스 환경은 기존에 설치돼있는 OS가 많다. nmap 치고 그냥 옵션 달아서 쓰면된다.

 

아래는 nmap에서 자주 사용되는 스캔 타입이다.

 

TCP나 half-open은 알거고..

FIN, X-MAS, NULL 스캔 

방화벽으로 필터돼있을 때 사용. 3가지 전부다 똑같은 반응이 옴.

포트 열려있으면 응답 없음

포트 닫혀있으면 RST 수신

 

* Ping 스캔

말 그대로 ping ( ICMP Request 메세지) 을 날려 살아있는 호스트를 확인한다.

간혹 icmp 요청 메세지를 필터하는 시스템이 있는데 이건 TCP ping 을 쓴다. (밑에 설명)

 

* UDP 스캔

0바이트 UDP 패킷을 날려서 살아있는 UDP 포트를 찾는다.

port unreachable 응답이 온다면 닫힌거다.

 

* ACK 스캔

ACK 패킷만 보내서 방화벽 룰셋을 확인한다. 스테이트풀 방화벽인지 단순히 Syn만 필터하는지

RST 응답을 받으면 필터X / 응답없으면 필터중

 

* RPC 스캔

RPC 포트인지, 무슨 서비스를 제공하는지 확인하기 위해 Sunrpc Program NULL 을 보낸다.

 

* FTP 바운스 어택

익명 FTP를 경유시켜 호스트 스캔

 

다음은 스캔 옵션이다.

 

 

다음은 nmap을 활용한 스캔 예제를 몇가지 알아본다.

 

 nmap -sS -Pn [IP 주소] : -sS(TCP 스텔스 스캔) -Pn(핑을 사용하지 않고 동작중인 상태 확인)

 

2. -A 추가 (시스템 세부 정보 제공. 서비스 목록 추출, 배너 그래빙(Banner Grabbing) 수행)

**배너 그래빙이란? 텔넷 같은 원격 접속시에 맨처음 뜨는 배너에 서버에 대한 정보가 담긴 경우가 많다.

  그 정보를 갈취하는 것.

 

 

* NMAP을 DB에 연동(메타스플로잇 이용)

메타스플로잇 에서는 MySQL과 PostgreSQL 둘다 지원하지만, 기본적으로 PostgreSQL을 쓰므로

이걸로 해본다.

 

직접 설치를 해야 한다.

 

# apt-get install postgresql

설치가 완료되면 디폴트 계정인 postgres의

비밀번호를 설정한다.

#sudo su postgres -c psql

#ALTER USER postgres WITH PASSWORD '비밀번호';

 

설정 후 메타스플로잇을 실행하여 #db_connect postgres:비밀번호@127.0.0.1/[db이름] 을 입력하여

연결을 시도한다.

 

db_status로 연결 상태를 확인한다.

 

* DB에 앤맵 스캔 결과 저장

만약 팀 단위로 모의해킹을 진행할 경우, 각각 다른 환경, 시점, 위치에서 스캔을 진행할 것이다.

메타스플로잇에서는 앤맵 스캔 결과를 프레임워크에 저장할 수 있게 한다. 아까 말했듯이.

기본적으로 XML 출력 파일을 생성하여 저장한다. 앤맵의 -oX 옵션을 이용하면 된다.

 

msf> nmap -Pn -sS -A -oX [생성될 파일명] [타겟 주소]

 

여기서 주의해야 할 점?? 굳이 주의할건 없지만.. 앤맵 스캐닝을 msfconsole 상에서 해야한다는 거.

그래야 DB연동이 된다. 당연한 거지만 난 헷갈렸음.--;

 

스캔을 하고나면 결과가 자동으로 생성된 파일에 저장되게 된다.

그럼 이제 파일을 DB에 넣고 결과를 확인한다.

# db_import [파일명]   (확장자 적지마셈.)

# db_hosts -c address (스캔된 주소만 뽑아내기!)

 

 

* DB가 만약 메타스플로잇에 연동 되어 있다면 XML파일에 저장하지 않아도 볼 수 있다.

# db_services 를 입력하면 스캔했던 결과가 저장되어 있다.

 

* 메타스플로잇을 이용한 포트 스캔

이번에는 nmap 안쓰고 메타스플로잇에 들어있는 보조 모듈의 포트스캔을 한번 사용해본다.

***Pivoting(피보팅) 이라고 해서 감염된 시스템에서 포트 스캐너를 사용해 접근과 공격을 수행하는 것인데, 

직접 접근이 불가능한 대상에게 내부에 연결된 시스템을 이용하여  접근하는 방법이다. 그냥 뭐 그런게 있다.

예를 들어, NAT를 사용하는 방화벽 뒤에 있는 시스템을 점령했다고 가정한다. 원래는 당연히 못들어감. 근데 

내부 시스템 하나를 점령하면 통과가 가능하다.

 

먼저 사용가능한 스캔을 찾아보자 msf> search portscan 을 입력한다

간단하게 syn스캔을 해보자. msf> use scanner/portscan/syn 

 

Nmap 활용 - TCP Idle scan

* TCP Idle 스캔

네트워크에 있는 다른 호스트의 IP로 스푸핑을 해서 은닉 상태로 스캔한다.

한마디로 좀비로 쓴다는 말이다.

 

좀비로 사용하기 좋은 시스템은 네트워크 트래픽 전송이 없는 즉, 네트워크를 사용하지 않는 시스템이다.

왜 냐 하 면. ip헤더의 id값을 예측할 수 있기 때문이다.

id값은 패킷의 순서를 식별하기 위한 값인데, 트래픽이 없는 시스템을 사용하면 id값 예측이 가능하다.

 

내가 직접 스캔하는 것이 아니므로. 좀비 시스템의 ip헤더 id값을 예측해야한다... 이말이다.

그림을 보자. (http://nmap.org/book/idlescan.html 의 자료이다.)

 

1. 포트가 열려있는 경우

 

 

먼저, 좀비 시스템을 검색해 두는 것이 선행되어야 할 것이다.

좀비 시스템에다가 밑도 끝도 없이 SYN/ACK를 보낸다. 좀비는 "이게 뭐지?" 하면서 RST로 답한다.

공격자는 이 때 RST의 ID값을 인지해 둔다.

그리고 이제 공격자는 실제로 스캔할 대상에다가 좀비의 ip주소로 소스 주소를 스푸핑(spoofing)한 SYN 패킷을 전송한다.

그럼 스캔 대상은 좀비 시스템의 ip로 SYN/ACK로 답할 것이다. (열려 있으니깐.) 그러고나면 좀비는 또 SYN/ACK를 받아

"아 빡쳐.. 이거 왜자꾸옴?" 하면서 또 RST를 보낸다.ㅋㅋ

공격자는 또 SYN/ACK를 보내어 ID값을 확인하여 처음 보낸 SYN/ACK보다 ID값이 2가 높으면 스캔했던 포트가 오픈 상태라는

것을 알 수 있다.

 

2. 포트가 닫힌 경우

 

 

좀비의 소스 주소로 스푸핑하여 SYN 보내는 과정은 1번과 동일하다. 근데 포트가 닫혀있으면 스캔 대상은 RST 패킷을 좀비 시스템에게

전송할 것이다. 그럼 뭐 좀비에서는 딱히 뭔가 응답할 필요가 없다. 그말인 즉, ID값이 중간에 증가하지 않는다는 말이다.

그래서 공격자가 다시 한번 좀비에게 SYN/ACK 패킷을 날려서 RST를 받아 ID값을 확인하면 처음 ID값보다 1증가한걸 알 수있다.

고로, 처음 확인한 ID값에서 1이 증가했으면 스캔한 포트는 닫힌 상태라..이말이다.

 

3. 방화벽에 필터된 경우

 

 

이 경우도 처음엔 같다. 이제 스캔 대상에 SYN을 날렸는데. 필터되버려서 아무일도 안일어난다.

결론 적으로 처음 ID값과 비교하면 포트 닫혔을 때의 상태와 같은 1이 증가하는데.

이걸로 구분할 방법이 없다. 포트가 닫힌건지, 방화벽에 필터된 건지.

 

 

* TCP Idle scan test

먼저 auxiliary에 있는 ipidseq 모듈을 이용하여 사용가능한 좀비 시스템을 찾는게 우선이다.

메타스플로잇에 접근 후 msf > use auxiliary/scanner/ip/ipidseq 입력한다.

옵션은 다음과 같다.

 

옵션 확인했으면 멍청하게 있지말고 쓰레드랑 rhosts 지정한다.

rhosts에는 ip주소 범위를 넣어야 한다. 사용가능한 시스템을 찾는 것이므로. 한줄에 호스트 하나씩 입력된 txt파일도 이용할 수 있다.

(e.g. 192.168.1.0/24 혹은 192.168.1.20 ~ 192.168.1.30  혹은 /tmp/hostlisf.txt)

쓰레드(threads)는 알거라고 생각한다. 

 

 

옵션을 입력하고 #run 을 입력하면 알아서 잘 찾는다. 좋다.

좀비로 192.168.117.130 을 사용하면 될 것 같다. ipidseq 모듈이 그렇게 말하고 있다(!)

이제 스캔을 해보자

#nmap -PN -sI [좀비 IP] [스캔 대상 IP] 를 입력한다.

 

 

반응형