科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道NameLess后门技术分析全接触(2)

NameLess后门技术分析全接触(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

NameLess的大名都应该听说过吧,估计还有相当多的人用过呢,个人认为这个后门非常经典,我们再来简单看一下有关它的介绍:仅有一个DLL文件,平时不开端口,可以进行反向连接的后门程序。

作者:论坛整理 来源:zdnet网络安全 2008年1月23日

关键字: 攻击防范 后门 NameLess

  • 评论
  • 分享微博
  • 分享邮件
这一段的作用比较容易让人感到迷惑,AccpetAddr是接收到的连接另一方属性,我们使用EditPlus的“在文件中查找”在整个目录里面搜索SourceIP查看它到底是做什么的。最后把注意力放在了DecodeIPPack函数上(实现代码在./Sniffer/Sniffer.h文件中):

  BOOL DecodeIPPack(const char * IPBuffer)

  {

  IPHeader * pIpheader;

  int IPHeaderLen;

  struct sockaddr_in SourceAddr;

  pIpheader = (IPHeader*)IPBuffer;

  if ((pIpheader->proto != IPPROTO_TCP))

  return FALSE;

  SourceAddr.sin_addr.s_addr = pIpheader->sourceIP;

  memcpy(SourceIP, inet_ntoa(SourceAddr.sin_addr), sizeof(SourceIP));

  IPHeaderLen = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf);

  return DecodeTCPPack(IPBuffer+IPHeaderLen);

  }

  在前面我们提到了这个函数,但并不知道它的具体作用,现在就来详细分析一下,每当捕获到一个数据包就传递给这个函数,并将其强制转换成IPHeader类型(这个结构类型会经常用到,网上有很多,附带的源代码中是定义在Sniffer.h文件中)。函数首先检查数据报的协议类型是否为IPPROTO_TCP,然后将sourceIP字段值赋给SourceAddr.sin_addr.s_addr,再通过memcpy函数拷贝到SourceIP变量中,到这里我们可以知道每一个协议为IPPROTO_TCP的数据包的源IP都会被赋给SourceIP,随后将其传递给了DecodeTCPPack和CheckTcpData函数,在这两个函数中先进行初始化处理后就调用CheckTcpData检查数据,这个函数有一点点长,所以我就简单介绍一下它的工作流程算了:首先在数据报中找到"\n",接着判断它前面是否为"\r",如果是就把它前面的内容全部拷贝到一个字符串StringData中,再使用PortPoint = strstr(StringData,":");和HostPoint = strstr(StringData,"|");这两句在里面寻找主机地址和端口,紧接着还会分析端口合法性和主机地址的有效性,这里就不多说了。从这里可以知道它是使用嗅探的原理来取得控制端的IP实现反向连接的,大概原理就是捕获流经本机的所有数据包,然后根据自定义的协议来分析是否是控制端发送过来的数据,如果是就从中取得相关信息后连接。

  好了,中间分析了这么多后我们回到stricmp(SourceIP,inet_ntoa(AccpetAddr.sin_addr))这里继续看,通过上面的分析我们清楚了SourceIP是用来区分是否是控制端的IP的。如果符合规则的话就为其建立一个控制线程,在此线程函数ClientThread中使用自定义函数ReveiceMessage来接收命令,首先判断输入的密码是否正确,通过后即发送预定义的欢迎信息,然后进入一个循环中不停地接受控制端的命令并执行。

  到这里我们就基本上把NameLess的连接流程搞清楚了,这种使用嗅探的方法有它的好处,就是容易过防火墙,但也有它的缺点,就是当网络繁忙的时候很容易丢失封包。一些其他的反向连接方式更加流行,就是通过一个固定的域名来作为中转站,控制端每次启动的时候都自动将自己的IP更新到一个指定的网页文件中,而服务端就通过读取这个文件来得到控制端的IP后主动进行连接。网上的资料很多,大家可以多找来一些代码参考。

  三、控制功能

  现在我们来看NameLess的控制功能,这个其实就是属于系统编程的内容了,以前的杂志里面涉及了很多,我们今天就只拣一些比较有代表性的讲解下。所有的命令实现代码都在.\Command\目录下的相关文件中。

  大多数功能都是很常见的,比如列举进程、下载文件、清理日志,经常看黑防的各位估计早就会了,得到系统当前登录用户的密码这个功能貌似不错,不过挺复杂,NameLess中是注入到WinLogon进程中并且调用了一些未公开的API比如NtQuerySystemInformation等,这里就不多讲了,有兴趣的可以自行阅读代码Findpass.h来学习。挑来挑去还是拿开启终端服务来讲一下吧,这个功能还是蛮有用的,其实说白了其实就是操作注册表:

  void InstallTerm(SOCKET Socket,DWORD NewPort)

  {

  int a = WriteRegEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control

  \\Terminal Server","TSEnabled",REG_DWORD,NULL,1,0);

  int b = WriteRegEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services

  \\TermService","Start",REG_DWORD,NULL,2,0);

  int c = WriteRegEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control

  \\Terminal Server\\WinStations\\RDP-Tcp","PortNumber",REG_DWORD,NULL,NewPort,0);

  if(a && b && c)

  sprintf(Temp,"Set New Terminal Service Port:%d Successfully\r\n",NewPort);

  else

  sprintf(Temp,"Set New Terminal Service Failed\r\n");

  SendMessage(Socket,Temp);

  }

  WriteRegEx是作者自己写的函数,方便了他写程序过程中的重用。网上还流传有一份完整开启终端的C代码,搜“开3389 源代码”就可以找到很多。

  虽然NameLess的控制功能比较全面,但大多数的功能其他后门也都具备,好像缺少一些所谓的特色功能,不过个人非常同意这种做法的。毕竟后门最重要的功能在于隐藏,拥有强大功能的那是远程控制,呵呵。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章