在C上编写程序,使用libnet和libpcap来模拟RSH客户端并在服务器上注入我自己的命令,运行RSHD。
据我所知,命令应该在ACK数据包的“有效载荷”中,但在格式上,RSHD会将它传递给shell。
我应该如何组装数据包来实现这个目标?
答案 0 :(得分:1)
尝试从普通的rsh客户端获取网络数据包转储(使用tcpdump,tshark等)。
答案 1 :(得分:0)
可能涉及的对象。
通过rsh建立连接(syn-syn,ack-ack)后,连接进入ESTABLISH状态,所有请求都将被移动到另一个端口(因此rshd可以进一步处理更多连接)。 / p>
我的问题是如何在最后一个“ack”数据包中传递命令。 “ack”数据包本身就是一个数据包,因此命令可以在“有效载荷”字段中传输。
来自“男人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”。