ethical.blue Magazine

// Cybersecurity clarified.

Usunięcie zaciemnienia kodu z próbki Phishing.HtmlDoc.Generic

14.11.2023   Dawid Farbaniec
...

Próbka złośliwego oprogramowania o nazwie COR15.1A (2).html (14938 bajtów) odwiedziła ostatnio laboratorium. Plik ten był rozprzestrzeniany jako załącznik do wiadomości e-mail. Znaczniki HTML oraz skrypty w dokumencie są zaciemnione (ang. obfuscated) i mogą ominąć niektóre filtry bazujące na analizie statycznej. Obliczona suma kontrolna, której można użyć do identyfikacji próbki jest następująca:

Nazwa pliku: COR15.1A (2).html
Rozmiar: 14.59 KB (14938 bajtów)
SHA-256: 72a230083a2942986f617d3553d8a12ca4d62fa8561d582afa12ed097dbfd699


Wskaźnik wykrywalności

Tylko 8 / 59 dostawców zabezpieczeń oraz zero piaskownic (ang. sandbox) oznaczyło ten plik jako złośliwy w dniu znalezienia.

Rozpoznanie wstępne (ang. reconnaissance)

Zainfekowany dokument internetowy (.html) jest zaciemniony poprzez zastosowanie różnych sekwencji ucieczki (ang. escape codes). W tej formie znaczniki HTML oraz kod JavaScript jest trudny do odczytania i zrozumienia.

Gdy spojrzymy na cały dokument (kod źródłowy), to możemy zobaczyć, że jest tutaj zastosowane 6 (sześć) rodzajów kodowania. Weźmy wielką literę A jako przykład. Ten znak w kodowaniu ASCII można przedstawić jako 65 (dziesiętnie), 41 (szesnastkowo, heksadecymalnie) lub 101 (ósemkowo). Jeśli chcemy wstawić literę A w kodzie HTML, to możemy napisać A (dziesiętnie) lub A (szesnastkowo). Co jednak ze skryptami? Można w nich użyć sekwencji ucieczki (ang. escape sequence), którą jest znak tylny ukośnik (ang. backslash), czyli \. Idąc tą drogą (\u0064ocum\u0065n\u0074).write(); zostanie wyświetlone jako document.write();.

Innym rodzajem kodowania zastosowanym tutaj jest tzw. URL encoding, który polega na zamianie znaku ASCII na jego wartość w systemie szesnastkowym (heksadecymalnym) poprzedzoną znakiem procent %. Przykładowym zaciemnionym adresem URL może być np. https://ethical.blue/%41. Ten link poprowadzi pod adres: https://ethical.blue/A. Za pomocą tego rodzaju kodowania na wartości liczbowe można zamieniać wybrane lub nawet wszystkie znaki ASCII. Idąc za tym sposobem działania możemy stworzyć adres URL https%3a%2f%2fethical.blue%2fA, a będzie on prowadził do https://ethical.blue/A.

W celu bardziej zautomatyzowanego kodowania URL możemy posłużyć się np. narzędziem Windows PowerShell, a dokładnie:
[System.Web.HttpUtility]::UrlDecode('https://%65%74%68%69%63%61%6C%2E%62%6C%75%65');

Napisanie narzędzia deobfuscator (C#.NET)

Po wstępnym rozpoznaniu powtarzających się wzorców w zaciemnionym kodzie, można napisać proste narzędzie, które oczyści próbkę.

/* Coded by ethical.blue Magazine. Cybersecurity clarified. */
using System.Text.RegularExpressions;

internal class Program
{
    internal static string Deobfuscate(string text)
    {
        text = Regex.Replace(text, "\\\\[0-9]{1,3}", // \101
            m => "&#x" + Convert.ToString(Convert.ToInt32(
                m.Value.TrimStart("\\".ToCharArray()), 8), 16) + ";");

        text = Regex.Replace(text, "\\\\u[0-9a-fA-F]{4}", // \u0041
            m => (m.Value.Replace("\\u", "&#x") + ";"));

        text = Regex.Replace(text, "\\\\x[0-9a-fA-F]{2}", // \x41
            m => (m.Value.Replace("\\x", "&#x") + ";"));

        text = Regex.Replace(text, "[%][0-9a-fA-F]{2}", // %41
            m => "&#x" + m.Value.TrimStart("%".ToCharArray()) + ";");

        text = Regex.Replace(text, "&#[xX][0-9a-fA-F]{1,4};", // A
            m => string.Empty + Convert.ToChar(
                Convert.ToInt32(
                    m.Value.TrimStart("&#x".ToCharArray())
                    .TrimEnd(';'), 16)));

        text = Regex.Replace(text, "&#[0-9]{1,4};", // A
            m => string.Empty + Convert.ToChar(
                Convert.ToInt32(
                    m.Value.TrimStart("&#".ToCharArray())
                    .TrimEnd(';'), 10)));

        return text;
    }

    private static void Main(string[] args)
    {
        const string root = @"C:\DATA\Malware Analysis\";

        var clean = Deobfuscate(File.ReadAllText(Path.Combine(root, "sample.txt")));

        File.WriteAllText(Path.Combine(root, "sample_clean.txt"), clean);

        Console.WriteLine("Well done.");
    }
}

Analiza statyczna kodu po użyciu deobfuscator'a

Ta próbka to typowe złośliwe oprogramowanie wyłudzające dane (ang. phishing, ponieważ fishing znaczy łowić). Można zauważyć tutaj próbę imitacji usług firmy Microsoft. Jednak tak na prawdę nie odblokujemy tutaj tego dokumentu, który jest zamazany w tle. To tylko fałszywy obrazek.

Po tym jak narzędzie deobfuscator przetworzyło zaciemniony kod, możliwe jest łatwe odczytanie i zrozumienie co się tutaj dzieje. Jest tutaj asynchroniczne wywołanie ($.ajax), które wysyła wprowadzone dane uwierzytelniające do interfejsu API (skrypt .php) oraz wykonuje przekierowanie do witryny, która jest prawdziwą usługą firmy Microsoft (sharepoint.com) w celu zmylenia ofiary.

Podsumowanie

Ogólną ideą tego tekstu jest zapewnienie wartości edukacyjnej w zakresie pracy z zaciemnioną prawdziwą próbką złośliwego oprogramowania znalezioną in the wild.

Wykaz literatury

File: COR15.1A (2).html
Size: 14.59 KB (14938 bytes)
SHA-256: 72a230083a2942986f617d3553d8a12ca4d62fa8561d582afa12ed097dbfd699