[취약점 진단] nuclei 도구 소개

1. 개요

다양한 대상의 취약점 진단을 수행할 때 분석가들은 자신만의 진단 루틴을 가진다. 웹을 대상으로 하는 경우 다양한 메뉴, 파라미터 입력 등의 값을 입력해 보면서 프록시에 어떤 데이터들이 전송되는지 살펴본 후 취약점이 발생할 것으로 예상되는 다양한 포인트에 공격 벡터를 변경해가면서 응답을 관찰한다. 모든 진단 대상에 해당하는 것은 아니지만 대상을 처음 탐색할 때, 구문 삽입 공격(injection)에는 자신만의 공격 벡터를 관리하고 어느정도 정형화된 패턴을 가지게 된다.

nuclei 동작방식 (공식 github 페이지)

nuclei는 보안 취약점 진단을 자동화하는 데 사용되는 강력한 오픈 소스 도구이다. 이 도구는 다양한 웹 및 서비스에 대해 취약점을 탐지하고 분석할 수 있다. nuclei는 사용자가 정의해둔 패턴 기반 검색 기능을 제공하여 일치 여부에 따라 여러 종류의 취약점을 감지할 수 있다. 취약점 진단을 수행함에 있어 필터링 우회 구문 테스팅, 공통으로 테스팅할 수 있는 항목 등을 템플릿으로 관리하고, nuclei를 통해 요청과 응답을 확인할 수 있어 분석에 드는 시간을 크게 단축시킬 수 있다.

 

2. 설치

2.1. 공식 홈페이지

