OOB 진단 도구, Interactsh (feat. self-hosted server)
OAST
Out-of-band Application Security Testing의 약자로, Out-Of-Band를 이용해 취약점 테스팅을 진행하는 것을 의미한다.
Out-of-Band(이하 OOB)란 Victim 서버에서 Outbound 방향으로 향하는 TCP/UDP/ICMP request를 생성하는 공격 기법 중 하나이다. 이러한 Request를 통해 Victim의 데이터를 유출하는 등의 공격을 진행할 수 있다.
보통 Blind 계열 공격이나 SSRF, RCE와 같은 취약점을 검증하기 위해 사용하는 방법들이 각각 어느정도 존재한다.
이러한 Blind 계열의 테스팅에서는 주로 HTTP 요청이 발생하는 Payload를 작성하는 편이였다.
하지만, HTTP의 Outbound가 차단된 내부 환경인 경우, 이러한 HTTP 요청을 발생시키는 Payload는 동작하지 않는다.
이러한 환경에서 Exploit을 테스트하기 위해 Out-of-Band를 이용하게 되는 것이다.
Burp Suite의 Collaborator는 대표적인 OOB 테스팅을 지원하는 툴이다. 하지만 Collaborator는 Burp Professional에서만 지원해주기 때문에 Pro 라이센스가 없는 사람들로써는 이를 사용할 수가 없었다.
그래서 OAST를 위해 여러 툴들이 개발되는데, 대표적으로 OWASP ZAP의 OAST와 오늘 소개할 Interactsh가 있다.
Interactsh
projectdiscovery가 개발한 오픈소스 타입 callback 서버, OOB 상호작용을 탐지하기 위한 툴로 소개되고 있다.
기본적으로 DNS/HTTP(S)/SMTP(S)/LDAP interaction에 초점을 맞춰 제작되었다.
Interactsh는 Client와 Server, 2가지 형태를 지원한다. Client는 Interachsh 서버로 OOB payload를 전송한다. 이때 request를 전송하는 서버는 기본값으로 projectdiscovery가 지원하는 공식 Interachsh 서버 중 하나로 지정된다.
아래는 공식적으로 지원하는 Default Interachsh Server 목록이다.
- oast.pro
- oast.live
- oast.site
- oast.online
- oast.fun
- oast.me
기본적으로 Interactsh-client를 구동하면, 위의 Default Server 중 하나의 도메인에 대해 서브도메인 주소(이하 Callback주소)가 발급된다.
이 발급받은 Callback 주소로 OOB testing(DNS Query 등)을 진행하면, 이 client 화면에 해당 Callback 주소가 호출된 내역이 나타나는 방식이다.
Self-hosted Server
projectdiscovery에서 공식적으로 제공하는 사이트를 이용하는 방법외에도 본인이 가진 도메인을 이용해 interactsh를 이용할 수 있다.
내부적으로 테스트를 하는 경우 등에서 Self-hosted Server를 이용해 테스트 내용이 외부로 노출되지 않도록 설정할 수 있다.
Self-hosted Interactsh Server
공식 Repo에서 제공해주는 Self-hosted Server 구축 가이드를 따라서 직접 Interactsh Server를 구축하고 취약점 테스팅을 해보도록 한다.
서버 구축에는 2가지 선행조건이 요구된다.
- 도메인 (레코드와 네임서버 변경이 가능해야함)
- DNS Query를 전달받을 Interactsh 서버
먼저 Interactsh 서버부터 구축해보도록 한다.
Interactsh 서버 설치
Go 1.20 이상의 버전이 필요하다.
wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$(go env GOPATH)
export PATH=$PATH:$GOPATH/bin
Go를 설치한 후, go install로 interactsh 서버를 설치해준다.
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-server@latest
interactsh 서버가 설치되면 아래 커맨드로 서버를 구동시킬 수 있다.
interactsh-server -domain [도메인] -ip [Interactsh 서버의 Public IP]
그리고 해당 서버로 DNS 쿼리와 같은 트래픽이 유입되기 위해 방화벽 포트 설정을 해주어야한다.
Interactsh는 DNS/HTTP(S)/LDAP/SMTP(S)와 같은 프로토콜의 Interaction을 지원한다. 이 모든 포트를 굳이 열 필요는 없고 DNS와 HTTP(S) 정도만 필수로 열어 주도록 한다.
서버의 구동에 도메인이 필요하다. 다음으로 interactsh 서버에 사용할 도메인 설정을 진행한다.
도메인 설정
타겟에서 DNS Query를 Self-hosted Server를 대상으로 전송하는 구조이기 때문에 도메인이 하나 필요하다.
다만, 일반적으로 호스팅 업체를 통해서 도메인을 구매한 경우 네임서버 레코드 값은 기본적으로 호스팅 업체의 네임서버로 잡혀있다.
우리의 경우 전송된 DNS Query를 파악해야하므로 이 도메인에 대한 네임서버를 직접 설정해주어야한다.
그리고 네임서버의 도메인이 해당 도메인의 하위 도메인에 해당되는 경우, 해당 네임서버의 도메인 이름이 어떤 IP주소에 매핑되는지 스스로 알고 있어야 한다.
말이 조금 복잡한데, 'example.net'이라는 도메인의 네임서버 도메인 이름이 'ns.example.net'인 경우에 example.net에 대한 DNS 질의가 발생하면 example.net의 네임서버의 IP주소를 찾아내기 위해 다시 example.net에 질의하게 되어 무한루프에 빠지게 된다.
이러한 무한루프에 빠지는 것을 막기 위해 아래와 같이 네임서버의 A타입 레코드를 추가로 설정해준다.
example.net | NS | ns.example.net |
ns.example.net | A | 1.2.3.4 |
이러한 설정을 글루 레코드(Glue Record)라고 하며, 이를 통해 서브도메인으로 구성된 네임서버에 질의할 수 있게 된다.
도메인 하나를 Route53을 통해 구매한 뒤, 앞서 구축한 Interactsh 서버에 대해 글루 레코드를 적용시킨다.
먼저, 호스팅 영역에서 A레코드 값으로 Interactsh 서버의 IP주소 값으로 하나 등록한다.
다음으로 NS 레코드 값을 다음과 같이 ns1, ns2 형식으로 수정해준다.
호스팅 영역의 NS 레코드 값 변경에 이어 실제 이 도메인의 네임서버를 변경해주어야 한다.
등록된 도메인 > 이름서버 편집에서 NS 레코드에 적어주었던 2개의 서브도메인을 입력해준다. 서브도메인을 입력하면 하단에 글루 레코드 입력박스가 나타난다.
이 글루 레코드 입력박스에 Interactsh 서버의 IP주소를 입력해준다.
이렇게 네임서버까지 변경 후, 변경 내용이 완전히 전파될 때까지 시간이 필요하다.
이후 변경 내용이 완전히 전파되면 외부에서 이 네임서버로 쿼리할 수 있게 된다.
설정된 도메인을 대상으로 Interactsh 서버를 실행시키면 다음과 같이 서버의 여러 포트별로 Listening을 시작하는 것을 확인할 수 있다.
OOB Testing with Self-hosted Server
구축된 Interactsh 서버와 연결된 도메인을 가지고 동작이 되는지 테스트해보도록 한다.
먼저, Interactsh-client를 앞서 만들었던 Interactsh 서버 도메인주소로 지정하여 실행한다.
interactsh-client -server [Interactsh 서버 도메인]
제작한 Interactsh 서버의 서브도메인 형식의 Callback 주소가 발급되었다.
이제 OOB 테스팅 서버에서 이 Callback 주소로 HTTP 호출해보도록 한다.
이후 Interactsh 서버쪽으로 DNS Query와 HTTP Response가 기록되는 것을 확인할 수 있다.
이외에도 Server를 구동시킬때 token 옵션을 추가해 Interactsh 서버에 대한 접근을 제한시킬수 있는 기능도 존재한다.
이 token값을 Client가 Server로부터 Callback주소를 받아올때에 넘겨주어 인증을 하는 방식인 것이다.
interactsh-server -domain [Interactsh 서버의 Domain] -ip [Interactsh 서버의 Public IP] -token [인증용 토큰]
interactsh-client -server [Interactsh 서버 도메인] -token [server 구동시 입력한 token값]
이렇게 Self-hosted Server를 구축하고 Interactsh-client를 통해 Callback주소를 발급받아 OOB testing을 진행할 수 있었다. 공식 Repo에 훨씬 다양한 옵션들을 사용하는 예제가 존재하니 응용해서 사용할 수 있을 것 같다.