浅谈:渗透测试(红队)续集

浅谈:渗透测试(红队)续集

逃避杀毒软件及网络检测

红队人员能快速的适应并理解不同的防护。无论是理解低级语言(机器代码和汇编语言),编写shellcode,创建自定义的 C2 二进制可执行文件,还是修改代码来隐藏恶意程序。编程能力确实会影响水平高度滴。

基础的键盘记录器

设置环境

  1. 在一个虚拟机中安装 Windows 10
  2. 安装 Visual Studio ,以便你可以使用命令行编译器和使用 Vim 进行代码编辑

ps:Windows API 编程的最佳学习资源是微软自己的开发者网络网站 MSDN。 MSDN 是一个非常宝贵的资源,它详细说明了系统调用,数据类型和结构定义,并包含了许多示例。
从源码编译
Optimizing Compiler 编译器内置于 Visual Studio 开发者命令提示符(Visual tudio Developer Command Prompt)中。安装 VS 社区版本后,请通过 工具(Tools) --> 获取工具和功能(GetTools and Features) 安装 C++ 的组件 通用 Windows 平台开发和桌面开发。要编译示例源码,请打开开发者命令提示符的一个实例,然后切换到包含源代码文件的文件夹目录。 最后,运行命令 cl sourcefile.c io.c。这将生成一个与源文件同名的可执行文件。
编译器默认为 32 位,但此代码也可以用64位进行编译。要编译64位程序,请运行位于 Visual Studio 文件夹中的批处理程序。在命令提示符中,切换到目录 “ C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build ” ,注意,这个目录可能会因为你的 Visual Studio 版本而改变(但是大致是以上目录)。然后,运行命令 vcvarsall.bat x86_amd64 ,这将设置 Microsoft 编译器编译 64 位的二进制文件而不是编译成 32 位的。现在,你可以通过运行 cl path/to/code.c(path 是源码文件的绝对路径)来编译代码。

用 C 语言和底层 Windows 功能来监视击键。该键盘记录器使用SetWindowsHookEx 和 LowLevelKeyboardProc 函数 。 SetWindowsHookEx 允许在本地和全局上下文中设置
各种类型的 Hook(钩子)。在这种情况下,WH_KEYBOARD_LL参数将用于提取底层键盘事件 。

HHOOK WINAPI SetWindowsHookEx(
 _In_ int   idHook,   //Windows 会在功能页面上列出的可用 ID 
 _In_ HOOKPROC lpfn,  //HOOKPROC 是一个指向回调函数的指针,每次被钩住的进程接收数据时都会调用该函数
 _In_ HINSTANCE hMod,  //hMod 是包含 lpfn 指针指向的函数的 DLL 的句柄。此值将设置为 NULL,因为函数与 SetWindowsHookEx 在同一进程中使用。
 _In_ DWORD dwThreadId  //设置为0以将回调与桌面上的所有线程相关联。
);

回调函数
为此键盘记录器完成一系列繁重的工作。此函数将处理接收击键,将其转换为ASCII 字符以及记录所有文件操作。

LRESULT CALLBACK LowLevelKeyboardProc(
 _In_ int   nCode,
 _In_ WPARAM wParam,  //wParam,它是消息的标识符
 _In_ LPARAM lParam  //lParam,它是指向  结构体的指针
);

这记录的是按下的键的代码,而不是实际的字母,因为字母可能会根据键盘的语言而有所不同。vkCode 需要稍后转换为相应的字母
对于服务器端,可以在 C2 服务器的3490 端口上的启动 socat 侦听器,命令启动:

 socat:socat - TCP4-LISTEN:3490,fork

混淆

一些基本的技巧和思路来解决绕过杀软的问题。
杀毒软件会查找特定的字符串。可用于绕过杀毒软件的最简单方法之一是创建一个简单的旋转密码并移动字符串的字符
这是一解密函数,可以将所有字符串移动 6 个字符(ROT6)。这会导致杀毒软件可能无法检测到特征码。

int decrypt(const char* string, char result[])
  { 
       int key = 6;
       int len = strlen(string); 
       for(int n = 0; n < len;  n++)
       { 
           int symbol = string[n];
           int e_symbol = symbol - key; 
           result[n] = e_symbol; 
       }
      result[len] = ‘\0’;
      return 0;
  }

另一种可以用来逃避杀毒软件的方法是使用函数指针调用 User32.dll 中的函数,而不是直接调用函数。
下一步还可以,将可执行文件转换为 DLL,然后将 DLL 注入正在运行的进程

你可能感兴趣的:(渗透测试)