Пример #1
0
Файл: dha.py Проект: bkzk/minja
def get_cpt_no():

#    set_dval(q='  Set CPT', dd=smtp['dha']['threads'], key='cpt', val=None)

    info('info','Note: CPT defines a number of commands sent per single thread where each \n' \
                '      thread is a a new SMTP connection which need to be established.\n\n' \
                '      * CPT = NOR / NOT\n' \
                '      * CPT can not be greater than number of recipients (NOR) \n' \
                '      * CPT is recounted when NOT is changed.\n' \
                '      * CPT is equal NOR by default ', adj='l'

        )
    print



    n = raw_input('  [%s]> ' % smtp['dha']['threads'].get('cpt',None)) \
        or smtp['dha']['threads'].get('cpt',None)
    if n == None: 
        return

    MAX_COMMANDS = 1000
    if type(n) is int or n.isdigit():
        print
        if 0 < int(n) < MAX_COMMANDS:
            #    smtp['dha']['threads']['cpt'] = int(n)
            #    fpr.ok('%s'%n)
            if chDHAThrDep(cpt=int(n)):
               fpr.ok('%s'%n)

        else:
            fpr.fail('Setting CPT as %s' % n)
Пример #2
0
def flushMsgContent():

    from core.data import smtp, smpls, fpr

    if raw_input('  Flush message data part [y/N]:> ') in ['y', 'Y']:
        #print smtp
        for k in smtp['content'].keys():
            if type(smtp['content'][k]) is list:
                del smtp['content'][k][:]
            if type(smtp['content'][k]) is dict:
                smtp['content'][k].clear()
            if type(smtp['content'][k]) is str:
                smtp['content'][k] = ''
        for k in smpls.keys():
            if 'astat' in smpls[k]:
                smpls[k]['astat'] = 0
        for k in smpls['zip'].keys():
            if type(smpls['zip'][k]) is dict:
                if 'astat' in smpls['zip'][k]:
                    smpls['zip'][k]['astat'] = 0
                #   print smpls['zip'][k]['astat']
        for k in smpls['zip-smpls'].keys():
            if type(smpls['zip-smpls'][k]) is dict:
                if 'astat' in smpls['zip-smpls'][k]:
                    smpls['zip-smpls'][k]['astat'] = 0

        # reset the custom mime settings
        smtp['use_mime'] = True

        #print smtp
        fpr.ok('Message data was flushed !')
Пример #3
0
def flushDKIMHeaders():

    import re
    from core.data import smtp, fpr

    if raw_input(
            '  Flush attached DKIM-Signature headers and Private Key [y/N]:> '
    ) in ['y', 'Y']:
        for k in smtp['headers'].keys():
            h = re.match('^(h\d*_DKIM-Signature)$', k)
            #if re.match('^h\d*_DKIM',k):
            if h:
                #print k
                #h = re.match('^h\d*_DKIM-Signature$',k)
                #if h:
                #print (k,h.group(1)) #DEBUG
                del smtp['headers'][k]
                fpr(' * %s flushed ' % h.groups())
        for k in range(smtp['sign']['dkim']['dstat']):
            if smtp['sign']['dkim'].get(k):
                smtp['sign']['dkim'].pop(k, None)
                fpr(' * Private Key #%s flushed ' % k)
        # if key in dict
        if smtp['sign']['dkim']['dstat'] in smtp['sign']['dkim']:
            # print 'POP'
            smtp['sign']['dkim'].pop(smtp['sign']['dkim']['dstat'], None)

        #smtp['sign']['dkim'].pop(smtp['sign']['dkim']['dstat'],None)
        smtp['sign']['dkim']['dstat'] = 0

        fpr.ok('DKIM-Signature headers were flushed !')
        fpr.ok('DKIM Private Keys were flushed')
Пример #4
0
Файл: dha.py Проект: bkzk/minja
def get_threads_no():

    info('info','Note: NOT defines the number of threads where each thread is a new separate' \
                '      and simultaneous connection. \n' \
                '      * NOT = NOR / CPT \n' \
                '      * NOT is 1 by default \n' \
                '      * NOT value should be keep between 1 - %s \n' \
                '      * NOT is recounted when CPT is changed' % MAX_THREADS, adj='l'

                       
    )
    print





    n = raw_input('  [%s]> ' % smtp['dha']['threads'].get('not',None)) \
        or smtp['dha']['threads'].get('not',None)
    if n == None: 
        return

    if type(n) is int or n.isdigit():
        print
        if 0 < int(n) < MAX_THREADS:
#                smtp['dha']['threads']['not'] = int(n)
#                fpr.ok('%s'%n)
            if chDHAThrDep(t=int(n)):
               fpr.ok('%s'%n)

        else:
            fpr.fail('Setting NoT as %s' % n)
