
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ć)
| 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.T1190Sigma (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_seenKQL (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/*.xml w oknie 1–3 min z tym samym src_ip/User-Agent.
- Po udanym renderze spodziewaj się pojawienia plików *.xml + *.ttc2 w /netscaler/portal/templates/.
- Sprawdź procesy nobody wykraczające poza httpd oraz 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
- 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ź modyfikacje ns.conf.
- Odzyskanie i twardnienie
- Rotacja haseł/kluczy, re‑issue certyfikatów (wyciek ns.conf bywał obserwowany).
- WAF: reguły blokujące /vpn/../vpns/portal/ i dostęp do *.xml w /vpns/portal/.
- Monitoring ciągły według reguł z sekcji 7.
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 .xml w 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ź, iż testowe zdarzenie podniosło alert.
- Symulacja artefaktów – utwórz puste pliki .xml w ś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/*.xml i .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.















