Linux Capabilities
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
RootedCON is die mees relevante kuberveiligheid gebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n bruisende ontmoetingspunt vir tegnologie en kuberveiligheid professionele in elke dissipline.\
Linux capabilities verdeel root regte in kleiner, duidelike eenhede, wat dit moontlik maak vir prosesse om 'n substel van regte te hê. Dit minimaliseer die risiko's deur nie volle root regte onnodig toe te ken nie.
Normale gebruikers het beperkte toestemmings, wat take soos die opening van 'n netwerk socket wat root toegang vereis, beïnvloed.
Inherited (CapInh):
Doel: Bepaal die vermoëns wat van die ouer proses oorgedra word.
Funksionaliteit: Wanneer 'n nuwe proses geskep word, erf dit die vermoëns van sy ouer in hierdie stel. Nuttig om sekere regte oor proses ontstaan te handhaaf.
Beperkings: 'n Proses kan nie vermoëns verkry wat sy ouer nie besit het nie.
Effective (CapEff):
Doel: Verteenwoordig die werklike vermoëns wat 'n proses op enige oomblik gebruik.
Funksionaliteit: Dit is die stel vermoëns wat deur die kern nagegaan word om toestemming vir verskeie operasies te gee. Vir lêers kan hierdie stel 'n vlag wees wat aandui of die lêer se toegelate vermoëns as effektief beskou moet word.
Belangrikheid: Die effektiewe stel is van kardinale belang vir onmiddellike regte kontroles, wat as die aktiewe stel van vermoëns dien wat 'n proses kan gebruik.
Permitted (CapPrm):
Doel: Definieer die maksimum stel vermoëns wat 'n proses kan besit.
Funksionaliteit: 'n Proses kan 'n vermoë van die toegelate stel na sy effektiewe stel verhoog, wat dit die vermoë gee om daardie vermoë te gebruik. Dit kan ook vermoëns uit sy toegelate stel laat val.
Grens: Dit dien as 'n boonste limiet vir die vermoëns wat 'n proses kan hê, wat verseker dat 'n proses nie sy vooraf gedefinieerde regte omvang oorskry nie.
Bounding (CapBnd):
Doel: Plaas 'n plafon op die vermoëns wat 'n proses ooit kan verkry gedurende sy lewensiklus.
Funksionaliteit: Selfs al het 'n proses 'n sekere vermoë in sy oorgedra of toegelate stel, kan dit nie daardie vermoë verkry nie tensy dit ook in die begrensde stel is.
Gebruik-geval: Hierdie stel is veral nuttig om 'n proses se regte eskalasie potensiaal te beperk, wat 'n ekstra laag van sekuriteit byvoeg.
Ambient (CapAmb):
Doel: Laat sekere vermoëns toe om oor 'n execve
stelselsoproep gehandhaaf te word, wat tipies 'n volle reset van die proses se vermoëns sou veroorsaak.
Funksionaliteit: Verseker dat nie-SUID programme wat nie geassosieerde lêer vermoëns het nie, sekere regte kan behou.
Beperkings: Vermoëns in hierdie stel is onderhewig aan die beperkings van die oorgedra en toegelate stelle, wat verseker dat hulle nie die proses se toegelate regte oorskry nie.
For further information check:
Om die vermoëns vir 'n spesifieke proses te sien, gebruik die status lêer in die /proc gids. Aangesien dit meer besonderhede verskaf, laat ons dit beperk tot die inligting wat verband hou met Linux vermoëns. Let daarop dat vir alle lopende prosesse vermoënsinligting per draad gehandhaaf word, vir binaries in die lêerstelsel word dit in uitgebreide eienskappe gestoor.
Jy kan die vermoëns wat in /usr/include/linux/capability.h gedefinieer is, vind.
Jy kan die vermoëns van die huidige proses vind in cat /proc/self/status
of deur capsh --print
te doen en van ander gebruikers in /proc/<pid>/status
Hierdie opdrag behoort 5 lyne op die meeste stelsels terug te gee.
CapInh = Geërfde vermoëns
CapPrm = Toegelate vermoëns
CapEff = Effektiewe vermoëns
CapBnd = Beperkte stel
CapAmb = Omgewingsvermoëns stel
Hierdie hexadesimale getalle maak nie sin nie. Deur die capsh-nutsgoed te gebruik, kan ons hulle in die vermoëns se name dekodeer.
Kom ons kyk nou na die capabilities wat deur ping
gebruik word:
Hoewel dit werk, is daar 'n ander en makliker manier. Om die vermoëns van 'n lopende proses te sien, gebruik eenvoudig die getpcaps hulpmiddel gevolg deur sy proses ID (PID). Jy kan ook 'n lys van proses ID's verskaf.
Laat ons hier die vermoëns van tcpdump
nagaan nadat ons die binêre genoeg vermoëns gegee het (cap_net_admin
en cap_net_raw
) om die netwerk te snuffel (tcpdump loop in proses 9562):
Soos jy kan sien, stem die gegewe vermoëns ooreen met die resultate van die 2 maniere om die vermoëns van 'n binêre te verkry. Die getpcaps hulpmiddel gebruik die capget() stelselskakel om die beskikbare vermoëns vir 'n spesifieke draad te vra. Hierdie stelselskakel benodig slegs die PID om meer inligting te verkry.
Binêre kan vermoëns hê wat gebruik kan word terwyl dit uitgevoer word. Byvoorbeeld, dit is baie algemeen om ping
binêre met cap_net_raw
vermoë te vind:
U kan binaries met vermoëns soek met:
As ons die CAP_NET_RAW vermoëns vir ping laat val, dan behoort die ping nut nie meer te werk nie.
Besides the output of capsh itself, the tcpdump command itself should also raise an error.
/bin/bash: /usr/sbin/tcpdump: Operasie nie toegelaat nie
The error clearly shows that the ping command is not allowed to open an ICMP socket. Now we know for sure that this works as expected.
You can remove capabilities of a binary with
Blykbaar is dit moontlik om vermoëns ook aan gebruikers toe te ken. Dit beteken waarskynlik dat elke proses wat deur die gebruiker uitgevoer word, die gebruiker se vermoëns sal kan gebruik.
Gebaseer op hierdie, hierdie en hierdie moet 'n paar lêers geconfigureer word om 'n gebruiker sekere vermoëns te gee, maar die een wat die vermoëns aan elke gebruiker toeken, sal wees /etc/security/capability.conf
.
Lêer voorbeeld:
Deur die volgende program te kompileer, is dit moontlik om 'n bash-skal te genereer binne 'n omgewing wat vermoëns bied.
Binne die bash wat deur die gecompileerde omgewing-binary uitgevoer word is dit moontlik om die nuwe vermoëns waar te neem (n 'n gewone gebruiker sal geen vermoë in die "huidige" afdeling hê).
Jy kan slegs vermoëns byvoeg wat teenwoordig is in beide die toegelate en die oorerflike stelle.
Die vermoë-bewuste binaries sal nie die nuwe vermoëns gebruik nie wat deur die omgewing gegee word, maar die vermoë-dom binaries sal dit gebruik aangesien hulle dit nie sal verwerp nie. Dit maak vermoë-dom binaries kwesbaar binne 'n spesiale omgewing wat vermoëns aan binaries toeken.
Standaard sal 'n diens wat as root loop alle vermoëns toegeken hê, en in sommige gevalle kan dit gevaarlik wees. Daarom laat 'n dienskonfigurasie lêer jou toe om die vermoëns wat jy wil hê dit moet hê, en die gebruiker wat die diens moet uitvoer, te specifiseer om te verhoed dat 'n diens met onnodige voorregte gedraai word:
Deur die standaard ken Docker 'n paar vermoëns aan die houers toe. Dit is baie maklik om te kyk watter vermoëns dit is deur die volgende opdrag te loop:
RootedCON is die mees relevante kuberveiligheid gebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n bruisende ontmoetingspunt vir tegnologie- en kuberveiligheidprofessionals in elke dissipline.
Vermogens is nuttig wanneer jy jou eie prosesse wil beperk nadat jy bevoorregte operasies uitgevoer het (bv. nadat jy chroot opgestel het en aan 'n sokkie gebind het). Dit kan egter uitgebuit word deur kwaadwillige opdragte of argumente oor te dra wat dan as root uitgevoer word.
Jy kan vermogens op programme afdwing met setcap
, en dit met getcap
opvraag:
Die +ep
beteken jy voeg die vermoë (“-” sou dit verwyder) as Effektief en Toegelaat by.
Om programme in 'n stelsel of gids met vermoëns te identifiseer:
In die volgende voorbeeld is die binêre /usr/bin/python2.6
gevind as kwesbaar vir privesc:
Vermoeë wat nodig is deur tcpdump
om enige gebruiker toe te laat om pakkette te snuffel:
Van die dokumentasie: Let daarop dat 'n mens leë vermoëns aan 'n programlêer kan toewys, en dus is dit moontlik om 'n stel-gebruiker-ID-root program te skep wat die effektiewe en gestoor stel-gebruiker-ID van die proses wat die program uitvoer na 0 verander, maar geen vermoëns aan daardie proses toeken nie. Of, eenvoudig gestel, as jy 'n binêre het wat:
nie deur root besit word nie
geen SUID
/SGID
bits het nie
leë vermoëns stel het (bv.: getcap myelf
gee myelf =ep
terug)
dan sal daardie binêre as root loop.
CAP_SYS_ADMIN
is 'n hoogs kragtige Linux vermoë, dikwels gelykgestel aan 'n naby-root vlak weens sy uitgebreide administratiewe voorregte, soos om toestelle te monteer of kernfunksies te manipuleer. Terwyl dit onontbeerlik is vir houers wat hele stelsels simuleer, veroorzaak CAP_SYS_ADMIN
beduidende sekuriteitsuitdagings, veral in gecontaineriseerde omgewings, weens sy potensiaal vir voorregverhoging en stelselskade. Daarom vereis die gebruik daarvan streng sekuriteitsassessering en versigtige bestuur, met 'n sterk voorkeur om hierdie vermoë in toepassingspesifieke houers te laat vaar om die beginsel van die minste voorreg na te kom en die aanvaloppervlak te minimaliseer.
Voorbeeld met binêre
Met python kan jy 'n gewysigde passwd lêer bo-op die werklike passwd lêer monteer:
En laastens mount die gewysigde passwd
lêer op /etc/passwd
:
En jy sal in staat wees om su
as root te gebruik met die wagwoord "password".
Voorbeeld met omgewing (Docker breek uit)
Jy kan die geaktiveerde vermoëns binne die docker houer nagaan met:
Binnen die vorige uitvoer kan jy sien dat die SYS_ADMIN vermoë geaktiveer is.
Mount
Dit laat die docker houer toe om die gasheer skyf te monteer en dit vrylik te benader:
Volledige toegang
In die vorige metode het ons daarin geslaag om toegang tot die docker gasheer se skyf te verkry. In die geval dat jy vind dat die gasheer 'n ssh bediener draai, kan jy n gebruiker binne die docker gasheer se skyf skep en dit via SSH benader:
Dit beteken dat jy die houer kan ontsnap deur 'n shellcode in 'n proses wat binne die gasheer loop, in te spuit. Om toegang te verkry tot prosesse wat binne die gasheer loop, moet die houer ten minste met --pid=host
gedraai word.
CAP_SYS_PTRACE
verleen die vermoë om foutopsporing en stelselaanroep-tracing funksies te gebruik wat deur ptrace(2)
en kruis-geheue aanroep soos process_vm_readv(2)
en process_vm_writev(2)
verskaf word. Alhoewel dit kragtig is vir diagnostiese en moniteringsdoeleindes, kan dit, indien CAP_SYS_PTRACE
geaktiveer is sonder beperkende maatreëls soos 'n seccomp-filter op ptrace(2)
, die stelselsekuriteit aansienlik ondermyn. Spesifiek kan dit uitgebuit word om ander sekuriteitsbeperkings te omseil, veral dié wat deur seccomp opgelê word, soos gedemonstreer deur bewyse van konsep (PoC) soos hierdie een.
Voorbeeld met binêre (python)
Voorbeeld met binêre (gdb)
gdb
met ptrace
vermoë:
Vervang <JOU_IP>
en <JOU_PORT>
met jou eie waardes. Dit sal 'n C-voorwerp genereer wat jy kan gebruik om in geheue in te spuit.
Begin gdb met die teikenprogram:
Stel 'n breekpunt in waar jy die shellcode wil inspuit:
Begin die program:
Wanneer die breekpunt bereik is, kan jy die shellcode inspuit:
Vervang <adres>
met die adres waar jy die shellcode wil inspuit en <grootte>
met die grootte van die shellcode.
Debug 'n root-proses met gdb en kopieer-plak die voorheen gegenereerde gdb-lyne:
Voorbeeld met omgewing (Docker breakout) - Nog 'n gdb Misbruik
As GDB geïnstalleer is (of jy kan dit installeer met apk add gdb
of apt install gdb
byvoorbeeld) kan jy 'n proses vanaf die gasheer debugeer en dit die system
funksie laat aanroep. (Hierdie tegniek vereis ook die vermoë SYS_ADMIN
).
Jy sal nie die uitvoer van die uitgevoerde opdrag kan sien nie, maar dit sal deur daardie proses uitgevoer word (so kry 'n rev shell).
As jy die fout "No symbol "system" in current context." kry, kyk na die vorige voorbeeld wat 'n shellcode in 'n program via gdb laai.
Voorbeeld met omgewing (Docker breek) - Shellcode Inspuiting
Jy kan die geaktiveerde vermoëns binne die docker houer nagaan met:
List processes wat in die host loop ps -eaf
Kry die architecture uname -m
Vind 'n shellcode vir die architecture (https://www.exploit-db.com/exploits/41128)
Vind 'n program om die shellcode in 'n proses se geheue te inject (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Modify die shellcode binne die program en compile dit gcc inject.c -o inject
Inject dit en gryp jou shell: ./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
bemagtig 'n proses om kernel modules te laai en te verwyder (init_module(2)
, finit_module(2)
en delete_module(2)
stelsels oproepe), wat direkte toegang tot die kern se kern operasies bied. Hierdie vermoë bied kritieke sekuriteitsrisiko's, aangesien dit privaatheidsverhoging en totale stelselskompromie moontlik maak deur veranderinge aan die kern toe te laat, wat alle Linux-sekuriteitsmeganismes, insluitend Linux Security Modules en houer-isolasie, omseil. Dit beteken dat jy kernel modules kan invoeg/verwyder in/uit die kern van die gasheer masjien.
Voorbeeld met binêre
In die volgende voorbeeld het die binêre python
hierdie vermoë.
By default, modprobe
opdrag kyk vir afhanklikheidslys en kaartlêers in die gids /lib/modules/$(uname -r)
.
Om hiervan misbruik te maak, kom ons skep 'n vals lib/modules gids:
Dan kompyleer die kernmodule wat jy hieronder kan vind 2 voorbeelde en kopieer dit na hierdie gids:
Uiteindelik, voer die nodige python kode uit om hierdie kernmodule te laai:
Voorbeeld 2 met binêre
In die volgende voorbeeld het die binêre kmod
hierdie vermoë.
Wat beteken dat dit moontlik is om die opdrag insmod
te gebruik om 'n kernmodule in te voeg. Volg die voorbeeld hieronder om 'n reverse shell te verkry deur hierdie voorreg te misbruik.
Voorbeeld met omgewing (Docker breakout)
Jy kan die geaktiveerde vermoëns binne die docker houer nagaan met:
Binnen die vorige uitvoer kan jy sien dat die SYS_MODULE vermoë geaktiveer is.
Skep die kernel module wat 'n omgekeerde skulp gaan uitvoer en die Makefile om dit te kompiler:
Die leë karakter voor elke make-woord in die Makefile moet 'n tab wees, nie spasies nie!
Voer make
uit om dit te kompileer.
Laastens, begin nc
binne 'n skulp en laai die module vanaf 'n ander een en jy sal die skulp in die nc-proses vang:
Die kode van hierdie tegniek is gekopieer van die laboratorium van "Abusing SYS_MODULE Capability" van https://www.pentesteracademy.com/
'n Ander voorbeeld van hierdie tegniek kan gevind word in https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host
CAP_DAC_READ_SEARCH stel 'n proses in staat om toestemmings vir die lees van lêers en vir die lees en uitvoer van gidse te omseil. Die primêre gebruik daarvan is vir lêer soek of lees doeleindes. Dit stel egter ook 'n proses in staat om die open_by_handle_at(2)
funksie te gebruik, wat enige lêer kan benader, insluitend dié buite die proses se monteer naamruimte. Die handvatsel wat in open_by_handle_at(2)
gebruik word, behoort 'n nie-deursigtige identifiseerder te wees wat verkry is deur name_to_handle_at(2)
, maar dit kan sensitiewe inligting insluit soos inode nommers wat kwesbaar is vir manipulasie. Die potensiaal vir die uitbuiting van hierdie vermoë, veral in die konteks van Docker houers, is deur Sebastian Krahmer met die shocker uitbuiting gedemonstreer, soos geanaliseer hier. Dit beteken dat jy kan toestemmings vir lêer lees en gidse lees/uitvoer kan omseil.
Voorbeeld met binêre
Die binêre sal in staat wees om enige lêer te lees. So, as 'n lêer soos tar hierdie vermoë het, sal dit in staat wees om die skadu lêer te lees:
Voorbeeld met binary2
In hierdie geval kom ons veronderstel dat die python
binêre hierdie vermoë het. Om wortel lêers te lys, kan jy doen:
En om 'n lêer te lees, kan jy doen:
Voorbeeld in Omgewing (Docker breek uit)
Jy kan die geaktiveerde vermoëns binne die docker houer nagaan met:
Inside the previous output you can see that the DAC_READ_SEARCH capability is enabled. As a result, the container can debug processes.
You can learn how the following exploiting works in https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3 but in resume CAP_DAC_READ_SEARCH nie net toelaat dat ons die lêerstelsel sonder toestemmingstoetsing kan deurloop nie, maar verwyder ook eksplisiet enige kontrole om open_by_handle_at(2) en kan ons proses toelaat om sensitiewe lêers wat deur ander prosesse geopen is, te lees.
The original exploit that abuse this permissions to read files from the host can be found here: http://stealth.openwall.net/xSports/shocker.c, the following is a modified version that allows you to indicate the file you want to read as first argument and dump it in a file.
Die exploit moet 'n pointer vind na iets wat op die gasheer gemonteer is. Die oorspronklike exploit het die lêer /.dockerinit gebruik en hierdie gemodifiseerde weergawe gebruik /etc/hostname. As die exploit nie werk nie, moet jy dalk 'n ander lêer stel. Om 'n lêer te vind wat op die gasheer gemonteer is, voer net die mount-opdrag uit:
Die kode van hierdie tegniek is gekopieer uit die laboratorium van "Abusing DAC_READ_SEARCH Capability" van https://www.pentesteracademy.com/
RootedCON is die mees relevante kuberveiligheid gebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n bruisende ontmoetingspunt vir tegnologie- en kuberveiligheidprofessionals in elke dissipline.
Dit beteken dat jy skryftoestemming kontroles op enige lêer kan omseil, sodat jy enige lêer kan skryf.
Daar is baie lêers wat jy kan oorwrite om voorregte te verhoog, jy kan idees hier kry.
Voorbeeld met binêre
In hierdie voorbeeld het vim hierdie vermoë, so jy kan enige lêer soos passwd, sudoers of shadow wysig:
Voorbeeld met binêre 2
In hierdie voorbeeld sal die python
binêre hierdie vermoë hê. Jy kan python gebruik om enige lêer te oorskry:
Voorbeeld met omgewing + CAP_DAC_READ_SEARCH (Docker ontsnapping)
Jy kan die geaktiveerde vermoëns binne die docker houer nagaan met:
Eerstens lees die vorige afdeling wat misbruik maak van DAC_READ_SEARCH vermoë om arbitrêre lêers te lees van die gasheer en kompilleer die ontploffing. Dan, kompilleer die volgende weergawe van die skok ontploffing wat jou sal toelaat om arbitrêre lêers binne die gasheer se lêerstelsel te skryf:
In orde om die docker-container te ontsnap, kan jy die lêers /etc/shadow
en /etc/passwd
van die gasheer aflaai, 'n nuwe gebruiker aan hulle byvoeg, en shocker_write
gebruik om hulle te oorskryf. Dan, toegang via ssh.
Die kode van hierdie tegniek is gekopieer uit die laboratorium van "Abusing DAC_OVERRIDE Capability" van https://www.pentesteracademy.com
Dit beteken dat dit moontlik is om die eienaarskap van enige lêer te verander.
Voorbeeld met binêre
Kom ons neem aan die python
binêre het hierdie vermoë, jy kan die eienaar van die shadow lêer verander, die root wagwoord verander, en voorregte opgradeer:
Of met die ruby
binêre wat hierdie vermoë het:
Dit beteken dat dit moontlik is om die toestemmings van enige lêer te verander.
Voorbeeld met binêre
As python hierdie vermoë het, kan jy die toestemmings van die skadu-lêer verander, verander die wortel wagwoord, en voorregte opgradeer:
Dit beteken dat dit moontlik is om die effektiewe gebruikers-id van die geskepte proses in te stel.
Voorbeeld met binêre
As python hierdie capability het, kan jy dit baie maklik misbruik om voorregte na root te verhoog:
Nog 'n manier:
Dit beteken dat dit moontlik is om die effektiewe groep id van die geskepte proses in te stel.
Daar is baie lêers wat jy kan oorskryf om voorregte te verhoog, jy kan idees hier kry.
Voorbeeld met binêre
In hierdie geval moet jy soek na interessante lêers wat 'n groep kan lees omdat jy enige groep kan naboots:
Sodra jy 'n lêer gevind het wat jy kan misbruik (deur te lees of te skryf) om voorregte te verhoog, kan jy 'n shell kry wat die interessante groep naboots met:
In hierdie geval is die groep shadow geïmpliseer sodat jy die lêer /etc/shadow
kan lees:
If docker is geïnstalleer kan jy die docker groep naboots en dit misbruik om te kommunikeer met die docker socket en voorregte te verhoog.
Dit beteken dat dit moontlik is om vermoëns op lêers en prosesse in te stel
Voorbeeld met binêre
As python hierdie vermoë het, kan jy dit baie maklik misbruik om voorregte na root te verhoog:
Let daarop dat as jy 'n nuwe vermoë aan die binêre met CAP_SETFCAP toeken, jy hierdie vermoë sal verloor.
Sodra jy SETUID vermoë het, kan jy na sy afdeling gaan om te sien hoe om voorregte te verhoog.
Voorbeeld met omgewing (Docker ontsnapping)
Standaard word die vermoë CAP_SETFCAP aan die proses binne die houer in Docker gegee. Jy kan dit nagaan deur iets soos te doen:
Hierdie vermoë laat toe om enige ander vermoë aan binaire lêers te gee, so ons kan dink aan ontsnapping uit die houer deur enige van die ander vermoë breekpunte wat op hierdie bladsy genoem word. As jy egter probeer om byvoorbeeld die vermoë CAP_SYS_ADMIN en CAP_SYS_PTRACE aan die gdb-binary te gee, sal jy vind dat jy dit kan gee, maar die binary sal nie na hierdie punt kan uitvoer nie:
From the docs: Toegelaat: Dit is 'n beperkende superset vir die effektiewe vermoëns wat die draad mag aanneem. Dit is ook 'n beperkende superset vir die vermoëns wat aan die oorerflike stel deur 'n draad wat nie die CAP_SETPCAP vermoë in sy effektiewe stel het, kan bygevoeg word. Dit lyk of die Toegelate vermoëns diegene beperk wat gebruik kan word. Egter, Docker verleen ook die CAP_SETPCAP standaard, so jy mag in staat wees om nuwe vermoëns binne die oorerflikes te stel. Egter, in die dokumentasie van hierdie vermoë: CAP_SETPCAP : […] voeg enige vermoë van die oproepdraad se begrensde stel by sy oorerflike stel. Dit lyk of ons slegs vermoëns van die begrensde stel aan die oorerflike stel kan byvoeg. Dit beteken dat ons nie nuwe vermoëns soos CAP_SYS_ADMIN of CAP_SYS_PTRACE in die oorerflike stel kan plaas om voorregte te verhoog nie.
CAP_SYS_RAWIO bied 'n aantal sensitiewe operasies, insluitend toegang tot /dev/mem
, /dev/kmem
of /proc/kcore
, wysiging van mmap_min_addr
, toegang tot ioperm(2)
en iopl(2)
stelselskalle, en verskeie skyfopdragte. Die FIBMAP ioctl(2)
is ook via hierdie vermoë geaktiveer, wat in die verlede probleme veroorsaak het. Volgens die manblad, laat dit ook die houer toe om beskrywend n reeks toestel-spesifieke operasies op ander toestelle uit te voer
.
Dit kan nuttig wees vir voorregte verhoging en Docker ontsnapping.
Dit beteken dat dit moontlik is om enige proses te dood.
Voorbeeld met binêre
Kom ons veronderstel die python
binêre het hierdie vermoë. As jy ook 'n diens of sokketkonfigurasie (of enige konfigurasie lêer wat met 'n diens verband hou) lêer kon wysig, kan jy dit agterdeur, en dan die proses wat met daardie diens verband hou doodmaak en wag vir die nuwe konfigurasielêer om met jou agterdeur uitgevoer te word.
Privesc met kill
As jy kill vermoëns het en daar is 'n node program wat as root (of as 'n ander gebruiker) loop, kan jy waarskynlik dit die sein SIGUSR1 stuur en dit die node debugger laat oopmaak waar jy kan aansluit.
RootedCON is die mees relevante kuberveiligheid gebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n bruisende ontmoetingspunt vir tegnologie- en kuberveiligheidprofessionals in elke dissipline.
Dit beteken dat dit moontlik is om op enige poort te luister (selfs op bevoorregte). Jy kan nie regstreeks met hierdie vermoë bevoorregtinge verhoog nie.
Voorbeeld met binêre
As python
hierdie vermoë het, sal dit in staat wees om op enige poort te luister en selfs van daar na enige ander poort te verbind (sommige dienste vereis verbindings vanaf spesifieke bevoorregte poorte)
CAP_NET_RAW vermoë laat prosesse toe om RAW en PACKET sokkies te skep, wat hulle in staat stel om arbitrêre netwerkpakkette te genereer en te stuur. Dit kan lei tot sekuriteitsrisiko's in gecontaineriseerde omgewings, soos pakkie spoofing, verkeer inspuiting, en om netwerktoegangbeheer te omseil. Kwaadwillige akteurs kan dit benut om met containerroutering te interferer of gasheer netwerksekuriteit te kompromitteer, veral sonder voldoende firewall beskerming. Boonop is CAP_NET_RAW van kardinale belang vir bevoorregte houers om operasies soos ping via RAW ICMP versoeke te ondersteun.
Dit beteken dat dit moontlik is om verkeer te snuffel. Jy kan nie regstreeks met hierdie vermoë bevoorregtinge opgradeer nie.
Voorbeeld met binêre
As die binêre tcpdump
hierdie vermoë het, sal jy dit kan gebruik om netwerk-inligting te vang.
Let wel dat as die omgewing hierdie vermoë gee, jy ook tcpdump
kan gebruik om verkeer te snuffel.
Voorbeeld met binêre 2
Die volgende voorbeeld is python2
kode wat nuttig kan wees om verkeer van die "lo" (localhost) koppelvlak te onderskep. Die kode is van die laboratorium "Die Basiese Beginsels: CAP-NET_BIND + NET_RAW" van https://attackdefense.pentesteracademy.com/
CAP_NET_ADMIN vermoë gee die houer die mag om netwerk konfigurasies te verander, insluitend firewall instellings, routeringstabelle, sokkettoestemmings, en netwerkinterfaaninstellings binne die blootgestelde netwerkname ruimtes. Dit stel ook in staat om promiscuous mode op netwerkinterfakke in te skakel, wat pakket snuffeling oor name ruimtes moontlik maak.
Voorbeeld met binêre
Kom ons neem aan dat die python binêre hierdie vermoëns het.
Dit beteken dat dit moontlik is om inode-attribuut te wysig. Jy kan nie regstreeks met hierdie vermoë voorregte verhoog nie.
Voorbeeld met binêre
As jy vind dat 'n lêer onwankelbaar is en python hierdie vermoë het, kan jy die onwankelbare attribuut verwyder en die lêer wysig:
Let daarop dat hierdie onveranderlike attribuut gewoonlik gestel en verwyder word met:
CAP_SYS_CHROOT stel die uitvoering van die chroot(2)
stelselskakel in, wat potensieel kan toelaat dat daar ontsnap word uit chroot(2)
omgewings deur bekende kwesbaarhede:
CAP_SYS_BOOT stel nie net die uitvoering van die reboot(2)
stelselskakel vir stelsels herlaai in nie, insluitend spesifieke opdragte soos LINUX_REBOOT_CMD_RESTART2
wat vir sekere hardeware platforms aangepas is, maar dit stel ook die gebruik van kexec_load(2)
en, vanaf Linux 3.17, kexec_file_load(2)
in om nuwe of geskrewe crash-kernels te laai.
CAP_SYSLOG is geskei van die breër CAP_SYS_ADMIN in Linux 2.6.37, spesifiek om die vermoë te verleen om die syslog(2)
oproep te gebruik. Hierdie vermoë stel die sien van kernadresse via /proc
en soortgelyke interfaces toe wanneer die kptr_restrict
instelling op 1 is, wat die blootstelling van kernadresse beheer. Sedert Linux 2.6.39 is die standaard vir kptr_restrict
0, wat beteken dat kernadresse blootgestel word, hoewel baie verspreidings dit op 1 (versteek adresse behalwe van uid 0) of 2 (altyd adresse versteek) vir sekuriteitsredes stel.
Boonop stel CAP_SYSLOG toegang tot dmesg
uitvoer toe wanneer dmesg_restrict
op 1 gestel is. Ten spyte van hierdie veranderinge, behou CAP_SYS_ADMIN die vermoë om syslog
operasies uit te voer weens historiese precedente.
CAP_MKNOD brei die funksionaliteit van die mknod
stelselskakel uit, bo en behalwe die skep van gewone lêers, FIFOs (genaamde pype), of UNIX-domein sokke. Dit stel spesifiek die skepping van spesiale lêers toe, wat insluit:
S_IFCHR: Karakter spesiale lêers, wat toestelle soos terminaal is.
S_IFBLK: Blok spesiale lêers, wat toestelle soos skywe is.
Hierdie vermoë is noodsaaklik vir prosesse wat die vermoë benodig om toestel lêers te skep, wat direkte hardeware-interaksie deur karakter of blok toestelle fasiliteer.
Dit is 'n standaard docker vermoë (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19).
Hierdie vermoë stel in staat om privilige-eskalasies (deur volle skyf lees) op die gasheer te doen, onder hierdie toestande:
Begin toegang tot die gasheer hê (Onbevoegd).
Begin toegang tot die houer hê (Bevoegd (EUID 0), en effektiewe CAP_MKNOD
).
Gasheer en houer moet dieselfde gebruikersnaamruimte deel.
Stappe om 'n Bloktoestel in 'n Houer te Skep en Toegang te Kry:
Op die Gasheer as 'n Standaard Gebruiker:
Bepaal jou huidige gebruikers-ID met id
, bv. uid=1000(standaardgebruiker)
.
Identifiseer die teiken toestel, byvoorbeeld, /dev/sdb
.
Binne die Houer as root
:
Terug op die Gasheer:
Hierdie benadering laat die standaard gebruiker toe om toegang te verkry tot en moontlik data van /dev/sdb
te lees deur die houer, wat gedeelde gebruikersnaamruimtes en toestemmings op die toestel benut.
CAP_SETPCAP stel 'n proses in staat om die vermoënsstelle van 'n ander proses te verander, wat die toevoeging of verwydering van vermoëns uit die effektiewe, erfbare, en toegelate stelle moontlik maak. 'n Proses kan egter slegs vermoëns wat dit in sy eie toegelate stel besit, verander, wat verseker dat dit nie die voorregte van 'n ander proses bo sy eie kan verhoog nie. Onlangs het kernopdaterings hierdie reëls verskerp, wat CAP_SETPCAP
beperk tot slegs die vermindering van die vermoëns binne sy eie of sy afstammelinge se toegelate stelle, met die doel om sekuriteitsrisiko's te verminder. Gebruik vereis dat CAP_SETPCAP
in die effektiewe stel en die teikenvermoëns in die toegelate stel is, met behulp van capset()
vir wysigings. Dit som die kernfunksie en beperkings van CAP_SETPCAP
op, wat sy rol in voorregbestuur en sekuriteitsverbetering beklemtoon.
CAP_SETPCAP
is 'n Linux vermoë wat 'n proses toelaat om die vermoënsstelle van 'n ander proses te verander. Dit bied die vermoë om vermoëns uit die effektiewe, erfbare, en toegelate vermoënsstelle van ander prosesse by te voeg of te verwyder. Daar is egter sekere beperkings op hoe hierdie vermoë gebruik kan word.
'n Proses met CAP_SETPCAP
kan slegs vermoëns toeken of verwyder wat in sy eie toegelate vermoënsstel is. Met ander woorde, 'n proses kan nie 'n vermoë aan 'n ander proses toeken as dit nie daardie vermoë self het nie. Hierdie beperking verhoed dat 'n proses die voorregte van 'n ander proses bo sy eie vlak van voorreg verhoog.
Boonop is die CAP_SETPCAP
vermoë in onlangse kernweergawe verder beperk. Dit laat nie meer 'n proses toe om arbitrêr die vermoënsstelle van ander prosesse te verander nie. In plaas daarvan laat dit slegs 'n proses toe om die vermoëns in sy eie toegelate vermoënsstel of die toegelate vermoënsstel van sy afstammelinge te verlaag. Hierdie verandering is ingestel om potensiële sekuriteitsrisiko's wat met die vermoë verband hou, te verminder.
Om CAP_SETPCAP
effektief te gebruik, moet jy die vermoë in jou effektiewe vermoënsstel hê en die teikenvermoëns in jou toegelate vermoënsstel. Jy kan dan die capset()
stelselskakel gebruik om die vermoënsstelle van ander prosesse te verander.
In samevatting, CAP_SETPCAP
laat 'n proses toe om die vermoënsstelle van ander prosesse te verander, maar dit kan nie vermoëns toeken wat dit nie self het nie. Boonop, weens sekuriteitskwessies, is sy funksionaliteit in onlangse kernweergawe beperk om slegs die vermindering van vermoëns in sy eie toegelate vermoënsstel of die toegelate vermoënsstelle van sy afstammelinge toe te laat.
Die meeste van hierdie voorbeelde is geneem uit sommige laboratoriums van https://attackdefense.pentesteracademy.com/, so as jy hierdie privesc tegnieke wil oefen, beveel ek hierdie laboratoriums aan.
Ander verwysings:
RootedCON is die mees relevante kuberveiligheid gebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n bruisende ontmoetingspunt vir tegnologie- en kuberveiligheidprofessionals in elke dissipline.
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)