
CVE-2019-0708 "BlueKeep" 취약점을 위한 빠른 스캐너.
이것은 Microsoft 원격 데스크톱의 CVE-2019-0708 취약점을 위한 빠르고 간단한 스캐너입니다. 현재 공용 인터넷에 약 90만 대의 시스템이 이 취약점에 노출되어 있어 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과 함께 사용하면 속도를 더 높일 수 있습니다.
세 가지 일반적인 응답이 있습니다:
대상이 안전하다고 생각하는 세 가지 주요 이유가 있습니다:
시스템이 취약점에 취약하다고 확인되었음을 의미합니다.
알 수 없는 변형은 매우 많습니다.
이 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 라이브러리를 설치하고 시스템의 다른 버전과 충돌하지 않도록 하는 것입니다. 테스트한 Linux 버전의 몇 가지 예는 다음과 같지만 배포판마다 패키지 이름이 계속 변경됩니다. 또한 BoringSSL 및 LibreSSL과 같은 OpenSSL 호환 API에 대한 많은 옵션이 있습니다.
$ sudo apt install libssl-dev
$ sudo yum install openssl-devel
이 문제를 해결한 후에는 다음과 같이 모든 .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
macOS에서 여러 버전의 OpenSSL이 있어서 이 문제가 발생합니다. 경로를 하드코딩하여 수정합니다:
$ 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에서 생성된 텍스트도 사용할 수 있습니다.
추가 공백은 제거되고, 빈 줄은 무시되며, 주석 줄도 무시됩니다. 주석은 # 문자 또는 // 문자로 시작하는 줄입니다.
출력은 VULNERABLE, SAFE 또는 UNKNOWN 상태를 나타내는 stdout으로 전송됩니다.
각각에 대한 추가 이유가 있을 수 있습니다. 이러한 이유는 위에 설명되어 있습니다.
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
이것을 grep 및 cut과 같은 추가 유닉스 명령으로 처리할 수 있습니다.
취약한 시스템만 목록으로 보려면:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
-dddd 매개변수는 진단 정보를 의미하며, 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" 결과가 훨씬 더 많이 나타납니다.
이 프로젝트에 릴리스로 첨부된 Windows 및 macOS 바이너리를 배포하기 위해 OpenSSL을 정적으로 링크하여 별도로 포함할 필요가 없고 프로그램이 바로 작동하도록 했습니다. 이 섹션에서는 이를 수행하는 방법에 대한 몇 가지 참고 사항을 설명합니다. 특히 OpenSSL 자체 페이지의 설명이 오래된 것 같습니다.
두 단계 모두 OpenSSL 소스를 다운로드하여 rdpscan 디렉토리 옆에 두는 것으로 시작합니다:
git clone https://github.com/openssl/openssl
Windows의 경우 먼저 일부 버전의 Perl을 설치해야 합니다. 저는 ActiveState의 Perl을 사용합니다.
다음으로 특별한 "어셈블러"가 필요합니다. 권장되는 NASM을 사용합니다.
다음으로 컴파일러가 필요합니다. 저는 VisualStudio 2010을 사용합니다. Microsoft에서 최신 "Visual Studio Community Edition"(2019)을 대신 다운로드할 수 있습니다.
이제 makefile을 빌드해야 합니다. OpenSSL 디렉토리로 이동하여 Perl 프로그램 Configure를 실행합니다:
perl Configure VC-WIN32
Windows의 경우 32비트를 선택했습니다. 이유는 오래된 Windows가 많고 프로그램을 가능한 한 이전 버전과 호환되도록 만들고 싶기 때문입니다.
C 런타임을 포함한 완전히 정적인 빌드를 원합니다. 이를 위해 결과 makefile을 편집기에서 열고 C 컴파일 플래그를 /MD(DLL 사용 의미)에서 /MT로 변경했습니다. 거기에 CPPFLAGS에 -D_WIN32_WINNT=0x501을 추가하여 OpenSSL을 Windows XP 및 Server 2003까지 작동하는 기능으로 제한했습니다. 그렇지 않으면 이전 시스템에서 실행할 때 bcrypt.dll을 찾을 수 없다는 오류가 발생합니다.
이제 모든 것이 경로에 있는지 확인해야 합니다. nasm.exe를 PATH 디렉토리에 복사했습니다. Visual Studio 2010의 경우 vcvars32.bat 프로그램을 실행하여 컴파일러 경로 변수를 설정했습니다.
명령줄에서 다음을 입력했습니다:
nmake
이렇게 하면 라이브러리가 만들어집니다. 정적 라이브러리는 libssl_static.lib 및 libcrypto_static.lib이며, 이를 사용하여 rdpscan에 링크합니다.
먼저 컴파일러를 설치해야 합니다. Apple의 Developer Tools를 사용하여 XCode와 컴파일러를 설치합니다. Homebrew를 사용하여 gcc를 대신 설치할 수 있다고 생각합니다.
그런 다음 OpenSSL 소스 디렉토리로 이동하여 makefile을 만듭니다:
perl Configure darwin64-x86_64-cc
이제 간단히 빌드합니다:
make depend
make
이 시점에서 동적(.dylib) 및 정적(.lib) 라이브러리가 모두 생성됩니다. 기본적으로 정적 라이브러리를 사용하도록 동적 라이브러리를 삭제했습니다.
이제 rdpscan에서 macOS makefile을 빌드합니다:
make -f Makefile.macos
이렇게 하면 모든 rdpscan 소스 파일이 컴파일된 다음 방금 빌드한 ../openssl 디렉토리의 OpenSSL 라이브러리에 링크됩니다.
약 3MB의 실행 파일이 생성됩니다. 대신 200KB 실행 파일만 생성되었다면 동적 라이브러리에 링크한 실수입니다.