Dostęp do wiersza poleceń z przeglądarki przy użyciu shell.php
On 5 stycznia, 2022 by adminCzasami chcemy mieć dostęp do powłoki z poziomu przeglądarki. Można to osiągnąć za pomocą PHP, jeśli ustawienia bezpieczeństwa na to pozwalają. Zaimplementowałem tę funkcjonalność w pliku shell.php (dostępnym na Githubie). Na powyższym zrzucie ekranu widać jak działa dostęp do powłoki z poziomu przeglądarki. Skrypt pozwala przesyłać, pobierać, przeglądać, edytować i usuwać pliki, rozpakowywać i rozpakowywać katalogi oraz przemierzać katalogi na serwerze za pomocą myszy, ale można również wpisywać własne polecenia za pomocą klawiatury.
Ostrzeżenie dotyczące bezpieczeństwa i zrzeczenie się odpowiedzialności
Proszę uruchamiać ten skrypt tylko na maszynach, których jesteś właścicielem (lub podczas autoryzowanego pentestu). Upewnij się również, że maszyna jest odpowiednio zabezpieczona (port 80 nie powinien być osiągalny z Internetu). Nie używaj go do złośliwych celów! Przeczytaj więcej o nadużywaniu skryptów powłoki tutaj.
Znane problemy
Jeśli skrypt nie działa, może to być spowodowane tym, że funkcja PHP „passthru”, na której się opiera, jest wyłączona. Aby wyświetlić listę wyłączonych funkcji PHP, wykonaj następujący kod PHP:
var_dump(ini_get('safe_mode'));var_dump(explode(',',ini_get('disable_functions')));var_dump(explode(',',ini_get('suhosin.executor.func.blacklist')));
Na Ubuntu 14.04, który wyświetli:
bool(false)Array( => pcntl_alarm => pcntl_fork => pcntl_waitpid => pcntl_wait => pcntl_wifexited => pcntl_wifstopped => pcntl_wifsignaled => pcntl_wexitstatus => pcntl_wtermsig => pcntl_wstopsig => pcntl_signal => pcntl_signal_dispatch => pcntl_get_last_error => pcntl_strerror => pcntl_sigprocmask => pcntl_sigwaitinfo => pcntl_sigtimedwait => pcntl_exec => pcntl_getpriority => pcntl_setpriority =>)Array( =>)
Komendy wykonania powłoki PHP
Jeśli skrypt nie zostanie uruchomiony przy użyciu passthru()
, spróbuje kilku innych komend. Poniższe polecenia są podobne:
-
exec()
Zwraca ostatni wiersz wyjścia komend -
passthru()
Przekazuje wyjście komend bezpośrednio do przeglądarki -
system()
Przekazuje wyjście komend bezpośrednio do przeglądarki i zwraca ostatni wiersz -
shell_exec()
Zwraca wyjście komend - .
popen()
Otwiera potok odczytu lub zapisu do procesu komendy -
proc_open()
Podobne do popen(), ale większy stopień kontroli -
pcntl_exec()
Wykonuje program
Hardening twojego serwera z open_basedir
Jeśli powyższy skrypt wydaje ci się przerażający, to możesz chcieć uniemożliwić mu wykonywanie się na Twoim serwerze. Możesz to zrobić włączając tryb bezpieczny (deprecated), używając zmiennej „disable_functions” php.ini i/lub czarnej listy wykonywania funkcji Suhosin.
Znalazłem dobrze napisany post na temat zabezpieczania instalacji PHP, sprawdź to! Oprócz ograniczania wykonywalnych funkcji zalecają również zmienną konfiguracyjną „open_basedir” w php.ini. Ogranicza ona pliki, do których PHP może mieć dostęp, do określonego drzewa katalogów. Uważam, że jest to potężne narzędzie.
Dobrym pomysłem może być również zabezpieczenie katalogu „/tmp” za pomocą flag „nodev”, „nosuid” i „noexec”, jak opisano tutaj.
Cannot find Suhosin?
Zauważ, że pakiet „php5-suhosin” (rozszerzenie bezpieczeństwa PHP) nie jest już instalowany ani dostępny w systemach opartych na Debianie. Niektóre z poprawek bezpieczeństwa zostały włączone do najnowszych wersji PHP (5.4 i 5.5). Jeśli chcesz zainstalować Suhosin (z Githuba) na Ubuntu 14.04 (PHP 5.5.9), możesz skorzystać z tego poradnika.
Możesz przeczytać więcej o kontrowersjach wokół usuwania Suhosin na LWN.net.
Oddzielenie przywilejów
Jeśli w systemie jest wielu użytkowników, „oddzielenie przywilejów” jest koniecznością. Oznacza to uruchamianie kodu PHP w kontekście użytkownika (np. jako użytkownik „maurits”), a nie jako użytkownik „www-data”. Znalazłem świetny artykuł wyjaśniający jak można to osiągnąć. Najprostszym rozwiązaniem jest uruchomienie:
sudo apt-get install libapache2-mpm-itk
A następnie dodanie dyrektywy „AssignUserID” do każdej konfiguracji „VirtualHost”. Zauważ, że to może nie być najbezpieczniejsze rozwiązanie, ale działa dobrze i jest łatwe do zainstalowania.
Wnioski
Powinieneś zawsze aktualizować i łatać PHP do najnowszej wersji, aby zapobiec wykorzystaniu znanych dziur w zabezpieczeniach. Narzędzia takie jak „disable_functions”, „open_basedir”, Suhosin i flagi systemu plików zmniejszają powierzchnię ataku i zapobiegają wykorzystaniu nieznanych luk w zabezpieczeniach. Możesz ich użyć do stworzenia warstwowej strategii bezpieczeństwa. Nie należy również zapominać o separacji uprawnień.
Dodaj komentarz