Pereiti prie turinio
Kai fake news, scamai ir cloaking susitinka vienoje vietoje.

Kai fake news, scamai ir cloaking susitinka vienoje vietoje.

Tyrimas, kaip netikros naujienos, investicinis sukčiavimas ir cloaking sujungiami į vieną aukų atrankos bei monetizavimo infrastruktūrą.

Kai fake news, scamai ir cloaking susitinka vienoje vietoje.

Analitinė santrauka

Esminės išvados

  • Cloaking atskiria aukas nuo tyrėjų ir platformų kontrolės.
  • Netikrų naujienų turinys veikia kaip pasitikėjimo bei srauto generavimo sluoksnis.
  • Kampanijas patikimiau jungia infrastruktūros ir šablonų sutapimai, o ne vienas domenas.
Apimtis
Sukčiavimo srauto, nukreipimo logikos ir turinio pateikimo skirtingoms auditorijoms analizė.
Apribojimai
Infrastruktūra greitai keičiasi, todėl domenai ir nukreipimo keliai yra konkretaus tyrimo momento vaizdas.

Cloaking schema rodo, kaip tas pats URL tyrėjui pateikia saugų puslapį, o aukai – sukčiavimą.

WeRedirect APT (tik nežinau kodėl čia pavadinta APT, kai realiai neatitinka APT sąvokos, nors iš vienos pusės kompanija turi infrastruktūrą, operatorius, cloaking, reklamų fermas, čia labiau tinka APT-like, persistent scam operation ar koks organized fraud actor na dar priliptų financially motivated threat actor) yra Debunk.org suteiktas pavadinimas kompanijai, kurioje sukčiai Lietuvoje ir kitose Europos šalyse kūrė klonuotus naujienų portalus, netikras Facebook paskyras, investicinių scamų landing pages ir naudojo cloaking, kad skirtingiems lankytojams būtų rodomas skirtingas turinys. Debunk.org part I nurodė 93 Facebook paskyras, 81 brand impersonation puslapius, 568 fake ads ir 7.5 mln. impressions, iš kurių daugiau nei 5.1 mln. parodymų teko Lietuvos Facebook vartotojams ir kitoms meta platformoms. (Debunk.org, 2023 Part I)

Svarbiausias techninis kampas, kad tas pats URL nėra tas pats įrodymas aka vienas žmogus gali matyt tuščią puslapį, kitas blogą, o žmogus iš Lietuvos (su tinkamu įrenginiu, kalba, referreriu ir IP reputacija) mato fake Delfi/LRT/Ignitis investicinį puslapį. Debunk part 3 aprašė, kad WeRedirect naudojo geolocation/IP-based redirection, skirtingus URL path variantus, low-quality puslapius ir pagal tai parinkdavo turinį (Debunk.org, 2023 Part III)


Kas yra Cloacking CTI kontekste

Cloaking phishing ir malvertising kontekste yra turinio pateikimo kontrolė pagal tam tikras lankytojo savybes. Security scanneriui, ad reviewer’iui, cloud sandbox’ui arba tyrėjui (researcheriui arba kaip pavadinsi taip nepagadinsi) parodomas “normalus” puslapis. Vartotojui į kurį taikomasi rodomas phishing, scam, crypto drainer, fake investment platforma, malware landing page, arba kažkoks fake installer. Varonis 2026 m. aprašytas 1Campaign atvėjis parodo, kad lygiai toks pats modelis vyksta ir Google Ads ekosistemoje t.y. realus varototoajs mato scam turinį, o ad platformos revieweriai ir automatizuoti scanneriai mato blank page, arba harmless page. (Varonis, 2026)

HUMAN Security 2025 m. malvertising analizėje cloaking pateikė kaip “split personality” reklamos modelį, kuris yra tas toks pat, kaip ir 1Campaign. (HUMAN Security, 2025)

ZeroFox nurodo tipinius cloaked phishing kit požymius: JavaScript rendering reikalavimas, User-Agent filtering, timing delays, IP blocklists, geo-blocking ir domain rotation/DGA. Taip pat pamini, kad phishing kits dažnai blokuoja web crawlerius, resercherius, botus ir kitus kas “nepageidaujami”. (ZeroFox, 2023)

Nuuuuu aš čia dar irgi įsikišiu (kas kitas jei ne šuo pats sau pasilaižys…), kai dar buvau NordVPN ThreatProtection’e rašėm ir mes šiek tiek apie cloaking ir gaudėm 2024 m. (mano komanda rašė…likom tik NordVPN experts.. sad). (NordVPN, 2024)

Skirtingiems lankytojams pagal patikros signalus pateikiamas tikras arba fiktyvus turinys.


Pagrindinės cloaking technikos

