11

这个周末,有一场 CTF 兵棋推演,Secuinside CTF 2013 ( http://war.secuinside.com/ )

作为一名计算机安全爱好者,我研究了挑战,以及 CTF 结束后他们的解决方案。

挑战之一是在服务器上获取远程 shell,因为该服务器上正在运行一个名为“givemeshell”的守护程序。守护进程所做的是在选定的端口上保持一个套接字打开,比如说端口 12345。

当套接字接收到某些东西时,守护进程会获取前 5 个字符并在 shell 中启动它们。

例如,如果我 send cat file,守护程序将cat f在 shell 中启动命令。没有响应发送,所以我不知道命令的结果。

目标是读取包含标志的文件。

现在,有人给了我这个解决方案:

$ nc 1.2.3.4 12345
4<>a

$ nc 1.2.3.4 12345
sh<&4
sh>&4
cat flag
The flag is _FLAG_

我测试了这个解决方案并且它有效。但是在花了几个小时试图理解它之后,我仍然无法弄清楚它的作用以及它为什么起作用。我知道这是关于重定向某些东西...

有人可以向我解释吗?谢谢!

4

1 回答 1

9

4 是您的连接的文件描述符。

0是程序stdin,1是程序stdout,2是程序stderr,当你创建一个socket来监听连接时,它被分配给3,当它接受你的连接时,一个新的4号文件描述符被创建来处理这个连接。

4是你连接后门的文件描述符的ID,假设你是第一个连接的。

然后键入sh<&4. 它打开sh并告诉它应该直接从您的连接中获取所有输入。

现在您已经完全控制了 shell,因为sh接管了并且您发送的每个命令都由它直接解释。但是您仍然看不到任何输出!

然后你键入sh>&4打开一个新级别的sh里面另一个说它应该将所有输出推送到你的文件描述符。诀窍就完成了!双向沟通。

于 2013-05-27T14:13:39.970 回答