Network Attacks

...

SU

Kiber Xavfsizlik Tarmoq Hujumlari

Tarmoq Hujumlari

Tarmoqda joylashtirilgan protokollar va ilovalarga hujumlar ko'pdir. Veb-ilovalar ushbu kursning o'z bo'limida ko'rib chiqiladi.

Xizmatlarda ularga hujum qilishga imkon beradigan ichki xatolar bo'lishi mumkin. Bu hujumlar odatda operatsion tizimga, zaif xizmat orqali, maxsus buyruqlar yuborishni o'z ichiga oladi, bu esa tarmoq xizmatini boshqarish uchun ishlatiladigan jarayonni boshqarishga olib keladi. Buffer Overflow'lar bunday hujumlarning bir kategoriyasidir.

Tarmoq odatda ko'plab ilovalarga ega bo'lib, ba'zilari oddiy login tizimlari, boshqalari esa murakkab funksionallikka ega. Hujum yuzasini ko'rib chiqish va osongina ekspluatatsiya qilinadigan zaifliklarni aniqlash uchun bir usul, maqsad muhiti ichidagi barcha aktivlarni port skanerlash va ularni skrinshot qilishdir.

EyeWitness (https://github.com/FortyNorthSecurity/EyeWitness) kabi vositalar bu jarayonni amalga oshiradi. Ushbu vosita tarmoqda qanday aktivlar mavjudligini tezda ko'rib chiqishga imkon beradi, keyin esa har bir xizmatning skrinshotlarini taqdim etadi. Skrinshotlar yordamida tizimlarni tezda ko'rib chiqish va qaysi tizimlarni yaqindan ko'rib chiqishimiz kerakligini baholash mumkin.

Xizmatni ekspluatatsiya qilish degani, xizmatni u mo'ljallanmagan tarzda ishlatishdir. Ko'pincha bu ekspluatatsiya faoliyati hujumchilarga o'z kodlarini ishlatishga imkon beradi, bu esa RCE ("Remote Code Execution") deb ataladi.

Buffer Overflow

Tarmoq xizmatlarini ekspluatatsiya qilish ba'zida ilovaning xotira boshqaruvi funktsiyalaridan foydalanishni o'z ichiga oladi. Xotira boshqaruvi? Ha, ilovalar kompyuterning xotirasida ma'lumotlarni ko'chirishga muhtoj bo'ladi, shunda ilova to'g'ri ishlaydi. Dasturlash tillari ishlab chiquvchiga xotirani boshqarishni nazorat qilish imkonini berganda, Buffer Overflow kabi muammolar yuzaga kelishi mumkin. Shunga o'xshash ko'plab zaifliklar mavjud va bu bo'limda Buffer Overflow'larni ko'rib chiqamiz.

C va C++ dasturlash tillari ishlab chiquvchilarga xotirani boshqarishni juda ko'p nazorat qilish imkonini beradi. Bu apparat bilan juda yaqin ishlashni talab qiladigan ilovalar uchun juda ideal, ammo zaifliklarni ochib beradi. Java, JavaScript, C#, Ruby, Python va boshqa dasturlash tillari ishlab chiquvchilarga bu xatolarni qilishni osonlikcha ruxsat bermaydi, bu esa Buffer Overflow'larni ushbu tillarda yozilgan ilovalarda kamroq ehtimolga olib keladi.

Buffer Overflow'lar sanitizatsiya qilinmagan ma'lumotlar o'zgaruvchilarga joylashtirilganda sodir bo'ladi. Ushbu o'zgaruvchilar operatsion tizimda Stack deb ataladigan xotira tuzilmasi orqali ifodalanadi. Hujumchi keyin Stackning Return Pointer deb ataladigan qismiga yozib qo'yishi mumkin.

Eslatma: Stack xotira tuzilmasi dastur o'zgaruvchilar va uni ishlatish uchun zarur bo'lgan ma'lumotlarni saqlaydigan joydir. Stack kompyuterning RAM ("Random Access Memory") ichida joylashgan bo'ladi. Return Pointer CPU ("Markaziy Protsessor Bloki") qayerda keyingi kodni bajarishi kerakligini belgilaydi. CPU tizim qaysi ko'rsatmalarni bajarishi kerakligini nazorat qiladi. Return Pointer shunchaki xotirada bajarilishi kerak bo'lgan manzildir. CPU doimiy ravishda qayerda kod bajarilishini bilishi kerak, va Return Pointer bu imkoniyatni taqdim etadi.

Agar hujumchi Return Pointer'ni boshqara olsa, bu hujumchi CPU qaysi ko'rsatmalarni bajarishi kerakligini boshqarishi mumkinligini anglatadi!

Masalan, quyidagi C kodini ko'rib chiqing (C dasturchisi bo'lishingiz shart emas, lekin ushbu oddiy ilova nima qilayotganini tushunishga harakat qiling):

