使用Perl进行基本网络黑客技术

最近我一直在阅读Douglas Berdeaux所著的《使用Perl进行渗透测试》。这本书是在去年年底发布的,虽然Dave Cross给出了相当严厉的评论,但我迄今为止觉得它很有趣。我一边阅读一边在我的GitHub 仓库中编写和重构书中的脚本。以下是我学到的一些东西。

活动主机检测

如果你连接到了一个网络,知道同一网络中所有其他主机的IP地址很有帮助。这个脚本首先检测网络设备名称(或接受它作为参数),然后初始化一个数据包捕获对象

use strict;
use warnings;
use feature 'say';
use Net::ARP;
use Net::Address::IP::Local;
use Net::Frame::Device;
use Net::Frame::Dump::Online;
use Net::Frame::Simple;
use Net::Netmask;
use Net::Pcap ();

my $network_device_name = $ARGV[0] if @ARGV;

unless ($network_device_name)
{
  $network_device_name = Net::Pcap::pcap_lookupdev(\my $error_msg);
  die "pcap device lookup failed " . ($error_msg || '')
    if $error_msg || not defined $network_device_name;
}

my $device = Net::Frame::Device->new(dev => $network_device_name);

my $pcap = Net::Frame::Dump::Online->new(
  dev => $network_device_name,
  filter => 'arp and dst host ' . $device->ip,
  promisc => 0,
  unlinkOnStop => 1,
  timeoutOnNext => 10
);

然后它检测网关IP(网络控制器的IP地址)并向子网中的每个IP地址发送广播数据包。数据包捕获对象 $pcap 将检测任何响应。然后它打印出响应者的IP和MAC地址。

printf "Gateway IP: %s\nStarting scan\n", $device->gatewayIp;

$pcap->start;

for my $ip_address (Net::Netmask->new($device->subnet)->enumerate)
{
  Net::ARP::send_packet(
    $network_device_name,
    $device->ip,
    $ip_address,
    $device->mac,
    "ff:ff:ff:ff:ff:ff", # broadcast
    "request",
  );
}

until ($pcap->timeout)
{
  if (my $next = $pcap->next)
  {
    my $frame = Net::Frame::Simple->newFromDump($next);
    my $local_ip = Net::Address::IP::Local->public;
    my $frame_ip = $frame->ref->{ARP}->srcIp;
    my $frame_mac = $frame->ref->{ARP}->src;
    say "$frame_ip $frame_mac". ($local_ip eq $frame_ip ? ' (this machine)' : '');
  }
}
END { say "Exiting."; $pcap->stop }

如果我在我的家庭网络上运行这个脚本,我会得到以下输出

$ sudo $(which perl) livehost_scanner
Gateway IP: 192.168.1.1
Starting scan
Gateway IP: 192.168.1.1
Starting scan
192.168.1.1 10:0d:7f:81:31:c2
192.168.1.2 5c:c5:d4:47:0a:13 (this machine)
192.168.1.3 68:09:27:03:d0:35
Exiting.

从这个输出中,我可以推断出除了在192.168.1.1处的路由器外,还有一台机器连接到该网络,地址为192.168.1.4

指纹识别

现在我已识别出我网络上两个主机的地址,如果我是攻击者,我就会想尝试识别这些主机类型,以便确定针对它们使用哪种类型的攻击。

指纹识别主机的一种方式是使用它们的MAC地址。地址的前半部分是组织唯一标识符(OUI)。IEEE提供了一份文件,列出了所有授权的OUI及其制造商。因此,为了识别主机的网络设备的制造商,我们只需要在该文件中查找它们的OUI。这个脚本就能做到这一点

use strict;
use warnings;

my $target_mac = shift or die "Usage\n\t./id_target \n";

printf "Address: %s, MAC Manufacturer: %s\n",
  $target_mac, oui_lookup($target_mac);

sub oui_lookup
{
  my $mac_address = shift;
  $mac_address =~ s/:/-/g;
  my $oui = substr $mac_address, 0, 8;

  open (my $oui_file, '<', 'data/oui.txt') or die $!;
  while (my $line = <$oui_file>)
  {
    if($line =~ /$oui/i)
    {
      my ($address, $manufacturer_name) = split /\t+/, $line;
      return "$manufacturer_name";
      last;
    }
  }
  return "Unknown";
}

如果我在网关MAC地址上运行这个脚本,我可以识别出接入点的制造商

$ ./id_target 10:0d:7f:81:31:c2
Address: 10:0d:7f:81:31:c2, MAC Manufacturer: NETGEAR INC.,

Aha!所以接入点是由Netgear制造的。在我的网络上还检测到了一个地址为192.168.1.3的另一个主机。我也可以尝试对他们进行指纹识别

$ ./id_target 68:09:27:03:d0:35
Address: 68:09:27:03:d0:35, MAC Manufacturer: Apple

这是一台苹果机器。有了这些数据,我既可以尝试进一步指纹识别主机,也可以开始使用端口扫描或已知漏洞测试它们的弱点。一个很好的漏洞来源是exploit-db.com


这篇文章最初发表在PerlTricks.com上。

标签

David Farrell

David是一位专业程序员,他经常推文博客关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过在GitHub上打开问题或拉取请求来帮助我们。