2010/07/05

[*] Scite Text Editor 1.76 PoC : Local BoF vulnerability ( 0 - Days )

Me revoila :P


Je sais que j'ai pas mal zappé ce blog depuis quelques mois , néanmoins j'espere pouvoir m'y remettre entre 2 CTF ..

Bref, osef d'ma vie , place a la présentation , certe rapide , mais néanmoins simpa (bien que trés trés incomplete ) du Buffer Overflow que j'ai eu l'occasion de
découvrir dans la version 1.76 de Scite text Editor .

L'environnement d'audit est un 2.6.31-22 , néanmoins , les essais effectués sur des versions antérieures donne d'autres résultats assez surprenant .
Cet article ne présentera qu'uniquement quelques dumps démontrant la vulnérabilité sans pour autant l'exploiter; l'exploitation aparaitra ici peu etre d'ici pas mal de temps , j'y reviendrait.


Place a quelques dumps issus de GNU gdb (GDB) 7.0

r `perl -e'print"A"x4096 . "\x90\x90\x90\x90"'`
Starting program: /usr/bin/scite `perl -e'print"A"x4096 . "\x90\x90\x90\x90"'`
[Thread debugging using libthread_db enabled]
*** buffer overflow detected ***: /usr/bin/scite terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0x9c7008]
/lib/tls/i686/cmov/libc.so.6[0x9c6040]

/lib/tls/i686/cmov/libc.so.6(__strcpy_chk+0x44)[0x9c53b4]

