شنود قانونی TLS: چطور یه آسیبپذیری در acme.sh میتونست کل عملیات رو پنهان کنه
خلاصهٔ کاملتر
در سال ۲۰۲۳ یه عملیات شنود ترافیک رمزنگاریشده روی سرویس جابینگ jabber.ru کشف شد — نه به خاطر مهارت محققان، بلکه چون مهاجم فراموش کرد گواهی TLS جعلیش رو تجدید کنه و کاربرها یه پیام خطای بزرگ دیدن. این ماجرا نشون میده که حتی عملیاتهای تخصصی هم به چیزهای کوچیک میلغزن.
همزمان با این بازه زمانی، یه آسیبپذیری اجرای کد از راه دور در acme.sh وجود داشت که به اسم CVE-2023-38198 ثبت شد. acme.sh یه اسکریپت شل هست که تجدید خودکار گواهیهای TLS از طریق پروتکل ACME رو مدیریت میکنه و معمولاً با دسترسی بالا اجرا میشه.
آسیبپذیری در فیلد Token چالش http-01 بود — یه CA مخرب به اسم HiCA داشت این حفره رو سوءاستفاده میکرد تا کد دلخواه روی سرور قربانی اجرا کنه. پیلود از تکنیکهای پیچیدهای مثل تعریف مجدد IFS=^ برای pack کردن دستور بدون فاصله استفاده میکرد.
نویسنده تونست با تکنیک echo|nl (که یه کاراکتر newline تولید میکنه، بدون اینکه فاصله توی کد باشه) یه اکسپلویت کاری بسازه. محدودیت ۲۵۵ بایتی مسیر فایل در لینوکس یه چالش جدی بود چون کل payload باید توی اسم فایل جا میگرفت:
$(echo`echo|nl`BASE64_PAYLOAD`echo|nl`|`echo|nl`base64`echo|nl`-d|python3)راهحل: یه stager دومرحلهای که ابتدا به سرور مهاجم وصل میشه، ۴۰۹۶ بایت کد دریافت میکنه و اونو مستقیم در حافظه اجرا میکنه — بدون هیچ فایلی روی دیسک.
نتیجه: با داشتن شل با دسترسی بالا، مهاجم میتونست گواهیهای اصلی رو کپی کنه و برای شنود ترافیک TLS استفاده کنه. وقتی شنود تموم میشد، فایل exploit از /tmp پاک میشد — هیچ ردپایی نمیموند.
نکات کلیدی:
- TLS شنود از طریق CA جعلی واقعاً اتفاق افتاده و مستند شده
- آسیبپذیری acme.sh (CVE-2023-38198) اجازه میداد کد دلخواه روی سرور قربانی اجرا بشه
- پیلود exploit باید توی ۲۵۵ بایت اسم فایل جا میگرفت
- تکنیک echo|nl راهی برای تولید فاصله بدون کاراکتر فاصله هست
- نرمافزار همیشه ضعیفترین حلقه در زنجیر اعتماد TLS هست




