在网上解决一些CTF挑战时,我遇到了需要暴力破解服务器的情况。这是我写的代码:
#!/bin/bash
for i in {0..9}{0..9}{0..9}{0..9}
do
echo "Now trying code.."
echo $i
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
done
这是令人难以置信地、缓慢地痛苦。我需要尝试从 1000 到 9999 的组合,每尝试 10 次大约需要 5 秒。然后,根据建议,我在此行末尾添加了“&”:
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &
而且,它在几秒钟内尝试了数百种组合。我很惊讶。有人可以向我解释一下其中的逻辑吗? “&”做了什么?
答案1
添加&
会产生一个后台进程。
如果您编写a; b
,它将运行 command a
,等待其完成,然后b
按顺序运行 command 。
如果你写a & b
,它将a
作为后台进程产生。它不会等待它完成,而是b
立即开始运行。它将同时运行。
您可以通过在 shell 中进行实验来了解它的作用。如果您已经X
安装,xterm
那么查看会发生什么是一个好方法:输入
$ xterm
将导致另一个终端窗口打开,第一个终端窗口将等待您关闭它。只有当你关闭它时,你才能拿回你的外壳。如果您输入
$ xterm &
然后它将在后台运行它,您将立即恢复 shell,同时窗口xterm
也将保持打开状态。
所以如果你写
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
它建立连接,发送字符串,将结果存储在文件中,并且仅然后继续下一个。
添加&
使其不再等待。它将最终或多或少同时运行所有一万个。
你的脚本似乎“结束”得更快,因为它可能在那段时间实际上没有完成。它刚刚创建了一万个后台作业,然后结束了前台作业。
这也意味着,就您而言,它将尝试打开万或多或少同时连接。根据另一端可以处理的情况,其中一些很可能会失败。不仅如此,还不能保证它们会按顺序运行,事实上它们几乎肯定不会,所以最终的结果/tmp/me/dump.txt
是谁都在猜测。
你检查一下输出是否正确?
答案2
nc (netcat) 命令成本高、时间长。它需要连接到远程服务器,发送数据,等待响应,然后返回。
通过使用 & ,您基本上是在后台进程中分叉该命令(称为“作业”)。就其本身而言,这并不会使它运行得更快。但这确实意味着您的循环不再被阻塞,并且已经可以进行下一次迭代(使用下一个 nc)。
所以基本上,加速是通过并行进行所有这些远程连接来实现的,否则它们将不得不等待前一个连接完成。
顺便说一句,根据您的终端,echo 命令也会减慢循环速度(它们有时需要等待,直到写入缓冲区中有空间)。