|
1 |
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 10 | tr -d '\n'; echo |
Gdzie 10 to długość hasła
|
1 |
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 10 | tr -d '\n'; echo |
Gdzie 10 to długość hasła
|
1 |
history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head |
Może nam się przydać przy konieczności szybkiego odmierzenia czasu:
|
1 |
time read |
I już stoper zaczyna liczyć czas. Stopujemy go poprzez:
|
1 |
CTRL+d |
Możemy to zrobić na 2 sposoby, komenda:
|
1 |
clear |
albo skrót klawiszowy:
|
1 |
CTRL+l |
Objawia się ona następującymi zmianami:
|
1 2 3 4 5 6 |
-rw-r--r-- 1 user user 743 lis 21 09:09 accesson.php -rw-r--r-- 1 user user 10443 lis 21 09:09 content-post.php -rw-r--r-- 1 user user 4821 lis 21 09:09 dump.php -rw-r--r-- 1 user user 299 lis 21 09:09 opn-post.php -rw-r--r-- 1 user user 29527 lis 21 09:09 search.php -rw-r--r-- 1 user user 24882 lis 21 09:09 wp-post.php |
np. plik
|
1 |
/assets/.htaccess |
o treści:
|
1 2 3 4 |
<Files "\.(php|tpl)$"> Order allow,deny Deny from all </Files> |
Przejęcie kontroli nad serwerem www i wysyłka SPAM
|
1 2 |
ajaxSearch ditto |
|
1 |
/assets/snippets/ajaxSearch/classes/ajaxSearchResults.class.inc.php |
Zakomentowanie linii 727. Tzn zamiana:
|
1 2 3 4 5 |
if (substr($filterArray[1], 0, 5) != "@EVAL") { $this->_filterValue = $filterArray[1]; } else { $this->_filterValue = eval(substr($filterArray[1], 5)); } |
Na:
|
1 2 3 4 5 |
if (substr($filterArray[1], 0, 5) != "@EVAL") { $this->_filterValue = $filterArray[1]; } else { // $this->_filterValue = eval(substr($filterArray[1], 5)); } |
Instalujemy wymagane pakiety:
|
1 |
sudo apt-get install python-software-properties pkg-config software-properties-common |
Następnie instalujemy:
|
1 2 |
sudo add-apt-repository ppa:team-xbmc/ppa sudo apt-get update && sudo apt-get install kodi |
Konstrukcja zapytania jest analogiczna do pakowania przez TAR z pominięciem:
|
1 |
zip -r --exclude=*config.php* --exclude=*.svn* ../ftp.zip . |
Jak widać kluczowe jest tutaj użycie gwiazdek zamiast cudzysłowu.
Już opisywaliśmy to w artykule: https://linuxporady.pl/synchronizowanie-plikow-pomiedzy-dwoma-lokalizacjami/
Jednak jakiej komendy użyć aby pominąć określone pliki lub foldery w synchronizacji. Np. folder .git albo plik .project (plik etykiety projektu w platformie Eclipse).
Wystarczy do tego komenda:
|
1 |
rsync -r -t --progress --delete -s --exclude '.git' --exclude '.project' /lokalizacja/źródłowa /lokalizacja/docelowa |
Czyli parametr:
|
1 |
--exclude |
Uwaga, specyfika programu rsync narzuca stosowanie nazwy docelowego folderu tyko w źródle. Przykład:
|
1 |
rsync -r -t --progress --delete -s --exclude '.git' --exclude '.project' /home/user/folder-wzorowy /home/user/workspace/ |
I właśnie w tej lokalizacji:
|
1 |
/home/user/workspace/ |
Musi znajdować się folder:
|
1 |
folder-wzorowy |
którego w komendzie nie podajemy
Oczywiście scenariusz wykonywania naprawy może być inny. Przedstawiamy naszą propozycję na oczyszczenie instalacji WP z infekcji przy pomocy komend Linuksa. Na upartego wystarczy nam do tego sama konsola Linux. Np. przy pomocy serwera VPS.
Przeraża Cię ta procedura ? 🙂 Skorzystaj z pomocy specjalisty !
Jeśli dysponujemy kopią bezpieczeństwa najlepiej jest dodać ją do repozytorium SVN celem prześledzenia zmian w plikach.
|
1 2 3 4 5 6 7 8 |
cd ~ mkdir repozytoria cd repozytoria svnadmin create backup-wordpress cd ~ mkdir workspace cd workspace svn co file:///home/user/repozytoria/backup-wordpress wordpress-infekcja |
(gdzie user – nazwa Twojego użytkownika)
|
1 |
~/workspace/wordpress-infekcja |
Pliki z kopii bezpieczeństwa.
Duże pliki binarne (mp3, mp4, jpg, png, zip, tar) nie są potrzebne do synchronizacji. Najlepiej je usunąć aby przyśpieszyć sobie pracę.
Znajdujemy takie pliki (o wielkości powyżej 500kb)
|
1 |
find . -type f -size +500k |
i je usuwamy:
|
1 |
rm /sciezka/do/pliku |
Czytaj jak kopiować i wklejać tekst w konsoli Linux.
Jeśli plik jest to niezbędny plik .js albo .php – zostawiamy go.
Dodajemy wszystkie pliki do kontroli wersji i komitujemy:
|
1 2 |
svn status | grep "^\?" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs svn add svn ci -m 'wgranie plików z kopii bezpieczeństwa (lub inny dowolny komentarz)' |
|
1 2 3 4 5 |
cd ~ mkdir pliki-stron cd ~/pliki-stron mkdir wordpress-infekcja cd wordpress-infekcja |
|
1 |
rsync -r -t --progress --delete -s --exclude '.svn' ~/pliki-stron/wordpress-infekcja ~/workspace/ |
Nastepnie przeglądamy listę zmian w plikach:
|
1 2 |
cd ~/workspace/wordpress-infekcja svn st |
Listę dostępnych statusów odnośnie zmienionych plików znaleźć można tutaj : https://linuxporady.pl/lista-statusow-svn-subversion-eng/
Wykonane zmiany w plikach możemy sprawdzić poprzez komendę:
|
1 |
svn diff /sciezka/do/pliku |
Jednak bardziej pomocne mogą okazać się programy typu Eclipse lub Netbeans z odp. wtyczkami SVN.
Następnie:
Usuwamy złośliwe pliki:
|
1 |
rm /sciezka/do/pliku |
Leczymy złośliwie zmienione pliki
|
1 |
svn revert /sciezka/do/pliku |
Przywracamy niezbędne dla działania systemu pliki usunięte (symbol „!” po komendzie svn st) przez hakera:
|
1 |
svn revert /sciezka/do/pliku |
Po skrupulatnym wykonaniu powyższych czynności nowo powstałe pliki dodajemy do repozytorium:
|
1 |
svn status | grep "^\?" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs svn add |
Usunięte – wykluczamy z repozytorium:
|
1 |
svn status | grep "^\?" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs rm -R |
Całość zmian komitujemy:
|
1 |
svn ci -m 'Nowa kopia robocza (lub inny dowolny komentarz)' |
Każde takie odkrycie badamy z osobna pod kątem czy jest to istotnie zawartość skryptu WP albo modułu, czy fragment złośliwego kodu.
Automatycznie znaleziska są składowane w pliku „zmiany”, który za każdą komendą jest nadpisywany.
|
1 |
find -not -iname "*.php" -type f -exec grep -q '<?php' {} \; -print > zmiany |
|
1 |
find -type f -exec grep -q '\$GLOBAL\S\[$GLOBALS' {} \; -print > zmiany |
|
1 2 3 |
find -type f -exec grep -q '@include "' {} \; -print > zmiany find -type f -exec grep -q '\@include\ \"' {} \; -print > zmiany |
|
1 |
find -type f -iname "*.php" -exec grep -q 'chr\(109\)' {} \; -print > zmiany |
tu zamiast 109 możemy użyć innych cyfr
|
1 2 3 |
find -type f -iname "*.php" -exec grep -q '\$_FILES\[base64_decode' {} \; -print > zmiany find -type f -iname "*.php" -exec grep -q 'gzinflate\(' {} \; -print > zmiany |
|
1 |
grep '((eval.*(base64_decode|gzinflate|\$_))|\$[0O]{4,}|FilesMan|JGF1dGhfc|IIIl|die\(PHP_OS|posix_getpwuid|Array\(base64_decode|document\.write\("\\u00|sh(3(ll|11)))' . -lroE --include=*.php* > mozliwe_exploity.txt |
|
1 2 3 4 |
cd . sploitpattern='r0nin|m0rtix|upl0ad|r57shell|cFaTaLisTiCz_Fx|Tukulesto|99shell|shellbot|phpshell|void.ru|phpremoteview|directmail|bash_history|.ru/|brute *force|multiviews|cwings|vandal|bitchx|eggdrop|guardservices|psybnc|dalnet|undernet|vulnscan|spymeta|raslan58|Webshell' find . -name "*.php" -print0 | xargs -0 egrep -il "$sploitpattern" | sort > mozliwe_exploity.txt |
|
1 |
grep '((eval.*(base64_decode|gzinflate|\$_))|\$[0O]{4,}|FilesMan|GLOBALS.*exit|JGF1dGhfc|IIIl|die\(PHP_OS|posix_getpwuid|Array\(base64_decode|document\.write\("\\u00|sh(3(ll|11)))' . -lroE --include=*.php* |
|
1 |
find -type f -exec grep -q 'basename\/\*' {} \; -print > zmiany |
W niektórych infekcjach – haker umieszcza na serwerze w losowych miejscach pliki o losowej nazwie (to istotne – nazwy są generowane automatycznie i nie mają sensu – to po prostu 8-literowy ciąg znaków). Zazwyczaj są one 8-literowe. Najlepiej wylistować wszystkie takie pliki i znaleźć takie podejrzane wystąpienia:
|
1 |
find . \( -name "????????.php" \) |
Dla przykładu plik o nazwie typu:
|
1 2 |
vecqmdgn.php gtyxodmt.php |
może wymagać wglądu – czy rzeczywiście jest częścią webserwisu. Jeśli nie i posiada podejrzany kod. Należy go skasować.
Oczywiście 8-literowy ciąg to nie standard. Jeśli pojawia się dużo plików np. 6-literowych należy odp. zmienić kryteria wyszukiwania.
więcej na ten temat: https://blog.sucuri.net/2019/11/vulnerable-versions-of-adminer-as-a-universal-infection-vector.html )
|
1 |
find -type f -name "*.js" -exec grep -q 'document.currentScript.parentNode.insertBefore(s, document.currentScript);' {} \; -print |
Oczywiście ta lista możliwych podejrzanych zmian w plikach nie jest wyczerpująca.
Wszystkie ew. zmiany w plikach musimy zakomitować, aby mieć pewność że dysponujemy aktualną i oczyszczoną kopią roboczą:
|
1 |
svn ci -m 'Nowa kopia robocza (lub inny dowolny komentarz)' |
Jeśli na serwerze mamy folder ze zdjeciami (np. systemy PrestaShop: /img) a w nim niezliczoną liczbę plików PHP tym prostym zapytniem posortujemy pliki wg rozmiarów i zapiszemy wynik do pliku tekstowego:
|
1 |
find . -type f -name "*.php" -exec du -h {} \; | sort -h > pliki-php.txt |
W ten sposób plik PHP ze stosunkowo dużym rozmiarem (kilka-kilkanaście kb wielkości) może być potencjalnym plikiem z którego może być przeprowadzony atak.
Dla przykładu, jeśli posiadamy folder ze zdjęciami i w każdym podfolderze jest plik zaślepkowy index.php kierujący do glownej, mozemy łatwo sprwadzic czy któryś z nich nie jest podejrzanie duży i np. w nim znajduje się exploit.
|
1 |
find . -type f -name '*.php' -mtime -7 |
Oczywiście zamieniająć cyfrę 7 na np. 14 – wylistujemy pliki z przed 2 tyg. itd.
Analogicznie możemy znaleźć tak pliki ZIP w których czasem hakerzy umieszczają archiwum do wypakowania:
|
1 |
find . -type f -iname '*.zip' -mtime -7 |
flaga iname nie zwraca uwagi na wielkość liter 😛
Należy zaktualizować możliwe najwięcej komponentów w WP. Zatem:
Musimy się także zastanowić czy wszystkie zainstalowane wtyczki są niezbędne do funkcjonowania strony. Niepotrzebne lub podejrzane komponenty należy usunąć.
Po dokonaniu aktualizacji należy uwzględnić zmiany w kopii bezpieczeństwa w SVN. Powtarzamy tutaj proces z pkt. 1 tego artykułu.
Następnie całość plików powinna być wgrana przez FTP na serwer docelowy uprzednio po usunięciu zawartości:
|
1 2 |
find . -type f -exec chmod 644 {} \; find . -type d -exec chmod 755 {} \; |
Najlepiej jest usunąć wszystkie konta FTP zostawiając tylko jedno, które ma trudne i unikalne hasło.
W dziale użytkownicy w WP należy dokonać przeglądu którzy administratorzy są potrzebni, a którzy nie.
Następnie należy je wprowadzić w pliku
|
1 |
wp-config.php |
w katalogu głównym
Analogicznie jak w pkt. 1:
Upewniamy się, że mamy aktualną wersję kopii roboczej opartej o kopię bezpieczeństwa z SVN:
|
1 2 3 |
~/workspace/wordpress-infekcja svn st svn up |
Do osobnego folderu wgrywamy aktualną wersję CMS WordPress ze strony: https://pl.wordpress.org/
Tworzymy go w folderze pliki-stron:
|
1 2 |
cd ~/pliki-stron mkdir wordpress-base/wordpress-infekcja -p |
Następnie synchronizujemy pliki z naszą kopią bezpieczeństwa sprawdzamy zmiany:
|
1 2 |
rsync -r -t --progress --delete -s --exclude '.svn' ~/pliki-stron/wordpress-base/wordpress-infekcja ~/workspace/ svn st |
Większość wtyczek, motywów itp. będzie usunięta (symbol wykrzyknika). Zapewne nie zawierają się one w podstawowej wersji CMS. Najbardziej kluczowe mogą być podejrzane zmiany w plikach jądra CMS, albo usunięcie plików, które mają łudząco podobną nazwę do składowych plików CMS. Należy przeglądnąć ich zawartość.
Blokowanie wywołań plików php i ukrytych plików php.
W folderze:
|
1 |
wp-content/uploads |
Umieść plik o nazwie:
|
1 |
.htaccess |
I zawartości:
|
1 2 3 4 |
<FilesMatch "\.(php|ico)$"> Order allow,deny Deny from all </FilesMatch> |
Dodatkowo, zgodnie z informacjami zawartymi na stronie: https://perishablepress.com/protect-post-requests/ możemy zupełnie uniemożliwić requesty POST. Czyli jeśli nasza strona nie posiada formularza kontaktowego itp. możemy dodać taką regułę do .htaccess. Jednak uwaga – może to uniemożliwić logowanie do CMS. W takim wypadku na czas logowania należy ją zakomentować:
|
1 2 3 4 5 |
# deny all POST requests <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} POST RewriteRule .* - [F,L] </IfModule> |
Widok zakomentowanej reguły:
|
1 2 3 4 5 |
# deny all POST requests #<IfModule mod_rewrite.c> # RewriteCond %{REQUEST_METHOD} POST # RewriteRule .* - [F,L] #</IfModule> |
Niekiedy hakerzy przejmują kontrolę nad systemem CMS i za jego pośrednictwem dokonują swoich działań.
Aby się upewnić, że w CMS nie ma takiego backdoora zaloguj się do bazy danych przez program PhpMyAdmin. Dane do zalogowania znajdziesz w pliku:
|
1 |
wp-config.php |
następnie zaznacz tabelę:
|
1 |
wp_users |
Jeśli w jej obrębie znajdują się podejrzane konta użytkowników
a) Usuń je – notując ich numery ID
b) Wywołaj komendę:
|
1 |
DELETE FROM `wp_usermeta` WHERE `user_id` = 2 |
Gdzie 2 – to zanotowany numer ID.
c) zmień hasło do bazy danych i zaktualizuj je w pliku php:
|
1 |
wp-config.php |
Możesz też wywołać poniższą komendę w SQL (np. w phpmyadmin):
|
1 |
SELECT * FROM `wp_usermeta` WHERE `meta_key` = 'wp_capabilities' AND `meta_value` LIKE "%administrator%" |
Wskaże ona ID użytkowników w randze admina. Jeśli haker założył dodatkowe konta z takimi użtkownikami – przegladnij je i wykasuj podejrzane konta.
Należy następnie sprawdzić sytuację na witrynie po paru dniach / tygodniach. Najlepiej dla szybkości pobrać jedynie pliki narażone na atak. Następnie prześledzić ich zmiany przez SVN na identycznej zasadzie jak w pkt. 1 albo 6 niniejszego artykułu:
|
1 2 |
find -iregex '.*\.\(ico\|php\)$' > pliki tar -czvf pliki.tar.gz -T pliki |
Ewentualnie jak bazujemy na hostingu opartym o Direct Admin dodajmy takie komenty do crona:
|
1 2 |
find ~/domains -iregex '.*\.\(ico\|php\)$' > ~/domains/pliki tar -czvf ~/domains/pliki.tar.gz -T ~/domains/pliki |
Jeśli plik z exploitem pojawia się zawsze pod specyficzną nazwą np. jest to plik php:
|
1 |
SHELLcmd.php |
I nie ma na serwerze innego pliku pod tą nazwą. Można po prostu dodatkowo zabezpieczyć się poprzez dodania do CRON automatycznego znalezienia tego pliku i unięcia.
Komenda:
|
1 |
find -name "SHELLcmd.php" | xargs rm |
CRON ustawiamy aby uruchamiał się co 1 minutę. Np. w Direct Admin wpisujemy w polu minuta:
|
1 |
*/1 |
Jeśli na Twoim serwerze są inne popularne skrypty CMS jak np. Joomla albo PrestaShop przepatrz te strony pod kątem zagrożeń. Dla Joomla wykonaj aktualizację do najnowszej wersji + porównanie plików z plikami z demo tej samej wersji. Dla PrestaShop – podobnie.
Dość popularną dziurą w PrestaShop ostatnimi czasy (szczególnie dla wersji 1.6.x) była często wykorzystywana podatność w module: jmsslider
Więcej informacji znajdziesz tutaj: https://www.joommasters.com/index.php/blog/tutorials-and-case-studies/how-to-fix-security-bug-of-slider-security-breach-of-theme.html
wystarczy nam do tego program ffmpeg
|
1 |
sudo apt-get install ffmpeg |
Następnie używamy komenty:
|
1 |
ffmpeg -i plik-wejsciowy.avi -ss 00:10:22 -t 00:01:50 -async 1 plikwynikowy.mp4 |
gdzie pierwsze oznaczenie czasu to start obcinanego momentu a 00:01:50 – jego długość (1 minuta, 50 sekund)
Alternatywna komenda:
|
1 |
ffmpeg -i plikwejscowy.mp4 -vcodec copy -acodec copy -ss 00:00:00.000 -t 00:03:50.000 plikwynikowy.mp4 |
Oczywiście można tutaj zamiast formatu plik-oryginalny.mp4 użyć innego formatu np. plik-oryginalny.mov
Bądź na bieżąco! - Polub nasz profil na Facebook.com!