In maart 2019 werd er een nieuwe monster van malware voor macOS geüpload naar VirusTotal, een populaire online scanservice, door de cybergroep OceanLotus. Het uitvoerbare bestand van de backdoor heeft dezelfde mogelijkheden als de vorige versie van malware voor macOS die we hebben bestudeerd, maar de structuur is veranderd en het is moeilijker te detecteren. Helaas hebben we de dropper die aan deze monster is gekoppeld, niet kunnen vinden, dus weten we momenteel niet hoe de infectie plaatsvond.
Recentelijk hebben we een en hoe de operators proberen de persistentie te waarborgen, de uitvoering van de code te versnellen en de sporen van aanwezigheid in Windows-systemen te minimaliseren. Het is ook bekend dat deze cybergroep een component voor macOS heeft. In dit bericht worden de veranderingen in de nieuwste versie van de malware voor macOS in vergelijking met de vorige variant (), en het wordt ook uitgelegd hoe het decoderen van strings kan worden geautomatiseerd tijdens de analyse met behulp van de IDA Hex-Rays API.

Analyse
In de volgende drie delen wordt de analyse van het monster met de SHA-1 hash E615632C9998E4D3E5ACD8851864ED09B02C77D2. Het bestand heet flashlightd, antivirusproducten van ESET detecteren het als OSX/OceanLotus.D.
Anti-debugging en sandboxbescherming
Net als alle macOS-binaries van OceanLotus is het monster verpakt met UPX, maar de meeste identificatietools voor packers herkennen het niet als zodanig. Waarschijnlijk omdat ze voornamelijk een handtekening bevatten die afhankelijk is van de aanwezigheid van de string "UPX"; bovendien komen Mach-O-handtekeningen minder vaak voor en worden ze niet zo vaak bijgewerkt. Deze eigenschap bemoeilijkt de statische detectie. Het is interessant dat na het uitpakken het toegangspunt zich aan het begin van de sectie __cfstring in de segment .TEXT. In deze sectie zijn er attributen flag, zoals weergegeven in de afbeelding hieronder.

Afbeelding 1. Attributen van de MACH-O-sectie __cfstring
Zoals weergegeven in afbeelding 2, maakt de locatie van de code in de sectie __cfstring het mogelijk om sommige disassemblagetools om te tuin te leiden door de code als strings weer te geven.

Afbeelding 2. De backdoorcode wordt door IDA gedefinieerd als gegevens
Na het starten creƫert het binaire bestand een thread als een beschermingsmiddel tegen debugging, met als enige doel het voortdurend controleren op de aanwezigheid van een debugger. Hiervoor:
ā Probeert het elke debugger los te koppelen door ptrace met PT_DENY_ATTACH als parameter te gebruiken
ā Controleert of bepaalde uitzonderlijke poorten zijn geopend door de functie task_get_exception_ports
ā Controleert of de debugger is aangesloten, zoals weergegeven in de afbeelding hieronder, door het bestaan van een vlag te controleren. P_TRACED in het huidige proces.

Afbeelding 3. Controle van de debuggerverbinding via de sysctl-functie.
Als het bewakingsschema de aanwezigheid van een debugger detecteert, wordt de functie aangeroepen. exit. Vervolgens controleert het voorbeeld de omgeving door twee commando's uit te voeren:
ioreg -l | grep -e "Manufacturer" en sysctl hw.model.
Daarna controleert het voorbeeld de teruggegeven waarde aan de hand van een hardcoded lijst van bekende virtualisatiesystemen: acle, vmware, virtualbox of parallels. Ten slotte controleert het volgende commando of de machine een van de volgende 'MBP', 'MBA', 'MB', 'MM', 'IM', 'MP' en 'XS' is. Dit zijn modelcodes van systemen, bijvoorbeeld, 'MBP' staat voor MacBook Pro, 'MBA' voor MacBook Air, enz.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}'
Belangrijkste toevoegingen
Hoewel de backdoor-commando's niet zijn veranderd sinds het onderzoek van Trend Micro, hebben we verschillende andere wijzigingen opgemerkt. De C&C-servers die in dit voorbeeld worden gebruikt, zijn vrij nieuw, met een opbouwdatum van 22-10-2018.
ā daff.faybilodeau[.]com
ā sarc.onteagleroad[.]com
ā au.charlineopkesston[.]com
De URL-bron is veranderd naar /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35.
Het eerste pakket dat naar de C&C-server wordt verzonden, bevat meer informatie over de hostmachine, inclusief alle gegevens die door de commando's uit de onderstaande tabel worden verzameld.