#include <string.h>
void storeName (char *input) {
  char name[12];
  strcpy(name, input);
}
 
int main (int argc, char **argv) {
  storeName(argv[1]);
  return 0;
}

Ko'plab dasturlash tillarida, shu jumladan C tilida, ilova main deb ataladigan funktsiya ichida boshlanadi. Yuqoridagi kodda int main (int argc, char **argv) qismida bu ko'rsatilgan. Qavslardagi { va } ichida dastur shunchaki storeName(argv[1]); deb nomlangan funktsiyani ishga tushiradi. Bu shunchaki foydalanuvchi tomonidan dasturga kiritilgan narsani qabul qiladi va uni storeName funktsiyasiga uzatadi.

Ilova 11 qator koddan iborat, lekin strcpy(name, input); deb yozilgan qatorga e'tibor bering. Bu funktsiya matnni input'dan olib, name deb ataladigan o'zgaruvchiga yozishga harakat qiladi. Name maksimal 12 ta belgini saqlashi mumkin, bu char name[12]; qatorida ko'rsatilgan. Name o'zgaruvchisi 12 belgidan ortiq bo'lishi mumkinligini oldini oladigan joy bormi? Name o'zgaruvchisi foydalanuvchi tomonidan kiritilgan bo'lib, to'g'ridan-to'g'ri storeName funktsiyasiga uzatiladi.

Ushbu ilovada kiritilgan qiymat uzunligini tekshirish yoki tozalash yo'q, bu esa kiritilayotgan qiymatning ilova kutganidan kattaroq bo'lishiga olib kelishi mumkin. Name o'zgaruvchisi 12 ta belgini saqlaydi, lekin CPU 12 belgidan ortiq bo'lgan qiymatni yozishga urinayotganda nima sodir bo'ladi? CPU o'zi buyurilgan narsani bajaradi va kerak bo'lganicha ko'p xotiralarni o'chiradi!

Kutilganidan kattaroq qiymat yozishga urinish qilinganida, CPU hali ham bu qiymatni xotiraga yozishga harakat qiladi. Bu esa CPU boshqa xotiradagi narsalarni, masalan, Return Pointer'ni o'chirib qo'yishiga olib keladi va hujumchilar CPU'ni boshqarishga imkon beradi. Yana bir bor, agar hujumchi Return Pointer'ni boshqarib, CPU'ni qaysi kodni bajarishini nazorat qilsa, bu hujumchi kodni to'liq nazorat qilgan bo'ladi.

Quyidagi grafik misolda Alice o'z nomini yuqoridagi misolda ishlatgan ilovaga yozayotganini ko'rsatamiz:

Ping Sweep

Alice o'zini yaxshi tutadi va ilovaning to'g'ri ishlashiga sabab bo'ladigan ismini taqdim etadi. U o'zining Alice ismini beradi va bu shunchaki ilovaning xotirasiga yoziladi.

