Nuclei

Golang 설치하기

Nuclei는 Golang으로 제작된 도구이라, 운영체제에 Golang이 설치되어야 함.
설치 방법은 인터넷에 쉽게 찾을 수 있어서 Linux 환경에서 설치하는 방법만 설명하겠음.

 

Golang Download Site에서 여러 버전의 Golang 설치 파일을 설치 할 수 있음.
Nuclei는 Go 1.17 버전 이상을 권장하고 있음.

 

현재 Ubuntu의 버전이 22.04 버전이라 apt 저장소에 있는 Golang이 1.18 버전으로 나와있음.
하지만, 22.04 버전 이하에서 다운로드 시 1.15 버전 이하가 다운로드 됨.

 

add-apt-repository ppa:longsleep/golang-backports -y

최신 PPA을 반영하여 apt을 이용하여 golang을 설치 시 최신 버전을 설치 할 수 있음.

Nuclei 설치하기

Github - Nuclei 저장소의 README에 instell-nuclei 부분에서 설치하는 명령어가 존재함.

go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest

install 옵션은 go 1.17 버전 이상에서 사용할 수 있기 때문에 go 1.17 버전 이상을 권장하는 것임.

 

해당 명령어를 통해 설치를 안해도, Github의 저장소에 있는 소스코드로도 사용할 수 있음.
하지만, Git clone과 라이브러리가 설치되는 과정이 시간이 많이 지체되기 때문에 간단하게 go install를 사용하여 설치하겠음.

 

go install를 통해 설치하였다면, ~/go/bin에 다운로드한 프로젝트 실행파일이 존재하는 것을 확인할 수 있음.

 

하지만 실행 파일과 실행에 필요한 라이브러리만 다운로드가 된 것 뿐임.
실행 파일가 없는 곳에서 경로를 지정하여 실행하는 수 밖에 없음.

 

이러한 불편함을 해결하기 위해 환경 변수라는 개념이 존재하는 것으므로, shell의 설정 파일에 환경 변수를 설정하겠음.

 

alias nuclei="/root/go/bin/nuclei"

bash가 아닌 zsh를 사용하기 때문에 .zshrc에 설정하였음.
설정한 이후, source 명령어를 통해 zsh를 재구동하여 설정 값이 잘 작동하는지 확인함.

Nuclei 옵션

모든 옵션을 설명하는 것은 너무 많은 시간을 할애가 됨으로 사용하는데 지장 없는 정도의 옵션을 설명하겠음.

 

옵션 설명
-u, -target 스캔 대상 지정
-l, -list 스캔 대상 리스트 파일 지정
-t, -templates 취약점 스캔 템플릿 및 폴더 지정
-V, -var 템플릿에 사용되는 변수 지정
-debug 모든 Request와 Response 데이터 출력
-headless 행위 기반(ex. Selenium)으로 스캔 시 브라우저를 백그라운드로 실행
-sb, -show-browser 행위 기반(ex. Selenium)으로 스캔 시 브라우저를 포그그라운드로 실행
-update Nuclei 엔진 업데이트
-ut, -update-templates Nuclei 템플릿 업데이트

위 옵션들만 알아도 Nuclei을 사용하는데에 큰 지장은 없음.
주로 템플릿을 제작할 때, -debug-sb을 사용하여 스캔하는데에 큰 문제가 없는지 체크함.

Nuclei 사용법

Nuclei를 실행시키면 자동으로 Nuclei-templates가 다운로드됨.


Nuclei-templates 디렉터리에서 nuclei-templates/technologies/apache/apache-detect.yaml 템플릿과 nuclei-templates/technologies/nginx/nginx-version.yaml 템플릿을 이용하여 Nuclei의 사용법을 익혀보도록 하겠음.

 

테스트 서버는 acunetix에서 테스트 용도로 공유된 http://testphp.vulnweb.com/ 을 타겟으로 테스트를 해보겠음.

 

nuclei -u http://testphp.vulnweb.com/ -t nuclei-templates/technologies/apache/apache-detect.yaml

간단하게 Apache를 탐지하는 스캔 템플릿인 apache-detect.yaml 을 사용하였음.

 

Nuclei의 결과, 스캔 템플릿은 1개 사용하였으며 결과는 없다고 출력됨.
해당 서버는 Nginx를 사용하여 스캔 템플릿에 탐지가 되지 않았던 것임.

 