Пример #5
0
def att_plain_sample(mbody, smtype, sm):

    #from core.data import smpls,fpr,tc,tr
    #from core.ui.cmenu import Menu
    #from core.ui.banner import bancls

    while True:
        bancls()
        if smpls[smtype]['astat'] != 0:
            fpr('It seems you have already attached this type of sample')
            if not raw_input('  Do you want to append another one [y/N]:') in [
                    'y', 'Y'
            ]:
                break
        if True:
            smpl_menu = Menu(sm)
            if smpl_menu.op == '':
                break
            #if smpl_menu.op == '1':
            if smpl_menu.op in ['1', '2', '3', '4', '5', '6', '7']:
                if smpls[smtype][smpl_menu.op].get('sval', '') == '_':
                    mbody.append(smpls[smtype][smpl_menu.op]['val'].replace(
                        smpls[smtype][smpl_menu.op]['sval'], ""))
                else:
                    mbody.append(smpls[smtype][smpl_menu.op]['val'])
                smpls[smtype]['astat'] += 1
                fpr.ok('Sample attached (x%d)' % smpls[smtype]['astat'])
                break
Пример #6
0
def get_msgs_no():

    #    from core.data import smtp,fpr,tc,tr
    #    from core.data import MAX_MSG_PER_TH
    #    from core.func import info

    info('info','Note: MPT defines a number of messages sent per single thread where each \n' \
                '      thread is a a new SMTP connection which need to be established.\n\n' \
                '      * MPT can not be greater than number of recipients (NOR) when \n' \
                '        NOR is greater than one.\n' \
                '      * Settinng MPT also does not make sense for single recipient. ', adj='l'

        )
    print

    n = raw_input('  [%s]> ' % smtp['replay']['threads'].get('mpt',None)) \
        or smtp['replay']['threads'].get('mpt',None)

    if n == None:
        return

    if type(n) is int or n.isdigit():
        print
        if 1 <= int(n) <= MAX_MSG_PER_TH:
            print
            #ret = chThrDep(mpt=int(n))
            #if ret > True:
            #   smtp['replay']['threads']['mpt']=int(ret)
            if chThrDep(mpt=int(n)):
                fpr.ok('%s' % n)

        else:
            print
            fpr.fail('%s' % n)
Пример #7
0
def get_rcpt_no():

    #    from core.data import smtp,fpr,tc,tr
    #    from core.data import MAX_RCPT_PER_MSG
    #    from core.func import info

    info('info','Note: RPM defines a number of recipients used with a single message.\n' \
                '      It\'s a number of RCPT TO commands send with corresponding addresses.\n\n' \
                '      * RPM value can not be greater than number of recipients (NOR) when \n' \
                '        NOR is greater than one.\n' \
                '      * Settinng RPM does not make sense for single recipient. ', adj='l'
        )

    #fpr('RpM can not be greater than number of recipients when NoR > 1')
    #fpr('Settinng RpM does not make sense for single recipient')
    print
    n = raw_input('  [%s]> ' % smtp['replay']['threads'].get('rpm',None)) \
        or smtp['replay']['threads'].get('rpm',None)

    if n == None:
        return

    if type(n) is int or n.isdigit():
        print
        if 0 < int(n) < MAX_RCPT_PER_MSG:
            print
            #ret = chThrDep(rpm=int(n))
            #if ret > True:
            #   smtp['replay']['threads']['rpm']=int(ret)
            if chThrDep(rpm=int(n)):
                fpr.ok('%s' % n)
        else:
            print
            fpr.fail('%s' % n)
Пример #8
0
def iworkspace():

    SECMODE=0700

    fpr('Initialiazing workspace ..') 
    # Directory check
    if os_type() == 'posix':
#        fpr('+ POSIX system found')
#        fpr('+ Directory check')
        for k in cfgs:
            #print k
            if re.match('.*_path$',k):
                #print k,cfgs[k]
                _dir = cfgs[k]
                #if not os.path.exists(_dir):
                if not os.path.isdir(_dir):
                    try:
                        os.makedirs(_dir)
                        fpr.ok('* Creating workspace directory: %s' % _dir )
                    except OSError as exception:
                        fpr.fail('* Creating workspace directory: %s' % _dir )
                        if exception.errno != errno.EEXIST:
                            raise
                        if exception.errno != errno.EACCES:
                            raise
                if os.path.isdir(_dir):
                    if os.path.basename(_dir) in ['keys','logs']:
                        try:
                            os.chmod(_dir,SECMODE)
                        except OSError, e:
                            pass
