2015-01-06 1 views
0

Я изучаю, как делать пентестинг с книгой. Одно из упражнений использует этот скрипт:Использование Python и Pexpect для возврата пароля хостинга localhost

import pexpect 

PROMPT = ['# ', '>>> ', '> ', '\$ '] 

def send_command(child, cmd): 
    child.sendline(cmd) 
    child.expect(PROMPT) 
    print child.before 

def connect(user, host, password): 
    ssh_newkey = 'Are you sure you want to continue connecting' 
    connStr = 'ssh ' + user + '@' + host 
    child = pexpect.spawn(connStr) 
    ret= child.expect([pexpect.TIMEOUT, ssh_newkey, \ 
     '[P|p]assword: ']) 
    if ret == 0: 
     print 'Error connecting' 
     return 
    if ret == 1: 
     child.sendline('yes') 
     ret = child.expect([pexpect.TIMEOUT, \ 
      '[P|p]assword: ']) 
     if ret == 0: 
      print 'Error connecting' 
      return 
    child.sendline(password) 
    child.expect(PROMPT) 
    return child 

def main(): 
    host = 'localhost' 
    user = 'root'  import pexpect 

PROMPT = ['# ', '>>> ', '> ', '\$ '] 

def send_command(child, cmd): 
    child.sendline(cmd) 
    child.expect(PROMPT) 
    print child.before 

def connect(user, host, password): 
    ssh_newkey = 'Are you sure you want to continue connecting' 
    connStr = 'ssh ' + user + '@' + host 
    child = pexpect.spawn(connStr) 
    ret= child.expect([pexpect.TIMEOUT, ssh_newkey, \ 
     '[P|p]assword: ']) 
    if ret == 0: 
     print 'Error connecting' 
     return 
    if ret == 1: 
     child.sendline('yes') 
     ret = child.expect([pexpect.TIMEOUT, \ 
      '[P|p]assword: ']) 
     if ret == 0: 
      print 'Error connecting' 
      return 
    child.sendline(password) 
    child.expect(PROMPT) 
    return child 

def main(): 
    host = 'localhost' 
    user = 'root' 
    password = 'g' 
    child = connect(user, host, password) 
    send_command(child, 'cat /etc/shadow | grep root') 

if __name__ == '__main__': 
    main() 
    password = 'g' 
    child = connect(user, host, password) 
    send_command(child, 'cat /etc/shadow | grep root') 

if __name__ == '__main__': 
    main() 

Я посмотрел в документации Ubuntu, чтобы узнать, как создать ключи для сервера, так что я использовал эти команды в терминале:

mkdir ~/.ssh 
chmod 700 ~/.ssh 
ssh-keygen -t rsa 

I затем приступил к запуску ssh-сервера с service ssh start

Далее я запускаю сценарий. Он не возвращает мой хешированный пароль root, как говорят книги. Скорее всего, я получаю всплывающее окно OpenSSH, запрашивающее пароль суперпользователя, и следующий вывод:

Traceback (most recent call last): 
    File "local.py", line 38, in <module> 
    main() 
    File "local.py", line 34, in main 
    child = connect(user, host, password) 
    File "local.py", line 27, in connect 
    child.expect(PROMPT) 
    File "/usr/lib/python2.7/dist-packages/pexpect/__init__.py", line 1418, in expect 
    timeout, searchwindowsize) 
    File "/usr/lib/python2.7/dist-packages/pexpect/__init__.py", line 1433, in expect_list 
    timeout, searchwindowsize) 
    File "/usr/lib/python2.7/dist-packages/pexpect/__init__.py", line 1535, in expect_loop 
    raise TIMEOUT(str(err) + '\n' + str(self)) 
pexpect.TIMEOUT: Timeout exceeded. 
<pexpect.spawn object at 0x7f2ca63ca7d0> 
version: 3.2 
command: /usr/bin/ssh 
args: ['/usr/bin/ssh', '[email protected]'] 
searcher: <pexpect.searcher_re object at 0x7f2ca63ca850> 
buffer (last 100 chars): "\r\nPermission denied, please try again.\r\r\[email protected]'s password: " 
before (last 100 chars): "\r\nPermission denied, please try again.\r\r\[email protected]'s password: " 
after: <class 'pexpect.TIMEOUT'> 
match: None 
match_index: None 
exitstatus: None 
flag_eof: False 
pid: 4562 
child_fd: 3 
closed: False 
timeout: 30 
delimiter: <class 'pexpect.EOF'> 
logfile: None 
logfile_read: None 
logfile_send: None 
maxread: 2000 
ignorecase: False 
searchwindowsize: None 
delaybeforesend: 0.05 
delayafterclose: 0.1 
delayafterterminate: 0.1 

Я буду честен, я до сих пор в значительной степени новичок в Python, хотя я играл с это уже несколько недель. Прошу прощения, если это глупый вопрос. И да, мой пароль - это просто «g».

ответ

0

Вы получаете сообщение об ошибке при попытке SSH в машине как root @ localhost. Ваша найдена ошибка в выводе команды

buffer (last 100 chars): "\r\nPermission denied, please try again.\r\r\[email protected]'s password: " 
before (last 100 chars): "\r\nPermission denied, please try again.\r\r\[email protected]'s password: " 

Это типичная ошибка, которую вы получите при попытке войти в машину с неправильным комбо имя пользователя/пароль.

От терминала, попробуйте SSH'ing в поле, чтобы увидеть, разрешен ли 1) root ssh, и 2) если комбинация имени пользователя и пароля на самом деле правильная.


В будущем paramiko является библиотека SSH для Python, который может войти в машины, выполнять команды и чтения/записи файлов через SFTP. Очевидно, это просто обучение из книги, но подумайте о том, чтобы писать реальные вещи с парамико.

Вот что тот же самый пример выглядит в paramiko:

import paramiko 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
try: 
    client.connect('localhost', username='root', password='g') 
    stdin, stdout, stderr = client.exec_command('/bin/cat /etc/shadow') 
    # Now, you can read from stdout (if the command succeeded), or stderr (if it failed) 
    shadow_file_contents = stdout.readlines() 
    if shadow_file_contents: 
     print '/etc/shadow: {0}'.format(''.join(line for line in shadow_file_contents if 'root' in line)) 
    else: # No contents in the file. Show the user why... 
     print 'errors: {0}'.format(''.join(stderr.readlines())) 
except (paramiko.BadAuthenticationType) as why: # Invalid un/pw 
    print 'Unable to login using given username/password to this host' 

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

  • Нет связанных вопросов^_^