> 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-4/http/undefined-2.md).

# 자동 취약점 진단

## 자동 취약점 진단 <a href="#bkmrk-page-title" id="bkmrk-page-title"></a>

실제로 취약점 진단을 진행할 때는 자동화된 툴과 스크립트를 이용해 먼저 포괄적인 진단을 실행합니다. 이후, 발견된 취약점에 대한 수동 진단을 통해 취약점 존재 여부 및 거짓 양성(False Positive), 거짓 음성(False Negative) 결과들을 검증합니다.

자동화된 취약점 진단용 툴과 솔루션 개발은 오펜시브 시큐리티 업계의 큰 축을 담당하고 있기도 합니다. 이 때문에 가짓수도 많고, 각 네트워크 서비스들에 특화된 툴이나 솔루션들도 많습니다.

* 일반 - Nessus (Tenable)
* 일반 - Nexpose (Rapid7)
* 웹 - Burpsuite (PortSwigger)
* 웹 - Qualys Webapp Scanner (Qualys)
* 액티브 디렉토리 - BloodHound Enterprise (SpecterOps)
* 액티브 디렉토리 - PingCastle Enterprise (PingCastle)

BHPT에서는 상용화 솔루션들이 아닌, 무료 오픈소스 툴들에 대해서 배워봅니다.

* 일반 - Nessus Community (무료버전)
* 일반 - Metasploit
* 웹 - Nikto, Nuclei, wpscan, burpsuite

## Nuclei <a href="#bkmrk-nuclei" id="bkmrk-nuclei"></a>

Nuclei는 양식(템플릿/Template) 기반의 취약점 진단 스캐너입니다. 본래는 웹 보안 및 버그바운티용 스캐너로 개발되었지만, 추가적으로 DNS, SSL, 소스코드, 파일 형식, 네트워크 서비스 등의 다양한 타겟을 상대로 취약점을 진단할 수 있습니다. 단, 원래 웹 보안용 스캐너였기 때문에 일반적인 네트워크 서비스 스캐닝은 취약점 진단 양식들의 숫자가 부족해 효율을 기대하기 어렵습니다.

ProjectDiscovery사에서 개발된 툴인 만큼 오픈 소스로 만들어진 스캐너이며, Nuclei가 진단을 위해 사용하는 취약점 진단 양식들 또한 모두 오픈소스화 되어 있습니다. 소스코드 및 양식들은 아래의 링크를 참고하세요.

* Nuclei 공식 리포: <https://github.com/projectdiscovery/nuclei>
* Nuclei 공식 문서: <https://docs.nuclei.sh/getting-started/overview>
* 취약점 진단 양식 리포: <https://github.com/projectdiscovery/nuclei-templates>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F5eTrt75lH9K6S3YaJCLp%2Fimage.png?alt=media&amp;token=0dcf828a-ed41-4eec-85cf-339621938a34" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FBACrRfFRo6DuWNmYWiTg%2Fimage.png?alt=media&amp;token=85b383cd-3393-4f15-8afa-47ec7ad3af70" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FpLNqaan3LtczegFbBDLa%2Fimage.png?alt=media&amp;token=4d5ce7cb-2c8e-4efe-9402-3ef5b725272f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F3z9Yaxg6MZeyDyr420lT%2Fimage.png?alt=media&amp;token=c9e93bdc-c844-47e1-8e90-98708d841fcc" alt=""><figcaption></figcaption></figure>

```sql
sudo apt update -y ; sudo apt install golang-go -y 
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
echo 'export PATH=/home/kali/go/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
```

Nuclei에는 약 200개 종류의 플래그들이 있습니다. BHPT에서는 간단한 사용법만 알아봅니다.

### **1. 기본 스캐닝**

```
nuclei -u <IP/호스트이름/URL>:<포트>

# IP 주소
nuclei -u 172.31.1.1

# 웹 URL과 포트 
nuclei -u https://172.31.1.1:8443

# 일반 네트워크 서비스와 포트 
nuclei -u 172.31.1.1:445
```

### **2. 웹 스캐닝**

