Semana passada precisei reproduzir o comportamento da
ferramenta PsExec em um projeto, o que me fez sentir alguma nostalgia dos tempos em que eu fazia engenharia reversa todo dia. Este breve relato (espero) reproduz os passos que segui para descobrir o que esse programa to til quanto perigoso faz. Dados conhecidos Sabe-se que o PsExec consegue executar um programa remotamente, ou seja, de uma mquina para outra, outra essa que chamaremos de mquina-alvo. O programa a ser executado geralmente deve estar disponvel na prpria mquina-alvo (condio ideal). Alm da simples execuo, para aplicativos console ele permite ainda a interao como se estivssemos executando o programa remoto em nossa prpria mquina local. Ele consegue isso redirecionando sua entrada e sada, o que o torna, como nos descreve o prprio autor, um "telnet light": psexec \\maquina-alvo [-u admin-na-maquina-alvo] cmd.exe Alm desse comportamento j muito til ainda existe um bnus que se trata de especificar um executvel local que ser copiado remotamente para a mquina-alvo e executado. Esse o comportamento que espero imitar: psexec \\maquina-alvo [-c c:\tests\myprogram.exe] [-u admin-na-maquina-alvo] PsExec v1.72 - Execute processes remotely Copyright (C) 2001-2006 Mark Russinovich Sysinternals - www.sysinternals.com Microsoft Windows XP [verso 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. No teste acima o myprogram.exe somente o cmd.exe renomeado. Um teste bsico =) BLOGROLL Search Website Minhas leituras How I Failed, Failed, and Finally Succeeded at Learning... from Hacker News yEd Um belo editor de diagrama (valeu Jomar) from Inteligncia Coletiva: How I Learned to Live Google-free from Hacker News Google Maps vai rastrear nibus from EXAME.com - Home Software optimization resources. C++ and assembly.... from www.agner.org "Dar uma lidinha depois." Why is JSON so popular? Developers want out of the... from Hacker News We'll build *any* 1Bit Cisnes DQSoft DriverEntry O Pr-Crtico Thiago Adams Twitter Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 1 de 11 19/09/2011 19:47 Primeiro passo: reproduzir o comportamento analisado e coletar pistas J fizemos isso logo acima. Se trata apenas de observar o programa funcionando. Ao mesmo tempo em que entendemos seu modus operandi coletamos pistas sobre suas entranhas. No caso do PsExec, que faz coisas alm-mar, como redirecionar os pipes de entrada/sada de um programa console, iremos checar a existncia de algum servio novo na mquina-alvo e arquivos novos que foram copiados, alm de opcionalmente dar uma olhada no registro. Ferramentas da prpria SysInternals como Process Explorer e Process Monitor tambm so teis nessa anlise inicial. Como podemos ver, um servio com o nome de PsExec foi criado na mquina-alvo. Se procurarmos saber o caminho do arquivo que corresponde a esse servio, tanto pelo Process Explorer ou o Service Manager, descobriremos que se trata de um arquivo no diretrio do windows chamado psexecsvc.exe. webapp in 7 days from Hacker News OTCC: 445-line C compiler written in C from Hacker News As pessoas esto perdendo interesse em programar? from HypeScience The Art of Assembly Language Programming from Hacker News View all Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 2 de 11 19/09/2011 19:47 Se o arquivo existe nessa pasta, ento bvio que algum o copiou. Resta saber como. Segundo passo: acompanhar o processo lentamente Nessa segunda fase, podemos refazer o comportamento esperado inmeras vezes, coletando dados e pensando a partir dos dados obtidos. Para esse caso, como quase todos que analiso, vou usar o nosso amigo WinDbg. Para isso, como tenho sempre minhas ferramentas disponveis no ambiente onde trabalho, basta digitar "windbg" antes do comando anterior e dar uma olhada em algumas APIs-chave, como a criao/abertura de arquivos e a criao de servios. Note que importante fazer isso em um escopo limitado para no perdermos horas de anlise. Descobrir coisas como, por exemplo, que as aes do PsExec s comeam a ser executadas aps a digitao da senha do usurio, pode ajudar, pois da s comeo minha anlise a partir desse ponto. windbg psexec \\maquina-alvo -u admin cmd.exe PsExec v1.72 - Execute processes remotely Copyright (C) 2001-2006 Mark Russinovich Sysinternals - www.sysinternals.com Password: ntdll!DbgBreakPoint: 7c90120e cc int 3 0:001> bp kernel32!CreateFileW 0:001> bp advapi32!CreateServiceW 0:001> g Connecting to maquina-alvo... Breakpoint 0 hit eax=40150000 ebx=0011ee90 ecx=00000000 edx=00005078 esi=7c80932e edi=0011eeb0 eip=7c8107f0 esp=0011ee70 ebp=0011eed0 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206 kernel32!CreateFileW: 7c8107f0 8bff mov edi,edi 0:000> du poi(@esp+4) 0011ee90 "\\.\PIPE\wkssvc" 0:000> k 50 // pilha muito grande! ChildEBP RetAddr 0011ee6c 77dc4b92 kernel32!CreateFileW 0011eed0 77dc4369 RPCRT4!NMP_Open+0x17a 0011ef1c 77dc48d3 RPCRT4!OSF_CCONNECTION::TransOpen+0x5e 0011ef70 77dc4a5d RPCRT4!OSF_CCONNECTION::OpenConnectionAndBind+0xbc 0011efb4 77dc49ac RPCRT4!OSF_CCALL::BindToServer+0x104 0011f018 77dbfdbc RPCRT4!OSF_BINDING_HANDLE::AllocateCCall+0x2b6 0011f048 77db8a01 RPCRT4!OSF_BINDING_HANDLE::NegotiateTransferSyntax+0x28 0011f060 77db8a38 RPCRT4!I_RpcGetBufferWithObject+0x5b 0011f070 77db906d RPCRT4!I_RpcGetBuffer+0xf 0011f080 77e3460b RPCRT4!NdrGetBuffer+0x28 0011f460 5bcb9d7c RPCRT4!NdrClientCall2+0x195 Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 3 de 11 19/09/2011 19:47 0011f474 5bcb9d1e NETAPI32!NetrWkstaGetInfo+0x1b 0011f4bc 71c78cc2 NETAPI32!NetWkstaGetInfo+0x38 0011f4e0 71c78a75 NETUI1!WKSTA_10::I_GetInfo+0x21 0011f4e8 71be1843 NETUI1!NEW_LM_OBJ::GetInfo+0x1c 0011fadc 71be31aa ntlanman!CheckLMService+0x3d 00120464 71be3058 ntlanman!AddConnection3Help+0x3e 0012118c 71be2e29 ntlanman!AddConnectionWorker+0x37c 001211b0 71ae461a ntlanman!NPAddConnection3+0x1f 001211d8 71ae45ac MPR!CUseConnection::TestProviderWorker+0x47 00121aa8 71ae2445 MPR!CUseConnection::TestProvider+0x62 00121b08 71ae431d MPR!CRoutedOperation::GetResult+0x10f 00121da4 71ae2348 MPR!CUseConnection::GetResult+0x180 00121ddc 71ae22fd MPR!CMprOperation::Perform+0x4d 00121de8 71ae4505 MPR!CRoutedOperation::Perform+0x22 00121e98 71ae50f0 MPR!WNetUseConnectionW+0x58 *** WARNING: Unable to verify checksum for image00400000 *** ERROR: Module load completed but symbols could not be loaded for image00400000 00121ec0 00401796 MPR!WNetAddConnection2W+0x1c WARNING: Stack unwind information not available. Following frames may be wrong. 001225d0 0032002e image00400000+0x1796 001225d4 0030002e 0x32002e 001225d8 0034002e 0x30002e 001225dc 00000000 0x34002e Uma rpida busca no Google nos informa que o pipe querendo ser aberto pertence lista de pipes que esto sempre disponveis nas mquinas para responder s requisies do sistema. So importantes para a comunicao entre processos (IRP, Inter Process Communication). No entanto, quem usa esse pipe o sistema, e ele foi chamado, como pudemos ver, pela funo WNetAddConnection2W. Se analisarmos mais a fundo a pilha de chamadas conseguiremos dar um olhada nos parmetros passados. Para isso existe a opo de mostrar os argumentos passados para as funes ao exibir a pilha: 0:000> kv 50 ChildEBP RetAddr Args to Child 0011ee6c 77dc4b92 0011ee90 c0000000 00000003 kernel32!CreateFileW (FPO: 0011eed0 77dc4369 00147140 001463f8 005b4b46 RPCRT4!NMP_Open+0x17a (FPO: ... 00121e98 71ae50f0 00000000 00121ee4 004182a0 MPR!WNetUseConnectionW+0x58 (FPO: [Non-Fpo]) *** WARNING: Unable to verify checksum for image00400000 *** ERROR: Module load completed but symbols could not be loaded for image00400000 00121ec0 00401796 00121ee4 004182a0 004139e0 MPR!WNetAddConnection2W+0x1c (FPO: [Non-Fpo]) WARNING: Stack unwind information not available. Following frames may be wrong. 001225d0 0032002e 0030002e 0034002e 00000030 image00400000+0x1796 001225d4 0030002e 0034002e 00000030 00000000 0x32002e Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 4 de 11 19/09/2011 19:47 001225d8 0034002e 00000030 00000000 00000000 0x30002e 001225dc 00000000 00000000 00000000 00000000 0x34002e 0:000> db 00121ee4 00121ee4 00 00 00 00 00 00 00 00-00 00 00 00 03 00 00 00 ................ 00121ef4 e2 1e 12 00 04 1f 12 00-00 00 00 00 00 00 00 00 ................ 00121f04 5c 00 5c 00 31 00 30 00-2e 00 32 00 2e 00 30 00 \.\.1.0...2...0. 00121f14 2e 00 34 00 30 00 5c 00-49 00 50 00 43 00 24 00 ..4.0.\.I.P.C.$. 00121f24 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 00121f34 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 00121f44 cc da 90 7c c8 2d 91 7c-ec 07 00 00 88 1f 12 00 ...|.-.|........ 00121f54 88 1f 12 00 00 00 00 00-f2 20 12 00 e0 24 12 00 ......... ...$.. Ele tenta abrir uma conexo com a mquina-alvo em seu compartilhamento de IPC, que como j vimos serve para comunicao entre processos, at entre mquinas distintas. Dessa forma, descobrimos um dos pontos importantes no funcionamento do PsExec: ele usa o nome e senha fornecidos para abrir uma comunicao remota no compartilhamento IPC$. Depois sugem vrias paradas ao CreateFile, de maneira que a melhor forma de acompanhar isso colocando um "dumpezinho" de memria na sua parada: 0:000> bp kernel32!CreateFileW "du poi(@esp+4)" breakpoint 0 redefined 0:000> g 0011ee90 "\\.\PIPE\wkssvc" eax=40150000 ebx=0011ee90 ecx=00000000 edx=00005d6e esi=7c80932e edi=0011eeb0 eip=7c8107f0 esp=0011ee70 ebp=0011eed0 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206 kernel32!CreateFileW: 7c8107f0 8bff mov edi,edi 0:000> g 0011f474 "\\.\PIPE\wkssvc" eax=40160000 ebx=0011f474 ecx=00000000 edx=00005d77 esi=7c80932e edi=0011f494 eip=7c8107f0 esp=0011f454 ebp=0011f4b4 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206 kernel32!CreateFileW: 7c8107f0 8bff mov edi,edi 0:000> g 0011f210 "\\.\PIPE\wkssvc" eax=40160000 ebx=0011f210 ecx=00000000 edx=00005d7a esi=7c80932e edi=0011f230 eip=7c8107f0 esp=0011f1f0 ebp=0011f250 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206 kernel32!CreateFileW: 7c8107f0 8bff mov edi,edi 0:000> g 0012213c "\\10.2.0.40\ADMIN$\PSEXESVC.EXE" eax=00122090 ebx=00000003 ecx=00000000 Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 5 de 11 19/09/2011 19:47 edx=009300d0 esi=00000080 edi=ffffffff eip=7c8107f0 esp=00122064 ebp=001220ac iopl=0 nv up ei pl nz ac po cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000213 kernel32!CreateFileW: 7c8107f0 8bff mov edi,edi Muito bem! Chegamos a mais um ponto importante de nossa anlise: o psexecsvc.exe copiado atravs do compartilhamento ADMIN$ remotamente (diretrio c:\windows). Esse compartilhamento se torna acessvel, uma vez que uma conexo autenticada j foi aberta. Se listarmos as conexes existentes, veremos o compartilhamento IPC$ aberto: >net use Novas conexes sero lembradas. Status Local Remoto Rede --------------------------------------------------------------------- OK \\10.2.0.40\IPC$ Rede Microsoft Windows Comando concludo com xito. > Tambm podemos notar que, enquanto estamos parados depurando o processo psexec.exe, temos acesso ao compartilhamento admin$: A anlise desses fatos demonstra como importante fazer as coisas, pelo menos na fase "iniciante", bem lentamente, e entender a mudana de estado durante o processo. Nem sempre isso possvel, verdade, ainda mais quando estamos falando de anlise de kernel. Mas, quando as condies permitem, vale a pena pensar antes de fazer. Voltando analise: temos direitos remotos nessa mquina. Dessa forma, fica fcil criar um servio remotamente, que o que faz o nosso amigo PsExec: 0:000> g Breakpoint 1 hit eax=00410870 ebx=00410870 ecx=00147a68 edx=00410844 esi=00410844 edi=00147a68 eip=77fb7381 esp=001224e4 ebp=001228dc iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ADVAPI32!CreateServiceW: Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 6 de 11 19/09/2011 19:47 77fb7381 6a20 push 20h 0:000> du poi(@esp+8) 00410870 "PSEXESVC" 0:000> du poi(@esp+8*4) 001228dc "%SystemRoot%\PSEXESVC.EXE" Pronto. Isso era tudo que precisava para conseguir reproduzir seu comportamento. Agora posso fazer isso programando ou at manualmente: C:\Tests>net use \\10.2.0.40\ipc$ /user:admin A senha ou o nome de usurio invlido para \\10.2.0.40\ipc$. Digite a senha para que 'admin' se conecte a '10.2.0.40': Comando concludo com xito. C:\Tests>net use Novas conexes sero lembradas. Status Local Remoto Rede --------------------------------------------------------------------- OK \\10.2.0.40\ipc$ Rede Microsoft Windows Comando concludo com xito. C:\Tests>copy myprogram.exe \\10.2.0.40\admin$ 1 arquivo(s) copiado(s). C:\Tests>sc \\10.2.0.40 create MyProgram binPath= %systemroot%\myprogram.exe [SC] CreateService SUCCESS O resto do comportamento, como o redirecionamento de entrada e sada e execuo do processo na conta especificada, embora muito interessante, no me interessa de imediato. Quem sabe interesse a voc, e no tenhamos uma continuao dessa anlise em um outro blogue de "desmontagem" por a =) 3 This entry was posted by Wanderley Caloni on 2008-10-29 at 8:33 am, and is filed under Engenharia Reversa. Follow any responses to this post through RSS 2.0.You can leave a response or trackback from your own site. Pings (1) Related Posts #1 written by victor 2 YEARS AGO Comments (14) Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 7 de 11 19/09/2011 19:47 Quando eu tento dar o comando Psexec d acesso negado... eu tento colocar o -u Administrador e no vai eu tento colocar o -u Administradores\Administrador e no vai... no sei mais o que fazer... se puder mande a resposta pro meu email ;d #2 written by Wanderley Caloni 2 YEARS AGO Ol, Victor. No fui eu que desenvolvi esse programa. Recomendo que d uma pesquisada na internet para ver se outras pessoas j tiveram o mesmo problema que voc. S observo que o formato grupos\usurio no existe; tente domnio\usurio, ou mquina\usurio. []s #3 written by Allan 2 YEARS AGO Ol Wanderley! Toda vez que tento executar o psexec, diz que todos os pipes esto ocupados. Ser a sintaxe? O que devo fazer? Obrigado. #4 written by Wanderley Caloni 2 YEARS AGO Ol. Primeiro, tente usar a verso mais nova do aplicativo. D uma boa olhada no help para ver se est faltando alguma coisa. Segundo, d uma olhada na sada do comando "net use" e veja se existe alguma coisa fora do comum. Terceiro, procure na web por pessoas que tiveram o mesmo problema que voc. Quarto, envie mais informaes de suas pesquisas e talvez eu consiga reproduzir esse problema aqui. Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 8 de 11 19/09/2011 19:47 []s #5 written by Allan 2 YEARS AGO Wanderley, Se puder me ajudar nessa dvida cruel... Aps a ltima mensagem que lhe enviei, no executei mais o programa, ontem, portanto, voltei a us-lo e funcionou perfeitamente... J esta manh voltou o problema. Quando tento executar o psexec com um simples ou qualquer outro processo em uma maquina ele me retorna o sequinte: Comando: c:\psexec \\192.168.1.250 calc PsExec v1.94 - Execute processes remotely Copyright 2001-2008 Mark Russinovich Sysinternals - http://www.sysinternals.com Error establishing communication with PsExec servive on 192.168.1.250 Todos os pipes estao ocupados O que no entendo que na maquina remota aparece o servio mas no executa o programa, ontem funcionou e no me lembro se fiz alguma coisa para que funcionasse... E isso est me matando camarada! risos) Abraos!! #6 written by Wanderley Caloni 2 YEARS AGO Ol, Allan. Recomendo que use o Process Monitor para verificar em qual momento o aplicativo tenta usar pipes, tanto no cliente como no servidor. Provavelmente encontrar alguns erros no log. []s #7 written by Danilo 1 YEAR AGO O Metasploit tem um exploit que permite utilizar o "psexec" usando somente o hash de um usurio... http://www.offensive-security.com/metasploit- Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 9 de 11 19/09/2011 19:47 unleashed/PSExec-Pass-the-Hash #8 written by Fernando Rossi 1 YEAR AGO Ola Wanderley, Estou com o mesmo problema reportado pelo Alan, no consegui localizar outros sites e foruns que falem desse erro especifico, sempre utilizo a ultima verso lanada e sinceramente no sei mais o que fazer, tem alguma idia de como resolver esse problema? Obrigado. #9 written by Wanderley Caloni 1 YEAR AGO Ol, Fernando. Voc j tentou usar o Process Monitor em ambos os lados e ver se existe algum momento que o uso do pipe falha? []s #10 written by Marcelo Becker 11 MONTHS AGO Estou com um problema com o psexec. Tenho um programa em java que executado pelo psexec. ao imprimir no aparece as impressoras de rede da mquina remota, somente as locais. Preciso que ele execute como o usurio logado na maquina. H uma forma de fazer isto? Alguem sabe? Tem como fazser com que ele execute como qualquer usuario mas precisa da senha. Desde ja agradeo a ateno de todos #11 written by Wanderley Caloni 11 MONTHS AGO Ol, Marcelo. Como voc bem disse, sem a senha, no h maneira de criar um processo na conta de um usurio especfico. A no ser, claro, que o processo que cria j esteja autenticado como esse usurio. Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 10 de 11 19/09/2011 19:47 Como o PsExec remotamente cria um servio na conta de sistema, no o caso. []s #12 written by Hiago 6 MONTHS AGO Tem um tutorial que ajuda a fazer um teste local para iniiciante mesmo sabe por favor quero muito aprender a mexer com o pstools se tiver acesso ao meu email me envia algo vlw... #13 written by Wanderley Caloni 6 MONTHS AGO Ol. Nada como olhar o help da ferramenta, os frums sobre o assunto e o prprio saite da Sysinternals, que agora est hospedado com a Microsoft. []s Name (required) E-mail (required, will not be published) Caloni.com.br Como funciona o PsExec http://www.caloni.com.br/blog/archives/como-funciona-o-psexec 11 de 11 19/09/2011 19:47