Você está na página 1de 11

CALONI.COM.

BR
C++, Windows, Programao, Depurao e Transpirao

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