Nginx의 버전을 파싱하는 스캔 템플릿인 nginx-version.yaml을 사용한 결과, Nginx의 버전이 출력이 된 것을 확인할 수 있음.

 

[2022-09-30 23:05:37] [nginx-version] [http] [info] http://testphp.vulnweb.com/ [nginx/1.19.0]
-----------------------------------------------------------------------------------------------
[2022-09-30 23:05:37] -> 스캔한 시간
[nginx-version] -> 템플릿 이름
[http] -> 프로토콜
[info] -> 취약점 단계 (info, low, medium, high)
http://testphp.vulnweb.com/ -> 스캔 대상
[nginx/1.19.0] -> 결과

결과를 좀 더 분석하자면, 위와 같은 의미를 가지고 있음.

 

이와 같이 버그바운티나 모의해킹을 나갔을 떄, 직접 PoC를 하지 않고 구현된 템플릿을 이용하여 테스트해볼 수 있음.
물론, 그대로 사용하는 건 위험하고 테스트할 때 사용되는 Text가 대충 쓴 것이라 직접 수정하여 사용하는 것을 추천함.

Nuclei Template 간단하게 분석

id: apache-detect

info:
  name: Apache Detection
  author: philippedelteil
  severity: info
  description: Some Apache servers have the version on the response header. The OpenSSL version can be also obtained
  tags: tech,apache

requests:
  - method: GET
    path:
      - "{{BaseURL}}"

    matchers-condition: and
    matchers:

      - type: regex
        part: header
        regex:
          - "Apache+"

      - type: status
        status:
          - 200

    extractors:
      - type: kval
        part: header
        kval:
          - Server

apache를 탐지하는 템플릿으로 아주 간단하게 되어 있음.
하지만, 처음보는 것이라 복잡하게 보일 것으로 간단하게 설명을 하고 넘어가겠음.

 

이후 Project Discovery 소개 - nuclei(3)에서 Nuclei-templates의 Github에 올라가지 않은 CVE를 분석하여 템플릿으로 제작 후 Github에 업로드하는 방법을 업로드하겠음.

 

requests:
  - method: GET
    path:
      - "{{BaseURL}}"

    matchers-condition: and
    matchers:

      - type: regex
        part: header
        regex:
          - "Apache+"

      - type: status
        status:
          - 200

    extractors:
      - type: kval
        part: header
        kval:
          - Server

해당 템플릿에서 실질적으로 스캔을 수행하는 부분은 requests 부분임.
나머지 부분들은 해당 템플릿의 정보, 취약점의 정보를 담당하는 부분임.

 

- method: GET
  path:
    - "{{BaseURL}}"

{{BaseURL}}을 GET 메소드로 요청한다는 뜻임.
{{BaseURL}}Nuclei을 사용 시 -u에 넣는 스캔 대상의 주소를 뜻 함.

 

matchers-condition: and
matchers:

  - type: regex
    part: header
    regex:
      - "Apache+"

  - type: status
    status:
      - 200

matchers은 취약점을 판단하는 조건문임.
type으로 구분되어지며, 현 템플릿에선 2개의 조건문이 존재함.

 

matchers-condition은 조건문이 2개 이상일 경우 or 이나 and로 조건을 처리 할 것인지를 결정함.
현 템플릿은 and로 2개의 조건문이 충족할 때 결과를 출력함.

 

- type: regex
  part: header
  regex:
    - "Apache+"

2개의 조건문 중 첫번째 조건문으로 Response 해더에서 Apache으로 시작하는 단어가 있는지 정규식으로 검사함.

 

extractors:
    - type: kval
      part: header
      kval:
        - Server

해당 부분은 첫번째 조건문에서 어떤 HTTP 해더를 검사할 것인지를 설정하는 부분임.
Response 해더 중 Server 해더를 검사하겠다고 설정됨.

 

- type: status
  status:
    - 200

두번째 조건문으로 Response 상태 코드가 200이여야 한다는 뜻임.

 

즉, 요약하자면 스캔 타겟의 주소를 Get 메소드로 요청 시 Response 상태 코드가 200이며 Response의 Server 해더가 apache으로 시작하면 결과 출력한다는 템플릿임.

복사했습니다!