powershell是.net写的,在powershell里可以执行.NET函数。
cmdlet:powershell命令
powershell命令格式通常是 动词-名词 的形式,常见动词如下:
- Get
- Start
- Stop
- Read
- Write
- New
- Out
Get-Help
显示有关cmdlet 的信息,Get-Help Command-Name获取特定命令的帮助,在后面添加-examples展示示例。
Get-Help Get-Command -Examples
1.cmdlet可以使用通配符*
Get-Command New-* :查看 动词 new 的 所有cmdlet
2.与其他 shell 相比,一个主要区别是 Powershell 将对象传递给下一个cmdlet,而不是将文本或字符串传递给管道之后的命令。与面向对象框架中的每个对象一样,对象将包含方法和属性。
Pipeline( |
) 用于将输出从一个cmdlet传递 到另一个 cmdlet
Get-Command | Get-Member -MemberType Method
3.从之前的cmdlet创建对象
操作对象的一种方法是从cmdlet的输出中提取属性并创建新对象。这是使用Select-Object
cmdlet 完成的。
Get-ChildItem | Select-Object -Property Mode, Name
在PowerShell中,Get-ChildItem cmdlet用于获取指定目录中的子项(文件和文件夹)。而Select-Object cmdlet用于选择对象的属性并将其显示出来。
通过将Get-ChildItem的输出管道传递给Select-Object,我们可以选择要显示的子项的属性。在这个例子中,我们选择了Mode和Name属性。
Mode属性表示子项的访问模式,它描述了文件或文件夹的权限和特性。例如,d表示目录(文件夹),-表示文件。
Name属性表示子项的名称,即文件或文件夹的名称。
通过执行Get-ChildItem | Select-Object -Property Mode, Name命令,我们将获取指定目录中的子项,并只显示每个子项的访问模式和名称。这样可以使结果更加简洁,并且只关注我们感兴趣的属性信息。
其中-operator
是以下运算符的列表:
- -contains:如果属性值中的任何一项与指定值完全匹配
- -EQ:如果属性值与指定值相同
- -GT:如果属性值大于指定值
4.过滤对象
检索输出对象时,需要选择与非常特定的值匹配的对象。Where-Object
用基于属性值的过滤器来执行此操作。
Verb-Noun | Where-Object -Property PropertyName -operator Value //一般格式
Get-Service | Where-Object -Property Status -eq Stopped :检索已经停止的进程
5.排序对象
使用Verb-Noun | Sort-Object来排序
示例:
1.搜索一个名为test.txt的文件,不知道路径:
Get-ChildItem -Path C:\ -Include *test.txt* -File -Recurse -ErrorAction SilentlyContinue
Get-ChildItem:获取指定目录的文件
-File 只返回文件为不是文件夹
-Recurse 递归查找
-ErrorAction SilentlyContinue 出错时仍然查找,比如遇上access denied不继续运行的时候。
2.系统上安装cmdlet的数量
Get-Command | Where-Object { $_.CommandType -eq “Cmdlet” } | Measure-Object //$_
表示当前正在处理的对象
3.查找一个文件的hash值:
Get-FileHash -Path “C:\Program Files\interesting-file.txt.txt” -Algorithm MD5 :-Algorithm
选项指定了要使用的哈希算法
4.获取当前工作目录:
Get-Location
5.查看是否存在某个文件:
Test-Path -Path “C:\Users\Administrator\Documents\Passwords\filename.txt”
6.对某个文件进行base64解密:
枚举:
1.拿到一个window操作系统的shell,可以通过powershell查看一下下面的信息,用于提权或者横向移动或者持久化。
- 用户
- 基本网络信息
- 文件权限
- 注册表权限
- 计划任务和运行任务
- 不安全的文件
1.用户:查看本机存在多少个用户
Get-LocalUser
2.查看sid是哪个用户的
Get-LocalUser -SID “S-1-5-21-1394777289-3961777894-1791813945-501”
3.查看多少个用户的密码所需值设置为false
Get-LocalUser | Where-Object -Property PasswordRequired -Match false
4.查看存在的本地组
Get-LocalGroup | measure
5.查看ip信息
Get-NetIPAddress
6.查看正在监听的端口
GEt-NetTCPConnection | Where-Object -Property State -Match Listen | measure
7.查看监听端口的远程地址
GEt-NetTCPConnection | Where-Object -Property State -Match Listen