Como administrador de sistema para um sistema VOS, você normalmente poderia se importar menos com o que outros anfitriões estão na sub-rede local. Você se preocupa com os gateways que estão configurados e, é claro, com qualquer host local que se comunica com seu sistema, mas os outros hosts estão abaixo de seu radar. Existem, no entanto, duas boas razões para saber quem são os vizinhos de sua rede. Primeiro, no caso de um problema de comunicação, você pode usar esses outros hosts para testar sua conexão de rede. Em segundo lugar, estes são os hosts que mais provavelmente serão as fontes de qualquer tipo de ataque baseado na rede.
Não é uma má idéia escanear a sub-rede local de vez em quando (digamos, todas as quartas-feiras de manhã) apenas para ver quem está por aí. O VOS não tem um scanner embutido - mas tem o comando ping, que quando rodeado por algumas linhas de uma macro de comando pode ser transformado em um scanner.
&set X 1
&while &X& < 255
ping 192.168.11.&X&
&set X (calc &X& + 1)
&end
Há 3 problemas com o uso do ping para procurar por anfitriões. Primeiro, ele não é muito eficiente. O tempo padrão é de 15 segundos e o comando tentará 4 vezes, então levará um minuto para procurar um host que não está lá ou não responde aos pings. Por sorte, o número de tentativas pode ser reduzido a 1 e o tempo de espera reduzido a 1 segundo. Isto ainda não é eficiente do ponto de vista de uma ferramenta de escaneamento dedicada, mas eu penso que é bom o suficiente para nossas necessidades.
&set X 1
&while &X& < 255
ping 192.168.11.&X& -count 1 -timeout 1
< &set X (calc &X& + 1)
&end
A segunda questão é que nem todos os anfitriões responderão aos pings. No entanto, isso não é um problema significativo, porque com apenas mais uma linha nossa macro de comando informará qual anfitrião enviou uma resposta da ARP. Os ARPs são usados para mapear um endereço IP em um endereço MAC Ethernet e o VOS deve saber o endereço MAC Ethernet antes de poder enviar o ping. Portanto, ele envia uma solicitação ARP para o host alvo e coloca os dados da resposta no cache ARP. Todos os hosts responderão à solicitação ARP com uma resposta ARP mesmo que não respondam à solicitação ping subseqüente. O comando arp exibirá a entrada solicitada, se houver.
&set X 1
&while &X& < 255
ping 192.168.11.&X& -count 1 -timeout 1
arp 192.168.11.&X&
&set X (calc &X& + 1)
&end
A macro de comando acima tem os pedidos e respostas de ping misturados com os dados do ARP, não é muito legível. A macro a seguir produz uma bela tabela de vizinhos em um arquivo chamado arp_scan.(data).out. Ela assume uma rede de classe C, ou seja, os primeiros 3 octetos são fixos e varredura para hosts de 1 a 254. Sugiro que seja executado como um processo iniciado.
& arp_scan.cm begins here
&
& arp_scan.cm
& version 1.0 09-04-06
&
&begin_parameters
BASE BASE:string,req
&end_parameters
&
& make sure extraneous stuff isn't echoed into the results file
&if (process_type) = 'batch' &then &do
<set_ready -format off
&echo no_command_lines
&end
&
&set X 1
&set_string FILE (process_dir)>arp_scan.out
&if (exists &FILE&)
&then delete_file &FILE& -no_ask
< &while &X& < 255
ping &BASE&.&X& -count 1 -timeout 1
attach_default_output &FILE& -append
arp &BASE&.&X&
detach_default_output
&set X (calc &X& + 1)
&end
display &FILE& -match &BASE& -no_header -output_path arp_scan.(date).out
&
& arp_scan ends here
O tempo limite do cache ARP é de 10 minutos, Se houver uma entrada com tempo inferior a 10 minutos você saberá que o módulo já estava se comunicando com aquele host antes de a varredura ser feita.
d arp_scan.09-04-06.out
%phx_vos#m16_mas>SysAdmin>Noah_Davids>arp_scan.09-04-06.out 09-04-06 15:20:30 m
164.152.77.11 00-00-A8-80-80-4A temp 9 mins
164.152.77.12 00-00-A8-80-81-EC temp 9 mins
164.152.77.100 00-0C-29-A9-85-44 temp 10 mins
164.152.77.103 00-04-0D-E8-B8-44 temp 2 mins
164.152.77.111 00-19-E7-8E-EA-38 temp 10 mins
164.152.77.114 00-04-0D-4A-DD-C6 temp 5 mins
164.152.77.116 00-04-0D-4A-BF-50 temp 10 mins
164.152.77.143 00-07-3B-CE-19-46 temp 8 mins
164.152.77.147 00-07-3B-91-BE-51 temp 8 mins
. . .
A terceira questão é a reclamação que você pode receber de seu administrador de rede por escanear ativamente a rede. Se eles se opuserem a esta atividade, você pode escaneá-la passivamente usando o comando do monitor de pacotes para capturar os pacotes transmitidos.
packet_monitor -numeric -filter -no_transmit -ip -mac_dst ff:ff:ff:ff:ff:ff -filter -no_transmit -arp
O uso desta técnica depende dos outros hosts da rede que comunicam e enviam transmissões ativamente enquanto o monitor de pacotes está rodando. Se você usar esta técnica, terá que deixar o packet_monitor funcionar por um bom tempo, quanto tempo dependerá de sua rede. Sugiro que você coloque o comando acima em uma macro de comando (packet_monitor_scan.cm) e o execute como um processo iniciado. Não se esqueça de rodar o processo como privilegiado.
Uma vez que você tenha uma pista, você precisará convertê-la em uma tabela de endereços utilizável. A macro a seguir fará isso (assume que o packet_monitor_scan foi um processo iniciado gerando um arquivo process_packet_monitor_scan.out).
& process_packet_monitor_scan.cm begins here
&
& packet_monitor_scan.cm
& version 1.0 09-04-06
& version 1.1 09-06-12 Added progress messages
& [email protected]
&
& make sure extraneous stuff isn't echoed into the results file
&if (process_type) = 'batch' &then &do
set_ready -format off
&echo no_command_lines
&end
&
&
attach_default_output (process_dir)>packet_monitor_scan
&set LINE 1
&set_string TEXT &+
(translate (contents packet_monitor_scan.out &LINE& -hold) '_' ' ')
&while (substr &TEXT& 1 7) ^= 'Process'
&set_string SOURCE '_'
&if (substr &TEXT& 1 9) = 'R_ARP_Req' &then &do
&set_string SOURCE (substr &TEXT& 39)
&end
&if (substr &TEXT& 1 9) = 'R_ARP_Rep' &then &do
&set_string SOURCE (substr &TEXT& 59)
&end
&if (substr &TEXT& 1 3) = 'R__' &then &do
&set_string SOURCE (substr &TEXT& 15)
&end
&set I (calc (index &SOURCE& '_') - 1)
&if &SOURCE& ^= '_' &then display_line (substr &SOURCE& 1 &I&)
&set LINE (calc &LINE& + 1)
&if (mod &LINE& 1000) = 0
&then &do
detach_default_output
display_line working on line &LINE&
attach_default_output (process_dir)>packet_monitor_scan -append
&end
&set_string TEXT (translate (contents packet_monitor_scan.out &LINE&) '_' ' ')
&end
detach_default_output
display_line doing sort
sort (process_dir)>packet_monitor_scan -duplicates_path (process_dir)>dups
copy_file &+
(process_dir)>packet_monitor_scan packet_monitor_scan.(date).out -delete
display_line packet_monitor_scan.(date).out created
&
& process_packet_monitor_scan.cm ends here
que produzirá a seguinte tabela.
d packet_monitor_scan.09-06-12.out
%phx_vos#m16_mas>SysAdmin>Noah_Davids>packet_monitor_scan.09-06-12.out 09-06-12
0.0.0.0
10.10.1.10
10.10.1.11
10.10.1.2
10.10.1.20
10.10.1.21
10.10.1.22
10.10.1.23
10.10.1.75
10.20.1.2
10.20.1.21
10.20.1.26
10.20.1.27
10.20.1.3
10.20.1.30
. . .