
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 skuteczna)
- 5 Artefakty i logi (co zbierać)
- 6 Detekcja (praktyczne reguły)
- 7 Heurystyki / korelacje
- 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 lektura
- 14 Checklisty dla SOC / CISO
TL;DR
Krytyczna podatność Directory Traversal w Citrix ADC/NetScaler Gateway umożliwiała pre‑auth RCE na urządzeniu brzegowym. Typowy łańcuch: żądanie zapisujące plik XML w katalogu szablonów + odwołanie renderujące go jako szablon → wykonanie kodu (Perl/Unix shell). Priorytety: sprawdź logi /var/log/httpaccess.log i /var/log/ns.log, uruchom oficjalny IoC Scanner (Citrix/Mandiant), załatataj lub przeinstaluj do wersji naprawionej, usuń zakładki/podstawione pliki w /netscaler/portal/templates/, oceń lateral movement.
Krótka definicja techniczna
CVE‑2019‑19781 to błąd walidacji ścieżek (CWE‑22) w Citrix ADC/Gateway (10.5–13.0), który pozwalał na przejście katalogów i zapisywanie plików w lokalizacjach przetwarzanych przez mechanizm szablonów (Template Toolkit). W efekcie niezalogowany napastnik mógł zapisać złośliwy szablon XML i wywołać jego renderowanie, co prowadziło do wykonania kodu i przejęcia urządzenia.
Gdzie występuje / przykłady platform
- Citrix ADC / NetScaler ADC i Citrix Gateway / NetScaler Gateway (wdrożenia fizyczne/VM, także w chmurach IaaS). Wrażliwe były linie 10.5, 11.1, 12.0, 12.1, 13.0 przed poprawkami.
- Środowiska hybrydowe (np. ADC za ALB/ELB, Azure Front Door, on‑prem DMZ) — ekspozycja jest publiczna, więc podatność pełni rolę wektora Initial Access (T1190).
- Oficjalne komunikaty i poradniki aktualizacji/mitigacji dostarczył Citrix.
Szczegółowy opis techniki (jak działa, cele, dlaczego skuteczna)
Mechanizm obsługi żądań do ścieżek /vpns/portal/ w ADC przekazywał je do modułu Perl renderującego pliki jako szablony. Błąd path traversal pozwalał sterować nazwą/położeniem pliku (np. poprzez funkcję csd/filewrite w łańcuchu wywołań), co umożliwiało zapis przygotowanego XML w katalogu szablonów oraz jego wyrenderowanie kolejnym żądaniem (lub w niektórych wariantach jednym żądaniem). Po renderyzacji Template Toolkit umożliwiał wykonanie akcji prowadzących do RCE.
Dlaczego technika była skuteczna:
- Pre‑auth oraz publiczna ekspozycja urządzeń (brzeg/DMZ).
- Logi i inspekcja sieci często omijane (urządzenia przed IDS/NDR albo ruch TLS).
- Szybka weaponizacja (publiczne PoC i masowe skanowanie).
- Pojawiły się przypadki „vigilante patching” (NOTROBIN), które maskowały rzeczywisty poziom kompromitacji.
Artefakty i logi (co zbierać)
| Źródło / komponent | Co szukać (wzorzec) | Przykład / uwagi | EID / CloudTrail / K8s / M365 |
|---|---|---|---|
ADC /var/log/httpaccess.log | Sekwencja: POST do skryptu Perl w /vpns/portal/ + GET/HEAD .xml w /vpns/portal/ (200/304) | Polecenia grep używane przez IR: grep -iE 'POST.*\\.pl.* 200' /var/log/httpaccess.log oraz `grep -iE 'GET.\.xml. (200 | 304)’ /var/log/httpaccess.log` |
| ADC filesystem | Nowe/zaskakujące pliki *.xml i skompilowane *.ttc2 w /netscaler/portal/templates/ | Artefakt po udanym zapisie oraz renderowaniu szablonu | — |
| Procesy | Procesy uruchamiane przez użytkownika nobody (poza typowym httpd) | `ps aux | grep nobody` – wskazówka Mandiant dla triage |
| Crontab | Nieautoryzowane wpisy (cykliczne pobieranie/uruchamianie binariów) | M.in. linie z curl i uruchamianiem plików w /tmp/.init/ | — |
ADC /var/log/ns.log (AAA/syslog) | Nietypowe logowania/porzucone sesje, wzmianki LOGIN_FAILED/Client_ip | Służy też do korelacji czasu ataku z sesjami użytkowników | — |
| WAF/ALB/Front Door | URI zawierające /vpn/../vpns/portal oraz odwołania do *.xml | Analiza AWS WAF/ALB, Azure WAF, appliance WAF | CloudTrail: n/d (zamiast tego CloudWatch Logs Insights / AzureDiagnostics) |
Uwaga: zakres kolumn CloudTrail/M365/K8s zwykle nie dotyczy natywnej analityki ADC; zbieraj logi sieciowe (WAF/ALB) i syslog z ADC.
Detekcja (praktyczne reguły)
Sigma (HTTP access logs – pre‑auth traversal do skryptu Perl)
title: Citrix ADC CVE-2019-19781 Pre-Auth Traversal to Perl Script
id: 0d7d8b3a-3c2f-4c2e-a2b0-citrix-19781-a
status: stable
description: Wykrywa żądania POST z traversalem do /vpns/portal/*.pl (np. newbm.pl)
references:
- https://cloud.google.com/blog/topics/threat-intelligence/rough-patch-promise-it-will-be-200-ok
logsource:
category: webserver
detection:
sel_uri:
request:
- '*\/vpn/*../*/vpns/portal/*'
url|contains:
- '/vpn/../vpns/portal/'
sel_pl:
url|endswith: '.pl'
sel_method:
http_method: POST
condition: sel_uri and sel_pl and sel_method
falsepositives:
- Skanery podatności / testy pentestowe
level: high
tags:
- attack.T1190
Sigma (HTTP access logs – renderowanie szablonu XML)
title: Citrix ADC CVE-2019-19781 XML Template Render
id: 7f0a6e60-9fda-4a7f-b3f9-citrix-19781-b
status: stable
description: Żądania GET/HEAD do /vpns/portal/*.xml (200/304) po wcześniejszym POST
logsource:
category: webserver
detection:
sel_xml:
url|contains: '/vpns/portal/'
url|endswith: '.xml'
sel_code:
http_status:
- 200
- 304
condition: sel_xml and sel_code
level: high
tags:
- attack.T1190
(W regułach SIEM zalecana korelacja POST→GET w krótkim oknie czasu i z tym samym src_ip/user_agent).
Splunk (SPL)
(index=weblogs OR index=proxy OR index=adc)
| eval uri=coalesce(cs_uri_stem, uri_path, request)
| eval method=coalesce(cs_method, http_method, method)
| search (uri="/vpn/*../*/vpns/portal/*" method=POST) OR (uri="/vpns/portal/*.xml" (status=200 OR status=304))
| stats earliest(_time) as first_seen, latest(_time) as last_seen, values(status) as http_status by src, uri, user_agent, method
| sort - last_seen
KQL (Azure – WAF/App Gateway/Front Door)
let T1 = (
AzureDiagnostics
| where Category in ("ApplicationGatewayFirewallLog","FrontDoorWebApplicationFirewallLog")
| where requestUri_s has "/vpn/../vpns/portal" and httpMethod_s == "POST"
);
let T2 = (
AzureDiagnostics
| where Category in ("ApplicationGatewayAccessLog","ApplicationGatewayFirewallLog","FrontDoorAccessLog","FrontDoorWebApplicationFirewallLog")
| where requestUri_s has "/vpns/portal/" and requestUri_s endswith ".xml" and toint(substatus_s) in (200,304)
);
T1
| join kind=innerunique T2 on ClientIP_s, userAgent_s
| project TimeGenerated, ClientIP_s, userAgent_s, requestUri_s, Resource
(Łańcuch POST→GET z tym samym IP/UA).
AWS (CloudWatch Logs Insights – WAF/ALB)
fields @timestamp, httpRequest.clientIp, httpRequest.httpMethod, httpRequest.uri
| filter httpRequest.uri like /\/vpn\/\.\.\/vpns\/portal\// or httpRequest.uri like /\/vpns\/portal\/.*\.xml$/
| sort @timestamp desc
(Uwaga: CloudTrail nie rejestruje ruchu HTTP do ADC; używaj logów WAF/ALB/ELB).
Elastic (EQL – korelacja sekwencji)
sequence by source.ip with maxspan=3m
[ network where url.path like "*\/vpn/*../*/vpns/portal/*" and http.request.method == "POST" ]
[ network where url.path like "/vpns/portal/*.xml" and http.response.status_code in (200,304) ]
Źródła: opis łańcucha Mandiant.
Heurystyki / korelacje
- Koreluj POST → GET/HEAD do
/vpns/portal/*.xmlw oknie 1–3 min z tym samymsrc_ip/User-Agent. - Po udanym renderze spodziewaj się pojawienia plików
*.xml+*.ttc2w/netscaler/portal/templates/. - Sprawdź procesy
nobodywykraczające pozahttpdoraz nowe wpisy crontab. - IOC typu „vigilante” (NOTROBIN) też wskazuje kompromitację (modyfikuje/domyka wektor, ale zostawia tylną furtkę).
False positives / tuning
- Skanery podatności, testy pentestowe i health‑checki mogą generować żądania z
... Ogranicz alerty do konkretnych ścieżek (/vpns/portal/) i kodów 200/304 dla.xml. - Agreguj po /24 i User‑Agent — masowe skany będą miały wiele hostów/UA; eksploatacja zwykle ma spójny UA w krótkim czasie.
- Włącz allow‑list znanych skanerów (np. IP Twojej usługi ASM/WAF).
Playbook reagowania (IR)
- Izolacja & widoczność
- Tymczasowo ogranicz dostęp do ADC (geo/IP allow‑list lub VPN admins only).
- Włącz pełny syslog do SIEM + eksport logów WAF/ALB/Front Door.
- Triaging artefaktów (na ADC)
- Logi HTTP:
grep -iE 'POST.*\.pl.* 200' /var/log/httpaccess.log -A1 grep -iE 'GET|HEAD.*\.xml.* (200|304)' /var/log/httpaccess.log -B1 - Pliki:
find /netscaler/portal/templates -type f \( -name '*.xml' -o -name '*.ttc2' \) -mtime -30 -ls - Procesy/utrwalenie:
ps aux | grep nobody | grep -v httpd crontab -l
- Logi HTTP:
- Skan IoC (oficjalny)
- Uruchom Citrix/Mandiant IoC Scanner na urządzeniu (tryb live). Zapisz wynik, zabezpiecz artefakty.
- Eradykacja
- Zastosuj fixed buildy / przeinstaluj do wersji poprawionej; usuń pliki z
/netscaler/portal/templates/; wyczyść crontab; sprawdź modyfikacjens.conf.
- Zastosuj fixed buildy / przeinstaluj do wersji poprawionej; usuń pliki z
- Odzyskanie i twardnienie
- Rotacja haseł/kluczy, re‑issue certyfikatów (wyciek
ns.confbywał obserwowany). - WAF: reguły blokujące
/vpn/../vpns/portal/i dostęp do*.xmlw/vpns/portal/. - Monitoring ciągły według reguł z sekcji 7.
- Rotacja haseł/kluczy, re‑issue certyfikatów (wyciek
Bezpieczeństwo: wszelkie działania wykonuj wyłącznie na własnym, testowym lub firmowym sprzęcie i w celu obrony.
Przykłady z kampanii / case studies
- Masowe skanowanie i exploitation od 10–14 stycznia 2020; szybka weaponizacja PoC i infekcje (m.in. koparki, web‑shelle).
- NOTROBIN (vigilante) – aktor wykorzystywał podatność do „łatania” innych backdoorów i blokowania kolejnych ataków, jednocześnie utrzymując własny dostęp. Wykrywano cykliczne czyszczenie plików
.xmlw katalogu szablonów. - Analizy IR (Fox‑IT/NCC Group) – szczegółowa rekonstrukcja łańcucha: zapis XML poprzez
csd/filewrite, render i obejścia (w tym jednorazowe żądanie).
Lab (bezpieczne testy)
Cel: sprawdzić, czy detekcje/WAF reagują na wzorzec, bez eksploatacji.
- Generowanie bezpiecznego zdarzenia (Twoje labowe ADC lub serwer testowy):
curl -k -I --path-as-is "https://lab.adc.example/vpn/../vpns/portal/test.xml"Spodziewany 404; zdarzenie powinno trafić do WAF/ALB/NGINX/IIS i zadziałać reguła wykrywająca wzorzec URI. - Weryfikacja w Splunk/KQL – odpal zapytania z pkt 7 i potwierdź, że testowe zdarzenie podniosło alert.
- Symulacja artefaktów – utwórz puste pliki
.xmlw ścieżce testowej poza ADC i sprawdź, czy reguły FIM (jeśli masz) łapią zdarzenia tworzenia plików.
Nie testuj na systemach produkcyjnych i nie używaj exploitów – to ćwiczenie detekcyjne.
Mapowania (Mitigations, powiązane techniki)
Mitigations (ATT&CK)
- M1051 – Update Software: aktualizacje/łatki firmware ADC.
- M1050 – Exploit Protection: reguły WAF/IPS dla ścieżek z traversalem.
- M1031 – Network Intrusion Prevention: sygnatury IDS/IPS dla
/vpn/../vpns/portal/i.xml. - M1030 – Network Segmentation: ogranicz zasięg ADC (DMZ, mikrosegmentacja, tylko niezbędne serwisy).
Powiązane techniki (ATT&CK)
- T1190 – Exploit Public-Facing Application (wejście).
- T1505.003 – Web Shell (utrwalenie na urządzeniu).
- T1059.004 – Unix Shell (wykonanie komend).
- T1105 – Ingress Tool Transfer (dociąganie narzędzi).
- T1053.003 – Cron (utrwalenie).
Źródła / dalsza lektura
- Citrix — ogłoszenie podatności / blogi i mitgacje. (Citrix.com)
- NVD – opis CVE i listy wersji: CVE‑2019‑19781. (NVD)
- Mandiant (Google Cloud) – „Rough Patch: I Promise It’ll Be 200 OK” (artefakty, wzorce logów, detekcje). (Google Cloud)
- Mandiant/Citrix – IoC Scanner (repo). (GitHub)
- Fox‑IT/NCC Group – „A Second Look at CVE‑2019‑19781” (wewnętrzna mechanika, obejścia). (Fox-IT International blog)
- CISA – Alert AA20‑031A (detekcja, kontekst zagrożeń). (CISA)
- Unit 42 – analiza i dane o skanach/eksploatacjach. (Unit 42)
- NCSC‑UK – ostrzeżenie o aktywnej eksploatacji. (NCSC)
- ATT&CK T1190 – strona techniki. Wersja frameworku: v18. (MITRE ATT&CK)
Checklisty dla SOC / CISO
SOC (operacyjna):
- Reguły detekcji: Sigma/SPL/KQL/EQL wdrożone i przetestowane.
- Ingest: syslog z ADC (
httpaccess.log,ns.log) + WAF/ALB/Front Door. - Korelacja POST→GET
.xml(200/304) + alert wysokiego priorytetu. - Playbook IR: zbieranie artefaktów, IoC Scanner, triage procesów
nobody, crontab. - Dashboard/Trend: skany vs. udane odwzorowania.
CISO (strategiczna):
- Polityka patch management dla urządzeń brzegowych (M1051).
- WAF/IPS – sygnatury traversal dla
/vpn/../vpns/portal/(M1031/M1050). - Segmentacja ADC (DMZ, least access) + mikrosegmentacja (M1030).
- Regularny threat hunt po artefaktach
/netscaler/portal/templates/*.xmli.ttc2. - Testy detekcji (purple team) i przeglądy konfiguracji WAF przed oknami świątecznymi.
Uwaga o zgodności z ATT&CK: CVE‑2019‑19781 mapuje się przede wszystkim do T1190 (Initial Access). Dalsze TTP (web‑shell, cron, transfer narzędzi) reprezentują etapy po‑eksploatacyjne obserwowane w incydentach opisanych przez Mandiant/Fox‑IT i powinny być objęte monitorowaniem.