Advertisement
opexxx

uniofuzz.py

May 15th, 2014
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.80 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: latin-1 -*- # ###################################################
  3. #                                                                             #
  4. #         ~    .__ °.__   0       o                    ^   .__ °__  `´        #
  5. #  °____) __ __|  | | °|   ______°____ 0 ____  __ _________|__|/  |_ ___.__.  #
  6. #  /    \|  | °\  |°|  | °/  ___// __ \_/ ___\|  | °\_  __ \ o\   __<   |  |  #
  7. # | o°|  \  |  /  |_|  |__\___ \\  ___/\ °\___| o|  /|  | \/  ||  |° \___ O|  #
  8. # |___|  /____/|____/____/____ °>\___  >\___  >____/ |__|° |__||__|  / ____|  #
  9. # `´´`´\/´`nullsecurity team`´\/`´´`´\/`´``´\/  ``´```´```´´´´`´``0_o\/´´`´´  #
  10. #                                                                             #
  11. # uniofuzz.py - UniOFuzz                                                      #
  12. #                                                                             #
  13. # DATE                                                                        #
  14. # 01/16/2012                                                                  #
  15. #                                                                             #
  16. # DESCRIPTION                                                                 #
  17. # UniOFuzz - the universal fuzzing tool for browsers, web services, files,    #
  18. # programs and network services/ports                                         #
  19. #                                                                             #
  20. # FOUND BY UNIOFUZZ                                                           #
  21. # http://www.exploit-db.com/exploits/18019                                    #
  22. # http://www.exploit-db.com/exploits/18008                                    #
  23. # http://www.exploit-db.com/exploits/18006                                    #
  24. #                                                                             #
  25. # DEMONSTRATION                                                               #
  26. # http://www.youtube.com/watch?v=oYzc_vEidBQ                                  #
  27. #                                                                             #
  28. # AUTHOR                                                                      #
  29. # pigtail23 - http://www.nullsecurity.net/                                    #
  30. #                                                                             #
  31. ###############################################################################
  32.  
  33.  
  34. import argparse
  35. import sys
  36. import random
  37. import socket
  38. import time
  39. import os
  40.  
  41. NAME    = 'UniOFuzz - the universal fuzzing tool for browsers, web services, files , programs and network services/ports.'
  42. VERSION = '0.1.2-beta'
  43. AUTHOR  = ("pigtail23 | http://www.nullsecurity.net/ | pigtail23-(at)-nullsecurity.net")
  44.  
  45. def parh():
  46.    
  47.     global args
  48.  
  49.     parser = argparse.ArgumentParser(
  50.     usage='%(prog)s -h/--help',
  51.     formatter_class=argparse.RawDescriptionHelpFormatter,
  52.     description='%s #v%s\nby: %s\n' % (NAME, VERSION, AUTHOR),
  53.     epilog='''
  54.     Examples:
  55.     Browser Fuzzing:
  56.     usage: ./%(prog)s -b template.html -m 1000 -e html/php/aspx -o /var/www [-c A] [-s 10000]
  57.  
  58.     Web Service Fuzzing:
  59.     usage: ./%(prog)s -w -i 0.01 -ip 127.0.0.1 -port 80 [-c A] [-s 10000]
  60.  
  61.     File Fuzzing:
  62.     usage: ./%(prog)s -f -m 1000 -e m3u/ini/pdf -o ~/files [-c A] [-s 10000]
  63.     usage: ./%(prog)s -ft template.m3u -m 1000 -e m3u/ini/pdf -o ~/files [-c A] [-s 10000]
  64.  
  65.     Piping String to Program:
  66.     usage: ./%(prog)s -p -m 1000 -i 1.5 -d '/bin/ls -n' [-c A] [-s 10000]
  67.  
  68.     Network Service/Port Fuzzing:
  69.     usage: ./%(prog)s -n -i 0.01 -ip 127.0.0.1 -port 25 [-c A] [-s 10000]
  70.    
  71.     ''')
  72.  
  73.     if len(sys.argv)==1:    
  74.         parser.print_help()
  75.         sys.exit(1)
  76.  
  77.     parser.add_argument('-b', default=True, metavar='templatefile.*', help='browser fuzz')
  78.     parser.add_argument('-f', metavar='', help='filefuzz', const=True , action='store_const')
  79.     parser.add_argument('-ft', default=True, metavar='templatefile.*', help='fuzz files with template file')
  80.     parser.add_argument('-p', metavar='', help='pipes strings to a program', const=True , action='store_const')
  81.     parser.add_argument('-d', default=True, metavar='\'/bin/ls -n\'', help='program to execute')
  82.     parser.add_argument('-w', metavar='', help='web daemon fuzz', const=True , action='store_const')
  83.     parser.add_argument('-n',metavar='', help='network service fuzz', const=True , action='store_const')
  84.     parser.add_argument('-i', default=True, metavar='0.01', help='intervall')
  85.     parser.add_argument('-o', default=True, metavar='/var/www', help='outputfolder')
  86.     parser.add_argument('-s', default=True, metavar='10000', help='max string length (default: 30000)')
  87.     parser.add_argument('-m', default=True, metavar='10000', help='how many files/pipes')
  88.     parser.add_argument('-c', default=True, metavar='A', help='const character (default: random)')
  89.     parser.add_argument('-ip', default=True, metavar='127.0.0.1', help='host ip')
  90.     parser.add_argument('-port', default=True, metavar='80', help='host port')
  91.     parser.add_argument('-e', default=True, metavar='html,m3u,pdf,...', help='file extension')
  92.  
  93.     args = parser.parse_args()
  94.  
  95. #random number
  96. def rand():
  97.  
  98.     if args.s == True
  99.         ra = random.randrange(1,30000)
  100.     else:
  101.         ra = random.randrange(1,int(args.s))
  102.    
  103.     return ra
  104.  
  105. #generates simple random strings
  106. def ran():     
  107.  
  108.     rstr = ''
  109.     for v in range(0,rand()):
  110.         ra = random.randrange(1,256)
  111.         rstr += "%c"%(ra)
  112.    
  113.     return rstr
  114.  
  115. #Generate Random Strings
  116. def genstr(i)
  117.  
  118.     if args.c != True:
  119.         rd = 4
  120.     else:
  121.         rd = random.randrange(0,i)
  122.    
  123.     #String with a char from ASCII 1-255
  124.     if rd == 0:
  125.         randomstr = ''
  126.         ra = random.randrange(1,256)       
  127.         for v in range(0,rand()):          
  128.             randomstr += "%c"%(ra)
  129.    
  130.     #String with chars from ASCII 1-255
  131.     elif rd == 1:
  132.         randomstr = ran()
  133.  
  134.     #String like %%%AAAAAAAAA... or !"§!"§!"§!"§...
  135.     elif rd == 2:
  136.         randomstr = ''
  137.         newstr = ''
  138.         ra = random.randrange(0,6)
  139.         for y in range(0,ra):
  140.  
  141.             rb = random.randrange(0,4)
  142.  
  143.             if rb == 0:
  144.                 newchar = random.randrange(33,48)
  145.             elif rb == 1:
  146.                 newchar = random.randrange(58,65)
  147.             elif rb == 2:
  148.                 newchar = random.randrange(91,97)
  149.             elif rb == 3:
  150.                 newchar = random.randrange(123,127)
  151.  
  152.             newstr += "%c"%(newchar)
  153.        
  154.         rc = random.randrange(0,2)
  155.         if rc == 0:
  156.             for y in range(0,rand()/2):
  157.                 randomstr += newstr
  158.         else:
  159.             randomstr += newstr + 'A' * rand()
  160.    
  161.     #String with chars from ASCII 1-255 (HTML encoded) like &#65;&#122;&#23;...
  162.     elif rd == 3:
  163.         newstr = ''
  164.         randomstr = ''
  165.         ra = random.randrange(0,20)
  166.         for y in range(0,ra):
  167.             rb = random.randrange(1,256)
  168.             newstr += '&#' + str(rb) + ';'
  169.  
  170.         for y in range(0,rand()/2):
  171.             randomstr += newstr
  172.  
  173.     #String with const char -c
  174.     elif rd == 4:
  175.         ra = rand()    
  176.         randomstr = args.c * ra
  177.  
  178.     return randomstr
  179.  
  180. #File Fuzz -f , -ft *
  181. def filefuzz():
  182.  
  183.     for y in range(0,int(args.m)):
  184.  
  185.         filename = 'fuzz' + str(y) + '.' + args.e
  186.         if args.ft != True:
  187.             try:
  188.                 content = open(args.ft, 'r').read()
  189.             except:        
  190.                 print "Found no " + args.ft
  191.                 sys.exit(1)
  192.  
  193.             ra = random.randrange(0,len(content))
  194.             content2 = content[:ra] + genstr(3) + content[ra:] 
  195.         else:
  196.             content2 = genstr(3)
  197.        
  198.         FILE = open(args.o + '/' + filename,"w")
  199.         FILE.write(content2)
  200.         FILE.close()
  201.  
  202.         sys.stdout.flush()
  203.         sys.stdout.write(("\rfuzz{0}." + args.e + " generated!").format(y))
  204.  
  205. #Browser Fuzzing -b *
  206. def brow():
  207.  
  208.     for y in range(0,int(args.m)):     
  209.         try:
  210.             content = open(args.b, 'r').read()
  211.         except:        
  212.             print "Found no " + args.b
  213.             sys.exit(1)    
  214.  
  215.         #First File is fuzz0.html  
  216.         filename = 'fuzz' + str(y) + '.' + args.e  
  217.         fix = '<meta http-equiv="refresh" content="0.2; URL=fuzz' + str(y+1) + '.html">\n\n'
  218.    
  219.         ra = random.randrange(0,len(content))
  220.         content2 = content[:ra] + genstr(4) + content[ra:]
  221.    
  222.         FILE = open(args.o + '/' + filename,"w")
  223.         FILE.write(fix + content2)
  224.         FILE.close()
  225.  
  226.  
  227.         sys.stdout.flush()     
  228.         sys.stdout.write(("\rfuzz{0}." + args.e + " generated!").format(y))
  229.  
  230. #Connect to Target
  231. def conn(sbuf, ind):
  232.  
  233.     vuln = (range(30)) 
  234.     try:
  235.         sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  236.         connect=sock.connect((args.ip, int(args.port)))
  237.         sock.send(sbuf)
  238.         #print sock.recv(10000)
  239.         sock.close()
  240.         time.sleep(float(args.i))
  241.         vuln[ind] = sbuf
  242.        
  243.     except socket.error:                       
  244.         for i in range(0,30):
  245.             FILE = open('crashlogs/crashlog' + str(i) +'.txt',"w") #Create Crashlogs
  246.             FILE.write(str(vuln[i]))
  247.             FILE.close()
  248.        
  249.         print '\n\nHas it crashed? If not, your intervall may be to low! 30 last request saved to crashlogs/\n'
  250.         sys.exit(1)
  251.  
  252. #TCP Network Service/Port Fuzzing -n
  253. def netf():
  254.  
  255.     j = 0
  256.     l = 1
  257.     o = 0
  258.     while True:
  259.         if j == 10:
  260.             j = 0
  261.         buffer = genstr(3)
  262.  
  263.         u = (['\\','|','/','-'])
  264.         sys.stdout.flush()     
  265.         sys.stdout.write("\r[{1}] Sending request: {0}".format(l,u[o]))
  266.         o += 1
  267.         if o == 4:
  268.             o = 0
  269.         l += 1     
  270.  
  271.         conn(buffer, j)
  272.  
  273. #Web Daemon Fuzzing -w
  274. def httpf():
  275.  
  276.     #Config
  277.     getfile = 'index.html'
  278.     #####
  279.    
  280.     l = 1
  281.     j = 0
  282.     o = 0
  283.     while True:
  284.    
  285.         if j == 10:
  286.             j = 0
  287.  
  288.         #HTTP Methods
  289.         method = (["GET /","POST /","TRACE /","PUT /","OPTION /","HEAD /"])
  290.        
  291.         #random string
  292.         randomstr = genstr(4)  
  293.    
  294.         #HTTP Version
  295.         ver = ([" HTTP/0.9\r\n"," HTTP/1.0\r\n"," HTTP/1.1\r\n"," HTTP/2.0\r\n"])
  296.        
  297.         #Header
  298.         header = (['Host: ' + str(args.ip) + ':' + str(args.port),'User-Agent: Mozilla','Accept: */*'])
  299.        
  300.         ra = random.randrange(0,6)
  301.         rb = random.randrange(0,4)
  302.         rc = random.randrange(0,4)
  303.        
  304.         if rc == 3:
  305.             buffer = method[ra] + str(randomstr) + ver[rb]
  306.         else:
  307.             buffer = method[ra] + getfile + ver[rb]
  308.        
  309.         for v in range(0,3):
  310.             if v != rc:
  311.                 buffer += header[v] + '\n'
  312.             else:
  313.                 buffer += header[rc] + randomstr + '\n'
  314.        
  315.         buffer += '\r\n\r\n'
  316.        
  317.         u = (['\\','|','/','-'])
  318.         sys.stdout.flush()     
  319.         sys.stdout.write("\r[{1}] Sending request: {0}".format(l,u[o]))
  320.         o += 1
  321.         if o == 4:
  322.             o = 0
  323.         l += 1
  324.        
  325.         conn(buffer, j)
  326.  
  327. #Piping to a Program -p
  328. def printc():
  329.  
  330.     PROG = args.d
  331.     for i in range(0,int(args.m)):
  332.         randomstr = genstr(3)
  333.        
  334.         try:
  335.             FILE = open('pipes/pipe' + str(i) + '.txt',"w")
  336.             FILE.write(randomstr)
  337.             FILE.close()
  338.         except IOError:
  339.             print "\nPlease create the folder pipes/\n"
  340.             sys.exit(1)
  341.        
  342.         PFILE = "pipes/pipe" + str(i) + ".txt"
  343.         cmd = "%s < %s" % (PROG , PFILE)
  344.         print '\n' + cmd + '\n'
  345.         os.system(cmd)
  346.         time.sleep(float(args.i))
  347.  
  348. def main():
  349.    
  350.     parh()
  351.     if(args.o != True):
  352.         try:
  353.             FILE = open(args.o + '/test.txt',"w")
  354.             FILE.write("1")
  355.             FILE.close()
  356.         except IOError:
  357.             print "\nPlease create the folder " + args.o + "\n"
  358.             sys.exit(1)
  359.    
  360.     if(args.n == True or args.w == True):
  361.         try:
  362.             FILE = open('crashlogs/test.txt',"w")
  363.             FILE.write("1")
  364.             FILE.close()
  365.         except IOError:
  366.             print "\nPlease create the folder crashlogs/\n"
  367.             sys.exit(1)
  368.  
  369.     try:
  370.         if (args.m != True) and (args.o != True) and (args.b != True) and (args.e != True):
  371.             print '\nBrowser fuzz!\n'
  372.             brow()
  373.             print '\n\nReady to fuzz!\n'
  374.        
  375.         elif (args.n == True) and (args.ip != True) and (args.port != True) and (args.i != True):
  376.             print '\nNetwork fuzz running!\n\nFuzzing: ' + args.ip + ':' + args.port + '\n'
  377.             netf()
  378.             print '\n'
  379.        
  380.         elif ((args.f == True) or (args.ft != True)) and (args.m != True) and (args.e != True) and (args.o != True):
  381.             print 'File fuzz!\n'
  382.             filefuzz()
  383.             print '\n\nReady to fuzz!\n'
  384.        
  385.         elif (args.ip != True) and (args.port != True) and (args.w == True) and (args.i != True):
  386.             print '\nWeb daemon fuzz running!\n\nFuzzing: http://' + args.ip + ':' + args.port + '/\n'
  387.             httpf()
  388.             print '\n'
  389.        
  390.         elif (args.p == True) and (args.i != True) and (args.m != True) and (args.d != True):
  391.             print "Piping it baby!\n"
  392.             printc()
  393.             print '\n'
  394.        
  395.         else:
  396.             print 'Fail!'
  397.    
  398.     except KeyboardInterrupt:
  399.         print '\n\nWTF? Why did you stop me?\n'
  400.  
  401. if __name__ == "__main__":
  402.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement