ZAP

Introduction

ZAP(Zed Attack Proxy)은 Vulnerability Assessment, Penetration Testing, Runtime Testing, Code Review를 위한 보안 테스팅 도구이자 취약점 스캐너입니다. OWASP의 Flagship 프로젝트였으나, 2023년에 OWASP를 떠나게 되어 현재는 그냥 ZAP으로 불리고 있습니다. Burpsuite와 함께 보안 엔지니어, 버그바운티헌터 등의 주력 도구로 사용되고 있고, Cli command, REST API 그리고 Jenkins plugin, Github action 등을 제공하고 있어 DevSecOps 즉 CI/CD Pipeline 상에서의 DAST 스캐너로도 많이 사용되고 있습니다.

개인적으로 정말 좋아하는 프로젝트입니다. 다른건 몰라도 Fuzzer / Scripting은 비교할 수 있는 도구가 없습니다. 최고에요!

Installation

아래 URL에서 각 OS 맞는 Installer 패키지를 통해 설치하시면 됩니다.

혹시나 직접 빌드하시는 경우 아래 #Build 부분을 참고해주세요.

ZAP

Interface

GUI

ZAP을 열게되면 보이는 화면 구성으로 각 영역은 아래와 같은 이름을 가지고 있습니다.

명칭을 알아두면, 공식 문서를 보실 때 조금 더 편리합니다 :D

CLI

./zap.sh

REST API

ZAP의 Proxy를 웹에서 붙으면, REST API를 위한 페이지가 나타납니다. ZAP은 대부분의 기능에 대해서 API를 제공하고 있어서, 이를 잘 활용하면 자동화나 ZAP을 기반으로한 도구를 구축하는데 유용하게 사용할 수 있습니다.

http://localhost:8090

Menu bar > Tools > Browse API를 통해서도 열 수 있습니다.

Options에선 REST API에 대한 설정도 가능합니다.

Proxy

ZAP은 Burpsuite와 마찬가지로 Proxy를 기반으로 한 도구입니다. 그래서 Application과 서버 사이에서 요청을 가로채어 데이터를 확인하고 변조하여 보안 테스팅을 진행할 수 있습니다. 이러한 구조를 사용하는 방법의 예시들은 아래와 같습니다.

  Description
Pre-configured browser ZAP의 인증서 처리가 설정된 브라우저를 통해 테스트할 수 있습니다.
Firefox/Safari/Chrome 등 일반 브라우저에 Proxy를 설정하여 테스트할 수 있습니다.
Android/iOS/macOS 등 모바일 디바이스, PC앱도 Proxy를 설정하여 테스트할 수 있습니다.
Etc 이외 모든 환경에서 유사하게 테스트할 수 있습니다.

Context

Context는 타켓에 대한 Scope를 의미합니다. 단순히 Scope 대상의 URL 패턴만을 명시하는게 아니라 Metadata를 추가하여 여러 기능이나 스캔에서 이 데이터를 활용하여 테스트할 수 있습니다.

Properties Description
Include in Context Scope에 포함할 URL 패턴입니다.
Exclude in Context Scope에 제외할 URL 패턴입니다.
Structure 서비스에서 비표준적인 URL Key/Value 패턴등을 사용할 때 커스텀하게 명시할 수 있습니다.
Technology 서비스에서 사용할거라고 확신 또는 예상되는 기술을 체크합니다. 스캐닝 등에서 페이로드를 이에 맞게 사용할 수 있어서 조금 더 효율성을 높일 수 있습니다.
Authentication 인증 정보를 추가합니다. 자세한건 아래 이 글을 참고해주세요.
Users 위 Authentication을 기반으로 사용할 Credentials를 설정합니다.
Forced User 해당 Context에서 무조건 사용할 User 정보를 설정합니다.
Session Management Context에서 사용하는 세션의 형태를 설정합니다. (e.g Cookie-base, HTTP Auth)
Access Control AAA 테스팅을 위해 Context 내 페이지 X User 별 권한을 세팅합니다.
Custom Page Custon error (e.g 404) 등을 식별하기 위한 값을 설정합니다.
Alert Filters Context에서 표기하지 않을 Alerts을 설정합니다.

