2013-02-26 983 views
2

对于与安全性,DNS缓存中毒和Kaminsky攻击有关的作业分配,我构建了一个使用Nemesis将数据包发送到本地DNS服务器的Perl脚本(这是所有在一个封闭的,仅主机的VMWare网络上完成)。我已经尽了一切努力来自动调用克星的过程。将二进制数据管道映射到来自perl变量的命令

我使用Perl专门选择随机DNS事务ID,将它们添加到我之前制作的DNS有效负载。现在,有效载荷不是DNS答案,而只是一个查询,所以我可以完善制作有效载荷的ID部分的方法,并将它推向Perl的克星。

我的代码目前是...

#!/usr/bin/perl 

use strict; 
use warnings; 

my $dnsId = int(rand(65535)); 

my $idString = sprintf("%x", $dnsId); 

if(length($idString) == 1){$idString = "000".$idString} 
elsif(length($idString) == 2){$idString = "00".$idString} 
elsif(length($idString) == 3){$idString = "0".$idString} 

my $payload = $idString."01000001000000000000037777770f646e737068697368696e676c61627303636f6d0000010001"; 

print(`echo "$payload" | nemesis udp -S10.1.3.1 -D10.1.3.100 -x53 -y33333 -P-`) 

是我遇到的问题是,克星读取数据作为一个字符串,这是当然的,回声在做什么。所以我需要做的是将数据作为二进制数据传给nemesis,而不是ASCII。我想我可以用pack()来编写一个二进制文件,然后用“cat/foo/bar/file | nemesis -...”来执行有效载荷,但这不是一个最佳解决方案,因为我不' t希望额外的IO时间成为我能够在(假设的,永远不会到达)收到真实响应之前尝试多少个恶意DNS答案的因素。

什么是我可以研究的一些方法,这将允许我以二进制格式将这些数据提供给克星?

+3

'my $ idString = sprintf(“%04x”,$ dnsId);''可以让你免于使用'if'。 – ikegami 2013-02-26 06:03:50

回答

4

首先,

print(`...`); 

简化为

system("..."); 

因为我们不再管了的nemesis,这意味着我们可以很容易地烟斗(如果你想两者都做,用IPC::Run3或。)

my @cmd = ('nemesis', 
    'udp', '-S10.1.3.1', '-D10.1.3.100', 
    '-x53', '-y33333', '-P-'); 

open(my $pipe, '|-', @cmd) 
    or die $!; 
binmode($pipe); 
print($pipe $payload); 
close($pipe); 

当然,你的代码' s $payload实际上并不包含有效负载,而是它的十六进制表示。你可以pack 'H*'整个事情,但我认为下面是一个更好的方法:

my $dnsId = int(rand(65536)); 

my $payload = pack('n H*', 
    $dnsId, '010000010000'. # 000000 
    '0000000003777777'.  # 000010 
    '0f646e7370686973'.  # 000020 
    '68696e676c616273'.  # 000030 
    '03636f6d00000100'.  # 000040 
    '01');     # 000050 

注意,我改变6553565536因此使其能够真正回归65535

+0

哇!就在我认为我在Perl上变得更好的时候。太棒了。谢谢! – Suki 2013-02-26 06:24:41