【问题标题】:Sockets not closing in Perl在 Perl 中未关闭的套接字
【发布时间】:2014-02-04 03:22:51
【问题描述】:

好吧,我做了一个简单的脚本来发送一个需要读取响应的数据包,如果响应是我正在寻找的,那么打印出来是好的,如果不是打印出来是坏的,现在如果 ip 是 vuln,那么该脚本有效并打印出它的漏洞。现在,如果它不是 vuln,那么脚本就会挂起并卡在发送 HEX 数据的有效负载上。

use IO::Socket;
use strict;

print "Connecting..\n";
my $socket = IO::Socket::INET->new(
    PeerAddr  => '23.113.161.164', # 38.124.108.67  <-- NON vuln ip for testing
    PeerPort  => 123,              # 23.113.161.164  <-- This IS a vuln ip!
    Proto => 'udp',
    Timeout => 1);
die "Error With Sockets!: $!\n" unless $socket;

print "Connected!\n";

my $payload = "\x97\x00\x00\x00\xAA\x00\x00\x00";
my $good = "\x97\x00\x00\x00";

$socket->send($payload) or die "Nothing got sent.";

my $data;
$socket->recv($data,4);
my $response = substr($data,0,8);
$response = reverse($response);
print $response;

if ($response == "\x97\x00\x00\x00") {
print "IP IS VULN\n";
} else {
print "IP IS NOT VULN\n";
exit;
}

示例错误:

使用非 vuln ip:

root@localhost:~# perl 2.pl
Connecting..
Connected!

(这就是卡住的地方)

使用 vuln ip:

root@localhost:~# perl 2.pl
Connecting..
Connected!
▒IP IS VULN

(如你所见)

这是脚本卡住的地方:

$socket->send($payload) or die "Nothing got sent.";

任何帮助将不胜感激。

【问题讨论】:

  • 始终使用use warnings;。您的代码有一个重大错误,这会发现。

标签: perl sockets


【解决方案1】:
  • use warnings;
  • 使用eq 进行字符串比较,使用== 进行数字比较
  • 您的代码在接收时挂起
  • recv() 默认情况下没有超时。致电setsockopt 并查看this thread 了解详情。
  • 最后,切勿在您的问题中发布其他人的实际 IP。

【讨论】:

  • 关于“最后,永远不要在您的问题中发布实际 IP。”为什么不?如果 OP 认为它们不敏感,最好将它们包含在内,这样我们就可以按原样运行他的代码!
  • 假设它们不是他的 IP。假设每个人和我叔叔都运行这段代码。假设机器在这些条件下行为不端和/或它从尝试此代码的极客那里收到大量数据包。你会拼写 D-O-S 吗?
  • 该节点每小时有 16 次查看。您认为其中有多少导致代码被执行?
  • OP 怎么知道?读者怎么知道?同样,假设代码中的二进制序列实际上重新启动或冻结了错误配置的服务器。假设每小时运行一个代码(即 1/16 运行/查看):在(比如)工资单 DBMS 上每小时重新启动一次对您来说听起来不错吗?
  • 常识,因为我纠正了你。 OP 能够每小时执行一次他的代码。
【解决方案2】:

如果您确实检查了它的挂起位置,我相信您会发现它正在挂起尝试接收数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多