文章总结: 本文介绍了PowerShell的Start-BitsTransfercmdlet的详细用法,该工具用于创建后台智能传输服务作业进行文件传输。文章全面解析了各种参数的功能和典型示例,特别强调了异步下载、任务监控和状态检查方法。作者重点指出NotifyCmdLine和NotifyFlags参数的组合可以在文件传输完成后执行命令,这可能被攻击者用于命令执行绕过,这一发现对安全防护具有重要意义。文章提供了实用的代码示例,展示了如何监控下载进度和处理不同状态,为安全研究人员和渗透测试人员提供了有价值的参考。 综合评分: 85 文章分类: 安全工具,红队,内网渗透,WEB安全,实战经验
[Powershell]Start-BitsTransfer的应用
原创
R0seK1ller
蟹堡安全团队
2025年12月16日 22:01 浙江
免责声明
本文所载攻防技术仅供合法授权环境下的安全研究与教育交流,作者坚决反对并将不承担任何将其用于未授权测试、入侵、破坏或其他非法用途的责任。读者应确保行为符合所在地法律法规及目标系统政策,因误用、滥用或环境差异导致的民事、刑事及连带损失,作者与发布平台概不负责。文中提到的工具、脚本、命令仅作技术演示,不保证完整性、时效性与适用性,使用前请独立评估风险并做好数据备份。若内容涉侵权或敏感信息,请联系作者删除。阅读即视为同意自行承担全部后果。
Start-BitsTransfer cmdlet 用于创建后台智能传输服务 (BITS) 传输作业以进行传输
参数
Get-Help Start-BitsTransfer
| 参数名 | 类型/取值 | 一句话作用 | 典型示例 |
| — | — | — | — |
| Source | String[] 必填 | 远程 URL 或 UNC 路径(可数组批量) | |
| Destination | String[] | 本地保存路径,留空则放当前目录 | |
| Asynchronous | Switch | 后台异步,不阻塞终端;返回 BitsJob 对象 | |
| DisplayName | String | 给任务起个友好名,方便 Get-BitsTransfer 查看 | |
| Priority | Foreground/High/Normal/Low | 调度优先级;Foreground 立即抢带宽,其余排队 | -Priority High |
| TransferType | Download / Upload / UploadReply | 文件操作;默认是Download(下载) | |
| Credential | PSCredential | 目标服务器(HTTP/SMB)身份凭据 | -Credential (Get-Credential) |
| ProxyUsage | AutoDetect / NoProxy / Override / PreConfig | 代理策略,默认 PreConfig(IE 设置) | -ProxyUsage Override -ProxyList http://proxy:8080 |
| ProxyList | Uri[] | 手动指定代理地址 | -ProxyList http://127.0.0.1:1080 |
| ProxyCredential | PSCredential | 代理自身要求的账号 | -ProxyCredential $proxyCred |
| Authentication | Basic / Digest / NTLM / Negotiate / Passport | HTTP 认证方式 | |
| RetryInterval | Int32(秒) | 失败后重试间隔 | -RetryInterval 3600 |
| RetryTimeout | Int32(秒) | 失败后总超时 | -RetryTimeout 3600 |
| MaxDownloadTime | Int32(秒) | 整个任务最长允许多久 | -MaxDownloadTime 7200 |
| Suspended | Switch | 创建完先挂起,稍后 Resume-BitsTransfer | |
| SecurityFlags | 枚举组合 | 忽略证书错误、加密/签名检查等 | -SecurityFlags IgnoreCertificateInvalid |
| CustomHeaders | String[] | 追加任意 HTTP 头 | -CustomHeaders “X-Token:abc123″,”User-Agent:MyApp/1.0” |
| NotifyCmdLine | String[] | 任务完成/失败时自动执行的外部命令 | |
| NotifyFlags | 枚举组合 | 触发 NotifyCmdLine 的事件掩码 | |
Source
指定远程文件路径
Start-BitsTransfer -Source http://xx:xx/x
默认情况下会将远程文件下载到当前目录
Destination
指定目标存储路径
Start-BitsTransfer -Source http://xx:xx/x -Destination xx
将远程文件下载到Destination指定目录
Asynchronous
后台异步下载,防止终端阻塞
Start-BitsTransfer -Source http://xx:xx/x -Destination xx -Asynchronous
| JobState 参数 | 说明 | | — | — | | Queued | 已排队,还没开始 | | Connecting | 正在连接 | | Transferring | 正在传 | | Transferred | 已成功下完,等你收工 | | Error | 永久性失败 | | TransientError | 临时性错误,BITS 会自动重试 | | Suspended | 被挂起 | | Cancelled | 已取消 |
$job=Start-BitsTransfer-Sourcehttp://xx:xx/x-Destinationxx-Asynchronous
$job
# 获取当前下载状态
$job.JobState
while($job.JobState-in'Connecting','Transferring','Queued'){
Write-Progress-Activity"下载中"-Status$job.JobState`
-PercentComplete($job.BytesTransferred/$job.BytesTotal*100)
Start-Sleep-Seconds1
}
if($job.JobState-eq'Transferred'){
# Complete-BitsTransfer 文件成功下载落地
Complete-BitsTransfer-BitsJob$job
Write-Host"下载完成"
}else{
Write-Error"下载失败: $($job.ErrorDescription)"
}
DisplayName
指定下载任务别名
$job = Start-BitsTransfer -Source http://xx:xx/x -Destination xx -Asynchronous -DisplayName “Download Test”
Get-BitsTransfer -Name “Download Test”
这个别名可以通过Get-BitsTransfer查找到对应的下载任务
NotifyCmdLine & NotifyFlags
NotifyCmdLine 的触发条件由 NotifyFlags 参数决定,两者必须成对配置。
| NotifyFlags 位值 | 对应事件 | 触发时机 |
| — | — | — |
| JOB_ERROR | 作业级致命错误 | 出现无法自动恢复的失败,作业被 BITS 标记为 Error |
| JOB_TRANSFERRED | 整个作业成功结束 | 与 FILE_TRANSFERRED 类似,只是粒度不同,通常同时到达 |
Start-BitsTransfer -Source http://xx:xx/x -Destination xx -NotifyFlags JobTransferred -NotifyCmdLine C:\windows\system32\cmd.exe,/c, ‘echo 123>C:\1.txt’
在文件成功下载后执行”cmd.exe /c echo 123 > c:\1.txt” 这个命令,NotifyCmdLine传入的第一个参数必须是一个可执行文件的路径
NotifyCmdLine & NotifyFlags的搭配为”命令执行”提供了一定的遍历
查看原文:《[Powershell]Start-BitsTransfer的应用》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论