Import & Export

Context는 아래 이미지의 버튼 또는 우클릭을 통해 Import/Export 할 수 있습니다. 이를 통해 파일 기반으로 Scope와 Authentication 등의 정보를 한번에 저장하고 불러와 재 사용할 수 있습니다.

Spider

대상을 탐색하여 URL을 수집하는 기능입니다. Response와 알려진 패턴의 데이털 참고하여 Spidering을 진행하는 Spider, 그리고 Headless browser를 통해 직접 페이지를 로드하여 수집하는 Ajax Spider로 나뉘어져 있습니다.

Spider vs AjaxSpider

ZAP에서 Spider는 기본 Spider와 AjaxSpider로 나뉘어져 있습니다. 각각 특징과 사용되는 기술이 다르기 떄문에 가급적이면 자동화 Spidering의 경우 혼용하는 것을 추천드립니다.

  • Spider: 웹 페이지를 접근하고 Parse하며 Spidering (전체적인 성능에서 우위)
  • AjaxSpider: Headless browser를 이용해 Spidering (SPA 서비스에서 유리함)

With Authentication

Context 내 Authentication과 Users에 정보가 인증 방법, 사용자가 설정된 경우 이를 기반으로 인증 처리를 자동으로 진행하며 Spidering을 할 수 있습니다.

이에 대한 자세한 내용은 Authentication Spidering in ZAPZAP Script-base Authentication 글을 참고해주세요.

Scanner

정해진 스캔 룰에 따라 대상의 취약점과 보안 이슈, 정보성 데이터를 식별합니다. 별도의 요청을 발생하지 않고 Response를 기반으로 탐지하는 Passive Scan과 추가 요청을 발생하며 대상을 테스트하고 이슈를 식별하는 Active Scan으로 나뉘어져 있습니다.

ActiveScan

추가적인 Request를 발생시키는 Scan입니다.

  • Active scanner rules
  • Active scanner rules (alpha)
  • Active scanner rules (beta)
  • Script-based active rules
  • Advanced SQL Injection Scanner
  • DOM XSS Active scanner rule
  • Access Control Testing addond
  • Etc..

참고로 Options > Active Scan 설정 메뉴에선 스캐너의 Thread와 Concurrency 등 성능 관련 부분을, Options > Active Scan Input Vectors 에선 Cookie, Header 등 Active Scan이 어떤 부분까지 스캔할지 범위를 지정할 수 있습니다.

Input vectors

Active Scan 시 테스트할 Vectors를 지정할 수 있습니다. 기본 값은 Options > Active Scan Input Vectors 에 명시된 정보이며, 각 스캔마다 별도로 지정할 수 있습니다.

  Description
URL Query String & Data Driven Nodes URL Query 부분와 Context에서 DDN으로 명시된 부분을 스캔합니다.
Add URL Query Paramter? 일부 Param mining을 병행합니다.
POST Data PUT/DELETE 도 동일하게 동작합니다.
URL Path Path 부분에 임의로 주입하여 스캔합니다.
HTTP Headers Request에 존재하는 헤더에 대해 모두 테스트합니다.
All Requests 모든 Request에 사용된 헤더 리스트를 만들고 이를 기반으로 테스트합니다.
Cookie Data 쿠키 헤더 내 값들에 대해 테스트합니다.
Enable Script Input Vectors 스크립트에 정의된 부분을 테스트합니다. (e.g GraphQL, SAML 등)
Custom vectors

Active Scan 시 Input vectors에 명시된 형태에 따라 자동으로 파라미터 등을 식별하지만 사용자가 임의로 지정한 부분을 스캔할 수 있는 Custom vectors란 기능도 존재합니다. 이를 이용하면 HTTP Request나 WebSocket 등에서 원하는 부분에 대해서만 스캔할 수 있습니다.

PassiveScan

추가적인 Request를 발생시키지 않는 Scan입니다.

  • Passive scanner rules
  • Passive scanner rules (alpha)
  • Passive scanner rules (beta)
  • Script-based passive rules
  • Wappalyzer addon
  • Retire.js addon
  • Etc..