웹 서버나 웹 애플리케이션을 스캔할 때는 `http://, https://` 등의 URL을 설정해야합니다. 또한, 웹 스캐닝을 진행할때는 `-as`플래그를 이용해 Nuclei가 타겟 웹서버/애플리케이션의 기술스택을 자동적으로 판단한 뒤 알맞는 양식을 사용하도록 하는 것이 효율적입니다.

```
nuclei -u http[s]://<ip>:<port> -as 

└─$ nuclei -u http://172.31.198.21:8081 -as
```

### **3. 네트워크 서비스 스캐닝**

웹 서버나 웹 애플리케이션이 아닌, 일반적인 네트워크 서비스(SSH, FTP, NFS, SMB, 등)을 스캐닝할 경우 `-et http/` 플래그를 사용해 웹(http)과 관련된 양식들은 모두 제외한 채 스캐닝을 진행합니다. Nuclei에는 약 7200개의 진단 양식이 있는데, 웹과 관련된 양식들이 약 6,700개입니다. 따라서 웹이 아닌 포트를 스캔할 때는 이 양식들을 제외해야 빨리 스캔할 수 있습니다.

```
nuclei -u <ip>:<port> -et http/ 

└─$ nuclei -u 172.31.198.21:2100 -et http/
```

### 4. 주의점 <a href="#bkmrk-ec-a3-bc-ec-9d-98-ec-a0-90" id="bkmrk-ec-a3-bc-ec-9d-98-ec-a0-90"></a>

Nuclei의 경우 기본적으로 스캔을 빠르게 진행하도록 설정되어 있습니다. 헬프 페이지에 따르면 웹 스캔을 기준으로 nuclei는 최대 1초당 약 150개의 HTTP 요청을 대상에게 보내도록 설정되어 있습니다. 대부분의 경우 큰 문제는 없지만, `mod3ex` 강의 머신과 같이 성능이 좋지 않은 호스트나, 해당 호스트에서 실행 중인 컨테이너 기반의 애플리케이션들의 경우 1초당 150개의 요청을 감당하지 못하고 다운이 될 수 있습니다.

따라서 nuclei를 실행하다가 대상 `mod3ex` 머신의 포트 8081이 먹통이 되는 경우, 아래의 플래그를 참고해 속도를 줄인 뒤 스캔을 진행합니다.

```
└─$ nuclei --help

[ . . . ] 

RATE-LIMIT:                                                                                                                                                 
   -rl, -rate-limit int               maximum number of requests to send per second (default 150)                                                           
   -rlm, -rate-limit-minute int       maximum number of requests to send per minute                                                                         
   -bs, -bulk-size int                maximum number of hosts to be analyzed in parallel per template (default 25)                                          
   -c, -concurrency int               maximum number of templates to be executed in parallel (default 25)                                                   
   -hbs, -headless-bulk-size int      maximum number of headless hosts to be analyzed in parallel per template (default 10)                                 
   -headc, -headless-concurrency int  maximum number of headless templates to be executed in parallel (default 10)
```

Nuclei 속도 줄이고 실행

```
# 1초당 최대 HTTP 요청 50개로 제한, 병렬적으로 실행하는 양식 갯수 10개로 제한 
nuclei -u http://172.31.198.21:8081 -as -rl 50 -c 10
```

## Nikto <a href="#bkmrk-nikto" id="bkmrk-nikto"></a>

Nikto는 웹 보안 자동 취약점 진단 스캐너입니다. 2001년도에 만들어졌으며 마지막 버전이 2015년도인 만큼, 진단하지 못하는 취약점들도 많고, 오래전의 웹 기술 스택(PHP, CGI, 등)과 관련된 취약점만 찾는다는 단점이 있습니다. 그럼에도 불구하고 빠른 속도, 간편한 사용법, 그리고 칼리 리눅스에 기본적으로 설치가 되어 있기 때문에 자주 사용됩니다.

### 사용법

```sql
nikto -host <url> 

└─$ nikto -host http://172.31.226.91:8081
```

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FhyvnUzlgxGab5p5FwONN%2Fimage.png?alt=media&amp;token=2e232fe0-9d57-4992-8d5d-23ae2fd98c06" alt=""><figcaption></figcaption></figure>
