Stack Canaries
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
StackGuard inaweka thamani maalum inayojulikana kama canary kabla ya EIP (Extended Instruction Pointer), haswa 0x000aff0d
(inawakilisha null, newline, EOF, carriage return) ili kulinda dhidi ya buffer overflows. Hata hivyo, kazi kama recv()
, memcpy()
, read()
, na bcopy()
bado zina hatari, na haipati EBP (Base Pointer).
StackShield inachukua njia ya kisasa zaidi kuliko StackGuard kwa kudumisha Global Return Stack, ambayo inahifadhi anwani zote za kurudi (EIPs). Mpangilio huu unahakikisha kwamba overflow yoyote haileti madhara, kwani inaruhusu kulinganisha kati ya anwani zilizohifadhiwa na anwani halisi za kurudi ili kugundua matukio ya overflow. Zaidi ya hayo, StackShield inaweza kuangalia anwani ya kurudi dhidi ya thamani ya mpaka ili kugundua ikiwa EIP inaelekeza nje ya nafasi ya data inayotarajiwa. Hata hivyo, ulinzi huu unaweza kupuuziliwa mbali kupitia mbinu kama Return-to-libc, ROP (Return-Oriented Programming), au ret2ret, ikionyesha kwamba StackShield pia haipati mabadiliko ya ndani.
-fstack-protector
:Mekanism hii inaweka canary kabla ya EBP, na kuandaa mabadiliko ya ndani ili kuweka buffers kwenye anwani za juu za kumbukumbu, kuzuia kuandika tena mabadiliko mengine. Pia inakopi kwa usalama hoja zilizopitishwa kwenye stack juu ya mabadiliko ya ndani na inatumia nakala hizi kama hoja. Hata hivyo, haipati arrays zenye vipengele chini ya 8 au buffers ndani ya muundo wa mtumiaji.
Canary ni nambari ya nasibu inayotokana na /dev/urandom
au thamani ya msingi ya 0xff0a0000
. Inahifadhiwa katika TLS (Thread Local Storage), ikiruhusu nafasi za kumbukumbu zinazoshirikiwa kati ya nyuzi kuwa na mabadiliko ya kimataifa au ya kudumu. Mabadiliko haya awali yanakopiwa kutoka kwa mchakato wa mzazi, na michakato ya watoto inaweza kubadilisha data zao bila kuathiri mzazi au ndugu. Hata hivyo, ikiwa fork()
inatumika bila kuunda canary mpya, michakato yote (mzazi na watoto) inashiriki canary ile ile, ikifanya iwe hatari. Katika usanifu i386, canary inahifadhiwa kwenye gs:0x14
, na kwenye x86_64, kwenye fs:0x28
.
Ulinzi huu wa ndani unatambua kazi zenye buffers zinazoweza kushambuliwa na kuingiza msimbo mwanzoni mwa kazi hizi ili kuweka canary, na mwishoni kuthibitisha uaminifu wake.
Wakati seva ya wavuti inatumia fork()
, inaruhusu shambulio la brute-force kutabiri byte ya canary moja kwa moja. Hata hivyo, kutumia execve()
baada ya fork()
inafuta nafasi ya kumbukumbu, ikiondoa shambulio hilo. vfork()
inaruhusu mchakato wa mtoto kutekeleza bila nakala hadi inajaribu kuandika, wakati huo nakala inaundwa, ikitoa njia tofauti ya kuunda michakato na kushughulikia kumbukumbu.
Katika binaries za x64
, cookie ya canary ni 0x8
byte qword. Bytes saba za kwanza ni za nasibu na byte ya mwisho ni null byte.
Katika binaries za x86
, cookie ya canary ni 0x4
byte dword. Bytes tatu za kwanza ni za nasibu na byte ya mwisho ni null byte.
Byte ya chini ya umuhimu ya canaries zote ni null byte kwa sababu itakuwa ya kwanza kwenye stack ikitoka kwenye anwani za chini na kwa hivyo kazi zinazosomea nyuzi zitasimama kabla ya kuisoma.
Kuvuja canary na kisha kuandika tena (kwa mfano, buffer overflow) kwa thamani yake mwenyewe.
Ikiwa canary imeforked katika michakato ya watoto inaweza kuwa inawezekana brute-force moja byte kwa wakati:
Ikiwa kuna kuvuja au udhaifu wa kusoma wa kiholela katika binary inaweza kuwa inawezekana kuvuja:
Kuandika tena viashiria vilivyohifadhiwa kwenye stack
Stack inayoweza kuathiriwa na overflow ya stack inaweza kuhifadhi anwani za nyuzi au kazi ambazo zinaweza kuandikwa tena ili kutumia udhaifu bila kuhitaji kufikia canary ya stack. Angalia:
Pointer RedirectingKubadilisha canary ya bwana na nyuzi zote
Overflow ya buffer katika kazi ya nyuzi iliyolindwa na canary inaweza kutumika kubadilisha canary ya bwana ya nyuzi. Kama matokeo, ulinzi ni wa bure kwa sababu ukaguzi unatumika na canaries mbili ambazo ni sawa (ingawa zimebadilishwa).
Zaidi ya hayo, overflow ya buffer katika kazi ya nyuzi iliyolindwa na canary inaweza kutumika kubadilisha canary ya bwana iliyohifadhiwa katika TLS. Hii ni kwa sababu, inaweza kuwa inawezekana kufikia nafasi ya kumbukumbu ambapo TLS inahifadhiwa (na kwa hivyo, canary) kupitia bof kwenye stack ya nyuzi. Kama matokeo, ulinzi ni wa bure kwa sababu ukaguzi unatumika na canaries mbili ambazo ni sawa (ingawa zimebadilishwa). Shambulio hili linafanywa katika andiko: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Angalia pia uwasilishaji wa https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 ambayo inasema kwamba kawaida TLS inahifadhiwa na mmap
na wakati stack ya thread inaundwa pia inaundwa na mmap
kulingana na hii, ambayo inaweza kuruhusu overflow kama ilivyoonyeshwa katika andiko la awali.
Badilisha kipengee cha GOT cha __stack_chk_fail
Ikiwa binary ina Partial RELRO, basi unaweza kutumia kuandika kiholela kubadilisha kipengee cha GOT cha __stack_chk_fail
kuwa kazi ya dummy ambayo haiwezi kuzuia programu ikiwa canary itabadilishwa.
Shambulio hili linafanywa katika andiko: https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)