Linux Capabilities
Linux Capabilities
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.\
Linux Capabilities
Linux capabilities zinagawanya privileges za root katika vitengo vidogo, tofauti, kuruhusu michakato kuwa na subset ya privileges. Hii inapunguza hatari kwa kutokupa privileges za root kamili bila sababu.
Tatizo:
Watumiaji wa kawaida wana ruhusa ndogo, ikihusisha kazi kama kufungua socket ya mtandao ambayo inahitaji ufikiaji wa root.
Seti za Uwezo:
Inherited (CapInh):
Madhumuni: Inabainisha uwezo unaopitishwa kutoka kwa mchakato wa mzazi.
Ufanisi: Wakati mchakato mpya unaundwa, unarithi uwezo kutoka kwa mzazi katika seti hii. Ni muhimu kwa kudumisha privileges fulani wakati wa kuzaliwa kwa michakato.
Vikwazo: Mchakato hauwezi kupata uwezo ambao mzazi wake hakuwa nao.
Effective (CapEff):
Madhumuni: Inawakilisha uwezo halisi ambao mchakato unatumia wakati wowote.
Ufanisi: Ni seti ya uwezo inayokaguliwa na kernel ili kutoa ruhusa kwa shughuli mbalimbali. Kwa faili, seti hii inaweza kuwa bendera inayoashiria kama uwezo wa faili unaruhusiwa kuzingatiwa kuwa halisi.
Umuhimu: Seti halisi ni muhimu kwa ukaguzi wa haraka wa privileges, ikifanya kazi kama seti ya uwezo inayotumika ambayo mchakato unaweza kutumia.
Permitted (CapPrm):
Madhumuni: Inabainisha seti ya juu ya uwezo ambayo mchakato unaweza kuwa nayo.
Ufanisi: Mchakato unaweza kuinua uwezo kutoka kwa seti inayoruhusiwa hadi seti yake halisi, ikimpa uwezo wa kutumia uwezo huo. Pia inaweza kuondoa uwezo kutoka kwa seti yake inayoruhusiwa.
Mipaka: Inafanya kazi kama kikomo cha juu kwa uwezo ambao mchakato unaweza kuwa nao, kuhakikisha mchakato hauzidi wigo wa privileges ulioainishwa.
Bounding (CapBnd):
Madhumuni: Inweka kikomo juu ya uwezo ambao mchakato unaweza kupata wakati wa maisha yake.
Ufanisi: Hata kama mchakato una uwezo fulani katika seti yake inayorithiwa au inayoruhusiwa, hauwezi kupata uwezo huo isipokuwa pia uko katika seti ya bounding.
Matumizi: Seti hii ni muhimu kwa kupunguza uwezo wa mchakato kupandisha privileges, ikiongeza safu ya ziada ya usalama.
Ambient (CapAmb):
Madhumuni: Inaruhusu uwezo fulani kudumishwa wakati wa wito wa mfumo wa
execve
, ambao kwa kawaida ungepelekea upya kamili wa uwezo wa mchakato.Ufanisi: Inahakikisha kwamba programu zisizo za SUID ambazo hazina uwezo wa faili zinazohusiana zinaweza kudumisha privileges fulani.
Vikwazo: Uwezo katika seti hii unategemea vikwazo vya seti zinazorithiwa na zinazoruhusiwa, kuhakikisha hazipiti privileges zinazoruhusiwa za mchakato.
Kwa maelezo zaidi angalia:
Uwezo wa Mchakato & Binaries
Uwezo wa Mchakato
Ili kuona uwezo wa mchakato maalum, tumia faili ya status katika saraka ya /proc. Kwa kuwa inatoa maelezo zaidi, hebu tuipunguze kwa habari inayohusiana na uwezo wa Linux. Kumbuka kwamba kwa mchakato wote unaotembea, habari ya uwezo inahifadhiwa kwa kila thread, kwa binaries katika mfumo wa faili inahifadhiwa katika sifa za kupanuliwa.
Unaweza kupata uwezo ulioainishwa katika /usr/include/linux/capability.h
Unaweza kupata uwezo wa mchakato wa sasa katika cat /proc/self/status
au kufanya capsh --print
na wa watumiaji wengine katika /proc/<pid>/status
Hii amri inapaswa kurudisha mistari 5 kwenye mifumo mingi.
CapInh = Uwezo ulio urithiwa
CapPrm = Uwezo ulio ruhusiwa
CapEff = Uwezo halisi
CapBnd = Seti ya mipaka
CapAmb = Seti ya uwezo wa mazingira
Hizi nambari za hexadecimal hazina maana. Kwa kutumia zana ya capsh tunaweza kuzifasiri kuwa majina ya uwezo.
Hebu tuangalia sasa uwezo unaotumiwa na ping
:
Ingawa hiyo inafanya kazi, kuna njia nyingine na rahisi. Ili kuona uwezo wa mchakato unaoendesha, tumia tu chombo cha getpcaps ikifuatiwa na kitambulisho chake cha mchakato (PID). Unaweza pia kutoa orodha ya vitambulisho vya michakato.
Hebu tuangalia hapa uwezo wa tcpdump
baada ya kumpa binary uwezo wa kutosha (cap_net_admin
na cap_net_raw
) ili kunusa mtandao (tcpdump inakimbia katika mchakato 9562):
Kama unavyoona, uwezo uliopewa unalingana na matokeo ya njia 2 za kupata uwezo wa binary. Zana ya getpcaps inatumia wito wa mfumo wa capget() kuuliza uwezo unaopatikana kwa nyuzi maalum. Wito huu wa mfumo unahitaji tu kutoa PID ili kupata maelezo zaidi.
Uwezo wa Binaries
Binaries zinaweza kuwa na uwezo ambao unaweza kutumika wakati wa kutekeleza. Kwa mfano, ni kawaida sana kupata binary ya ping
ikiwa na uwezo wa cap_net_raw
:
Unaweza kutafuta binaries zenye uwezo kwa kutumia:
Kutupa uwezo na capsh
Ikiwa tutatua uwezo wa CAP_NET_RAW kwa ping, basi matumizi ya ping hayapaswi kufanya kazi tena.
Besides the output of capsh itself, the tcpdump command itself should also raise an error.
/bin/bash: /usr/sbin/tcpdump: Operation not permitted
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.
Ondoa Uwezo
You can remove capabilities of a binary with
User Capabilities
Kwa kweli inawezekana kutoa uwezo pia kwa watumiaji. Hii ina maana kwamba kila mchakato unaotekelezwa na mtumiaji ataweza kutumia uwezo wa watumiaji.
Kulingana na hii, hii na hii faili chache mpya zinahitaji kusanidiwa ili kumpa mtumiaji uwezo fulani lakini ile inayotoa uwezo kwa kila mtumiaji itakuwa /etc/security/capability.conf
.
Mfano wa faili:
Environment Capabilities
Kwa kukusanya programu ifuatayo inawezekana kuanzisha shell ya bash ndani ya mazingira yanayotoa uwezo.
Ndani ya bash inayotekelezwa na binary ya mazingira iliyokusanywa inawezekana kuona uwezo mpya (mtumiaji wa kawaida hatakuwa na uwezo wowote katika sehemu ya "sasa").
Unaweza kuongeza tu uwezo ambao upo katika seti za ruhusa na zinazorithishwa.
Binaries zenye Uwezo/Binaries zisizo na Uwezo
Binaries zenye uwezo hazitatumia uwezo mpya uliopewa na mazingira, hata hivyo binaries zisizo na uwezo zitawatumia kwani hazitakataa. Hii inafanya binaries zisizo na uwezo kuwa hatarini ndani ya mazingira maalum yanayotoa uwezo kwa binaries.
Uwezo wa Huduma
Kwa kawaida, huduma inayotembea kama root itakuwa na uwezo wote uliotolewa, na katika baadhi ya matukio hii inaweza kuwa hatari. Kwa hivyo, faili ya mipangilio ya huduma inaruhusu kueleza uwezo unayotaka iwe nao, na mtumiaji anayepaswa kutekeleza huduma ili kuepuka kuendesha huduma yenye ruhusa zisizohitajika:
Uwezo katika Maktaba za Docker
Kwa default, Docker inatoa uwezo kadhaa kwa maktaba. Ni rahisi sana kuangalia ni uwezo gani hawa kwa kukimbia:
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
Privesc/Container Escape
Uwezo ni muhimu unapohitaji kuzuia michakato yako mwenyewe baada ya kufanya operesheni zenye mamlaka (mfano, baada ya kuweka chroot na kuunganisha kwenye socket). Hata hivyo, zinaweza kutumika vibaya kwa kupitisha amri au hoja mbaya ambazo kisha zinafanywa kama root.
Unaweza kulazimisha uwezo kwa programu kwa kutumia setcap
, na kuuliza hizi kwa kutumia getcap
:
The +ep
inamaanisha unongeza uwezo (“-” itauondoa) kama Ufanisi na Uidhinishwa.
Ili kubaini programu katika mfumo au folda zenye uwezo:
Mfano wa Ukatili
Katika mfano ufuatao, binary /usr/bin/python2.6
imepatikana kuwa na udhaifu wa privesc:
Uwezo unaohitajika na tcpdump
ili kuruhusu mtumiaji yeyote kunusa pakiti:
Hali maalum ya uwezo "bila"
Kutoka kwenye nyaraka: Kumbuka kwamba mtu anaweza kupeana seti za uwezo zisizo na kitu kwa faili la programu, na hivyo inawezekana kuunda programu ya set-user-ID-root ambayo inabadilisha set-user-ID halisi na iliyohifadhiwa ya mchakato unaotekeleza programu hiyo kuwa 0, lakini haina uwezo wowote kwa mchakato huo. Au, kwa kusema kwa urahisi, ikiwa una binary ambayo:
haimilikiwi na root
haina bits za
SUID
/SGID
zilizowekwaina seti za uwezo zisizo na kitu (mfano:
getcap myelf
inarudishamyelf =ep
)
basi hiyo binary itakimbia kama root.
CAP_SYS_ADMIN
CAP_SYS_ADMIN
ni uwezo wa Linux wenye nguvu sana, mara nyingi unalinganishwa na kiwango cha karibu na root kutokana na privileges za kiutawala zake kubwa, kama vile kuunganisha vifaa au kubadilisha vipengele vya kernel. Ingawa ni muhimu kwa kontena zinazofanana na mifumo kamili, CAP_SYS_ADMIN
inatoa changamoto kubwa za usalama, hasa katika mazingira ya kontena, kutokana na uwezo wake wa kupandisha hadhi na kuathiri mfumo. Kwa hivyo, matumizi yake yanahitaji tathmini kali za usalama na usimamizi waangalifu, huku kukiwa na upendeleo mkubwa wa kuondoa uwezo huu katika kontena maalum za programu ili kuzingatia kanuni ya hadhi ndogo na kupunguza uso wa shambulio.
Mfano na binary
Kwa kutumia python unaweza kuunganisha faili iliyobadilishwa passwd juu ya faili halisi passwd:
Na hatimaye mount faili la passwd
lililobadilishwa kwenye /etc/passwd
:
Na utaweza su
kama root ukitumia nenosiri "password".
Mfano na mazingira (Docker breakout)
Unaweza kuangalia uwezo ulioanzishwa ndani ya kontena la docker kwa kutumia:
Ndani ya matokeo ya awali unaweza kuona kwamba uwezo wa SYS_ADMIN umewezeshwa.
Mount
Hii inaruhusu kontena la docker kuweka diski ya mwenyeji na kuipata kwa uhuru:
Upatikanaji kamili
Katika njia iliyopita tulifanikiwa kupata diski ya mwenyeji wa docker. Ikiwa utagundua kuwa mwenyeji anafanya kazi na seva ya ssh, unaweza kuunda mtumiaji ndani ya diski ya mwenyeji wa docker na kuipata kupitia SSH:
CAP_SYS_PTRACE
Hii inamaanisha kwamba unaweza kutoroka kwenye kontena kwa kuingiza shellcode ndani ya mchakato fulani unaoendesha ndani ya mwenyeji. Ili kufikia michakato inayofanya kazi ndani ya mwenyeji, kontena linahitaji kuendeshwa angalau na --pid=host
.
CAP_SYS_PTRACE
inatoa uwezo wa kutumia kazi za ufuatiliaji na ufuatiliaji wa wito wa mfumo zinazotolewa na ptrace(2)
na wito za kuunganisha msongamano wa kumbukumbu kama process_vm_readv(2)
na process_vm_writev(2)
. Ingawa ni nguvu kwa ajili ya madhumuni ya uchunguzi na ufuatiliaji, ikiwa CAP_SYS_PTRACE
imewezeshwa bila hatua za kikomo kama vile filta ya seccomp kwenye ptrace(2)
, inaweza kudhoofisha usalama wa mfumo kwa kiasi kikubwa. Kwa haswa, inaweza kutumika kukwepa vizuizi vingine vya usalama, hasa vile vinavyowekwa na seccomp, kama inavyoonyeshwa na uthibitisho wa dhana (PoC) kama hii.
Mfano na binary (python)
Mfano na binary (gdb)
gdb
na uwezo wa ptrace
:
Kuunda shellcode na msfvenom ili kuingiza kwenye kumbukumbu kupitia gdb
Debug a root process with gdb na nakala-bandika mistari ya gdb iliyotengenezwa awali:
Mfano na mazingira (Docker breakout) - Matumizi mengine ya gdb
Ikiwa GDB imewekwa (au unaweza kuisakinisha kwa apk add gdb
au apt install gdb
kwa mfano) unaweza kuchunguza mchakato kutoka kwa mwenyeji na kufanya uitwe kazi ya system
. (Teknolojia hii pia inahitaji uwezo SYS_ADMIN
).
Hutaweza kuona matokeo ya amri iliyotekelezwa lakini itatekelezwa na mchakato huo (hivyo pata rev shell).
Ikiwa unapata kosa "No symbol "system" in current context." angalia mfano wa awali wa kupakia shellcode katika programu kupitia gdb.
Mfano na mazingira (Docker breakout) - Shellcode Injection
Unaweza kuangalia uwezo ulioanzishwa ndani ya kontena la docker kwa kutumia:
List processes running in the host ps -eaf
Get the architecture
uname -m
Find a shellcode for the architecture (https://www.exploit-db.com/exploits/41128)
Find a program to inject the shellcode into a process memory (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Modify the shellcode inside the program and compile it
gcc inject.c -o inject
Inject it and grab your shell:
./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
CAP_SYS_MODULE
inaruhusu mchakato kuchoma na kuondoa moduli za kernel (init_module(2)
, finit_module(2)
na delete_module(2)
system calls), ikitoa ufikiaji wa moja kwa moja kwa operesheni kuu za kernel. Uwezo huu una hatari kubwa za usalama, kwani unaruhusu kupanda vyeo na kuathiri mfumo mzima kwa kuruhusu mabadiliko kwenye kernel, hivyo kupita mitambo yote ya usalama ya Linux, ikiwa ni pamoja na Moduli za Usalama za Linux na kutengwa kwa kontena.
Hii inamaanisha kwamba unaweza kuingiza/kuondoa moduli za kernel katika/katika kernel ya mashine mwenyeji.
Mfano na binary
Katika mfano ufuatao, binary python
ina uwezo huu.
Kwa default, amri ya modprobe
inakagua orodha ya utegemezi na faili za ramani katika saraka /lib/modules/$(uname -r)
.
Ili kutumia hii vibaya, hebu tuunde folda ya uwongo ya lib/modules:
Kisha unda moduli ya kernel ambayo unaweza kupata mifano 2 hapa chini na nakala yake kwenye folda hii:
Hatimaye, tekeleza msimbo wa python unaohitajika kupakia moduli hii ya kernel:
Mfano wa 2 na binary
Katika mfano ufuatao, binary kmod
ina uwezo huu.
Ambayo inamaanisha kwamba inawezekana kutumia amri insmod
kuingiza moduli ya kernel. Fuata mfano hapa chini kupata reverse shell ukitumia haki hii.
Mfano na mazingira (Docker breakout)
Unaweza kuangalia uwezo ulioanzishwa ndani ya kontena la docker kwa kutumia:
Ndani ya matokeo ya awali unaweza kuona kwamba uwezo wa SYS_MODULE umewezeshwa.
Unda moduli ya kernel ambayo itatekeleza shell ya nyuma na Makefile ili kuunda hiyo:
Karakteri tupu kabla ya kila neno la make katika Makefile lazima iwe tab, si nafasi!
Execute make
to compile it.
Hatimaye, anzisha nc
ndani ya shell na pakia moduli kutoka nyingine na utaweza kukamata shell katika mchakato wa nc:
Msimbo wa mbinu hii ulikopwa kutoka maabara ya "Abusing SYS_MODULE Capability" kutoka https://www.pentesteracademy.com/
Mfano mwingine wa mbinu hii unaweza kupatikana katika 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
CAP_DAC_READ_SEARCH inaruhusu mchakato kuzidi ruhusa za kusoma faili na za kusoma na kutekeleza saraka. Matumizi yake makuu ni kwa ajili ya kutafuta au kusoma faili. Hata hivyo, inaruhusu pia mchakato kutumia kazi ya open_by_handle_at(2)
, ambayo inaweza kufikia faili yoyote, ikiwa ni pamoja na zile zilizo nje ya eneo la mchakato. Kifaa kinachotumika katika open_by_handle_at(2)
kinapaswa kuwa kitambulisho kisichokuwa wazi kilichopatikana kupitia name_to_handle_at(2)
, lakini kinaweza kujumuisha taarifa nyeti kama nambari za inode ambazo ziko hatarini kubadilishwa. Uwezekano wa kutumia uwezo huu, hasa katika muktadha wa kontena za Docker, ulionyeshwa na Sebastian Krahmer kwa kutumia exploit ya shocker, kama ilivyochambuliwa hapa. Hii inamaanisha kwamba unaweza kuzidi kuangalia ruhusa za kusoma faili na kuangalia ruhusa za kusoma/kutekeleza saraka.
Mfano na binary
Binary itakuwa na uwezo wa kusoma faili yoyote. Hivyo, ikiwa faili kama tar ina uwezo huu itakuwa na uwezo wa kusoma faili la kivuli:
Mfano na binary2
Katika kesi hii, hebu tuone kwamba python
binary ina uwezo huu. Ili orodhesha faili za root unaweza kufanya:
Na ili kusoma faili unaweza kufanya:
Mfano katika Mazingira (Docker breakout)
You can check the enabled capabilities inside the docker container using:
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 sio tu inatuwezesha kupita kwenye mfumo wa faili bila ukaguzi wa ruhusa, bali pia inafuta waziwazi ukaguzi wowote wa open_by_handle_at(2) na inaweza kuruhusu mchakato wetu kufikia faili nyeti zilizo funguliwa na michakato mingine.
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.
Exploiti inahitaji kupata kiashiria kwa kitu kilichowekwa kwenye mwenyeji. Exploiti ya awali ilitumia faili /.dockerinit na toleo hili lililobadilishwa linatumia /etc/hostname. Ikiwa exploiti haifanyi kazi labda unahitaji kuweka faili tofauti. Ili kupata faili ambayo imewekwa kwenye mwenyeji tekeleza amri ya mount:
Msimbo wa mbinu hii ulikopwa kutoka maabara ya "Abusing DAC_READ_SEARCH Capability" kutoka https://www.pentesteracademy.com/
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
CAP_DAC_OVERRIDE
Hii inamaanisha kwamba unaweza kupita ukaguzi wa ruhusa za kuandika kwenye faili yoyote, hivyo unaweza kuandika faili yoyote.
Kuna faili nyingi ambazo unaweza kuandika upya ili kupandisha mamlaka, unaweza kupata mawazo kutoka hapa.
Mfano na binary
Katika mfano huu vim ina uwezo huu, hivyo unaweza kubadilisha faili yoyote kama passwd, sudoers au shadow:
Mfano na binary 2
Katika mfano huu python
binary itakuwa na uwezo huu. Unaweza kutumia python kubadilisha faili yoyote:
Mfano na mazingira + CAP_DAC_READ_SEARCH (Docker breakout)
Unaweza kuangalia uwezo ulioanzishwa ndani ya kontena la docker kwa kutumia:
Kwanza, soma sehemu ya awali ambayo inatumia uwezo wa DAC_READ_SEARCH kusoma faili za kawaida za mwenyeji na kusanyisha exploit. Kisha, kusanyisha toleo linalofuata la exploit ya shocker ambalo litakuruhusu kuandika faili za kawaida ndani ya mfumo wa faili wa wenyeji:
Ili kutoroka kwenye kontena la docker unaweza kupakua faili /etc/shadow
na /etc/passwd
kutoka kwa mwenyeji, kuongeza mtumiaji mpya, na kutumia shocker_write
kuandika upya. Kisha, fikia kupitia ssh.
Msimbo wa mbinu hii ulikopwa kutoka maabara ya "Abusing DAC_OVERRIDE Capability" kutoka https://www.pentesteracademy.com
CAP_CHOWN
Hii inamaanisha kwamba inawezekana kubadilisha umiliki wa faili yoyote.
Mfano na binary
Tuchukulie kwamba binary ya python
ina uwezo huu, unaweza kubadilisha mmiliki wa faili shadow, kubadilisha nenosiri la root, na kupandisha haki:
Au na ruby
binary ikiwa na uwezo huu:
CAP_FOWNER
Hii inamaanisha kwamba inawezekana kubadilisha ruhusa za faili yoyote.
Mfano na binary
Ikiwa python ina uwezo huu unaweza kubadilisha ruhusa za faili la kivuli, kubadilisha nenosiri la root, na kuongeza mamlaka:
CAP_SETUID
Hii inamaanisha kwamba inawezekana kuweka kitambulisho cha mtumiaji kinachofanya kazi cha mchakato ulioanzishwa.
Mfano na binary
Ikiwa python ina hii uwezo, unaweza kuitumia kwa urahisi kuboresha mamlaka hadi root:
Njia nyingine:
CAP_SETGID
Hii inamaanisha kwamba inawezekana kuweka kitambulisho cha kikundi kinachofanya kazi cha mchakato ulioundwa.
Kuna faili nyingi ambazo unaweza kuandika upya ili kupandisha mamlaka, unaweza kupata mawazo kutoka hapa.
Mfano na binary
Katika kesi hii unapaswa kutafuta faili za kuvutia ambazo kikundi kinaweza kusoma kwa sababu unaweza kujifanya kuwa kikundi chochote:
Mara tu unapopata faili unayoweza kutumia (kupitia kusoma au kuandika) ili kupandisha hadhi, unaweza kupata shell ukijifanya kuwa kundi la kuvutia kwa:
Katika kesi hii, kundi la shadow lilijitambulisha ili uweze kusoma faili /etc/shadow
:
Ikiwa docker imewekwa unaweza kujifanya kuwa kikundi cha docker na kuitumia kuwasiliana na docker socket na kupandisha mamlaka.
CAP_SETFCAP
Hii inamaanisha kwamba inawezekana kuweka uwezo kwenye faili na michakato
Mfano na binary
Ikiwa python ina uwezo huu, unaweza kwa urahisi kuutumia kupandisha mamlaka hadi root:
Kumbuka kwamba ikiwa utaweka uwezo mpya kwa binary na CAP_SETFCAP, utapoteza uwezo huu.
Mara tu unapo kuwa na SETUID capability unaweza kwenda kwenye sehemu yake kuona jinsi ya kupandisha mamlaka.
Mfano na mazingira (Docker breakout)
Kwa default uwezo CAP_SETFCAP unatolewa kwa mchakato ndani ya kontena katika Docker. Unaweza kuangalia hilo kwa kufanya kitu kama:
Hii uwezo inaruhusu kutoa uwezo mwingine wowote kwa binaries, hivyo tunaweza kufikiria kuhusu kutoroka kutoka kwenye kontena kwa kutumia mojawapo ya uwezo mwingine wa kuvunja ulioelezwa kwenye ukurasa huu. Hata hivyo, ukijaribu kutoa kwa mfano uwezo CAP_SYS_ADMIN na CAP_SYS_PTRACE kwa binary ya gdb, utagundua kwamba unaweza kuwapa, lakini binary haitakuwa na uwezo wa kutekeleza baada ya hii:
From the docs: Permitted: Hii ni seti ya mipaka kwa uwezo halisi ambao thread inaweza kuchukua. Pia ni seti ya mipaka kwa uwezo ambao unaweza kuongezwa kwenye seti ya kurithiwa na thread ambayo haina uwezo wa CAP_SETPCAP katika seti yake halisi. Inaonekana kama uwezo wa Permitted unakandamiza wale wanaoweza kutumika. Hata hivyo, Docker pia inatoa CAP_SETPCAP kwa chaguo-msingi, hivyo unaweza kuwa na uwezo wa kuweka uwezo mpya ndani ya wale wa kurithiwa. Hata hivyo, katika hati hii ya uwezo: CAP_SETPCAP : […] ongeza uwezo wowote kutoka kwenye seti ya mipaka ya thread inayoitisha kwenye seti yake ya kurithiwa. Inaonekana kama tunaweza kuongeza tu kwenye seti ya kurithiwa uwezo kutoka kwenye seti ya mipaka. Hii inamaanisha kwamba hatuwezi kuweka uwezo mpya kama CAP_SYS_ADMIN au CAP_SYS_PTRACE katika seti ya kurithiwa ili kupandisha mamlaka.
CAP_SYS_RAWIO
CAP_SYS_RAWIO inatoa idadi ya operesheni nyeti ikiwa ni pamoja na ufikiaji wa /dev/mem
, /dev/kmem
au /proc/kcore
, kubadilisha mmap_min_addr
, ufikiaji wa ioperm(2)
na iopl(2)
wito wa mfumo, na amri mbalimbali za diski. FIBMAP ioctl(2)
pia inaruhusiwa kupitia uwezo huu, ambao umesababisha matatizo katika zamani. Kulingana na ukurasa wa man, hii pia inaruhusu mwenye uwezo kufanya perform a range of device-specific operations on other devices
.
Hii inaweza kuwa na manufaa kwa kupandisha mamlaka na Docker breakout.
CAP_KILL
Hii inamaanisha kwamba inawezekana kuua mchakato wowote.
Mfano na binary
Tuchukulie kwamba python
binary ina uwezo huu. Ikiwa unaweza pia kubadilisha baadhi ya huduma au usanidi wa socket (au faili yoyote ya usanidi inayohusiana na huduma) faili, unaweza kuingiza nyuma, na kisha kuua mchakato unaohusiana na huduma hiyo na kusubiri faili mpya ya usanidi kutekelezwa na nyuma yako.
Privesc na kill
Ikiwa una uwezo wa kill na kuna programu ya node inayoendesha kama root (au kama mtumiaji tofauti) unaweza labda kutuma ishara ya SIGUSR1 na kuifanya ifungue debuggger ya node ambapo unaweza kuungana.
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
CAP_NET_BIND_SERVICE
Hii inamaanisha kwamba inawezekana kusikiliza kwenye bandari yoyote (hata zile za kibali). Huwezi kupandisha mamlaka moja kwa moja kwa kutumia uwezo huu.
Mfano na binary
Ikiwa python
ina uwezo huu itakuwa na uwezo wa kusikiliza kwenye bandari yoyote na hata kuungana kutoka kwake na bandari nyingine yoyote (huduma zingine zinahitaji muunganisho kutoka kwenye bandari za kibali maalum)
CAP_NET_RAW
CAP_NET_RAW uwezo unaruhusu michakato kuunda RAW na PACKET sockets, ikiwaruhusu kuzalisha na kutuma pakiti za mtandao zisizo na mpangilio. Hii inaweza kusababisha hatari za usalama katika mazingira ya kontena, kama vile kupotosha pakiti, kuingiza trafiki, na kupita udhibiti wa ufikiaji wa mtandao. Waigizaji wabaya wanaweza kutumia hii kuingilia kati mwelekeo wa kontena au kuhatarisha usalama wa mtandao wa mwenyeji, hasa bila ulinzi wa moto wa kutosha. Zaidi ya hayo, CAP_NET_RAW ni muhimu kwa kontena zenye mamlaka kusaidia operesheni kama ping kupitia maombi ya RAW ICMP.
Hii inamaanisha kwamba inawezekana kunasa trafiki. Huwezi kuongeza mamlaka moja kwa moja kwa uwezo huu.
Mfano na binary
Ikiwa binary tcpdump
ina uwezo huu utaweza kuutumia kunasa taarifa za mtandao.
Kumbuka kwamba ikiwa muktadha unatoa uwezo huu unaweza pia kutumia tcpdump
kunasa trafiki.
Mfano na binary 2
Mfano ufuatao ni python2
msimbo ambao unaweza kuwa na manufaa kunasa trafiki ya kiolesura cha "lo" (localhost). Msimbo huu unatoka kwenye maabara "Misingi: CAP-NET_BIND + NET_RAW" kutoka https://attackdefense.pentesteracademy.com/
CAP_NET_ADMIN + CAP_NET_RAW
CAP_NET_ADMIN uwezo unampa mwenyewe nguvu ya kubadilisha mipangilio ya mtandao, ikiwa ni pamoja na mipangilio ya firewall, meza za routing, ruhusa za socket, na mipangilio ya kiunganishi cha mtandao ndani ya majina ya mtandao yaliyofichuliwa. Pia inaruhusu kuwasha modo wa promiscuous kwenye viunganishi vya mtandao, ikiruhusu kunasa pakiti kupitia majina ya mtandao.
Mfano na binary
Hebu tuone kwamba python binary ina uwezo huu.
CAP_LINUX_IMMUTABLE
Hii inamaanisha kwamba inawezekana kubadilisha sifa za inode. Huwezi kupandisha mamlaka moja kwa moja na uwezo huu.
Mfano na binary
Ikiwa unapata kwamba faili ni immutable na python ina uwezo huu, unaweza kuondoa sifa ya immutable na kufanya faili iweze kubadilishwa:
Kumbuka kwamba kawaida sifa hii isiyoweza kubadilishwa huwekwa na kuondolewa kwa kutumia:
CAP_SYS_CHROOT
CAP_SYS_CHROOT inaruhusu utekelezaji wa chroot(2)
system call, ambayo inaweza kuruhusu kutoroka kutoka kwa mazingira ya chroot(2)
kupitia udhaifu unaojulikana:
CAP_SYS_BOOT
CAP_SYS_BOOT si tu inaruhusu utekelezaji wa reboot(2)
system call kwa ajili ya kuanzisha upya mfumo, ikiwa ni pamoja na amri maalum kama LINUX_REBOOT_CMD_RESTART2
iliyoundwa kwa ajili ya majukwaa fulani ya vifaa, lakini pia inaruhusu matumizi ya kexec_load(2)
na, kuanzia Linux 3.17, kexec_file_load(2)
kwa ajili ya kupakia nyuklia mpya au zilizotiwa saini.
CAP_SYSLOG
CAP_SYSLOG ilitengwa kutoka kwa CAP_SYS_ADMIN kwa ujumla katika Linux 2.6.37, ikitoa uwezo wa kutumia syslog(2)
call. Uwezo huu unaruhusu kuona anwani za kernel kupitia /proc
na interfaces zinazofanana wakati mipangilio ya kptr_restrict
iko kwenye 1, ambayo inasimamia kufichuliwa kwa anwani za kernel. Kuanzia Linux 2.6.39, chaguo-msingi kwa kptr_restrict
ni 0, ikimaanisha anwani za kernel zinakabiliwa, ingawa usambazaji mwingi huweka hii kuwa 1 (ficha anwani isipokuwa kutoka uid 0) au 2 (daima ficha anwani) kwa sababu za usalama.
Zaidi ya hayo, CAP_SYSLOG inaruhusu kufikia matokeo ya dmesg
wakati dmesg_restrict
imewekwa kuwa 1. Licha ya mabadiliko haya, CAP_SYS_ADMIN inabaki na uwezo wa kufanya operesheni za syslog
kutokana na mifano ya kihistoria.
CAP_MKNOD
CAP_MKNOD inapanua kazi ya mknod
system call zaidi ya kuunda faili za kawaida, FIFOs (mabomba yenye majina), au UNIX domain sockets. Inaruhusu hasa kuunda faili maalum, ambazo zinajumuisha:
S_IFCHR: Faili maalum za wahusika, ambazo ni vifaa kama terminal.
S_IFBLK: Faili maalum za block, ambazo ni vifaa kama diski.
Uwezo huu ni muhimu kwa michakato inayohitaji uwezo wa kuunda faili za vifaa, ikirahisisha mwingiliano wa moja kwa moja na vifaa kupitia vifaa vya wahusika au block.
Ni uwezo wa chombo cha default (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19).
Uwezo huu unaruhusu kufanya kupandisha hadhi (kupitia kusoma diski kamili) kwenye mwenyeji, chini ya masharti haya:
Kuwa na ufikiaji wa awali kwa mwenyeji (Bila hadhi).
Kuwa na ufikiaji wa awali kwa chombo (Bila hadhi (EUID 0), na
CAP_MKNOD
inayofaa).Mwenyeji na chombo vinapaswa kushiriki namespace sawa ya mtumiaji.
Hatua za Kuunda na Kufikia Kifaa cha Block katika Chombo:
Kwenye Mwenyeji kama Mtumiaji wa Kawaida:
Tambua kitambulisho chako cha mtumiaji wa sasa kwa kutumia
id
, mfano,uid=1000(standarduser)
.Tambua kifaa kinacholengwa, kwa mfano,
/dev/sdb
.
Ndani ya Chombo kama
root
:
Rudi kwenye Host:
This approach allows the standard user to access and potentially read data from /dev/sdb
through the container, exploiting shared user namespaces and permissions set on the device.
CAP_SETPCAP
CAP_SETPCAP enables a process to alter the capability sets of another process, allowing for the addition or removal of capabilities from the effective, inheritable, and permitted sets. However, a process can only modify capabilities that it possesses in its own permitted set, ensuring it cannot elevate another process's privileges beyond its own. Recent kernel updates have tightened these rules, restricting CAP_SETPCAP
to only diminish the capabilities within its own or its descendants' permitted sets, aiming to mitigate security risks. Usage requires having CAP_SETPCAP
in the effective set and the target capabilities in the permitted set, utilizing capset()
for modifications. This summarizes the core function and limitations of CAP_SETPCAP
, highlighting its role in privilege management and security enhancement.
CAP_SETPCAP
ni uwezo wa Linux unaoruhusu mchakato kubadilisha seti za uwezo za mchakato mwingine. Inatoa uwezo wa kuongeza au kuondoa uwezo kutoka kwa seti za uwezo zinazofaa, zinazorithiwa, na zinazoruhusiwa za michakato mingine. Hata hivyo, kuna vizuizi fulani juu ya jinsi uwezo huu unaweza kutumika.
Mchakato wenye CAP_SETPCAP
unaweza tu kutoa au kuondoa uwezo ambao uko katika seti yake ya uwezo inayoruhusiwa. Kwa maneno mengine, mchakato hauwezi kutoa uwezo kwa mchakato mwingine ikiwa haujakuwa na uwezo huo mwenyewe. Kizuizi hiki kinazuia mchakato kuinua mamlaka ya mchakato mwingine zaidi ya kiwango chake mwenyewe cha mamlaka.
Zaidi ya hayo, katika toleo za hivi karibuni za kernel, uwezo wa CAP_SETPCAP
umekuwa ukizuiwa zaidi. Hauruhusu tena mchakato kubadilisha seti za uwezo za michakato mingine kwa njia isiyo ya kawaida. Badala yake, inaruhusu tu mchakato kupunguza uwezo katika seti yake ya uwezo inayoruhusiwa au seti za uwezo zinazoruhusiwa za wazazi wake. Mabadiliko haya yaliletwa ili kupunguza hatari za usalama zinazoweza kutokea zinazohusiana na uwezo huo.
Ili kutumia CAP_SETPCAP
kwa ufanisi, unahitaji kuwa na uwezo huo katika seti yako ya uwezo inayofaa na uwezo wa lengo katika seti yako ya uwezo inayoruhusiwa. Unaweza kisha kutumia wito wa mfumo wa capset()
kubadilisha seti za uwezo za michakato mingine.
Kwa muhtasari, CAP_SETPCAP
inaruhusu mchakato kubadilisha seti za uwezo za michakato mingine, lakini haiwezi kutoa uwezo ambao haina mwenyewe. Zaidi ya hayo, kutokana na wasiwasi wa usalama, kazi yake imepunguzika katika toleo za hivi karibuni za kernel ili kuruhusu tu kupunguza uwezo katika seti yake ya uwezo inayoruhusiwa au seti za uwezo zinazoruhusiwa za wazazi wake.
References
Most of these examples were taken from some labs of https://attackdefense.pentesteracademy.com/, so if you want to practice this privesc techniques I recommend these labs.
Other references:
RootedCON is the most relevant cybersecurity event in Spain and one of the most important in Europe. With the mission of promoting technical knowledge, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline.
Last updated