Ammo Eve ilovaga juda ko'p belgilar yuboradi. Shunda nima sodir bo'ladi? CPU uning kiritgan qiymatini olib, uni xotiraga yozadi va mavjud bo'lgan boshqa qiymatlarni ham o'chirib yuboradi!

Ping Sweep

Eve ning kiritgan ma'lumotlari CPU dan kutganidan ancha ko'proq ma'lumotlarni yozishga sabab bo'ldi va qaytish ko'rsatkichini ("return pointer") o'chirib tashladi. CPU keyingi ko'rsatmani bajarishga urinayotganda, u endi AAAAAAA... joylashgan manzildagi kodni bajarishni aytiladi.

Agar Eve ushbu serverni nazorat qilishni istasa, A harflarini yozish o'rniga, CPU tushunadigan kodni xotiraga kiritishi kerak bo'ladi. Keyin u qaytish ko'rsatkichiga qiymat berib, CPU ga Eve ning o'z kodini bajarishni buyuradi.

Eslatma: Soddalashtirilgan tarzda aytganda, buffer overflow hujumlari hujumchilarga qurbonning xotirasini ehtiyotkorlik bilan o'chirib, uning CPU sini nazorat qilish imkonini beradi. Vulnerability skanerlar Vulnerability skaner tarmoq bo'ylab dasturiy ta'minot va konfiguratsiyalardagi keng tarqalgan zaifliklarni avtomatik ravishda izlaydi. U yangi turdagi zaifliklarni topish uchun mo'ljallanmagan, balki xizmatlarni skanerlash uchun oldindan belgilangan plaginlar (yoki modullar) ro'yxatini ishlatadi. U albatta nol kunlik zaifliklarni qidirmaydi! Nol kunlik zaiflik - bu dasturiy ta'minot ishlab chiqaruvchisi va himoyachilarga ilgari noma'lum bo'lgan yangi zaiflik bo'lib, bu muammo uchun hozirgi kunda hech qanday yamoq mavjud emas.

Skanerlarda tarmoq xaritalash va portlarni skanerlash funksiyalari mavjud, jumladan ularni o'rganish va duch keladigan turli xil dasturlarda zaifliklarni topish imkoniyatlari ham mavjud.

Vulnerability skaner ko'pincha tizimlarga autentifikatsiyasiz kirishdan ko'ra, tizimlarga kirish va ularni baholash uchun foydalanuvchi ma'lumotlarini kiritish imkonini qo'llab-quvvatlaydi.

Eslatma: Vulnerability skanerlar asosan ma'lum zaifliklar va noto'g'ri konfiguratsiyalarni qidiradi, nol kunlik zaifliklarni emas! Kodni bajarish Hujumchilar ekspluatatsiya qilish imkoniyatiga ega bo'lgan zaiflikni topgandan so'ng, ular qanday payload ishlatishni hal qilishlari kerak. Payload - bu hujumchi ekspluatatsiya orqali yetkazmoqchi bo'lgan koddir.

Hujumchi foydalanishi mumkin bo'lgan bir nechta payload misollari:

Hujumni boshqarish serveriga ("Command and Control" yoki C2) buyruqlarni qabul qilish uchun qurbonni ulash Tizimda yangi orqa eshik ("backdoor") foydalanuvchi hisobini yaratish, hujumchi keyinchalik undan foydalanishi mumkin Hujumchini tizimni masofadan boshqarishi uchun grafikli foydalanuvchi interfeysini ("GUI") ochish Hujumchi buyruqlar yuborishi mumkin bo'lgan terminal yoki shell olish Hujumchilar tomonidan keng tarqalgan payloadlardan biri bind-shell bo'lib, u qurbonni portga tinglashni majbur qiladi va hujumchi ulanganida shell oladi.

Ping Sweep

