Kuinka käytän capsh: Yritän suorittaa ehdollisen pingin, jolla on vähäiset mahdollisuudet
On helmikuu 13, 2021 by adminKokeilen ominaisuuksia Debian Gnu / Linux -käyttöjärjestelmässä.
Olen kopioinut / bin / ping nykyiseen työhakemistooni. Kuten odotettiin, se ei toimi, se oli alun perin setuid-pääkäyttäjä.
Annan pingille minimiominaisuudet (ei root) tekemällä sudo /sbin/setcap cap_net_raw=ep ./ping
ja pingin toimii odotetusti.
Sitten sudo /sbin/setcap -r ./ping
peruuttaaksesi kyseisen ominaisuuden. Se ei nyt toimi odotetulla tavalla.
Yritän nyt saada pingin toimimaan käyttämällä capsh
.
capsh
ei ole oikeuksia, joten minun on suoritettava se pääkäyttäjänä, mutta sitten pudotettava juuri ja siten kaikki muut käyttöoikeudet.
Minusta tarvitaan myös secure-keep-caps
, tätä ei ole dokumentoitu kohdassa capsh
, mutta se on ominaisuudessa manuaalinen. Sain bittiluvut osoitteesta /usr/include/linux/securebits.h
. Ne näyttävät oikeilta, koska --print
-lähdön mukaan nämä bitit ovat oikeita.
Olen kävellyt tuntikausia, toistaiseksi minulla on tämä.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
ping
-virheet kuitenkin ping: icmp open socket: Operation not permitted
, näin tapahtuu, kun sillä ei ole kykyä. Myös --print
näyttää Current: =p cap_net_raw+i
, tämä ei riitä, että tarvitsemme e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
asettaa kyvyksi arvoksi Current: = cap_net_raw+eip
tämä on oikein, mutta jättää meidät nimellä root
.
Edit-1
Olen nyt kokeillut sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Tämä tuottaa:
touch: cannot touch `zz": Permission denied ping: icmp open socket: Operation not permitted
Ensimmäisen virheen odotetaan olevan secure-noroot: yes
, mutta toinen ei ole Current: = cap_net_raw+eip
Edit-2
Jos laitan ==
--print
: n eteen, se nyt näyttää Current: = cap_net_raw+i
, joten se selittää edellisen virheen, mutta ei miksi menetämme kyvyn vaihtaessasi juuria, vaikka secure-keep-caps
pitäisi korjaa se.
Edit-3
Näen siltä, että näen kadottavan tehokkaan (e) ja sallitun (p), kun exec kutsutaan. Tämä on odotettavissa, mutta ajattelin, että suojatun korkin pitäisi estää niitä menettämästä. Puuttuuko minusta jotain.
Edit-4
Olen tehnyt enemmän tutkimuksia ja lukenut käyttöohjetta uudelleen. Vaikuttaa siltä, että normaalisti e
ja p
ominaisuudet menetetään, kun: vaihdat käyttäjältä root
(tai käytä secure-noroot
, jolloin root on tavallinen käyttäjä), tämä voidaan ohittaa secure-keep-caps
-merkillä; kun soitat numeroon exec
, niin pitkälti kuin voin sanoa, tämä on invariantti.
Sikäli kuin voin kertoa, se toimii käyttöohjeen mukaisesti. Sikäli kuin voin kertoa, ei ole mitään tapaa tehdä mitään hyödyllistä capsh
-toiminnolla. Sikäli kuin voin kertoa, sinun on käytettävä seuraavia ominaisuuksia: käytettävä tiedostojen ominaisuuksia tai sinulla on ominaisuuksia tunteva ohjelma, joka ei käytä exec
. Siksi ei etuoikeutettua kääriä.
Joten nyt kysyn, mistä puuttuu, mihin capsh
tarkoitetaan.
Edit-5
Olen lisännyt vastauksen ympäröiviin ominaisuuksiin. Ehkä capsh
voidaan käyttää myös perittyjen ominaisuuksien kanssa, mutta jotta ne olisivat hyödyllisiä, ne on asetettava suoritettavaan tiedostoon. En näe, kuinka capsh voi tehdä mitään hyödyllistä ilman ympäristön ominaisuuksia tai sallia perittyjä ominaisuuksia.
Versiot:
-
capsh
paketistalibcap2-bin
version1:2.22-1.2
- ennen edit-3 napasin viimeisimmän
capsh
osoitteestagit://git.debian.org/collab-maint/libcap2.git
ja aloitti sen käytön. -
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
User-land on 32-bittinen.
Kommentit
Vastaus
Ominaisuudet ovat prosessien ominaisuuksia. Perinteisesti on kolme sarjaa:
- Sallitut ominaisuudet ( p ): ominaisuudet, jotka voivat olla ”aktivoitu” nykyisessä prosessissa.
- Tehokkaat ominaisuudet ( e ): ominaisuudet, jotka ovat tällä hetkellä käytettävissä nykyisessä prosessissa.
- Perimättömät ominaisuudet ( i ): tiedostominaisuudet, jotka voidaan periä.
Pääkäyttäjänä suoritetuilla ohjelmilla on aina kaikki sallitut ja tehokkaat ominaisuudet, joten lisäominaisuuksien lisäämisellä ei ole havaittavaa vaikutusta. (Perittävä ominaisuusjoukko on yleensä tyhjä.) setcap cap_net_raw+ep ping
-asetuksella otat nämä ominaisuudet käyttöön oletusarvoisesti kaikille tätä ohjelmaa käyttäville käyttäjille.
Nämä ominaisuudet ovat valitettavasti sidottu suoritettua tiedostoa, eikä niitä säilytetä uuden aliprosessin suorittamisen jälkeen. Linux 4.3 esitteli Ambient -ominaisuudet , joiden avulla aliprosessit voivat periä ominaisuuksia. (Katso myös Ominaisuuksien muuntaminen suorituksen aikana () -ominaisuuksissa (7) .)
Toistettaessa ominaisuuksia, huomioi nämä epäkohdat:
- Kun vaihdat käyttäjän juuresta ei-root-päähän, tehokkaat ja sallitut ominaisuudet tyhjennetään (katso Käyttäjätunnuksen muutosten vaikutus ominaisuuksiin -ominaisuuksissa (7) ). Voit käyttää
--keep=1
-vaihtoehtoacapsh
välttääksesi joukkojen tyhjentämisen. - Ympäristökapasiteetti tyhjennetään, kun käyttäjän tai ryhmän tunnusten muuttaminen. Ratkaisu: lisää ympäristön ominaisuudet sen jälkeen, kun vaihdat käyttäjätunnusta, mutta ennen suoritat aliprosessin.
- Valmiudet voidaan lisätä vain ympäröiviin ominaisuuksiin jos se on jo sekä sallituissa että perittävissä ominaisuuksissa.
Libcap 2.26: n jälkeen capsh
-ohjelma sai mahdollisuuden muokata ympäristön ominaisuuksia vaihtoehtojen, kuten --addamb
( sitoutuminen) kautta. Huomaa, että optiojärjestys on merkittävä. Esimerkkikäyttö:
sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \ --keep=1 --user=nobody --addamb=cap_net_raw -- \ -c "./ping -c1 127.0.0.1"
Vinkki: Voit lisätä vaihtoehdon --print
mihin tahansa kohtaan capsh
-komentorivi ja nähdä sen nykyinen kyvykkyystila.
Huomaa: cap_setpcap
tarvitaan --addamb
kun cap_setuid,cap_setgid
tarvitaan vaihtoehtoon --user
.
Kommentit
- Mikä libcapin versionumero on ollut capsh –addamb? 2.32 julkaisutiedoissa mainittiin uudet capsh-ominaisuudet, mutta sanat olivat epämääräisiä.
- @ 把 友情 留 在 无 盐 Kun vastaus kirjoitettiin alun perin, vain git master tuki sitä. Siitä lähtien libcap 2.26 on julkaistu, ja se tukee
--addamb
-vaihtoehtoa. Olen päivittänyt vastauksen vastaavasti. - Valitettavasti nämä ominaisuudet on sidottu suoritettuun tiedostoon, eikä niitä säilytetä uuden aliprosessin suorittamisen jälkeen. – aliprosessi Ajattelen yleensä
fork(2)
, joka perii ominaisuudet. Vainexecve(2)
ei ’ t peri ominaisuuksia, mutta se ei ’ luo lasta prosessi. Olenko väärässä? - Lainaus
man capabiltiies
:fork(2)
-palvelun kautta luotu lapsi perii vanhemmansa kopiot ’ s -ominaisuudet.
Vastaa
Lekensteynin vastaus näyttää tarkalta ja täydelliseltä, mutta yritän antaa toisen selityksen eri näkökulmasta, joka yrittää korostaa ongelmaa, jonka asetetut ympäristön ominaisuudet ratkaisevat.
Kun suoritat sudo capsh --user=<some_user> --
On olemassa kaksi kiinnostavaa järjestelmäkutsua, jotka aiheuttavat ominaisuuksien uudelleenlaskemisen (ja mahdollisesti pudottamisen):
-
setuid
:man capabilities
:
SECBIT_KEEP_CAPS Tämän lipun asettaminen sallii ketjun, jolla on yksi tai useampi 0 UID-tunnusta säilyttää kykynsä, kun se vaihtaa kaikki UID-tunnuksensa nollasta poikkeavaan arvoon. Jos tätä lippua ei ole asetettu, tällainen UID-kytkin aiheuttaa ketjun menettämisen kaikki ominaisuudet.
Toisin sanoen, yllä olevassa capsh
-komennossa meidän on varmistettava, että SECBIT_KEEP_CAPS on asetettu setuid
järjestelmäkutsu. Muuten kaikki ominaisuudet menetetään. Tätä tekee --keep=1
. Joten nyt komennosta tulee sudo capsh --user=<some_user> --keep=1 --
-
execve
: Jos käytä--keep=1
-vaihtoehtoa, kaikki ominaisuusjoukot (tehokas, sallittu, perittävä) säilytetään astiexecve
-järjestelmäkutsu, muttaexecve
aiheuttaa myös ominaisuuksien uudelleenlaskennan (muille kuin root-käyttäjille) ja ei niin ilmeinen tapa.Lyhyesti sanottuna ennen ympäristön ominaisuuksien lisäämistä asetettu , jotta kyky olla ketjussa ”s” sallittu ” asetettuexecve
-puhelun jälkeen, joko:- Tiedostolla on oltava tämä ominaisuus sallitussa joukossa . voidaan tehdä koodilla
setcap cap_net_raw+p /bin/bash
. Tämän tekeminen tekee koko harjoituksesta hyödyttömän, koska langan kyvykkyysjoukoilla (muilla kuin rajoittavilla ryhmillä) ei ole enää mitään vaikutusta. - Sekä tiedostolla että ketjulla on oltava tämä ominaisuus niiden ”perittävissä” sarjoissa . Saatat ajatella, että
setcap cap_net_raw+i
tekisi tempun, mutta käy ilmi, ettäexecve
aiheuttaa ketjun periytyvien oikeuksien pudottamisen, kun soittaja käyttäjille, joille etuoikeus (jota kiitämme tällä hetkelläsetuid
). Joten tätä ehtoa ei voida mitenkään täyttää käyttöoikeuksettomana käyttäjänä.
- Tiedostolla on oltava tämä ominaisuus sallitussa joukossa . voidaan tehdä koodilla
Linux 4.3: n käyttöönotetut ympäristöominaisuudet mahdollistavat ketjun kykynsä säilyttää myös setuid
-viestin jälkeen etuoikeutetulle käyttäjälle, jota seuraa execve
, tarvitsematta luottaa tiedostojen ominaisuuksiin.
Vastaa
Ytimessä saattaa olla vika / ominaisuus. Keskustelua on ollut:
- https://bugzilla.altlinux.org/show_bug.cgi?id=16694
- http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-03/5224.html
En tiedä, jos jotain on ollut d yksi, korjata se.
Älä ymmärrä väärin – nykyinen käyttäytyminen on turvallista. Mutta se on niin turvallinen, että se estää asioita, joiden pitäisi näyttää toimivan.
Muokkaa: http://man7.org/linux/man-pages/man7/capabilities.7.html on uusi ominaisuusjoukko Ambient (Linux 4.3: n jälkeen). Näyttää siltä, että tämä sallii tarvittavan.
vastaus
Lekensteynin vastauksen pienellä muutoksella saadaan lyhyempi kutsu uusimmille ytimille:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw -- \ -c "./ping -c1 localhost"
Huomaa: sudoers-tiedostostasi riippuen tämä voi aiheuttaa sotkua ympäristöstäsi (esim. HOMEn vaihtaminen). capsh muuttaa uid-tiedostoa, mutta se ei tee mitään sudon ympäristömuutosten palauttamiseksi.
Joten mitä täällä tapahtuu? Katsotaanpa:
-
sudo /usr/sbin/capsh
: Aloitamme juurena, jolla on kaikki kyvyt tehokkaissa (voi tehdä) ja sallituissa (voi lisätä tämän tehokkaisiin) sarjoihin, mutta ei muissa sarjoissa . Katamme nämä muut sarjat hetkessä. -
--keep=1
: Turvallisuussyistä (lue: perintö) kyvyt eivät yleensä peri root- > ei-root-ID-kytkimet. Tämä lippu ottaa käyttöön ominaisuuden, joka tunnetaan nimelläSECBIT_KEEP_CAPS
, mikä sallii tämän. Huomaa, että se tyhjennetään automaattisesti suorituksen yhteydessä , mikä on hyvä idea. -
--user=$USER
: Nyt kun emme menetä kaikkia kykyjämme UID-muutoksen yhteydessä, menetämme juuri.SECBIT_KEEP_CAPS
-palvelun ansiosta säilytämme juuren kaltaiset oikeudet, mikä antaa meille mahdollisuuden sekaantua kykyihimme. -
--inh=cap_net_raw
: Tämä lisää kohdekykymme perittävään joukkoon, koska et voi tehdä ominaisuudesta ambientia (katso seuraava kohta), jos se ei ole perittävä. -
--addamb=cap_net_raw
: Vaikka olemme pyytäneetSECBIT_KEEP_CAPS
, etuoikeutetun (ei setuid / setgid / setcap) binaaristaexecve
silti tyhjennä kykymme, mistä ei ole oikeuksia. Linux 4.3 lisäsi ympäröivän joukon, joka lisätään takaisin tehokkaisiin ja sallittuihin sarjoihin suoritettaessa etuoikeutettuja binaareja. Täydellinen! -
-- -c ...
: Kun kaikki on asetettu, suoritamme bashin näillä argumenteilla. Kykyjoukot tyhjennetään (koska bash on etuoikeutettu), ympäröivä joukko lisätään takaisin ja voila! Meillä on tarvittava lupa tehdä avoin raaka pistorasiat.
Voit tarkistaa tämän käyttämällä erityistä ==
argumentti capsh: lle, mikä saa sen suorittamaan itsensä muun komentorivin kanssa:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw == --print Current: = cap_net_raw+eip
Mikä tarkoittaa, että meillä on cap_net_raw nimellä tehokas (voi tehdä sen), periytyvä (voi siirtää sen lapsen prosesseihin) ja sallittu (saa saada sen). Eikä missään näistä ominaisuuksista.
Lisätietoja ominaisuuksista ja niiden toiminnasta on paras veto -ominaisuuksien (7) man-sivu . Erityisesti otsikko Transformation of capabilities during execve()
.
Kommentit
- Mitä tarkoitat sanalla Tämä on tehty aikaisin, koska se vaatii useita lisäominaisuuksia, jotka ’ voivat pudota vasta ’ valmistumisen jälkeen. ?Sinun tapauksessasi suoritat nimellä ” root ”, joten edes näin
--user
ei ollut ’ t muuttunut, sinulla ’ d on vielä tarvittavat ominaisuudet myöhemmin? - Kiitos huomautuksesta! Tämän komentorivin edellisessä versiossa nimenomaisesti hylättiin yksityisoikeudet, joten setuid oli tarpeen ennen sitä. Nyt kun yksityisyydet poistetaan implisiittisesti osana execiä, se ’ ei ole välttämätöntä.
capsh
-sivuston saaminen yhteistyö-ylläpitäjältä ei olisi antanut sinulle uusintacapsh
, Debian-paketti ei vieläkään tue ympäristön ominaisuudet. Ylävirtaan 2.27.capsh
ilman ambientia (kuten alun perin oli). Mitä kaipaan. Sillä on oltava käyttö.