OOB Testing with interactsh!

OOB(Out-Of-Band)와 Callback 서버

SSRF, RCE 등에서 공격 페이로드의 성공 여부를 어떠한 방식으로 체크하시나요? 보통은 원격지의 서버를 두고 HTTP나 DNS 요청이 발생하는걸 감지해서 체크하곤 합니다. BurpSuite엔 이러한 작업을 위해 collaborator라는 아주 유용한 도구(사용자별로 별도의 도메인과 callback-notify를 제공)가 있고 이를 기반으로한 여러가지 확장기능(taborator, activescan, collaborator everywhere)이 있습니다.

다만 이는 BurpSuite Pro로 Enterprise에서만 제공되는 기능으로 ZAP 사용자나 BurpSuite CE 버전 사용자 입장에서는 정말 탐나지만 손대기 어려운 부분이긴합니다. 그래서 ZAP의 경오 자체 내장 기능인 callback 기능을 ssh 터널링을 통해 collaborator 처럼 사용하는 편법등을 통해 테스팅하곤 합니다.

아무리 편법을 쓴다해도 collaborator의 편의성을 따라갈 수 없는건 사실입니다 😭 그런데 최근에 projectdiscovery team에서 새로운 도구를 릴리즈했는데, OOB 관련 callback 도구이길래 반가운 마음에 빠르게 리뷰해봅니다.

interactsh?

interactsh는 projectdiscovery가 개발한 callback server로 HTTP, DNS 등 BurpSuite의 collaborator의 지원범위를 거의 동일하게 따라갑니다. tuktuk 등 다른 도구들도 있긴 하지만 조금 더 나은 점이 있다면 사용자가 self-hosted 해야하는 다른 오픈소스 도구와 다르게 collaborator 처럼 cloud 환경에서 미리 구성된 도메인을 가지고 바로 테스트할 수 있다는 점입니다.

https://github.com/projectdiscovery/interactsh

복잡한 도구는 아니라 설치부터 간단한 사용방법 정도 확인해봅시다.

Go!

Installation

당연히 go 기반의 도구이기 때문에 go get으로 설치해줍시다.

GO111MODULE=on go get -v github.com/projectdiscovery/interactsh/cmd/interactsh-client
interactsh-client -h
Usage of interactsh-client:
  -json
    	Show JSON output
  -n int
    	Number of interactable URLs to generate (default 1)
  -o string
    	File to write output to
  -persist
    	Enables persistent interactsh sessions
  -poll-interval int
    	Number of seconds between each poll request (default 5)
  -url string
    	URL of the interactsh server (default "https://interact.sh")
  -v	Show verbose output

Interface (CLI)

이 도구는 다른 projectdiscovery 도구들과 동일하게 stdout으로 결과를, stderr로 정보만 출력하는 형태를 가지고 있습니다. 그래서 pipeline에서 충분히 사용할 수 있는 도구이며, callback이 발생했을 떄 관련 정보들을 stdout으로 출력하게 됩니다.

그래서 이렇게 notify 등을 통해 slack으로 바로 전달되로고 구성할 수도 있죠

client를 실행하면 burpsuite의 collaborator와 동일하게 전용 도메인 하나를 할당해줍니다.

interactsh-client
[INF] Listing 1 URL for OOB Testing
[INF] c26ldkecie6nspfpfdq0cngipwoyyyyyn.interact.sh

실제 SSRF 테스팅이나 OOB등의 테스팅애서 사용하는 collaborator 도메인과 유사한 패턴의 도메인을 할당 받으며 이 도메인으로 HTTP, DNS 등 쿼리가 전달되게 되면 아래와 같이 로깅됩니다.

HTTP Request

http c26ldkecie6nspfpfdq0cngipwoyyyyyn.interact.sh
HTTP/1.1 200 OK
Content-Length: 72
Content-Type: text/html; charset=utf-8
Date: Sat, 01 May 2021 13:26:53 GMT
Server: interact.sh

<html><head></head><body>nyyyyyowpignc0qdfpfpsn6eicekdl62c</body></html>

Callback Response

[INF] Listing 1 URL for OOB Testing
[INF] c26ldkecie6nspfpfdq0cngipwoyyyyyn.interact.sh
[c26ldkecie6nspfpfdq0cngipwoyyyyyn] Recieved DNS interaction (A) from 121.167.11.4 at 2021-01-01 13:26
[c26ldkecie6nspfpfdq0cngipwoyyyyyn] Recieved DNS interaction (A) from 121.167.11.4 at 2021-01-01 13:26
[c26ldkecie6nspfpfdq0cngipwoyyyyyn] Recieved HTTP interaction from 211.221.85.198 at 2021-01-01 13:26

Interface (Web)

솔직히 CLI 있어도 정말 좋은데, 웹까지 구현해뒀네요… 아래 링크 접근 후 도메인 정보로 확인해보면 웹에서 callback을 확인할 수 있습니다.

https://interact.projectdiscovery.io/#/

와 그나저나 웹 진짜 잘만들었네요. 깔끔하다

Self-Hostsed Instance

기업 내 인프라 환경에서 사용하거나 projectdiscovery쪽으로 callback을 보내고 싶지 않을 때 직접 구성하여 사용할 수 있도록 server 환경도 제공하고 있습니다.

Client와 동일하게 go get으로 설치해주세요.

GO111MODULE=on go get -v github.com/projectdiscovery/interactsh/cmd/interactsh-server
interactsh-server -h
Usage of interactsh-server:
  -debug
    	Use interactsh in debug mode
  -domain string
    	Domain to use for interactsh server
  -eviction int
    	Number of days to persist interactions for (default 7)
  -hostmaster string
    	Hostmaster email to use for interactsh server
  -ip string
    	IP Address to use for interactsh server

public cloud 등에 interactsh-server를 구동하여 실제 callback 받을 서버를 구성하고 클라이언트 쪽에서 public cloud에 설치된 서버와 상호작용할 server instance를 구동한 후 클라이언트를 실행하여 projectdiscovery의 서버가 아닌 직접 설정한 public cloud를 바라보도록 구성할 수 있습니다. 자세한 내용은 아래 링크를 참고해주세요 :D

https://github.com/projectdiscovery/interactsh#setting-up-self-hosted-instance

Conclusion

개인적으로 BurpSuite의 pro 라이센스를 만료시킨지 벌써 2년이 되어가는데요, 이쯤에선 정말 필요한 도구가 아닐까 싶습니다. (여러가지로 편법을 써봤지만 솔직히 collaborator가 너무 좋긴 했어요. 어차피 회사 라이센스로는 사용하고 있으니 뭐…)

아무튼 self-hosted까지 잘 활용한다면 단순히 테스팅을 위한 callback 서버가 아니라 내부 인프라에 별도로 구축해서 SSRF, RCE, Blind XSS 등 OOB 기반의 대다수 취약점을 테스팅하고 탐지하는데 사용해도 무리가 없을 것 같습니다.

References