Firewaller hujumchilarning qurbonlarga ulanib olishiga yo'l qo'ymaslikda foydali. Agar port ruxsat etilmagan bo'lsa, firewall qurbonning kiruvchi ulanishlarini samarali ravishda rad etadi. Faqat bitta dastur portga tinglashi mumkin, shuning uchun hujumchilar ushbu xizmatni o'chirmasdan foydalanilayotgan portga ulana olmaydi.

Ushbu himoya choralarini aylanib o'tish uchun hujumchilar qurbonni hujumchiga ulanishga majbur qiladilar, qurbonni payload ("zararli kod") ga kirish uchun xizmat qilishga majbur qilishadi. Ko'pgina firewaller, afsuski, chiqish ("egress") trafigini rad qilish uchun sozlanmagan, bu esa ushbu hujumni hujumchilar uchun juda qo'llaniladigan qiladi.

Ushbu misolda hujumchi teskari shell ("reverse-shell") yordamida qurbonni hujumchiga ulanishga majbur qiladi.

Ping Sweep

Eslatma: Kod bajarilishi degani hujumchilar o'z kodlarini qurbonning tizimida ishga tushirishi mumkinligini anglatadi. Qaysi kodni ishlatishni tanlash hujumchilarga bog'liq, ammo ko'pincha ular qurbonning tizimida uzoq muddat davomida buyruqlarni bajarish usuliga ega bo'lishni xohlashadi.

Tarmoqni kuzatish Hujumchilar ko'p hollarda masofadan boshqarish uchun tarmoqqa ehtiyoj sezishadi. Agar hujumchilar nishonni masofadan boshqara olsalar, bu odatda Command and Control ("C&C" yoki "C2") kanali orqali amalga oshiriladi.

Ba'zi hollarda C2 kanalini talab qilmaydigan, payloadlar bilan oldindan dasturlangan zararli dastur orqali amalga oshirilgan hujumlar mavjud. Bunday zararli dasturlar hatto tarmoqqa ulanmagan ("air-gapped") tizimlarni ham buzishga qodir.

Kompromislani aniqlash ko'pincha C2 kanalini topish orqali amalga oshiriladi. C2 har qanday shaklda bo'lishi mumkin, masalan:

  • HTTPS yordamida hujumchi serverlari bilan aloqa qilish. Bu C2 ni tarmoqda oddiy ko'rib chiqish kabi ko'rsatadi.
  • Avtomatik ravishda xabarlarni joylashtirish va o'qish uchun ijtimoiy tarmoqlardan foydalanish
  • Qurbonlarga buyruqlar qo'shish va tahrirlash uchun Google Docs kabi tizimlardan foydalanish.
Ping Sweep

C2 uchun faqat hujumchining zukkoligi cheklov bo'lishi mumkin. Hujumchilarning aqlli C2 kanallarini qanday to'xtatish haqida o'ylaganimizda, biz ko'pincha tarmoqdagi statistik anomaliyalar va farqlarni aniqlashga tayanishimiz kerak bo'ladi. Masalan, tarmoq monitoringi vositalari quyidagilarni aniqlashi mumkin:

  • C2 tomonidan ishlatiladigan uzoq muddatli ulanishlar, lekin bu protokol uchun tabiiy emas. HTTP shularning biridir, unda uzoq ulanishlar odatiy emas, ammo hujumchi masofadan boshqarish uchun uni ishlatishi mumkin.
  • Beakonlar - bu C2 tomonidan qurbonning tirik va buyruqlar uchun tayyorligini ko'rsatadigan signal. Beakonlar ko'p turdagi dasturlar tomonidan ishlatiladi, faqat hujumchilar emas, lekin qaysi beakonlar mavjudligini bilish va ularni kutish yaxshi amaliyotdir.
  • Tarmoqdan to'satdan kelayotgan katta ma'lumot oqimlari. Bu ilovadan katta yuklash yoki hujumchi tomonidan ma'lumotlarni o'g'irlashni ko'rsatishi mumkin. Qaysi ilova va foydalanuvchi bunday ma'lumot oqimini keltirib chiqarmoqda va bunga qanday kontekst berish kerakligini tushunishga harakat qiling. Bu odatiy holmi yoki yo'qmi?