Technikos

 TechnikaKaip veikiaKą mato analitikasKaip aptikti 
 Geo/IP filteringServeris sprendžia pagal IP šalį, regioną, ASN, residential/mobile/datacenter tipąIš cloud/VPN gali matyti white page arba 404Testuoti iš įvairių mobile/residential/datacenter profilių 
 ASN / hosting reputation filteringBlokuoja Google, Microsoft, AWS, OVH, DigitalOcean, VPN, security vendorsScanneriai gauna benign puslapįLyginti cloud vs residential/mobile atsakymus 
 User-Agent filteringTikrina Chrome/Safari/Firefox, OS, mobile/desktop, bot UAHeadless Chrome arba curl gauna kitokį HTMLKeisti UA, Accept-Language, platform headers 
 JavaScript rendering gateTurinys sugeneruojamas tik su JS, cookies, localStorage, timersStatic scanner mato tuščią HTMLNaudoti Playwright/Chrome su HAR ir screenshots 
 Headless/browser fingerprint detectionTikrina navigator.webdriver, plugins, fonts, WebGL, canvas, screen sizeAutomation gauna fasadąLyginti real browser ir headless rezultatus 
 Referer / ad-click gatingTikra versija rodoma tik atėjus iš Meta/Google ad clickTiesioginis URL atidarymas neveikiaRinkti pilną ad URL su parametrais, refereriu ir redirect chain 
 Cookie/session gatingPirmas apsilankymas rodo vieną turinį, pakartotinis kitąPo kelių tyrimų puslapis „užsidaro“Naudoti švarias sesijas, naujus profilius, fiksuoti pirmą hitą 
 Time delayScam turinys atsiranda po 5–30 s arba po scroll/clickGreitas scanneris nespėja pamatytiIlginti wait time, fiksuoti DOM pokyčius 
 Path-based landersTas pats domenas turi daug lokalizuotų /lander/lt..., /lander/se... keliųVienas path neveikia, kitas rodo scamEnumeruoti tik iš viešai matomų pathų, lyginti struktūrą 
 Shield pagesPradinis landeris atrodo kaip low-quality news/gossip pageScanneris mato pseudo portaląŽiūrėti JS, redirect initiators, form actions, hidden links 
 Sample-rate cloakingMalicious versija rodoma tik daliai sesijųVienas tyrimas gali nieko nerodytiKartoti iš skirtingų aplinkų, bet saugiai ir ribotai 
 Anti-debugging / DevTools detectionJS tikrina debug/DevTools požymiusAtidarius DevTools keičiasi elgsenaRinkti HAR per proxy/browser API, ne tik rankiniu DevTools 
 Localization gatingTikrina Accept-Language, timezone, currency, browser localeNe LT locale gauna fasadąTestuoti iš įvairių timezone 
 CAPTCHA / challenge gatingPhishing atsiranda po challenge ar interactionScanneris sustoja challenge etapeDokumentuoti challenge, nevesti asmeninių duomenų 
 Tracking / affiliate gatingTikras landeris aktyvus tik su fbclid, gclid, UTM, affiliate IDNukirpus parametrus puslapis nebeveikiaSaugoti originalų URL su visais parametrais 

Šitoje vietoje svarbu ne tai, kad technika nera problema, o problemos atsiranda kai jau yra kombinacijos.

Realiose kompanijose veikia ne viena logika, o jų kombinacijos: Meta ad → fake news profile → tracking URL → Geo/IP check → UA check → cookie check → JS redirect → localized fake article → investment form → callback/CRM/Telegram/affiliate backend’as.

Tai sugaudyt, kurioje vietoje prasileidai… Uhhh smagumėlis.

Sprendimų medis vaizduoja IP, įrenginio, naršyklės ir elgsenos patikras prieš parenkant turinį.


Kaip saugiai “decloakint” ir pasiekt tikrą phishing/scam turinį

Jei trumpai, tai pagrindas surinkt IOCs, screenshot’us, cloaking mechanizmą. Nevedam realių duomenų, nieko neperkam, nespaudžiam download, nevykdom payload’ų.. Neinteractinam su operatoriais daugiau nei reikia, kad pasitvirtint phishing’ą/scam’ą, jei formos reikalauja telefono numerio, banko kortelės duomenų nu nevedam aišku savo ar kieno kito (realiai čia suveikia dummy duomenys dažnu atveju). Užfiksavom form fields, endpoint’us, DOM, screenshot’us ir network request’us.. and We are done.

Praktinis workflow (atrodo kažkaip taip):

