2013-10-18

Поиск файлов и папок в консоли Linux

Иногда приходится пользоваться поиском в консоли Linux. Есть очень хорошая утилита find. Она позволяет искать по типу (файл, директория), размеру (как строго, так и с пределами), датам (строго или по периодам), шаблону имени и много еще чего.
В связи с подозрением на взлом FTP, в очередной раз возникла задача поиска: файлы по маске и некоторым признакам и содержимому. Нужно было найти web-shell`ы и то, что было залито с их помощью. Сначала были найдены образцы вредоносов, исследованы и составлена карта признаков для дальнейшего обнаружения аналогичных файлов в других папках.

Поиск всех папок начиная от /var/www, далее любое имя папки, затем в ней data/www и снова имя - искомая папка:
> find /var/www/ -type d -regex "/var/www/[^/]+/data/www/[^/]+" > sites.txt
Весь результат будет записан в файл sites.txt
Это так для разминки. Для ускорения следующих поисков можно было использовать этот список заранее определенных путей.

Ищем по расширению "swf" и строго по размеру 1143 байт:
> find /var/www/ -path "/var/www/*/data/www/*" -type f -name *.swf -size 1143c > find_swf.txt &

Практикуем поиск по содержимому:
> find /var/www/ -path "/var/www/*/data/www/*" -type f -name *.php -print0 | xargs -0 grep -l '$auth_pass=' > find_php.txt &
> find /var/www/ -path "/var/www/*/data/www/*" -type f -name *.js -print0 | xargs -0 grep -l 'addNewObject' > find_js.txt &
Похожие примеры, разница лишь в том, что в первом - ищутся PHP-файлы, а во втором JS и отличается искомый в них текст.
В обоих случаях ищутся файлы по маске имени (в данном случае по расширению) и по маске пути. Затем список найденных файлов передается для поиска в них по содержимому, где флаг "-l" для grep обозначает то, что в итоговом вывод должны включаться только имена файлов без самих совпадений контента по шаблону. Список найденных файлов записывается в соответствующий файл. "&" в конце позволяет запускать команду в фоне.