用powershell下载文件的姿势你研究过吗?

本文作者:晚风,根据其之前的文章数量奖励 50 元,以资鼓励,希望可以继续加油,再接再厉。

PowerShell 的最大优势在于以 .NET 框架为基础。 .NET 框架在脚本领域几乎是无所不能,这是一个优点,也有可能成为一个方便黑客攻击的一个强大的便利。

在渗透测试中,在正常的传输通道被禁止时,我们时常会剑走偏锋,通过一些特殊的方法来进行文件的传输。这篇文章将会描述使用 PowerShell 下载文件的三种方法,并评估它们的优缺点。

关于其他在 windows 系统下通过命令行上传文件的姿势,请查看前文:

windows命令执行上传文件的姿势

测试环境

本次测试的目的在于展示执行时间和性能的区别。

测试环境主要是 Windows 10(x64)PowerShell 5 和下载速度约为 3mb/s 的无线网络连接。

我将从我自己的服务器上

http://123.206.200.87/PassWord2.txt

下载一个测试文件 PassWord2.txt ,文件大小为 25.45MB ,服务器公网带宽 1Mbps 。我们会测试脚本 10 次并取平均值作为结果。

让我们开始吧!

1.Invoke-WebRequest

说到使用 PowerShell 下载文件,最先想到的就是 Invoke-WebRequest 命令。可能你有点不熟悉这个名字,它有 3 个别名,分别是 “iwr”、“wget”、“curl”。

平均用时:3分28秒

优点

这个方法非常容易上手。如果你知道文件总的大小的话,结合 Write-Progress 命令你可以很方便得看到脚本的运行进度。Cookie 也可以通过使用 -Session-WebSession 参数在多个请求之间保留。

缺点

使用这个命令下载文件的速度很慢。我观察到 HTTP 响应流先全部缓存到了内存中,一旦文件全部传输完毕,文件就会从内存中一下子转移到磁盘中。如果你要下载一个大文件,那么这种方式会造成巨大的性能问题和内存的损耗。如果有人知道这个命令的具体操作细节,请告诉我!我们可以一起讨论一下。

这种方法的另一个潜在的严重缺点是依赖 Internet Explorer 。比如,这个命令不能运行在 Windows Server core 版本的服务器上,因为它默认不包含 Internet Explorer 二进制文件。在这种情况下,你可以使用 -UseBasicParsing 参数,但它并不是在所有情况下都起作用。另外我在这里给出两个让 Invoke-WebResquest 提速的方法。

第一,使用 $ProgressPreference='silentlycontinue' 语句来隐藏滚动条,减小了资源的占用。

第二,就是使用上面提到的 -UseBasicParsing 参数,这样在 Invoke-WebRequest 请求完数据后,就不会调用 IE 去进行 DOM 树结果的解析,效率会提高不少。

结论

当你需要在多个请求时保留 Cookie(例如下载文件之前的 HTTP 表单验证),那么这个命令会很有用。

这种方法很适合用来下载小文件,但是如果你对下载速度有要求,那肯定会有更好的选择。如果这个脚本要运行在 Windows Server Core 版本的服务器上,那这个命令就不适用了。


2.System.Net.WebClient

.NET 框架中的 System.Net.WebClient 类就是一个用于下载文件的 .NET 类。

平均用时:3分28秒

优点

这个方法用起来也很简单。这种方法的下载速度跟上一种差不多,在整个下载过程中 HTTP 响应流被直接缓存到了磁盘中。

你还可以用 System.Net.WebClient.DownloadFileAsync() 这个函数。可以很方便地在文件并行下载的同时继续运行脚本。

缺点

没有一个下载进度条(或者任何能查询下载进度的东西),也就是说你无法知道到底还要多久才能下载完成,也不知道目前到底下载了多少。并且这个命令是单线程的,所以会造成线程阻塞,只能一个下载任务完成了才能进行下一个任务。

结论

当需要下载文件时,System.Net.WebClient 是我的最佳选择。这个方法也是完全兼容 Windows Server Core 版本的服务器。


3. Start-BitsTransfer

如果你在之前没听说过后台智能传输服务(BITS) 参考文档:

https://msdn.microsoft.com/en-us/library/aa362708.aspx

BITS 主要用于 Windows 系统的升级、自动更新等工作。工作方式为异步下载文件,并且用于同步下载文件时也有十分优异的表现。还有一个BitsAdmin 工具使用的也是这个后台智能传输服务。

平均用时:3分33秒

优点

集成了进度条可以让我们清楚的了解文件的下载进度。-Asynchronous 参数可用于异步传输队列。异步就意味着无需等待上一个任务完成即可执行下一个任务,多个命令可以并行执行。虽然在单任务状态下较慢,但在多任务的情况下能提高效率。

就个人而言,使用这个方法最大的优势是能够在失败的时候进行重试操作并限制可用于传输的带宽量。

缺点

这个方法是我测试到现在最慢的方法!但是和其他两个方法来比慢的也不太多。另外,虽然 BITS 在许多机器上默认可用,但是你不能保证在所有的机器上都可以使用 BITS ,除非你在你的机器上确保已经开启了 BITS 。还有,由于 BITS 主要用于异步传输的特性,如果别的 BITS 任务正在后台运行,那么你的任务就会被加入队列或者在片刻后再执行,这就会阻碍你的脚本的执行。

