[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;
}
Jesteście pewni co do formatu flagi?
Faktycznie jest błąd w opisie, flaga jest postaci FLG{xxx} (autor zadania).
Czy należy już gratulować rozwiązania? 🙂
Dokładnie o to mi chodziło 😉 Dzięki – do tej pory najfajniejsze zadanie!
foxtrot_charlie
Coś mamy ale wedle opisu …”Celem zadania jest odnalezienie przepisu na groszek oraz opisanie kolejno wykonywanych kroków.”
Technicznie to nie było zgłoszenie, tylko pytanie o format flagi, który różnił się z tym podanym w treści. Myślałem, że to jakiś fake flag. Dodatkowo nie wiem ile było zgłoszeń, więc publicznie nie wrzucałem kroków rozwiązania, aby nie popsuć zabawy.
Przy okazji:
Hintowało jednoznacznie, że wymagana jest tylko flaga. Nie mniej uzupełnione 🙂
Proszę wyraźnie zaznaczać, co trzeba załączać w odpowiedzi 🙂 To nie zarzut do Autora zadania, bo samo wyzwanie było dobrze i przejrzyście sformułowane, nie było elementów „zgadywania”.
Jest pierwszy laureat ale jeszcze 2 nagrody pozostały.
Dorzucamy 1.wszy hint – zerknijcie w zaktualizowany nius.
Naprawdę nikt nie wrzuci flagi z podanym na tacy rozwiązaniem? xD
Odpowiedź poszła, czekam na reakcję organizatora
Nawet z podpowiedziami fajne wyzwanie
Gratulacje!
Wrzuciłem rozwiązanie konkursu w formie writeupu.