Himoyachilar anomaliyalarni topishga harakat qilishlari uchun ko'plab usullar mavjud. Ushbu anomaliyalar ma'lumotlarni uzatayotgan manba tizimidagi ma'lumotlar bilan yanada bog'lanishi kerak.

Tarmoq monitoringi uchun ma'lumotlarning shovqinini ajratib olish uchun kontekst qo'llanishi kerak. Bu shuni anglatadiki, SOC ("Security Operations Center") ma'lumotlarni yanada qimmatli qilish uchun masalan, manba va manzil IP manzillari bilan bog'liq kontekstni boyitishga harakat qilishi kerak.

Kontekst qo'llashni quyidagi ssenariy bilan tasvirlash mumkin: Internetdan hujum keladi, ammo u Windows xizmatiga qarshi Linux zaifligini ekspluatatsiya qilishga harakat qiladi. Odatda, bu shovqin sifatida qabul qilinadi va xavfsiz e'tibordan chetda qoldirilishi mumkin. Ammo, hujum qilayotgan IP manzil sizning o'zingizning tarmog'ingiz yoki ishonchli provayderingizdan bo'lsa-chi? Biz qo'llashimiz mumkin bo'lgan kontekst bizni hujumni yanada chuqurroq o'rganish uchun qimmatli tushuncha beradi. Axir, biz ishonchli tizimlarimiz hujumlarni ishga tushirayotganini istamaymiz!

P2P (Peer-to-Peer) trafik Aksariyat tarmoqlar mijozi-server uslubida konfiguratsiya qilingan. Mijozlar ma'lumot olish uchun serverlarga murojaat qilishadi, va mijozlar o'zaro muloqot qilishlari kerak bo'lganda, odatda server orqali amalga oshiriladi.

Ammo hujumchi, ehtimol, peer-to-peer, ya'ni mijozdan mijozga, muloqotni ishlatmoqchi bo'ladi, past darajadagi zaifliklarni, masalan, qayta ishlatiladigan parollarni yoki zaif mijozlarni ekspluatatsiya qilish uchun.

Masalan, port 445, SMB tomonidan ishlatiladigan port, kompromisni aniqlash uchun yaxshi indikator hisoblanadi. Aksariyat muhitlarda mijozlar bir-birlari bilan SMB orqali gaplashmasligi kerak, ammo buzilish sodir bo'lganda, hujumchi ehtimol SMB-ni ishlatib boshqa tizimlarni buzishga harakat qiladi.

Ping Sweep

Tizimni kompromissiya qilishdan keyin hujumchi ushbu tizimni boshqa tarmoqlarga kirish uchun foydalanishi mumkin. Bu, kompromissiya qilingan tizimda firewall orqali ko'proq huquqlar mavjud bo'lsa yoki tizim boshqa tarmoqlarga, masalan, qo'shimcha tarmoq kartasi orqali kirish huquqiga ega bo'lsa, mumkin bo'ladi.

Pivoting - bu hujumchi kompromissiya qilingan xostdan boshqa tarmoqlarga kirish uchun foydalanadi. Buning tasviri quyida ko'rsatilgan, bu yerda Eve bir tizimni kompromissiya qilib, uni boshqalarni skanerlash va topish uchun ishlatmoqda:

Ping Sweep

Lateral Movement - bu pivotdan foydalanib boshqa tizimni ekspluatatsiya qilish harakatidir. Ushbu yangi tizim endi qo'shimcha pivoting va lateral movement uchun ishlatilishi mumkin. Ushbu misolda Eve Server X'dan foydalanib System B'ni qo'shimcha ravishda aniqlaydi.

Ping Sweep

Ushbu sahifada

GitHubda tahrirlash