깃헙 페이지( https://github.com/projectdiscovery/nuclei-templates )에서 제공하고 있다.

2.2 로컬 설치

1. golang 설치

apt-get install golang

2. git clone

git clone https://github.com/projectdiscovery/nuclei.git
cd nuclei/v2/cmd/nuclei/
go build
mv nuclei /usr/local/bin/
nuclei -version

 

2.3 도커

docker pull projectdiscovery/nuclei
docker run projectdiscovery/nuclei:latest -u <target_url>

 

3. 사용하기

3.1 공식 가이드

공식홈페이지(https://blog.projectdiscovery.io/ultimate-nuclei-guide/) 에서 제공하고 있다.

nuclei -h 실행을 통해 설명을 확인할 수 있다.

nuclei -h

명령의 가장 기본 형태는 다음을 따른다. 대상 URL에 대해서 커뮤니티에 등록된 모든 템플릿에 대해 스캔한다.

nuclei -u https://example.com

3.2 템플릿 사용

다른사람이 등록한 템플릿을 사용할 때에는 충분히 그 기능과 영향도를 파악한 후 사용하도록 한다. 커뮤니티 템플릿을 사용하는 경우 CVE, CWE에 등록된 페이로드를 그대로 테스팅하는 경우가 있으며, 커뮤니티에 등록된 임의의 템플릿을 실행했을 때 사이트에 어떤 가용성에 영향을 미칠지 모르는 것이기 때문에 검증된 템플릿만 사용하거나 템플릿 작성은 직접 하는 것을 권장한다.

nuclei의 사용 목적인 수동적이고 반복적인 진단 프로세스를 보강하여 보안 평가에 접근하는 방식을 크게 개선하기 위한 목적성에 부합하기 위해 기존 진단하여 발생한 취약 항목들을 템플릿으로 작성하면서, 탐지가 가능한지 여부를 먼저 파악하는 것이 좋다. 그 과정에서 YAML 언어에 익숙하지 않다면 새로운 연구가 필요할 것이다.

http 요청을 보내고 응답을 확인하는 템플릿은 다음의 예제를 참고할 수 있다.

id: git-config

info:
  name: Git Config File
  author: Ice3man
  severity: medium
  description: Searches for the pattern /.git/config on passed URLs.

http:
  - method: GET
    path:
      - "{{BaseURL}}/.git/config"
    matchers:
      - type: word
        words:
          - "[core]"

 

info: 태그에는 템플릿에 대한 정보를 입력한다. nuclei에서는 여기에 입력된 위험도(severity), 태그(tag)를 기준으로 실행할 템플릿을 필터링하거나 지정할 수 있다.

http: 태그를 사용하여 http 연결을 사용하도록 설정하고 메서드(method), 실행할 경로(path), 응답시 비교할 연산자(matchers) 등을 선언하여 요청을 보내고, 응답에서 "[core]" 값이 포함되어 있는지 여부를 확인하고 탐지하는 것이다.


또는 기본으로 제공하는 퍼징(fuzz) 기능을 사용하여 버프스위트에서 제공하는 인트루더(Intruder)를 구현할 수 있다. 사용하고 있는 단어목록(wordlist)이나 공격구문(payload) 목록이 있다면 파일로 지정하여 사용할 수 있다. 다음 예제를 살펴본다.

http:
  - raw:
      - |
        POST /?file={{path}} HTTP/1.1
        User-Agent: {{header}}
        Host: {{Hostname}}

    payloads:
      path: helpers/wordlists/prams.txt
      header: helpers/wordlists/header.txt
    attack: clusterbomb # Defining HTTP fuzz attack type

파일 업로드를 테스팅하는 템플릿에 경로와 헤더 값에 wordlist 파일을 지정하여 "clusterbomb" 퍼징 공격을 수행한다. "clusterbomb" 뿐만 아니라 "batteringram", "pitchfork" 방식의 인자 대입 방식도 제공한다.


다양한 인자 처리, 응답 패킷 확인 방법을 제공하고 있다. 다음은 XSS 공격을 탐지하는 규칙 중 하나를 더 소개한다.

http:
  - raw:
    - |+
        POST / HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 150
        Transfer-Encoding: chunked

        0

        GET /post?postId=5 HTTP/1.1
        User-Agent: a"/><script>alert(1)</script>
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 5

        x=1
    - |+
        GET /post?postId=5 HTTP/1.1
        Host: {{Hostname}}

    unsafe: true # Enables rawhttp client
    matchers:
      - type: dsl
        dsl:
          - 'contains(body, "<script>alert(1)</script>")'

3.3 사용예제

몇 가지 명령행 인자를 소개한다.

[로컬 실행]

nuclei -u https://example.com  -rl 100 -H "User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" -p http://[proxy address]
인자 설명
-rl  rate limit, 초당 전송되는 패킷의 양
-H 요청시 전송할 헤더(User-Agent, 세션값 등 지정 가능)
-p 프록시 주소
-o 실행 결과를 인자로 전달한 파일로 출력

[도커 실행]

docker run -v /home/user/_pentest:/tmp -it projectdiscovery/nuclei -list /tmp/urllist.txt -rl 100 -H "User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" -o /tmp/@@output.txt

 

4. 마치며

진단업무에 있어 자동화 도구의 사용은 항상 양날의 검처럼 주의하여 사용해야 한다. 분석 시간을 줄여주고 템플릿에 등록한 취약점 패턴을 탐지해준다는 장점이 있지만, 모든 자동화도구의 숙명처럼 오탐과 미탐의 가능성이 존재하기 때문에 요청 및 응답패킷을 프록시 도구를 통해 모니터링하여 검토하는 과정이 필요하다.

또한, nuclei는 다양한 도구와도 유기적으로 결합할 수 있기 때문에 확장성도 크다. 파라미터 퍼징 도구를 사용하여 템플릿 입력 값으로 넘겨줄 수도 있고, 서브도메인을 찾는 도구와 결합하여 다양한 서브도메인을 대상으로 한 스캐닝도 가능하다.

웹 페이지를 대상으로 하는 것이 아닌 로컬에 저장된 파일을 대상으로도 nuclei를 사용할 수 있다. 필자는 모바일 앱 진단 시 디컴파일한 폴더를 대상으로 지정하여 저장된 클라우드나 API 인증 키(credentials)가 평문으로 저장된 것이 있는 지 여부를 확인하는 데 사용한다.

반응형