[AKTUALIZACJA:
Stan na 19.08.2020r., godz.8:00 – konkurs rozstrzygnięty]

Uwaga ogłaszamy wakacyjny konkurs!

Wszystkich, którzy czekali z niecierpliwością na nowe wyzwanie zapraszamy do rywalizacji o nagrody.

Uprzedzamy, że w okresie urlopowym nie obniżamy poprzeczki. Zadanie wymaga dużej cierpliwości i wiedzy!

Gotowi na wyzwanie? Zapraszamy do zapoznania się ze szczegółami:

Przygotowane zadanie jest w wersji Pro i wymaga specjalistycznej wiedzy do jego rozwiązania.
Jeśli nie wiesz, jak w bezpieczny sposób obchodzić się z podejrzanymi mailami – prosimy odpuść tym razem.

Cel wyzwania:

Celem zadania jest odnalezienie przepisu na groszek oraz opisanie kolejno wykonywanych kroków.

Pod poniższym linkiem: https://cutt.ly/YiVBAZ2 znajduje się załącznik maila, którego dostał główny informatyk.

Hasło do zipa to: wladcysieci.

Prosimy o przesłanie opisu wykonanych kroków oraz podanie przepisu w postaci flagi -> FLG{xxxx} oraz opisu wykonanych czynnośna adres: info@wladcysieci.pl

Do wygrania nagroda główna Plecak Dell Pursuit 15 przydatny podczas wakacyjnych podróży. Na kolejne dwie osoby, które rozwiążą zadanie czekają bezprzewodowe słuchawki JBL Tune.

Dodatkowo na każdego, kto weźmie udział w gRywalizacji czeka +5pkt w rankingu oraz paczka upominków od Władcy Sieci.

Życzymy powodzenia!

Hint 1:

Dostarczony w zadaniu ransomware niestety nie daje się analizować przy wykorzystaniu rozwiązań typu sandbox. Dzieje się tak dlatego, że skrypty (makra) umieszczone w excelu nie startują automatycznie, ale ich uruchomienie następuje po uzupełnieniu przez ofiarę danych w formularzu. Aby zrozumieć sposób działania malware’u, należy więc uzyskać dostęp do kodu źródłowego makr zawartych w excelu. Próba otwarcia makr w arkuszu excela skutkuje pojawieniem się błędu.

Makra zostały w specyficzny sposób zabezpieczone przed wyświetlaniem poprzez wykorzystanie narzędzia EvilClippy https://github.com/outflanknl/EvilClippy.
Odbezpieczyć dostęp do makr można poprzez wywołanie EvilClippy z parametrem -uu (Make VBAProject viewable).
Tutaj jednak napotykamy na kolejny problem – EvilClippy dostępny jest tylko w postaci kodu źródłowego, który trzeba samodzielnie skompilować (np. instalując środowisko Microsoft Visual Studio).

Poniższy url https://cutt.ly/daCsfXj zawiera arkusz dofinansowanie w wersji bez restrykcji wyświetlania makr (wynik wywołania komendy EvilClippy -uu).

Hint 2:

Mając dostęp do kodu makr, można w szczegółach prześledzić ich działanie.

Dane z ukrytego arkusza zapisywane są do pliku w postaci liczb szesnastkowych.

Następnie uruchamiana jest komenda CertUtil, która konwertuje zapis szesnastkowy do jego reprezentacji bajtowej. CertUtil jest z reguły narzędziem zaufanym dla antywirusów, co daje możliwość niezakłóconego zapisania na dysk pliku wykonywalnego.

Kolejny krok to uruchomienie narzędzia InstallUtil służącego do instalowania usług napisanych w .Net z parametrem będącym wynikiem działania poprzedniego kroku. Jest to kolejny zabieg omijający mechanizmy detekcji antywirusów.

W tym momencie ransomware jest uruchomiony.

Na liście uruchomionych procesów należy odnaleźć InstallUtil i sprawdzić jego parametry wywołania, czyli de facto ścieżkę do kodu ransomware (proszę nie dać się zmylić rozszerzeniu .log – InstallUtil również takie pliki uruchamia).

Hint 3:

Mamy dostęp do kodu ransomware, rozpoczynamy więc jego analizę wsteczną. Najłatwiej wykonać ją przy pomocy narzędzie dotPeek. Niestety dla utrudnienia kod jest obfuscowany, wymaga więc poświęcenia nieco czasu na jego zrozumienie. Najistotniejszy fragment to:

public class C3904355907
  {
    private const string C3554254475 = „owned”;
    private readonly ushort[] C3554254475;

    public C3904355907([In] string obj0)
    {
      this.C3554254475 = this.C3554254475(obj0);
      if (this.C3554254475.Length != 65536)
        throw new ArgumentException(„invalid len of randStream”);
    }

    private ushort[] C3554254475([In] string obj0_1)
    {
      List<ushort> ushortList = new List<ushort>(65536);
      byte[] buffer = Encoding.ASCII.GetBytes(obj0_1);
      while (ushortList.Count < 65536)
      {
        buffer = new SHA512Managed().ComputeHash(buffer);
        ushortList.AddRange((IEnumerable<ushort>) ((IEnumerable<byte>) buffer).C3554254475<byte>().Select<Tuple<byte, byte>, ushort>((Func<Tuple<byte, byte>, ushort>) (obj0_2 => (ushort) ((uint) obj0_2.Item1 * 256U + (uint) obj0_2.Item2))).ToList<ushort>());
      }
      return ushortList.ToArray();
    }

    private byte[] C3554254475([In] byte[] obj0)
    {
      if (obj0.Length > 65536)
        throw new ArgumentException(„data len too long”);
      int length = obj0.Length;
      int num = length;
      byte[] numArray = new byte[length];
      for (; num > 0; –num)
      {
        int index = (int) this.C3554254475[length – num] % num;
        numArray[length – num] = obj0[index];
        obj0[index] = obj0[num – 1];
      }
      return numArray;
    }