2017-12-30 8 views
0

Ich versuche zu automatisieren laufen snmpwalk gegen mehrere Hosts in meinem Penetration Testlabor. Grundsätzlich möchte ich meinem Python-Skript eine Liste mit Ziel-IPs (in Form einer Textdatei) geben, es mit snmpwalk gegen sie laufen lassen und die Ergebnisse in separaten Dateien speichern, die ich erstelle (eines pro Ziel-IP) . Hier ist ein Teil meines Codes, die das Werkzeug gegen das Ziel IPs läuft, die in der live_list Objektdatei:Python 3 - Probleme beim Schreiben in Dateien mit dem Argument stdout des Moduls subprocess.call

def run_snmpwalk(selection): 
    # Rewind file 
    live_list.seek(0) 
    if selection == '1': 
      i = 0 
      for line in live_list: 

        tgt_host = line.strip("/\n") 
        file_obj_array[i].write('[+] SNMPWalk user enumeration for IP: ' + tgt_host + ' \n') 
        print('[+] Attempting to enumerate users from IP: ' + tgt_host) 
        exit_code = subprocess.call(['snmpwalk', '-c', 'public', '-v1', tgt_host, '1.3.6.1.4.1.77.1.2.25'], stdout=file_obj_array[i]) 
        i += 1 
        if exit_code == 0: 
          print('[+] Success') 
        else: 
          print('[+] Something went wrong while executing snmpwalk ') 

Wie beschissen, wie es sein könnte, vor dem Code funktioniert, wie ich sollte, mit Ausnahme von einem kleinen Detail, dass Ich kann es nicht reparieren.

Die folgende Zeile verwendet das subprocess.call Modul mit dem stdout Parameter in der Datei gesetzt ich vorher erstellt, um die Ausgabe des Befehls zu enthalten:

subprocess.call(['snmpwalk', '-c', 'public', '-v1', tgt_host, '1.3.6.1.4.1.77.1.2.25'], stdout=file_obj_array[i]) 

Und diese nächste Zeile soll einen Header in die Datei schreiben zu dem die Ausgabe des vorherigen Befehls zu Dumpingpreise:

file_obj_array[i].write('[+] SNMPWalk user enumeration for IP: ' + tgt_host + ' \n') 

Doch statt mit einem Kopf enden, endet die Linie oben am Ende der Datei nach oben, obwohl es vor denausgeführt wirdLinie. Hier ist ein Beispiel der Ausgabedatei der Funktion oben:

iso.3.6.1.4.1.77.1.2.25.1.1.5.71.117.101.115.116 = STRING: "Guest" 
iso.3.6.1.4.1.77.1.2.25.1.1.6.97.117.115.116.105.110 = STRING: "austin" 
iso.3.6.1.4.1.77.1.2.25.1.1.9.73.85.83.82.95.83.82.86.50 = STRING: "IUSR_SRV2" 
iso.3.6.1.4.1.77.1.2.25.1.1.9.73.87.65.77.95.83.82.86.50 = STRING: "IWAM_SRV2" 
iso.3.6.1.4.1.77.1.2.25.1.1.13.65.100.109.105.110.105.115.116.114.97.116.111.114 = STRING: "Administrator" 
iso.3.6.1.4.1.77.1.2.25.1.1.14.84.115.73.110.116.101.114.110.101.116.85.115.101.114 = STRING: "TsInternetUser" 

[+] SNMPWalk user enumeration for IP: 10.11.1.128 

Ich kann nicht erklären, warum subprocess.call schafft, bevor file_obj_array[i].write Zeilen in die Datei zu schreiben, auch wenn sie, nachdem sie in der for-Schleife kommt.

Irgendwelche Ideen würden helfen.

Danke!

Antwort

1

Sie haben Puffer zu leeren:

def run_snmpwalk(selection, live_list, file_obj_array): 
    # Rewind file 
    live_list.seek(0) 
    if selection == '1': 
     for line, file_obj in zip(live_list, file_obj_array): 
      tgt_host = line.strip("/\n") 
      file_obj.write('[+] SNMPWalk user enumeration for IP: {}\n'.format(tgt_host)) 
      file_obj.flush() 
      print('[+] Attempting to enumerate users from IP: {}'.format(tgt_host)) 
      exit_code = subprocess.call(['snmpwalk', '-c', 'public', '-v1', tgt_host, '1.3.6.1.4.1.77.1.2.25'], stdout=file_obj) 
      if exit_code == 0: 
       print('[+] Success') 
      else: 
       print('[+] Something went wrong while executing snmpwalk ') 
+0

Danke Daniel! Das hat das Problem behoben. – eviesca

Verwandte Themen