Поиск по блогу

среда, 20 августа 2014 г.

Не нашел, как решить проблему сброса Telnet в Windows, но в Linux все работает, даже примеры с telnetlib

Тупая проблема с Telnet в windows. Соединение закрывается. Тупая потому, что надо найти где и на что нажимать. Консоль просто подвисает... Здесь штук 20 ссылок - процесс поиска решения... Но вот я догадался попробовать telnet в Linux... и все заработало. Зачем вообще разбираться с тем, как при помощи Telnet имитировать заголовки и запросы браузера? Пожалуй только потому, что Python позволяет читать ответы и программировать разные варианты переговоров. В конце поста примеры с telnetlib и многочисленные ссылки, например, есть упоминание "...Another method is to use netcat" .
Мне еще предстоит принять решение, что и для чего лучше использовать. Пока задача мне видится такой: "Как притворяться браузером" и настраивать заголовки для пауков. Для этой цели лучше подходит scrapy shell. А вот когда мне понадобится анализировать заголовки ответов, потом настраивать работу паука в зависимости от ответа сервера..., здесь то и понадобится telnetlib. Полагаю, что для начала нужно было просто поюзать telnet..., но из-за проблем с windows пришлось сразу ""лезть вглубь"... В этом посте я постарался сохранить все ссылки, которые мне поались...
In []:
I've come up with a solution myself:

1) Type in: telent www.example.com 80 (as it is a connection to server)
2) Now you can see a blank screen of terminal. Don't worry! It's just a way Windows behaves 
   when you want to do something more than playing a computer game.
3) Type in: GET / HTTP/1.0 [press ENTER]
4) Type in: Host: www.example.com [press ENTER]
5) [press ENTER] to confirm
6) Now the requested data is displayed. That's it ;)

Нашел рекомендации от Microsoft HOW TO: Request a Web Page Through a Telnet Client

In []:
By default, the telnet client that is included with Microsoft Windows does not have the Local Echo option enabled, 
so the second command does not appear to be received by the server, although it is. To enable Local Echo, 
use one of the following methods after the first command:
Microsoft Windows 95, Microsoft Windows 98, Microsoft Windows Millennium Edition (Me), or Microsoft Windows NT 4.0

    On the Terminal menu, click Preferences.
    Click to select the Local Echo check box.

Microsoft Windows 2000 and Microsoft Windows XP

    Click Start, click Run, and then type telnet.exe to start the telnet program.
    Type the following command:For Windows 2000:
    set local_echo
    For Windows XP:
    set localecho
    Press the ENTER key one time on a blank line to quit the configuration and return to the telnet session.

Some telnet clients send only the carriage return (CR) character when you press ENTER or RETURN. If you are trying to connect 
from one of these clients, you must use a control-key combination to send the CRLF characters. In the Windows environment, 
hold down the ALT key, and then type the key sequence that corresponds to the appropriate character on the numeric keypad. 
To view the characters and corresponding numbers, see the following Microsoft Developer Network (MSDN) Web sites: 
    Character Set 0-127
http://msdn.microsoft.com/en-us/library/6hy0yb50(VS.85).aspx

А не попробовать ли для начала поработать в Linux?

In []:
 telnet> open ya.ru
Trying 213.180.193.3...
Trying 2a02:6b8::3...
telnet: Unable to connect to remote host: Network is unreachable
telnet> open ya.ru 80
Trying 213.180.193.3...
Connected to ya.ru.
Escape character is '^]'.
Get Connection closed by foreign host.
kiss@kali:~$ GET /index.html HTTP/1.0
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<!-- turing_cluster_prod -->
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>http.com</title>
    <meta name="keywords" content="http.com" />
    <meta name="description" content="http.com" />
    <meta name="robots" content="index, follow" />
    <meta name="revisit-after" content="10" />


    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 


    
    <script type="text/javascript">
      document.cookie = "jsc=1";
    </script>

  </head>
  <frameset rows="100%,*" frameborder="no" border="0" framespacing="0">
    <frame src="http://www.HTTP.com?epl=VwHmQU9sK9-sduiQfqvy02RfKxRDQuEUyV3805EfZ0UNwsssQfILkcdjc2MU03jRgFjXAeR1Zl8XO_asUKUgNEIhCh2BexRsvMphTSPUQ1g1JxNZVYl4EnTquk3FDlMWmeBRt7MUdQjRQEMMDRo1U21qQG2ahgyZpqknbepRDXUAIJDe778AAEB_AQAAQIBbCwAA2dcKxVlTJllBMTZoWkKNAAAA8A" name="http.com">
  </frameset>
  <noframes>
 <body><a href="http://www.HTTP.com?epl=VwHmQU9sK9-sduiQfqvy02RfKxRDQuEUyV3805EfZ0UNwsssQfILkcdjc2MU03jRgFjXAeR1Zl8XO_asUKUgNEIhCh2BexRsvMphTSPUQ1g1JxNZVYl4EnTquk3FDlMWmeBRt7MUdQjRQEMMDRo1U21qQG2ahgyZpqknbepRDXUAIJDe778AAEB_AQAAQIBbCwAA2dcKxVlTJllBMTZoWkKNAAAA8A">Click here to go to http.com</a>.</body>
  </noframes>
