
DNS 리바인딩 공격 도구로, 여러 개의 A 레코드를 악용하여 동일 출처 정책을 우회하고 브라우저 폴백 동작을 통해 내부 네트워크 서비스에서 데이터를 유출합니다.
rebindMultiA는 Multiple A Record 리바인딩 공격을 수행하는 도구입니다.
rebindmultia.com은 이러한 공격을 지원하기 위해 제가 설정한 도메인입니다. 이 도메인은 모든 IP를 [IP].ns.rebindmultia.com 도메인의 자체 권한 네임서버로 만듭니다. 예를 들어, 13.33.33.37.ns.rebindmultia.com의 권한 네임서버는 13.33.33.37.ip.rebindmultia.com이며, 이는 (짐작하셨겠지만) 13.33.33.37로 해석됩니다.
MultiA Record Rebind 공격은 DNS 리바인딩의 변형으로, 공격자가 DNS 요청에 대해 두 개의 IP 주소로 응답하고 첫 번째 IP가 응답하지 않을 때 브라우저가 DNS 응답의 두 번째 IP로 폴백(fallback)하는 경향을 악용합니다. 이 공격에서 공격자는 악의적인 DNS 서버와 두 개의 악의적인 HTTP 서버를 구성합니다. DNS 서버는 두 개의 A 레코드로 응답합니다:
127.0.0.1.target.13.33.33.37.ns.rebindmultia.com. 0 IN A 13.33.33.37
127.0.0.1.target.13.33.33.37.ns.rebindmultia.com. 0 IN A 127.0.0.1
피해자의 브라우저는 첫 번째 IP에 연결하여 공격자의 첫 번째 악의적인 HTTP 서버와 상호작용을 시작합니다. 이 서버는 /steal과 /rebind라는 두 개의 iframe이 포함된 페이지로 응답합니다. /steal iframe은 악의적인 페이지를 로드하여 두 번째 iframe에 접근하여 콘텐츠를 가져옵니다. /rebind 엔드포인트는 요청을 받으면 /로 302 리디렉션을 발행하고 첫 번째 악의적인 HTTP 서버를 종료(kill)합니다. 그 결과, 브라우저가 다시 공격자의 HTTP 서버에 연결하려고 할 때 닫힌 포트를 만나게 됩니다. 따라서 두 번째 IP로 폴백(fallback)합니다. 두 번째 iframe에 대상 콘텐츠가 로드되면 첫 번째 iframe이 해당 콘텐츠에 접근하여 데이터를 훔친 후 공격자의 두 번째 악의적인 HTTP 서버(콜백 서버)로 유출(exfiltrate)합니다.
이 공격은 Windows 환경에서만 작동합니다. Linux와 Mac은 사설 IP를 우선적으로 사용하며 공격자의 서버는 절대 쿼리되지 않습니다.

127.0.0.1.target.13.33.33.37.ns.rebindmultia.com을 해석합니다.server.py에 포함됨)가 요청된 DNS 이름을 파싱하고 두 개의 A 레코드(13.33.33.37 및 127.0.0.1)를 반환합니다.server.py에 포함됨)에 접속하여 두 개의 iframe이 포함된 /parent 페이지를 로드합니다./steal을 로드합니다./rebind를 로드하면 /로 302 리디렉션이 발생합니다(HTTP 서버는 이 요청 후 종료됩니다).302에 따라 /로 리디렉션됩니다./를 로드하려고 시도하지만 실패합니다.127.0.0.1로 해석합니다. 이후 해당 서버에 접속하여 iframe에 페이지를 로드합니다.pip3 install -r requirements.txt
python3 server.py --help
usage: server.py [-h] [-p PORT] [-c CALLBACK_PORT] [-d DNS_PORT] [-f FILE] [-l LOCATION]
선택적 인자:
-h, --help 이 도움말 메시지를 표시하고 종료합니다.
-p PORT, --port PORT 대상 IP에서 공격할 포트를 지정합니다. 기본값: 80
-c CALLBACK_PORT, --callback-port CALLBACK_PORT
콜백 HTTP 서버 포트를 지정합니다. 기본값: 31337
-d DNS_PORT, --dns-port DNS_PORT
DNS 서버 포트를 지정합니다. 기본값: 53
-f FILE, --file FILE 첫 번째 iframe("steal" iframe)에 표시할 HTML 파일을 지정합니다. 기본값: steal.html
-l LOCATION, --location LOCATION
대상에서 훔치려는 데이터의 위치를 지정합니다. 기본값: /
다음과 같은 오류가 발생하는 경우:
┬─[justin@RhynoDroplet:~/p/rebindMultiA]─[14:26:24]─[G:master=]
╰─>$ python3 server.py
Traceback (most recent call last):
File "server.py", line 2, in <module>
from http.server import HTTPServer, BaseHTTPRequestHandler, ThreadingHTTPServer
ImportError: cannot import name 'ThreadingHTTPServer'
더 최신 버전의 Python을 사용해야 합니다. Python 3.7+ 이상.
이것은 공개적으로 접근 가능한 IP에서 실행해야 합니다.
git clone https://github.com/Rhynorater/rebindMultiA
cd rebindMutliA
pip3 install -r requirements.txt
echo "피해자를 http://127.0.0.1.target.`curl -s http://ipinfo.io/ip`.ns.rebindmultia.com/parent 로 보내 127.0.0.1을 유출(exfil)하세요."
sudo python3 server.py
steal iframe이 새로 로드된 두 번째 iframe에 접근하여 콘텐츠를 가져옵니다.steal iframe이 결과를 다시 공격자의 콜백 서버로 전송합니다.