/usr/bin/scite[0x8082a71]
/usr/bin/scite[0x8083751]
/usr/bin/scite[0x805b59c]
/usr/bin/scite[0x8079382]
/usr/bin/scite[0x8070944]
/usr/bin/scite[0x805dc32]
/usr/bin/scite[0x805dd8a]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x8fcb56]
/usr/bin/scite[0x8052d41]
======= Memory map: ========
00110000-0012b000 r-xp 00000000 08:01 146 /lib/ld-2.10.1.so
0012b000-0012c000 r--p 0001a000 08:01 146 /lib/ld-2.10.1.so
0012c000-0012d000 rw-p 0001b000 08:01 146 /lib/ld-2.10.1.so
0012d000-0012e000 r-xp 00000000 00:00 0 [vdso]
0012e000-004e6000 r-xp 00000000 08:01 262811 /usr/lib/libgtk-x11-2.0.so.0.1800.3
004e6000-004e7000 ---p 003b8000 08:01 262811 /usr/lib/libgtk-x11-2.0.so.0.1800.3
004e7000-004eb000 r--p 003b8000 08:01 262811 /usr/lib/libgtk-x11-2.0.so.0.1800.3
004eb000-004ed000 rw-p 003bc000 08:01 262811 /usr/lib/libgtk-x11-2.0.so.0.1800.3
004ed000-004ef000 rw-p 00000000 00:00 0
004ef000-00581000 r-xp 00000000 08:01 262814 /usr/lib/libgdk-x11-2.0.so.0.1800.3
00581000-00583000 r--p 00092000 08:01 262814 /usr/lib/libgdk-x11-2.0.so.0.1800.3
00583000-00584000 rw-p 00094000 08:01 262814 /usr/lib/libgdk-x11-2.0.so.0.1800.3
00584000-0059f000 r-xp 00000000 08:01 263706 /usr/lib/libatk-1.0.so.0.2809.1
0059f000-005a0000 r--p 0001b000 08:01 263706 /usr/lib/libatk-1.0.so.0.2809.1
005a0000-005a1000 rw-p 0001c000 08:01 263706 /usr/lib/libatk-1.0.so.0.2809.1
005a1000-005b9000 r-xp 00000000 08:01 262816 /usr/lib/libgdk_pixbuf-2.0.so.0.1800.3
005b9000-005ba000 r--p 00017000 08:01 262816 /usr/lib/libgdk_pixbuf-2.0.so.0.1800.3
005ba000-005bb000 rw-p 00018000 08:01 262816 /usr/lib/libgdk_pixbuf-2.0.so.0.1800.3
005bb000-005c6000 r-xp 00000000 08:01 264322 /usr/lib/libpangocairo-1.0.so.0.2600.0
005c6000-005c7000 r--p 0000a000 08:01 264322 /usr/lib/libpangocairo-1.0.so.0.2600.0
005c7000-005c8000 rw-p 0000b000 08:01 264322 /usr/lib/libpangocairo-1.0.so.0.2600.0
005c8000-0060e000 r-xp 00000000 08:01 264320 /usr/lib/libpango-1.0.so.0.2600.0
0060e000-0060f000 r--p 00045000 08:01 264320 /usr/lib/libpango-1.0.so.0.2600.0
0060f000-00610000 rw-p 00046000 08:01 264320 /usr/lib/libpango-1.0.so.0.2600.0
00610000-00687000 r-xp 00000000 08:01 262362 /usr/lib/libcairo.so.2.10800.8
00687000-00689000 r--p 00076000 08:01 262362 /usr/lib/libcairo.so.2.10800.8
00689000-0068a000 rw-p 00078000 08:01 262362 /usr/lib/libcairo.so.2.10800.8
0068a000-006c6000 r-xp 00000000 08:01 263053 /usr/lib/libgobject-2.0.so.0.2200.3
006c6000-006c7000 r--p 0003b000 08:01 263053 /usr/lib/libgobject-2.0.so.0.2200.3
006c7000-006c8000 rw-p 0003c000 08:01 263053 /usr/lib/libgobject-2.0.so.0.2200.3
006c8000-006cb000 r-xp 00000000 08:01 263054 /usr/lib/libgmodule-2.0.so.0.2200.3
006cb000-006cc000 r--p 00002000 08:01 263054 /usr/lib/libgmodule-2.0.so.0.2200.3
006cc000-006cd000 rw-p 00003000 08:01 263054 /usr/lib/libgmodule-2.0.so.0.2200.3
006cd000-006cf000 r-xp 00000000 08:01 268014 /lib/tls/i686/cmov/libdl-2.10.1.so
006cf000-006d0000 r--p 00001000 08:01 268014 /lib/tls/i686/cmov/libdl-2.10.1.so
006d0000-006d1000 rw-p 00002000 08:01 268014 /lib/tls/i686/cmov/libdl-2.10.1.so
006d1000-006d5000 r-xp 00000000 08:01 263055 /usr/lib/libgthread-2.0.so.0.2200.3
006d5000-006d6000 r--p 00003000 08:01 263055 /usr/lib/libgthread-2.0.so.0.2200.3
006d6000-006d7000 rw-p 00004000 08:01 263055 /usr/lib/libgthread-2.0.so.0.2200.3
006d7000-006de000 r-xp 00000000 08:01 268027 /lib/tls/i686/cmov/librt-2.10.1.so
006de000-006df000 r--p 00006000 08:01 268027 /lib/tls/i686/cmov/librt-2.10.1.so
006df000-006e0000 rw-p 00007000 08:01 268027 /lib/tls/i686/cmov/librt-2.10.1.so
006e0000-00795000 r-xp 00000000 08:01 972 /lib/libglib-2.0.so.0.2200.3
00795000-00796000 r--p 000b4000 08:01 972 /lib/libglib-2.0.so.0.2200.3
00796000-00797000 rw-p 000b5000 08:01 972 /lib/libglib-2.0.so.0.2200.3
00797000-0087d000 r-xp 00000000 08:01 262987 /usr/lib/libstdc++.so.6.0.13
0087d000-00881000 r--p 000e6000 08:01 262987 /usr/lib/libstdc++.so.6.0.13
00881000-00882000 rw-p 000ea000 08:01 262987 /usr/lib/libstdc++.so.6.0.13
00882000-00889000 rw-p 00000000 00:00 0
00889000-008ad000 r-xp 00000000 08:01 268015 /lib/tls/i686/cmov/libm-2.10.1.so
008ad000-008ae000 r--p 00023000 08:01 268015 /lib/tls/i686/cmov/libm-2.10.1.so
008ae000-008af000 rw-p 00024000 08:01 268015 /lib/tls/i686/cmov/libm-2.10.1.so
008af000-008cb000 r-xp 00000000 08:01 546 /lib/libgcc_s.so.1
008cb000-008cc000 r--p 0001b000 08:01 546 /lib/libgcc_s.so.1
008cc000-008cd000 rw-p 0001c000 08:01 546 /lib/libgcc_s.so.1
008cd000-008e2000 r-xp 00000000 08:01 268025 /lib/tls/i686/cmov/libpthread-2.10.1.so
008e2000-008e3000 r--p 00014000 08:01 268025 /lib/tls/i686/cmov/libpthread-2.10.1.so
008e3000-008e4000 rw-p 00015000 08:01 268025 /lib/tls/i686/cmov/libpthread-2.10.1.so
008e4000-008e6000 rw-p 00000000 00:00 0
008e6000-00a24000 r-xp 00000000 08:01 265728 /lib/tls/i686/cmov/libc-2.10.1.so
00a24000-00a25000 ---p 0013e000 08:01 265728 /lib/tls/i686/cmov/libc-2.10.1.so
00a25000-00a27000 r--p 0013e000 08:01 265728 /lib/tls/i686/cmov/libc-2.10.1.so
00a27000-00a28000 rw-p 00140000 08:01 265728 /lib/tls/i686/cmov/libc-2.10.1.so
00a28000-00a2b000 rw-p 00000000 00:00 0
00a2b000-00b55000 r-xp 00000000 08:01 263622 /usr/lib/libX11.so.6.2.0
00b55000-00b56000 ---p 0012a000 08:01 263622 /usr/lib/libX11.so.6.2.0
00b56000-00b57000 r--p 0012a000 08:01 263622 /usr/lib/libX11.so.6.2.0
00b57000-00b59000 rw-p 0012b000 08:01 263622 /usr/lib/libX11.so.6.2.0
00b59000-00b5a000 rw-p 00000000 00:00 0
00b5a000-00b5c000 r-xp 00000000 08:01 263633 /usr/lib/libXcomposite.so.1.0.0
00b5c000-00b5d000 r--p 00001000 08:01 263633 /usr/lib/libXcomposite.so.1.0.0
00b5d000-00b5e000 rw-p 00002000 08:01 263633 /usr/lib/libXcomposite.so.1.0.0
00b5e000-00b60000 r-xp 00000000 08:01 263637 /usr/lib/libXdamage.so.1.1.0
00b60000-00b61000 rw-p 00001000 08:01 263637 /usr/lib/libXdamage.so.1.1.0
00b61000-00b65000 r-xp 00000000 08:01 263643 /usr/lib/libXfixes.so.3.1.0
00b65000-00b66000 r--p 00003000 08:01 263643 /usr/lib/libXfixes.so.3.1.0
00b66000-00b67000 rw-p 00004000 08:01 263643 /usr/lib/libXfixes.so.3.1.0
00b67000-00bfa000 r-xp 00000000 08:01 263056 /usr/lib/libgio-2.0.so.0.2200.3
00bfa000-00bfb000 r--p 00092000 08:01 263056 /usr/lib/libgio-2.0.so.0.2200.3
00bfb000-00bfc000 rw-p 00093000 08:01 263056 /usr/lib/libgio-2.0.so.0.2200.3
00bfc000-00bfd000 rw-p 00000000 00:00 0
00bfd000-00c24000 r-xp 00000000 08:01 264324 /usr/lib/libpangoft2-1.0.so.0.2600.0
Program received signal SIGABRT, Aborted.
0x0012d422 in __kernel_vsyscall ()