</html>kiss@kali:~$ status
Что это за ссылка в тексте?
&lt;body&gt; &lt;a href="http://www.HTTP.com?epl=VwHmQU9sK9-sduiQfqvy02RfKxRDQuEUyV3805EfZ0UNwsssQfILkcdjc2MU03jRgFjXAeR1Zl8XO_asUKUgNEIhCh2BexRsvMphTSPUQ1g1JxNZVYl4EnTquk3FDlMWmeBRt7MUdQjRQEMMDRo1U21qQG2ahgyZpqknbepRDXUAIJDe778AAEB_AQAAQIBbCwAA2dcKxVlTJllBMTZoWkKNAAAA8A"&gt;Click here to go to http.com&lt;/a&gt;. &lt;/body&gt;
Это не от того ли, что я задал древний протокол GET /index.html HTTP/1.0 подробности здесь: Эмуляция браузера через telnet, попробуем более современный вариант
In []:
kiss@kali:~$ telnet ya.ru 80
Trying 213.180.204.3...
Connected to ya.ru.
Escape character is '^]'.
GET /index.html HTTP/1.1 

HTTP/1.1 400 Bad Request
Server: nginx
Date: Tue, 19 Aug 2014 11:39:23 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 166
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
Connection closed by foreign host.
In []:
Все равно, серверу не нравится... Надо бы маскироваться под браузер и отправлять пачки заголовков. 

Как автоматизировать работу с сервером ... Creating a script for a Telnet session?

In []:
I've used various methods for scripting telnet sessions under unix, but the simplest one is probably a sequence of 
echo and sleep commands, with their output piped into telnet. 
Piping the output into another command is also a possibility.

Silly example

(echo password; echo "show ip route"; sleep 1; echo "quit" ) | telnet myrouter

This (basicallly) retrieves the routing table of a Cisco router.
Далее фрагменты кода, из этого длинного обсуждения, из которых ясно, что можно просто заранее написать строки для telnet
In []:
import telnetlib

user = "admin"
password = "\r"

def connect(A):
    tnA = telnetlib.Telnet(A)
    tnA.read_until('username: ', 3)
    tnA.write(user + '\n')
    tnA.read_until('password: ', 3)
    tnA.write(password + '\n')
    return tnA
def quit_telnet(tn)
    tn.write("bye\n")
    tn.write("quit\n")
In []:
#I like the example given by Active State using python. Here is the full link. 
#I added the simple log in part from the link but you can get the gist of what you could do.

import telnetlib

prdLogBox='142.178.1.3'
uid = 'uid'
pwd = 'yourpassword'

tn = telnetlib.Telnet(prdLogBox)
tn.read_until("login: ")
tn.write(uid + "\n")
tn.read_until("Password:")
tn.write(pwd + "\n")
tn.write("exit\n")
tn.close()
In []:
#his code snippet shows how to kich off a performance data gathering shell script with telnetlib and download 
#the data back to a local workstation with ftplib.

#automate a log grabber script with telnetlib and ftplib
# LOG_GRABBER is a shell script which will grab the logs from the production logs. 
# It may invoke other shell script, perl, shell, python etc to get its job done.
# A generic example: getAccountBalance, 500 
# this means getAccountBalance function takes about 500 ms to finish. 
# its end result is saved in LOG_OUT in any format you may import later for analysis.  

import telnetlib
from ftplib import FTP

