解說 NTcmd 的工作方式

来源:互联网 发布:数据分析的作用 编辑:程序博客网 时间:2024/06/05 08:28
当大家用流光发现一个空口令的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在远程机器上执行 
命令的秘密。
原创粉丝点击