Linux

  1. Check user (id, whoami)

  2. Run Linux Smart Enumeration with increasing levels.

  3. Run LinEnum & other scripts as well

Strategy: Spend some time and ead over the result of the enumeration

If lse.sh level 0 or 1 finds something interesting, make a note.

Avoid rabbit holes by creating a checklist of things need for the priv esc method to work.

have a quick look around for files in user's home, and other common locations (/var/backup, /var/logs and history file)

first method to try --> sudo, cron jobs, SUID files.

check at root process, enumerate their versions and search for exploits.

ps aux |grep "^root"

check internal port that might be able to forward to attacking machine.

stuck?

re-read full enumeration dumps and highlight anything that seems odd.

process or file name aren't familiar, an "unusual" filesystem config, a username.

still havn't the root?

Do kernel exploit.

Services Exploits

Services Running as Root

Search the service and version in the exploit-db.com

Enum with tools

Internal Port

check port

Port forwarding with ssh

the service port on the victim machine, now available for <kali port> in loopback of the kali machine.

Weak File Permissions

Readable /etc/shadow

Copy the hash to the Kali linux as root.hash

crack the hash

switch to root user

Writable /etc/shadow

Then replace the root hash in /etc/shadow with new hash.

Login to root using hacker as password.

Writable /etc/passwd

The root account in /etc/passwd is usually configured like this:

the x in the second field mean that linux must look for the password hash in the /etc/shadow file.

in some versions of linux, it is possible to simply delete the "x", and linux interprets as the user having no password:

or generate the hash password to replace the "x"

result:

replace the "x" with new hash.

Readable Backups

a user may have created insecure backups of these files.

It is always worth exploring the file system looking fo readable backup files. some common places include user home dir, the / (root) dir, /tmp, and /var/backups.

if you can read the backup of ssh key (private key), it is a good one.

check this first before using the ssh key to login as root.

It indicate you could ssh to machine as root.

Next, copy the key to the kali machine.

then give the permission:

login ssh with the key

Sudo

Know the user's password & sudo unrestricted

Shell Escape Sequences

check the program which able to run without password as sudo. And search to gtfobins to get root shell.

gtfobins.github.io

Abusing Intended Functionality

If you can't see in the grfobins try to abusing the functionality to read/write a file and combine with other technique.

example: apache2

LD_PRELOAD

requirements: program could run by sudo in sudo -l

env_keep+=LD_PRELOAD

identification:

preload.c

compile the preload

now run any allowed program running with sudo (sudo -l).

example: find

LD_LIBRARY_PATH

env variable contains a set of directories where shared libraries are searched for first. print shared libraries --> ldd /usr/sbin/apache2.

exploit: create a shared library with the same name as one used by a program, and setting LD_LIBRARY_PATH to its parent directory, the program will load our shared library instead.

Identification:

pick shared library in the program (eg: libcrypt.so.1)

create a c script called libarary_path.c

comple the script:

set LD_LIBRARY_PATH to current directory:

If there is error like this:

"symbol gpgrt_lock_lock version <snip> ... <snip> not define"

you need to specify the variable first.

Backdooring LD_PRELOAD and LD_LIBRARY_PATH :

modified the file .bashrc with this additional line

then run this command to update .bashrc

Cron Jobs

Note:

for checking live cron job use pspy --> https://github.com/DominicBreuker/pspy

default using /bin/sh

location of crontabs --> /var/spool/cron/ or /var/spool/cron/crontabs/

the system-wide crontab is located at /etc/crontab

File Permission

If we can write to a program or script which gets run as part of a cron job, we can replace it with our own code.

Put a reverse shell or rootbash.

PATH Environment Variable

The crontab PATH env is by default set to /usr/bin:/bin

If a cron job program/script doesn't use an absolute path, and one of the PATH dir is writable by our user, we may able to create a program/script with the same name as the cron job.

example:

sample script:

execute the rootbash

Wildcards

if crontab execute a command with * (wildcards) mean all file in directory. you can put a command as a file name.

check program in the gtfobins for command to spawn a shell

In the picture above, it mean we need to injec command "--checkpoint=1 --checkpoint-action=exec=/bin/sh"

so create a fake file with that command.

generate shell.elf with msfvenom --> here

SUID SGID

SUID --> files get executed with the privileges of the file owner.

SGID --> files get executed with the privileges of the file group.

If the file owned by root, it gets executed with root privileges, and we may able to escalate privileges.

SUID

SGID

SUID + SGID (sometimes error):

search in gtfobins for uncommon binaries.

Known Exploits

Identification

search: Uncommon setuid binaries

then enum the version and search in searchsploit or exploit db

Shared Object Injection

When a program is executed, it will try to load the shared objects it requires. using program "strace", could track the system calls and determine whether any shared object were not found.

Important note: Must have access to write to the location the program tries to open, It needed to create a shared object and spawn a root shell when it is loaded.

example: /usr/local/bin/suid-so

example output: search the directory which writable for current user.

libcalc.c

compile

then re run the program

/usr/local/bin/suid-so

PATH Environtment Variable

Finding Vulnerable Program which running other program.

example inject the service command:

service.c

compile

execute command again, to get shell.

PATH=.:$PATH /usr/local/bin/suid-env

How about if the command use an absolute path?

but the /bin/sh and /bin/bash is version < 4.2-048, then it is possible to define user function with an absolute path name.

These functions can be exported so that subprocesses have access to them, and function can take over the actual executable being called.

example: the command call other program with /usr/sbin/service

then execute the command again.

How about if the command use an absolute path?

and run another program via bash (by using system())

note: In bash version 4.4 and above, the PS4 env is not inherited by shells running as root.

work on bash version < 4.4

example : /bin/bash --version --> 4.1.5

Password & keys

try reuse password, weak password storage .

look at config file

If the root user re-used their password for a service, that password may be found and used to switch to the root user.

History Files

Config Files

interesting files:

  • ovpn files

NFS

NFS shares are configured in the /etc/exports file.

Remote users can mount shares, access, create, modifiy files.

By default, created files inherit the "remote" user's id and group id (as owner and group respectively), even if they don't exist on the NFS server.

Useful command:

Root Squashing

Root squashing is how NFS prevents an obvious privilege escalation. If the remote user is (or claims to be) root (uid=0), NFS will instead "squash" and treat as "nobody" user, in the "nogroup" group. (default configuration)

no_root_squash

generate shell (must as root in the kali machine)

Kernel Exploits

  1. Enumerate kernel version (uname -a)

  2. Find matching exploit (Google, Exploit-DB, Github)

  3. Compile and run

searchsploit

use linux-exploit-suggester-2

Last updated