总结

在你想限制文件下载的带宽或者不太考虑下载时间的情况下,这种方法是最完美的。得益于这种特性,我设置了一种夜间全速下载、白天半速下载的策略。并且 BITS 也易于观察下载的进度。


总得来说

我推荐使用 System.Net.WebClient 这种方法,因为它比较通用,下载速度也比较快。BITS 是我的第二个选择因为它的灵活性和易于管理。

在渗透测试中,利用系统自带的一些工具进行攻击是一种不错的方法。而 PowerShell 就是一把利器,由于它过于强大,很多系统管理员会直接禁用它,并且在 Windows 系统中,也是默认禁止 *.ps1 脚本文件的执行的。所以呢我们需要在执行 ps 脚本的时候绕过一下这个默认的策略。最简单的方法就是执行 powershell.exe 附加需要执行的命令,也可以将要执行的脚本直接复制进 powershell 的窗口。

在执行 ps1 脚本文件的时候加上一个 Bypass 参数就可以很简单地绕过了。例如:

PowerShell.exe -ExecutionPolicy Bypass -File .\t1.ps1

如果你知道其他的方法,请告诉我哦。

个人作品展

XSS学习笔记【一】

XSS学习笔记【二】

浅谈Session机制及CSRF攻防

【作者投稿】十分钟带你了解XXE

作者简介

作者目前位于移动支付之城—杭州。就读于浙江水利水电学院。之前在学校的东旭工作室做的是网站的前端(FE),后来从工作室出来,和小伙伴一起创办了红枫信安协会,踏上了信息安全之旅。平时偶尔喜欢玩玩游戏,爱 RNG,爱 UZI。

下面呢和大家分享一下我在信安方面的心路历程。

首先呢,带我入门的还是东旭工作室,在工作室里学到了很多基础的东西。比如一个网站的建设过程、整体架构,然后还有编程能力的提升等等。

但是呢,在学的过程中发现了一些安全性的问题。比如在一次工作室的庆祝圣诞活动页面上,有一个留言板。于是想到那时候刚学的 js,就写了一段 js 提交上去,然后所有人的浏览器上都弹了窗... 一段时间以后才知道原来这就是 xss …后来从工作室出来,闲了一段时间,听学姐推荐说去考一个软考,以后毕业找工作多一个证书好找点。然后就去考了中级的信安工程师。

在备考期间发现信息安全好有趣呀,精巧的密码学设计,刺激的中间人攻击,复杂又不失优雅的认证协议…… 还有很多很多有趣的技术。

后来又接触到了 CTF 比赛,跟红枫信安的小伙伴一起去玩玩 CTF,很刺激很开心。最后希望能和有相同爱好的各位在信安之路上越走越远。

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2017-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java进阶架构师

dubbo源码解析-详解router

估算了一下,dubbo里面涉及的东西还是比较多的.比如谈到框架的时候,设计模式都是一个老生常谈的话题,再比如我们开发中我们不常用的一些概念,spi、javass...

14630
来自专栏VMCloud

【解析向】腾讯云的Windows Server日志配置收集工具是个什么鬼?(5)

且听笔者一句劝,无论是Windows还是Linux抑或是Unix都是大部分理论是相同的,与其与人争吵对比这几个平台之类的差异,不如好好研究下底层的各个子系统...

27270
来自专栏A周立SpringCloud

微服务部署:蓝绿部署、滚动部署、灰度发布等部署方案对比与总结

在项目迭代的过程中,不可避免需要”上线“。上线对应着部署,或者重新部署;部署对应着修改;修改则意味着风险。 目前有很多用于部署的技术,有的简单,有的复杂;有的得...

86490
来自专栏鹅厂网事

高性能网关设备及服务实践

针对海量的网络流量,转发性能是我们最关键的一个方面,那构建高性能的后台服务器有哪些关键的技术和需要注意的地方。

87680
来自专栏编程之路

羊皮书APP(Android版)开发系列(十六)Android 开源库的使用

11820
来自专栏编程札记

Goroutine并发调度模型深入之实现一个协程池

1.1K50
来自专栏沃趣科技

基于Oracle的私有云架构探析(连载三)@【DTCC干货分享】

• 启用Instance Caging Instance Caging 通过设置2个数据库的初始化参数来达到管控CPU的目的: • cpu_count ...

40550
来自专栏工科狗和生物喵

计算机操作系统概念初解

一、存储系统 在计算机系统中存储层次可分为,处理器上的寄存器、高速缓冲存储器、主存储器(内存)、辅助存储器(外存)四级。高速缓冲存储器用来改善主存储器与中央处理...

36080
来自专栏Coding+

如何多端同步 Hexo 框架博客

这个必要性其实不用多说,用着用着你就自己能体会到,比如头天晚上在家里发布了一篇技术文章,第二天在公司 Coding 的过程中突然想到之前发的文某个地方有 Bug...

18010
来自专栏我的安全视界观

【一起玩蛇】python武器库的打开方式

254110

扫码关注云+社区

领取腾讯云代金券