예제 #1
0
def test_procedur(type, pkg, count):
    """
    sort files to difrent catogeries, direct controll sbow etc.
    connects to an MMS server
    :type directory_path: STRING
    :param directory_path: path to all pcap file
    """
    global rp
    global debug
    notabort = True
    bytes_to_send = None
    for i in range(count):
        if i % 1000 == 0:
            time.sleep(0.01)
            print('Anzahl:  {}'.format(i))
            #print(subprocess.check_output(['say','und weiter gehts']))
        #time.sleep(0.01) #0.2 ok
        try:
            #time.sleep(0.1) #0.2 ok
            print('.', sep=' ', end='', flush=True)
            if notabort:
                if type == 1:
                    bytes_to_send = package.mutate('01', pkg[0], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                elif type == 11:  #direct w normal security
                    bytes_to_send = package.mutate('11', pkg[0], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                elif type == 12:  #sbo w normal security
                    bytes_to_send = package.mutate('12', pkg[0], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                    time.sleep(0.6)
                    bytes_to_send = package.mutate('12', pkg[1], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                    #send Cancel
                    connect.send_package(
                        convert.pcap_to_stream(pkg[2].tcp.payload))
                elif type == 13:  #direct w e security
                    bytes_to_send = package.mutate('13', pkg[0], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                elif type == 14:  #sbo w e security
                    bytes_to_send = package.mutate('14', pkg[0], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                    time.sleep(0.6)
                    bytes_to_send = package.mutate('14', pkg[1], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                    #send Cancel
                    connect.send_package(
                        convert.pcap_to_stream(pkg[2].tcp.payload))
                elif type == 20:  # SGCB
                    #bytes_to_send = package.mutate('20',pkg[0],debug=debug)
                    bytes_to_send = convert.pcap_to_stream(pkg[0].tcp.payload)
                    notabort = connect.send_package(bytes_to_send)
                    #time.sleep(0.4)
                    bytes_to_send = package.mutate('20', pkg[1], debug=debug)
                    notabort = connect.send_package(bytes_to_send)
                    #time.sleep(0.1)
                    #bytes_to_send = package.mutate('20',pkg[2],debug=debug)
                    bytes_to_send = convert.pcap_to_stream(pkg[2].tcp.payload)
                    notabort = connect.send_package(bytes_to_send)
            else:
                rp.print_singel_test_summary(
                    i + 1,
                    file="",
                    conection='Nein! Verbindung vom Server abgebrochen',
                    payload=bytes_to_send)
                rp.save_report()
                connect.disconnect
                atexit.unregister(exit_handler)
                sys.exit()
        except BrokenPipeError as e:
            print('BrokenPipeError', e)
            rp.print_singel_test_summary(i + 1,
                                         file="",
                                         conection='Nein!',
                                         payload=bytes_to_send)
            rp.save_report()
            connect.disconnect
            atexit.unregister(exit_handler)
            sys.exit()
        except ValueError as e:
            print('ValueError', e)
            rp.print_singel_test_summary(i + 1,
                                         file="",
                                         conection='Nein!',
                                         payload=bytes_to_send)
            rp.save_report()
            connect.disconnect
            atexit.unregister(exit_handler)
            sys.exit()
        except Exception as e:
            traceback.print_exc()
            print(e)
            #print('TypeError', e)
            print('Unexpected error:    {}'.format(sys.exc_info()))
            rp.print_singel_test_summary(i + 1,
                                         file="",
                                         conection='Nein!',
                                         payload=bytes_to_send)
            rp.save_report()
            atexit.unregister(exit_handler)
            sys.exit()
예제 #2
0
def main():
    global associa
    global sgcb
    global sbowes
    global directwes
    global sbowns
    global directwns
    global singlewrite
    global rp
    global debug
    parser = OptionParser()
    parser.add_option("-f",
                      "--file",
                      dest="filedirector",
                      action="store",
                      type="string",
                      help="Directory to the .pcap Fieles to fuzz",
                      metavar="FILE")

    parser.add_option("-o",
                      "--out",
                      dest="outdirectory",
                      action="store",
                      type="string",
                      help="Directory to the result directory",
                      metavar="FILE")

    parser.add_option("-i",
                      "--ipaddress",
                      dest="ip",
                      action="store",
                      type="string",
                      help="ip-Address of the IEC61850 Server IED",
                      metavar="FILE")
    parser.add_option(
        "-c",
        "--count",
        dest="count",
        action="store",
        type="int",
        help="Count of Fuzzing operations of each file default = 500",
        metavar="FILE")

    parser.add_option(
        "-d",
        action="store_true",
        dest="debug",
        help="Optinal user to activate extended debug output to comand line",
        metavar="FILE")

    (options, args) = parser.parse_args()

    debug = options.debug
    if options.count is None:
        options.count = 20

    #onlyfiles = [f for f in listdir(options.filedirector) if isfile(join(options.filedirector, f))]
    #print(onlyfiles)
    singlewrite = []
    directwns = []
    sbowns = []
    directwes = []
    sbowes = []
    sgcb = []
    associa = None

    atexit.register(exit_handler)
    sorte_files_to_category(options.filedirector)

    rp = report(export_path=options.outdirectory)
    rp.print_cover()
    summe = options.count * (len(sgcb) + len(sbowes) + len(directwes) +
                             len(sbowns) + len(directwns) + len(singlewrite))
    files = singlewrite + directwns + sbowns + directwes + sbowes + sgcb
    rp.print_global_summary(summe, files)

    #cap = pyshark.FileCapture(options.filedirector +'/'+str(singlewrite[0]),display_filter='ip.src == 60.12.140.42 && mms')
    #bytes_to_send = package.mutate('01',cap[0], debug=True)

    if associa is None:
        print(
            'kein Associat Step gefunden Programm wird beendet. File muss wie folgt Formatiert sein: 1_00_associat.pcap'
        )
        sys.exit()

    #Connect to Server
    try:
        connect.connect(options.filedirector + '/' + associa, options.ip)
    except:
        print('Unexpected error:    {}'.format(sys.exc_info()))

    cap = pyshark.FileCapture(options.filedirector + '/' + str(associa),
                              display_filter='cotp')
    ip = str(cap[0].ip.src)
    filter = 'ip.src == {} && mms'.format(ip)
    print(filter)
    cap.close()
    for swrite in singlewrite:
        cap = pyshark.FileCapture(options.filedirector + '/' + str(swrite),
                                  display_filter=filter)
        print('File:    {}'.format(swrite))
        rp.print_package(cap[0], swrite)
        # Send Original package to Server as reference
        connect.send_package(convert.pcap_to_stream(cap[0].tcp.payload))
        test_procedur(1, cap, options.count)
        rp.print_singel_test_summary(options.count,
                                     file=swrite,
                                     conection='ja')
        cap.close()

    for swrite in directwns:
        cap = pyshark.FileCapture(options.filedirector + '/' + str(swrite),
                                  display_filter=filter)
        print('File:    {}'.format(swrite))
        rp.print_package(cap[0], swrite)
        # Send Original package to Server as reference
        connect.send_package(convert.pcap_to_stream(cap[0].tcp.payload))
        test_procedur(11, cap, options.count)
        rp.print_singel_test_summary(options.count,
                                     file=swrite,
                                     conection='ja')
        cap.close()

    for swrite in sbowns:
        cap = pyshark.FileCapture(options.filedirector + '/' + str(swrite),
                                  display_filter=filter)
        print('File:    {}'.format(swrite))
        rp.print_package(cap[0], swrite)
        rp.print_package(cap[1], swrite)

        # Send Original package to Server as reference
        connect.send_package(convert.pcap_to_stream(cap[0].tcp.payload))
        time.sleep(0.6)
        connect.send_package(convert.pcap_to_stream(cap[1].tcp.payload))
        test_procedur(12, cap, options.count)
        rp.print_singel_test_summary(options.count,
                                     file=swrite,
                                     conection='ja')
        cap.close()
    for swrite in directwes:
        cap = pyshark.FileCapture(options.filedirector + '/' + str(swrite),
                                  display_filter=filter)
        print('File:    {}'.format(swrite))
        rp.print_package(cap[0], swrite)
        # Send Original package to Server as reference
        connect.send_package(convert.pcap_to_stream(cap[0].tcp.payload))
        test_procedur(13, cap, options.count)
        rp.print_singel_test_summary(options.count,
                                     file=swrite,
                                     conection='ja')
        cap.close()
    for swrite in sbowes:
        cap = pyshark.FileCapture(options.filedirector + '/' + str(swrite),
                                  display_filter=str(filter))
        print('File:    {}'.format(swrite))
        rp.print_package(cap[0], swrite)
        rp.print_package(cap[1], swrite)

        # Send Original package to Server as reference
        connect.send_package(convert.pcap_to_stream(cap[0].tcp.payload))
        time.sleep(0.6)
        connect.send_package(convert.pcap_to_stream(cap[1].tcp.payload))

        test_procedur(14, cap, options.count)
        rp.print_singel_test_summary(options.count,
                                     file=swrite,
                                     conection='ja')
        cap.close()
    for swrite in sgcb:
        cap = pyshark.FileCapture(options.filedirector + '/' + str(swrite),
                                  display_filter=str(filter))
        rp.print_package(cap[0], swrite)
        rp.print_package(cap[1], swrite)
        rp.print_package(cap[2], swrite)
        # Send Original package to Server as reference
        print('File:    {}'.format(swrite))
        connect.send_package(convert.pcap_to_stream(cap[0].tcp.payload))
        time.sleep(0.6)
        connect.send_package(convert.pcap_to_stream(cap[1].tcp.payload))
        time.sleep(0.6)
        connect.send_package(convert.pcap_to_stream(cap[2].tcp.payload))
        time.sleep(0.6)
        test_procedur(20, cap, options.count)
        rp.print_singel_test_summary(options.count,
                                     file=swrite,
                                     conection='ja')
        cap.close()

    rp.save_report()
    atexit.unregister(exit_handler)