Last active
August 16, 2018 10:08
-
-
Save claudioquaglia/bb9df100e9ebbca970026a0d0c7a263f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| #A script to enumerate local information from a Linux host | |
| v="version 0.8" | |
| #@rebootuser | |
| #help function | |
| usage () | |
| { | |
| echo -e "\n\e[00;31m#########################################################\e[00m" | |
| echo -e "\e[00;31m#\e[00m" "\e[00;33mLocal Linux Enumeration & Privilege Escalation Script\e[00m" "\e[00;31m#\e[00m" | |
| echo -e "\e[00;31m#########################################################\e[00m" | |
| echo -e "\e[00;33m# www.rebootuser.com | @rebootuser \e[00m" | |
| echo -e "\e[00;33m# $v\e[00m\n" | |
| echo -e "\e[00;33m# Example: ./LinEnum.sh -k keyword -r report -e /tmp/ -t \e[00m\n" | |
| echo "OPTIONS:" | |
| echo "-k Enter keyword" | |
| echo "-e Enter export location" | |
| echo "-t Include thorough (lengthy) tests" | |
| echo "-r Enter report name" | |
| echo "-h Displays this help text" | |
| echo -e "\n" | |
| echo "Running with no options = limited scans/no output file" | |
| echo -e "\e[00;31m#########################################################\e[00m" | |
| } | |
| header() | |
| { | |
| echo -e "\n\e[00;31m#########################################################\e[00m" | |
| echo -e "\e[00;31m#\e[00m" "\e[00;33mLocal Linux Enumeration & Privilege Escalation Script\e[00m" "\e[00;31m#\e[00m" | |
| echo -e "\e[00;31m#########################################################\e[00m" | |
| echo -e "\e[00;33m# www.rebootuser.com\e[00m" | |
| echo -e "\e[00;33m# $version\e[00m\n" | |
| } | |
| debug_info() | |
| { | |
| echo "[-] Debug Info" | |
| if [ "$keyword" ]; then | |
| echo "[+] Searching for the keyword $keyword in conf, php, ini and log files" | |
| else | |
| : | |
| fi | |
| if [ "$report" ]; then | |
| echo "[+] Report name = $report" | |
| else | |
| : | |
| fi | |
| if [ "$export" ]; then | |
| echo "[+] Export location = $export" | |
| else | |
| : | |
| fi | |
| if [ "$thorough" ]; then | |
| echo "[+] Thorough tests = Enabled" | |
| else | |
| echo -e "\e[00;33m[+] Thorough tests = Disabled (SUID/GUID checks will not be perfomed!)\e[00m" | |
| fi | |
| sleep 2 | |
| if [ "$export" ]; then | |
| mkdir $export 2>/dev/null | |
| format=$export/LinEnum-export-`date +"%d-%m-%y"` | |
| mkdir $format 2>/dev/null | |
| else | |
| : | |
| fi | |
| who=`whoami` 2>/dev/null | |
| echo -e "\n" | |
| echo -e "\e[00;33mScan started at:"; date | |
| echo -e "\e[00m\n" | |
| } | |
| system_info() | |
| { | |
| echo -e "\e[00;33m### SYSTEM ##############################################\e[00m" | |
| #basic kernel info | |
| unameinfo=`uname -a 2>/dev/null` | |
| if [ "$unameinfo" ]; then | |
| echo -e "\e[00;31m[-] Kernel information:\e[00m\n$unameinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| procver=`cat /proc/version 2>/dev/null` | |
| if [ "$procver" ]; then | |
| echo -e "\e[00;31m[-] Kernel information (continued):\e[00m\n$procver" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #search all *-release files for version info | |
| release=`cat /etc/*-release 2>/dev/null` | |
| if [ "$release" ]; then | |
| echo -e "\e[00;31m[-] Specific release information:\e[00m\n$release" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #target hostname info | |
| hostnamed=`hostname 2>/dev/null` | |
| if [ "$hostnamed" ]; then | |
| echo -e "\e[00;31m[-] Hostname:\e[00m\n$hostnamed" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| } | |
| user_info() | |
| { | |
| echo -e "\e[00;33m### USER/GROUP ##########################################\e[00m" | |
| #current user details | |
| currusr=`id 2>/dev/null` | |
| if [ "$currusr" ]; then | |
| echo -e "\e[00;31m[-] Current user/group info:\e[00m\n$currusr" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #last logged on user information | |
| lastlogedonusrs=`lastlog 2>/dev/null |grep -v "Never" 2>/dev/null` | |
| if [ "$lastlogedonusrs" ]; then | |
| echo -e "\e[00;31m[-] Users that have previously logged onto the system:\e[00m\n$lastlogedonusrs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #who else is logged on | |
| loggedonusrs=`w 2>/dev/null` | |
| if [ "$loggedonusrs" ]; then | |
| echo -e "\e[00;31m[-] Who else is logged on:\e[00m\n$loggedonusrs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #lists all id's and respective group(s) | |
| grpinfo=`for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null` | |
| if [ "$grpinfo" ]; then | |
| echo -e "\e[00;31m[-] Group memberships:\e[00m\n$grpinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #added by phackt - look for adm group (thanks patrick) | |
| adm_users=$(echo -e "$grpinfo" | grep "(adm)") | |
| if [[ ! -z $adm_users ]]; | |
| then | |
| echo -e "\e[00;31m[-] It looks like we have some admin users:\e[00m\n$adm_users" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #checks to see if any hashes are stored in /etc/passwd (depreciated *nix storage method) | |
| hashesinpasswd=`grep -v '^[^:]*:[x]' /etc/passwd 2>/dev/null` | |
| if [ "$hashesinpasswd" ]; then | |
| echo -e "\e[00;33m[+] It looks like we have password hashes in /etc/passwd!\e[00m\n$hashesinpasswd" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #contents of /etc/passwd | |
| readpasswd=`cat /etc/passwd 2>/dev/null` | |
| if [ "$readpasswd" ]; then | |
| echo -e "\e[00;31m[-] Contents of /etc/passwd:\e[00m\n$readpasswd" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$readpasswd" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/passwd $format/etc-export/passwd 2>/dev/null | |
| else | |
| : | |
| fi | |
| #checks to see if the shadow file can be read | |
| readshadow=`cat /etc/shadow 2>/dev/null` | |
| if [ "$readshadow" ]; then | |
| echo -e "\e[00;33m[+] We can read the shadow file!\e[00m\n$readshadow" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$readshadow" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/shadow $format/etc-export/shadow 2>/dev/null | |
| else | |
| : | |
| fi | |
| #checks to see if /etc/master.passwd can be read - BSD 'shadow' variant | |
| readmasterpasswd=`cat /etc/master.passwd 2>/dev/null` | |
| if [ "$readmasterpasswd" ]; then | |
| echo -e "\e[00;33m[+] We can read the master.passwd file!\e[00m\n$readmasterpasswd" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$readmasterpasswd" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/master.passwd $format/etc-export/master.passwd 2>/dev/null | |
| else | |
| : | |
| fi | |
| #all root accounts (uid 0) | |
| superman=`grep -v -E "^#" /etc/passwd 2>/dev/null| awk -F: '$3 == 0 { print $1}' 2>/dev/null` | |
| if [ "$superman" ]; then | |
| echo -e "\e[00;31m[-] Super user account(s):\e[00m\n$superman" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #pull out vital sudoers info | |
| sudoers=`grep -v -e '^$' /etc/sudoers 2>/dev/null |grep -v "#" 2>/dev/null` | |
| if [ "$sudoers" ]; then | |
| echo -e "\e[00;31m[-] Sudoers configuration (condensed):\e[00m$sudoers" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$sudoers" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/sudoers $format/etc-export/sudoers 2>/dev/null | |
| else | |
| : | |
| fi | |
| #can we sudo without supplying a password | |
| sudoperms=`echo '' | sudo -S -l 2>/dev/null` | |
| if [ "$sudoperms" ]; then | |
| echo -e "\e[00;33m[+] We can sudo without supplying a password!\e[00m\n$sudoperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #known 'good' breakout binaries | |
| sudopwnage=`echo '' | sudo -S -l 2>/dev/null | grep -w 'nmap\|perl\|'awk'\|'find'\|'bash'\|'sh'\|'man'\|'more'\|'less'\|'vi'\|'emacs'\|'vim'\|'nc'\|'netcat'\|python\|ruby\|lua\|irb' | xargs -r ls -la 2>/dev/null` | |
| if [ "$sudopwnage" ]; then | |
| echo -e "\e[00;33m[+] Possible sudo pwnage!\e[00m\n$sudopwnage" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #who has sudoed in the past | |
| whohasbeensudo=`find /home -name .sudo_as_admin_successful 2>/dev/null` | |
| if [ "$whohasbeensudo" ]; then | |
| echo -e "\e[00;31m[-] Accounts that have recently used sudo:\e[00m\n$whohasbeensudo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #checks to see if roots home directory is accessible | |
| rthmdir=`ls -ahl /root/ 2>/dev/null` | |
| if [ "$rthmdir" ]; then | |
| echo -e "\e[00;33m[+] We can read root's home directory!\e[00m\n$rthmdir" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #displays /home directory permissions - check if any are lax | |
| homedirperms=`ls -ahl /home/ 2>/dev/null` | |
| if [ "$homedirperms" ]; then | |
| echo -e "\e[00;31m[-] Are permissions on /home directories lax:\e[00m\n$homedirperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #looks for files we can write to that don't belong to us | |
| if [ "$thorough" = "1" ]; then | |
| grfilesall=`find / -writable ! -user \`whoami\` -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null` | |
| if [ "$grfilesall" ]; then | |
| echo -e "\e[00;31m[-] Files not owned by user but writable by group:\e[00m\n$grfilesall" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| fi | |
| #looks for files that belong to us | |
| if [ "$thorough" = "1" ]; then | |
| ourfilesall=`find / -user \`whoami\` -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null` | |
| if [ "$ourfilesall" ]; then | |
| echo -e "\e[00;31m[-] Files owned by our user:\e[00m\n$ourfilesall" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| fi | |
| #looks for hidden files | |
| if [ "$thorough" = "1" ]; then | |
| hiddenfiles=`find / -name ".*" -type f ! -path "/proc/*" ! -path "/sys/*" -exec ls -al {} \; 2>/dev/null` | |
| if [ "$hiddenfiles" ]; then | |
| echo -e "\e[00;31m[-] Hidden files:\e[00m\n$hiddenfiles" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| fi | |
| #looks for world-reabable files within /home - depending on number of /home dirs & files, this can take some time so is only 'activated' with thorough scanning switch | |
| if [ "$thorough" = "1" ]; then | |
| wrfileshm=`find /home/ -perm -4 -type f -exec ls -al {} \; 2>/dev/null` | |
| if [ "$wrfileshm" ]; then | |
| echo -e "\e[00;31m[-] World-readable files within /home:\e[00m\n$wrfileshm" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| if [ "$thorough" = "1" ]; then | |
| if [ "$export" ] && [ "$wrfileshm" ]; then | |
| mkdir $format/wr-files/ 2>/dev/null | |
| for i in $wrfileshm; do cp --parents $i $format/wr-files/ ; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #lists current user's home directory contents | |
| if [ "$thorough" = "1" ]; then | |
| homedircontents=`ls -ahl ~ 2>/dev/null` | |
| if [ "$homedircontents" ] ; then | |
| echo -e "\e[00;31m[-] Home directory contents:\e[00m\n$homedircontents" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #checks for if various ssh files are accessible - this can take some time so is only 'activated' with thorough scanning switch | |
| if [ "$thorough" = "1" ]; then | |
| sshfiles=`find / \( -name "id_dsa*" -o -name "id_rsa*" -o -name "known_hosts" -o -name "authorized_hosts" -o -name "authorized_keys" \) -exec ls -la {} 2>/dev/null \;` | |
| if [ "$sshfiles" ]; then | |
| echo -e "\e[00;31m[-] SSH keys/host information found in the following locations:\e[00m\n$sshfiles" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| if [ "$thorough" = "1" ]; then | |
| if [ "$export" ] && [ "$sshfiles" ]; then | |
| mkdir $format/ssh-files/ 2>/dev/null | |
| for i in $sshfiles; do cp --parents $i $format/ssh-files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #is root permitted to login via ssh | |
| sshrootlogin=`grep "PermitRootLogin " /etc/ssh/sshd_config 2>/dev/null | grep -v "#" | awk '{print $2}'` | |
| if [ "$sshrootlogin" = "yes" ]; then | |
| echo -e "\e[00;31m[-] Root is allowed to login via SSH:\e[00m" ; grep "PermitRootLogin " /etc/ssh/sshd_config 2>/dev/null | grep -v "#" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| } | |
| environmental_info() | |
| { | |
| echo -e "\e[00;33m### ENVIRONMENTAL #######################################\e[00m" | |
| #env information | |
| envinfo=`env 2>/dev/null | grep -v 'LS_COLORS' 2>/dev/null` | |
| if [ "$envinfo" ]; then | |
| echo -e "\e[00;31m[-] Environment information:\e[00m\n$envinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #check if selinux is enabled | |
| sestatus=`sestatus 2>/dev/null` | |
| if [ "$sestatus" ]; then | |
| echo -e "\e[00;31m[-] SELinux seems to be present:\e[00m\n$sestatus" | |
| echo -e "\n" | |
| fi | |
| #phackt | |
| #current path configuration | |
| pathinfo=`echo $PATH 2>/dev/null` | |
| if [ "$pathinfo" ]; then | |
| echo -e "\e[00;31m[-] Path information:\e[00m\n$pathinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #lists available shells | |
| shellinfo=`cat /etc/shells 2>/dev/null` | |
| if [ "$shellinfo" ]; then | |
| echo -e "\e[00;31m[-] Available shells:\e[00m\n$shellinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #current umask value with both octal and symbolic output | |
| umaskvalue=`umask -S 2>/dev/null & umask 2>/dev/null` | |
| if [ "$umaskvalue" ]; then | |
| echo -e "\e[00;31m[-] Current umask value:\e[00m\n$umaskvalue" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #umask value as in /etc/login.defs | |
| umaskdef=`grep -i "^UMASK" /etc/login.defs 2>/dev/null` | |
| if [ "$umaskdef" ]; then | |
| echo -e "\e[00;31m[-] umask value as specified in /etc/login.defs:\e[00m\n$umaskdef" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #password policy information as stored in /etc/login.defs | |
| logindefs=`grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs 2>/dev/null` | |
| if [ "$logindefs" ]; then | |
| echo -e "\e[00;31m[-] Password and storage information:\e[00m\n$logindefs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$logindefs" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/login.defs $format/etc-export/login.defs 2>/dev/null | |
| else | |
| : | |
| fi | |
| } | |
| job_info() | |
| { | |
| echo -e "\e[00;33m### JOBS/TASKS ##########################################\e[00m" | |
| #are there any cron jobs configured | |
| cronjobs=`ls -la /etc/cron* 2>/dev/null` | |
| if [ "$cronjobs" ]; then | |
| echo -e "\e[00;31m[-] Cron jobs:\e[00m\n$cronjobs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #can we manipulate these jobs in any way | |
| cronjobwwperms=`find /etc/cron* -perm -0002 -type f -exec ls -la {} \; -exec cat {} 2>/dev/null \;` | |
| if [ "$cronjobwwperms" ]; then | |
| echo -e "\e[00;33m[+] World-writable cron jobs and file contents:\e[00m\n$cronjobwwperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #contab contents | |
| crontabvalue=`cat /etc/crontab 2>/dev/null` | |
| if [ "$crontabvalue" ]; then | |
| echo -e "\e[00;31m[-] Crontab contents:\e[00m\n$crontabvalue" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| crontabvar=`ls -la /var/spool/cron/crontabs 2>/dev/null` | |
| if [ "$crontabvar" ]; then | |
| echo -e "\e[00;31m[-] Anything interesting in /var/spool/cron/crontabs:\e[00m\n$crontabvar" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| anacronjobs=`ls -la /etc/anacrontab 2>/dev/null; cat /etc/anacrontab 2>/dev/null` | |
| if [ "$anacronjobs" ]; then | |
| echo -e "\e[00;31m[-] Anacron jobs and associated file permissions:\e[00m\n$anacronjobs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| anacrontab=`ls -la /var/spool/anacron 2>/dev/null` | |
| if [ "$anacrontab" ]; then | |
| echo -e "\e[00;31m[-] When were jobs last executed (/var/spool/anacron contents):\e[00m\n$anacrontab" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #pull out account names from /etc/passwd and see if any users have associated cronjobs (priv command) | |
| cronother=`cut -d ":" -f 1 /etc/passwd | xargs -n1 crontab -l -u 2>/dev/null` | |
| if [ "$cronother" ]; then | |
| echo -e "\e[00;31m[-] Jobs held by all users:\e[00m\n$cronother" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| } | |
| networking_info() | |
| { | |
| echo -e "\e[00;33m### NETWORKING ##########################################\e[00m" | |
| #nic information | |
| nicinfo=`/sbin/ifconfig -a 2>/dev/null` | |
| if [ "$nicinfo" ]; then | |
| echo -e "\e[00;31m[-] Network and IP info:\e[00m\n$nicinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #nic information (using ip) | |
| nicinfoip=`/sbin/ip a 2>/dev/null` | |
| if [ ! "$nicinfo" ] && [ "$nicinfoip" ]; then | |
| echo -e "\e[00;31m[-] Network and IP info:\e[00m\n$nicinfoip" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| arpinfo=`arp -a 2>/dev/null` | |
| if [ "$arpinfo" ]; then | |
| echo -e "\e[00;31m[-] ARP history:\e[00m\n$arpinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| arpinfoip=`ip n 2>/dev/null` | |
| if [ ! "$arpinfo" ] && [ "$arpinfoip" ]; then | |
| echo -e "\e[00;31m[-] ARP history:\e[00m\n$arpinfoip" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #dns settings | |
| nsinfo=`grep "nameserver" /etc/resolv.conf 2>/dev/null` | |
| if [ "$nsinfo" ]; then | |
| echo -e "\e[00;31m[-] Nameserver(s):\e[00m\n$nsinfo" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| nsinfosysd=`systemd-resolve --status 2>/dev/null` | |
| if [ "$nsinfosysd" ]; then | |
| echo -e "\e[00;31m[-] Nameserver(s):\e[00m\n$nsinfosysd" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #default route configuration | |
| defroute=`route 2>/dev/null | grep default` | |
| if [ "$defroute" ]; then | |
| echo -e "\e[00;31m[-] Default route:\e[00m\n$defroute" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #default route configuration | |
| defrouteip=`ip r 2>/dev/null | grep default` | |
| if [ ! "$defroute" ] && [ "$defrouteip" ]; then | |
| echo -e "\e[00;31m[-] Default route:\e[00m\n$defrouteip" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #listening TCP | |
| tcpservs=`netstat -antp 2>/dev/null` | |
| if [ "$tcpservs" ]; then | |
| echo -e "\e[00;31m[-] Listening TCP:\e[00m\n$tcpservs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| tcpservsip=`ss -t 2>/dev/null` | |
| if [ ! "$tcpservs" ] && [ "$tcpservsip" ]; then | |
| echo -e "\e[00;31m[-] Listening TCP:\e[00m\n$tcpservsip" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #listening UDP | |
| udpservs=`netstat -anup 2>/dev/null` | |
| if [ "$udpservs" ]; then | |
| echo -e "\e[00;31m[-] Listening UDP:\e[00m\n$udpservs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| udpservsip=`ip -u 2>/dev/null` | |
| if [ ! "$udpservs" ] && [ "$udpservsip" ]; then | |
| echo -e "\e[00;31m[-] Listening UDP:\e[00m\n$udpservsip" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| } | |
| services_info() | |
| { | |
| echo -e "\e[00;33m### SERVICES #############################################\e[00m" | |
| #running processes | |
| psaux=`ps aux 2>/dev/null` | |
| if [ "$psaux" ]; then | |
| echo -e "\e[00;31m[-] Running processes:\e[00m\n$psaux" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #lookup process binary path and permissisons | |
| procperm=`ps aux 2>/dev/null | awk '{print $11}'|xargs -r ls -la 2>/dev/null |awk '!x[$0]++' 2>/dev/null` | |
| if [ "$procperm" ]; then | |
| echo -e "\e[00;31m[-] Process binaries and associated permissions (from above list):\e[00m\n$procperm" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$procperm" ]; then | |
| procpermbase=`ps aux 2>/dev/null | awk '{print $11}' | xargs -r ls 2>/dev/null | awk '!x[$0]++' 2>/dev/null` | |
| mkdir $format/ps-export/ 2>/dev/null | |
| for i in $procpermbase; do cp --parents $i $format/ps-export/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| #anything 'useful' in inetd.conf | |
| inetdread=`cat /etc/inetd.conf 2>/dev/null` | |
| if [ "$inetdread" ]; then | |
| echo -e "\e[00;31m[-] Contents of /etc/inetd.conf:\e[00m\n$inetdread" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$inetdread" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/inetd.conf $format/etc-export/inetd.conf 2>/dev/null | |
| else | |
| : | |
| fi | |
| #very 'rough' command to extract associated binaries from inetd.conf & show permisisons of each | |
| inetdbinperms=`awk '{print $7}' /etc/inetd.conf 2>/dev/null |xargs -r ls -la 2>/dev/null` | |
| if [ "$inetdbinperms" ]; then | |
| echo -e "\e[00;31m[-] The related inetd binary permissions:\e[00m\n$inetdbinperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| xinetdread=`cat /etc/xinetd.conf 2>/dev/null` | |
| if [ "$xinetdread" ]; then | |
| echo -e "\e[00;31m[-] Contents of /etc/xinetd.conf:\e[00m\n$xinetdread" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$xinetdread" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/xinetd.conf $format/etc-export/xinetd.conf 2>/dev/null | |
| else | |
| : | |
| fi | |
| xinetdincd=`grep "/etc/xinetd.d" /etc/xinetd.conf 2>/dev/null` | |
| if [ "$xinetdincd" ]; then | |
| echo -e "\e[00;31m[-] /etc/xinetd.d is included in /etc/xinetd.conf - associated binary permissions are listed below:\e[00m"; ls -la /etc/xinetd.d 2>/dev/null | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #very 'rough' command to extract associated binaries from xinetd.conf & show permisisons of each | |
| xinetdbinperms=`awk '{print $7}' /etc/xinetd.conf 2>/dev/null |xargs -r ls -la 2>/dev/null` | |
| if [ "$xinetdbinperms" ]; then | |
| echo -e "\e[00;31m[-] The related xinetd binary permissions:\e[00m\n$xinetdbinperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| initdread=`ls -la /etc/init.d 2>/dev/null` | |
| if [ "$initdread" ]; then | |
| echo -e "\e[00;31m[-] /etc/init.d/ binary permissions:\e[00m\n$initdread" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #init.d files NOT belonging to root! | |
| initdperms=`find /etc/init.d/ \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` | |
| if [ "$initdperms" ]; then | |
| echo -e "\e[00;31m[-] /etc/init.d/ files not belonging to root:\e[00m\n$initdperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| rcdread=`ls -la /etc/rc.d/init.d 2>/dev/null` | |
| if [ "$rcdread" ]; then | |
| echo -e "\e[00;31m[-] /etc/rc.d/init.d binary permissions:\e[00m\n$rcdread" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #init.d files NOT belonging to root! | |
| rcdperms=`find /etc/rc.d/init.d \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` | |
| if [ "$rcdperms" ]; then | |
| echo -e "\e[00;31m[-] /etc/rc.d/init.d files not belonging to root:\e[00m\n$rcdperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| usrrcdread=`ls -la /usr/local/etc/rc.d 2>/dev/null` | |
| if [ "$usrrcdread" ]; then | |
| echo -e "\e[00;31m[-] /usr/local/etc/rc.d binary permissions:\e[00m\n$usrrcdread" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #rc.d files NOT belonging to root! | |
| usrrcdperms=`find /usr/local/etc/rc.d \! -uid 0 -type f 2>/dev/null |xargs -r ls -la 2>/dev/null` | |
| if [ "$usrrcdperms" ]; then | |
| echo -e "\e[00;31m[-] /usr/local/etc/rc.d files not belonging to root:\e[00m\n$usrrcdperms" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| } | |
| software_configs() | |
| { | |
| echo -e "\e[00;33m### SOFTWARE #############################################\e[00m" | |
| #sudo version - check to see if there are any known vulnerabilities with this | |
| sudover=`sudo -V 2>/dev/null| grep "Sudo version" 2>/dev/null` | |
| if [ "$sudover" ]; then | |
| echo -e "\e[00;31m[-] Sudo version:\e[00m\n$sudover" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #mysql details - if installed | |
| mysqlver=`mysql --version 2>/dev/null` | |
| if [ "$mysqlver" ]; then | |
| echo -e "\e[00;31m[-] MYSQL version:\e[00m\n$mysqlver" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #checks to see if root/root will get us a connection | |
| mysqlconnect=`mysqladmin -uroot -proot version 2>/dev/null` | |
| if [ "$mysqlconnect" ]; then | |
| echo -e "\e[00;33m[+] We can connect to the local MYSQL service with default root/root credentials!\e[00m\n$mysqlconnect" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #mysql version details | |
| mysqlconnectnopass=`mysqladmin -uroot version 2>/dev/null` | |
| if [ "$mysqlconnectnopass" ]; then | |
| echo -e "\e[00;33m[+] We can connect to the local MYSQL service as 'root' and without a password!\e[00m\n$mysqlconnectnopass" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #postgres details - if installed | |
| postgver=`psql -V 2>/dev/null` | |
| if [ "$postgver" ]; then | |
| echo -e "\e[00;31m[-] Postgres version:\e[00m\n$postgver" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #checks to see if any postgres password exists and connects to DB 'template0' - following commands are a variant on this | |
| postcon1=`psql -U postgres template0 -c 'select version()' 2>/dev/null | grep version` | |
| if [ "$postcon1" ]; then | |
| echo -e "\e[00;33m[+] We can connect to Postgres DB 'template0' as user 'postgres' with no password!:\e[00m\n$postcon1" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| postcon11=`psql -U postgres template1 -c 'select version()' 2>/dev/null | grep version` | |
| if [ "$postcon11" ]; then | |
| echo -e "\e[00;33m[+] We can connect to Postgres DB 'template1' as user 'postgres' with no password!:\e[00m\n$postcon11" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| postcon2=`psql -U pgsql template0 -c 'select version()' 2>/dev/null | grep version` | |
| if [ "$postcon2" ]; then | |
| echo -e "\e[00;33m[+] We can connect to Postgres DB 'template0' as user 'psql' with no password!:\e[00m\n$postcon2" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| postcon22=`psql -U pgsql template1 -c 'select version()' 2>/dev/null | grep version` | |
| if [ "$postcon22" ]; then | |
| echo -e "\e[00;33m[+] We can connect to Postgres DB 'template1' as user 'psql' with no password!:\e[00m\n$postcon22" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #apache details - if installed | |
| apachever=`apache2 -v 2>/dev/null; httpd -v 2>/dev/null` | |
| if [ "$apachever" ]; then | |
| echo -e "\e[00;31m[-] Apache version:\e[00m\n$apachever" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #what account is apache running under | |
| apacheusr=`grep -i 'user\|group' /etc/apache2/envvars 2>/dev/null |awk '{sub(/.*\export /,"")}1' 2>/dev/null` | |
| if [ "$apacheusr" ]; then | |
| echo -e "\e[00;31m[-] Apache user configuration:\e[00m\n$apacheusr" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$apacheusr" ]; then | |
| mkdir --parents $format/etc-export/apache2/ 2>/dev/null | |
| cp /etc/apache2/envvars $format/etc-export/apache2/envvars 2>/dev/null | |
| else | |
| : | |
| fi | |
| #installed apache modules | |
| apachemodules=`apache2ctl -M 2>/dev/null; httpd -M 2>/dev/null` | |
| if [ "$apachemodules" ]; then | |
| echo -e "\e[00;31m[-] Installed Apache modules:\e[00m\n$apachemodules" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #htpasswd check | |
| htpasswd=`find / -name .htpasswd -print -exec cat {} \; 2>/dev/null` | |
| if [ "$htpasswd" ]; then | |
| echo -e "\e[00;33m[-] htpasswd found - could contain passwords:\e[00m\n$htpasswd" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #anything in the default http home dirs | |
| apachehomedirs=`ls -alhR /var/www/ 2>/dev/null; ls -alhR /srv/www/htdocs/ 2>/dev/null; ls -alhR /usr/local/www/apache2/data/ 2>/dev/null; ls -alhR /opt/lampp/htdocs/ 2>/dev/null` | |
| if [ "$apachehomedirs" ]; then | |
| echo -e "\e[00;31m[-] www home dir contents:\e[00m\n$apachehomedirs" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| } | |
| interesting_files() | |
| { | |
| echo -e "\e[00;33m### INTERESTING FILES ####################################\e[00m" | |
| #checks to see if various files are installed | |
| echo -e "\e[00;31m[-] Useful file locations:\e[00m" ; which nc 2>/dev/null ; which netcat 2>/dev/null ; which wget 2>/dev/null ; which nmap 2>/dev/null ; which gcc 2>/dev/null; which curl 2>/dev/null | |
| echo -e "\n" | |
| #limited search for installed compilers | |
| compiler=`dpkg --list 2>/dev/null| grep compiler |grep -v decompiler 2>/dev/null && yum list installed 'gcc*' 2>/dev/null| grep gcc 2>/dev/null` | |
| if [ "$compiler" ]; then | |
| echo -e "\e[00;31m[-] Installed compilers:\e[00m\n$compiler" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #manual check - lists out sensitive files, can we read/modify etc. | |
| echo -e "\e[00;31m[-] Can we read/write sensitive files:\e[00m" ; ls -la /etc/passwd 2>/dev/null ; ls -la /etc/group 2>/dev/null ; ls -la /etc/profile 2>/dev/null; ls -la /etc/shadow 2>/dev/null ; ls -la /etc/master.passwd 2>/dev/null | |
| echo -e "\n" | |
| #search for suid files - this can take some time so is only 'activated' with thorough scanning switch (as are all suid scans below) | |
| if [ "$thorough" = "1" ]; then | |
| findsuid=`find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;` | |
| if [ "$findsuid" ]; then | |
| echo -e "\e[00;31m[-] SUID files:\e[00m\n$findsuid" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| if [ "$thorough" = "1" ]; then | |
| if [ "$export" ] && [ "$findsuid" ]; then | |
| mkdir $format/suid-files/ 2>/dev/null | |
| for i in $findsuid; do cp $i $format/suid-files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #list of 'interesting' suid files - feel free to make additions | |
| if [ "$thorough" = "1" ]; then | |
| intsuid=`find / -perm -4000 -type f 2>/dev/null | grep -w 'nmap\|perl\|'awk'\|'find'\|'bash'\|'sh'\|'man'\|'more'\|'less'\|'vi'\|'vim'\|'emacs'\|'nc'\|'netcat'\|python\|ruby\|lua\|irb\|pl' | xargs -r ls -la 2>/dev/null` | |
| if [ "$intsuid" ]; then | |
| echo -e "\e[00;33m[+] Possibly interesting SUID files:\e[00m\n$intsuid" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #lists word-writable suid files | |
| if [ "$thorough" = "1" ]; then | |
| wwsuid=`find / -perm -4007 -type f -exec ls -la {} 2>/dev/null \;` | |
| if [ "$wwsuid" ]; then | |
| echo -e "\e[00;33m[+] World-writable SUID files:\e[00m\n$wwsuid" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #lists world-writable suid files owned by root | |
| if [ "$thorough" = "1" ]; then | |
| wwsuidrt=`find / -uid 0 -perm -4007 -type f -exec ls -la {} 2>/dev/null \;` | |
| if [ "$wwsuidrt" ]; then | |
| echo -e "\e[00;33m[+] World-writable SUID files owned by root:\e[00m\n$wwsuidrt" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #search for guid files - this can take some time so is only 'activated' with thorough scanning switch (as are all guid scans below) | |
| if [ "$thorough" = "1" ]; then | |
| findguid=`find / -perm -2000 -type f -exec ls -la {} 2>/dev/null \;` | |
| if [ "$findguid" ]; then | |
| echo -e "\e[00;31m[-] GUID files:\e[00m\n$findguid" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| if [ "$thorough" = "1" ]; then | |
| if [ "$export" ] && [ "$findguid" ]; then | |
| mkdir $format/guid-files/ 2>/dev/null | |
| for i in $findguid; do cp $i $format/guid-files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #list of 'interesting' guid files - feel free to make additions | |
| if [ "$thorough" = "1" ]; then | |
| intguid=`find / -perm -2000 -type f 2>/dev/null | grep -w 'nmap\|perl\|'awk'\|'find'\|'bash'\|'sh'\|'man'\|'more'\|'less'\|'vi'\|'emacs'\|'vim'\|'nc'\|'netcat'\|python\|ruby\|lua\|irb\|pl' | xargs -r ls -la 2>/dev/null` | |
| if [ "$intguid" ]; then | |
| echo -e "\e[00;33m[+] Possibly interesting GUID files:\e[00m\n$intguid" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #lists world-writable guid files | |
| if [ "$thorough" = "1" ]; then | |
| wwguid=`find / -perm -2007 -type f -exec ls -la {} 2>/dev/null \;` | |
| if [ "$wwguid" ]; then | |
| echo -e "\e[00;33m[+] World-writable GUID files:\e[00m\n$wwguid" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #lists world-writable guid files owned by root | |
| if [ "$thorough" = "1" ]; then | |
| wwguidrt=`find / -uid 0 -perm -2007 -type f -exec ls -la {} 2>/dev/null \;` | |
| if [ "$wwguidrt" ]; then | |
| echo -e "\e[00;33m[+] World-writable GUID files owned by root:\e[00m\n$wwguidrt" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #list all world-writable files excluding /proc and /sys | |
| if [ "$thorough" = "1" ]; then | |
| wwfiles=`find / ! -path "*/proc/*" ! -path "/sys/*" -perm -2 -type f -exec ls -la {} 2>/dev/null \;` | |
| if [ "$wwfiles" ]; then | |
| echo -e "\e[00;31m[-] World-writable files (excluding /proc and /sys):\e[00m\n$wwfiles" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| if [ "$thorough" = "1" ]; then | |
| if [ "$export" ] && [ "$wwfiles" ]; then | |
| mkdir $format/ww-files/ 2>/dev/null | |
| for i in $wwfiles; do cp --parents $i $format/ww-files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| else | |
| : | |
| fi | |
| #are any .plan files accessible in /home (could contain useful information) | |
| usrplan=`find /home -iname *.plan -exec ls -la {} \; -exec cat {} 2>/dev/null \;` | |
| if [ "$usrplan" ]; then | |
| echo -e "\e[00;31m[-] Plan file permissions and contents:\e[00m\n$usrplan" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$usrplan" ]; then | |
| mkdir $format/plan_files/ 2>/dev/null | |
| for i in $usrplan; do cp --parents $i $format/plan_files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| bsdusrplan=`find /usr/home -iname *.plan -exec ls -la {} \; -exec cat {} 2>/dev/null \;` | |
| if [ "$bsdusrplan" ]; then | |
| echo -e "\e[00;31m[-] Plan file permissions and contents:\e[00m\n$bsdusrplan" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$bsdusrplan" ]; then | |
| mkdir $format/plan_files/ 2>/dev/null | |
| for i in $bsdusrplan; do cp --parents $i $format/plan_files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| #are there any .rhosts files accessible - these may allow us to login as another user etc. | |
| rhostsusr=`find /home -iname *.rhosts -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` | |
| if [ "$rhostsusr" ]; then | |
| echo -e "\e[00;33m[+] rhost config file(s) and file contents:\e[00m\n$rhostsusr" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$rhostsusr" ]; then | |
| mkdir $format/rhosts/ 2>/dev/null | |
| for i in $rhostsusr; do cp --parents $i $format/rhosts/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| bsdrhostsusr=`find /usr/home -iname *.rhosts -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` | |
| if [ "$bsdrhostsusr" ]; then | |
| echo -e "\e[00;33m[+] rhost config file(s) and file contents:\e[00m\n$bsdrhostsusr" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$bsdrhostsusr" ]; then | |
| mkdir $format/rhosts 2>/dev/null | |
| for i in $bsdrhostsusr; do cp --parents $i $format/rhosts/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| rhostssys=`find /etc -iname hosts.equiv -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` | |
| if [ "$rhostssys" ]; then | |
| echo -e "\e[00;33m[+] Hosts.equiv file and contents: \e[00m\n$rhostssys" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$rhostssys" ]; then | |
| mkdir $format/rhosts/ 2>/dev/null | |
| for i in $rhostssys; do cp --parents $i $format/rhosts/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| #list nfs shares/permisisons etc. | |
| nfsexports=`ls -la /etc/exports 2>/dev/null; cat /etc/exports 2>/dev/null` | |
| if [ "$nfsexports" ]; then | |
| echo -e "\e[00;31m[-] NFS config details: \e[00m\n$nfsexports" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$nfsexports" ]; then | |
| mkdir $format/etc-export/ 2>/dev/null | |
| cp /etc/exports $format/etc-export/exports 2>/dev/null | |
| else | |
| : | |
| fi | |
| if [ "$thorough" = "1" ]; then | |
| #phackt | |
| #displaying /etc/fstab | |
| fstab=`cat /etc/fstab 2>/dev/null` | |
| if [ "$fstab" ]; then | |
| echo -e "\e[00;31m[-] NFS displaying partitions and filesystems - you need to check if exotic filesystems\e[00m" | |
| echo -e "$fstab" | |
| echo -e "\n" | |
| fi | |
| fi | |
| #looking for credentials in /etc/fstab | |
| fstab=`grep username /etc/fstab 2>/dev/null |awk '{sub(/.*\username=/,"");sub(/\,.*/,"")}1' 2>/dev/null| xargs -r echo username: 2>/dev/null; grep password /etc/fstab 2>/dev/null |awk '{sub(/.*\password=/,"");sub(/\,.*/,"")}1' 2>/dev/null| xargs -r echo password: 2>/dev/null; grep domain /etc/fstab 2>/dev/null |awk '{sub(/.*\domain=/,"");sub(/\,.*/,"")}1' 2>/dev/null| xargs -r echo domain: 2>/dev/null` | |
| if [ "$fstab" ]; then | |
| echo -e "\e[00;33m[+] Looks like there are credentials in /etc/fstab!\e[00m\n$fstab" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$fstab" ]; then | |
| mkdir $format/etc-exports/ 2>/dev/null | |
| cp /etc/fstab $format/etc-exports/fstab done 2>/dev/null | |
| else | |
| : | |
| fi | |
| fstabcred=`grep cred /etc/fstab 2>/dev/null |awk '{sub(/.*\credentials=/,"");sub(/\,.*/,"")}1' 2>/dev/null | xargs -I{} sh -c 'ls -la {}; cat {}' 2>/dev/null` | |
| if [ "$fstabcred" ]; then | |
| echo -e "\e[00;33m[+] /etc/fstab contains a credentials file!\e[00m\n$fstabcred" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$fstabcred" ]; then | |
| mkdir $format/etc-exports/ 2>/dev/null | |
| cp /etc/fstab $format/etc-exports/fstab done 2>/dev/null | |
| else | |
| : | |
| fi | |
| #use supplied keyword and cat *.conf files for potential matches - output will show line number within relevant file path where a match has been located | |
| if [ "$keyword" = "" ]; then | |
| echo -e "[-] Can't search *.conf files as no keyword was entered\n" | |
| else | |
| confkey=`find / -maxdepth 4 -name *.conf -type f -exec grep -Hn $keyword {} \; 2>/dev/null` | |
| if [ "$confkey" ]; then | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .conf files (recursive 4 levels - output format filepath:identified line number where keyword appears):\e[00m\n$confkey" | |
| echo -e "\n" | |
| else | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .conf files (recursive 4 levels):\e[00m" | |
| echo -e "'$keyword' not found in any .conf files" | |
| echo -e "\n" | |
| fi | |
| fi | |
| if [ "$keyword" = "" ]; then | |
| : | |
| else | |
| if [ "$export" ] && [ "$confkey" ]; then | |
| confkeyfile=`find / -maxdepth 4 -name *.conf -type f -exec grep -lHn $keyword {} \; 2>/dev/null` | |
| mkdir --parents $format/keyword_file_matches/config_files/ 2>/dev/null | |
| for i in $confkeyfile; do cp --parents $i $format/keyword_file_matches/config_files/ ; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| fi | |
| #use supplied keyword and cat *.php files for potential matches - output will show line number within relevant file path where a match has been located | |
| if [ "$keyword" = "" ]; then | |
| echo -e "[-] Can't search *.php files as no keyword was entered\n" | |
| else | |
| phpkey=`find / -maxdepth 10 -name *.php -type f -exec grep -Hn $keyword {} \; 2>/dev/null` | |
| if [ "$phpkey" ]; then | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .php files (recursive 10 levels - output format filepath:identified line number where keyword appears):\e[00m\n$phpkey" | |
| echo -e "\n" | |
| else | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .php files (recursive 10 levels):\e[00m" | |
| echo -e "'$keyword' not found in any .php files" | |
| echo -e "\n" | |
| fi | |
| fi | |
| if [ "$keyword" = "" ]; then | |
| : | |
| else | |
| if [ "$export" ] && [ "$phpkey" ]; then | |
| phpkeyfile=`find / -maxdepth 10 -name *.php -type f -exec grep -lHn $keyword {} \; 2>/dev/null` | |
| mkdir --parents $format/keyword_file_matches/php_files/ 2>/dev/null | |
| for i in $phpkeyfile; do cp --parents $i $format/keyword_file_matches/php_files/ ; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| fi | |
| #use supplied keyword and cat *.log files for potential matches - output will show line number within relevant file path where a match has been located | |
| if [ "$keyword" = "" ];then | |
| echo -e "[-] Can't search *.log files as no keyword was entered\n" | |
| else | |
| logkey=`find / -maxdepth 4 -name *.log -type f -exec grep -Hn $keyword {} \; 2>/dev/null` | |
| if [ "$logkey" ]; then | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .log files (recursive 4 levels - output format filepath:identified line number where keyword appears):\e[00m\n$logkey" | |
| echo -e "\n" | |
| else | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .log files (recursive 4 levels):\e[00m" | |
| echo -e "'$keyword' not found in any .log files" | |
| echo -e "\n" | |
| fi | |
| fi | |
| if [ "$keyword" = "" ];then | |
| : | |
| else | |
| if [ "$export" ] && [ "$logkey" ]; then | |
| logkeyfile=`find / -maxdepth 4 -name *.log -type f -exec grep -lHn $keyword {} \; 2>/dev/null` | |
| mkdir --parents $format/keyword_file_matches/log_files/ 2>/dev/null | |
| for i in $logkeyfile; do cp --parents $i $format/keyword_file_matches/log_files/ ; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| fi | |
| #use supplied keyword and cat *.ini files for potential matches - output will show line number within relevant file path where a match has been located | |
| if [ "$keyword" = "" ];then | |
| echo -e "[-] Can't search *.ini files as no keyword was entered\n" | |
| else | |
| inikey=`find / -maxdepth 4 -name *.ini -type f -exec grep -Hn $keyword {} \; 2>/dev/null` | |
| if [ "$inikey" ]; then | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .ini files (recursive 4 levels - output format filepath:identified line number where keyword appears):\e[00m\n$inikey" | |
| echo -e "\n" | |
| else | |
| echo -e "\e[00;31m[-] Find keyword ($keyword) in .ini files (recursive 4 levels):\e[00m" | |
| echo -e "'$keyword' not found in any .ini files" | |
| echo -e "\n" | |
| fi | |
| fi | |
| if [ "$keyword" = "" ];then | |
| : | |
| else | |
| if [ "$export" ] && [ "$inikey" ]; then | |
| inikey=`find / -maxdepth 4 -name *.ini -type f -exec grep -lHn $keyword {} \; 2>/dev/null` | |
| mkdir --parents $format/keyword_file_matches/ini_files/ 2>/dev/null | |
| for i in $inikey; do cp --parents $i $format/keyword_file_matches/ini_files/ ; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| fi | |
| #quick extract of .conf files from /etc - only 1 level | |
| allconf=`find /etc/ -maxdepth 1 -name *.conf -type f -exec ls -la {} \; 2>/dev/null` | |
| if [ "$allconf" ]; then | |
| echo -e "\e[00;31m[-] All *.conf files in /etc (recursive 1 level):\e[00m\n$allconf" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$allconf" ]; then | |
| mkdir $format/conf-files/ 2>/dev/null | |
| for i in $allconf; do cp --parents $i $format/conf-files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| #extract any user history files that are accessible | |
| usrhist=`ls -la ~/.*_history 2>/dev/null` | |
| if [ "$usrhist" ]; then | |
| echo -e "\e[00;31m[-] Current user's history files:\e[00m\n$usrhist" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$usrhist" ]; then | |
| mkdir $format/history_files/ 2>/dev/null | |
| for i in $usrhist; do cp --parents $i $format/history_files/; done 2>/dev/null | |
| else | |
| : | |
| fi | |
| #can we read roots *_history files - could be passwords stored etc. | |
| roothist=`ls -la /root/.*_history 2>/dev/null` | |
| if [ "$roothist" ]; then | |
| echo -e "\e[00;33m[+] Root's history files are accessible!\e[00m\n$roothist" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$roothist" ]; then | |
| mkdir $format/history_files/ 2>/dev/null | |
| cp $roothist $format/history_files/ 2>/dev/null | |
| else | |
| : | |
| fi | |
| #all accessible .bash_history files in /home | |
| checkbashhist=`find /home -name .bash_history -print -exec cat {} 2>/dev/null \;` | |
| if [ "$checkbashhist" ]; then | |
| echo -e "\e[00;31m[-] Location and contents (if accessible) of .bash_history file(s):\e[00m\n$checkbashhist" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #is there any mail accessible | |
| readmail=`ls -la /var/mail 2>/dev/null` | |
| if [ "$readmail" ]; then | |
| echo -e "\e[00;31m[-] Any interesting mail in /var/mail:\e[00m\n$readmail" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #can we read roots mail | |
| readmailroot=`head /var/mail/root 2>/dev/null` | |
| if [ "$readmailroot" ]; then | |
| echo -e "\e[00;33m[+] We can read /var/mail/root! (snippet below)\e[00m\n$readmailroot" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| if [ "$export" ] && [ "$readmailroot" ]; then | |
| mkdir $format/mail-from-root/ 2>/dev/null | |
| cp $readmailroot $format/mail-from-root/ 2>/dev/null | |
| else | |
| : | |
| fi | |
| } | |
| docker_checks() | |
| { | |
| #specific checks - check to see if we're in a docker container | |
| dockercontainer=` grep -i docker /proc/self/cgroup 2>/dev/null; find / -name "*dockerenv*" -exec ls -la {} \; 2>/dev/null` | |
| if [ "$dockercontainer" ]; then | |
| echo -e "\e[00;33m[+] Looks like we're in a Docker container:\e[00m\n$dockercontainer" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #specific checks - check to see if we're a docker host | |
| dockerhost=`docker --version 2>/dev/null; docker ps -a 2>/dev/null` | |
| if [ "$dockerhost" ]; then | |
| echo -e "\e[00;33m[+] Looks like we're hosting Docker:\e[00m\n$dockerhost" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #specific checks - are we a member of the docker group | |
| dockergrp=`id | grep -i docker 2>/dev/null` | |
| if [ "$dockergrp" ]; then | |
| echo -e "\e[00;33m[+] We're a member of the (docker) group - could possibly misuse these rights!\e[00m\n$dockergrp" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #specific checks - are there any docker files present | |
| dockerfiles=`find / -name Dockerfile -exec ls -l {} 2>/dev/null \;` | |
| if [ "$dockerfiles" ]; then | |
| echo -e "\e[00;31m[-] Anything juicy in the Dockerfile:\e[00m\n$dockerfiles" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| #specific checks - are there any docker files present | |
| dockeryml=`find / -name docker-compose.yml -exec ls -l {} 2>/dev/null \;` | |
| if [ "$dockeryml" ]; then | |
| echo -e "\e[00;31m[-] Anything juicy in docker-compose.yml:\e[00m\n$dockeryml" | |
| echo -e "\n" | |
| else | |
| : | |
| fi | |
| } | |
| lxc_container_checks() | |
| { | |
| #specific checks - are we in an lxd/lxc container | |
| lxccontainer=`grep -qa container=lxc /proc/1/environ 2>/dev/null` | |
| if [ "$lxccontainer" ]; then | |
| echo -e "\e[00;33m[+] Looks like we're in a lxc container:\e[00m\n$lxccontainer" | |
| echo -e "\n" | |
| fi | |
| #specific checks - are we a member of the lxd group | |
| lxdgroup=`id | grep -i lxd 2>/dev/null` | |
| if [ "$lxdgroup" ]; then | |
| echo -e "\e[00;33m[+] We're a member of the (lxd) group - could possibly misuse these rights!\e[00m\n$lxdgroup" | |
| echo -e "\n" | |
| fi | |
| } | |
| footer() | |
| { | |
| echo -e "\e[00;33m### SCAN COMPLETE ####################################\e[00m" | |
| } | |
| call_each() | |
| { | |
| header | |
| debug_info | |
| system_info | |
| user_info | |
| environmental_info | |
| job_info | |
| networking_info | |
| services_info | |
| software_configs | |
| interesting_files | |
| docker_checks | |
| lxc_container_checks | |
| footer | |
| } | |
| while getopts "h:k:r:e:t" option; do | |
| case "${option}" in | |
| k) keyword=${OPTARG};; | |
| r) report=${OPTARG}"-"`date +"%d-%m-%y"`;; | |
| e) export=${OPTARG};; | |
| t) thorough=1;; | |
| h) usage; exit;; | |
| *) usage; exit;; | |
| esac | |
| done | |
| call_each | tee -a $report 2> /dev/null | |
| #EndOfScript |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment