利用pipe执行远程机器命令的分析

标题:流光附带工具实现分析lcx 

  作者: Nemesis  
当大家用流光发现一个空口令的administrator账户时,自然马上就会用 流光带的NTCMD.EXE在远程机器上执行命令。但是,大家有没有想过,到底 我们是怎样在远程机器上执行口令的呢?NTCMD.EXE都作了什么? NTCMD.EXE是一个console程序,执行的语法如下:  
ntcmd //IP -U:username -P:password 但其实ntcmd只是一个前台程序,他所作的是以如下格式:  
pipecmd.exe //IP -U:username -P:password commadn-you-inputed 去执行程序pipecmd.exe来完成具体的任务.每次我们在 ntcmd>提示符 下输入一个命令(除了exit,bye),ntcmd.exe都会执行pipecmd.exe一次。 那么pipecmd.exe是怎么在远程机器上执行一条命令的呢?是不是NT下有一种 机制,你在登陆后可以向远程NT系统发一条命令,对方NT就会执行这条命令,然后 将结果反馈给你。我不知道NT下是否有这样一种方法,但pipecmd.exe不是 这么实现的。那么,pipecmd.exe使用什么方法在远程机器上执行命令的呢?  
pipecmd.exe启动后,首先用用户输入的IP地址,用户名和口令调用 函数WNetAddConnection2 来和 //IP/ADMIN$ 资源建立连接,然后再用 同样的方法和 //IP/IPC$ 建立连接。如果失败的话,就报错退出。 我们知道//IP/ADMIN$ 代表对方机器的 /WINNT 目录,而//IP/IPC$是一种 远程登陆机制,当和//IP/IPC$建立连接后,就可以对远程机器做一些事了。 在成功连接 /IPC$和/ADMIN$后,pipecmd.exe就会调用函数  
WaitNamedPipe 尝试和 //IP/pipe/PipeCmd_communicaton 这个远程机器 上的命名管道建立连接。这里要问了,远程机器怎么会有这个命名管道 等着你来连接的呢?现在我们假设无法和//IP/pipe/PipeCmd_communicaton 建立连接,这是后pipecmd.exe该怎么办呢,当然不是报错退出了。 pipecmd.exe会调用FindResource, LoadResource等一系列WIN32的资源 管理函数去读取他的一个名为"PipeCmdSrv"的二进制资源。这个资源是什么? 他就是我们在远程机器上执行命令的幕后英雄阿。他其实是一个console 程序,它不同于一般的console程序的是,他是一个 SERVICE 程序。  
大家可以用VC把pipecmd.exe里的PipeCmdSrv资源export为pipecmdsrv.exe 然后执行他,他会报告"This is a service executable! couldn't start directly!" pipecmd.exe在读取了piepcmdsrv资源后,会调用函数CreateFile 在远程机器上创建文件://IP/ADMIN$/System32/PipeCmdSrv.exe 然后调用一系列Win32的SERVICE控制函数,在远程机器上安装和启动服务 PipeCmdSrv,说白了就是在远程机器上执行PipeCmdSrv.exe(虽然不太准确)。 而PipeCmdSrv服务就会在远程机器上创建  
//IP/pipe/PipeCmd_communicaton //IP/pipe/PipeCmd_stdoutXXXYYY //IP/pipe/PipeCmd_stdinXXXYYY //IP/pipe/PipeCmd_stderrXXXXYYY  
四个命名管道。这里XXX是你的机器的名字,YYY是一个数字。呵呵,原来你的机器 名字也随着PipeCmdSrv到对方机器了,这可不太安全阿。  
好了,现在pipecmd.exe再次和//IP/pipe/PipeCmd_communicaton连接,连上后 就将用户输入的命令原封不动(比如 dir c:/)通过这个管道发给对方机器上的PipeCmdSrv服务。  
PipeCmdSrv服务收到这条命令后就会在对方机器上执行这条命令。我想 PipeCmdSrv可能是通过一个重定向输入输出cmd.exe来执行这条命令的。 执行后,PipeCmd可以通过管道//IP/pipe/PipeCmd_stdoutXXXYYY来 读取输出,如果这个命令是交互式的话,比如telnet xxx.xxx.xxx.xxx  
PipeCmd.exe还会通过//IP/pipe/PipeCmd_stdinXXXYYY来将用户的输入 发给PipeCmdSrv,我想一定是重定向给cmd.exe的。这就是 ntcmd.exe -> pipecmd.exe <--> pipecmdsrv.exe在远程机器上执行 命令的秘密。  
最后说两句:写这篇文章没有别的意思,只是想到如果真的想做什么客的话, 仅仅会使用工具是远远不够的,不但要会使用,还要知道这些工具做了些什么, 是怎么完成这些工作的,最终还要会编写自己的工具。我想很多流光系列 的使用者其实都很想知道流光里的这些功能到底是怎么实现的,比如ntcmd.exe 
比如sqlrcmd.exe,比如remotenc.exe等等。软件不可以随便共享,但知识 确实一定要共享的,我想小榕其实也不反对将流光的一些实现方法共享,只是 这些实现方法的层次比较低,小榕不一定有时间写这方面的文章。  
那就由我们这些有时间的人来写吧,希望大家不会把我和给流光打IP补丁 的人等同,那我可就冤死了。  

