> For the complete documentation index, see [llms.txt](https://redryan.gitbook.io/studyjoon/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redryan.gitbook.io/studyjoon/hacking/bhpt/undefined-3/undefined-2.md).

# 포트스캐닝

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FNzOXcw7vemADZZx36rhc%2Fimage.png?alt=media&amp;token=748b2c0f-8bde-47f8-892a-662cce7b50ef" alt=""><figcaption></figcaption></figure>

## 포트스캐닝 (Port Scanning) <a href="#bkmrk-page-title" id="bkmrk-page-title"></a>

포트 스캐닝은 특정 호스트의 TCP 및 UDP 포트 상태를 조사하는 정보 수집 활동입니다. 모듈2에서 살펴본대로, 네트워크를 통해 통신하고자 하는 프로세스들은 운영체제 내에서 특정한 포트에 맵핑됩니다. 이러한 포트에 할당된 프로세스들은 `IP주소:포트번호` 형식을 사용해 인터넷 프로토콜(Internet Protocol) 및 전송 계층(Transport Layer: TCP/UDP)을 통해 외부로부터의 접근할 수 있게 됩니다.

호스트 기반의 모의해킹을 실시할 때 필수적인 첫 단계는 대상 호스트에 어떤 TCP/UDP 포트들이 열려 있는지를 확인하는 것입니다. 모든 포트가 닫힌 호스트는 네트워크를 통한 외부 접근이 불가능하며, 공격 대상으로서의 가치가 없기 때문입니다.

포트는 다음과 같은 상태를 가질 수 있습니다.

* 열림(Opened): 들어오는 트래픽에 반응하며, 실행중인 네트워크 서비스가 있을 확률이 매우 높습니다. 대부분 열린 포트에서는 네트워크 서비스와 소통이 가능합니다.
* 닫힘(Closed): 들어오는 트래픽에 반응하지 않으며, 포트 자체가 닫혀있습니다. 공격자의 입장에서는 크게 관심이 가지 않는 포트의 상태입니다. 닫힌 포트들을 순서대로 방문해 특정 포트를 여는 Port Knocking 등의 기법들이 있긴 하나, 실무에서는 잘 사용되지 않습니다.
* 필터됨(Filtered): 포트 자체는 열려 있으나, 들어오는 트래픽에 반응을 할수도, 하지 않을 수도 있습니다. 대부분 호스트 기반, 혹은 네트워크 장비 기반의 방화벽 레벨에서 트래픽을 필터하거나 막아낼 때 포트는 Filtered 상태가 됩니다.

### 1. 포트스캐닝 방법 <a href="#bkmrk-ed-8f-ac-ed-8a-b8-ec-8a-a4-ec-ba-90-eb-8b-9d-eb-b0-a9-eb-b2-95" id="bkmrk-ed-8f-ac-ed-8a-b8-ec-8a-a4-ec-ba-90-eb-8b-9d-eb-b0-a9-eb-b2-95"></a>

포트스캐닝은 크게 TCP 포트스캐닝과 UDP 포트스캐닝으로 나뉩니다. 그 중 TCP는 TCP 3-way handshake 과정의 세부 단계들을 어떻게 사용하느냐에 따라 CONNECT, SYN, Null, Fin, Xmas 등의 포트스캐닝 방법으로 또 나뉘게 됩니다. 정리하자면 다음과 같습니다.

* TCP: TCP 3-Way Handshake 과정을 이용해 포트 상태 확인
  * CONNECT
  * SYN
  * Null, Fin, Xmas 등의 레거시 포트스캐닝 방법들
* UDP: 다수의 프로브(probe) 패킷을 준비한 뒤 각 포트에 프로브를 날리고, 해당 포트에서 데이터가 반환되는지 확인

### 2. TCP CONNECT 스캔 원리 <a href="#bkmrk-tcp-connect-ec-8a-a4-ec-ba-94-ec-9b-90-eb-a6-ac" id="bkmrk-tcp-connect-ec-8a-a4-ec-ba-94-ec-9b-90-eb-a6-ac"></a>

TCP CONNECT 스캔의 경우 TCP 3-Way Handshake를 모두 진행한 다음 포트의 열림/닫힘 여부를 판단합니다. 모든 핸드쉐이크 과정을 실행하기 때문에 가장 정확도가 높지만, 가장 속도가 느린 포트스캐닝 방법이기도 합니다.

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2Fsg2lnwNWxIR7bg6Tsp44%2Fimage.png?alt=media&amp;token=bd9fab2c-a1aa-40cd-b6ad-00d8caa9a470" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FmguncaQhHwnuJGPu9SYL%2Fimage.png?alt=media&amp;token=0d12b9ce-5f33-4e8c-9aa8-7ef8f65cf397" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FRlSegWvsLXhM7qLZJzs7%2Fimage.png?alt=media&amp;token=84a7813d-2f5f-46f1-b25a-4a8db9c5dda9" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FY2HopOaTnxaOusU6cIE7%2Fimage.png?alt=media&amp;token=9717d85f-4e05-4e22-a927-f6b2ec2656f0" alt=""><figcaption></figcaption></figure>

위 스크린샷처럼 CONNECT 스캔은 TCP 연결을 모두 진행합니다. 그 뒤 TCP 연결이 완전하게 성공하면 포트가 열려있다고 판단하고, TCP 핸드쉐이크 과정 중 연결이 완전하게 성공하지 않으면 포트가 닫혀있거나 필터링 되어 있다고 판단합니다.

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FhYf9B9RXOnMx7QxPDTVS%2Fimage.png?alt=media&amp;token=75b5c062-b154-4488-8104-0627d2be9d24" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FIARJAG4HUWv3zl2qnPL0%2Fimage.png?alt=media&amp;token=76532e00-ac2e-43f9-891e-fcf4a7abcb32" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FmZI1CuG6rMSd6OtT6Vkl%2Fimage.png?alt=media&amp;token=e0415a3f-d7cc-401f-85d7-1d681b4af893" alt=""><figcaption></figcaption></figure>

예를 들어 위의 경우 핸드쉐이크 과정을 다 끝마치지도 못한 채 대상 호스트에서 해당 포트는 닫혀있다고 `RST/ACK` 패킷을 보냈습니다. 이런 경우 포트가 닫혀있거나 필터링 되어 있다고 판단합니다.

TCP CONNECT 스캔의 경우 핸드쉐이크를 통해 완전한 TCP 연결을 맺기 때문에 대상 호스트나 사이에 있는 방화벽, 네트워크 장비들에 로깅(Logging)이 훨씬 더 잘, 자세하게 되는 경우가 많습니다. 물론 2023년 기준으로 TCP SYN 스캔 또한 로깅은 잘 되는 편입니다.

### 3. TCP SYN 스캔 원리 <a href="#bkmrk-tcp-syn-ec-8a-a4-ec-ba-94-ec-9b-90-eb-a6-ac" id="bkmrk-tcp-syn-ec-8a-a4-ec-ba-94-ec-9b-90-eb-a6-ac"></a>

TCP SYN 스캔의 경우 TCP 3-Way Handshake 과정 중 절반만 실행합니다. 완전한 TCP 연결을 하는 것이 아니기 때문에 TCP CONNECT와 비교해 속도가 월등히 빠르지만, 그와 동시에 대상 호스트나 그 사이에 있는 라우터, 방화벽 등의 네트워크 장비들에 의도치 않게 Half-Openned Scanning으로 인한 서비스 거부 (DOS) 공격을 일으킬 수 있습니다.

다음 스크린샷은 대상 호스트에서 열린 포트를 찾았을 때의 SYN 스캔입니다.

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FsjZkngiYXaHDsdWw5SZ2%2Fimage.png?alt=media&amp;token=55f0de2d-90bf-431c-af2c-cb5aa65855e3" alt=""><figcaption></figcaption></figure>

```
sudo nmap -sS -p 22 -Pn [ip]
sudo nmap -sS --top-ports 2000 -Pn [ip]

- 주의사항 : SYN scan이 TCP CONNET scan 보다 훨씬 빠르지만 방화벽, 네트워크 장비들이 SYN 스캔
을 핸들링을 잘 하지 못하는 경우가 많다.
- 즉, 정상적이지 않은 TCP 핸드 쉐이크를 잘 처리하지 못하는 방화벽, 네트워크 장비들이 있다.
- 높은 숫자의 스캔을 하다보면 라우터나, 방화벽들이 과부하를 받는 경우가 있다.
- 너무 남발을 하는 것은 좋지 않다.
- 서비스 버전 정보, 어떤 네트워크 서비스가 돌아가는지를 알 수가 없다.
```

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2Fo8hduUMRv9RImVnorO4U%2Fimage.png?alt=media&amp;token=7ed605a0-8e52-49fd-8e48-2a26845afc04" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FkIBcMdfe62D5R7ihjQVM%2Fimage.png?alt=media&amp;token=fbccbb24-66a4-468b-bc76-5ee5b1dcff53" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FmQo1jbbJjqS5P7H2JdEI%2Fimage.png?alt=media&amp;token=ac6c70d2-980e-407a-9201-f54c50bd5fb7" alt=""><figcaption></figcaption></figure>

아래는 대상 호스트에서 닫힌 포트를 찾았을 때의 SYN 스캔입니다.

<figure><img src="https://guides.redraccoon.kr/uploads/images/gallery/2025-01/scaled-1680-/wlF3DU0cmIp9Tehs-image-1735975534856.png" alt=""><figcaption></figcaption></figure>

위 스크린샷들처럼 TCP SYN 스캔의 경우 완전한 핸드쉐이크를 진행하지 않습니다. 포트가 열려 있는 경우 서버는 `SYN/ACK`을 보내고, 서버가 닫혀 있는 경우 `RST/ACK`을 보냅니다.

스캐너들의 종류에 따라 포트가 열려 있거나 (`SYN/ACK`) 닫혀 있을 때 (`RST/ACK`) 그와 관련된 추가 패킷을 보내지 않는 경우가 있습니다. 이런 경우 대상 호스트에서는 TCP 연결을 계속 열어 놓은 채 계속 패킷을 기다립니다. 특히 네트워크 장비들이나 라우터의 경우 해당 TCP 연결을 모니터링 하거나 로깅을 하는데, 이때 이렇게 반쯤-열려있는 (half-openned) TCP 연결을 계속 감시하며 자원을 소모하는 경우가 많습니다.

따라서 SYN 스캔을 너무 빠른 속도로 진행하거나 완벽하게 SYN 스캔을 적용하지 않은 스캐너를 사용할 경우 대상 호스트나 네트워크 장비들의 자원을 소모하는 DoS 공격으로 이어질 수 있으므로 주의해야합니다.

> **실무에서는:** SYN과 CONNECT를 제외한 다른 방식의 TCP 스캐닝 방식들은 패킷단에서 벌써 IPS나 방화벽에서 필터링 되는 경우가 많이 있습니다.

> SYN 스캔의 경우 외부망 진단을 할때 대상 호스트들이 클라우드가 아니라 onprem(온프레미스)에 있고, 고객사의 가장 바깥의 엣지 라우터(Edge Router/Firewall)가 동시 SYN 커넥션(Concurrent SYN Connection)을 많이 지원하지 않을 경우 서비스 거부 공격(DOS 공격)이 일어날 수 있습니다. 따라서 조심히 사용해야합니다.

### 4. UDP 스캔 원리 <a href="#bkmrk-udp-ec-8a-a4-ec-ba-94-ec-9b-90-eb-a6-ac" id="bkmrk-udp-ec-8a-a4-ec-ba-94-ec-9b-90-eb-a6-ac"></a>

UDP의 경우 상태가 존재하지 않는 Stateless 연결이기 때문에 특정 포트가 열려 있는지 닫혀 있는지, 그리고 열려 있다면 어떤 네트워크 서비스가 뒤에서 실행중인지 100% 완벽하게 알아내기가 어렵습니다.

UDP 스캔의 경우 UDP 패킷을 보내고, 응답이 돌아온다면 Open, 응답이 없거나 ICMP Response가 돌아온다면 Closed/Filtered 로 판단합니다.

### 5. Nmap <a href="#bkmrk-nmap" id="bkmrk-nmap"></a>

앞으로 포트스캐닝, 정보수집, 그리고 취약점에서 많이 사용할 툴입니다. Nmap은 Network Mapper의 줄임말으로서, 90년대 후반 네트워크 문제 해결 툴로 개발되었습니다. 요즘에는 네트워크나 서버, 호스트들의 네트워크적 보안 상태를 파악하는데 더 많이 사용되고 있습니다. Nmap은 오픈소스로 30년간 개발되고 사용되고 있기 때문에 신뢰성이 높습니다.

Nmap에서 사용할 수 있는 플래그는 너무 많기 때문에 BHPT에서는 플래그 하나 하나 다루지 않습니다. BHPT에서 사용되지 않는 플래그들은 다음의 공식 홈페이지나 쉘에서 헬프 메시지를 확인하시기 바랍니다.

Nmap 공식 홈페이지의 경우 플래그 뿐만 아니라 Nmap의 작동 원리에 대해서도 자세하게 설명하고 있으니 꼭 한 번 읽어보시는 것을 추천드립니다. 예를 들어 Nmap은 호스트 탐지를 어떤 논리로 진행하는가, 얼마나 많은 패킷을 보내는가, 어떻게 상대방 운영체제를 확인하는가 등등에 대해서 나와있습니다.

```
# 공식 홈페이지
https://nmap.org/

# 기본 헬프 메뉴
nmap --help

# 심화 헬프 메뉴
man nmap 
```

> **실무에서는:** 정확도와 적은 대상을 상대로는 Nmap을, 많은 대상 (예. 내부망 10.0.0.0/8 이나 172.16.0.0/12, 등)을 상대로는 Masscan을 먼저 사용한 뒤 살아있는 호스트들을 대상으로 Nmap을 사용합니다.

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FmVisL7O5HeyWlcprhTmb%2Fimage.png?alt=media&amp;token=5eee6689-fc11-48da-9e59-66dd171de21f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F9GH1PVplz9ZV4ESy3986%2Fimage.png?alt=media&amp;token=66c14215-749e-42e3-9c4d-622d899ebdb9" alt=""><figcaption></figcaption></figure>

* Virtual Hosting : 하나의  IP에 여러개의 DNS가 존재하는 경우를 조심해야 한다. 차단 당할 확률 높다.
* 고로, Axiom인 분산 스캐닝을 이용하여 차단을 우회한다.
* 모든 포트가 열린 경우는 거짓 양성일 확률이 높다. -> 방화벽 등이 중간에서 포트 스캐닝을 방해하고 있다.

***

## 실습

1. tmux
2. sudo wireshark

## 1. ICMP(PING) 스캐닝

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FO6aRy0g07sisnBuiB9tN%2Fimage.png?alt=media&amp;token=1049ce99-7310-4fa1-849b-4892a799ff5c" alt=""><figcaption></figcaption></figure>

## 2. TCP CONNECT 스캐닝

* nmap에서가장 흔한 TCP 포트부터 레어한 TCP 포트까지 리스트를 가지고 있다.
* 이때, 가장 흔한 TCP 포트 1000개를 선정하여 스캐닝을 진행한다.
* 가장 기본적인 스캐닝 방

```
nmap 172.31.238.169
```

## 3. TCP SYN 스캐닝

* TCP SYN 스캔은 굉장히 빠르다.

```
sudo nmap -sS [ip]
```

## 4. UDP 스캐닝

* 잘 사용하지 않는다.

```
sudo nmap -sU [ip]
```

## 5. 심화된 포트 스캐닝

{% code overflow="wrap" %}

```
## 지정한 포트 스캐닝
namp -p 80,443, [ip]
nmap -p 80,443,8000-9000 [ip]

## 모든 포트 스캐닝
nmap -p- [ip]

## 가장 흔한 포트 N개
nmap --top-ports N [ip]

## 속도조절 스캐닝- 기본 : T3
nmap -T3 [ip]
nmap -T5 [ip] - 가장 빠른 스캐닝
- 속도가 빠르면 쓸데없는 데이터도 나오고 호스트 기반 방화벽에서 좋지 않다.
- T3, T4 정도가 적당하다.

## 세부 조절 스캐닝
nmap --min-rate 3000 [ip]
- 패킷을 3000개를 보낸다.

## 열린 포트만 보기 
nmap -T4 [ip] --open

## Host discovery == icmp + 80 + 443 --> port scan
sudo nmap -p 22 [ip]
- 기본적으로 호스트 탐지는 icmp(Ping 스캔을 한다) + 80번 포트도 확인하고 + 443 포트도 확인한 다음에 22번 포트인 ssh를 마지막으로 확인한다.
- 이 호스트 탐지의 문제점은 스캐닝 대상에서 icmp를 BLOCK 하거나 80/443 포트 CLOSE 인 상태가 되어 있다면, ssh인 22번 포트를 스캔하지 않고 그 전에 닫혀있다고 판단하여 스캔이을 하지 않는 상황이 벌어진다.

## 호스트 탐지 기능 끄기
sudo nmap -p 22 -Pn [ip]

## 저장하기
sudo namp -p 22 -Pn [ip] -oA nmap-output

```

{% endcode %}

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F06YWdjjZAi7YbS2uYQAU%2Fimage.png?alt=media&amp;token=07d76135-1c7c-4f17-8988-0db967b82ec6" alt=""><figcaption></figcaption></figure>

```
* 문제 정답
sudo nmap -p 8000-37000 -Pn --open -oA bhpt-scan [ip] --min-rate 3000
```