Passive-firstPradedam nuo pasyvių šaltinių:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
domain age ir registrar
WHOIS / RDAP
nameservers
A/AAAA/CNAME
passive DNS
certificate transparency
ASN / hosting provider
favicon hash
page title / OpenGraph
Meta Ad Library creative metadata
social profile creation / rename history
brand keywords domene
URL path struktūra
UTM / affiliate / tracking ID

Debunk.org aprašė, kad WeRedirect atveju registracijos laikas ir domenų kūrimo klasteriai buvo naudingi (na čia savaime aišku, kad pivoting is The King). Dalis domenų buvo sukurti labai panašiu metu. Debunk taip pat mini Cloudflare, DigitalOcean, hosting providers, Namecheap, Tucows, URL Solutions ir privatumą apsaugančias registravimo paslaugas kaip infrastruktūros sluoksnius, kurie apsunkino analizę. (Debunk.org, 2023 Part III)

Differential fetchTą patį URL tikrinam keliom sąlygom:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Minimalus baseline
curl -i -L --max-redirs 10 "https://example[.]com/path" -o baseline.html

# Realistiškesnis Chrome desktop profilis
curl -i -L --max-redirs 10 \
  -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
  -H "Accept-Language: lt-LT,lt;q=0.9,en-US;q=0.8,en;q=0.7" \
  "https://example[.]com/path" -o chrome_lt.html

# Bot / scanner
curl -i -L --max-redirs 10 \
  -A "Googlebot/2.1 (+http://www.google.com/bot.html)" \
  "https://example[.]com/path" -o bot.html

Šituo atvėju lyginam ar tas pats URL grąžina skirtingus codes, Location headers, HTML dydį, page title, JS Budle, cookies ar final URL.

Browser-rendered collectionStatinio curl dažnai nepakanka, šiuo atvėju ZeroFox išskiria JS rendering, timing delays ir User-Agent filtering kaip tipines cloaked phishing technikas, todėl reikia browser-rendered analizės irgi. (ZeroFox, 2023)

Naudojam izoliuotą VM, Playwright/Chromium, naują browser profile kiekvienam bandymui (realiai turiu virš kelių šimtų asmeniškai browser profiles, kad sugaudyt cloaking), be realių accounts ir be realių duomenų:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from pathlib import Path
from playwright.sync_api import sync_playwright

target = "https://example[.]com/path"
out = Path("evidence")
out.mkdir(exist_ok=True)

profiles = [
    {
        "name": "lt_chrome_desktop",
        "locale": "lt-LT",
        "timezone_id": "Europe/Vilnius",
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
        "viewport": {"width": 1366, "height": 768},
    },
    {
        "name": "mobile_android_lt",
        "locale": "lt-LT",
        "timezone_id": "Europe/Vilnius",
        "user_agent": "Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36",
        "viewport": {"width": 390, "height": 844},
    },
]

with sync_playwright() as p:
    for prof in profiles:
        browser = p.chromium.launch(headless=False)
        context = browser.new_context(
            locale=prof["locale"],
            timezone_id=prof["timezone_id"],
            user_agent=prof["user_agent"],
            viewport=prof["viewport"],
            record_har_path=str(OUT / f"{prof['name']}.har"),
        )
        page = context.new_page()
        page.goto(target, wait_until="networkidle", timeout=45000)
        page.wait_for_timeout(15000)

        (out / f"{prof['name']}.html").write_text(page.content(), encoding="utf-8")
        page.screenshot(path=str(out / f"{prof['name']}.png"), full_page=True)

        context.close()
        browser.close()

(neskriauskit dėl “mandro” python script’o, aš ne developeris..ai jo..ir čia nėra universalus decoderis tinkantis viskam, situacija situacijai nėra lygi)

Matrix-based decloacking
Vienas iš praktiškiausių būdų (aš manau.. mano nuomonė) yra ne “atidariau URL ir pažiūrėjau”, o susidaryt testavimui matricą, kitaip sakant.. tas pats URL turi būt patikrintas per kelis profilius, skirtumai tarp atsakymų jau gali būt įrodymu, kad vyksta content decision logic.

Papraščiau tariant (imant Lietuvą):

Testai

TestasIP / lokacijaBrowser / UAKalba / timezoneReferer / parametraiKo ieškom
BaselineDatacenter / EUcurldefaultnoneAr puslapis gyvas, kokie status codes
LT userLietuvaChrome desktoplt-LT / Europe/Vilniusoriginalus URLAr rodo lokalizuotą scam / fake news
LT mobileLietuvaAndroid/iOS mobilelt-LT / Europe/Vilniusoriginalus URLAr kampanija mobile-first
Non-target userUS / NL / DEChromeen-USnoneAr rodo blank/facade/kitą turinį
Bot profilebet kurGooglebot / crawler UAdefaultnoneAr botams rodomas harmless turinys
No JSLietuvaChrome, JS offlt-LToriginalus URLAr reikia JavaScript redirect’o
No paramsLietuvaChromelt-LTnukirpti fbclid/utmAr campaign tokenai būtini
Repeat visitLietuvatas pats profilelt-LToriginalus URLAr po kelių kartų užsidaro scam turinys

