보안 테스팅에선 HTTP Response를 자주 변경해야할 경우가 많습니다. 이럴 때 저는 보통 ZAP에선 breakpoint와 replace 기능, 그리고 스크립팅을 주로 사용했었습니다. (+Proxify의 DSL)
최근 일부 Proxy 도구나 웹 디버거에서 사용되는 Map Local 기능이 ZAP의 AddOn으로 추가됬고 새로운 선택지가 하나 더 생겼습니다. 오늘은 Map Local이 어떤 기능인지, breakpoint와 replace 대신에 어떻게 사용될 수 있을지 정리해봅니다.
Map Local
Map Local은 proxyman, mitmproxy 등에서 제공하는 기능으로 특정 조건에 매치된 Request의 Response를 지정한 file로 전달하는 기능입니다. ZAP의 Replacer, Burpsuite의 Match and Replace 기능과 유사하지만 문자열 등으로 처리하는 것이 아닌 파일을 핸들링하는 형태이기 때문에 큰 데이터를 처리하거나 테스트를 위한 Fake data(e.g JSON)를 만들어서 처리하기에 굉장히 유용합니다.
이제 ZAP에서도 Map Local 기능을 처리하는 AddOn이 추가되어 Replacer나 Scripting에 의존하지 않고 간단하게 자동 치환을 구성할 수 있습니다.
Map Local in ZAP
Installation
ZAP Marketplace에서 Map Local
을 설치합니다.
UI
Options 등에서 별도로 메뉴를 제공하고 있지는 않습니다. 아래 두 구간을 이용하여 해당 기능을 사용할 수 있습니다.
Test
Fake File
먼저 Fake file을 하나 준비합시다. 테스트를 위해 간단한 파일을 만들었습니다.
Add Map Local
원하는 요청에서 우클릭을 통해 Context Menu를 열어준 후 Map Local을 클릭하여 추가할 수 있습니다.
클릭 시 아래와 같은 다이얼로그가 발생하며 Match 할 패턴과 치환할 파일을 명시할 수 있습니다.
기본적으로 우클릭한 URL이 포함되도록 만들어집니다.
추가가 완료되면 아래와 같이 Bottom Tab에 만든 Map Local이 추가됩니다.
Trigger
이제 실제로 해당 페이지를 접근해보면 Fake file이 자동으로 Response에 로드되는 것을 볼 수 있습니다.
ZAP의 Req/Res에서도 치환된 형태로 나타납니다.
More Ideas
간단한 기능이면서 쉬운 설정으로 자동으로 Response를 처리할 수 있기 때문에 분석 시 많이 편리합니다. 특히 File을 읽어서 Fake Response를 만드는 형태는 일반적인 문자열 치환에 비해 이점이 많습니다. 그리고 이러한 장점들을 가지고 조금 더 생각해보니 재미있는 아이디어들이 나왔습니다.
Testing with Editor
Vscode 등 코드를 작성하는 에디터는 여러가지 Plugin과 기본적으로 제공되는 기능을 통해 빠르게 코드르 작성하고 테스트할 수 있습니다. 이를 이용하여 Map Local을 특정 파일로 만들어둔 후 Editor를 통해 수정하면서 테스트한다면 분명히 속도적인 이점을 가지게 됩니다. 덤으로 Vscode에서 Github Copilot 을 사용한다면 좀 더 재미있는 테스트 방식이 만들어질 수 있다고 생각합니다.
ZAP, Vscode 창 2개면 브라우징 없이 테스팅, 스크립팅, 프롬프트 등이 가능하죠 😀
Test to Uploaded File
File Upload를 필수로 수행하는 하는 기능에 대한 테스트 시 Map Local은 정말 편리합니다. 매번 직접 파일을 올려서 다음 액션으로의 테스트를 이어나가는 것이 아닌, 동일한 요청을 유지하고 명시한 파일을 계속 수정하면서 테스트하면 번거로운 작업들을 줄일 수 있습니다. 특히 PoC를 생성하는 CLI 도구와의 궁합이 좋습니다. (ffmpeg, exiftool 등)
Response Based Fuzzing
대부분의 Fuzzer는 Reqeust를 기반으로 하는 Fuzzer입니다. ZAP API, Map Local과 다른 CLI 도구 등을 이용한다면 Response에 대한 Fuzzing도 구현할 수 있습니다. 순서를 생각해보면 아래와 같습니다.
- Map Local을 통해
GET /test
Req를payload.txt
에 연결함 - CLI 도구에서 Payload 생성하여
payload.txt
에 삽입 - ZAP API를 통해
GET /test
를 전송하도록 요청 (headless) - HTTP Req가 전송되는 경우 Map Local로 인해 Payload를 Response에 나타냄
- 이후 처리되는 행위를 보고 이상 동작을 판별
종종 FE단의 반응을 보기 위해 Response를 변조하는 경우가 있는데, 이러한 과정을 간단한게 자동화할 수도 있을 것 같네요 😀