Post

Linux Nmap

Nmap



해킹을 할 때 대상 시스템 또는 네트워크에 대한 정보를 많이 가질수록 더 많은 옵션을 선택 가능.

따라서 열거(enumerate)를 수행하여 정보를 흭득해야 함. 즉, 타깃에서 어떠한 서비스가 실행되고 있는가를 알아내야 함.

그 방법으로 포트 스캐닝이 있으며 가장 유명한 오픈소스 포트 스캐닝 툴로 nmap이 있음.


Nmap은 표준 소켓을 사용하지 않고 raw 네트워크 접근이 필요하므로 반드시 루트 권한으로 수행해야 함.


Cheat Sheet : tationx.net/nmap-cheat-sheet/

Nmap Reference Guide : nmap.org/book/man.html






port scanning



지도를 만드는 첫 번째 단계는 포트 스캔임.

컴퓨터가 네트워크 서비스를 실행할 때 연결을 수신하기 위해 포트라는 네트워킹 구조를 엶.

포트는 여러 네트워크 요청을 하거나 여러 서비스를 사용할 수 있도록 하는 데 필요함.

사용 가능한 포트는 65535개이나, 그 중 많은 포트번호들이 표준 포트번호로 등록되어 있음.

ex) http(80), https(443), smb(445)


  • well-known ports : 0 - 1023 (1024개)

  • Registered ports : 1024 - 49151

  • Dynamic(private) ports : 49152 - 65535






TCP Flags



  • URG : 긴급(Urgent), 중요한 데이터임을 지정함.

  • ACK : 승인(Acknowledgment), 패킷 수신 승인을 의미, 이 비트는 연결이 존재하는 동안 대부분 켜져있음.

  • PSH : Push, 수신자에게 데이터를 버퍼링하지 말고 바로 처리하라고 지시.

  • RST : Reset, 연결을 초기화함.

  • SYN : 동기화(Synchronize), 연결의 시작 부분에서 순서 번호를 동기화함.

  • FIN : Finish, 양쪽에서 연결을 끊고자 하는 신호를 보낼 때 연결을 끊음.


image


TCP 헤더는 승인 번호를 갖고 있는데 이 번호는 상대방의 순서 번호에 1을 더한 값이다.






switches



Nmap : Nmap


  • Options

    • -sA : scan TCP ACK

    • -sS : scan SYN

    • -sU : scan UDP

    • -sT : scan TCP

    • -sN : scan TCP Null

    • -sF : scan TCP FIN

    • -sX : scan TCP XMAS

    • -O : scan operating system the target is running on

    • -sV : scan Version

    • -v : verbosity

    • -vv : verbosity level 2

    • -oA : save the nmap result in three major formats

    • -oN : save the result in normal format

    • -oG : save result in grepable format

    • -A : Aggressive mode (서비스 탐지, 운영 체제 탐지, 추적 경로 및 일반 스크립트 검색)

    • -p- : scan all ports

    • --script : activate a script from nmap script library

    • --script=<category> : activate <category> script from nmap script library

      ex) --script=vuln






TCP Connect Scan (-sT)



Nmap은 지정된 각 TCP 포트에 연결을 시도하고 수신 응답에 의해 서비스가 열려 있는지 여부를 결정

우선 TCP/IP 프로토콜의 연결 과정을 보면 SYN - SYN/ACK - ACK

송신자는 SYN을 보내고 연결 성공 시 수신자로부터 SYN/ACK를 받고 다시 ACK를 보냄.

실패 시에는 수신자로부터 RST(Reset) 패킷을 받아서 포트가 닫혀있음을 알게 됨.

하지만 포트가 열려있지만 방화벽에 가려져있는 경우(막힌 경우)에는 확인이 어려움.


  • RST TCP 패킷으로 응답하도록 방화벽을 구성하는 방법

    • iptables -I INPUT -p tcp --dport <port> -j REJECT --reject-with tcp-reset


이로 인해 대상의 정확한 판독이 매우 어렵게 됨(불가능하지는 않을 경우).






ACK Scan (-sA)



공격자는 공격 대상 시스템으로 ACK 패킷을 전송하면 공격 대상 시스템은 수신된 ACK 패킷에 대해 부적절한 응답으로 간주하여 RST 패킷을 보낸다. (연결한 적이 없기 때문)

