여러분들은 보안 테스팅하실 떄 어떤 도구들을 사용하시나요? 저는 ZAP을 메인으로 그리고 Burpsuite를 보조 스캐너로 사용합니다. 제가 2021년 마지막글(“나의 메인 Weapon 이야기“)에 Proxify에 대해 언급을 했었습니다. 오늘은 이 Proxify를 이용하여 제가 새로 구성하려는 분석 환경과 이유, 그리고 이를 통해 더 얻고자 하는 것들에 대해 이야기하려고 합니다.
Why
앞서 제가 분석 환경에 변화를 주려는 이유를 먼저 설명하겠습니다. 아주 오래전부터 분석에서 사용하는 데이터의 재 활용 필요성은 익히 알고 있었습니다. 그래서 여러가지로 고민을 해봤지만, 너무 크고 복잡한 그림만 나올 뿐 구축해서 잘 사용해볼 수 있는 형태의 그림은 없었죠.
그러다가 작년(2021)에 “복잡하게 고민하지 말고 단순하게
” 라는 생각이 커졌고 가장 쉬운 방법인 Request/Response를 그냥 무작정 수집하고 처음에는 이를 Grep하여 이슈를 찾는 방법, 그리고 나아가서 데이터를 잘 구조화하고 정리하여 또 다른 가치를 만드는 형태로 마음을 잡았습니다. 이건 뭐 딥러닝을 하던 단순히 통계로 보던 유의미한 결과가 생길 것 같긴해요.
Blueprint
사실 로깅은 ZAP, Burpsuite 모두 자체적으로 가능합니다.
- ZAP: Sessions으로 가능 (오히려 더 큰 범위의 백업)
- Burpsuite: 여러가지 확장 기능을 통해 가능
다만 제가 로깅을 별도로 분리하는 이유는 다른 CLI 도구에서 쉽게 데이터를 처리할 수 있다는 부분이 가장 컸습니다. 대표적으로 gf, gf-patterns, 각종 js 분석 도구들 등 많은 도구들이 cli를 기반을 지원하고, 당연히 파일 기반 처리에 능숙하기 때문이죠.
그리고 메인 도구에 부하를 더 주는건 좋지 않다고 생각했습니다.
Proxify
Proxify는 project-discovery에서 만든 도구로 ZAP, Burpsuite, Hetty 와 같이 Swiss Army knife Proxy를 목적으로 하는 도구입니다. CLI 기반이며 트래픽을 캡쳐하고, 변경하고, 재 전송하는 기본적인 기능만 제공하기 때문에 ZAP, Burp와 같이 단독으로 사용하기에는 모자란 부분이 많으나 제가 그린 blueprint에선 트래픽을 수집하고 이를 저장해줄 도구가 필요했기 때문에 적합하다고 판단했습니다.
기본적으로 req/res에 대해 파일로 저장하며, EXPORT 쪽 flag를 사용하면 ES나 Kafka와의 연동도 쉽게 가능합니다. 이외에도 None HTTP Protocol을 지원(e.g XMPP/SMTP/FT/SSH)하기 떄문에 ZAP이나 Burpsuite에서 부족한 부분을 조금 보강해줄 수도 있습니다. 개인적으로 Burpsuite의 NoPE Proxy 보다 좋은 것 같아요.
Basic
Proxify는 기본적으로 동작 시 프록시 요청받은 HTTP Reqeust/Response를 파일에 기록합니다.
이렇게 logs 하위에 request/response가 페어로 기록되며 파일을 열어 확인할 수 있습니다.
proxify 구동 시 -dump-req
, -dump-resp
를 통해 원하는 http 요청만 기록할 수도 있습니다.
e.g
proxify -dump-req
DNS
Proxify는 Proxy 서버임과 동시에 내장된 DNS 서버를 가지고 있습니다. 그래서 도메인 관련 일부 기능과 resolver를 선택할 수도 있습니다. 자주 사용될만한 부분인 dns mapping을 보면 -dm
또는 -dns-mapping
flag로 domain:ip
를 임의로 지정할 수 있습니다. 마치 /etc/hosts 설정과 유사합니다.
proxify -dm target.com:127.0.0.1
DSL
Proxify는 DSL을 지원합니다. 그래서 request/response에서 원하는 데이터만 로깅할 수도 있고 특정 문자열을 찾아 바꿔서 저장할 수도 있습니다. 아래는 request에서 PPP Admin
이란 문자가 포함된 Request, 그리고 Response에 mytoken의 md5 값이 포함된 경우에만 로깅합니다.
proxify \
-request-dsl "contains(request,'PPP Admin')" \
-response-dsl "contains(response, md5('mytoken'))" \
-http-addr "localhost:8080"
유사하게 -req-mrd
(-request-match-replace-dsl
), -res-mrd
(-response-match-replace-dsl
) 을 이용해서 원하는 문자를 다른 문자로 치환할 수 있는데, 이는 패스워드 등 남기고 싶지 않는 데이터를 치환해서 처리하기에 좋은 것 같습니다.
proxify -req-mrd "replace(reqeust,'mypassword','REDACTED')"
flag 전체는 아래를 참고해주세요.
FILTER:
-req-fd, -request-dsl string Request Filter DSL
-resp-fd, -response-dsl string Response Filter DSL
-req-mrd, -request-match-replace-dsl string Request Match-Replace DSL
-resp-mrd, -response-match-replace-dsl string Response Match-Replace DSL
Hook
ZAP과 Burpsuite의 각각 Proxy 설정에 보면 Upstream 관련 설정이 있습니다. 이를 통해서 ZAP -> Proxify로 넘겨주는 형태로 처리해주시면 됩니다. (제가 예전에 쓴 글인 “Burp와 ZAP 동시에 사용하기 🚀” 로 비슷한 내용이죠)
Outgoing(Upstream) 설정에서 Proxify의 IP와 Port로 세팅합니다.
ZAP
BurpSuite
Outgoing(Upstream) 설정을 마치고 ZAP이나 Burpsuite의 트래픽이 Proxify를 타고 나가게 됩니다.
File base testing
분석을 하면서 Proxify로 인해 로컬에 로그가 기록되고 있을겁니다. 여기에 ES나 Kafka를 연동했다면 잘 누적되고 있겠죠. 자 그러면 우리는 이제 쉽게 File 기반의 분석을 진행할 수 있습니다. 버그바운티에 관심이 있으시다면 아마 TomNomNom 이나 Project-discovery의 작업, 파이프라인 등이 익숙하실거에요.
혹시나 아닐 수 있으니 제가 아주 짧게 이야기드리면, 많은 사람들은 CLI 기반을 분석을 즐겨합니다. 그래서 다른 도구들을 통한 분석 방법보다 공유되고 있는 양 자체가 많습니다. 그리고 잘 활용하면 빠르게 원하는 항목을 분석하고, 이를 기반으로 취약점까지 뽑아낼 수가 있죠. 대표적으로 아래 2개의 Repo가 있어요. 한번 쓱 읽어보시면 아 어떤 형태로 많이 분석하는구나 알 수 있을겁니다.
- https://github.com/KingOfBugbounty/KingOfBugBountyTips
- https://github.com/dwisiswant0/awesome-oneliner-bugbounty
자 그러면 우리는 이제 우리가 수집한/테스팅한 Request/Response를 파일로 가지고 있습니다. 위에 Repo에 있는 여러가지 방법들을 그대로 사용할 수가 있겠죠. 또한 강력한 CLI 기반 도구들의 힘을 빌릴 수도 있구요.
이외에도 JSFScan, LinkFinder와 같은 도구, 또는 Raw HTTP Request 지원하는 스캐너 (sqlmap, dalfox 등)과 연동하여 사용할 수도 있겠죠 😎
Conclusion
이제 누적된 파일을 어떻게 처리하는지는 여러분의 몫입니다. 저는 위에서 이야기드렸던 파일 기반의 테스팅과 스크립팅을 통해 자동화를 점점 더 할 예정이고, 기회가 된다면 DSL을 통해서 특정 포맷의 데이터만 누적 후 ML으로 학습시킬까 합니다. 물론 뭐 이건 데이터가 엄청나게 쌓여야 쓸만한 아웃풋이 나오겠지만요.
활용할 방법은 정말 많으니 여러분도 한번 구성해보시고 필요한 내용은 습득해 가시길 바래요 :D