Как имитировать stdin в сценарии оболочки и проверить ответ stdout - PullRequest
0 голосов
/ 04 августа 2020

Сейчас я делаю упражнения по проводам, и я застрял в одном месте, или, точнее говоря, я хотел бы решить lvl, поступая иначе, чем то, что я мог бы найти в Интернете.

Я должен передать пароль команде c с пин-кодом, и в соответствии с этим у меня есть ответ, написанный на stdout (с указанием правильности это или неправильности). Передача выполняется с исправлением первой части и пин-кодом между 0000 и 9999.

Дело в том, что, делая это с помощью строки cmd, это примерно так: echo "my pass" "4-digits pin code" | nc localhost 30002 Тогда у меня есть ответ в зависимости от того, PIN-код правильный или нет.

Что я хотел бы сделать в качестве сценария (возможно, я полностью ошибаюсь с самого первого шага): я проверяю с человеком, что n c может принять запуск сценарий с параметром -e. Поэтому я решил создать сценарий, который будет делать следующее:

Я вызываю локальный хост порта: nc localhost 30002 -e "myScript" В моем сценарии я хотел бы рекурсивно повторить комбинацию прохода и 4 di git закрепите на stdin, чтобы сервер отвечал правильно или неправильно. Затем я проверяю стандартный вывод (где, как я полагаю, я могу прочитать правильный или неправильный ответ с сервера), чтобы определить, нахожу ли я правильный пин-код.

Просто хочу сказать, я знаю только неправильный ответ, который я могу не знаю, какой может быть правильный ответ.

Вот код, который я пытался построить (не пламенейте, пожалуйста, я новенький :)):

#!/bin/bash                                                                                                                                          
 
pwd=UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
 
#nc localhost 30002
 
for i in {0001..9999}
do
    cat <<< "$pwd $i" #Here I try to simulate a input on stdin
    cat 1> /tmp/Frack/password
        if ( grep -o "Wrong" { "$(</dev/fd/3)"; } 3<&1 ) #Here I try to check if there's an answer from the server, and if it contains the word "Wrong"
    then
        continue
    else
        echo "pass trouvé : $i" > /tmp/Frack/password #If I found the right pin code, I write it within this file (on which I gave the right access to be able to write on it).
        break
    fi
  
 done

I добавьте пример того, что я должен прочитать в качестве ответа на мой звонок на сервер с неправильным пин-кодом: «Я проверяю пин-код для пользователя bandit25. Пожалуйста, введите пароль для пользователя bandit24 и секретный пин-код на одном через пробел. Неправильно! Введите правильный пин-код. Повторите попытку. "

Спасибо.

1 Ответ

0 голосов
/ 04 августа 2020

Вы могли:

#!/bin/bash
# note stdout is connected to remote end
# note stdin reads from remote end
for i in {0001..9999}; do
    # hacky hack to output to controlling terminal
    echo "testing $i" > /dev/tty
    # output the password to stdout
    printf "%s\n" "password $i"
    # read one line from stdin
    if ! IFS= read -r line; then
         echo "error" > /dev/tty
         exit 1
    fi
    # if the word "wrong" case insensitive is missing from readed line
    if ! grep -i -q 'wrong' <<<"$line"; then
        # then we are finished
        echo "I'm in" > /dev/tty
        exit 0
    fi
done

, тогда я могу:

$ nc -e /tmp/1.sh localhost 10000
testing 0001
testing 0002
testing 0003
testing 0004
I'm in
< --- snip -------- >
$ nc -v -v -l localhost -p 10000 <<<$' wrong \n wrong \n wrong \n ok'
Listening on any address 10000 (ndmp)
Connection from 127.0.0.1:39152
password 0001
password 0002
password 0003
password 0004
read(net): Connection reset by peer
...