安全矩阵

 找回密码
 立即注册
搜索
查看: 654|回复: 0

[系统安全] 四十.Powershell恶意代码检测系列 (1)

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2022-11-28 14:24:16 | 显示全部楼层 |阅读模式
本帖最后由 luozhenni 于 2022-11-28 14:23 编辑


[系统安全] 四十.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法
原文链接:[系统安全] 四十.Powershell恶意代码检测系列 (1)
原创 eastmount 娜璋AI安全之家 2022-11-27 00:03 发表于湖北
该系列文章将系统整理和深入学习系统安全、逆向分析和恶意代码检测,文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。漫漫长征路,偏向虎山行。享受过程,一起加油~
前文详细介绍恶意代码同源分析和BinDiff工具的原理知识。这篇文章将详细讲解Powershell基础入门知识,包括常见的用法,涉及基础概念、管道和重定向、执行外部命令、别名用法、变量定义等。Powershell被广泛应用于安全领域,甚至成为每一位Web安全必须掌握的技术。本文参考了Bilibili的Hack学习老师的课程,同时也结合了作者之前的编程经验进行讲解。作者作为网络安全的小白,分享一些自学基础教程给大家,希望你们喜欢。同时,这些大佬是真的值得我们去学习,献上小弟的膝盖~fighting!
  • 只有更深入的了解PowerShell基础及用法,才能更好地检测恶意代码
编辑
文章目录:
  •   一.Powershell初识
            1.基础概念
            2.为什么强大?
            3.控制台和快捷键
            4.数学运算
  •   二.Powershell管道和重定向
            1.管道
            2.重定向
  • 三.Powershell执行外部命令及命令集
            1.外部命令
            2.命令集
  • 四.Powershell别名使用
            1.别名基本用法
            2.自定义别名
  • 五.Powershell变量基础
            1.基础用法
            2.变量操作
            3.自动化变量
            4.环境变量
  • 六.Powershell调用脚本程序
            1.脚本文件执行策略
            2.调用脚本程序
  • 七.总结
作者的github资源:
作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔!
编辑

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。(参考文献见后)

一.Powershell初识
1.基础概念
Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。它引入了许多非常有用的新概念,从而进一步扩展了您在 Windows 命令提示符和 Windows Script Host 环境中获得的知识和创建的脚本。
传统的CMD支持脚本编写,但扩展性不好,而Powershell类似于Linux shell,具有更好的远程处理、工作流、可更新的帮助、预定任务(Scheduled Job)、CIM等优点。
那么,如何进入Powershell呢?
一种方法是在运行中直接输入Powershell打开,另一种方法是CMD中输入Powershell打开。
编辑
编辑
编辑
不同操作系统内置的Powershell是不一样的,比如win7或win2008,如何查看版本呢?
$psversiontable
输出结果如下图所示:
编辑

2.为什么强大?

首先,它可以进行计算任务,包括计算1gb大小(以字节为单位),还有基本的运算。
编辑
其次,Powershell可以获取计算机的服务详细信息、状态等。
get-service
其显示结果如下图所示,采用动词+名词方式命名,比较清楚。
编辑
而CMD中无法获取services的(输入services.msc),它是以图形化方式显示出来的。
编辑
编辑
最后,由于Powershell具有以下特点,它被广泛应用于安全领域,甚至成为每一位Web安全必须掌握的技术。
  • 方便
  • 支持面向对象
  • 支持和.net平台交互
  • 强大的兼容性,和cmd、vbs相互调用
  • 可扩展性好,它可以用来管理活动目录、虚拟机产品等平台

3.控制台和快捷键
鼠标右键属性,可以对Powershell控制台进行编辑,并且它支持两种编辑模式,快速编辑模式默认钩上的。
编辑
编辑
Powershell快捷键包括:
  1. ALT+F7      清楚命令的历史记录
  2. PgUp PgDn   翻页
  3. Enter       执行当前命令
  4. End         将光标移动至当前命令的末尾
  5. Del         从右开始删除输入的命令字符
  6. Esc         清空当前命令行
  7. F2          自动补充历史命令至指定字符处
  8. F4          删除命令行至光标右边指定字符处
  9. F7          对话框显示命令行历史记录
  10. F8          检索包含指定字符的命令行历史记录
  11. F9          根据命令行的历史记录编号选择命令,历史记录编号可以通过F7查看
  12. 左/右        左右移动光标
  13. 上/下        切换命令行的历史记录
  14. Home        光标移至命令行字符最左端
  15. Backspace   从右删除命令行字符
  16. Ctrl+C      取消正在执行的命令
  17. Tab         自动补齐命令或文件名
复制代码
例如,使用快捷键Ctrl+C打断了正在运行的ping指令;使用tab快捷键补齐了service.msc命令。
编辑

