
CVE-2019-0708 "BlueKeep" 취약점을 위한 빠른 스캐너.
이것은 Microsoft Remote Desktop의 CVE-2019-0708 취약점을 위한 빠르고 간편한 스캐너입니다. 현재 공용 인터넷에 약 900,000대의 머신이 이 취약점에 노출되어 있어, WannaCry 및 notPetya와 같은 웜이 곧 등장할 것으로 예상됩니다. 따라서 네트워크를 스캔하고 취약한 시스템에 패치를 적용하거나 적어도 NLA를 활성화하십시오.
이것은 명령줄 도구입니다. 소스 코드를 다운로드하여 직접 컴파일하거나 위 링크에서 Windows 또는 macOS용으로 미리 컴파일된 바이너리를 다운로드할 수 있습니다.
이 도구는 전적으로 https://github.com/zerosum0x0/CVE-2019-0708의 rdesktop 패치를 기반으로 합니다. macOS와 Windows에서 쉽게 컴파일할 수 있도록 코드를 간소화하고 여러 대상을 스캔하는 기능을 추가했습니다.
이것은 며칠 되지 않은 실험적인 도구입니다. 하지만 전체 인터넷을 스캔하여 테스트 중이며(masscan을 활용), 많은 문제를 빠르게 해결해 나가고 있습니다. 도움말이나 의견은 트위터(@erratarob)로 연락 주세요.
네트워크를 스캔하려면 다음과 같이 실행합니다:
rdpscan 192.168.1.1-192.168.1.255
각 주소에 대해 다음 세 가지 결과 중 하나가 생성됩니다:
대상 IP 주소에 아무것도 없는 경우, 이전 버전에서는 "UNKNOWN - connection timed out" 메시지를 출력했습니다. 대규모 네트워크를 스캔할 때 이는 관심 없는 시스템에 대한 과도한 정보를 생성합니다. 따라서 새 버전은 기본적으로 이 정보를 출력하지 않으며, 명령줄에 -v(verbose)를 추가해야 출력됩니다.
워커 수를 늘려 대규모 네트워크 스캔 속도를 높일 수 있습니다:
rdpscan --workers 10000 10.0.0.0/8
하지만 제 컴퓨터에서는 이 매개변수를 아무리 높게 설정해도 시스템 제한으로 인해 약 1500개의 워커만 생성됩니다.
아래 두 번째 섹션에 설명된 대로 masscan과 함께 사용하면 속도를 더 높일 수 있습니다.
세 가지 일반적인 응답이 있습니다:
세 가지 주요 응답은 SAFE, VULNERABLE, UNKNOWN이지만, 각각 진단을 설명하는 추가 텍스트를 포함합니다. 이 섹션에서는 볼 수 있는 다양한 문자열을 설명합니다.
대상이 안전하다고 판단하는 세 가지 주요 이유가 있습니다:
시스템이 버그에 취약하다는 것을 확인했음을 의미합니다.
UNKNOWN에는 수많은 변형이 있습니다.
이 rdpscan 도구는 상당히 느려서 초당 수백 개의 대상만 스캔합니다. 대신 masscan을 사용하여 속도를 높일 수 있습니다. masscan 도구는 약 1000배 빠르지만 대상에 대한 제한된 정보만 제공합니다.
단계는 다음과 같습니다:
masscan의 출력을 rdpscan에 전달하여 활성 상태로 확인된 대상만 스캔합니다.간단한 실행 방법은 명령줄에서 결합하는 것입니다:
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
제가 사용하는 방법은 두 단계로 나누는 것입니다:
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
어려운 부분은 OpenSSL 라이브러리를 설치하고 시스템의 다른 버전과 충돌하지 않도록 하는 것입니다. Debian Linux에서는 다음과 같이 합니다:
$ sudo apt install libssl-dev
이 문제를 해결한 후에는 모든 .c 파일을 다음과 같이 함께 컴파일합니다:
$ gcc *.c -lssl -lcrypto -o rdpscan
디렉터리에 Makefile을 포함시켜 두었으므로 다음과 같이 간단히 실행할 수 있습니다:
$ make
코드는 C로 작성되었으므로 C 컴파일러가 설치되어 있어야 합니다. 예를 들어 다음과 같이 설치할 수 있습니다:
$ sudo apt install build-essential
이 섹션에서는 더 명백한 빌드 오류를 설명합니다.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
이는 OpenSSL 헤더가 설치되지 않았거나 경로에 없음을 의미합니다. OpenSSL 바이너리가 설치되어 있어도 개발용 파일이 설치되지 않았을 수 있습니다. 헤더와 라이브러리 모두 설치되어 있어야 합니다.
Debian에서 설치하려면:
$ sudo apt install libssl-dev
경로 문제를 해결하려면 컴파일 플래그 -I/usr/local/include 등을 추가합니다.
링커 문제의 예:
Undefined symbols for architecture x86_64:
"_OPENSSL_init_ssl", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_RSA_get0_key", referenced from:
_rdssl_rkey_get_exp_mod in ssl-d5fdf5.o
"_SSL_CTX_set_options", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_X509_get_X509_PUBKEY", referenced from:
_rdssl_cert_to_rkey in ssl-d5fdf5.o
여러 버전의 OpenSSL이 있기 때문에 macOS에서 이 문제가 발생합니다. 경로를 하드코딩하여 해결합니다:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
다른 사람들의 의견에 따르면 Homebrew로 설치한 경우 macOS에서 다음 명령줄이 작동할 수 있습니다. 하지만 여전히 위의 링크 오류가 발생하는데, 이는 충돌하는 다른 OpenSSL 구성 요소를 설치했기 때문입니다.
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
위 섹션에서는 프로그램 실행에 대한 빠른 시작 팁을 제공했습니다. 이 섹션에서는 더 자세한 도움말을 제공합니다.
단일 대상을 스캔하려면 대상의 주소를 전달합니다:
./rdpscan 192.168.10.101
IPv6 주소와 DNS 이름을 전달할 수 있습니다. 여러 대상을 전달할 수도 있습니다. 예:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
시작-끝 IPv4 주소 또는 IPv4 CIDR 표기법을 사용하여 주소 범위를 스캔할 수도 있습니다. IPv6 범위는 너무 커서 지원되지 않습니다.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
기본적으로 한 번에 100개의 대상만 스캔합니다. --workers 매개변수로 이 숫자를 늘릴 수 있습니다. 하지만 이 매개변수를 아무리 높게 설정해도 실제로 시스템에 따라 한 번에 약 500~1500개의 워커가 최대입니다.
./rdpscan --workers 1000 10.0.0.0/24
명령줄에 대상을 지정하는 대신 --file 매개변수를 사용하여 파일에서 로드할 수 있습니다:
./rdpscan --file ips.txt
파일 형식은 한 줄에 하나의 주소, 이름 또는 범위입니다. 또한 masscan에서 생성된 텍스트를 사용할 수 있습니다. 추가 공백은 제거되고, 빈 줄은 무시되며, 주석 줄은 무시됩니다. 주석은 # 문자 또는 // 문자로 시작하는 줄입니다.
출력은 stdout으로 전송되며 VULNERABLE, SAFE 또는 UNKNOWN 상태를 표시합니다. 각각에 대한 추가 이유가 있을 수 있습니다. 이러한 이유는 위에서 설명되었습니다.
211.101.37.250 - SAFE - CredSSP/NLA required
185.11.124.79 - SAFE - not RDP - SSH response seen
125.121.137.42 - UNKNOWN - no connection - refused (RST)
40.117.191.215 - SAFE - CredSSP/NLA required
121.204.186.182 - SAFE - CredSSP/NLA required
99.8.11.148 - SAFE - CredSSP/NLA required
121.204.186.114 - SAFE - CredSSP/NLA required
49.50.145.236 - SAFE - CredSSP/NLA required
106.12.74.155 - VULNERABLE - got appid
222.84.253.26 - SAFE - CredSSP/NLA required
144.35.133.109 - UNKNOWN - RDP protocol error - receive timeout
199.212.226.196 - UNKNOWN - RDP protocol error - receive timeout
183.134.58.152 - UNKNOWN - no connection - refused (RST)
83.162.246.149 - VULNERABLE - got appid
추가 unix 명령어(grep, cut)로 처리할 수 있습니다. 취약한 시스템만 목록으로 보려면:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
-dddd 매개변수는 진단(diagnostic) 정보를 의미하며, d를 많이 추가할수록 더 많은 세부 정보가 출력됩니다. 이 정보는 stdout 대신 stderr로 전송되므로 스트림을 분리할 수 있습니다. bash에서는 다음과 같이 수행합니다:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
-d 매개변수를 추가하면 연결에 대한 진단 정보가 stderr에 출력됩니다.
./rdpscan 62.15.34.157 -d
[+] [62.15.34.157]:3389 - connecting...
[+] [62.15.34.157]:3389 - connected from [10.1.10.133]:49211
[+] [62.15.34.157]:3389 - SSL connection
[+] [62.15.34.157]:3389 - version = v4.8
[+] [62.15.34.157]:3389 - Sending MS_T120 check packet
[-] [62.15.34.157]:3389 - Max sends reached, waiting...
62.15.34.157 - SAFE - Target appears patched
macOS/Linux에서는 일반적인 방식으로 stdout과 stderr를 별도의 파일로 리디렉션할 수 있습니다:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
SOCKS5 지원이 포함되어 있습니다:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
연결 문제를 악화시켜 훨씬 더 많은 "UNKNOWN" 결과를 얻을 수 있습니다.