Пример #9
0
def logs_save(logs, thread_name, logpfx):

    from core.data import cfgs, smtp, fpr, tc, DEBUG
    from core.func import dbginfo
    from datetime import datetime
    logfile = logpfx + datetime.now().strftime('%Y%m%d%H%M%S')
    import os, errno
    import logging

    logger = logging.getLogger('threadslogs')

    fn = cfgs['log_path'] + '/' + logfile

    try:
        print
        with open(fn, "w") as text_file:
            text_file.write("{0}".format(logs))
            fpr.ok('Saving logs in %s' % logfile)
        logger.info('[%s]: Successful saving logs in file: %s' %
                    (thread_name, logfile))
    except IOError as ioex:
        fpr.fail('Saving logs in %s' % logfile)
        #fpr.fail('Err: Logs not saved with %s' % logfile )
        print
        fpr.err('Errno: %s' % ioex.errno)
        fpr.err('Err code: %s' % errno.errorcode[ioex.errno])
        fpr.err('Err message: %s' % os.strerror(ioex.errno))

        logger.info('[%s]: Saving logs in file: %s failed: %s: %s' %
                    (thread_name, logfile, errno.errorcode[ioex.errno],
                     os.strerror(ioex.errno)))
Пример #10
0
Файл: dha.py Проект: bkzk/minja
def runDHAThreads():

    viewDHAThreadsSummary()
    print

    if  smtp['addrlist']['r_reject'].keys() or  smtp['addrlist']['r_valid'].keys():
        fpr('Flushing currently found results (valid/refused recipients) ..')

    del smtp['dha']['threads']['ok'][:]
    del smtp['dha']['threads']['fail'][:]
    smtp['addrlist']['r_reject'].clear()
    smtp['addrlist']['r_valid'].clear()

    from pprint import pprint

    if smtp['dha'].get('cmd') != 'RCPT TO':
        #chek if sysem support EXPN/VRFY command before threading 
        print
        if get_yesno_input('  Would you like to test an SMTP server for %s method before threading [y/N]: ' % smtp['dha'].get('cmd')):
           sc = enumSMTPcmd(v=False,dhost=smtp['connect']['hosts'][0])
           #     enumSMTPcmd(v=True,dhost=smtp['connect']['hosts'][0]):
           #pprint(sc)
           #if smtp['connect']['hosts'][0]['tls_mode'] == 'TLS':
           #print smtp['dha'].get('cmd') 
           if smtp['dha'].get('cmd') in sc['method']:
               fpr.ok('Method %s is supported' % smtp['dha'].get('cmd'))
           else:
               fpr.fail('Method %s is unsupported' % smtp['dha'].get('cmd'))
               print
               fpr('Consider to change an SMTP method!')
               print

    t = srThread()
    t.daemon   = True
    t.delay    = smtp['dha']['threads'].get('delay',1)
    t.threads  = smtp['dha']['threads']['reals'].get(
                   'not',smtp['dha']['threads'].get('not',1)
                 )
    t.cpt      = smtp['dha']['threads']['reals'].get(
                    'cpt',smtp['dha']['threads'].get('cpt',get_rcpts('NoR'))
                 )
    t.method  = smtp['dha'].get('cmd')
    t.rcpts = smtp['addrlist']['rcpts'] 

    #print get_rcpts('NoR')
    if get_rcpts('NoR'):
        if raw_input('  Confirm threading [y/N]:> ') in ['y','Y']:
            # enable logging
            from core.msg.sender import Logger
            logger = Logger()
            t.run()
            logger.close()
        else:
            print 
            fpr.err('Threading were Cancaled!')
    else:
        print
        fpr.err('Err. No recipients defined!')
Пример #11
0
Файл: dha.py Проект: bkzk/minja
    def setReals(t,cpt):
        
        if t and cpt :
           smtp['dha']['threads']['reals'].setdefault('not',t)
           smtp['dha']['threads']['reals'].setdefault('cpt',cpt)

           smtp['dha']['threads']['reals']['not']=t
           smtp['dha']['threads']['reals']['cpt']=cpt
           fpr.ok('Reals were set!')
Пример #12
0
Файл: sess.py Проект: bkzk/minja
def loadSession():

    print
    if not get_yesno_input('  Would you like to load saved session: [y/N]> '):
        return
    print
    fpr('Session files are stored under the session subdirectory by default.\n' \
        'Please provide a full path if you would like to load a session file from different location.')
    # get the latest file as default:
    print
    latest = max(glob.iglob(os.path.join(cfgs['sess_path'], '*.session')),
                 key=os.path.getctime)
    if latest:
        fpr('Latest saved session is %s' % os.path.basename(latest))

    print
    sf = raw_input('  [%s]> ' % os.path.basename(latest)) or latest
    print

    # if filename does not include path than search file in session dir
    if not os.path.dirname(sf):
        sf = cfgs['sess_path'] + '/' + sf
    if os.path.exists(sf):
        #        import json
        try:
            f = open(sf, 'r')
            # json loads
            tmp = json.load(f)
            #from pprint import pprint
            #pprint(tmp)
            #TODO: test tmpe dict
            x = 0
            for k in tmp.keys():
                if k in [
                        'connection', 'signatures', 'replay', 'content',
                        'headers'
                ]:
                    x += 1
            if x:
                fpr.ok('Session file seems to be proper')
            else:
                fpr.fail('Session file is not proper')
                return
            # overwrite main SMTP dict
            print '====='
            #smtp = {k:v for k,v in tmp.items()}
            for k, v in inSMTPdict(tmp).items():
                print k, v
                smtp[k] = v
            print '====='
            fpr.ok('Session load successful')
        except IOError as e:
            fpr.err('Loding session failed: %s' % e)
    else:
        fpr.err('Session file does not exist')
