Threat hunting s Osquery, Časť 2 – Riadenie a Kontrola

  • piatok, júl 16, 2021
Singel-post cover image

Časť 2 – Riadenie a Kontrola

Útočníci sa po úspešnom preniknutí do zariadenia snažia získať nad zariadením kontrolu (angl. Command & Control, C2) s cieľom využiť ju v ďalších fázach útoku. Veľmi často na tento účel útočníci spúšťajú škodlivé procesy, na hľadanie ktorých sa pozrieme v tejto časti našej série. Zvlášť ukážeme dopyty nápomocné pri identifikácii procesov s podozrivou sieťovou aktivitou, ktoré môžu útočníkovi slúžiť na jednoduchý opätovný prístup do zariadenia (backdoor). Dopyty z tohto blogu je potrebné spúšťať s administrátorskými privilégiami, inak môžu byť ich výsledky neúplné.

Viac o Osquery sa možete dočítať v krátkom článku, ktorý nájdete na našom blogu.

Bežiace procesy

Jedna z najčastejšie používaných Osquery tabuliek “processes” poskytuje množstvo informácie o práve bežiacich procesoch od základných, napríklad cesta ku spustiteľnému súboru, argumenty a PID až po podrobnosti typu využitia strojového času, veľkosti použitej pamäte, množstva dát zapísaných a prečítaných z disku. Nižšie uvedený dopyt predstavuje všeobecný základ, ktorý je možné upraviť podľa toho, aký typ podozrivej aktivity hľadáme. Navyše, demonštruje typické využitie Osquery pri integrácii dát s rôznych tabuliek. Prvé veci čo si treba vo výstupe všímať sú nezvyčajné argumenty interpreterov príkazov ako cmd, powershell, python, cscript a mená procesov bežiace z nezvyčajných priečinkov. Ako príklad uvedieme systémové spustiteľné súbory v akomkoľvek inom priečinku ako System32, prípadne SysWOW64. Za bližší pohľad stoja aj procesy bežiace z AppData, hoci tieto môžu byť aj legitímne. Pri každom procese sa oplatí skontrolovať v kontexte akého používateľa beží a aký je jeho nadradený proces.

Pri práci s relatívne krátkotrvajúcimi javmi je dôležité si uvedomiť možnosti a limitácie Osquery. Keď spustíme dopyt, vrátená informácia informuje o stave v danom okamihu. Pokiaľ proces začne aj skončí medzi dvoma Osquery dopytmi, v tabuľke “processes” ho nenájdeme.

SELECT 
    p.pid 
    p.path, 
    p.cmdline, 
    u.username, 
    datetime(p.start_time, "unixepoch"), 
    p.parent AS parent_pid, 
    p2.path AS parent_path 
FROM processes AS p 
    JOIN users AS u USING(uid) 
    JOIN processes AS p2 ON p.parent = p2.pid;

Počúvajúce porty

Tento Osquery dopyt vypíše informácie identifikujúce procesy počúvajúce na sieti. Pri prehliadaní výsledkov je potrebné klásť otázku, či je pre daný proces v poriadku počúvať a či použitý port je pre neho štandardný.

SELECT 
    lp.pid, 
    lp.port, 
    lp.protocol, 
    lp.address, 
    p.path, 
    p.cmdline
FROM listening_ports AS lp 
    JOIN processes AS p USING(pid); 

Otvorené sockety

Podobne ako dopyt z predchádzajúceho odseku, aj nižšie uvedený prináša informácie o procesoch počúvajúcich a komunikujúcich po sieti. Rozdiel je v tomto prípade v dopytovaní sa na otvorené sieťové sockety.

SELECT 
    s.pid, 
    p.path, 
    p.cmdline, 
    s.local_address, 
    s.local_port, 
    s.remote_address, 
    s.remote_port, 
    s.state 
FROM process_open_sockets AS s 
    JOIN processes AS p USING(pid); 

Haše

V prípade identifikovania podozrivého procesu, jeho spustiteľného súboru alebo iného súvisiaceho súboru je bežnou praxou skontrolovať jeho reputáciu v online databázach ako Virustotal, Hybrid-Analysis, Intezer a pod. Na jednoznačnú identifikáciu súborov sa v praxi využívajú ich hašové odtlačky. Osquery v tomto prípade prichádza na pomoc s nižšie uvedeným dopytom, kombinujúcim tabuľky “file” a “hash”. Haš súboru sa vypočítava na dopytovanom zariadení v momente obsluhovania dopytu a preto je nevyhnutná opatrnosť pri dopytovaní hašov viacerých súborov – môžeme tým značne zaťažiť dané zariadenie. V dopyte sú zahrnuté aj časové odtlačky súvisiace so súborom, ktoré sú veľmi užitočné pre rekonštrukciu časovej osi diania a koreláciu dát z iných zdrojov.

SELECT 
    f.path, 
    f.size, 
    datetime(f.atime, "unixepoch") AS access_time, 
    datetime(f.mtime, "unixepoch") AS modify_time, 
    datetime(f.ctime, "unixepoch") AS create_time, 
    h.sha256 
FROM file AS f 
    JOIN hash AS h 
WHERE h.path = f.path AND f.path = "<cesta_ku_suboru>"; 

Odkazy