Iš šitos pusės svarbu ne vienas testas, o jų (testų) koreliacija. Jei curl gauna 1.2KB HTML su tuščiu <body>, Googlebot gauna kažkokį low-quality naujienų puslapį, LT mobile profilis gauna fake investicinį puslapį su forma.. galim sakyt, kad turim cloacking.

Šiaip dar ką vertėtų lygint tai:

1
2
3
4
5
6
7
8
# HTML dydžiai
wc -c baseline.html chrome_lt.html bot.html 

# Hash'ai, jeigu norim greitai pamatyti ar turinys identiškas
sha256sum baseline.html chrome_lt.html bot.html

# Greitas title / redirect / JS artefaktų grep'as
grep -Eoi "<title>.*</title>|window.location|document.location|location.href|setTimeout|atob|eval|gtm|f

Jei vieno profilio HTML turi form, phone, firstname, lastname, submit, pixel, fbq, gtm (žinau keiksmažodžiai..), o kito profilio HTML yra tuščias arba rodo random blogą (pvz mano), tai paranoją galima mest per langą, mes turim du veidus vienam puslapyje.

CTI testavimo matrica lygina, kokį atsaką svetainė pateikia skirtingoms tyrimo aplinkoms.


Ką konkrečiai lygint

Kai jau renkam tam tikrus evidence, neužtenka tik screenshot’o (šitas tinka tik vadovams ir Linkedin’ui), reikia ir šiokios tokios techninės analizės ir daugiau info.

Jei jau man tenka pagaudyt galimus cloacking.. renku artifaktus:

Artefaktai

ArtefaktasKodėl svarbu
Final URLParodo, kur realiai baigėsi redirect chain
HTTP status codes200/302/403/404 skirtumai tarp profilių rodo gating
Location headersPadeda matyti server-side redirect’us
HTML body sizeBlank vs full lander labai greitai matosi
Page titleFake news / investment template identifikavimas
CookiesGali būti naudojami session gating
localStorage/sessionStorageJS pagrįsti decision flag’ai
HAR filePilnas request/response medis
ScreenshotVizualinis brand impersonation įrodymas
JS failaiRedirect, fingerprinting, tracking logika
Form action endpointKur keliauja vartotojo duomenys
Tracking IDsGA/GTM/Meta Pixel/affiliate clustering
Referer chainAr vartotojas turi ateiti iš Facebook/Google ad
DNS/ASN/SSLInfrastruktūros pivoting

Čia jau vienas geriausių signalų yra ne domenas, o pasikartojanti logika. Domenai visi žinom, kad keičiasi/rotuojasi (tikiuosi visi žinom, jei ne tai nedėkokit už šitą info, čia po TLP:Amber paslėpta buvo), Landing pages keisis. Beeeettt.. kaip ir aname blog’e apie pivoting’ą minėjau operatoriai dažnai palieka tą patį redirect pattern’ą, tą patį JS fragmentą, tą patį form field naming, tą patį GTM containerį, tą patį affiliate parametrą arba tą pačią path struktūrą (palieku tą didelį TLP:Amber apačioje, kas neskaitėt)

Kitaip sakant.. IOCs miršta, o TTP gyvena toliau.

Tyrimo darbo vietoje vienu metu analizuojami svetainės kodas, srautas ir puslapio vaizdas.


Pagrindinės cloaking technikos

Viršuje jau išvardinau pagrindines technikas mandrame table, o dabar einam prie kaip kas kur ką.

Čia mistikos nelabai daug yra, cloacking nėra kažkoks super elitinis “APT Magic”, tai žemiški (ir daug ko naudojami) web kontrolės sluoksniai tik sujungti į vieną decision varykliuką.

Geo/IP based cloacking.
Serveris tikrina, iš kokios šalies ateina lankytojas. Jei lankytojas iš Lietuvos (čia visur imsiu Lietuvą, lengviau suprąst bus) tai jam rodomas fake Delfi / Ignitis / Orlen / Investment puslapis. Jei lankytojas iš JAV ar kokio cloud datacenterio jam rodomas blank puslapis, harmless blogas arba low-quality random puslapis.

Šitoje vietoje labai patogu scameriams, nes daug security vendor’ių, sandbox’ų ir ad review sistemu veikia iš cloud infros arba iš regionų, kurie nėra jų kampanijos taikinys, todėl scanneriai mato nieko, o realūs žmonės pakliūna į scam.