Пример #13
0
    def setReals(t, rpm, mpt):

        if t and rpm and mpt:
            smtp['replay']['threads']['reals'].setdefault('not', t)
            smtp['replay']['threads']['reals'].setdefault('rpm', rpm)
            smtp['replay']['threads']['reals'].setdefault('mpt', mpt)

            smtp['replay']['threads']['reals']['not'] = t
            smtp['replay']['threads']['reals']['rpm'] = rpm
            smtp['replay']['threads']['reals']['mpt'] = mpt
            fpr.ok('Reals were set!')
Пример #14
0
def flushMsgHeaders():

    import re
    from core.data import smtp, fpr

    if raw_input('  Flush message headers [y/N]:> ') in ['y', 'Y']:
        for k in smtp['headers'].keys():
            if re.match('^h\d*_', k):
                h = re.match('^h\d*_(.*)$', k)
                #print (k,h.group(1)) #DEBUG
                del smtp['headers'][k]
        fpr.ok('Message headers were flushed !')
Пример #15
0
def att_raw_sample(mbody, smtype, sm):

    #from core.data import smpls,fpr,tc,tr
    #from core.ui.cmenu import Menu
    #from core.ui.banner import bancls

    while True:
        bancls()
        if smpls[smtype]['astat'] != 0:
            fpr('It seems you have already attached this type of sample')
            if not raw_input('  Do you want to append another one [y/N]:') in [
                    'y', 'Y'
            ]:
                break
        if True:
            smpl_menu = Menu(sm)
            if smpl_menu.op == '':
                break
            #if smpl_menu.op == '1':
            if smpl_menu.op in ['1', '2', '3', '4']:

                #FIXME this will not work like that for long tmal
                # fix sampel types in this shity way, the whole code regarding samples need
                # to be rewritten and reorginize, this is not flexible/scalable
                if smpls[smtype][smpl_menu.op].get('type') == 'text':
                    #this overwites type under smpls[smtype]['type']
                    if smpls[smtype][smpl_menu.op].get('sval', '') == '_':
                        #     mbody.append(smpls[smtype][smpl_menu.op]['val'].replace("_",""))
                        smtp['content']['text'].append(
                            smpls[smtype][smpl_menu.op]['val'].replace(
                                smpls[smtype][smpl_menu.op]['sval'], ""))
                    else:
                        #print "wtf: %s - %s" % (smtype,smpls[smtype][smpl_menu.op]['val'])
                        #mbody here is smtp['content']['vof'] - this is dict {} - so overwrite
                        #this with fixed path to 'text' or create a seperate att_plain and add
                        #this as mime plain/text ???
                        #mbody.append(smpls[smtype][smpl_menu.op]['val'])
                        smtp['content']['text'].append(
                            smpls[smtype][smpl_menu.op]['val'])

                    smpls[smtype]['astat'] += 1
                    fpr.ok('Sample attached (x%d)' % smpls[smtype]['astat'])
                    break
                else:
                    if smpls[smtype]['type'] == 'b64':
                        #att_b64(mbody,smtype,'1')
                        att_b64(mbody, smtype, smpl_menu.op)
                    elif smpls[smtype]['type'] == 'file':
                        #att_file_sample(mbody,smtype,'1')
                        att_file_sample(mbody, smtype, smpl_menu.op)

                break
Пример #16
0
def att_dkim_signature(dsig):

    if smtp['sign']['dkim']['dstat'] != 0:
        fpr('It seems you have already attached %s DKIM Signature' %
            smtp['sign']['dkim']['dstat'])
        if not raw_input('  Do you want to append another one [y/N]:') in [
                'y', 'Y'
        ]:
            return

    smtp['headers']['h' + str(smtp['sign']['dkim']['dstat']) +
                    '_DKIM-Signature'] = dsig
    smtp['sign']['dkim']['dstat'] += 1

    fpr.ok('DKIM Signature attached (x%d)' % smtp['sign']['dkim']['dstat'])
