안녕 Authz0, Authorization 테스트를 위한 새로운 도구 🚀

저는 Authorization 테스트 시 ZAP의 Zest Script를 즐겨서 사용합니다. 예전에는 Burpsuite에서 Authz라는 Extension을 자주 사용했었구요.

어쩄던 이 도구들은 ZAP과 Burpsuite에 내장되어 사용되기 때문에 HTTP Raw Request를 사용할 수 있다는 엄청난 강점이 있지만, 반대로 너무 디테일한 기능과 Raw Reqeust의 필수 사용으로 인해 반대로 심플한 작업에서는 약간 불편함이 생기기 마련입니다.

그래서 지난주 주말부터 Authorization 테스트를 위해 도구를 하나 만들었고, 일요일 낮에 릴리즈하여 살짝 공유드려볼까 합니다. 오늘 소개해드릴 도구는 바로 Authz0입니다.

What is Authz0

Authz0는 YAML 포맷 기반의 Template 파일을 중심으로 테스트할 URL과 Role을 구성하고, 이를 기반으로 스캔할 수 있는 도구입니다.

template 생성 및 수정 단계에서 URL이나 Role을 쉽게 추가할 수 있도록 여러가지 flag를 지원하고 있고, 스캔 시 기본적인 네트워크 관련 설정(proxy, delay, concurrency 등)들, 그리고 헤더나 쿠키를 통해서 Role에 해당 사는 사용자 인증 정보를 포함하여 스캔할 수 있습니다.

Installation

Go 기반 앱이기 때문에 go install 로 설치할 수 있고, 제 다른 도구들과 마찬가지로 homebrew와 snapcraft를 지원합니다.

Go

go install github.com/hahwul/authz0@latest

Homebrew

brew tap hahwul/authz0
brew install authz0

Snapcraft

snap install authz0

자세한 내용은 Installation Guide를 참고해주세요!

Usage

authz0는 크게 4가지 명령으로 구성됩니다.

  • $ authz0 new <FILENAME> : 새로운 템플릿을 생성합니다.
  • $ authz0 setRole <FILENAME> : 템플릿에 Role을 추가합니다.
  • $ authz0 setURL <FILENAME> : 템플릿에 URL을 추가합니다.
  • $ authz0 scan <FILENAME> : 템플릿 파일을 기반으로 스캐닝합니다.

Step by Step

아 신난다

First, Make template

먼저 template을 생성해야 합니다. template의 authz0 new 명령으로 자동 생성할 수 있고, 여기에 template의 포맷은 authz0 > structure > template 문서를 참고하시기 바랍니다.

Usage:
  authz0 new <filename> [flags]

Flags:
      --assert-fail-regex string       Set fail regex assert
      --assert-fail-size int           Set fail size assert (default -1)
      --assert-fail-status string      Set fail status assert
      --assert-success-status string   Set success status assert
  -h, --help                           help for new
      --include-roles string           Include Roles from the file
      --include-urls string            Include URLs from the file
  -n, --name string                    Template name

예시를 들어보면 아래와 같습니다. test-admin이란 이름의 admin.yaml 파일을 만듭니다. 이 때 urls.txt에서 다수의 url을 로드하고, response 본문에 permission denied 패턴의 데이터가 있으면 assertion fail로 처리하도록 지정합니다.

authz0 new admin.yaml -n test-admin \
--include-urls ./urls.txt \
--assert-fail-regex "permission denied"

Second, Modify template

위에서 template 생성 시 --include-urls 를 통해 여러 URL 로드했지만, 직접 페이지를 탐색하며 추가하고 싶을 수 있습니다. 또한 테스트할 role을 더 늘리고 싶을 수 있죠.

이 때 authz0 setUrlauthz0 setRole 명령을 통해 기존 template 데이터를 쉽게 추가할 수 있습니다.

Append Role to Template

Usage:
  authz0 setRole <filename> [flags]

Flags:
  -h, --help          help for setRole
  -n, --name string   Role name
authz0 setRole admin.yaml -n superadmin
authz0 setRole admin.yaml -n admin
authz0 setRole admin.yaml -n qa

Append URL to Template

Usage:
  authz0 setUrl <filename> [flags]

Flags:
  -a, --alias string        Alias
      --allowRole strings   Allow role names
  -d, --body string         Request Body data
      --denyRole strings    Deny role names
  -h, --help                help for setUrl
  -X, --method string       Request Method (default "GET")
  -t, --type string         Request Type [form, json] (default "form")
  -u, --url string          Request URL
authz0 setUrl admin.yaml -u https://127.0.0.1/admin

authz0 setUrl admin.yaml -u https://127.0.0.1/admin/api/getUser

authz0 setUrl admin.yaml -u https://127.0.0.1/admin/api/getAdmin \
--denyRole qa

authz0 setUrl admin.yaml -u https://127.0.0.1/admin/api/getSystemKey \
--allowRole superadmin --denyRole admin --denyRole qa

authz0 setUrl admin.yaml -u https://127.0.0.1/admin/api/updateKey \
-X POST -d "key=1234"

Finally, Scan with template

마지막으로 스캔입니다. 지정한 템플릿에 따라서 웹 요청을 발생하며 assertions(예상되는 요청이 성공/실패했는지) 체크, 그리고 각 URL 별로 매핑된 Role이 정상적으로 동작하는지 체크하게 됩니다.

Usage:
  authz0 scan <filename> [flags]

Flags:
      --concurrency int   Number of URLs to be test in parallel (default 1)
  -c, --cookie string     Cookie value of this test case
      --delay int         Second of Delay to HTTP Request
  -f, --format string     Result format (plain, json, markdown)
  -H, --header strings    Headers of this test case
  -h, --help              help for scan
      --no-report         Not print report (only log mode)
  -o, --output string     Save result to output file
      --proxy string      Proxy address
  -r, --rolename string   Role name of this test case
      --timeout int       Second of Timeout to HTTP Request (default 10)
authz0 scan admin.yaml -r qa -c "auth=37F0B6E4439233442A2C1F8EC5C76E64E3B42A"
authz0 scan admin.yaml -r admin -c "auth=DF0B66038B0A4C3525CBAEF5BF732ABCAFF9EF"
authz0 scan admin.yaml -r superadmin -H "X-Admin-Key: 120439124" -H "X-API-Key: 124124"

화면 기록 2022-01-17 오전 1 18 15 mov

Wiki

이외에도 포맷, 추가적인 기능들에 대한 정보는 별도 페이지에 Wiki로 구성했습니다. 참고해주세요 :D

How to Contribute

PR은 언제나 환영입니다 😍 별건 없지만 CONTRIBUTING.md 파일을 참고해주세요!

References

  • https://github.com/hahwul/authz0
  • https://github.com/hahwul/authz0/releases
  • https://authz0.hahwul.com