ASN / Hosting reputation filteringŠitoje vietoje įsijungia ne tik šalis, o tinklo tipas. Serveris gali tikrinti ar lankytojo IP priklauso AWS, Google Cloud, Microsoft Azure, DigitalOcean, OVH, Hetzner, VPN provider’iui (ypač kai VPN provideriai viešai skelbia savo IPs) ar kažkokiam žinomam security vendor’iui.

Jei IP atrodo kaip analitiko arba scannerio aplinka tai rodomos harmless turinys.
Jei IP atrodo kaip residential arba mobile user’is tai rodomas tikras puslapis.

Dėl to vien “patikrinau per VPS” dažnai reiškia, kad “patikrinau taip, kaip attacker’is tikėjosi, kad tikrins researcheris”.

User-Agent filtering
Čia jau klasika. Serveris arba JavaScript žiūri ar lankytojas ateina su realistišku Chrome/Safari/Firefox User-Agent ar su curl, python-requests, HeadlessChrome, GoogleBot, BingBot, facebookexternalhit, Go-http-client ir panašūs mandri pavadinimai.

Keli pavyzdžiai:

1
2
3
4
curl/8.0 → blank page
Googlebot → facade page
Chrome on Windows → fake article
Mobile Chrome on Android → fake investment form

Čia dažnai visi tyrimai prasideda ir susimauna ties curl, gauna blank page ir tuo pasibaigia.

JavaScript rednering gateKai kuriuose puslapiuose pirminis HTML beveik tuščias, tikrasis turinys atsiranda tada kai jau pasileidžia JavaScript.

Taiiii reiškia, kad statinis scanneris matys:

1
2
3
4
5
<html>
    <body>
        <script src="/assets/app.js"></script>
    </body>
</html>

O realiai browseris po kelių sekundžiu jau turi pilną DOM su fake straipsniu, forma, tracking pixeliais ir redirect’u.

Toooodėėėlll.. Playwright/Chomium arba kiti browser-rendered collection tampa būtini. Ne dėl visiem taip mėgstamo fancy automation, o todėl, kad modernesnis scam turinys dažnai neegzistuoja statiniam HTML.

Headless browser detection
Kai operatoriai nori būti dar labiau erzinantys (šitie mane labiausiai nervina jei ką), jie tikrina, ar browseris atrodo automatizuotas..

Tipiniai signalai:

1
2
3
4
5
6
7
8
9
10
navigator.webdriver
navigator.plugins.length
navigator.languages
screen.width / screen.height
WebGL vendor / renderer
canvas fingerprint
timezone
fonts
mouse movement
touch support

Jei jau puslapis “mato”, kad browseris headless arba “per daug švarus”, gali rody fake puslapį, todėl čia jau tiklas nėra “nulaužiam” cloaking’ą, o susikuriam kelis skirtingus rinkimo profilius ir dokumentuojam, kaip turinys keičiasi pagal aplinkas.

Čia nereik jau patapt developeriu automatizacijos magistru ir kurt kažkokius stealth bypass framework’us kaip scammerių QA. Reliai užtenka emuliuoti realaus vartotojo sąlygas ir rinkt skirtumus.

Referer / ad-click gating
Kai kurios kompanijos tikrą landing page rodo tik tada, kai vartotojas ateina iš reklamos.

Kaip pvz:

1
facebook.com → l.facebook.com → tracking URL → cloaking gate → fake article

Jei tą patį URL atidarom per tiesiogiai browser’į, be referer ir be campaign parametrų galim gaut blank page.. O kodėl per Ads’us leidžia.. Nuostabus dalykas tas telefonas, nueini į scam puslapį tarkim Delfi, o pačio URL tai nerodo labai gerai.

Čia jau svarbu išsaugot originalų URL su visais parametrais:

1
2
3
4
5
6
7
8
9
10
fbclid
gclid
utm_source
utm_campaign
utm_content
ad_id
campaign_id
affiliate_id
subid
clickid

Jei nevyniojant į vatą labai tai būtent clickid arba subid gali būt raktas į tikrą scam puslapį, nukripai šituos .. nebėr puslapio.

Cookie / session gating
Kai kurios sistemos sprendžia pagal tai, ar vartotojas jau lankėsi ankščiau.. tai yra:

1
2
3
4
5
6
Pirmas kartas - scam.
Antras kartas - scam
...
Penktas kartas - netikras puslapis.
..
Dešimtas kartas - tuščias (blank) puslapis.