Пример #17
0
Файл: dha.py Проект: bkzk/minja
def get_timeout():

    info('info','Note: Time waiting for server reply', adj='l' )
    print

    n = raw_input('  [%s]> ' % smtp['dha']['threads'].get('timeout',TH_TIMEOUT)) \
           or smtp['dha']['threads'].get('timeout',TH_TIMEOUT)
    
    if n and (type(n) is int or n.isdigit()):
        if 0 <= int(n):
            print
            smtp['dha']['threads']['timeout']=int(n)
            fpr.ok('%s'%n)
        else:
            print
            fpr.fail('%s'%n)
Пример #18
0
Файл: sess.py Проект: bkzk/minja
def dumpSession():
    info('info','Saved session allows to save current connection and message setting to be \n' \
                'useful with further tests, as a proof of successful test or used as template\n\n'\
                'Note: Session file can store sensitive data like SMTP authentication\n' \
                '      credential or private keys and certificate.',adj='l')

    print
    if not get_yesno_input(
            '  Would you like to save your current session: [y/N]> '):
        return

    print
    fpr('Session files are stored under the session subdirectory by default.\n' \
        'Please provide a full path if you would like to store you session somehere else.')

    sessfile = 'minja-' + datetime.now().strftime('%Y%m%d%H%M%S') + '.session'

    print
    sf = raw_input('  [%s]> ' % sessfile) or sessfile
    print

    if sf == sessfile or not os.path.dirname(sf):
        sf = cfgs['sess_path'] + '/' + sf

    if os.path.exists(sf):
        fpr('Session file already exist')

    else:
        if os.access(os.path.dirname(sf), os.W_OK):
            #the file does not exists but write privileges are given
            fpr('Saving under %s\n' % sf)
            #import json

            dd = outSMTPdict(smtp)

            try:
                #f = codecs.open(sf, 'w', encoding='utf-8')
                f = open(sf, 'w')

                json.dump(dd, f, indent=3)

                fpr.ok('Session saving')
            except IOError as e:
                fpr.err('Saving file failed: %s' % e)
        else:
            fpr.fail('Missing write permission')
Пример #19
0
Файл: dha.py Проект: bkzk/minja
def get_delay():

    info('info','Note: Delay is number of miliseconds between starting new threads, \n' \
                '      where each new thread is a new SMTP connection.', adj='l'
        )
    print

    n = raw_input('  [%s]> ' % smtp['dha']['threads'].get('delay',TH_DELAY)) \
           or smtp['dha']['threads'].get('delay',TH_DELAY)
    
    if n and (type(n) is int or n.isdigit()):
        if 0 <= int(n):
            print
            smtp['dha']['threads']['delay']=int(n)
            fpr.ok('%s'%n)
        else:
            print
            fpr.fail('%s'%n)
Пример #20
0
Файл: func.py Проект: bkzk/minja
def save_content_asfile(content, fn, mode='w'):


#    if os.path.isfile(fn):
#        if not get_yesno_input ('  File already exist. Overwrite it [y/N]: '):
#            return False
    try:
       
       with open(fn, mode) as fo:
          fo.write(content)
          fpr.ok('Saving content in %s' % fn)
    except IOError as ioex:
       fpr.fail('Saving content in %s' % fn )
       #fpr.fail('Err: Logs not saved with %s' % logfile )
       print
       fpr.err('Errno: %s' % ioex.errno)
       fpr.err('Err code: %s' % errno.errorcode[ioex.errno])
       fpr.err('Err message: %s' % os.strerror(ioex.errno) )
Пример #21
0
def att_load_eml(mbody, emlfn):

    #import os
    #from core.data import smtp,fpr,tc,tr
    #from core.func import waitin,dbginfo

    if os.path.isfile(emlfn):
        print
        fpr('Loading %s ..' % emlfn)

        fp = open(emlfn, 'rb')

        inputs = fp.read()
        fp.close()

        if not inputs:

            dbginfo(
                'error',
                'Err: File has no content. Please verify file size !\n[ %s ]' %
                emlfn)
            #break
            return False

        if inputs:
            info('info', '-- Loaded message: Top dump (view: 500 chars) --',
                 '%s' % inputs[:500] + ' . . .')
            print
            #dbglog(inputs)
            fpr.ok('Message content has been loaded')

            #smtp['content']['string'] = ''.join(inputs)
            mbody['string'] = ''.join(inputs)
            #smtp['content']['string'] = '\r\n'.join(inputs)

            #smtp['use_mime'] = False

        waitin()
    else:
        fpr('No such file or you don\'t have a permission to access it')
        print
        return False
