Defcon_8阶段 Fay·D·Flourite

defcon_8阶段

lab1

lab1是写helloworld,算是入门上手一下c#,没啥好说的,console.writeline

lab2

lab2的思路是将meterpreter的shell输出为exe,用python开一个简单的web服务,openssl将端口改成https协议传输数据,然后传输生成shell的二进制文件。

好思路,避免了文件落地,又逃了静态免杀,总不该一个简单的socket应用都给报毒吧。但在很多情况下,有些目标机器是没有外网服务的,公网下载不现实,二进制文件还是得出现在内网主机上,所以最好的建议还是输出shellcode然后自己写个加载器,把混淆之类的全做了再加个ollvm编译,完美。

lab3

lab2传输的是正常的二进制文件,lab3就是正常的shellcode了,我们在c++中也写过,不过c++中除了alloc系列函数开辟虚拟空间,然后放入shellcode外,可以内联汇编直接跳到储存shellcode的地方然后执行,c#貌似不行(没有内联汇编,不过有人写了一个可以用于内联汇编的类,包含了各种汇编指令,可以一试)

除此之外,他还提供了一种方法通过其他应用来执行我们的代码

他重写了System.Configuration.Install.Installer类中的Uninstall函数,用于执行自己的代码,然后在命令行中执行C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U 2.eXe

没说原因,但应该跟InstallUtil.exe /u时触发了我们重写的Uninstall有关

lab4

在lab3的基础上混淆了shellcode,他给了两种方案

  1. xor
  2. aes

反正是过静态查杀,加密方法见仁见智,肯定不止这两种,灵活运用就行了。

lab5

通过c#执行powershell命令以绕过在某些环境中windows禁用了cmd和powershell

powershell的后门使用的是powershell Empire

lab6

dll注入,好像是比较平常的手段,通过获取进程句柄,virtualalloc申请内存,写入dll地址,然后调用

GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

通过LoadLibraryA加载dll,从而执行我们的dll

lab7

通过打开一个新进程再运行我们的shellcode的方式来逃避检测,这样我们的shellcode就运行在一个正常的进程里,当然,就像之前写的检测virtualalloc注入shellcode一样,依然有特征