물론 포트가 열려있을 때 가능하며 만약 포트가 닫혀있다면 RST 패킷이 돌아오지 않을 것이다. 이 점을 이용하여 포트가 열려있는지 확인하는 것이다.






SYN Scan (-sS)



TCP Connect Scan (-sT)과는 약간 다르게 작동함.

TCP Scan은 대상 호스트와 three-way handshake를 수행하는 반면, SYN ScanSYN/ACK를 수신받은 뒤에 RST 패킷을 보냄.

SYN/ACK 패킷이 온다면 그것은 포트가 열려있다는 의미임. 이 패킷을 받으면 스캐너는 RST 패킷을 보내 연결을 끊어 대상 호스트에 DoS 공격이 일어나는 것을 막음.


정리하면 SYN 스캔에서는 완전한 TCP 연결을 맺지 않음. 이러한 방식때문에 SYN Scan을 Half-Open Scan 또는 Stealth Scan이라고 함.


장점은

  1. 열려 있는 포트에서 수신하는 응용프로그램에 의해 기록되지 않게 됨 (연결을 수립하지 않기 때문)

  2. TCP Scan보다 빠름


단점은 이 프로그램은 표준 소켓을 사용하지 않고 raw 네트워크 접근이 필요하므로 반드시 루트 권한으로 수행해야 함.






UDP Scan (-sU)



열린 UDP 포트로 보낼 경우 일반적으로 응답이 없으며, 이 경우 open|filtered 로 표시됨.

요청을 다시 보내서 응답이 없는 경우 open 표시, 이례적으로 응답이 오는 경우에는 open으로 표시

닫힌 UDP 포트로 보낼 경우 대상은 ICMP 패킷으로 응답함.


UDP 포트가 실제로 열려 있는지 여부를 식별하기가 어렵기 때문에 UDP 검색은 다양한 TCP 검색에 비해 매우 느린 경향이 있음 (최초 1000개 포트를 검색하는 데 20분 소요, 양호한 연결 상태).

따라서 일반적으로 --top-ports <number>를 사용하도록 설정한 상태로 Nmap 검색을 실행하는 것이 좋음.


  • Usage : nmap -sU --top-ports <number> <target>

    ex) nmap -sU --top-ports 20 <target> : 가장 일반적으로 사용되는 상위 20개의 UDP 포트를 검색






NULL, FIN, XMAS



SYN 스캔으로 포트 스캐닝을 하면서 반연결을 탐지하는 새로운 툴들이 생겨났음.

그래서 공격자는 스텔스 스캐닝을 하는 또 다른 기법을 생각해 냈고 그것이 바로 FIN, X-mas, Null 스캔임.


이 기법들은 모두 비정상적인 패킷을 공격 대상 시스템의 모든 포트로 보냄.

포트가 열려있다면 대상 시스템은 스캔 패킷을 무시하지만 포트가 닫혀있다면 프로토콜 규약(RFC 793)에 의해 대상 시스템은 RST 응답 패킷을 보냄.

이것을 이용하면 TCP 연결을 맺지 않고도 어떤 포트가 열려있는지 확인 가능함.


image


  • NULL 검색 (-sN)은 플래그가 전혀 설정되지 않은 상태로 TCP 요청을 보내는 경우. (모든 플래그가 꺼져있는 패킷을 보내는 것)

  • RFC에 따라 포트가 닫힌 경우 대상 호스트가 RST로 응답.



  • FIN 검색 (-sF)은 거의 동일한 방식으로 작동하지만 완전히 빈 패킷을 보내는 대신 FIN 플래그와 함께 요청이 전송됨.

  • (일반적으로 활성 연결을 정상적으로 닫는 데 사용됨)



  • Xmas 검색 (-sX)은 잘못된 형식의 TCP 패킷을 전송하며 닫힌 포트에 대한 RST 응답을 기대함.

  • X-mas 스캔은 PSH, URG, FIN 플래그가 켜진 패킷을 보내는데 Wireshark에서 패킷 캡처로 볼 때 깜박이는 크리스마스 트리의 모양을 나타내는 xmas 스캔이라고 함.



  • 이 공격 기법들이 스텔스 기능을 제공하기는 하지만 어떤 경우든지 수행할 수 있는 것은 아님.

    • 예를 들어, 마이크로소프트의 TCP/IP 스택은 이런 스캔을 받았을 때 RST 패킷을 보내지 않으므로 이런 스캔 방법을 사용할 수 없음.


  • 이러한 종류의 스캔의 목적은 방화벽 우회임.