Пример #22
0
def get_rate():

    #    from core.data import smtp,fpr,tc,tr
    #    import re

    rate = smtp['replay']['threads'].get('rate', '')

    fpr('Allowed values are N, N/Ms, N/Mm, N/Mh')
    fpr('where:')
    fpr('  N - number of Recipients/Messages \
       \n  M - value of s-seconds, m-minutes or h-hours\n')
    print
    r = raw_input('  [%s]> ' % (rate or ''))
    if r:
        m = re.match(r'^(\d+)(\/)*(\d+[smh])*$', r)
        if not m:
            #    print
            fpr.err('Err: Incorrect syntax')
            return False
        else:
            #print type(m.group())
            #if m.group(1):
            #    print m.group(1)
            #if m.group(2):
            #    print m.group(2)
            #if m.group(3):
            #    print m.group(3)
            if m.group(1) and not m.group(2):
                fpr.ok('%s' % m.group())

                smtp['replay']['threads']['rate'] = m.group()

                return m.group()
            if m.group(3):
                fpr.ok('%s' % m.group())

                smtp['replay']['threads']['rate'] = m.group()

                return m.group()
    else:
        return (rate or '')
Пример #23
0
Файл: wizz.py Проект: bkzk/minja
def run_wizzard_host(d):
# WHAT CAN BE DONE MORE: 
# - use get)single and get_yesno fun
# - modify to support multiple hosts ?

    fpr('Welcome in Wizzard')
    print 
    fpr('Please follow .. ') 
    print

    t = dict()

    t['host'] =  get_single_input('SMTP Host', d.get('host',''),nl='') 
    t['port'] =  get_single_input('SMTP Port', d.get('port',''),nl='') 
    t['helo'] =  get_single_input('SMTP HELO', d.get('helo',''),nl='')
    t['smtp_auth_user'] =  get_single_input('SMTP AUTH Username ', d.get('smtp_auth_user',''),nl='')
    t['smtp_auth_pass'] =  get_single_input('SMTP AUTH Password ', d.get('smtp_auth_pass',''),nl='')
 #   t['tls_mode']  =  get_single_input('SMTP TLS', d.get('tls_mode','NoTLS'),nl='')

    if d.get('tls_mode') == 'NoTLS': 
        fpr('TLS Mode:  Disabled')
        if get_yesno_input('    > Enable TLS mode [y/N]> '):
            t['tls_mode'] = 'TLS'
            fpr('TLS Mode:  Enabled')
         
    elif d.get('tls_mode') == 'TLS':
        fpr('TLS Mode: Enabled')
        if get_yesno_input('    > Disable TLS mode [y/N]> '):
            t['tls_mode'] = 'NoTLS'
            fpr('TLS Mode: Disabled')
    

    print
    if raw_input('  Save [Y/n]> ') in ['y', 'Y', '']:
        print
        fpr.ok('Settings saved')
        for k in t.keys():
             d[k] = t[k]
    else:
        print 
        fpr.fail('Settings not saved!')
Пример #24
0
def get_msgs_delay():

    #    from core.data import smtp,fpr,tc,tr
    #    from core.data import MAX_MSG_PER_TH
    #    from core.func import info

    info('info','Note: Delay is number of miliseconds between starting new threads, \n' \
                '      where each new thread is a new SMTP connection.', adj='l'
        )
    #fpr('Specify Delay between running new thread/connection')
    print
    n = raw_input('  [%s]> ' % smtp['replay']['threads'].get('delay',TH_DELAY)) \
           or smtp['replay']['threads'].get('delay',TH_DELAY)

    if n and (type(n) is int or n.isdigit()):
        if 0 <= int(n):
            print
            smtp['replay']['threads']['delay'] = int(n)
            fpr.ok('%s' % n)
        else:
            print
            fpr.fail('%s' % n)
Пример #25
0
def mpart_saver(part, op):

    if op == 1:  #save as it is, no decoding
        #pprint(part)
        part['encext'] = None
        for (h, hv) in part['mheaders']:
            #fpr('%s: %s' % (h,hv))
            if h.lower() == 'content-transfer-encoding':
                part['encext'] = '.' + hv.lower()

        print
        if not get_yesno_input('  Would you like to save this part: [y/N]> '):
            return

        print
        if part['filename']:
            fn = part['filename'] + part['encext']
        else:
            fn = 'minja-' + part['type'].replace(
                '/', '_') + '-' + datetime.now().strftime(
                    '%Y%m%d%H%M%S') + part['encext']

        print
        fn = raw_input('  [%s]> ' % fn) or fn
        print

        #if sf == sessfile or not os.path.dirname(sf):
        #   sf =  cfgs['sess_path']+'/'+sf
        if not os.path.dirname(fn):
            fn = cfgs['mparts_path'] + '/' + fn
        if os.path.exists(fn):
            fpr('File already exist')
        else:
            if os.access(os.path.dirname(fn), os.W_OK):
                #the file does not exists but write privileges are given
                fpr('Saving under %s\n' % fn)
                try:
                    #f = codecs.open(fn, 'w', encoding='utf-8')
                    f = open(fn, 'w')
                    f.write(part['payload'])
                    f.close()
                    fpr.ok('Session saving')
                except IOError as e:
                    fpr.err('Saving file failed: %s' % e)
            else:
                fpr.fail('Missing write permission')

    if op == 2:  #decode base64 first

        print
        if not get_yesno_input('  Would you like to save this part: [y/N]> '):
            return

        print
        if part['filename']:
            fn = part['filename']
        else:
            fn = 'minja-' + part['type'].replace(
                '/', '_') + '-' + datetime.now().strftime('%Y%m%d%H%M%S')

        print
        fn = raw_input('  [%s]> ' % fn) or fn
        print

        #if sf == sessfile or not os.path.dirname(sf):
        #   sf =  cfgs['sess_path']+'/'+sf
        if not os.path.dirname(fn):
            fn = cfgs['mparts_path'] + '/' + fn

        if os.path.exists(fn):
            fpr('File already exist')
        else:
            if os.access(os.path.dirname(fn), os.W_OK):
                #the file does not exists but write privileges are given
                fpr('Saving under %s\n' % fn)
                try:
                    #f = codecs.open(fn, 'w', encoding='utf-8')
                    f = open(fn, 'wb')

                    d = decode_attch(part['payload'])
                    #pprint(d)
                    f.write(d['raw'])

                    f.close()
                    fpr.ok('Session saving')
                except IOError as e:
                    fpr.err('Saving file failed: %s' % e)
            else:
                fpr.fail('Missing write permission')
