
Co znajdziesz w tym artykule?
- 1 TL;DR
- 2 Krótka definicja techniczna
- 3 Gdzie występuje / przykłady platform
- 4 Szczegółowy opis techniki (jak działa, cele, dlaczego jest skuteczna)
- 5 Artefakty i logi (tabela)
- 6 Detekcja (praktyczne reguły)
- 7 Heurystyki / korelacje (co łączyć)
- 8 False positives / tuning
- 9 Playbook reagowania (IR)
- 10 Przykłady z kampanii / case studies
- 11 Lab (bezpieczne testy)
- 12 Mapowania (Mitigations, powiązane techniki)
- 13 Źródła / dalsza literatura
- 14 Checklisty dla SOC / CISO
TL;DR
BlueKeep (CVE‑2019‑0708) to przed‑autentykacyjna podatność RCE w usłudze Remote Desktop Services/TermService (RDP) w starszych Windows (XP, Vista, 7; Server 2003/2008/2008 R2). Umożliwia zdalne wykonanie kodu bez interakcji użytkownika i ma potencjał „wormowalny”. NLA redukuje ryzyko automatycznej propagacji, ale nie eliminuje RCE jeśli atakujący ma ważne poświadczenia — łatka jest obowiązkowa (np. KB4499164/KB4499175, KB4499180, KB4500331). CVSS v3.1: 9.8 (Critical).
Krótka definicja techniczna
CVE‑2019‑0708 to błąd w implementacji RDP w komponencie jądra (m.in. termdd.sys/RDS), który pozwala niezalogowanemu napastnikowi na wysłanie specjalnie przygotowanych PDU w fazie zestawiania kanałów RDP i osiągnięcie zdalnego wykonania kodu w kontekście systemowym. W praktyce umożliwia to wejście (Initial Access) lub ruch boczny (Lateral Movement) przez RDP.
Gdzie występuje / przykłady platform
- Windows XP SP3 (x86/x64/Embedded), Server 2003 (SP2/R2), Vista SP2, Windows 7 SP1, Windows Server 2008 / 2008 R2 — podatne bez aktualizacji. Microsoft wydał poprawki, łącznie dla systemów EoL. Windows 8/10/11 nienarażone.
- Środowiska chmurowe (AWS/Azure/GCP) — ryzyko ekspozycji dotyczy głównie instancji z otwartym 3389/TCP na Internet (Security Groups/NSG). To mapuje się do T1190/T1021.001 i wymaga kontroli reguł sieciowych. (Źródło ogólne — ATT&CK).
- AD/ESXi/K8s/M365 — sama podatność dotyczy Windows; dla tych platform istotne są punkty ekspozycji RDP (jump/bastion), polityki segmentacji i bram RDP.
Szczegółowy opis techniki (jak działa, cele, dlaczego jest skuteczna)
BlueKeep wykorzystuje błąd w przetwarzaniu kanałów/strumienia RDP podczas handshake’u (przed uwierzytelnieniem). Atakujący nawiązuje połączenie do 3389/TCP i wysyła sekwencję PDU, które prowadzą do korupcji pamięci jądra i przejęcia kontroli nad wykonaniem. Skuteczność wynika z:
- Pre‑auth RCE (brak logowania / brak interakcji),
- Wormowalności (możliwa automatyczna propagacja),
- Powszechnej ekspozycji RDP w sieciach firmowych oraz często w Internecie.
NLA wymaga uwierzytelnienia przed dotarciem do podatnej ścieżki i utrudnia automatyczne rozprzestrzenianie, ale nie chroni, jeśli napastnik ma ważne poświadczenia (np. z wycieku). Dlatego aktualizacja pozostaje jedyną trwałą mitigacją.
Artefakty i logi (tabela)
| Źródło | Artefakt / pole | Co obserwować | Wartość dla detekcji |
|---|---|---|---|
| Windows/System | Event ID 56, Provider: TermDD | „The Terminal Server security layer detected an error in the protocol stream…”; skoki liczby błędów z jednego źródłowego IP | Indykator skanów/nieudanych exploitów BlueKeep; korelować z 3389/TCP i restartami usług. |
| Windows/Security | 4624/4625 (LogonType=10) | Udane/nieudane logowania RDP; źródłowe IP | Do odróżnienia legalnych adminów od zewnętrznych adresów; koreluj z ekspozycją portu. |
| Windows/TerminalServices‑RemoteConnectionManager/Operational | 1149 | „User authentication succeeded” (i czasem niektóre nieudane) | Linia czasu sesji RDP; łączyć z 4624 i źródłowym IP. |
| Windows/System | 7031 (Service Control Manager) | Nieoczekiwane restarty Remote Desktop Services | Często przy niestabilnych exploitach/handshake’ach; korelować z Event 56 i portem 3389. |
| EDR | „RDP service spawning child” | svchost.exe (TermService) → nietypowe dzieci (cmd/powershell) | Rzadkie w admin rutynie; mocny sygnał post‑exploitation. (wiedza ogólna) |
| Sieć/Firewall/Proxy | Połączenia TCP/3389 z Internetu | Nowe źródła, wysokie wolumeny, nietypowe ASN | Wczesne ostrzeżenie o skanach/atakach. |
| AWS CloudTrail | AuthorizeSecurityGroupIngress (EC2) | Reguły SG z 3389 do 0.0.0.0/0 | Ekspozycja RDP w chmurze (Initial Access/T1190). |
| Azure Activity | MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/SECURITYRULES/WRITE | NSG otwierające 3389 na „Internet/Any” | Jak wyżej (chmura). |
| K8s audit / M365 | — | — | [nie dotyczy] |
Detekcja (praktyczne reguły)
Sigma (gotowe reguły)
A) TermDD burst — możliwy skan/eksploit BlueKeep
title: Windows RDP TermDD Protocol Errors Burst (BlueKeep/Scan)
id: 2f2f8e8a-6a1a-45d2-9b6f-td56-burst
status: experimental
description: Wykrywa nagłe skoki błędów TermDD (EventID 56) sugerujące skany lub nieudane próby eksploatacji CVE-2019-0708.
author: Badacz CVE
logsource:
product: windows
service: system
detection:
selection:
EventID: 56
Provider_Name: 'TermDD'
timeframe: 5m
condition: selection
# Uwaga: Agregacje zależą od backendu. Zalecane korelowanie: >=20 zdarzeń/5min z jednego SourceIP/hostu.
level: medium
tags:
- attack.T1210
- attack.T1021.001
- cve.2019-0708
B) Wyłączenie NLA — modyfikacja rejestru (Sysmon)
title: RDP NLA Disabled via Registry
id: 3a6eaeee-1f6b-4592-a1a1-nla-off
status: stable
description: Wykrywa ustawienie UserAuthentication=0 dla RDP-Tcp (wyłączenie NLA).
author: Badacz CVE
logsource:
product: windows
service: sysmon
detection:
sel_path:
EventID: 13
TargetObject|endswith: '\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\UserAuthentication'
sel_val:
Details|contains: 'DWORD (0x00000000)'
condition: sel_path and sel_val
level: high
tags:
- attack.T1021.001
- attack.T1112
falsepositives:
- Rzadkie legalne zmiany GPO/Intune
(NLA/UserAuthentication = 1 włącza NLA; 0 ją wyłącza).
Splunk (SPL)
A) Skoki TermDD (Event 56):
index=wineventlog sourcetype="WinEventLog:System" EventCode=56 SourceName=TermDD
| stats count by host, Message, _time, ComputerName, dest
| timechart span=5m count by host
B) RDP sukcesy spoza prywatnych adresów (4624, LogonType=10):
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4624 Logon_Type=10
| eval isPublic=if(cidrmatch("10.0.0.0/8", Source_Network_Address) OR cidrmatch("172.16.0.0/12", Source_Network_Address) OR cidrmatch("192.168.0.0/16", Source_Network_Address), 0, 1)
| search isPublic=1
| stats count values(Source_Network_Address) as src_ip by ComputerName, Target_User_Name
| where count>0
KQL (Azure/Microsoft Sentinel)
A) Udane logowania RDP spoza prywatnych podsieci:
SecurityEvent
| where EventID == 4624 and LogonType == 10
| extend SrcIp = iff(isempty(IpAddress), tostring(parse_xml(EventData).EventData.Data[?(@.Name=="IpAddress")][0]."#text"), IpAddress)
| where SrcIp !startswith "10." and SrcIp !startswith "172.16." and SrcIp !startswith "192.168."
| summarize dcount(SrcIp) by Computer, TargetUserName, bin(TimeGenerated, 1h)
B) Zmiany NSG otwierające 3389 na Internet (Azure Activity):
AzureActivity
| where OperationNameValue =~ "MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/SECURITYRULES/WRITE"
| extend p=parse_json(Properties)
| extend src=tostring(p.responseBody.properties.sourceAddressPrefix),
dport=tostring(p.responseBody.properties.destinationPortRange),
access=tostring(p.responseBody.properties.access)
| where dport in ("3389","*") and src in ("Internet","0.0.0.0/0","Any") and access == "Allow"
| project TimeGenerated, Caller, ResourceGroup, Resource, src, dport, access
CloudTrail query (CloudWatch Logs Insights)
Otwieranie 3389/TCP na 0.0.0.0/0 (EC2 Security Groups):
fields @timestamp, userIdentity.arn, sourceIPAddress, eventName, requestParameters
| filter eventSource="ec2.amazonaws.com"
| filter eventName in ["AuthorizeSecurityGroupIngress","ModifySecurityGroupRules","UpdateSecurityGroupRuleDescriptionsIngress"]
| filter requestParameters like /3389/ and requestParameters like /0\.0\.0\.0\/0/
| sort @timestamp desc
Elastic / EQL
A) Wyłączenie NLA w rejestrze (Elastic EQL):
registry where
registry.path :
"*\\System\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\\UserAuthentication" and
registry.data.strings : ("0","0x00000000")
B) RDP z Internetu (Elastic Query DSL – Beats flow):
network where destination.port == 3389 and
not cidrmatch(source.ip, ["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"])
Heurystyki / korelacje (co łączyć)
- Wejście → błąd protokołu → restart usługi: Inbound 3389 z nowego publicznego IP + TermDD/56 burst + SCM/7031 dla TermService ⇒ podejrzenie skanów/nieudanych exploitów BlueKeep.
- Wejście → sukces logowania → nietypowe procesy: 3389 z Internetu + 4624/LogonType=10 +
svchost.exe (TermService)spawnującycmd.exe/powershell.exe⇒ post‑exploitation. - Chmura: zdarzenia SG/NSG otwierające 3389 ⇒ natychmiastowe skanowanie Internetu; łączyć z logami RDP.
- NLA: zmiana
UserAuthenticationna 0 + wzrost 4625/LogonType=10 ⇒ próby brute‑force lub przygotowanie do eksploatacji (chociaż BlueKeep jest pre‑auth, wyłączenie NLA bywa celem operatorów, aby ułatwić dalsze działania).
False positives / tuning
- Event 56 (TermDD) może wynikać z błędów sieciowych/starych klientów RDP — filtrować progiem (np. ≥20/5min per źródłowe IP) i utrzymywać listę zaufanych skanerów.
- 4624/10: legalne logowania adminów/jumphostów — whitelisty dla źródeł ASN/VPN, kont serwisowych i okien serwisowych.
- 7031: restart różnych usług — koreluj wąsko z TermService i 56.
- Zmiany rejestru: wdrożenia GPO/Intune — taguj „change windows” i weryfikuj źródło (PID/Signer).
Playbook reagowania (IR)
- Triaging & izolacja
- Odłącz host od sieci lub przełącz do VLAN kwarantanny.
- Zanotuj
netstat -ano | find ":3389"oraztasklist /svc | find /I "TermService".
- Weryfikacja podatności/łatek
- Sprawdź OS i łatki:
- Windows 7/2008 R2:
Get-HotFix -Id KB4499164,KB4499175 - Vista/2008:
Get-HotFix -Id KB4499180 - XP/2003:
wmic qfe | find "4500331"
Jeśli brak — patch ASAP (odpowiednie KB dla wydania).
- Windows 7/2008 R2:
- Twardnienie
- Włącz NLA:
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1(restart RDS). - Ogranicz 3389 do VPN/jumphost (SG/NSG/Firewall), wyłącz ekspozycję 0.0.0.0/0.
- Hunting
- Przejrzyj Event 56/7031 (skoki), 4624/10 (źródła publiczne), 1149 (osi czasu).
- Sprawdź anomalia procesów od
svchost.exe -k termsvcsi autostarty.
- Eradykacja & recovery
- Zastosuj poprawki, wymuś restart RDS/hosta, zmień hasła adminów, wymuś MFA do zdalnych dostępl.
- Lessons learned
- Segmentacja, JIT RDP (Azure), bastiony, skanowanie podatności.
Przykłady z kampanii / case studies
- Listopad 2019 — pierwsze potwierdzone wykorzystanie BlueKeep in‑the‑wild do kryptominera (kampania masowa, niestabilne exploity).
- Fortinet/Microsoft potwierdzają ataki oraz apelują o natychmiastowe łatanie.
- Szacunki ekspozycji: setki tysięcy hostów publicznie podatnych po publikacji (2019). (kontekst historyczny)
Lab (bezpieczne testy)
Wyłącznie w odizolowanym labie. Brak exploitów. Celem jest weryfikacja ekspozycji i telemetrii.
- Sprawdzenie stanu RDP/NLA na hoście:
# Czy RDP jest włączone
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections
# Czy NLA jest włączona
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication
- Weryfikacja łatek (Win7/2008 R2):
Get-HotFix -Id KB4499164,KB4499175
- Skan bezpieczny z zewnątrz (wersja RDP, bez exploitów):
nmap -Pn -p3389 --script rdp-enum-encryption,rdp-ntlm-info <cel>
- Generowanie zdarzeń do detekcji: krótka sesja RDP z jump‑hosta (udane/nieudane logowania) → potwierdź 4624/4625(LogonType=10), 1149, brak nadmiarowych 56.
Mapowania (Mitigations, powiązane techniki)
Mitigations (wg MITRE, powiązane z T1210):
- M1051 Update Software (patch management), M1042 Disable or Remove Feature or Program (wyłącz/ogranicz RDP), M1030 Network Segmentation, M1035 Limit Access to Resource Over Network (gateway/JIT), M1048 Application Isolation/Sandboxing, M1050 Exploit Protection, M1016 Vulnerability Scanning, M1026 Privileged Account Management.
Powiązane techniki ATT&CK:
- T1133 External Remote Services (ekspozycja zewnętrzna), T1562 (Defense Evasion — wyłączanie zabezpieczeń/NLA), T1112 (Modify Registry), T1021 (Remote Services — rodzina). (mapowanie merytoryczne na podstawie opisów ATT&CK).
Źródła / dalsza literatura
- Microsoft MSRC: Prevent a worm by updating RDS (CVE‑2019‑0708) — o NLA i „wormowalności”. (Microsoft)
- Microsoft Support: Customer guidance for CVE‑2019‑0708 — listy platform i KB (w tym EoL). (Microsoft Support)
- Microsoft KB: KB4499164 (Monthly Rollup Win7/2008 R2), KB4499175 (Security‑only). (Microsoft Support)
- NVD: CVE‑2019‑0708 (CVSS 9.8, zmiany 2024). (NVD)
- CISA Advisory AA19‑168A. (CISA)
- MITRE ATT&CK (v18): T1210, T1021.001, T1190 (wersje i daty). (MITRE ATT&CK)
- Microsoft Tech Community: TermDD Event ID 56 — protokół RDP error. (TECHCOMMUNITY.MICROSOFT.COM)
- Unit 42: analiza wewnętrzna RDP/BlueKeep. (Unit 42)
- Tenable/Microsoft/Kryptos Logic: pierwsze ataki i telemetria. (Tenable®)
- Informacja kontekstowa o nienarażonych Windows 8/10/11. (Wikipedia)
Checklisty dla SOC / CISO
SOC – codzienna kontrola
- Alerty na Event 56 (TermDD) bursty + korelacja z 3389/TCP.
- Monitor 4624/10 i 1149 z publicznych IP; whitelisty dla jump‑hostów.
- Wykrywanie NLA=OFF (
UserAuthentication=0) i zmian SG/NSG otwierających 3389. - Regularne skany podatności/asset inventory dla hostów z RDP.
CISO – decyzje i governance
- Polityka: RDP tylko przez VPN/jumphost/JIT; brak 0.0.0.0/0.
- SLA na Patch Tuesday + raport KB (KB4499164/KB4499175/KB4499180/KB4500331).
- NLA wymagane (GPO/Intune), MFA dla zdalnego dostępu.
- Segmentacja (M1030), regularny red/blue tabletop dla RDP‑borne incydentów.