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”).

DISCLAIMER: Deze post is gepubliceerd voor educatieve doeleinden. Ik ben niet verantwoordelijk voor potentiele schade of malafide praktijken die met deze kennis worden toegepast. Als je verder leest stem je toe deze informatie alleen voor ethische zaken te gebruiken. Zo niet, stop dan nu met lezen en sluit deze pagina!

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! ❤

Like this content?

If you found this article interesting or useful, consider supporting my work by buying me a coffee. It helps me continue creating valuable security content!

Buy me a coffee