Пример #26
0
def e_base64(op):
    # load from file
    if op == '1':
        fn = ''
        while True:
            bancls()
            fpr('Diagnostics: Base64 encoder')
            print
            fpr('Please provide a file name:')
            fn = raw_input('  []> ')
            print
            inputs = get_file_content(fn)
            print
            if inputs:
                #inputs = f.readlines()          # include \n
                #inputs = f.read().splitlines()   # exclude \n
                dbginfo('debug', inputs)
                print

                encb64 = coders.encode_attch(inputs)

                if isinstance(encb64, dict):
                    fpr.ok('File content was encoded successful')
                else:
                    fpr.fail('File content was not encoded')
                waitin()
                return encb64
            elif raw_input('  Return to menu [y/N]> ') in ['y', 'Y']:
                break

            waitin()
    # load from input - paste it
    if op == '2':
        bancls()
        fpr('Diagnostics: Base64 encoder')
        print
        if raw_input('  Would you like to encode some content [y/N]> ') in [
                'y', 'Y'
        ]:
            print
            fpr('Please provide some plain content')
            fpr('Use Ctrl-D with new line to continue.')
            print
            fpr.blue('_' * (tc - 4))
            print
            inputs = get_inputs()
            fpr.blue('_' * (tc - 4))

            if inputs:
                dbglog(inputs)
                print
                encb64 = coders.encode_attch('\n'.join(inputs))

                if isinstance(encb64, dict):
                    fpr.ok('Input content was encoded successful')
                else:
                    fpr.fail('Input content was not encoded')
                waitin()
                return encb64
            #print inputs
            waitin()