Scan Policy

ActiveScan에 사용되는 룰은 Scan Policy로 관리됩니다. 여러 Policy를 만들 수 있고 파일(.policy)로도 관리할 수 있기 때문에 잘 만들어서 상황에 맞게 사용할 수 있습니다.

Passive Scan Rules

PassiveScan에서 사용되는 룰은 Passive Scan Rules에서 관리됩니다. Scan Policy와 같이 관리 기능이 좋지는 못하지만, ZAP Config(XML 포맷)를 통해서 유사하게 파일로 관리할 수 있습니다.

Alerts

ZAP에서 Alert는 발견사항 항목들을 의미합니다. 각 항목별 의미는 아래 표를 참고해주세요.

  Description
URL Alert이 발생한 URL
Risk 리스크: High/Medium/Low/Informational/False Positive
Confidence 정확성: High/Medium/Low
Parameter Alert이 발생한 파라미터 이름
Attack 공격코드
Evidence 탐지된 부분 (패턴에 탐지된 내용)
CWE ID 매핑된 CWE ID
WASC ID 매핑된 WASC ID
Description Alert에 대한 설명
Other Info 추가정보 (관련 정보나 상세한 공격 관련 정보)
Solution 해결방법
Reference 참고링크
Alert Tags 매핑된 Alert Tags

전체 Alerts와 세부 항목은 아래 페이지에서 확인할 수 있습니다.

https://www.zaproxy.org/docs/alerts/

Alert Tags

Alert tags는 ZAP의 각 Alert 마다 할당된 태그 정보로 OWASP TOP10, WSTG 등 발견 항목이 어떤 특성을 가지는지 나타내줍니다.

예시로 적은 OWASP TOP10, WSTG 모두 전 항목과 매핑되어 있습니다. 항목에 대한 자세한 정보는 아래 링크를 참고해주세요.

https://www.zaproxy.org/alerttags/

Fuzzer

Fuzzer는 HTTP Request, WebSocket Message 등에 대해 원하는 구간에 원하는 페이로드, 그리고 Encoder를 통해 반복적인 테스팅을 진행할 수 있는 도구 입니다.

  • Fuzz Locations: Fuzzing할 위치, 복수 지정 가능
    • Payloads: 해당 Location에 삽입할 Payloads
    • Payload Processors: Payload에 대해 후 처리할 Processor
  • Options
    • Depth First: 깊이 우선
    • Breadth First: 너비 우선
    • Concurrent Scanning Threads per Scan: 동시성
    • Delay when Fuzzing: Req 당 딜레이
    • Follow Redirects: Redirect 처리 허용할지 설정
  • Message Processors: Fuzz message 대한 Processors
    • Request Content-Length Updater: CL 헤더 자동 업데이트 (Default)
    • Payload Reflection Detector: 페이로드가 Response에 포함되는지 체크 (Default)
    • Tag Creator: 패턴 매치/필터 시 Tag를 생성
    • Fuzzer HTTP Processor (Script): Script 기반의 Processor

Fuzz Locations

Fuzzing할 위치를 지정합니다. Request, Message 내부에서 여러 구간을 선택하여 지정할 수 있고, 지정한 Location은 각각 여러개의 Payload와 Processor를 가질 수 있습니다.

Payloads

Payload는 Location에 삽입할 Payload를 의미합니다. String, Integer, Numberzz(숫자 기반 자동 생성) 및 File 등을 사용할 수 있습니다. 하나의 Locations에 여러개의 Payload를 가질 수 있습니다.

Payload Processor

Payload Processor는 Payload의 후 처리를 위한 Processor입니다. 이를 통해 Payload의 인코딩/디코딩 등을 처리할 수 있으며 하나의 Payload에 여러개의 Processor를 가질 수 있습니다.

With Scripting

ZAP Script에는 HTTP Fuzzer Processor 란 타입이 있습니다. 해당 Type의 Script는 Fuzzing 시 별도로 로드하여 사용할 수 있습니다. 아래는 cache-busting을 fuzzer script로 구현한 예시입니다.