Kodėl? Elementaru Vatsonai.. Nes tyrėjas dažnai kartoja testus, realus vartotojas dažniausiai ateina vieną ar du kartus. Per dažnai apsilankai iš to pačio profilio reiškia signalas sukčiam, kad čia jau nebe būsima auka (o Deividas už ekrano :(.. ).

Dėl to realiai kiekvienam tokiam didesniam tyrimui ar research kur darau naudoju švarias sesijas, ir jas realiai reiktų..

1
2
3
4
5
6
naujas browser context
nauji cookies
naujas localStorage
naujas profile
atskiras HAR
timestamp kiekvienam bandymui

Timing delayKai kurie puslapiai ne taip greit kraunasi.. t.y. neskuba, jei palaukia 5, 10, 15 ar 30 sekundžiu (ilgiausiai teko matyt 34 sekundas) ir redirect vyksta tik po scroll, mouse move arba elementaraus click.

Kas vyduje vyksta tai scanneris, kuris laukia 3 sekundes ir uždaro puslapį nieko nemato, žmogus, kuris realiai skaito fake straipsnį, po 10 sekundžių yra nukreipiamas į registravimo formą.

Čia jau reiktų jai jau naudojam Playwright’ą tai užmęst ilgesnį wait:

1
2
page.goto(target, wait_until="networkidle", timeout=45000)
page.wait_for_timeout(15000)

O išvis tobula fiksuot DOM keliais laiko komentais:

1
2
3
4
for i in [3, 10, 20]:
    page.wait_for_timeout(i * 1000)
    (out / f"{prof['name']}_{i}s.html").write_text(page.content(), encoding="utf-8")
    page.screenshot(path=str(out / f"{prof['name']}_{i}s.png"), full_page=True)

Matosi kaip puslapis keičiasi po delay ar išvis keičiasi.

Path-based landers
Grįžtant prie WeRedirect atvėjo tai gan įdomi vieta yra path struktūra. Domenas atrodo kaip random low-quality puslapis, bet konkretus path aktyvuoja scam template.

Pavyzdžiui:

1
2
3
4
example[.]com/lander/lt9-vlad/
example[.]com/lander/se1-vlad/
example[.]com/igns/
example[.]com/oil-profit/

Čia nereiktų bruteforcint path’ų, o analizuot jau viešai matomus path’us iš reklamų, social įrašų, HAR failų, URLscan, public sandbox rezultatų ir panašiai.

Jei keli skirtingi domenai turi tą pačią path struktūra, tą patį naming convention arba tą patį DOM template galim sakyt, kad turim clustering’ą.

Facade pages
Facade page yra puslapis, kuris egzistuoja tik tam, kad atrodytų normaliai (čia kaip aš darbo meet’uose be Dragon Ball maikės, o su normalia). Dažnai čia būna prastos kokybės naujenų puslapiai, gyvenimo būdo ar dar kažkoks e-commerce puslapis.

Dažniausia tokie puslapiai turi:

1
2
3
4
5
6
7
8
9
10
random straipsnius
neveikiančias kategorijas
copy-paste tekstus
generic stock images
fake author names
netikrą footerį
jokio realaus brand history
prastą kalbą
daug tracking
keistą domain age

Šių puslapių tikslas yr paprast, kai Meta reviewer’is, scanneris arba researcheris atidaro puslapį, jis mato kažką, kas nėra akivaizdus scam. Nuuuu ne gerą puslapį, o tiesiog pakankamai neblogą, kad nebūtų iškart domentas nušautas ar scam kompanija.


Kaip atrodo realus tyrimo flow

Praktiškai tyrimas gali atrodyt taip:

1
2
3
4
5
6
7
8
9
10
11
1. Randam fake Facebook ad arba gaunam pranešimą iš vartotojo
2. Išsaugom screenshot’ą ir originalų URL su visais parametrais
3. Patikrinam Meta Ad Library / social page istoriją
4. Atliekam passive DNS / WHOIS / CT / ASN analizę
5. Paleidžiam differential fetch per kelis profilius
6. Surenkam HAR, HTML, screenshot’us ir final URL
7. Lyginam turinio skirtumus tarp profilių
8. Ištraukiam form endpoints, JS artefaktus, tracking IDs
9. Pivotinam per domenus, SSL, favicon, ASN, path’us, DOM similarity
10. Paruošiam IOCs
11. Reportinam platformai / brandui / CERT-LT / OpenPhish / ScamAdvisor / GSB ar dar kažkam

Mano akim čia labai paprastas flow ir truputi atskiria “aš radau scam puslapį” nuo “aš atlikau tyrimą ir nustačiau, kad čia scam”.

Įtartino peradresavimo grandinė nuo reklamos ir sutrumpintos nuorodos iki sukčiavimo puslapio.


Techniniai indikatoriai, kurie yra verti dėmesio

Jei jau daryčiau (nesakau, kad dabar nedarau) panašau scam tipo kompanijos analizę, IOC lentelėje neitų vien domenai.. Domenai miršta greit, reikia priplaukt prie platesnių indikatorių.

Artefaktai

IOC / artefaktasPavyzdysKam naudinga
Domainfake brand / news domainblokavimui, takedown
URL path/lander/lt…, /igns/template clustering
RegistrarNamecheap, Tucows, kitiregistration pattern
Nameserverpasikartojantys NSinfrastructure grouping
ASNhosting / CDNblokavimui ir pivoting
SSL certSAN, issuer, validitycertificate pivoting
HTML titlefake news headlinecontent clustering
OG tagsog:title, og:imagesocial preview abuse
JS hashredirect / fingerprint scriptcampaign clustering
Favicon hashcopied brand faviconbrand impersonation detection
Form actionendpoint collecting leadsbackend mapping
Tracking IDGTM/GA/Meta Pixeloperator / affiliate link
Affiliate paramssubid, clickid, affidmonetization chain
Social page IDfake page / renamed pagedistribution layer
Ad creativeheadline/image/copysocial engineering narrative
Screenshotfake brand evidencereporting and takedown

Čia reiktų pabrėžt, kad domenas yra vienkartinis. Tracking ID, form endpoint, JS hash arba path convention dažnai gyvena žymiai ilgiau.

Infrastructure clusteringInfrastructure clustering šitoje temoje yra labai svarbus, nes operatoriai dažnai kuria daug vienkartinių domenų. Jei žiūrim tik į vieną URL, matom vieną scam. Jei pivotinam, galim pamatyti visą kampaniją.

Domenų registracijos laikasJei 20 domenų sukurti per tą pačią savaitę, naudojant tą patį registratorių ir panašų naming pattern, tai jau signalas.

Nameservers
Tie patys nameserveriai tarp kelių brand impersonation domenų gali rodyti bendrą operatorių arba tą patį setup’ą.

Certificate TransparencyCT logs leidžia pamatyti, kokie sertifikatai buvo išduoti domenams. Jei viename sertifikate yra keli susiję SAN įrašai arba keli domenai turi labai panašų issuance pattern, galima pivotinti toliau.

Favicon hashJei scammeriai kopijuoja brand puslapį, jie dažnai nukopijuoja ir favicon. Favicon hash leidžia ieškoti kitų puslapių, kurie naudoja tą patį vizualinį artefaktą.

HTML/DOM similarityLabai stiprus metodas. Net jei domenai skirtingi, template gali būti tas pats:

1
2
3
4
5
6
7
8
tas pats header layout
tie patys CSS class names
tie patys fake comments
tas pats footer
tie patys form field names
tas pats countdown timer
tas pats review block
tas pats JavaScript redirect pattern

Tracking IDs
J
eigu keli puslapiai turi tą patį GTM, GA, Meta Pixel, TikTok Pixel ar affiliate tracking ID, tai vienas stipriausių clustering indikatorių.

Aišku, reikia atsargumo: kartais tas pats third-party script gali būti bendras ir benign. Bet jei kartu sutampa domenų amžius, path struktūra, fake brand theme ir form endpoint’ai turim gan stiprų signalą.

Form edndpointsInvestment scams dažnai turi lead collection mechanizmą. Puslapio forma gali siųsti duomenis į:

1
2
3
4
5
6
/api/register
/lead
/send.php
/form.php
/api/v1/lead
/crm

Jei keli skirtingi fake brand landeriai siunčia duomenis į tą patį endpointą arba panašų backend pattern we got jackpot.

Cloaking metodai išdėstyti aplink turinio parinkimo mechanizmą.


Monetizacija.. Kur ji?

Svarbu suprasti, kad WeRedirect tipo kampanijoje gali būti keli dalyviai. Nebūtinai tas pats žmogus kuria fake Facebook page, perka ads, rašo fake straipsnį, hostina landerį, valdo CRM ir skambina aukai.

Dažniausiai ekosistema yra tokia:

1
2
3
4
5
6
7
8
9
10
11
Traffic buyer / ad operator
  ↓
Cloaking / redirect operator
  ↓
Fake news / landing page template
  ↓
Affiliate / lead buyer
  ↓
Scam call center / fake broker
  ↓
Victim monetization

Čia dėl to ir atsiranda affiliate parametrai: subid, clickid, affid, utm_campaign. Jie padeda operatoriams suprasti, kuris traffic source atnešė auką. Kitaip tariant, net scam turi savo performance marketing’ą (niekur nepabėgsi nuo corporate nesąmonių..). Nes, aišku, jei jau vagi pinigus, tai norisi attribution modelio.

Kaip čia pasakius… Marketingas, tik su baudžiamuoju kodeksu.


MITRE ATT&CK mapping

Pabrėšiu čia, kad tai nėra tobulas ATT&CK pritaikymas, nes MITRE yra labiau orentuotas į intrusion lifecycle, o čia kalbam apie fraud/malvertising ekosystemą. Bet ATT&CK stiliaus smegenys mano truputi padeda strukturizuot TTP.

Galimas mapping

TaktikaTechnika / analogasKaip pasireiškia
ReconnaissanceSearch Open Websites/DomainsBrandų, žiniasklaidos, viešų asmenų pasirinkimas
Resource DevelopmentAcquire InfrastructureDomenai, hostingas, redirect infrastruktūra
Resource DevelopmentEstablish AccountsFake Facebook paskyros, reklamos account’ai
Resource DevelopmentDevelop CapabilitiesCloaking logic, lander templates
Initial Access / DeliveryPhishing / Malvertising analogasPaid ads su fake news lure
Defense EvasionMasqueradingFake Delfi/LRT/Ignitis puslapiai
Defense EvasionImpair Defenses analogasScannerių/ad review apėjimas per cloaking
Command and Control analogasWeb Service / Redirector logicRedirect chain ir campaign routing
CollectionInput Capture analogasFormos, lead collection
ImpactFinancial Theft / FraudFake investment scam monetizacija

Kill Chain

Kompanijos realiai turi gan panašius kill chain’us, ir juos aprašyt galima kažkaip panašiai:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. Brand / narrative selection
   Pasirenkamas žinomas brandas, naujienų portalas arba viešas asmuo.
2. Infrastructure setup
   Registruojami domenai, paruošiami nameserveriai, SSL, hostingas, CDN/proxy.
3. Content templating
   Sukuriamas fake article, fake comments, fake investment page, fake reviews.
4. Social distribution
   Sukuriamos arba perimamos Facebook paskyros, paleidžiamos reklamos.
5. Cloaking gate
   Serveris/JS sprendžia, ką rodyti pagal IP, UA, referer, cookies, locale.
6. Victim routing
   Tinkamas vartotojas nukreipiamas į lokalizuotą fake news/investment flow.
7. Lead capture
   Forma renka vardą, telefoną, el. paštą, kartais kitus finansinius duomenis.
8. Monetization
   Auką perima fake broker / call center / scam operatorius.
9. Rotation
   Domenai, reklamos, paskyros ir landeriai keičiami, kai prasideda blokavimai.
10. Reuse
   Tas pats template pritaikomas kitai šaliai, kitam brandui, kitai istorijai.

Sukčiavimo kampanijos grandinė nuo reklamos iki aukos duomenų perdavimo operatoriui.


Rizikos

Kaip gi be truputi streso ir kaip gi organizacijoms duodamos rizikos.

Pirma. Reputacinė. Jei vartotojas mato tavo logotipą fake investicinėje reklamoje, jam nebūtinai aišku, kad tu nesi kaltas. Brand impersonation visada kerta per pasitikėjimą.

Antra. Klientų apsauga. Bankai, energetikos įmonės, kurjeriai, valstybės institucijos ir žiniasklaida dažnai tampa tokio tipo scamų “pasitikėjimo donorais”. Sukčius neturi kurti pasitikėjimo nuo nulio. Jis tiesiog pavagia tavo brandą.

Trečia. Incident response ribos. Daug organizacijų vis dar galvoja, kad jei incidentas nevyksta jų infrastruktūroje, tai “ne mūsų incidentas”. Techniškai gal ir taip. Reputaciškai jau nebe.

Ketvirta. Jei tavo brand monitoring vendor tikrina URL iš vieno cloud regiono, jis gali nematyti cloaked turinio. Tada gauni gražią ataskaitą, kad viskas švaru, o vartotojai tuo metu pildo fake investment formas.

Čia ir yra nemaloni pamoka. Brand abuse monitoring be cloaking-aware collection yra pusiau aklas.

Tas pats URL veda į skirtingą turinį aukai, tyrėjui ir reklamos platformai.


Sources

  1. Debunk Part I Išorinis šaltinis
  2. Debunk Part III Išorinis šaltinis
  3. Varonis Išorinis šaltinis
  4. NordVPN Išorinis šaltinis
  5. ZeroFox Išorinis šaltinis
  6. HUMAN Security Išorinis šaltinis

Sekite tyrimus

Nauji tyrimai be sekimo technologijų

Prenumeruokite kalbos RSS srautą arba sekite Deividą „LinkedIn“. HECAVEX nenaudoja reklamos sekiklių ar rinkodaros pikselių.

This post is licensed under CC BY 4.0 by the author.