远程启动服务和传送晚间

拥有局域网内的远程机器(NT操作系统)的系统管理员账号密码,不借助事先安装客户端,如何在该机器上执行程序?
一般来说,对远程机器的攻击第一步是找到漏洞,第二步是获取权限,最后一步是在上面执行程序。实际上最后一步已经是合法操作了,本文介绍的,就是在合法情况下如何在远程机器上运行程序。系统平台仅限于WindowsNT/2000以上。

1 IPC连接
利用已经知道的系统管理员用户名和密码,和远程机器建立IPC$管道连接。运用的API函数是:WNetAddConnection2。IPC$管道是NT默认情况下开通的进程通讯管道,通过这个管道,本地机器可以用已知的用户名和密码登陆到远程机器,并拥有相应的权限。

CString strTarget = "" + m_strComputerName + "//IPC$";
NETRESOURCE nr;
nr.dwType       = RESOURCETYPE_ANY; 
nr.lpLocalName  = NULL; 
nr.lpRemoteName = strTarget.GetBuffer(strTarget.GetLength()); 
nr.lpProvider   = NULL;
WNetAddConnection2(
 &nr,
 m_strPassword.GetBuffer(m_strPassword.GetLength()),
 m_strUserName.GetBuffer(m_strUserName.GetLength()),
 FALSE);

补充说明一点,其实,通过字典“暴力破解”出系统管理员密码,然后建立IPC连接获取对远程机器的完全控制权,正是中级水平的黑客们常用的攻击手段。

2 传送文件
服务(NT Service)是NT系统的特色,服务程序在用户登陆前已经启动,驱动程序服务甚至启动得更早。服务拥有系统的最高权限,不从属于任何用户,拥有对系统资源的完全控制权。
建立IPC连接后,利用IPC管道,传送一个特制的服务文件到远程机器。之后安装并启动这个服务,我们想在远程机器上做的工作,就是通过它来执行的。如果你要在远程机器运行程序,那么别忘了把程序文件也一起传过去。
传送文件没有什么特别,使用的API是CopyFile。

CString strResource;
CString strTarget;
GetDefaultPathFile(strResource);
strTarget = "" + m_strComputerName + "//admin$//system32//";
CopyFile(strResource, strTarget, TRUE);

有时候CopyFile会失败,这时候要用GetLastError查看错误代码,如果是L80,是这个文件已经在远程机器上存在了,这种情况一般是不需要退出程序的。
你可以把CopyFile的最后一个参数设置成FALSE,这样当文件已经存在时就会被覆盖,当然,这种行为不被提倡。尤其当你是在对远程机器进行IPC入侵的时候(简单说就是黑它!),这种破坏远程机器上已有文件的行为是很危险的。

3 安装并运行服务
安装服务相对简单,使用CreateService,这里不给出代码。记得在OpenSCManager的时候第一个参数要使用远程机器的机器名。

schSCManager = OpenSCManager(
 m_strComputerName.GetBuffer(m_strComputerName.GetLength()),
 NULL,
 SC_MANAGER_ALL_ACCESS);

启动服务比较有讲究,在本机你可以直接StartService不考虑后果,但是在控制远程机器的情况下,不同操作系统的服务启动等待时间是不一样的,因此如果不进行启动状态查询,就会出错。

StartService(schService, 0, NULL);
QueryServiceStatus(schService, &ssStatus);
dwStartTickCount = GetTickCount();
dwOldCheckPoint = ssStatus.dwCheckPoint;
while (SERVICE_START_PENDING == ssStatus.dwCurrentState) 
{
 dwWaitTime = ssStatus.dwWaitHint / 10;
 Sleep( dwWaitTime );
 QueryServiceStatus(schService, &ssStatus)

 if (ssStatus.dwCheckPoint > dwOldCheckPoint)
 {
  dwStartTickCount = GetTickCount();
  dwOldCheckPoint = ssStatus.dwCheckPoint;
 }
 else
 {
  if(GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint)
  {
                break;
  }
 }
}
......

4 远程执行程序
启动服务后,接下来的事情就交给服务来做了。
怎样写一个服务?有一个现成的框架,VC精华区里面有。
http://community.csdn.net/Expert/TopicView.asp?id=3022636

这里需要注意,服务是不能直接和桌面交互的,你需要给服务指定桌面,使用SetThreadDesktop。

HDESK hdesk = OpenDesktop("default", 0, FALSE,                
 DESKTOP_CREATEMENU |
 DESKTOP_CREATEWINDOW |
 DESKTOP_ENUMERATE    |
 DESKTOP_HOOKCONTROL  |
 DESKTOP_JOURNALPLAYBACK |
 DESKTOP_JOURNALRECORD |
 DESKTOP_READOBJECTS |
 DESKTOP_SWITCHDESKTOP |);
SetThreadDesktop(hdesk);

CreateProcess(......);

至于执行什么程序,就看你了,当然,不喜欢CreateProcess还可以用ShellExecute,只要能在远程机器上启动一个程序就成功了。

5 收尾
停止服务,删除服务的可执行文件,删除程序文件(如果有的话),关闭IPC连接,这个不需要解释了吧?本文中的代码你都可以看作是伪码,运用中要记得添加出错处理。

顺便提一下,psexec.exe这个程序实现了在提供系统管理员用户名、密码的情况下远程执行程序的功能,这里介绍一下:

psexec是一个远程执行工具,你可以像使用telnet一样使用它。
假设我在远程机器ip有一个账号,账号名是:abc   密码是:123
比如想要在远程系统上执行命令可以打:
psexec //远程机器ip -u abc -p 123 cmd
如果想要远程机器执行本地c:/srm.exe文件可以打:
psexec //远程机器ip -u abc -p 123 -c c:/srm.exe
如果想要让远程机器执行本地上tftp服务端,(假设tftp服务端在本地c:/tftp32.exe),可以打:
psexec //远程机器ip -u abc -p 123 -c c:/tftp32.exe -d

这里给出psexec的下载地址:http://www.sysinternals.com/files/Pstools.zip
psexec属于pstools系列,pstools是SysInternals公司的产品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值