Bovendien gebruikt het voorbeeld voor netwerkfiltering geen bibliotheek , maar een externe bibliotheek. Om deze te vinden, probeert de backdoor elk bestand in de huidige map te ontsleutelen met behulp van AES-256-CBC met de sleutel gFjMXBgyXWULmVVVzyxy, aangevuld met nullen. Elk bestand wordt ontsleuteld en opgeslagen als /tmp/store, en er wordt geprobeerd het te laden als bibliotheek met behulp van de functie Wanneer de ontsleutelpoging leidt tot een succesvolle aanroep van dlopen., haalt de backdoor de geƫxporteerde functies op. Boriry en ChadylonV, die blijkbaar verantwoordelijk zijn voor de netwerkinteractie met de server. We hebben geen dropper of andere bestanden uit de oorspronkelijke locatie van het voorbeeld, dus we kunnen deze bibliotheek niet analyseren. Bovendien, aangezien de component is versleuteld, zal een YARA-regel die op deze regels is gebaseerd, niet overeenkomen met het bestand dat op de schijf is gevonden.
Zoals beschreven in het eerder genoemde artikel, wordt cliendIDDit identificatienummer is een MD5-hash van de geretourneerde waarde van een van de volgende opdrachten:
ā ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, ""); printf("%s", line[4]); }'
ā ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, ""); printf("%s", line[4]); }'
ā ifconfig en0 | awk '/ether /{print $2}' (krijg MAC-adres)
ā onbekende opdracht ("x1ex72x0a") die in de vorige voorbeelden wordt gebruikt
Voordat de hash aan de geretourneerde waarde wordt toegevoegd, wordt het teken "0" of "1" toegevoegd om aan te geven of er rootrechten zijn. Deze clientID wordt opgeslagen in /Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex, als de code als root wordt uitgevoerd of in ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML in alle andere gevallen. Het bestand is meestal verborgen met de functie , zijn tijdstempel wordt gewijzigd met de opdracht touch āt met een willekeurige waarde.
Decryptie van strings
Zoals in de vorige versies zijn de strings versleuteld met AES-256-CBC (hexadecimale sleutel: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 aangevuld met nullen, en IV is gevuld met nullen) door middel van de functie . De sleutel is gewijzigd ten opzichte van eerdere versies, maar aangezien de groep nog steeds dezelfde versleutelingsalgoritme gebruikt voor strings, kan decryptie worden geautomatiseerd. Naast deze post brengen we een IDA-script uit dat gebruik maakt van de Hex-Rays API om strings te ontsleutelen die in het binaire bestand aanwezig zijn. Dit script kan helpen bij toekomstige OceanLotus-analyse en bij het analyseren van bestaande voorbeelden die we nog niet hebben kunnen krijgen. De basis van het script is een universele methode om argumenten te verkrijgen die aan de functie zijn doorgegeven. Daarnaast zoekt het naar parameterbestemmingen. De methode kan opnieuw worden gebruikt om een lijst van functieargumenten te verkrijgen en vervolgens aan een terugroep (callback) door te geven.
Wetende wat de protocollen van de functie zijn decrypt, vindt het script alle kruisverwijzingen naar deze functie, alle argumenten, ontsleutelt vervolgens de gegevens en plaatst de platte tekst binnen een opmerking op het adres van de kruisverwijzing. Om het script goed te laten werken, moet het een gebruiker-alphabet hebben dat door de base64-decodeerfunctie wordt gebruikt, en moet er een globale variabele zijn gedefinieerd die de lengte van de sleutel bevat (in dit geval DWORD, zie figuur 4).

Figuur 4. Definitie van de globale variabele key_len
In het venster Functie kunt u met de rechtermuisknop de decryptiefunctie oproepen en klikken op «Argumenten extraheren en decoderen». Het script moet de gedecrypteerde teksten in de opmerkingen plaatsen, zoals weergegeven in afbeelding 5.

Afbeelding 5. De gedecrypteerde tekst is in de opmerkingen geplaatst
Op deze manier worden de gedecrypteerde regels samen handig gepresenteerd in het IDA-venster xrefs voor deze functie, zoals weergegeven in afbeelding 6.

Afbeelding 6. Xrefs naar de functie f_decrypt
De definitieve versie van het script is te vinden op .
Uitslag
Zoals eerder vermeld, blijft OceanLotus hun toolkit voortdurend verbeteren en bijwerken. Dit keer heeft de cybergroep malware verbeterd voor Mac-gebruikers. De code is niet veel veranderd, maar aangezien veel Mac-gebruikers beveiligingsproducten negeren, is de bescherming tegen detectie van malware van ondergeschikt belang.
ESET-producten hebben dit bestand al gedetecteerd op het moment van onderzoek. Aangezien de netwerkbibliotheek die voor C&C-communicatie wordt gebruikt nu op schijf is versleuteld, is het exacte netwerkprotocol dat door de aanvallers wordt gebruikt vooralsnog onbekend.
Indicators of Compromise
Indicatoren van compromittering, evenals de MITRE ATT&CK-attributen, zijn ook beschikbaar op .
Bron: habr.com