Пример #27
0
                    fpr('_' * (tc - 4))
                if dd.get('ip'):
                    res, code, expl = q.check()
                    valid = True
                else:
                    print
                    fpr.warn(
                        'Verification skipped. Missing client IP address!')
            except spf.TempError, e:
                fpr.err('Error: %s' % e)
        print
        if not valid:
            fpr.fail('SPF policy validation')
            return

        fpr.ok('SPF policy validation')
        print

        fpr('SPF Verification result')
        fpr('_' * (tc - 4) + '\n\n')
        fpr.info('%s,%s,%s' % (res, code, expl))

        print
        fpr('SPF status  : %s' % res)
        fpr.info('SPF code    : %s ' % code)
        fpr('SPF info    : %s' % expl)
        fpr('_' * (tc - 4) + '\n\n')
        """
         |  get_header(self, res, receiver=None, header_type='spf', aid=None, **kv)
         |      Generate Received-SPF or Authentication Results header based on the
         |       last lookup.
Пример #28
0
def setSPFvalues(deauth, sh, x):
    # deauth - dictionary with current SPF values
    # sh - dictionary with parsed headers
    # xhv - header number

    def cldeauth(death=deauth):
        del deauth['spf']
        deauth.setdefault(
            'spf',
            dict({
                'id': {
                    'mfrom': '',
                    'helo': '',
                    'pra': ''
                },
                'ip': None
            }))

    from pprint import pprint
    from core.func import get_single_input
    n = 0
    for i in sh:
        #fpr("%s" % i)
        for j in sh[i]:
            n += 1
            if n == x:
                #               pprint(sh[i][j])
                if i == 'Received-SPF':
                    if sh[i][j].get('identity') == 'mailfrom':
                        cldeauth()
                        deauth['spf']['id']['mfrom'] = sh[i][j].get(
                            'envelope-from')
                        deauth['spf']['ip'] = sh[i][j].get('client-ip')
                    # x-sender - container of helo value (Cisco ESA)
                    if sh[i][j].get('identity') == 'helo':
                        cldeauth()
                        if sh[i][j].get('x'):
                            deauth['spf']['id']['helo'] = sh[i][j]['x'].get(
                                'x-sender')
                        deauth['spf']['ip'] = sh[i][j].get('client-ip')

                if i == 'Authentication-Results':
                    if sh[i][j].get('spf'):
                        if sh[i][j]['spf'].get('helo') and sh[i][j]['spf'].get(
                                'mailfrom'):
                            fpr('The Authentication-Results store more than one SPF identity'
                                )
                            fpr('Choose identity:')
                            print
                            fpr(' 1) mailfrom')
                            fpr(' 2) helo')
                            fpr.info(' 3) pra')
                            x = get_single_input('', '')

                            if x == '1':
                                cldeauth()
                                deauth['spf']['id']['mfrom'] = sh[i][j]['spf'][
                                    'mailfrom'].get('value')
                            if x == '2':
                                cldeauth()
                                deauth['spf']['id']['helo'] = sh[i][j]['spf'][
                                    'helo'].get('value')

    #from core.msg.viewers import viewers
    bancls()
    import core.msg.viewers as viewers
    viewers.viewSPFvalues(deauth['spf'])
    fpr.ok('SPF values has been set')

    if DDDEBUG: pprint(deauth)
Пример #29
0
Файл: func.py Проект: bkzk/minja
def get_sample(sample):

     #import os
     #import hashlib
     #from urllib2 import Request, urlopen, URLError, HTTPError
     #from core.func import dbginfo

     fpr('Fetching sample .. ')
     fn  = sample['filename']+'.tmp'
     url = sample['url']
     req = Request(url)
     try:
         r = urlopen(req)
         print
     except HTTPError as e:
         dbginfo('error',
           'Err: The server couldn\'t fulfill the request.\n' \
           'Code: %s ' % e.code 
         )
     except URLError as e:
         dbginfo('error',
           'Err: Server can not be reached!\n' \
           'Reason: %s ' % e.reason
         )
     else:
         # everything is fine
         data = r.read()
         fpr.ok('Data fetching')
         with open(fn,"wb") as f:
              if data:
                  try:
                      f.write(data)

                  except IOError:
                      fpr.fail('Temporary file saving')
                      return
                  else:
                      f.close()
                      fpr.ok('Temporary file saving')


                  if os.path.isfile(fn):
                       md5tmpfn =  hashlib.md5(open(fn, 'rb').read()).hexdigest()
                       #print sample['md5'] 
                       #print hashlib.md5(open(fn, 'rb').read()).hexdigest()
                       if sample['md5'] == md5tmpfn:
                            fpr.ok('Hash testing')
                            try:
                                os.rename(fn, sample['filename'])
                            except IOError:
                                fpr.fail('File saving')
                                return
                            else:
                                fpr.ok('File saving')
  
	               else:
                            fpr.fail('Hash testing')
                                                         

              else:
                  fpr.err('No data')
                  return
Пример #30
0
def dkim_vrfy(message):

    PYDNS_AVAILABLE = False
    DNSPYTHON_AVAILABLE = False

    # check dns libraries
    try:
        import dns
        DNSPYTHON_AVAILABLE = True
    except ImportError:
        pass

    try:
        import DNS
        PYDNS_AVAILABLE = True
    except ImportError:
        pass

    try:
        from dkim import DKIM, verify, DKIMException

        if not (PYDNS_AVAILABLE or DNSPYTHON_AVAILABLE):
            raise Exception("no supported dns library available")
    except:
        pass

    try:
        import dkim
        if True:
            d = dkim.DKIM(message)
            #print 'dir:',dir(d)
            #print 'sel:',d.selector
            #print 'dom:',d.domain
            #print 'h:',d.headers
            #print 'sh:',d.signed_headers
            #print 'sa:',d.signature_algorithm
            #print 'sf:',d.signature_fields
            #print 'ks:',d.keysize

            r = d.verify()

            fpr('Signature details')
            fpr('_' * (tc - 4))
            print
            fpr(' selector (s): %s' % d.selector)
            fpr(' domain   (d): %s' % d.domain)
            fpr(' headers     : %s' % d.headers)
            fpr(' signed heads: %s' % d.signed_headers)
            fpr(' key algo (a): %s' % d.signature_algorithm)
            fpr(' key size    : %s' % d.keysize)
            print
            fpr(' DKIM-Signature: %s' % d.signature_fields)
            fpr('_' * (tc - 4))
            print

        else:
            r = dkim.verify(message)
        if r:
            fpr.ok("DKIM signature verification successful")
        else:
            fpr.fail("DKIM signature verification failed")

    except DKIMException, e:

        fpr("Verification result:")
        print
        fpr('%s' % e)
        print
        fpr.fail("DKIM signature verification failed")