interactsh를 이용한 OAST
interactsh의 경우 OAST(out-of-band application security testing)를 용이하게 해주는 도구로 공격 대상 서버에서 외부의 리소스에 접근하기 위해 발생하는 트래픽(HTTP, DNS)을 받아주는 서버 역할을 합니다.
interactsh를 이용해 SSRF, RCE와 같은 취약점을 이용한 공격이 성공했는지를 확인할 수 있습니다.
예를 들어 21년도에 발생한 log4shell 과 같은 취약점 검증에 활용할 수 있습니다.
비싸서 회사에서만 쓰고 있는 burp suite pro 버전의 collaborator와 같은 기능을 수행합니다.
우선 interactsh는 go기반이기 때문에 설치하고 사용하기 위해선 go를 설치해야 합니다.
아래 링크에서 go 설치 방법과 링크를 확인한 후 설치합니다.
Download and install - The Go Programming Language
Documentation Download and install Download and install Download and install Go quickly with the steps described here. For other content on installing, you might be interested in: Download Don't see your operating system here? Try one of the other download
go.dev
go 설치가 완료되면 아래 명령을 실행 시킵니다.
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-server@latest
명령을 실행하면 interactsh가 설치되고 사용자 디렉터리(~) 하위에 go/bin 디렉터리 내에 설치됩니다.
go 명령어와 설치한 프로그램을 영구적으로 환경변수에 등록하기 위해 .bashrc 파일 하위에 아래 내용을 추가합니다.
export PATH=$PATH:/usr/local/go/bin:/root/go/bin
이제 해당 계정에 재로그인 하면 환경변수에 등록되어 프로그램을 명령어처럼 실행 시킬 수 있습니다.
다음으로 이제 도메인을 구입하고 설정해야 하는데 저는 여러가지 시도를 하고 시행착오를 겪었습니다...
1. 집 컴퓨터 vm을 이용해 호스팅
2. cloud를 이용한 호스팅
저는 우선 집 컴퓨터를 이용해 호스팅을 하려고 했으나...
sk 브로드밴드의 경우 dns 53번 포트를 차단하고 있기 때문에 불가능했습니다.. (이것 때문에 3일을 날렸...)
interactsh는 dns 요청을 받을 수 없는 경우 정상적으로 이용이 불가능하고 의미도 없기 때문에 반드시 필요합니다.
따라서, kt로 통신사를 변경하거나 cloud를 이용하는 방법 밖에는 없어서 cloud를 사용했습니다.
우선 google domains 또는 AWS 에서 도메인을 구입합니다. (저는 둘다 구입해서 테스트 했으며, 모두 가능했습니다.)
도메인을 구입한 후엔 개별 네임 서버를 사용할 수 있어야 하기 때문에 글루 레코드를 설정해야 합니다.

도메인은 ns1.[example.com], ns2.[example.com], IP의 경우 interactsh가 구동되는 공인 IP를 입력합니다.
(example.com대신 구매한 도메인 입력)

글루 레코드 설정이 완료되면, 맞춤 네임서버에 글루 레코드에 등록한 도메인을 입력합니다.

AWS도 마찬가지로 글루 레코드를 설정하고 ns 레코드를 수정하면 google domains와 같이 사용할 수 있습니다.
이제 interactsh를 아래의 명령어를 통해 실행시킬 수 있습니다.
interactsh-server -domain [example.com] -token [token] -listen-ip 0.0.0.0 -ip [서버 IP]
token의 경우 직접 생성하여 사용해도 되고 없어도 구동은 가능하지만 token이 없을 경우 타 사용자가 나의 서버를 사용할 수 있습니다.
실행 도중 만약 dns 관련 오류가 난다면 다른 프로세스가 dns포트 53번을 점유하고 있어 발생하는 오류일 확률이 높습니다.
저 같은 경우 systemd-resolved 가 점유하고 있어서 해당 프로세스를 중지시켰으나, 그렇게 하면 dns를 이용해 외부 도메인을 질의하는데 문제가 생겨 interactsh가 https 인증서를 받아오는 과정에서 실패했습니다.
따라서, 해당 문제가 발생했을 경우 53번 포트에 자유를 찾아주고 systemd-resolved는 살리는 작업이 필요합니다.
우선 netstat과 lsof 명령을 통해 53번 포트를 점유하는 프로세스를 찾아줍니다.


systemd-resolve가 범인인게 확정되면 아래와 같이 파일을 수정해 줍니다.
vi /etc/systemd/resolved.conf

/etc/resolve.conf 파일의 심볼링 링크를 수정해 줍니다.
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

이후 systemctl restart systemd-resolved 명령을 실행 시켜 systemd-resolved를 재시작 시키면 적용됩니다.
정상적으로 interactsh-server가 구동되면 아래와 같이 출력됩니다.
(최초 실행 시에는 SSL 인증서를 발급받는 과정으로 인해 추가적인 메시지가 출력될 수 있습니다.)

클라이언트를 이용해 테스트를 진행하기 위해 interactsh-client를 설치합니다.
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
아래 명령어를 이용해 client를 실행 시킬 수 있습니다.
interactsh-client -server [example.com] -token [token]
명령어를 실행시키면 빨간색 네모박스로 표시한 부분에 도메인이 출력되는데 해당 도메인이 client에서 확인할 수 있는 고유 도메인이며 형태는 [unique id].example.com 입니다. 해당 도메인을 이용해 다음과 같이 활용할 수 있습니다.
timmyroom.[unique id].example.com 로 전송을 보내면 해당 로그에서 timmyroom 문자열을 확인할 수 있습니다.