Screen


0x0012d000 // VDSO , ça peut etre utile dans le cas de certaines exploitation



(gdb) x/79s $eip
0x12d422 <>:
0x12d424: ".shstrtab"
0x12d42e: ".hash"
0x12d434: ".dynsym"
0x12d43c: ".dynstr"
0x12d444: ".gnu.version"
0x12d451: ".gnu.version_d"
0x12d460: ".note"
0x12d466: ".eh_frame_hdr"
0x12d474: ".eh_frame"
0x12d47e: ".dynamic"
0x12d487: ".data"
0x12d48d: ".text"
0x12d493: ""


Comme on peux le constater , le programme est stoppé brutalement suite a un débordement de tampon ,
essayons donc d'y voir plus clair :

(gdb) i stack
#0 0x0012d422 in __kernel_vsyscall ()
#1 0x009104d1 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2 0x00913932 in *__GI_abort () at abort.c:92
#3 0x00946fc5 in __libc_message (do_abort=2,
fmt=0xa0881d "*** %s ***: %s terminated\n")
at ../sysdeps/unix/sysv/linux/libc_fatal.c:189
#4 0x009c7008 in *__GI___fortify_fail (msg=0xa087c7 "buffer overflow detected")
at fortify_fail.c:32
#5 0x009c6040 in *__GI___chk_fail () at chk_fail.c:29
#6 0x009c536a in __strcat_chk (
dest=0xbfff4734 "/home/kmkz/0Days/Scite_1.76/", 'A' <_dl_fini>,
stack_end=0xbfffb51c) at libc-start.c:220
#14 0x08052d41 in ?? ()


