저는 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 setUrl
과 authz0 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"
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