Linux Manual Privilege Escalation
Privilege Escalation is het proces om je rechten te upgraden naar hogere rechten. We komen privilege escalation vaak tegen wanneer we via een exploit een remote machine overgenomen hebben. In veel gevallen hebben we dan toegang tot deze machine met dezelfde rechten als de ge-exploite dienst. Soms is dit een service welke als “root” draait en zijn we root. Vaker is het echter een service zonder, of met zeer beperkte rechten. In deze post ga ik laten zien welke key-commando’s ik altijd gebruik om een Linux-based omgeving te onderzoeken. Vaak toont dit onderzoek een zwakheid in de configuratie aan waardoor je privileges geüpgrade kunnen worden naar een hoger account (bij voorkeur “root”).
In deze post focus ik me voornamelijk op system commands welke gebruikt kunnen worden binnen een omgeving waar geen externe tools gebruikt kunnen worden. Persoonlijk start ik altijd “the easy way”. Wanneer ik de mogelijkheid heb om scripts te uploaden / creëren en deze te draaien dan prefereer ik absoluut om te starten met een LinPEAS.sh, LinEnum.sh of een ander enumeratie script. Ik realiseer me overigens wel dat deze scripts niet stealthy zijn. Wanneer stealth een waarde is die in overweging genomen moet worden dan is het ook beter om terug te vallen op “the build-in manual way”. Dus laten we daar eens mee starten.
We willen graag een aantal facetten enummereren. Denk hierbij aan:
- OS / Kernel
- (Running) Processes
- Installed Software
- Interesting Applications / Binaries
- Users
- User Environment
- Network
- Set User IDentifier (SUID) / Set Group IDentifier (SGID)
- Scheduled Tasks
- Filesystem
- Plaintext Usernames and Passwords
- Check Certificate Keys
- Changeable Configuration Files
- Folders we can write and execute in
OS / Kernel
Wanneer je weet met welk OS en welke versie van het OS je te maken hebt kun je controleren of deze potentieel vulnerable is voor exploits. Een aantal snelle commando’s zijn:
uname -a uname -mrs cat /proc/version cat /etc/issue cat /etc/*-release lsb_release -a |
(Running) Processes
Draaiende processen vertellen iets over de status van het systeem. Ze vertellen o.a. welke diensten actief zijn en kunnen, bij foute configuratie misbruikt worden. De volgende commando’s zijn ideaal:
#All with tty, including other users - effective User id or name - X processes without controlling ttys ps aux #Check services running as root: ps aux | grep root #Check processes in a "layered" manner (hyarchical) #All with tty, including other users - E all processes - Full format ps -aef –forest #List all processes managed by systemCTL systemctl list-units |
Installed Software
Je wilt altijd weten welke software geïnstalleerd is. Misschien vindt je wel vulnerable software!
dpkg -l |
Interesting Applications / Binaries
Wanneer je remote op een systeem zit wil je ook weten wat je kunt doen. Kun je Python gebruiken? Is er een C compiler aanwezig? Zo check je of de box interessante binaries bevat:
find / -name perl* find / -name python* find / -name gcc* find / -name cc find / -name wget find / -name nc* find / -name netcat* find / -name tftp* find / -name ftp |
Users
Gebruikers zijn vaak de sleutels op machines. Door te weten welke gebruikers bestaan en hoe deze zijn ingericht kun je deze doelbewust enumereren en pawnen:
#Check member groups id #Who is logged in: who w #Who was logged in last: last #Check user capabilities: sudo -l #Check other users and groups: # List of users cat /etc/passwd | cut -d: -f1 # List of super users (elevated rights) grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' #OR awk -F: '($3 == "0") {print}' /etc/passwd #OR cat /etc/sudoers |
User Environment
Er zijn atrifacts in binnen een gebruikersomgeving die soms meer inzicht geven in bepaalde informatie. Dit zijn ideale bestanden om te controleren:
#Check user history cat ~/.bash_history cat ~/.nano_history cat ~/.atftp_history cat ~/.mysql_history cat ~/.php_history cat ~/.ssh/rsa_key cat ~/.ssh/rsa_key.pub cat ~/.ssh/authorized_keys #Check user information: cat ~/.bashrc cat ~/.profile cat /var/mail/root cat /var/spool/mail/root |
Network
Goede netwerkenumeratie kan potentieel veel informatie vrij geven. Zijn er andere verbonden netwerken? Zijn er services actief die alleen voor de localhost te benaderen zijn, etc:
#Check for services available from the inside: #All sockets - do Not reslove names - that are Listening and display Pid and program name netstat -anlp #All sockets - do Not reslove names - display timers netstat -ano #Show only local listening ports: Tcp - Udp - Listening - show Pid - Not resolve namens sudo netstat -tulpn #Other users or systems communicating with the network: lsof -i lsof -i :80 grep 80 /etc/services netstat -antup netstat -antpx |
Set User IDentifier (SUID) / Set Group IDentifier (SGID)
Binnen Linux maken we gebruik van speciale rechten op bestanden zoals SUID-bits en SGID-bits. Om te weten welke binaries deze speciale rechten hebben kun je de volgende commando’s gebruiken:
#Find SUID: find / -perm -u=s -type f 2>/dev/null #Find GUID: find / -perm -g=s -type f 2>/dev/null Permission issues: |
Scheduled Tasks
Scheduled Tasks kunnen informatie bevatten over periodieke taken, aanwezige software en actieve scripts. Scheduled tasks zijn een fantastische exploitatievector mits fout ingericht. Controleer scheduled tasks als volgt:
#General: crontab -l #Specific: ls -alh /var/spool/cron ls -al /etc/ | grep cron ls -al /etc/cron* cat /etc/cron* cat /etc/at.allow cat /etc/at.deny cat /etc/cron.allow cat /etc/cron.deny cat /etc/crontab cat /etc/anacrontab cat /var/spool/cron/crontabs/root |
Filesystems
Soms kunnen er andere bestandssystemen aanwezig zijn. Denk dan aan unmounted devices en shares:
#Check for unmouted file systems: mount -l cat /etc/fstab #Check for NFS share and try to mount it showmount -e 192.168.1.101 mount 192.168.1.101:/ /tmp/ |
Plaintext Usernames and Passwords
Wanneer je “leesbare” credentials kunt vinden dan is dat een snelle route richting het eindpunt. Zoek daarom altijd naar aanwezige credentials in bestanden en scripts. Dit doe je als volgt:
#Plaintext Usernames: grep -i user [filename] #Plaintext Passwords: grep -i pass [filename] grep -C 5 "password" [filename] #Check these files (they usually contain plaintext credentials): cat /var/apache2/config.inc cat /var/lib/mysql/mysql/user.MYD cat /root/anaconda-ks.cfg |
Check Certificate Keys
Gebruikerscertificaten zijn net als credentials ook sleutels. Door de juiste keys te bemachtigen kun je snel en zonder credentials toegang krijgen tot andere gebruikers.
cat ~/.ssh/authorized_keys cat ~/.ssh/identity.pub cat ~/.ssh/identity cat ~/.ssh/id_rsa.pub cat ~/.ssh/id_rsa cat ~/.ssh/id_dsa.pub cat ~/.ssh/id_dsa cat /etc/ssh/ssh_config cat /etc/ssh/sshd_config cat /etc/ssh/ssh_host_dsa_key.pub cat /etc/ssh/ssh_host_dsa_key cat /etc/ssh/ssh_host_rsa_key.pub cat /etc/ssh/ssh_host_rsa_key cat /etc/ssh/ssh_host_key.pub cat /etc/ssh/ssh_host_ke |
Changeable Configuration Files
In sommige gevallen is het mogelijk om configuratiebestanden aan te passen zodat de werking van afhankelijke software zo beïnvloed wordt dat je hier misbruik van kunt maken. Veel configuratiebestanden bevinden zich in de “/etc” folder. Gebruik dus de volgende commando’s om de rechten te controleren:
#everybody can change these config files: ls -aRl /etc/ | awk '$1 ~ /^.*w.*/' 2>/dev/null #you own these files ls -aRl /etc/ | awk '$1 ~ /^..w/' 2>/dev/null #You are member of a group that owns these files: ls -aRl /etc/ | awk '$1 ~ /^.....w/' 2>/dev/null |
Folders we can write and execute in
In sommige gevallen willen we een locatie zoeken waar we simpelweg data in weg kunnen schrijven of vanuit waar we binaries kunnen uitvoeren. Er zijn speciale commando’s om dit te controleren:
# writeable folders for everyone find / -writable -type d 2>/dev/null # writeable folders for everyone find / -perm -222 -type d 2>/dev/null # writeable folders for everyone find / -perm -o w -type d 2>/dev/null # folders everyone can run executables find / -perm -o x -type d 2>/dev/null # writeable folders for everyone where everyone can execute binaries: find / \( -perm -o w -perm -o x \) -type d 2>/dev/null |
Conclusie
Bovenstaande lijst is mijn speciale collectie commando’s waarmee ik meestal wel succes heb. Toegegeven, deze lijst kan zeker uitgebreid worden. Dit is geen statische lijst. Heb jij nog een goede toevoeging voor deze lijst dan mag je me deze zeker laten weten. Ik hoop dat bovenstaande tips je kunnen helpen. Handmatige enumeratie is een langdurig proces maar kan met de juiste interpretatie relatief snel tot succes leiden. Probeer altijd eerst het low-hanging fruit (b.v. een makkelijke kernel exploit) alvorens je dieper in het systeem gaat graven. Heel veel succes met je enumeratie. In de volgende post gaan we hetzelfde doen maar dan voor “Good old Windows”!
❤ Pls… deel dit bericht s.v.p. verder op andere kanalen zoals je eigen website, social media of geef hem een dikke like! En… je bent ook van harte welkom in onze NL InfoSec Discord! Hier delen we kennis met elkaar of doen we soms gewoon een leuk evenementje…gewoon lekker in het Nederlands. Tot ziens! ❤