4.数学运算Powershel
l支持数学运算,比如:
  1. PS C:\Users\yxz> 2+4
  2. 6
  3. PS C:\Users\yxz> 4-2
  4. 2
  5. PS C:\Users\yxz> 4*3
  6. 12
  7. PS C:\Users\yxz> 9%2
  8. 1
  9. PS C:\Users\yxz> (1+3*5)/2
  10. 8
  11. PS C:\Users\yxz> 1gb/1mb
  12. 1024
  13. PS C:\Users\yxz> 1gb/1mb*18kb
  14. 18874368
  15. PS C:\Users\yxz> 1gb -gt 1mb
  16. True
  17. PS C:\Users\yxz> 0xabcd
  18. 43981
复制代码
显示结果如下图所示:
编辑

二.Powershell管道和重定向
1.管道Powershell管道旨在将上一条命令的输出作为下一条命令的输出。
编辑
管道并不是什么新事物,以前的Cmd控制台也有重定向的命令,例如Dir | More可以将结果分屏显示。传统的Cmd管道是基于文本的,但是Powershell管道是基于对象。例如:
  1. linux:ls
  2. cmd:dir
复制代码
编辑
如果只获取其中的name、mode值,则使用如下指令。
ls | format-table name, mode
编辑

2.重定向

重定向旨在把命令的输出保存到文件中,‘>’为覆盖,’>>’追加。
  1. ls | format-table name, mode > demo.txt
  2. type demo.txt
复制代码
上面代码是将ls显示文件内容的name和mode信息存储至本地demo.txt文件夹中,再调用“type demo.txt”打印文件内容。如果两个 >> 它会在原来的基础上,再进行补充(类似 a+),而单个大于号是删除原来的写入(类似 w)。
编辑
输出结果如下图所示。
编辑

三.Powershell执行外部命令及命令集
1.外部命令

Powershell是CMD的一个扩展,仍然能够让CMD中的命令在Powershell中使用,Powershell初始化时会加载CMD应用程序,所以CMD命令正常情况下在Powershell中都能使用,例如ipconfig。
查看端口信
netstat -ano
包括协议、本地地址、外部地址、状态、PID(进程号)。
编辑
查看网络配置信息
ipconfig
编辑
打印路由信息
route print

编辑
自定义文件路径,打开应用程序
start notepad
notepad
notepad放在C盘下面的Windows\System32文件中,能够直接打开。
编辑
系统变量
$env:path

编辑
Python可以直接打开,Wordpad不能打开,需要添加环境变量中。
编辑

2.命令集

通过get-command获取所有命令,通常是动名词的方式。
get-command

编辑
获取其用法的命令如下,简称gcm。
get-help get-command

编辑
获取进程信息
get-process

编辑
获取当前会话的别名
get-alias
编辑
获取输入的历史命令信息
get-history

编辑
获取当前时间
get-date

编辑

四.Powershell别名使用
1.别名基本用法

获取所有命令get-command可以用别名gcm替代。
get-command

gcm
编辑
获取当前目录的所有文件信息get-childitem,可以用ls、dir两个命令达到同样的效果。
get-childitem
ls
dir
编辑
编辑
获取相关的帮助信息,其命令如下:
get-help get-childitem
编辑
获取别名所对应真实的命令
get-alias -name ls
get-alias -name dir
编辑
查找所有以Remove开头的别名
get-alias | where{$_.definition.startswith("Remove")}
其中,where来做一个管道的筛选,$_表示当前的元素,definition 定义一个字符串数组类型。Powershell支持.net强大的类库,里面的definition包括字符串startswith操作,获取字符串开头函数。
编辑
查找所有别名,并调用sort降序排序及计算排列。
get-alias | group-object definition | sort -descending Count
编辑
注意:自定义别名是临时生效的,当关闭Powershell时就会失效。

2.自定义别名

设置别名,将notepad设置为新的别名pad。pad打开notepad,表明我们的别名创建成功。
set-alias -name pad -value notepad
编辑
别名是临时生成的,关掉Powershell即可失效,也可以撰写命令删除。
del alias:pad
编辑
保存别名
export-alias demo.ps
dir
type demo.ps
编辑
编辑
导入别名命令如下,其中-force表示强制导入。
import-alias -force demo.ps

五.Powershell变量基础
1.基础用法
Powershell变量跟PHP很类似,如下所示。
  1. $name='eastmount'
  2. $name
  3. $age=28
  4. $age
复制代码


编辑
Powershell对大小写不敏感,$a 和 $A 一样。复杂变量用大括号引起来,但不建议同学们这里定义。
  1. ${"I am a" var ()}="yxz"
  2. ${"I am a" var ()}
  3. $n=(7*6+8)/2
  4. $n=3.14