(gdb) i auxv
32 AT_SYSINFO Special system info/entry points 0x12d420
33 AT_SYSINFO_EHDR System-supplied DSO's ELF header 0x12d000
16 AT_HWCAP Machine-dependent CPU capability hints 0xbfebf3ff
6 AT_PAGESZ System page size 4096
17 AT_CLKTCK Frequency of times() 100
3 AT_PHDR Program headers for program 0x8048034
4 AT_PHENT Size of program header entry 32
5 AT_PHNUM Number of program headers 9
7 AT_BASE Base address of interpreter 0x110000
8 AT_FLAGS Drapeaux 0x0
9 AT_ENTRY Entry point of program 0x8052d20
11 AT_UID Real user ID 1000
12 AT_EUID Effective user ID 1000
13 AT_GID Real group ID 1000
14 AT_EGID Effective group ID 1000
23 AT_SECURE Boolean, was exec setuid-like? 0

25 AT_RANDOM Address of 16 random bytes 0xbfffb66b --> allons voir ce cet offset contient

31 AT_EXECFN File name of executable 0xbfffffed "/usr/bin/scite"
15 AT_PLATFORM String identifying platform 0xbfffb67b "i686"
0 AT_NULL End of vector 0x0


(gdb) x/48x 0xbfffb66b
0xbfffb66b: 0x8a29b215 0x563d86b0 0xe525c77b 0x1a1921ee
0xbfffb67b: 0x36383669 0x00000000 0x00000000 0x7273752f
0xbfffb68b: 0x6e69622f 0x6963732f 0x41006574 0x41414141
0xbfffb69b: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb6ab: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb6bb: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb6cb: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb6db: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb6eb: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb6fb: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb70b: 0x41414141 0x41414141 0x41414141 0x41414141
0xbfffb71b: 0x41414141 0x41414141 0x41414141 0x41414141
...

Nos "A"

...

0xbffff66b: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff67b: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff68b: 0x41414141 0x41414141 0x00414141 0x4942524f
0xbffff69b: 0x4f535f54 0x54454b43 0x3d524944 0x706d742f
0xbffff6ab: 0x62726f2f 0x6b2d7469 0x007a6b6d 0x5f485353
0xbffff6bb: 0x4e454741 0x49505f54 0x34313d44 0x47003033


#13 0x008fcb56 in __libc_start_main (main=0x805dca1, argc=2, ubp_av=0xbfffb524,
init=0x8106380, fini=0x8106370, rtld_fini=0x11dd20 <_dl_fini>,
stack_end=0xbfffb51c) at libc-start.c:220

Si on look a quelques offsets pret , on s'apperçois que nos \x41 se retrouve bien sur la stack (grace a stack_end et la ligne :

25 AT_RANDOM Address of 16 random bytes 0xbfffb66b ..... entre autre )


/* Début des \x41 a l'offset de fin de la stack +350 octets (soit 350 octets plus haut , la pile croit vers les adresses basses) */

On peux néanmoins déduire qu'il ne s'agit pas d'un cas classique de stack overflow ( et a priori EIP ne peut etre overwrité).
Une de mes "intuitions" me poussa donc a déposer un breakpoint sur l'offset correspondant au début de la section .dtors puis .ctors :

la .dtors ne donnant rien ...

breakpoint sur .ctors :

r
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /usr/bin/scite `perl -e'print"A"x4096'`
[Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault.
0x0810643b in ?? ()
crash a l'appel de la .ctors ??


J'avoue que je suis assez perplexe , et que l'exploitation ne sera pas des plus easy , mais d'autres pistes ont germés depuis ces dumps (ret into entre autre) ;-) et puis c'est tout l'intéret aprés tout .

J'espere que cette petite presentation de mon PoC concernant Scite 1.76 vous donnera envie de voir la suite (un jour peu etre qui sait ).

Link du PoC