hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ddexec.md
2024-02-11 02:07:06 +00:00

7 KiB

DDexec / AllesUitvoer

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Konteks

In Linux moet 'n program as 'n lêer bestaan om uitgevoer te word, dit moet op een of ander manier toeganklik wees deur die lêersisteemhiërargie (dit is net hoe execve() werk). Hierdie lêer kan op die skyf of in die RAM wees (tmpfs, memfd), maar jy het 'n lêerpad nodig. Dit maak dit baie maklik om te beheer wat op 'n Linux-stelsel uitgevoer word, dit maak dit maklik om bedreigings en aanvallers se gereedskap op te spoor of te voorkom dat hulle enigiets van hulle probeer uitvoer (bv. om onbevoorregte gebruikers nie toe te laat om uitvoerbare lêers oral te plaas nie).

Maar hierdie tegniek is hier om dit alles te verander. As jy nie die proses kan begin wat jy wil nie... dan kaap jy een wat al bestaan.

Hierdie tegniek stel jou in staat om algemene beskermingstegnieke soos slegs-lees, geen-uitvoer, lêernaam-witlysing, has-witlysing te omseil.

Afhanklikhede

Die finale skripsie is afhanklik van die volgende gereedskap om te werk, hulle moet toeganklik wees in die stelsel wat jy aanval (standaard sal jy almal oral vind):

dd
bash | zsh | ash (busybox)
head
tail
cut
grep
od
readlink
wc
tr
base64

Die tegniek

As jy arbitrêr die geheue van 'n proses kan wysig, kan jy dit oorneem. Dit kan gebruik word om 'n bestaande proses te kap en te vervang met 'n ander program. Ons kan dit bereik deur óf die ptrace() syscall te gebruik (wat vereis dat jy die vermoë het om syscalls uit te voer of om gdb beskikbaar te hê op die stelsel) óf, meer interessant, deur te skryf na /proc/$pid/mem.

Die lêer /proc/$pid/mem is 'n een-tot-een kartering van die hele adresruimte van 'n proses (bv. van 0x0000000000000000 tot 0x7ffffffffffff000 in x86-64). Dit beteken dat lees vanaf of skryf na hierdie lêer by 'n offset x dieselfde is as om te lees vanaf of die inhoud by die virtuele adres x te wysig.

Nou, ons het vier basiese probleme om te hanteer:

  • In die algemeen mag slegs die root en die program-eienaar van die lêer dit wysig.
  • ASLR.
  • As ons probeer lees of skryf na 'n adres wat nie in die adresruimte van die program gekaart is nie, sal ons 'n I/O-fout kry.

Hierdie probleme het oplossings wat, alhoewel hulle nie perfek is nie, goed is:

  • Die meeste skulduitvoerders maak die skepping van lêerbeskrywers moontlik wat dan deur kinderprosesse geërf sal word. Ons kan 'n fd skep wat na die mem-lêer van die skulduitvoerder wys met skryfregte... sodat kinderprosesse wat daardie fd gebruik, die geheue van die skulduitvoerder kan wysig.
  • ASLR is nie eers 'n probleem nie, ons kan die maps-lêer van die skulduitvoerder of enige ander van die procfs ondersoek om inligting oor die adresruimte van die proses te verkry.
  • Ons moet dus lseek() oor die lêer doen. Vanuit die skulduitvoerder kan dit nie gedoen word tensy ons die berugte dd gebruik nie.

In meer detail

Die stappe is relatief maklik en vereis geen spesifieke kundigheid om hulle te verstaan nie:

  • Ontleed die binêre lêer wat ons wil uitvoer en die laaier om uit te vind watter karterings hulle nodig het. Skep dan 'n "skulp"kode wat, in breë terme, dieselfde stappe sal uitvoer as wat die kernel doen by elke oproep na execve():
  • Skep genoemde karterings.
  • Lees die binêre lêers daarin.
  • Stel toestemmings op.
  • Inisialiseer uiteindelik die stapel met die argumente vir die program en plaas die bykomende vektor (wat deur die laaier benodig word).
  • Spring in die laaier en laat dit die res doen (laai biblioteke wat deur die program benodig word).
  • Kry die adres waarheen die proses sal terugkeer na die syscall wat dit uitvoer.
  • Skryf daardie plek, wat uitvoerbaar sal wees, oor met ons skulpkode (deur mem kan ons onskryfbare bladsye wysig).
  • Gee die program wat ons wil uitvoer aan die stdin van die proses (sal deur genoemde "skulp"kode read() word).
  • Op hierdie punt is dit aan die laaier om die nodige biblioteke vir ons program te laai en daarin te spring.

Kyk na die instrument in https://github.com/arget13/DDexec

EverythingExec

Daar is verskeie alternatiewe vir dd, waarvan een, tail, tans die verstekprogram is wat gebruik word om deur die mem-lêer te lseek() (wat die enigste doel was om dd te gebruik). Genoemde alternatiewe is:

tail
hexdump
cmp
xxd

Deur die veranderlike SEEKER te stel, kan jy die soeker wat gebruik word, verander, bv.:

SEEKER=cmp bash ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)

As jy 'n ander geldige soeker vind wat nie in die skripsie geïmplementeer is nie, kan jy dit steeds gebruik deur die SEEKER_ARGS veranderlike in te stel:

SEEKER=xxd SEEKER_ARGS='-s $offset' zsh ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)

Blok dit, EDRs.

Verwysings

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: