2013-02-26 778 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