https://github.com/zaproxy/community-scripts/pull/270

작성에 대한 자세한 내용은 “ZAP의 fuzz-script를 이용해 Fuzzing 스킬 올리기” 글을 참고해주세요!

Forced Browser

Forced Browser는 dirsearch, dirbuster, feroxbuster와 같이 directory, file에 대해 wordlist 기반으로 반복 요청하여 URL Endpoint를 추가로 찾는 기능을 의미합니다. 외부 도구를 쓰는것과 달리 ZAP 내부에서 동작하기 떄문에 추가로 식별한 경로를 바로 테스팅하는데 굉장히 유용합니다.

Scripting engine

ZAP의 가장 강력한 기능인 Scripting입니다. ZAP은 추가 기능인 Addon 이외에도 Javascript, Ruby, Python, Groovy 등 많은 언어를 기반으로한 스크립팅을 지원하고 있고, Interface 또한 많이 제공하기 때문에 스크립팅으로 간단한 기능부터, 별도의 Window 등을 구성하여 좀 더 디테일한 테스트를 위한 기능도 만들 수 있습니다.

관련 글 몇개를 추가해둘테니 참고해주세요.

Zest

Zest는 Mozilla 보안팀에서 만든 JSON 기반의 스크립팅 언어입니다. 현재는 ZAP Core에서 관리되고 있고 HTTP Request/Response, Headless Browser 그리고 Test에 사용되는 Assertion 등을 이용해서 동작을 정의하고, 이를 순차적으로 실행하며 테스트할 수 있습니다. 자세한 내용은 Cullinan > Zest 을 참고해주세요.

My articles

ZAP은 제가 글을 자주 작성하는 주제이다 보니 별도 카테고리로 분류하여 관리합니다. 모든 글을 넣기에는 양이 많으니 아래 카테고리 링크를 확인해주세요!

https://www.hahwul.com/tag/zap/

Contribution

Projects and code review

ZAP은 ZAP Core와 zap-extensions 등 여러 repo로 구성되어 있고 각각 프로젝트에서 Fork 후 코드작성, PR 시 Maintainer의 코드 리뷰를 받고 Merge 될 수 있습니다. 코드 리뷰는 2명 이상 승인되어야 통과됩니다.

Build

Set Build Env

# Clone ZAP Core and Addons
# Why? Mandatory Addon
git clone https://github.com/zaproxy/zaproxy
git clone https://github.com/zaproxy/zap-extensions

# Copy Mandatory addon to ZAP Core
cd zap-extensions
./gradlew copyMandatoryAddOns

# Go ZAP Core Directory
cd ../zaproxy

Build ZAP Core

build 후 실행하기

./gradlew run       # build 후 바로 ZAP 시작
./gradlew :zap:run  # build 후 바로 ZAP 시작
./gradlew :zap:test # unit test 시작

build 후 패키지 파일로 내보내기

./gradlew :zap:distCrossplatform # .zip
./gradlew :zap:distMac           # .dmg
./gradlew :zap:distLinux         # .tar.gz
./gradlew :zap:distDebian        # .deb

Build ZAP Addon

Setup repository

git clone https://github.com/zaproxy/zap-extensions

Tasks check

./gradlew tasks

Build and deploy

./gradlew addOns:ascanrulesAlpha:copyZapAddOn
=> 빌드

./gradlew addOns:ascanrulesAlpha:deployZapAddOn
=> 빌드 후 zap home directory로 이동

./gradlew addOns:ascanrulesAlpha:installZapAddOn
=> 빌드 후 zap API를 통해 설치(포트는 8080으로 고정됨)

Build Weekly

Setup repository

git clone https://github.com/zaproxy/zaproxy
git clone https://github.com/zaproxy/zap-extensions 
git clone https://github.com/zaproxy/zap-core-help
git clone https://github.com/zaproxy/zap-hud

Change workspace

cd zaproxy

weekly addons 설치

./gradlew :zap:copyWeeklyAddOns

weekly 버전 zap.jar 생성

./gradlew :zap:distWeekly

이후

./zap/src/main/dist/zap.sh

References