가짜 스캔 패킷 이용


포트 스캔을 들키지 않은 또 다른 방법은 실제 공격을 여러 가짜 패킷 속에 숨기는 것이다.

이 기법은 실제 포트 스캔 공격 사이에 가짜 출발지 주소를 사용하는 포트 스캔 패킷을 전송한다.

이 출발지 주소에 대한 ACK 패킷은 단지 자신의 포트 스캔을 숨기기 위한 것이므로 공격자는 신경 쓸 필요가 없다.

그러나 한 가지 주의할 것은 이 가짜 출발지 주소가 실제로 네트워크에 연결돼 있는 호스트 주소여야 한다는 것이다. 그렇지 않으면 공격 대상에 SYN Flooding 공격을 하는 것이 된다.


Nmap 커맨드라인에 옵션 -D를 이용해 가짜 스캔 패킷을 명시할 수 있다.

예를 들어, 192.168.42.10192.168.42.11을 가짜 주소로 사용해 192.168.42.72를 스캔하는 명령은 아래와 같다.
sudo nmap -D 192.168.42.10, 192.168.42.11 192.168.42.72


Usage
sudo nmap -D <spoofing IP 1>, [<spoofing IP 2> ...] <target IP>






ICMP Network Scanning (-sn)



Nmap은 지정된 네트워크의 가능한 각 IP 주소로 ICMP 패킷을 보냄.

응답을 받으면 응답한 IP 주소가 활성으로 표시됨.

  • Usage : nmap -sn x.x.x.1-254 또는 x.x.x.0/24






IDLE Scanning (-sI)



유휴
쓰지 않고 놀림


유휴idle 스캐닝은 출발지 주소를 유휴 호스트의 주소로 스푸핑한 패킷을 대상 호스트에 보낸 후 유휴 호스트의 상태 변화를 관찰하는 스캔 방법이다.

공격자는 먼저 네트워크 트래픽을 보내거나 받지 않고 있는 유휴 호스트를 찾아야 한다. 그리고 이 유휴 호스트의 IP ID는 공격자가 추측할 수 있게 규칙적으로 증가해야 한다.


IP ID는 각 세션에 속한 패킷 사이에서는 유일해야 하며 일반적으로 고정된 크기만큼 증가한다.

아무도 IP ID가 추측 가능하다는 사실을 보안 위험으로 인식하지 못했지만 해커들은 이런 상식을 깨고 이 사실을 이용한 스캔 방법을 만들었다.

(최신 OS는 IP ID를 임의의 값으로 정한다.)


공격은 다음과 같이 진행된다.


  • 먼저 공격자는 SYN 패킷이나 SYN/ACK 패킷을 보낸 후 응답 패킷의 IP ID를 관찰하는 방법으로 유휴 호스트의 현재 IP ID를 알아낸다. 이 과정을 몇 번 반복하면서 각 패킷 간의 IP ID 증가량을 파악할 수 있다.


  • 그 후 공격자는 유휴 호스트의 IP 주소를 출발지 주소로 설정한 스푸핑된 SYN 패킷을 공격 대상 머신의 포트로 보낸다. 그러면 공격 대상 머신의 포트가 열려 있는지 여부에 따라 다음 둘 중 하나의 일이 발생한다.
    • 그 포트가 열려있다면 공격 대상 머신은 SYN/ACK 패킷을 유휴 호스트로 보낼 것이다. 그런델 유휴 호스트는 실제로 SYN 패킷을 보내지 않았으므로 RST 패킷을 공격 대상 머신에 보낼 것이다.

    • 그 포트가 닫혀있다면 공격 대상 머신은 유휴 호스트로 SYN/ACK 패킷을 보내지 않을 것이므로 유휴 호스트는 응답하지 않는다.


  • 이 시점에서 공격자는 유휴 호스트에 연결해 IP ID가 얼마나 증가했는지 확인한다. IP ID가 1만큼만 증가했다면 아까 검사한 이후로 유휴 호스트는 아무런 패킷도 보내지 않은 것이다.

    즉, 이것은 공격 대상 머신의 포트가 닫혀 있다는 의미로 해석할 수 있다.

    IP ID가 2만큼 증가했다면 유휴 호스트는 1개의 패킷 (아마 RST)을 보낸 것이다. 이것은 포트가 열려있다는 의미다.


