다양한 API 보안 도구와 WAF의 탐지 로직 및 우회 방법을 평가하기 위한 Golang 기반 오픈소스 프로젝트
GoTestWAF는 REST, GraphQL, gRPC, SOAP, XMLRPC 등 다양한 API 프로토콜을 지원하는 API 및 OWASP 공격 시뮬레이션 도구입니다.
이 도구는 API 보안 프록시, 웹 애플리케이션 방화벽(WAF), IPS, API 게이트웨이 등과 같은 웹 애플리케이션 보안 솔루션을 평가하기 위해 설계되었습니다.
GoTestWAF는 HTTP 요청의 다양한 부분(본문, 헤더, URL 파라미터 등)에 인코딩된 페이로드를 배치하여 악성 요청을 생성합니다. 생성된 요청은 GoTestWAF 실행 시 지정된 애플리케이션 보안 솔루션 URL로 전송됩니다. 보안 솔루션 평가 결과는 사용자 머신에 생성된 보고서 파일에 기록됩니다.
요청 생성의 기본 조건은 testcases 폴더의 다음 형식 YAML 파일에 정의되어 있습니다:```yaml
payload:
* `payload`는 악성 공격 샘플입니다 (예: ```<script>alert(111)</script>``` 와 같은 XSS 페이로드 또는 더 정교한 것).
페이로드에는 YAML 문자열 형식이 필요하므로, 페이로드는 [바이너리 데이터로 인코딩](https://yaml.org/type/binary.html)되어야 합니다.
* `encoder`는 페이로드를 HTTP 요청에 넣기 전에 적용할 인코더입니다. 가능한 인코더는 다음과 같습니다:
* Base64
* Base64Flat
* JSUnicode
* URL
* Plain (페이로드 문자열을 그대로 유지)
* XML Entity
* `placeholder`는 인코딩된 페이로드가 위치할 HTTP 요청 내의 장소입니다. 가능한 플레이스홀더는 다음과 같습니다:
* gRPC
* Header
* UserAgent
* RequestBody
* JSONRequest
* JSONBody
* HTMLForm
* HTMLMultipartForm
* SOAPBody
* XMLBody
* URLParam
* URLPath
* RawRequest
`RawRequest` 플레이스홀더를 사용하면 임의의 HTTP 요청을 수행할 수 있습니다. 페이로드는 URL 경로, 헤더 또는 본문에서 `{{payload}}` 문자열을 대체하여 치환됩니다. `RawRequest` 플레이스홀더의 필드는 다음과 같습니다:
* `method`
* `path`
* `headers`
* `body`
`RawRequest` 플레이스홀더의 필수 필드:
* `method` 필드
예시:
```yaml
payload:
- test
encoder:
- Plain
placeholder:
- RawRequest:
method: "POST"
path: "/"
headers:
Content-Type: "multipart/form-data; boundary=boundary"
body: |
--boundary
Content-disposition: form-data; name="field1"
Test
--boundary
Content-disposition: form-data; name="field2"
Content-Type: text/plain; charset=utf-7
Knock knock.
{{payload}}
--boundary--
type: RawRequest test
```
* `type`은 파일 내 페이로드 전체 그룹의 이름입니다. 임의로 지정할 수 있지만, 파일 내 공격 유형을 반영해야 합니다.
요청 생성은 페이로드 수에 인코더 및 플레이스홀더 수를 곱하는 3단계 프로세스입니다.
예를 들어 2개의 **페이로드**, 3개의 **인코더**(Base64, JSUnicode, URL), 1개의 **플레이스홀더**(URLParameter - HTTP GET 파라미터)를 정의했다고 가정해 보겠습니다.
이 경우 GoTestWAF는 테스트 케이스에서 2x3x1 = 6개의 요청을 전송합니다.
GoTestWAF 실행 중에는 내장된 두 가지 테스트 케이스(OWASP Top-10, OWASP-API) 중에서 선택하거나, [구성 옵션](#configuration-options) `testCasePath`를 사용하여 자신만의 테스트 케이스를 선택할 수 있습니다.
## 요구 사항
* GoTestwaf는 모든 주요 운영 체제(Linux, Windows, macOS)를 지원하며, 시스템에 [Go](https://golang.org/doc/install)가 설치되어 있으면 네이티브로 빌드할 수 있습니다. GoTestWaf를 네이티브로 실행하려면 PDF 보고서를 생성할 수 있도록 Chrome 웹 브라우저가 있는지 확인하세요. Chrome이 없는 경우 HTML 형식으로 보고서를 생성할 수 있습니다.
* GoTestWAF를 Docker 컨테이너로 실행하는 경우, [Docker가 설치 및 구성](https://docs.docker.com/get-docker/)되어 있고 GoTestWAF와 평가 대상 애플리케이션 보안 솔루션이 동일한 [Docker 네트워크](https://docs.docker.com/network/)에 연결되어 있는지 확인하세요.
* GoTestWAF가 성공적으로 시작되려면, GoTestWAF를 실행하는 머신의 IP 주소가 애플리케이션 보안 솔루션을 실행하는 머신에서 화이트리스트에 등록되어 있는지 확인하세요.
## Docker로 빠르게 시작하기
아래 단계는 Docker에서 최소 구성으로 GoTestWAF를 다운로드하고 시작하는 과정을 안내합니다.
1. Docker Hub에서 [GoTestWAF 이미지](https://hub.docker.com/r/wallarm/gotestwaf)를 가져옵니다:
```
docker pull wallarm/gotestwaf
```
2. GoTestWAF 이미지를 시작합니다:
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL>
```
필요한 경우 `${PWD}/reports`를 평가 보고서를 저장할 다른 폴더 경로로 바꿀 수 있습니다.
선택적으로 이메일로 보고서를 받지 않으려면, 이메일 요청 메시지가 나타난 후 Enter를 누르거나 --noEmailReport를 사용하여 메시지를 건너뛸 수 있습니다:
```sh
docker run --rm --network="host" -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --url=<EVALUATED_SECURITY_SOLUTION_URL> --noEmailReport
```
평가 대상 보안 도구가 외부에서 접근 가능한 경우 `--network="host"` 옵션을 생략할 수 있습니다. 이 옵션은 127.0.0.1에서 실행되는 Docker 컨테이너 간의 상호 작용을 가능하게 합니다.
gRPC 테스트를 수행하려면 작동하는 엔드포인트가 있어야 하며 --grpcPort <port> CLI 옵션을 사용해야 합니다.
```sh
docker run --rm --network="host" -it -v ${PWD}/reports:/app/reports \
wallarm/gotestwaf --grpcPort 9000 --url=http://my.grpc.endpoint
```
3. 이메일에서 보고서를 확인합니다.
최소 구성으로 GoTestWAF를 사용하여 애플리케이션 보안 솔루션을 성공적으로 평가했습니다.
고급 구성 옵션을 알아보려면 이 [링크](#configuration-options)를 사용하세요.
## 평가 결과 확인