Created
October 23, 2019 01:05
-
-
Save mainframed/c52a4dc93d2ab16d39a4da9b3f38bbe0 to your computer and use it in GitHub Desktop.
OMVSenum.sh
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/sh | |
# Special Thanks: @bigendiansmalls for some commands and help | |
# Mainframe hackers 4 lyfe | |
# based on LinEnum.sh | |
#Config | |
useful="nc netcat wget nmap gcc python curl" | |
compilers="c89 c99 c++ xlc cc javac" | |
username=`logname` | |
## TODO | |
###################### END CONFIG ################################ | |
if echo $PATH|grep -q "/bin"; then | |
: | |
else | |
set PATH=$PATH:/bin | |
fi | |
if echo $PATH|grep -q sbin; then | |
: | |
else | |
set PATH=$PATH:/usr/sbin | |
fi | |
version="version 0.1b" | |
usage() | |
{ | |
echo "\n\ | |
########################################################################\n\ | |
# Local Unix System Services Enumeration & Privilege Escalation Script #\n\ | |
########################################################################\n\ | |
# Soldier of FORTRAN # @mainframed767 #\n\ | |
########################################################################\n\ | |
# $version\n\ | |
# Based on LinEnum.sh\n\ | |
# Example: $0 -k keyword -r report -e /tmp/ -t\n\ | |
OPTIONS:\n\ | |
-k\tEnter keyword\n\ | |
-e\tEnter export location\n\ | |
-r\tEnter report name\n\ | |
-t\tThorough tests (takes longer)\n\ | |
-h\tDisplays this help text\n\ | |
\n\ | |
Running with no options = limited scans/no output file\n\ | |
########################################################################" | |
# useful binaries (thanks to https://gtfobins.github.io/) | |
set binarylist = 'aria2c\|arp\|ash\|awk\|base64\|bash\|busybox\|cat\|chmod\|chown\|cp\|csh\|curl\|cut\|dash\|date\|dd\|diff\|dmsetup\|docker\|ed\|emacs\|env\|expand\|expect\|file\|find\|flock\|fmt\|fold\|ftp\|gawk\|gdb\|gimp\|git\|grep\|head\|ht\|iftop\|ionice\|ip$\|irb\|jjs\|jq\|jrunscript\|ksh\|ld.so\|ldconfig\|less\|logsave\|lua\|make\|man\|mawk\|more\|mv\|mysql\|nano\|nawk\|nc\|netcat\|nice\|nl\|nmap\|node\|od\|openssl\|perl\|pg\|php\|pic\|pico\|python\|readelf\|rlwrap\|rpm\|rpmquery\|rsync\|ruby\|run-parts\|rvim\|scp\|script\|sed\|setarch\|sftp\|sh\|shuf\|socat\|sort\|sqlite3\|ssh$\|start-stop-daemon\|stdbuf\|strace\|systemctl\|tail\|tar\|taskset\|tclsh\|tee\|telnet\|tftp\|time\|timeout\|ul\|unexpand\|uniq\|unshare\|vi\|vim\|watch\|wget\|wish\|xargs\|xxd\|zip\|zsh' | |
} | |
header() | |
{ | |
echo "\n########################################################################" | |
echo "# Local Unix System Services Enumeration & Privilege Escalation Script #" | |
echo "########################################################################" | |
echo "# Soldier of FORTRAN # @mainframed767 #" | |
echo "########################################################################" | |
echo "# $version" | |
echo "# Time: " `date` | |
} | |
footer() | |
{ | |
echo "\n####### Scan complete #################################################" | |
echo "# Time: " `date` "\n\n" | |
} | |
debug_info() | |
{ | |
echo "[-] Debug Info" | |
if [ "$keyword" ]; then | |
echo "[+] Searching for the keyword $keyword in conf, php, ini and log files" | |
fi | |
if [ "$report" ]; then | |
echo "[+] Report name = $report" | |
fi | |
if [ "$export" ]; then | |
echo "[+] Export location = $export" | |
fi | |
if [ "$thorough" ]; then | |
echo "[+] Thorough tests = Enabled" | |
else | |
echo "[+] Thorough tests = Disabled" | |
fi | |
sleep 2 | |
if [ "$export" ]; then | |
mkdir $export 2>/dev/null | |
format=$export/USSEnum-export-`date +"%d-%m-%y"` | |
mkdir $format 2>/dev/null | |
fi | |
who=`whoami` 2>/dev/null | |
} | |
system_info() | |
{ | |
echo "\n####### System Info ###################################################\n" | |
#basic kernel info | |
unameinfo=`uname -Ia 2>/dev/null` | |
if [ "$unameinfo" ]; then | |
echo "[-] Kernel information: $unameinfo" | |
fi | |
#target hostname info | |
hostnamed=`hostname 2>/dev/null` | |
if [ "$hostnamed" ]; then | |
echo "[-] Hostname: $hostnamed" | |
fi | |
# The name of the system (LPAR) | |
sysname=`sysvar SYSNAME 2>/dev/null` | |
if [ "$sysname" ]; then | |
echo "[-] LPAR Name: $sysname" | |
fi | |
# The version, release, and modification level of the operating system software product | |
# Zxvvrrmm where | |
# Zx is the operating system (for example, Z1 is z/OS) | |
# vv is the version number from ECVTPVER (for example, 02) | |
# rr is the release number from ECVTPREL (for example, 01) | |
# mm is the modification number from ECVTPMOD (for example, 00). | |
# Example For z/OS 2.1, the value is Z1020100. | |
sysoslvl=`sysvar SYSOSLVL 2>/dev/null` | |
if [ "$sysoslvl" ]; then | |
echo "[-] OS version: $sysoslvl" | |
fi | |
sysver=`sysvar SYSVER 2>/dev/null` | |
if [ "$sysver" ]; then | |
echo "[-] System Version: $sysver" | |
fi | |
unixver=`sysvar UNIXVER 2>/dev/null` | |
if [ "$unixver" ]; then | |
echo "[-] Unix Version: $unixver" | |
fi | |
# The IPL Volume Serial name | |
sysr1=`sysvar SYSR1 2>/dev/null` | |
if [ "$sysr1" ]; then | |
echo "[-] IPL Volume Serial: $sysr1" | |
fi | |
# The architecture level of the system | |
sysalvl=`sysvar SYSALVL 2>/dev/null` | |
if [ "$sysalvl" ]; then | |
echo "[-] Architecture level of the system: $sysalvl" | |
fi | |
# Shorthand notation for the name of the system; often used in fields that are limited to two characters. | |
sysclone=`sysvar SYSCLONE 2>/dev/null` | |
if [ "$sysclone" ]; then | |
echo "[-] Shorthand notation for the name of the system: $sysclone" | |
fi | |
# The name of the sysplex. | |
sysplex=`sysvar SYSPLEX 2>/dev/null` | |
if [ "$sysplex" ]; then | |
echo "[-] Name of the sysplex: $sysplex" | |
fi | |
# ADCD? | |
adcdlvl=`sysvar ADCDLVL 2>/dev/null` | |
if [ "$adcdlvl" ]; then | |
echo "[-] Running ADCD version: $adcdlvl" | |
fi | |
# Unknown - maybe add later? | |
#&SYSC1. | |
#&SYSP1. | |
#&SYSP2. | |
#&SYSP3. | |
#&SYSR2. | |
#&SYSS1. | |
} | |
user_info() | |
{ | |
echo "\n####### User/ Group ###################################################\n" | |
#current user details | |
currusr=`id 2>/dev/null` | |
if [ "$currusr" ]; then | |
echo "[-] Current user/group info:\n $currusr" | |
echo "\n" | |
fi | |
#current user details RACF | |
currusr=`/bin/tsocmd LU 2>/dev/null` | |
if [ "$currusr" ]; then | |
racf=`true` | |
echo "[-] Current user/group RACF info:\n $currusr" | |
echo "\n" | |
fi | |
#current user details TopSecret | |
currusr=`/bin/tsocmd TSS WHOAMI 2>/dev/null` | |
if [ "$currusr" ]; then | |
echo "[-] Current user/group TSS info:\n $currusr" | |
echo "\n" | |
fi | |
# Owner of the root file system | |
uidzero=`ls -ald /|awk '{print $3}'` | |
if [ "$uidzero" ]; then | |
echo "[-] Root user ID: $uidzero"; id $uidzero | |
echo "\n" | |
fi | |
# Display group information | |
usernum=`/bin/tsocmd lg 2>/dev/null|grep -ni "USER(S)="|cut -d":" -f1` | |
if [ "$usernum" ]; then | |
total_lines=`/bin/tsocmd lg 2>/dev/null|wc|awk '{print $1}'` | |
group_lines=`expr $total_lines - $usernum` | |
group_users=`/bin/tsocmd lg 2>/dev/null|tail -n $group_lines|grep -v CONNECT|grep -v REVOKE|awk '{print "\t"$1}'` | |
echo "[-] Default RACF group users:\n$group_users" | |
fi | |
# Display subgroup information | |
if [ "$usernum" ]; then | |
sub_group=`/bin/tsocmd lg 2>/dev/null|grep -ni "SUBGROUP(S)="|cut -d":" -f1` | |
tail_num=`expr $usernum - $sub_group` | |
head_num=`expr $usernum - 1` | |
group_users=`/bin/tsocmd lg 2>/dev/null|head -n $head_num|tail -n $tail_num|sed 's/SUBGROUP(S)=/ /'` | |
if [ "$sub_group" ]; then | |
echo "[-] Current RACF Subgroups:\n$group_users" | |
fi | |
if [ "$thorough" = "1" ]; then | |
if [ "$sub_group" ]; then | |
for i in $group_users; do | |
usernum=`/bin/tsocmd lg $i 2>/dev/null|grep -ni "USER(S)="|cut -d":" -f1` | |
if [ "$usernum" ]; then | |
total_lines=`/bin/tsocmd lg $i 2>/dev/null|wc|awk '{print $1}'` | |
group_lines=`expr $total_lines - $usernum` | |
group_users=`/bin/tsocmd lg $i 2>/dev/null|tail -n $group_lines|grep -v CONNECT|grep -v REVOKE|awk '{print "\t"$1}'` | |
echo "[-] Sub group $i users:\n$group_users" | |
fi | |
done | |
echo "[-] Current RACF group users:\n$group_users" | |
echo "\n" | |
fi | |
fi | |
fi | |
#who else is logged on | |
loggedonusrs=`who 2>/dev/null` | |
if [ "$loggedonusrs" ]; then | |
echo "[-] Who else is logged on:\n$loggedonusrs" | |
echo "\n" | |
fi | |
#can we su without supplying a password | |
su -s 2>/dev/null <<EOF | |
echo '' | |
EOF | |
su_rc=$? | |
if [ "$su_rc" ]; then | |
echo "[+] We can su to root without supplying a password!" | |
echo "\n" | |
fi | |
# Checks for system special | |
special=`/bin/tsocmd lu 2>/dev/null|grep SPECIAL` | |
if [ "$special" ]; then | |
echo "[+] We are SYSTEM SPECIAL (RACF admin)!" | |
echo "\n" | |
fi | |
# Checks for system operations | |
operations=`/bin/tsocmd lu 2>/dev/null|grep OPERATIONS` | |
if [ "$operations" ]; then | |
echo "[+] We are SYSTEM OPERATIONS (read any dataset)!" | |
echo "\n" | |
fi | |
#displays /u directory permissions - check if any are lax | |
homedirperms=`ls -Alp /u/ 2>/dev/null` | |
if [ "$homedirperms" ]; then | |
echo "[-] Are permissions on /u directories lax:\n$homedirperms" | |
echo "\n" | |
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 -exec ls -al {} \; 2>/dev/null` | |
if [ "$grfilesall" ]; then | |
echo "[-] Files not owned by user but writable by group:\n$grfilesall" | |
echo "\n" | |
fi | |
fi | |
#looks for files that belong to us | |
if [ "$thorough" = "1" ]; then | |
ourfilesall=`find / -user \`whoami\` -type f -exec ls -al {} \; 2>/dev/null` | |
if [ "$ourfilesall" ]; then | |
echo "[-] Files owned by our user:\n$ourfilesall" | |
echo "\n" | |
fi | |
fi | |
#looks for hidden files | |
if [ "$thorough" = "1" ]; then | |
hiddenfiles=`find / -name ".*" -type f -exec ls -al {} \; 2>/dev/null` | |
if [ "$hiddenfiles" ]; then | |
echo "[-] Hidden files:\n$hiddenfiles" | |
echo "\n" | |
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 /u/ -perm -4 -type f -exec ls -al {} \; 2>/dev/null` | |
if [ "$wrfileshm" ]; then | |
echo "[-] World-readable files within /u:\n$wrfileshm" | |
echo "\n" | |
fi | |
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 | |
fi | |
fi | |
#lists current user's home directory contents | |
homedircontents=`ls -Alsk ~ 2>/dev/null` | |
if [ "$homedircontents" ] ; then | |
echo "[-] Home directory contents:\n$homedircontents" | |
echo "\n" | |
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 "[-] SSH keys/host information found in the following locations:\n$sshfiles" | |
echo "\n" | |
fi | |
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 | |
fi | |
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 "[-] Root is allowed to login via SSH:" ; grep "PermitRootLogin " /etc/ssh/sshd_config 2>/dev/null | grep -v "#" | |
echo "\n" | |
fi | |
} | |
environmental_info() | |
{ | |
echo "\n####### Environmental #################################################\n" | |
#env information | |
envinfo=`env 2>/dev/null | grep -v 'LS_COLORS' 2>/dev/null` | |
if [ "$envinfo" ]; then | |
echo "[-] Environment information:\n$envinfo" | |
echo "\n" | |
fi | |
#current path configuration | |
pathinfo=`echo $PATH 2>/dev/null` | |
if [ "$pathinfo" ]; then | |
echo "[-] Path information:\n$pathinfo" | |
echo "\n" | |
fi | |
#current umask value with both octal and symbolic output | |
umaskvalue=`umask -S 2>/dev/null & umask 2>/dev/null` | |
if [ "$umaskvalue" ]; then | |
echo "[-] Current umask value:\n$umaskvalue" | |
echo "\n" | |
fi | |
} | |
job_info() | |
{ | |
echo "\n####### Jobs/Tasks ####################################################\n" | |
#are there any cron jobs configured | |
cronjobs=`ls -la /etc/cron* 2>/dev/null` | |
if [ "$cronjobs" ]; then | |
echo "[-] Cron jobs:\n$cronjobs" | |
echo "\n" | |
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 "[+] World-writable cron jobs and file contents:\n$cronjobwwperms" | |
echo "\n" | |
fi | |
#contab contents | |
crontabvalue=`cat /etc/crontab 2>/dev/null` | |
if [ "$crontabvalue" ]; then | |
echo "[-] Crontab contents:\n$crontabvalue" | |
echo "\n" | |
fi | |
crontabvar=`ls -la /var/spool/cron/crontabs 2>/dev/null` | |
if [ "$crontabvar" ]; then | |
echo "[-] Anything interesting in /var/spool/cron/crontabs:\n$crontabvar" | |
echo "\n" | |
fi | |
} | |
networking_info() | |
{ | |
echo "\n####### Networking ####################################################" | |
#nic information | |
nicinfo=`netstat -h 2>/dev/null` | |
if [ "$nicinfo" ]; then | |
echo "[-] Network and IP info:\n$nicinfo" | |
echo "\n" | |
fi | |
arpinfo=`netstat -R ALL 2>/dev/null` | |
if [ "$arpinfo" ]; then | |
echo "[-] ARP history:\n$arpinfo" | |
echo "\n" | |
fi | |
#dns settings | |
DNSdomainname=`dnsdomainname 2> /dev/null` | |
if [ "$DNSdomainname" ]; then | |
echo "[-] Hostname:\n$DNSdomainname" | |
echo "\n" | |
fi | |
dnsserver=`dnsdomainname|grep Server|sed 's/Server: //' 2> /dev/null` | |
if [ "$dnsserver" ]; then | |
echo "[-] DNS Server:\n$dnsserver" | |
echo "\n" | |
fi | |
#default route configuration | |
defroute=`netstat -r 2>/dev/null` | |
if [ "$defroute" ]; then | |
echo "[-] Routes:\n$defroute" | |
echo "\n" | |
fi | |
#default route configuration | |
defrouteip=`netstat -r 2>/dev/null | grep Default` | |
if [ ! "$defroute" ] && [ "$defrouteip" ]; then | |
echo "[-] Default route:\n$defrouteip" | |
echo "\n" | |
fi | |
#listening TCP | |
tcpservs=`netstat 2>/dev/null|grep -v UDP|grep Listen` | |
if [ "$tcpservs" ]; then | |
echo "[-] Listening TCP:\n$tcpservs" | |
echo "\n" | |
fi | |
#Connected TCP | |
tcpservs=`netstat 2>/dev/null|grep -v UDP|grep -v Listen` | |
if [ "$tcpservs" ]; then | |
echo "[-] Established TCP:\n$tcpservs" | |
echo "\n" | |
fi | |
#listening UDP | |
udpservs=`netstat 2>/dev/null|grep UDP` | |
if [ "$udpservs" ]; then | |
echo "[-] Listening UDP:\n$udpservs" | |
echo "\n" | |
fi | |
} | |
services_info() | |
{ | |
echo "\n####### Services ####################################################\n" | |
#running processes | |
# OMVS is more secure and only lets you list running processes | |
# We can do some grep magic here | |
username=`id -u -nr 2>/dev/null` | |
psef=`ps -ef 2>/dev/null |grep -v UID|grep -v $username` | |
if [ "$psef" ]; then | |
psef_good=`ps -ef 2>/dev/null` | |
if [ "$psef_good" ]; then | |
echo "[+] Access to list all processes:\n[-] List processes:\n$psef_good" | |
echo "\n" | |
fi | |
else | |
echo "[!] This user cannot list prosses for all users skipping steps\n" | |
fi | |
#anything 'useful' in inetd.conf | |
inetdread=`cat /etc/inetd.conf 2>/dev/null` | |
if [ "$inetdread" ]; then | |
echo "[-] Contents of /etc/inetd.conf:\n$inetdread" | |
echo "\n" | |
fi | |
if [ "$export" ] && [ "$inetdread" ]; then | |
mkdir $format/etc-export/ 2>/dev/null | |
cp /etc/inetd.conf $format/etc-export/inetd.conf 2>/dev/null | |
fi | |
#very 'rough' command to extract associated binaries from inetd.conf & show permisisons of each | |
inetdbinperms=`awk '{print $6}' /etc/inetd.conf 2>/dev/null |xargs ls -laskL 2>/dev/null` | |
if [ "$inetdbinperms" ]; then | |
echo "[-] The related inetd binary permissions:\n$inetdbinperms" | |
echo "\n" | |
fi | |
} | |
software_configs() | |
{ | |
echo "\n####### Sotfware ####################################################\n" | |
#TODO: This needs to have more stuff added | |
# - zosmf? | |
# - Websphere? | |
# | |
#htpasswd check | |
if [ "$thorough" = "1" ]; then | |
htpasswd=`find / -name .htpasswd -print -exec cat {} \; 2>/dev/null` | |
if [ "$htpasswd" ]; then | |
echo "-] htpasswd found - could contain passwords:\n$htpasswd" | |
echo "\n" | |
fi | |
else | |
echo "[-] Not in thorough mode nothing to see here" | |
fi | |
} | |
interesting_files() | |
{ | |
echo "\n####### Interesting Files ###########################################\n" | |
#checks to see if various files are installed | |
#useful programs | |
echo "[-] Useful file locations:\n" | |
for prog in $useful; do | |
echo "which $prog" |/bin/tcsh -s | |
done | |
echo "\n" | |
#installed compilers | |
echo "[-] Installed compilers:\n" | |
for prog in $compilers; do | |
echo "which $prog" |/bin/tcsh -s|grep -v FSUC1306 | |
done | |
echo "\n" | |
javac=`find /usr/lpp/java -name javac -type f 2>/dev/null` | |
if [ "$javac" ]; then | |
echo "[-] Java compilers:\n$javac" | |
echo "\n" | |
fi | |
if [ "$thorough" = "1" ]; then | |
# OMVS can be massive so we put this all in a thorough search | |
#search for suid files | |
findsuidapf=`find / \( -perm -4000 -o -ext a \) -type f -exec ls -laE {} 2>/dev/null \;` | |
if [ "$findsuidapf" ]; then | |
echo "[-] SUID and APF files:\n$findsuidapf" | |
echo "\n" | |
fi | |
if [ "$export" ] && [ "$findsuidapf" ]; then | |
mkdir $format/suid-apf-files/ 2>/dev/null | |
for i in $findsuidapf; do cp $i $format/suid-files/; done 2>/dev/null | |
fi | |
#list of 'interesting' suid files - feel free to make additions | |
intsuid=`find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null | grep -w $binarylist 2>/dev/null` | |
if [ "$intsuid" ]; then | |
echo "[+] Possibly interesting SUID files:\n$intsuid" | |
echo "\n" | |
fi | |
#lists word-writable suid files | |
wwsuid=`find / -ext a -perm -4002 -type f -exec ls -la {} 2>/dev/null \;` | |
if [ "$wwsuid" ]; then | |
echo "[+] World-writable SUID files:\n$wwsuid" | |
echo "\n" | |
fi | |
wwapf=`find ./ -ext a -perm -0002 -type f -exec ls -laE {} 2>/dev/null \;` | |
if [ "$wwapf" ]; then | |
echo "[-] World-writeable APF files:\n$wwapf" | |
echo "\n" | |
fi | |
#lists world-writable suid files owned by root | |
wwsuidrt=`find / -user $uidzero -perm -4002 -type f -exec ls -la {} 2>/dev/null \;` | |
if [ "$wwsuidrt" ]; then | |
echo "[+] World-writable SUID files owned by $uidzero:\n$wwsuidrt" | |
echo "\n" | |
fi | |
#search for sgid files | |
findsgid=`find / -perm -2000 -type f -exec ls -la {} 2>/dev/null \;` | |
if [ "$findsgid" ]; then | |
echo "[-] SGID files:\n$findsgid" | |
echo "\n" | |
fi | |
if [ "$export" ] && [ "$findsgid" ]; then | |
mkdir $format/sgid-files/ 2>/dev/null | |
for i in $findsgid; do cp $i $format/sgid-files/; done 2>/dev/null | |
fi | |
#list of 'interesting' sgid files | |
#intsgid=`find / -perm -2000 -type f -exec ls -la {} \; 2>/dev/null | grep -w $binarylist 2>/dev/null` | |
#if [ "$intsgid" ]; then | |
# echo "[+] Possibly interesting SGID files:\n$intsgid" | |
# echo "\n" | |
#fi | |
#lists world-writable sgid files | |
wwsgid=`find / -perm -2002 -type f -exec ls -la {} 2>/dev/null \;` | |
if [ "$wwsgid" ]; then | |
echo "[+] World-writable SGID files:\n$wwsgid" | |
echo "\n" | |
fi | |
#lists world-writable sgid files owned by root | |
wwsgidrt=`find / -user $uidzero -perm -2002 -type f -exec ls -la {} 2>/dev/null \;` | |
if [ "$wwsgidrt" ]; then | |
echo "[+] World-writable SGID files owned by root:\n$wwsgidrt" | |
echo "\n" | |
fi | |
fi | |
#look for keys | |
keyfiles=`find /u/ -type f -exec grep -l "PRIVATE KEY-----" {} 2> /dev/null \;` | |
if [ "$keyfiles" ]; then | |
echo "[+] Secret keys found!:\n$keyfiles" | |
echo "\n" | |
fi | |
#look for git credential files - thanks djhohnstein | |
if [ "$thorough" = "1" ]; then | |
gitcredfiles=`find / -name ".git-credentials" 2>/dev/null` | |
if [ "$gitcredfiles" ]; then | |
echo "[+] Git credentials saved on the machine!:\n$gitcredfiles" | |
echo "\n" | |
fi | |
fi | |
#list all world-writable files | |
if [ "$thorough" = "1" ]; then | |
wwfiles=`find / ! -perm -2 -type f -exec ls -la {} 2>/dev/null \;` | |
if [ "$wwfiles" ]; then | |
echo "[-] World-writable files:\n$wwfiles" | |
echo "\n" | |
fi | |
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 | |
fi | |
fi | |
#are any .plan files accessible in /home (could contain useful information) | |
usrplan=`find /u/ -name *.plan -exec ls -la {} \; -exec cat {} 2>/dev/null \;` | |
if [ "$usrplan" ]; then | |
echo "[-] Plan file permissions and contents:\n$usrplan" | |
echo "\n" | |
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 | |
fi | |
#are there any .rhosts files accessible - these may allow us to login as another user etc. | |
rhostsusr=`find /u/ -name *.rhosts -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` | |
if [ "$rhostsusr" ]; then | |
echo "+] rhost config file(s) and file contents:\n$rhostsusr" | |
echo "\n" | |
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 | |
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 | |
fi | |
rhostssys=`find /etc -iname hosts.equiv -exec ls -la {} 2>/dev/null \; -exec cat {} 2>/dev/null \;` | |
if [ "$rhostssys" ]; then | |
echo "+] Hosts.equiv file and contents: \n$rhostssys" | |
echo "\n" | |
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 | |
fi | |
#HFS/ZFS mount points | |
fstab=`df -kP 2>/dev/null|awk '{print "\t"$1 "\t\t" $6}'` | |
if [ "$fstab" ]; then | |
echo "[-] Displaying partitions and filesystems " | |
echo "$fstab" | |
echo "\n" | |
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 "[-] Can't search *.conf files as no keyword was entered\n" | |
else | |
confkey=`find / -name *.conf -type f -exec grep -ln $keyword {} \; 2>/dev/null` | |
if [ "$confkey" ]; then | |
echo "[-] Find keyword ($keyword) in .conf files (output format filepath:identified line number where keyword appears):\n$confkey" | |
echo "\n" | |
else | |
echo "[-] Find keyword ($keyword) in .conf files:" | |
echo "'$keyword' not found in any .conf files" | |
echo "\n" | |
fi | |
fi | |
if [ "$keyword" = "" ]; then | |
: | |
else | |
if [ "$export" ] && [ "$confkey" ]; then | |
confkeyfile=`find / -maxdepth 4 -name *.conf -type f -exec grep -ln $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 | |
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 "[-] Can't search *.php files as no keyword was entered\n" | |
else | |
phpkey=`find / -name *.php -type f -exec grep -ln $keyword {} \; 2>/dev/null` | |
if [ "$phpkey" ]; then | |
echo "[-] Find keyword ($keyword) in .php files (output format filepath:identified line number where keyword appears):\n$phpkey" | |
echo "\n" | |
else | |
echo "[-] Find keyword ($keyword) in .php files:" | |
echo "'$keyword' not found in any .php files" | |
echo "\n" | |
fi | |
fi | |
#use supplied keyword and cat *.class files for potential matches - output will show line number within relevant file path where a match has been located | |
if [ "$keyword" = "" ]; then | |
echo "[-] Can't search *.class files as no keyword was entered\n" | |
else | |
classkey=`find / -name *.class -type f -exec grep -ln $keyword {} \; 2>/dev/null` | |
if [ "$classkey" ]; then | |
echo "[-] Find keyword ($keyword) in .class files (output format filepath:identified line number where keyword appears):\n$classkey" | |
echo "\n" | |
else | |
echo "[-] Find keyword ($keyword) in .class files:" | |
echo "'$keyword' not found in any .class files" | |
echo "\n" | |
fi | |
fi | |
if [ "$keyword" = "" ]; then | |
: | |
else | |
if [ "$export" ] && [ "$phpkey" ]; then | |
phpkeyfile=`find / -maxdepth 10 -name *.php -type f -exec grep -ln $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 | |
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 "[-] Can't search *.log files as no keyword was entered\n" | |
else | |
logkey=`find / -name *.log -type f -exec grep -ln $keyword {} \; 2>/dev/null` | |
if [ "$logkey" ]; then | |
echo "[-] Find keyword ($keyword) in .log files (output format filepath:identified line number where keyword appears):\n$logkey" | |
echo "\n" | |
else | |
echo "[-] Find keyword ($keyword) in .log files:" | |
echo "'$keyword' not found in any .log files" | |
echo "\n" | |
fi | |
fi | |
if [ "$keyword" = "" ];then | |
: | |
else | |
if [ "$export" ] && [ "$logkey" ]; then | |
logkeyfile=`find / -name *.log -type f -exec grep -ln $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 | |
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 "[-] Can't search *.ini files as no keyword was entered\n" | |
else | |
inikey=`find / -name *.ini -type f -exec grep -ln $keyword {} \; 2>/dev/null` | |
if [ "$inikey" ]; then | |
echo "[-] Find keyword ($keyword) in .ini files (output format filepath:identified line number where keyword appears):\n$inikey" | |
echo "\n" | |
else | |
echo "[-] Find keyword ($keyword) in .ini files:" | |
echo "'$keyword' not found in any .ini files" | |
echo "\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 | |
fi | |
fi | |
#quick extract of .conf files from /etc - only 1 level | |
allconf=`find /etc/ -name *.conf -type f -exec ls -la {} \; 2>/dev/null` | |
if [ "$allconf" ]; then | |
echo "[-] All *.conf files in /etc:\n$allconf" | |
echo "\n" | |
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 | |
fi | |
#extract any user history files that are accessible | |
usrhist=`ls -la ~/.*_history 2>/dev/null` | |
if [ "$usrhist" ]; then | |
echo "[-] Current user's history files:\n$usrhist" | |
echo "\n" | |
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 | |
fi | |
#can we read roots *_history files - could be passwords stored etc. | |
roothist=`ls -la /u/$uidzero/.*_history 2>/dev/null` | |
if [ "$roothist" ]; then | |
echo "+] $uidzero's history files are accessible!\n$roothist" | |
echo "\n" | |
fi | |
if [ "$export" ] && [ "$roothist" ]; then | |
mkdir $format/history_files/ 2>/dev/null | |
cp $roothist $format/history_files/ 2>/dev/null | |
fi | |
#all accessible .bash_history files in /home | |
checkbashhist=`find /u/ -name .*history -print -exec cat {} 2>/dev/null \;` | |
if [ "$checkbashhist" ]; then | |
echo "[-] Location and contents (if accessible) of .*history file(s):\n$checkbashhist" | |
echo "\n" | |
fi | |
#is there any mail accessible | |
readmail=`ls -la /var/mail 2>/dev/null` | |
if [ "$readmail" ]; then | |
echo "[-] Any interesting mail in /var/mail:\n$readmail" | |
echo "\n" | |
fi | |
#can we read roots mail | |
readmailroot=`head /var/mail/root 2>/dev/null` | |
if [ "$readmailroot" ]; then | |
echo "+] We can read /var/mail/root! (snippet below)\n$readmailroot" | |
echo "\n" | |
fi | |
if [ "$export" ] && [ "$readmailroot" ]; then | |
mkdir $format/mail-from-root/ 2>/dev/null | |
cp $readmailroot $format/mail-from-root/ 2>/dev/null | |
fi | |
#Can we write to any HFS/ZFS datasets? | |
mounteddataset=`df -kP 2>/dev/null|awk '{print $1}'|grep -v Filesystem` | |
if [ "$mounteddataset" ]; then | |
listdsd=`/bin/tsocmd listdsd 2>/dev/null` | |
if [ "$listdsd" ]; then | |
echo "[-] Mounted Dataset Access:" | |
for dataset in $mounteddataset; do | |
listdsd=`/bin/tsocmd "listdsd dataset('$dataset')" 2>/dev/null` | |
generic='' | |
if echo $listdsd|grep -q ICH35003I; then | |
listdsd=`/bin/tsocmd "listdsd dataset('$dataset') GENERIC" 2>/dev/null` | |
generic='GENERIC' | |
fi | |
if echo $listdsd|grep -q ICH35003I; then | |
echo "\t UNPROTECTED \t $dataset" | |
else | |
accessline=`/bin/tsocmd "listdsd dataset('$dataset') $generic" 2>/dev/null|grep -ni "YOUR ACCESS"|cut -d":" -f1` | |
linnum=`expr $accessline + 2` | |
access=`/bin/tsocmd "listdsd dataset('$dataset') $generic" 2>/dev/null|head -n $linnum|tail -n 1|awk '{print $1}'` | |
echo "\t $access \t\t $dataset" | |
fi | |
done | |
fi | |
fi | |
echo "\n" | |
#checking if we can make APF files | |
tmpfilename=`head -3 /dev/urandom | tr -cd '[:alnum:]' | cut -c -5` | |
touch /tmp/$tmpfilename.omvsenum | |
extattr +a /tmp/$tmpfilename.omvsenum 2>/dev/null | |
attr_rc=$? | |
if [ "$attr_rc" ]; then | |
echo "[+] We can issue extattr +a!" | |
echo "\n" | |
else | |
echo "[-] We cannot issue extattr +a" | |
fi | |
deltmpfile=`rm /tmp/$tmpfilename.omvsenum` | |
} | |
racf_searches() | |
{ | |
echo "\n####### RACF Searches ###############################################\n" | |
#Can we even issue the search command? | |
searchcmd=`/bin/tsocmd search 2>/dev/null` | |
if [ "$searchcmd" ]; then | |
srchwrn=`/bin/tsocmd "SR ALL WARNING NOMASK" 2>/dev/null` | |
if [ "$srchwrn" ]; then | |
echo "[+] Datasets set to WARNING:\n$srchwrn" | |
echo "\n" | |
fi | |
srchdsn=`/bin/tsocmd "SR FILTER(**)" 2>/dev/null` | |
if [ "$srchdsn" ]; then | |
echo "[+] READ or greater access to dataset rules:\n$srchdsn" | |
echo "\n" | |
fi | |
srchupriv=`/bin/tsocmd "SR CLASS(UNIXPRIV)" 2>/dev/null` | |
if [ "$srchupriv" ]; then | |
echo "[+] Unix Privileged resources:\n$srchupriv" | |
echo "\n" | |
fi | |
srchbpx=`/bin/tsocmd "SEARCH CLASS(FACILITY) FILTER(BPX.**)" 2>/dev/null` | |
if [ "$srchbpx" ]; then | |
echo "[-] BPX Access:\n$srchbpx" | |
echo "\n" | |
fi | |
srchsgt=`/bin/tsocmd "SEARCH CLASS(SURROGAT) FILTER(*.SUBMIT)" 2>/dev/null` | |
if [ "$srchsgt" ]; then | |
echo "[+] Surrogate Access:\n$srchsgt" | |
echo "\n" | |
fi | |
srchsu=`/bin/tsocmd "SEARCH CLASS(SURROGAT) FILTER(BPX.SRV.ADMIN)" 2>/dev/null` | |
if [ "$srchsu" ]; then | |
echo "[+] su access without password:\n$srchsu" | |
echo "\n" | |
fi | |
fi | |
} | |
call_each() | |
{ | |
header | |
debug_info | |
system_info | |
user_info | |
environmental_info | |
networking_info | |
services_info | |
software_configs | |
interesting_files | |
racf_searches | |
footer | |
} | |
while getopts "h:k:r:e:st" 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment