[ --- The Bug! Magazine _____ _ ___ _ /__ \ |__ ___ / __\_ _ __ _ / \ / /\/ '_ \ / _ \ /__\// | | |/ _` |/ / / / | | | | __/ / \/ \ |_| | (_| /\_/ \/ |_| |_|\___| \_____/\__,_|\__, \/ |___/ [ M . A . G . A . Z . I . N . E ] [ Numero 0x04 <---> Revisao 0x01 <---> Artigo 0x01 ] .> 23 de Junho de 2009, .> The Bug! Magazine < staff [at] thebugmagazine [dot] org > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Using man for fuzzing to root +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ .> 19 de Junho de 2009, .> Rafael Silva < rafaelsilva [at] rfdslabs [dot] com [dot] br > [ --- Indice + 1. <---> Introducao + 2. <---> O que e' fuzzing? + 3. <---> Tecnicas de fuzzing + 4. <---> Nossa tecnica + 4.1. <-> A ideia + 4.2. <-> MacOSX: chfn 4 bytes heap overflow + 4.3. <-> Outros exemplos + 5. <---> Conclusao + 6. <---> Referencias [ --- 1. Introducao Este e' um mini-paper que apresenta um estudo de caso sobre fuzzing usando o man para pegar todos os argumentos de um binario e fuzzear. Durante minhas ana- lises encontrei vulnerabilidades como buffer overflows, heap overflows e memory leaks. Dentre elas, irei publicar uma heap overflow local no MacOSX encontrada usando esta "tecnica". [ --- 2. O que e' fuzzing? Fuzz ou Fuzzing e' uma tecnica para testar um software e descobrir vulnerabili- dades. Podemos encontrar buffer overflows classicos, heap overflows complexos, vulnerabilidades em protocolos etc. A ideia basica de fuzzing e' inserir dados aleatorios (AAAAAAA..., %c%d%e#4) em qualquer entrada de dados de um software. Caso esses dados maliciosos provoquem um crash no software, possivelmente en- contramos alguma vulnerabilidade. Podemos encontrar vulnerabilidades em binarios, protocolos, browsers, servicos de rede, aplicacoes web, network sockets, pipes, remote procedure calls (RPCs), driver IOCTLs, ActiveX e mais uma infinidade de coisas. [ --- 3. Tecnicas de fuzzing Existe diversos tipos de fuzzing e tecnicas. Segue a descricao das tecnicas mais comuns hoje em dia [1]. Quanto ao tipo de fuzzing, temos: "Dumb fuzzing": Corromper pacotes de dados aleatoriamente, sem possuir nenhum conhecimento sobre a estrutura interna dessas dados. "Smart fuzzing": Corromper pacotes de dados aproveitando-se de conhecimento da estrutura de dados, como codificacoes (por exemplo base-64) e relacoes internas dentre os dados (checksums, bits indicando a presenca de certos campos, campos indicando o offset ou o tamanho de outro campo). Ainda quanto ao tipo de fuzzing, temos: "Black-box fuzzing": Enviar pacotes mal-formados sem verificar quais caminhos sao percorridos ou nao no codigo. "White-box fuzzing": Enviar pacotes mal-formados verificando quais caminhos do codigo sao percorridos. Isso permite modificar a configuracao do software e os dados utilizados no fuzzing de forma a percorrer a maior quantidade possivel de caminhos no codigo a ser testado. Quanto `a forma de geracao dos dados, temos: "Geracao": Geracao de dados automaticamente, sem se basear em qualquer entrada anterior. "Mutacao": Corrupcao de dados sabidamente validos, utilizando certos padroes, para obter dados fuzzeados. [ --- 4. Nossa tecnica :) [ --- 4.1. A ideia A "tecnica" consiste em fuzzear qualquer argumento extraido do manual de um bi- nario. O codigo completo do script em python desenvolvido para realizar essa tarefa pode ser encontado ao final do artigo. O script le a manpage de cada programa-alvo, preservando a formatacao de negri- to, que e' usada como auxilio ao parser. Primeiramente, o script tenta usar a sintaxe da secao "SYNOPSIS" do manual como base para o fuzzing. Em seguida, op- coes encontradas ao longo de todo o manual, a partir da secao "DESCRIPTION", sao combinadas com strings fuzzeadas e passadas ao programa. Toda vez que o programa e' executado, e' imposto um timeout de 0.01s, com a fi- nalidade de evitar que o fuzzer trave. Em seguida o processo e' morto com SIGKILL, caso ainda nao tenha terminado. Por fim, detecta-se se o processo foi finalizado com SIGSEGV, reportando-se ao usuario em caso positivo. [ --- 4.1. MacOSX: chfn 4 bytes heap overflow Depois do arduo :) desenvolvimento do nosso fuzzer, chegou a hora da verdade. Testamos o fuzzer em varios sistemas: Ubuntu, Arch Linux, Debian, etc. Um dos bugs encontrados foi um heap overflow de 4 bytes no chfn ou chpass do MacOSX, que possui suid root: --- SHELL --- rfdslabs:code/fuzz rfds$ ls -la /usr/bin/chfn -r-sr-xr-x 3 root wheel 71008 Feb 13 04:00 /usr/bin/chfn rfdslabs:code/fuzz rfds$ rfds$ md5 /usr/bin/chfn MD5 (/usr/bin/chfn) = c5e4a40c41dc6cdd6f1ad796713d121b rfdslabs:code/fuzz rfds$ python manfuzzer.py /usr/bin/chfn -> /usr/bin/chfn ** SIGSEGV on ['/usr/bin/chfn', '-u', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA... rfdslabs:code/fuzz rfds$ gdb -q /usr/bin/chfn Reading symbols for shared libraries ..... done (gdb) run -u aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa... Starting program: /usr/bin/chfn -u aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.... Reading symbols for shared libraries ++++.. ............................. done Changing finger information for rfds. Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x86066990 0x934033f7 in CFArrayGetValueAtIndex () (gdb) i reg eax 0x86066990 -2046400112 ecx 0x86 134 edx 0x0 0 ebx 0x9340338a -1824509046 esp 0xbfffb760 0xbfffb760 ebp 0xbfffb778 0xbfffb778 esi 0x104d40 1068352 edi 0x390 912 eip 0x934033f7 0x934033f7 eflags 0x10246 66118 cs 0x17 23 ss 0x1f 31 ds 0x1f 31 es 0x1f 31 fs 0x0 0 gs 0x37 55 --- SHELL --- Enjoy, debug and root! [ --- 4.3. Outros exemplos O fuzzer causou falha de segmentacao em diversos outros binarios dos sistemas testados. Infelizmente, nenhum outro binario encontrado possuia suid root. As- sim, estes exemplos tem pouca utilidade para exploracao, porem servem para es- tudo de caso. Alguns exemplos sao encontrados a seguir. Arch Linux: ** SIGSEGV on ['jfs_fscklog', '-d', '-e', 1000*'%n', '-f', 1000*'%n', '-p', '-V'] ** SIGSEGV on ['mii-tool', '-v', 7900*'A', '--verbose', '-V', 7900*'A', '--version', '-R', 7900*'A', '--reset', '-r', 7900*'A', '--restart', '-w', 7900*'A', '--watch', '-l', 7900*'A', '--log', '-A', 7900*'A', '--advertise=', 7900*'A', '-F', 7900*'A', '--force=', 7900*'A', 7900*'A', 7900*'A'] ** SIGSEGV on ['/sbin/mkfs.jfs', '-j', 1000*'%n'] ** SIGSEGV on ['/sbin/reiserfstune', '-c', 7900*'A'] ** SIGSEGV on ['/usr/sbin/airbase-ng', '-q', 7900*'A'] ** SIGSEGV on ['/usr/sbin/ip6tables', '--proto='+7900*'A'] ** SIGSEGV on ['/usr/sbin/iptables', '-p', 7900*'1'] ** SIGSEGV on ['/usr/sbin/lecs', '-f', 7900*'A'] ** SIGSEGV on ['/usr/sbin/rpc.idmapd', '-p', 7900*'A'] ** SIGSEGV on ['/usr/sbin/rpc.idmapd', '-S', 7900*'A'] ** SIGSEGV on ['xfs_io', '-adFfmrRstx', '-c', 7900*'A, 7900*'A', '-p', 7900*'A', 7900*'A'] ** SIGSEGV on ['/usr/bin/dc1394_vloopback', '--width='+7900*'A'] ** SIGSEGV on ['/usr/bin/derb', '-v', 7900*'A'] ** SIGSEGV on ['/usr/bin/esdrec', '-s', 7900*'A'] ** SIGSEGV on ['/usr/bin/esdsample', '-s', 1000*'%n'] ... Ubuntu: ** SIGSEGV on ['/usr/bin/acpi_listen', '-s', 7900*'A'] ** SIGSEGV on ['/usr/bin/acpi_listen', 'acpid', 7900*'A', '--socketfile='+7900*'A'] ** SIGSEGV on ['/usr/bin/acpi_listen', 'acpid', 7900*'A', '-s', 7900*'A'] ** SIGSEGV on ['/usr/bin/alacarte', 'alacarte', 7900*'A'] ... MacOSX: ** SIGSEGV on ['mount_msdos', '-o', 7900*'A', '-u', 7900*'A'] ** SIGSEGV on ['mount_msdos', '-o', 7900*'1', '-u', 7900*'1'] ... [ --- 5. Conclusao Com uma tecnica simples e uma ferramenta igualmente simples, fomos capazes de encontrar uma falha local que potencialmente podera ser usada para obter root no MacOSX. Voce tambem pode encontrar a sua! Go fuzz and have fun. [ --- 6. Referencias [1] John Neystadt, Automated Penetration Testing with White-Box Fuzzing. http://msdn.microsoft.com/en-us/library/cc162782.aspx begin 644 fuzz.tar.gz M'XL(`.]&04H``^T8VW+32)9G?\694%E)CBQ+CDT@F:0J`<.Z!I(4#NSN&*.2 MY;:M0K>2VICX^)R/XB1R69K6:F,V@3'CS.4V MQHZJ'=<`1PRG)2CC.HI9J`X4A%!T4!J-&?-C98B4^#B:\],R:.^Z*^99DI3G M^S?/KM[PD7_F5CT)L30=3@Q M!R^$V)!,@/\H:#"^RQB"'@&ALF@-7ZCS-0:1\[O,P5<<.5;4+*TDS$`Z M:J+8[U;F8W7PWAYJZ)9$>6?A`V$TTK+/$R^&>8A\?2]DJ9%;TT?I!=#I*9B% M]3)K#(9BYB'T0LZ2&&=A%/ECB4UO*,!SQT\9P6#"<2960K:4PBF*Y(.OIGA; MSCR?X??/!>,&6`5?E(C(%A/9)$(.O`-K2&(JI*BR"5+B>G`JH8=;`!ZM'6Y, M,Y3]+DK$JR7BA(5CJ3%WIEL(95.L%[=I?[4B!&$IF7$3_ED!*&R^2K^[+&75 MMF$;UK"<+8,5QB5&EJK!)$I@11DI$8PT]CVN*N]"11O*C)HZ?,82VPLGD2J" M,,NH]#:,XM1+BUC:"*9YZDP9+6;!&,7L1HO"&B[*116(O^(N`'E@&CN!-\M["8APXFQKHVE['='](8=^_^XO+KN]_J? M-^(7ABHY-V%3)D(+J]S[ACHX;_SJ-#Z:C2?#@ZS4(>?J_"=L%60EDSF).U,% M91TVM:SH%WS:5NN8#XQI$LUCU;K#0S2RV,VMJS24@]4VXVV=4;GW^@F\XV37 MTPVUMY=^A.9;BJ`FA1&^0"6271UD[BH\9S>&=4T$CPY_@AY5%;(RE^4@L4FY MFC*N9G@:PHG:)@!L'MG4;]N3@$N43`7QCF*+)V[AL>^X3%4&BJXH6O$]K'S_ M+KZW]EI9](+2_DK6=HE.RP;H)HX8#(`[T1(P30=D*F$JX,DKD; MOZ57,R]O^!4[MJF>KV0:2-*TN$NQ` M.94*?=XX.0*4$*J*L15S;=QA;#^:JD5OBV^H!_[FNWJ^BT,6ACN;7]GV\K$7 M[NQTO\&10'2_7F@L$X\ST5/4.^;FDD#+&V,\WQBISUBLFH9IR^]^*7W\J66M\.QL7108=$.-PJ8?O?%V]+1(IU2[M7KD"U!1,<) M%`L/`9B]B3#I&CQ.O)"KB%1,38#\A+93T`$&MDL4BHY2`LATW<1::RD/:I'- MDUN5HC=KI/A\,J&]557.E?K1$]-$JM;Z;1_-9IGRU=U/]\?[$Z7>R@U)`2L( M4+Q*2H7&R.=X,VB0:U&H1#KJ$JM4_-G*93$_AMC)SY:!XZU/E?*`5CYMKN6@ M3!)BW&)E3J:+@74\/*[84VFZ$A!(JPCV'YEE6;I\1DVCH`VFP4-MS9!$ODM[YCNOO^ MSSQL=[;N_QYU'MW?__V(T:S7H`X#J(0`#.'ZZBD\O7K6_0GJ]3>7SWN7O?Y? MN\_J`G[&>7S<;"Z72R-'-##'C5%"J]U5[$<>E^TFDH,9"$\3>&)2+D2>2#`VT8W7(&8F/3818MV8*J`\/:P+"S#G!ZC%5# M`'CAM,!P4M?S8.'X>,W-U--&(`\([L#Q[(UP^.I2S(FG@."!2TZ/JJ88K$F]"FF MXEJQ2+936,81>)`O(H8:D4B07BAJ!07*#ED-CO)1Z:-Q60J'TD*`K32WV6 M3%DPF$:H&1=K021WC#J)XWL?6)DV&ZLQ3QR-NER>C'1BA$ZC.2$&3<+,08IH MG9'8UHBF.W,2W`FI-.->%TV(.AU%H(&/HXF0"Z7UF4.BHFWE5H'">\2!BC;W+E,89$$.$1 M('4_8`,3.C$3"D6T<]$M:;U9JSWT0M>?CQG\3+UF9,S.-J=\;U2=2X@?SM4> M8MM#%R3=M[V7_=ZO76AA,[:>O7[=?7OU_'F_>P.M3OMQK5;S(W1C;G=5?*%Q MM=IOU:M9<@B$)S'=G4:8D)MG" M\T?8MPUR"86BV3P`UCQ.V*,6^RIR5 M5BA.*'C(:M]!K6W)/T$M9"L.H#*W=,_3;)JK)^W)XZ-VBX(EP-IB3S`H;;I> ML!,,R`6SD=J!U7E\=BQ4BQ;TV$A)YE M](X!3S=YXN0%2.W&LH,FMN).14I^_'_;@?]^-^W(_[<3^^U?@/H4:=@P`H "``"\ ` end