Передача команды оболочки демону RSH внутри пакета "ACK"
Написание программы на C, использование libnet и libpcap для олицетворения клиента RSH и ввода моей собственной команды на сервер, работающий под управлением RSHD.
Как я понял, команда должна быть в "полезной нагрузке" пакета ACK, но в формате, который RSHD передаст в оболочку.
Как мне собрать пакет, чтобы добиться этого?
2 ответа
Попробуйте получить дамп сетевых пакетов (с помощью tcpdump, tshark и т. Д.) С обычного клиента rsh.
Для предъявления по месту требования.
После установления соединения (syn-syn,ack-ack) через rsh, соединение переходит в состояние ESTABLISH, и все запросы будут перемещены на другой порт (так что rshd может обрабатывать больше соединений).
Моя проблема была в том, как передать команду в последнем пакете "ack". Пакет "ack" сам по себе является пакетом данных, поэтому команда может быть передана в поле "полезной нагрузки".
немного цитат из "man rshd":
The server reads characters from the socket up to a NUL (`\0') byte.
The resultant string is interpreted as an ASCII number, base 10.
3. If the number received in step 2 is non-zero, it is interpreted as
the port number of a secondary stream to be used for the stderr. A
second connection is then created to the specified port on the
client's machine.
...
5. A null terminated user name of at most 16 characters is retrieved on
the initial socket. This user name is interpreted as the user iden-
tity on the client's machine.
6. A null terminated user name of at most 16 characters is retrieved on
the initial socket. This user name is interpreted as a user iden-
tity to use on the server's machine.
7. A null terminated command to be passed to a shell is retrieved on
the initial socket. The length of the command is limited by the
upper bound on the size of the system's argument list.
Так. В #3 говорится, что первые символы до байта NUL интерпретируются как номер порта для вторичного соединения. Но мне не нужно было вторичное соединение, поэтому я поставил "0\0" в начале команды. Далее #5 и #6 задают имена пользователей компьютера клиента и компьютера сервера, разделенные NUL. Поэтому я поставил "0\0username1\0username1\0" И в #7 говорится, что там может быть команда с нулевым символом в конце, поэтому моя команда в итоге была "0\0username1\0username2\0command\0".