#!/bin/bash

# Skrypt findsuid wyszukujący wszystkie pliki i skrypty z ustawionym atrybutem setuid
# i sprawdzający, czy można w nich wprowadzać zmiany. Nazwy takich plików
# są wyświetlane w czytelnym formacie.

mtime="7"  # Okres czasu wstecz (w dniach), w którym zostały zmienione sprawdzane pliki.
verbose=0  # Domyślnie skrypt nie wyświetla szczegółowych informacji.

if [ "$1" = "-v" ] ; then
  verbose=1  # Został użyty argument –v, więc będą wyświetlane szczegółowe informacje.
fi

# Polecenie "find –perm" wyszukuje pliki z zadanymi uprawnieniami.
# Kod 4000 lub większy oznacza ustawiony atrybut setuid/setgid.

find / -type f -perm +4000 -print0 | while read -d '' -r match
do
  if [ -x "$match" ] ; then

    # Wyodrębnienie z wyniku polecenia "ls -ld" informacji
    # o właścicielu pliku i uprawnieniach.

    owner="$(ls -ld $match | awk '{print $3}')"
    perms="$(ls -ld $match | cut -c5-10 | grep 'w')" 

    if [ ! -z $perms ] ; then
      echo "**** $match (uprawnienia do zapisu, atrybut setuid $owner)"
    elif [ ! -z $(find $match -mtime -$mtime -print) ] ; then
      echo "**** $match (zmieniony $mtime dni temu, atrybut setuid $owner)"
    elif [ $verbose -eq 1 ] ; then
      # Domyślnie wyświetlane są tylko niebezpieczne skrypty.
      # Jeżeli użyty został argument -v, wyświetlane są wszystkie nazwy.
      lastmod="$(ls -ld $match | awk '{print $6, $7, $8}')"
      echo "     $match (atrybut setuid $owner, ostatnia modyfikacja: $lastmod)"
    fi
  fi
done

exit 0