image


물론 유휴 호스트가 완전히 유휴 상태가 아니었다면 결과가 왜곡될 수 있다. 1, 2개의 매우 작은 수의 트래픽이 오고 갔더라도 결과를 제대로 판독하는 데 어려움이 있다.

공격 기록을 남기지 않는 유휴 호스트에 이 공격 기법을 사용하면 공격자는 자신의 IP 주소를 드러내지 않고 모든 공격 대상을 스캔할 수 있다.


Usage
sudo nmap -sI <idle host> <target IP>


아래 링크는 Nmap idle scan technique guide이다.

Link : nmap.org/book/idlescan.html






NSE (Nmap Script Engine)



  • Categorires :

    • safe:- Won’t affect the target

    • intrusive:- Not safe: likely to affect the target

    • vuln:- Scan for vulnerabilities

    • exploit:- Attempt to exploit a vulnerability

    • auth:- Attempt to bypass authentication for running services (e.g. Log into an FTP server anonymously)

    • brute:- Attempt to bruteforce credentials for running services

    • discovery:- Attempt to query running services for further information about the network (e.g. query an SNMP server).



  • Scripts : nmap.org/nsedoc/

    • --script=<category>

      카테고리 안에 있는 스크립트 모두 실행

    • --script=<script-name>

      특정 스크립트 실행 ex) --script=http-backup-finder

    • --script=<script-name>,<script-name>

      여러 스크립트 실행 ex) --script=smb-enum-users,smb-enum-shares

    • --script=<script-name> --script-args <script-name.args>

      스크립트를 수행 시 필요한 인자 값

      ex) --script-args http-backup-finder.url=<url>






Searching Scripts



  • Nmap Scripts local storage : /usr/share/nmap/scripts/script.db


  • Installing new scripts : sudo apt update && sudo apt install nmap






Firewall evasion



일반적인 Windows 호스트는 기본 방화벽으로 모든 ICMP 패킷을 차단함.

이로 인해 ping을 사용하여 대상의 작업을 수동으로 설정하는 경우가 많을 뿐만 아니라 Nmap도 기본적으로 동일한 작업을 수행.

즉, Nmap이 이 방화벽 구성을 가진 호스트를 비활성으로 등록하고 검색할 필요가 없음


  • -Pn

    Nmap이 호스트를 검색하기 전에 ping하지 않도록 설정.

    즉, Nmap은 대상 호스트를 항상 활성 상태로 처리하여 ICMP Block을 효과적으로 우회함.

    그러나 잠재적으로 매우 오래 걸릴 수 있음

    (호스트가 실제로 비활성 상태인 경우 Nmap은 지정된 모든 포트를 계속 검사하고 이중 검사함)


  • -f : 패킷을 단편화함(방화벽 또는 IDS에 의해 패킷이 탐지될 가능성을 낮춤)


  • -mtu <number> : 전송된 패킷에 사용할 최대 전송 단위 크기를 허용. 이 값은 8의 배수.


  • --scan-delay <time>ms

    전송 패킷 간의 지연을 추가하는 데 사용.

    이 기능은 네트워크가 불안정할 뿐만 아니라, 시간 기반 방화벽/IDS를 피할 때도 매우 유용함


  • --badsum

    패킷에 대한 잘못된 체크섬을 생성하는 데 사용, 방화벽은 패킷의 체크섬을 확인하는 번거로움 없이 잠재적으로 자동으로 응답할 수 있음.

    따라서 이 스위치를 사용하여 방화벽/IDS의 존재를 확인할 수 있음.






This post is licensed under CC BY 4.0 by the author.