来自:http://www.haiyang.net/safety/book/show.asp?id=763

另:使用了win32dasm对pipecmd.exe进行了反汇编,发现存在如下api函数

ADVAPI32.CloseServiceHandle
ADVAPI32.CreateServiceA
ADVAPI32.InitializeSecurityDescriptor
ADVAPI32.OpenSCManagerA
ADVAPI32.OpenServiceA
ADVAPI32.SetSecurityDescriptorDacl
ADVAPI32.StartServiceA
KERNEL32.CloseHandle
KERNEL32.CopyFileA
KERNEL32.CreateFileA
KERNEL32.ExitThread
KERNEL32.FillConsoleOutputCharacterA
KERNEL32.FindResourceA
KERNEL32.GetComputerNameA
KERNEL32.GetConsoleScreenBufferInfo
KERNEL32.GetCurrentProcessId
KERNEL32.GetLastError
KERNEL32.GetModuleHandleA
KERNEL32.GetStdHandle
KERNEL32.LoadResource
KERNEL32.LockResource
KERNEL32.ReadConsoleA
KERNEL32.ReadFile
KERNEL32.SetConsoleCtrlHandler
KERNEL32.SetConsoleCursorPosition
KERNEL32.SetConsoleTitleA
KERNEL32.SetLastError
KERNEL32.SizeofResource
KERNEL32.Sleep
KERNEL32.WaitNamedPipeA
KERNEL32.WriteFile
MPR.WNetAddConnection2A
MPR.WNetCancelConnection2A
MSVCRT.__getmainargs
MSVCRT.__p___argc
MSVCRT.__p___argv
MSVCRT.__p___initenv
MSVCRT.__p__commode
MSVCRT.__p__fmode
MSVCRT.__set_app_type
MSVCRT.__setusermatherr
MSVCRT._beginthread
MSVCRT._controlfp
MSVCRT._except_handler3
MSVCRT._exit
MSVCRT._initterm
MSVCRT._iob
MSVCRT._mbsicmp
MSVCRT._mbsnbicmp
MSVCRT._splitpath
MSVCRT._XcptFilter
MSVCRT.exit
MSVCRT.fflush
MSVCRT.fprintf
MSVCRT.sprintf

字符串参考如下:

"high"
"idle"
"Invalid Password

"
"IPC$"
"nowait"
"p:"
"PipeCmd Service"
"PipeCmd_communicaton"
"PipeCmd_stderr"
"PipeCmd_stdin"
"PipeCmd_stdout"
"PipeCmdSrv"
"PipeCmdSrv.exe"
"Please Use NTCmd.exe Run This "
"realtime"
"u:"
"u:"

证明的确是使用了注册服务的功能,不过我的疑问是:小榕他是怎么运行安装了他的pipecmdsrv服务的呢?从使用的api函数里来看,又没有获取远程机器时间、addschelue这样的函数,那就应该不是使用添加任务的做法来安装服务的了,难道可以使用注册服务的函数直接对远程机器进行服务注册? 现在没有时间进行测试,还要写it项目管理的作业,迟些有空的话再跟踪看看。成功的话应该可以帮老婆一个大忙。:)不过不成功的话也可以使用直接执行console添加任务调度的办法来完成,不过感觉就没有那么舒服了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值