复制代码

编辑
变量也可以设置等于命令。
$n=ls
编辑
变量多个同时赋值,但不建议这么写。
  1. $n1=$n2=$n3=25
  2. $n1,$n2,$n3
复制代码

编辑

2.变量操作
变量的基本运算操作
  1. $a=2
  2. $b=10
  3. $c=a+b
  4. $a,$b,$c
复制代码


编辑
传统变量交换方法
  1. $num1=10
  2. $num2=20
  3. $temp=$num1
  4. $num1=$num2
  5. $num2=$temp
  6. $num1,$num2
复制代码

编辑
现在变量交换的写法
  1. $num1=10
  2. $num2=20
  3. $num1,$num2=$num2,$num1
  4. $num1,$num2
复制代码

编辑
查看当前的变量
ls variable:
编辑
查找特定的变量值,星号表示代替所有的值(num开头)。
  1. ls variable:num*
  2. ls variable:num1
复制代码
编辑
查找变量是否存在
  1. test-path variable:num1
  2. test-path variable:num0
复制代码
编辑
删除变量
  1. del variable:num1
  2. test-path variable:num1
复制代码

编辑
专用变量管理的命令
  1. clear-variable
  2. remove-variable
  3. new-variable
复制代码

3.自动化变量
powershell打开会自动加载变量,例如:窗口打开它会自动加载大小,再比如程序的配置信息自动加载。
根目录信息
$home
编辑
当前进程的标志符,该自动化内置变量只能读取,不能写入。
$pid
$$
编辑

4.环境变量
查看当前环境变量
ls env:
编辑
打印某个环境变量的值
$env:windir
编辑
创建新的环境变量
$env:name='eastmount'
ls env:na*
编辑
删除环境变量
del env:name
ls env:na*
编辑
更新环境变量,注意它只是临时生效,并不会记录到我们的系统中。
$env:OS
$env:OS="Linux"
$env:OS
编辑
永久生效如何实现呢?增加路径至环境变量PATH中,只对User用户生效。
[environment]::setenvironmentvariable("PATH","E:\","User")
[environment]::getenvironmentvariable("PATH","User")系统变量对所有用户都生效,用户变量只对当前用户生效。
编辑
编辑
生效之后如下图所示,用户变量增加了相关值。
编辑

六.Powershell调用脚本程序
1.脚本文件执行策略

首先,发现我们的脚本文件是禁止执行的。
get-executionpolicy
编辑
接着,我们尝试获取策略帮助信息。
get-help set-executionpolicy
编辑
最后修改权限,让其能运行Powershell脚本文件。
set-executionpolicy RemoteSigned
它会提示你需要启动管理员身份运行。
编辑
通过管理员身份打开CMD,再设置其权限即可,设置完成之后可以调用相关的脚本程序。
编辑

2.调用脚本程序
(1) 定义一个demo.bat文件,其内容如下,关闭回写,打印hello world。
@echo off
echo hello world
运行命令打开:
cd desktop
.\demo.bat
编辑
(2) 定义一个demo.vbs文件,内容如下:
msgbox "CSDN Eastmount"
运行命令打开:
cd desktop
.\demo.vbs
编辑
(3) 运行Powershell脚本文件也类似。
  1. $number=49
  2. switch($number)
  3. {
  4.   {($_ -lt 50) -and ($_ -gt 40)} {"此数值大于50且小于40"}
  5.   50 {"此数值等于50"}
  6.   {$_ -gt 50} {"此数值大于50"}
  7. }
复制代码
运行结果如下图所示:
编辑
那么,如何在CMD中运行Powershell文件呢?
我们将demo.bat修改为如下内容,其中&表示运行。
@echo off
powershell "&'C:\Users\yxz\Desktop\demo.ps1'"
编辑

运行命令:
cd desktop
.\demo.bat
下面方法也可以直接运行
start demo.batdemo.bat
编辑

七.总结
写到这里,这篇文章就介绍完毕,希望您喜欢,本文主要介绍PowerShell基础之后,这将为后续PowerShell恶意代码检测提供基础。文章非常长,作者也花费了很长时间,但相信只要你认真读完,肯定会有收获,尤其是对MSF的理解。
  •         一.Powershell初识
  •         二.Powershell管道和重定向
  •         三.Powershell执行外部命令及命令集
  •         四.Powershell别名使用
  •         五.Powershell变量基础
  •         六.Powershell调用脚本程序

这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。爱你们喔,祝大家安好。
(By:Eastmount 2022-11-26 夜于火星)

参考文献,感谢这些大佬。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 05:41 , Processed in 0.016692 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表