# full path to them
LOG_GRABBER='/users/perfmon/grabLogs.sh'
LOG_OUT='logstats.txt'

prdLogBox='142.178.1.3'
uid = 'uid'
pwd = 'yourpassword'

# kick off the log grabber via telnet

tn = telnetlib.Telnet(prdLogBox)

tn.read_until("login: ")
tn.write(uid + "\n")

tn.read_until("Password:")
tn.write(pwd + "\n")

tn.write(LOG_GRABBER+"\n")

tn.write("exit\n")

tn.close()


# download the timing statistics to local via FTP 

ftp=FTP(prdLogBox)
ftp.login(uid,pwd)
#ftp.set_debuglevel(2)
logOut=open(LOG_OUT,'wb+')
ftp.retrbinary('RETR '+LOG_OUT, logOut.write)
ftp.quit()
logOut.close()
This recipe is used for performance monitoring in real procution environment. It is non-intrusive as the timing log (LOG4J actually) has been produced daily and copy to a differnt server during the non-rush hour.
Gather timing statistics in log daily from a production environment during the non rush hour, then download the results, put the results into a RDBMS, calculate the statistics such as min,max,avg,median, deviation.

Вопросы о том, на какие кнопки нажимать, так и остались нерешенными

Итак, в Kali все работает, а в Windows все подвисает. Надо бы не забыть написать комментарий к этому посту с рецептами подключения telnetlib в windows... но пока нам вполне хватит возможностей Linux дистрибутива.

Текстовый браузер netcat - альтернатива telnet

In []:
kiss@kali:~$ netcat -h
Usage:
 netcat [options...] hostname port
 netcat -l -p port [-s addr] [options...] [hostname] [port]

Recognized options are:
 -4                     Use only IPv4
 -6                     Use only IPv6
 -b, --bluetooth        Use Bluetooth (defaults to L2CAP protocol)
 --buffer-size=BYTES    Set buffer size
 --continuous           Continuously accept connections
                        (only in listen mode with --exec)
 --disable-nagle        Disable nagle algorithm for TCP connections
 -e, --exec=CMD         Exec command after connect
 --half-close           Handle network half-closes correctly
 -h, --help             Display help
 -l, --listen           Listen mode, for inbound connects
 --mtu=BYTES            Set MTU for network connection transmits
 -n                     Numeric-only IP addresses, no DNS
 --no-reuseaddr         Disable SO_REUSEADDR socket option
                        (only in listen mode)

 --nru=BYTES            Set NRU for network connection receives
 -p, --port=PORT        Local port
 -q, --hold-timeout=SEC1[:SEC2]
                        Set hold timeout(s) for local [and remote]
 --rcvbuf-size          Kernel receive buffer size for network sockets
 --recv-only            Only receive data, don't transmit
 -s, --address=ADDRESS  Local source address
 --sco                  Use SCO over Bluetooth
 --send-only            Only transmit data, don't receive
 --sndbuf-size          Kernel send buffer size for network sockets
 -t, --idle-timeout=SECONDS
                        Idle connection timeout
 -u, --udp              Require use of UDP
 -v                     Increase program verbosity
                        (call twice for max verbosity)
 --version              Display nc6 version information
 -w, --timeout=SECONDS  Timeout for connects/accepts
 -x, --transfer         File transfer mode
 -X, --rev-transfer     File transfer mode (reverse direction)
 -T, --ttl=TTL          TTL of outgoing IP packet
 -z                     Don't send any data (scan mode)


Посты чуть ниже также могут вас заинтересовать

1 комментарий:

  1. Putty нужно будет практиковать в любом случае, надо бы локальные подключения попробовать... Пока ясно, что telnet под windows - это засада.
    http://www.chiark.greenend.org.uk/~sgtatham/putty/

    Я не определился с тем, какой инструмент мне использовать для экспериментов с подключениями к сайтам... и сервисам.
    Наверное идеальный вариант - это сниффер, который пишет все мои переговоры. Но они громоздкие все, однако (это раз), потом, если я ушел в туннель, то фиг он чё напишет...
    Стрелять из пушки по воробьям..., когда надо будет быстро проверить какую-нибудь мааааленькую идейку...
    Надо бы не забыть еще и про
    http://www.chiark.greenend.org.uk/~sgtatham/putty/

    ОтветитьУдалить