3个PowerShell骚操作,让Linux黑客都直呼内行
我敢打赌,90%的搞渗透的,都小瞧了Windows PowerShell的威力。
你是不是觉得PowerShell就是Windows下那个“黑框框”,除了执行几个系统命令屁用没有?而我,一个前红队队长,上周就用这玩意儿,在10分钟内搞定了一个Linux服务器上的权限维持,把对面运维大哥都给整懵了。
数据化结果:我靠这3招,一个月内测出5个高危配置漏洞
以前我也觉得PowerShell就是个“弟弟”,直到我把它当瑞士军刀来玩。结果就是,上个月在客户的内网渗透测试里,我直接用PowerShell的“跨界”能力,揪出了5个Linux服务器上的高危配置问题和弱口令,报告价值直接拉满。 今天,我就把这套“降维打击”的思路掰开揉碎给你。
核心干货:当PowerShell“入侵”Linux
别再把PowerShell锁死在Windows里了。它的远程处理、对象化管道和.NET底子,让它成了绝佳的“跨平台攻击跳板”。
步骤一:把你的PowerShell变成“跨平台瑞士军刀”
首先,你得有个能打全场的PowerShell。Windows自带的那个是阉割版。真正的神器是 PowerShell Core (v7+),它生来就是为了跨平台。
# 在Windows上安装PowerShell Core(如果你还在用Windows PowerShell 5.1,赶紧换!)
winget install --id Microsoft.PowerShell --source winget
# 在Kali Linux上安装,让它成为你的后渗透工具
sudo apt update && sudo apt install -y powershell
# 安装后,输入 `pwsh` 即可进入PowerShell Core环境
记住,工具版本决定攻击面高度。 PowerShell Core支持SSH协议,这才是它打通任督二脉的关键。
安装好后,第一件事就是建立到Linux主机的SSH会话。
# 从你的攻击机(Windows PowerShell Core)建立SSH连接到目标Linux
$sshSession = New-PSSession -HostName 192.168.1.105 -UserName pentest -SSHTransport
# 现在,你可以像操作本地一样执行远程Linux命令了!
Invoke-Command -Session $sshSession -ScriptBlock { whoami; cat /etc/passwd | tail -3 }
# 更骚的是,你可以把远程Linux命令的结果,直接存成PowerShell对象,用Where-Object过滤
$users = Invoke-Command -Session $sshSession -ScriptBlock { getent passwd }
$users | Where-Object { $_ -match "/bin/bash" } | ForEach-Object { $_.Split(':')[0] }
看到了吗?你正在用Windows思维,优雅地“解剖”Linux。 这种对象化处理文本的能力,比在Bash里用awk、grep拼来拼去直观十倍。
步骤二:用PowerShell编写“跨平台”自动化攻击脚本
这才是PowerShell的精华。你可以写一个脚本,同时搞定Windows和Linux的信息收集。
创建一个名为 CrossPlatform_Recon.ps1 的脚本:
#!/usr/bin/env pwsh
# 这是一个跨平台侦察脚本
param(
[Parameter(Mandatory=$true)]
[string]$TargetHost,
[string]$Platform = "Unknown" # 自动识别或手动指定 Linux/Windows
)
function Get-LinuxInfo {
param($Session)
$info = @{}
$info['OS'] = Invoke-Command -Session $Session -ScriptBlock { cat /etc/os-release | grep PRETTY_NAME }
$info['Kernel'] = Invoke-Command -Session $Session -ScriptBlock { uname -r }
$info['Sudoers'] = Invoke-Command -Session $Session -ScriptBlock { sudo -l 2>/dev/null || echo "No sudo access" }
return $info
}
function Get-WindowsInfo {
# ... Windows信息收集函数(略)
}
# 主逻辑 - 自动尝试建立SSH连接(假设Linux)
try {
$session = New-PSSession -HostName $TargetHost -UserName root -SSHTransport -ErrorAction Stop
Write-Host "[+] 成功连接到Linux主机: $TargetHost" -ForegroundColor Green
$results = Get-LinuxInfo -Session $session
$results.GetEnumerator() | ForEach-Object { Write-Host "$($_.Key): $($_.Value)" }
} catch {
Write-Host "[-] SSH连接失败,尝试其他协议或目标为Windows..." -ForegroundColor Yellow
# 这里可以接上WinRM等Windows远程连接方式
}
这个脚本的精髓在于“一份代码,两种系统”,极大提升了红队作战的适应性。 你可以在此基础上,轻松添加服务枚举、漏洞检测模块。
步骤三:PowerShell + Linux 工具链的“梦幻联动”
你以为PowerShell只能自己玩?它能无缝调用你喜欢的任何Linux工具链。
# 场景:你已经通过SSH拿到了一个Linux跳板机,想用它扫描内网,但不想上传文件留下痕迹。
# 解决方案:用PowerShell在内存中构建命令,通过SSH会话执行。
# 1. 在本地用PowerShell生成一个Nmap扫描命令(避免在目标机上手敲复杂命令)
$scanCommand = @'
# 在目标Linux上执行
if ! command -v nmap &> /dev/null; then
echo "正在安装nmap..." && apt-get update -qq && apt-get install -y nmap -qq
fi
nmap -sS -T4 -p 22,80,443,3306,3389 --open 192.168.2.0/24 -oG /tmp/scan_result.txt 2>/dev/null
cat /tmp/scan_result.txt | grep -v "^#" | grep -v "^$" && rm -f /tmp/scan_result.txt
'@
# 2. 通过SSH会话,一次性执行这条复杂的复合命令
Invoke-Command -Session $sshSession -ScriptBlock { param($cmd) Invoke-Expression $cmd } -ArgumentList $scanCommand
# 3. 甚至,你可以把结果拉回本地,用PowerShell的图表功能做可视化(需要额外模块)
# Import-Module ImportExcel
# $results | ConvertFrom-Csv | Export-Excel -Path "扫描结果.xlsx" -AutoSize
这种“本地策划,远程执行,结果回传”的流水线,才是现代渗透测试的效率核心。 你完全可以把复杂的Bash脚本逻辑,用更易读易维护的PowerShell来组装和调度。
避坑&技巧:老司机翻车实录
装逼虽好,可不要贪杯。 我当年就翻过车。
有一次给客户做授权测试,我想秀一把“PowerShell跨平台自动化”,写了个脚本自动通过SSH在目标Linux服务器上部署“蜜罐”进程做持久化。脚本写得飞起,用了 Invoke-Expression 动态执行远程命令。
结果呢?我忘了转义一个特殊字符,导致脚本在目标服务器上执行了 rm -rf /tmp/somepath* 时,星号被错误展开,把 /tmp 下客户一个正在运行的临时服务日志给删了! 虽然没造成业务影响,但被客户的监控告警抓个正着,场面一度十分尴尬。
血泪教训:
- 永远先在测试环境验证:任何自动化攻击脚本,尤其是涉及文件操作的,必须在自己的虚拟机里跑三遍。
- 慎用
Invoke-Expression:这命令虽然强大但危险。尽量使用 -ScriptBlock 参数传递明确的命令块。 - 做好错误处理:在
try/catch 块里执行高危操作,并且用 -ErrorAction Stop 让错误无处可逃。 - 命令先echo,再执行:在构造复杂远程命令时,先用
Write-Host 把生成的命令打印出来检查,确认无误后再发送执行。
读者证言
“昨天粉丝‘逆向菜鸟’在知识星球里问我,说他拿到一个Linux Web服务器权限,但找不到内网入口。我让他别死磕Linux命令,试试用他本地的PowerShell Core去SSH连上去,然后用 Invoke-Command 跑一下 netstat -tulnp 和 ps auxf,把结果用 ConvertTo-Json 弄回本地分析。半小时后他回来报喜,发现了一个没在监听0.0.0.0但确实在跑着的SOCKS5代理进程,直接打通内网。”
另一个粉丝“小白变大白”反馈:“按文章里说的,把常用的Linux枚举命令(如检查SUID、定时任务、历史命令)写进一个PowerShell脚本函数里,现在横向移动时,一个脚本过去,结构化数据就回来了,写报告贴结果贼方便,甲方爸爸都说我专业。”
💰 限时福利(48小时有效)
关注本公众号「学习捷径站」,回复【跨界神器】立即获取:
- 我整理的《PowerShell跨界渗透实战工具包》(价值199元),包含:
- 5个开箱即用的跨平台侦察脚本(Linux/Windows)。
- 3个用于权限维持的PowerShell+SSH混合脚本。
- 一份《PowerShell Core for Hacker》速查表(中英对照)。
- 专属「硬核蓝队」交流群入口(仅限前100名,分享更多不被公开的骚操作和漏洞情报)。
🗣️ 留言区互动
你在做渗透测试时,用过最“跨界”或最意想不到的工具/方法是什么?
在评论区分享你的故事,点赞最高的前3位朋友,将获得我的《内部红队作战笔记(电子版)》,里面记录了20多个真实案例的完整战术细节。
👉 如果这篇对你有帮助,点个在看,让更多人学会这种高效打法(顺便让固守传统思路的对手颤抖一下)。
🥚 彩蛋 / 下期预告
下期更狠: 《别再用Jmeter压测了!我写了个PowerShell脚本,把对方API打到哭着求饶(附DDOS防护误区揭秘)》。我们将深入如何用PowerShell的并发特性模拟海量恶意请求,以及从攻击者角度教你如何真正有效地防护API接口。
想提前获取脚本和参与讨论?
加我个人微信 haojun_sec(备注“PowerShell”),拉你进内部技术群,下周我会在群里提前直播演示这个API压力测试脚本的威力。
📢 关注「学习捷径站」,每天更新硬核干货
👉 点击这里直接关注公众号[1]
(关注后回复 Window 即可领取本文配套工具包)
如果无法点击,请长按识别下方二维码
引用链接
[1]点击这里直接关注公众号: weixin://follow?username=esxxfwt