ruby-nmap 0.10.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.document +1 -0
  3. data/.editorconfig +11 -0
  4. data/.github/workflows/ruby.yml +31 -0
  5. data/ChangeLog.md +118 -71
  6. data/Gemfile +11 -5
  7. data/LICENSE.txt +1 -1
  8. data/README.md +88 -50
  9. data/Rakefile +5 -0
  10. data/UPGRADING.md +47 -0
  11. data/gemspec.yml +5 -5
  12. data/lib/nmap/command.rb +765 -0
  13. data/lib/nmap/version.rb +1 -1
  14. data/lib/nmap/xml/address.rb +38 -0
  15. data/lib/nmap/xml/cpe/url.rb +80 -0
  16. data/lib/nmap/xml/cpe.rb +47 -0
  17. data/lib/nmap/xml/hop.rb +22 -0
  18. data/lib/nmap/xml/host.rb +546 -0
  19. data/lib/nmap/xml/host_script.rb +26 -0
  20. data/lib/nmap/xml/hostname.rb +44 -0
  21. data/lib/nmap/xml/ip_id_sequence.rb +26 -0
  22. data/lib/nmap/xml/os.rb +131 -0
  23. data/lib/nmap/xml/os_class.rb +86 -0
  24. data/lib/nmap/xml/os_match.rb +22 -0
  25. data/lib/nmap/xml/port.rb +114 -0
  26. data/lib/nmap/xml/postscript.rb +26 -0
  27. data/lib/nmap/xml/prescript.rb +26 -0
  28. data/lib/nmap/xml/run_stat.rb +22 -0
  29. data/lib/nmap/xml/scan.rb +38 -0
  30. data/lib/nmap/xml/scan_task.rb +55 -0
  31. data/lib/nmap/xml/scanner.rb +22 -0
  32. data/lib/nmap/xml/script.rb +110 -0
  33. data/lib/nmap/xml/scripts.rb +33 -0
  34. data/lib/nmap/xml/sequence.rb +52 -0
  35. data/lib/nmap/xml/service.rb +172 -0
  36. data/lib/nmap/xml/status.rb +22 -0
  37. data/lib/nmap/xml/tcp_sequence.rb +48 -0
  38. data/lib/nmap/xml/tcp_ts_sequence.rb +26 -0
  39. data/lib/nmap/xml/traceroute.rb +73 -0
  40. data/lib/nmap/xml/uptime.rb +22 -0
  41. data/lib/nmap/xml.rb +31 -44
  42. data/spec/command_spec.rb +726 -0
  43. data/spec/fixtures/down_host_scan.xml +16 -0
  44. data/spec/{address_spec.rb → xml/address_spec.rb} +2 -2
  45. data/spec/{cpe → xml/cpe}/url_spec.rb +1 -1
  46. data/spec/{cpe_examples.rb → xml/cpe_examples.rb} +1 -1
  47. data/spec/{hop_spec.rb → xml/hop_spec.rb} +2 -2
  48. data/spec/{host_script_spec.rb → xml/host_script_spec.rb} +2 -2
  49. data/spec/{host_spec.rb → xml/host_spec.rb} +8 -8
  50. data/spec/{hostname_spec.rb → xml/hostname_spec.rb} +2 -2
  51. data/spec/{ip_id_sequence_spec.rb → xml/ip_id_sequence_spec.rb} +3 -3
  52. data/spec/{os_class_spec.rb → xml/os_class_spec.rb} +3 -3
  53. data/spec/{os_match_spec.rb → xml/os_match_spec.rb} +2 -2
  54. data/spec/{os_spec.rb → xml/os_spec.rb} +3 -3
  55. data/spec/{port_spec.rb → xml/port_spec.rb} +4 -5
  56. data/spec/{postscript_spec.rb → xml/postscript_spec.rb} +2 -2
  57. data/spec/{prescript_spec.rb → xml/prescript_spec.rb} +2 -2
  58. data/spec/{run_stat_spec.rb → xml/run_stat_spec.rb} +2 -2
  59. data/spec/{scan_spec.rb → xml/scan_spec.rb} +2 -2
  60. data/spec/{scan_task_spec.rb → xml/scan_task_spec.rb} +6 -6
  61. data/spec/{scanner_spec.rb → xml/scanner_spec.rb} +3 -3
  62. data/spec/xml/script_spec.rb +137 -0
  63. data/spec/xml/scripts_examples.rb +19 -0
  64. data/spec/{sequence_examples.rb → xml/sequence_examples.rb} +1 -0
  65. data/spec/{service_spec.rb → xml/service_spec.rb} +31 -5
  66. data/spec/{status_spec.rb → xml/status_spec.rb} +2 -2
  67. data/spec/{tcp_sequence_spec.rb → xml/tcp_sequence_spec.rb} +3 -3
  68. data/spec/{tcp_ts_sequence_spec.rb → xml/tcp_ts_sequence_spec.rb} +3 -3
  69. data/spec/{traceroute_spec.rb → xml/traceroute_spec.rb} +3 -3
  70. data/spec/{uptime_spec.rb → xml/uptime_spec.rb} +2 -2
  71. data/spec/xml_spec.rb +73 -44
  72. metadata +72 -66
  73. data/.travis.yml +0 -16
  74. data/lib/nmap/address.rb +0 -34
  75. data/lib/nmap/cpe/url.rb +0 -78
  76. data/lib/nmap/cpe.rb +0 -45
  77. data/lib/nmap/hop.rb +0 -20
  78. data/lib/nmap/host.rb +0 -587
  79. data/lib/nmap/host_script.rb +0 -18
  80. data/lib/nmap/hostname.rb +0 -42
  81. data/lib/nmap/ip_id_sequence.rb +0 -24
  82. data/lib/nmap/os.rb +0 -127
  83. data/lib/nmap/os_class.rb +0 -82
  84. data/lib/nmap/os_match.rb +0 -18
  85. data/lib/nmap/port.rb +0 -110
  86. data/lib/nmap/postscript.rb +0 -16
  87. data/lib/nmap/prescript.rb +0 -16
  88. data/lib/nmap/program.rb +0 -102
  89. data/lib/nmap/run_stat.rb +0 -20
  90. data/lib/nmap/scan.rb +0 -34
  91. data/lib/nmap/scan_task.rb +0 -53
  92. data/lib/nmap/scanner.rb +0 -18
  93. data/lib/nmap/scripts.rb +0 -71
  94. data/lib/nmap/sequence.rb +0 -50
  95. data/lib/nmap/service.rb +0 -170
  96. data/lib/nmap/status.rb +0 -18
  97. data/lib/nmap/task.rb +0 -387
  98. data/lib/nmap/tcp_sequence.rb +0 -46
  99. data/lib/nmap/tcp_ts_sequence.rb +0 -22
  100. data/lib/nmap/traceroute.rb +0 -71
  101. data/lib/nmap/uptime.rb +0 -20
  102. data/spec/scripts_examples.rb +0 -35
  103. data/spec/task_spec.rb +0 -150
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE nmaprun>
3
+ <?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
4
+ <!-- Nmap 7.93 scan initiated Thu Nov 3 05:44:42 2022 as: nmap -v -sS -oX spec/fixtures/down_host_scan.xml 225.0.0.1 -->
5
+ <nmaprun scanner="nmap" args="nmap -v -sS -oX spec/fixtures/down_host_scan.xml 225.0.0.1" start="1667479482" startstr="Thu Nov 3 05:44:42 2022" version="7.93" xmloutputversion="1.05">
6
+ <scaninfo type="syn" protocol="tcp" numservices="1000" services="1,3-4,6-7,9,13,17,19-26,30,32-33,37,42-43,49,53,70,79-85,88-90,99-100,106,109-111,113,119,125,135,139,143-144,146,161,163,179,199,211-212,222,254-256,259,264,280,301,306,311,340,366,389,406-407,416-417,425,427,443-445,458,464-465,481,497,500,512-515,524,541,543-545,548,554-555,563,587,593,616-617,625,631,636,646,648,666-668,683,687,691,700,705,711,714,720,722,726,749,765,777,783,787,800-801,808,843,873,880,888,898,900-903,911-912,981,987,990,992-993,995,999-1002,1007,1009-1011,1021-1100,1102,1104-1108,1110-1114,1117,1119,1121-1124,1126,1130-1132,1137-1138,1141,1145,1147-1149,1151-1152,1154,1163-1166,1169,1174-1175,1183,1185-1187,1192,1198-1199,1201,1213,1216-1218,1233-1234,1236,1244,1247-1248,1259,1271-1272,1277,1287,1296,1300-1301,1309-1311,1322,1328,1334,1352,1417,1433-1434,1443,1455,1461,1494,1500-1501,1503,1521,1524,1533,1556,1580,1583,1594,1600,1641,1658,1666,1687-1688,1700,1717-1721,1723,1755,1761,1782-1783,1801,1805,1812,1839-1840,1862-1864,1875,1900,1914,1935,1947,1971-1972,1974,1984,1998-2010,2013,2020-2022,2030,2033-2035,2038,2040-2043,2045-2049,2065,2068,2099-2100,2103,2105-2107,2111,2119,2121,2126,2135,2144,2160-2161,2170,2179,2190-2191,2196,2200,2222,2251,2260,2288,2301,2323,2366,2381-2383,2393-2394,2399,2401,2492,2500,2522,2525,2557,2601-2602,2604-2605,2607-2608,2638,2701-2702,2710,2717-2718,2725,2800,2809,2811,2869,2875,2909-2910,2920,2967-2968,2998,3000-3001,3003,3005-3007,3011,3013,3017,3030-3031,3052,3071,3077,3128,3168,3211,3221,3260-3261,3268-3269,3283,3300-3301,3306,3322-3325,3333,3351,3367,3369-3372,3389-3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,3689-3690,3703,3737,3766,3784,3800-3801,3809,3814,3826-3828,3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,4000-4006,4045,4111,4125-4126,4129,4224,4242,4279,4321,4343,4443-4446,4449,4550,4567,4662,4848,4899-4900,4998,5000-5004,5009,5030,5033,5050-5051,5054,5060-5061,5080,5087,5100-5102,5120,5190,5200,5214,5221-5222,5225-5226,5269,5280,5298,5357,5405,5414,5431-5432,5440,5500,5510,5544,5550,5555,5560,5566,5631,5633,5666,5678-5679,5718,5730,5800-5802,5810-5811,5815,5822,5825,5850,5859,5862,5877,5900-5904,5906-5907,5910-5911,5915,5922,5925,5950,5952,5959-5963,5987-5989,5998-6007,6009,6025,6059,6100-6101,6106,6112,6123,6129,6156,6346,6389,6502,6510,6543,6547,6565-6567,6580,6646,6666-6669,6689,6692,6699,6779,6788-6789,6792,6839,6881,6901,6969,7000-7002,7004,7007,7019,7025,7070,7100,7103,7106,7200-7201,7402,7435,7443,7496,7512,7625,7627,7676,7741,7777-7778,7800,7911,7920-7921,7937-7938,7999-8002,8007-8011,8021-8022,8031,8042,8045,8080-8090,8093,8099-8100,8180-8181,8192-8194,8200,8222,8254,8290-8292,8300,8333,8383,8400,8402,8443,8500,8600,8649,8651-8652,8654,8701,8800,8873,8888,8899,8994,9000-9003,9009-9011,9040,9050,9071,9080-9081,9090-9091,9099-9103,9110-9111,9200,9207,9220,9290,9415,9418,9485,9500,9502-9503,9535,9575,9593-9595,9618,9666,9876-9878,9898,9900,9917,9929,9943-9944,9968,9998-10004,10009-10010,10012,10024-10025,10082,10180,10215,10243,10566,10616-10617,10621,10626,10628-10629,10778,11110-11111,11967,12000,12174,12265,12345,13456,13722,13782-13783,14000,14238,14441-14442,15000,15002-15004,15660,15742,16000-16001,16012,16016,16018,16080,16113,16992-16993,17877,17988,18040,18101,18988,19101,19283,19315,19350,19780,19801,19842,20000,20005,20031,20221-20222,20828,21571,22939,23502,24444,24800,25734-25735,26214,27000,27352-27353,27355-27356,27715,28201,30000,30718,30951,31038,31337,32768-32785,33354,33899,34571-34573,35500,38292,40193,40911,41511,42510,44176,44442-44443,44501,45100,48080,49152-49161,49163,49165,49167,49175-49176,49400,49999-50003,50006,50300,50389,50500,50636,50800,51103,51493,52673,52822,52848,52869,54045,54328,55055-55056,55555,55600,56737-56738,57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,64680,65000,65129,65389"/>
7
+ <verbose level="1"/>
8
+ <debugging level="0"/>
9
+ <taskbegin task="ARP Ping Scan" time="1667479482"/>
10
+ <taskend task="ARP Ping Scan" time="1667479484" extrainfo="1 total hosts"/>
11
+ <host><status state="down" reason="no-response" reason_ttl="0"/>
12
+ <address addr="225.0.0.1" addrtype="ipv4"/>
13
+ </host>
14
+ <runstats><finished time="1667479484" timestr="Thu Nov 3 05:44:44 2022" summary="Nmap done at Thu Nov 3 05:44:44 2022; 1 IP address (0 hosts up) scanned in 1.47 seconds" elapsed="1.47" exit="success"/><hosts up="0" down="1" total="1"/>
15
+ </runstats>
16
+ </nmaprun>
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/address'
2
+ require 'nmap/xml/address'
3
3
 
4
- describe Address do
4
+ describe Nmap::XML::Address do
5
5
  describe "#to_s" do
6
6
  let(:addr) { '127.0.0.1' }
7
7
 
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe CPE::URL do
3
+ describe Nmap::XML::CPE::URL do
4
4
  describe "parse" do
5
5
  context "when the URL does not start with 'cpe:'" do
6
6
  it "should raise an ArgumentError" do
@@ -6,6 +6,6 @@ shared_examples_for "CPE" do
6
6
  it { is_expected.not_to be_empty }
7
7
 
8
8
  it "should contain CPE URLs" do
9
- expect(subject).to all(be_kind_of(CPE::URL))
9
+ expect(subject).to all(be_kind_of(Nmap::XML::CPE::URL))
10
10
  end
11
11
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/hop'
2
+ require 'nmap/xml/hop'
3
3
 
4
- describe Hop do
4
+ describe Nmap::XML::Hop do
5
5
  describe "#to_s" do
6
6
  subject do
7
7
  described_class.new('10.0.0.1', nil, '1', '3.38')
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
- require 'nmap/host_script'
2
+ require 'nmap/xml/host_script'
3
3
 
4
- describe HostScript do
4
+ describe Nmap::XML::HostScript do
5
5
  pending "need to generate nmap XML output containing hostscript elements"
6
6
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
- require 'scripts_examples'
2
+ require 'xml/scripts_examples'
3
3
 
4
4
  require 'nmap/xml'
5
- require 'nmap/host'
5
+ require 'nmap/xml/host'
6
6
 
7
- describe Host do
7
+ describe Nmap::XML::Host do
8
8
  subject { @xml.hosts.first }
9
9
 
10
10
  describe "#start_time" do
@@ -24,7 +24,7 @@ describe Host do
24
24
  subject { super().uptime }
25
25
 
26
26
  it "should return an Uptime object" do
27
- expect(subject).to be_kind_of(Uptime)
27
+ expect(subject).to be_kind_of(Nmap::XML::Uptime)
28
28
  end
29
29
 
30
30
  it "should parse the seconds attribute" do
@@ -39,19 +39,19 @@ describe Host do
39
39
  describe "#tcp_sequence" do
40
40
  subject { super().tcp_sequence }
41
41
 
42
- it { is_expected.to be_kind_of(TcpSequence) }
42
+ it { is_expected.to be_kind_of(Nmap::XML::TcpSequence) }
43
43
  end
44
44
 
45
45
  describe "#ip_ip_sequence" do
46
46
  subject { super().ip_id_sequence }
47
47
 
48
- it { is_expected.to be_kind_of(IpIdSequence) }
48
+ it { is_expected.to be_kind_of(Nmap::XML::IpIdSequence) }
49
49
  end
50
50
 
51
51
  describe "#tcp_ts_sequence" do
52
52
  subject { super().tcp_ts_sequence }
53
53
 
54
- it { is_expected.to be_kind_of(TcpTsSequence) }
54
+ it { is_expected.to be_kind_of(Nmap::XML::TcpTsSequence) }
55
55
  end
56
56
 
57
57
  describe "#status" do
@@ -149,7 +149,7 @@ describe Host do
149
149
  subject { super().os }
150
150
 
151
151
  it { is_expected.not_to be_nil }
152
- it { is_expected.to be_kind_of(OS) }
152
+ it { is_expected.to be_kind_of(Nmap::XML::OS) }
153
153
  end
154
154
 
155
155
  describe "#ports" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/hostname'
2
+ require 'nmap/xml/hostname'
3
3
 
4
- describe Hostname do
4
+ describe Nmap::XML::Hostname do
5
5
  let(:name) { 'scanme.nmap.org' }
6
6
 
7
7
  describe "#user?" do
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'sequence_examples'
2
+ require 'xml/sequence_examples'
3
3
 
4
- require 'nmap/ip_id_sequence'
4
+ require 'nmap/xml/ip_id_sequence'
5
5
 
6
- describe IpIdSequence do
6
+ describe Nmap::XML::IpIdSequence do
7
7
  subject { @xml.hosts.first.ip_id_sequence }
8
8
 
9
9
  describe "#description" do
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
- require 'cpe_examples'
2
+ require 'xml/cpe_examples'
3
3
 
4
- require 'nmap/os'
4
+ require 'nmap/xml/os'
5
5
  require 'cgi'
6
6
 
7
- describe OS do
7
+ describe Nmap::XML::OS do
8
8
  subject { @xml.hosts.first.os.classes.first }
9
9
 
10
10
  describe "#type" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/os_match'
2
+ require 'nmap/xml/os_match'
3
3
 
4
- describe OSMatch do
4
+ describe Nmap::XML::OSMatch do
5
5
  describe "#to_s" do
6
6
  let(:name) { 'Linux 2.6.39' }
7
7
  let(:accuracy) { 97 }
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
- require 'nmap/os'
3
+ require 'nmap/xml/os'
4
4
  require 'cgi'
5
5
 
6
- describe OS do
6
+ describe Nmap::XML::OS do
7
7
  subject { @xml.hosts.first.os }
8
8
 
9
9
  describe "#classes" do
@@ -12,7 +12,7 @@ describe OS do
12
12
  it { is_expected.not_to be_empty }
13
13
 
14
14
  it "should return OSClass objects" do
15
- expect(subject).to all(be_kind_of(OSClass))
15
+ expect(subject).to all(be_kind_of(Nmap::XML::OSClass))
16
16
  end
17
17
  end
18
18
 
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'scripts_examples'
2
+ require 'xml/scripts_examples'
3
3
 
4
- require 'nmap/port'
4
+ require 'nmap/xml/port'
5
5
 
6
- describe Port do
6
+ describe Nmap::XML::Port do
7
7
  subject { @xml.hosts.first.ports.first }
8
8
 
9
9
  describe "#protocol" do
@@ -40,12 +40,11 @@ describe Port do
40
40
  subject { super().service }
41
41
 
42
42
  it "should return a Service object" do
43
- expect(subject).to be_kind_of(Service)
43
+ expect(subject).to be_kind_of(Nmap::XML::Service)
44
44
  end
45
45
  end
46
46
 
47
47
  include_examples "#scripts"
48
- include_examples "#script_data"
49
48
 
50
49
  describe "#inspect" do
51
50
  it "should include the number" do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
- require 'nmap/postscript'
2
+ require 'nmap/xml/postscript'
3
3
 
4
- describe Postscript do
4
+ describe Nmap::XML::Postscript do
5
5
  pending "need to generate nmap XML output containing postscript elements"
6
6
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
- require 'nmap/prescript'
2
+ require 'nmap/xml/prescript'
3
3
 
4
- describe Prescript do
4
+ describe Nmap::XML::Prescript do
5
5
  pending "need to generate nmap XML output containing prescript elements"
6
6
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/run_stat'
2
+ require 'nmap/xml/run_stat'
3
3
 
4
- describe RunStat do
4
+ describe Nmap::XML::RunStat do
5
5
  subject { @xml.run_stats.first }
6
6
 
7
7
  describe "#to_s" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/scan'
2
+ require 'nmap/xml/scan'
3
3
 
4
- describe Scan do
4
+ describe Nmap::XML::Scan do
5
5
  let(:type) { :syn }
6
6
  let(:protocol) { :tcp }
7
7
 
@@ -1,19 +1,19 @@
1
1
  require 'spec_helper'
2
- require 'nmap/scan_task'
2
+ require 'nmap/xml/scan_task'
3
3
 
4
- describe ScanTask do
4
+ describe Nmap::XML::ScanTask do
5
5
  let(:name) { 'SYN Stealth Scan' }
6
6
  let(:end_time) { Time.now }
7
7
  let(:duration) { 10 }
8
8
  let(:start_time) { end_time - duration }
9
- let(:extrainfo) { '1000 total ports' }
9
+ let(:extra_info) { '1000 total ports' }
10
10
 
11
11
  subject do
12
12
  described_class.new(
13
13
  name,
14
14
  start_time,
15
15
  end_time,
16
- extrainfo
16
+ extra_info
17
17
  )
18
18
  end
19
19
 
@@ -28,8 +28,8 @@ describe ScanTask do
28
28
  end
29
29
 
30
30
  describe "#to_s" do
31
- it "should include the start_time, name and extrainfo" do
32
- expect(subject.to_s).to eq("#{start_time}: #{name} (#{extrainfo})")
31
+ it "should include the start_time, name and extra_info" do
32
+ expect(subject.to_s).to eq("#{start_time}: #{name} (#{extra_info})")
33
33
  end
34
34
  end
35
35
  end
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper'
2
- require 'nmap/scanner'
2
+ require 'nmap/xml/scanner'
3
3
 
4
- describe Scanner do
4
+ describe Nmap::XML::Scanner do
5
5
  describe "#to_s" do
6
6
  let(:name) { 'nmap' }
7
7
  let(:version) { '6.01' }
8
8
  let(:args) { 'nmap -v -sS -sU -A -O -oX spec/scan.xml scanme.nmap.org' }
9
- let(:start_time) { Time.new('Sat Jul 20 23:55:27 2013') }
9
+ let(:start_time) { Time.parse('Sat Jul 20 23:55:27 2013') }
10
10
 
11
11
  subject do
12
12
  described_class.new(
@@ -0,0 +1,137 @@
1
+ require 'spec_helper'
2
+ require 'nmap/xml/script'
3
+
4
+ describe Nmap::XML::Script do
5
+ let(:id) { 'ssh-hostkey' }
6
+
7
+ subject { @xml.hosts.first.ports.first.scripts[id] }
8
+
9
+ describe "#id" do
10
+ it "must return the 'id' attribute" do
11
+ expect(subject.id).to eq(id)
12
+ end
13
+ end
14
+
15
+ describe "#output" do
16
+ it "must return the 'output' attribute" do
17
+ expect(subject.output).to eq(
18
+ [
19
+ '',
20
+ ' 1024 ac:00:a0:1a:82:ff:cc:55:99:dc:67:2b:34:97:6b:75 (DSA)',
21
+ 'ssh-dss AAAAB3NzaC1kc3MAAACBAOe8o59vFWZGaBmGPVeJBObEfi1AR8yEUYC/Ufkku3sKhGF7wM2m2ujIeZDK5vqeC0S5EN2xYo6FshCP4FQRYeTxD17nNO4PhwW65qAjDRRU0uHFfSAh5wk+vt4yQztOE++sTd1G9OBLzA8HO99qDmCAxb3zw+GQDEgPjzgyzGZ3AAAAFQCBmE1vROP8IaPkUmhM5xLFta/xHwAAAIEA3EwRfaeOPLL7TKDgGX67Lbkf9UtdlpCdC4doMjGgsznYMwWH6a7Lj3vi4/KmeZZdix6FMdFqq+2vrfT1DRqx0RS0XYdGxnkgS+2g333WYCrUkDCn6RPUWR/1TgGMPHCj7LWCa1ZwJwLWS2KX288Pa2gLOWuhZm2VYKSQx6NEDOIAAACBANxIfprSdBdbo4Ezrh6/X6HSvrhjtZ7MouStWaE714ByO5bS2coM9CyaCwYyrE5qzYiyIfb+1BG3O5nVdDuN95sQ/0bAdBKlkqLFvFqFjVbETF0ri3v97w6MpUawfF75ouDrQ4xdaUOLLEWTso6VFJcM6Jg9bDl0FA0uLZUSDEHL',
22
+ ' 2048 20:3d:2d:44:62:2a:b0:5a:9d:b5:b3:05:14:c2:a6:b2 (RSA)',
23
+ 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6afooTZ9mVUGFNEhkMoRR1Btzu64XXwElhCsHw/zVlIx/HXylNbb9+11dm2VgJQ21pxkWDs+L6+EbYyDnvRURTrMTgHL0xseB0EkNqexs9hYZSiqtMx4jtGNtHvsMxZnbxvVUk2dasWvtBkn8J5JagSbzWTQo4hjKMOI1SUlXtiKxAs2F8wiq2EdSuKw/KNk8GfIp1TA+8ccGeAtnsVptTJ4D/8MhAWsROkQzOowQvnBBz2/8ecEvoMScaf+kDfNQowK3gENtSSOqYw9JLOza6YJBPL/aYuQQ0nJ74Rr5vL44aNIlrGI9jJc2x0bV7BeNA5kVuXsmhyfWbbkB8yGd',
24
+ ' 256 96:02:bb:5e:57:54:1c:4e:45:2f:56:4c:4a:24:b2:57 (ECDSA)',
25
+ 'ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMD46g67x6yWNjjQJnXhiz/TskHrqQ0uPcOspFrIYW382uOGzmWDZCFV8FbFwQyH90u+j0Qr1SGNAxBZMhOQ8pc='
26
+ ].join($/)
27
+ )
28
+ end
29
+
30
+ describe "#data" do
31
+ context "when the <script> contains named <table> XML elements" do
32
+ subject { @xml.hosts.first.ports.first.scripts['ssh2-enum-algos'] }
33
+
34
+ it "must return a Hash of Hashes" do
35
+ expect(subject.data).to eq(
36
+ {
37
+ 'kex_algorithms' => %w[
38
+ curve25519-sha256@libssh.org
39
+ ecdh-sha2-nistp256
40
+ ecdh-sha2-nistp384
41
+ ecdh-sha2-nistp521
42
+ diffie-hellman-group-exchange-sha256
43
+ diffie-hellman-group-exchange-sha1
44
+ diffie-hellman-group14-sha1
45
+ diffie-hellman-group1-sha1
46
+ ],
47
+
48
+ 'server_host_key_algorithms' => %w[
49
+ ssh-rsa
50
+ ssh-dss
51
+ ecdsa-sha2-nistp256
52
+ ssh-ed25519
53
+ ],
54
+
55
+ 'encryption_algorithms' => %w[
56
+ aes128-ctr
57
+ aes192-ctr
58
+ aes256-ctr
59
+ arcfour256
60
+ arcfour128
61
+ aes128-gcm@openssh.com
62
+ aes256-gcm@openssh.com
63
+ chacha20-poly1305@openssh.com
64
+ aes128-cbc
65
+ 3des-cbc
66
+ blowfish-cbc
67
+ cast128-cbc
68
+ aes192-cbc
69
+ aes256-cbc
70
+ arcfour
71
+ rijndael-cbc@lysator.liu.se
72
+ ],
73
+
74
+ 'mac_algorithms' => %w[
75
+ hmac-md5-etm@openssh.com
76
+ hmac-sha1-etm@openssh.com
77
+ umac-64-etm@openssh.com
78
+ umac-128-etm@openssh.com
79
+ hmac-sha2-256-etm@openssh.com
80
+ hmac-sha2-512-etm@openssh.com
81
+ hmac-ripemd160-etm@openssh.com
82
+ hmac-sha1-96-etm@openssh.com
83
+ hmac-md5-96-etm@openssh.com
84
+ hmac-md5
85
+ hmac-sha1
86
+ umac-64@openssh.com
87
+ umac-128@openssh.com
88
+ hmac-sha2-256
89
+ hmac-sha2-512
90
+ hmac-ripemd160
91
+ hmac-ripemd160@openssh.com
92
+ hmac-sha1-96
93
+ hmac-md5-96
94
+ ],
95
+
96
+ 'compression_algorithms' => %w[
97
+ none
98
+ zlib@openssh.com
99
+ ]
100
+ }
101
+ )
102
+ end
103
+ end
104
+
105
+ context "when the <script> contains unnamed <table> XML elements" do
106
+ subject { @xml.hosts.first.ports.first.scripts['ssh-hostkey'] }
107
+
108
+ it "must return an Array of Hashes" do
109
+ expect(subject.data).to eq(
110
+ [
111
+ {
112
+ 'fingerprint' => 'ac00a01a82ffcc5599dc672b34976b75',
113
+ 'key' => 'QUFBQUIzTnphQzFrYzNNQUFBQ0JBT2U4bzU5dkZXWkdhQm1HUFZlSkJPYkVmaTFBUjh5RVVZQy9VZmtrdTNzS2hHRjd3TTJtMnVqSWVaREs1dnFlQzBTNUVOMnhZbzZGc2hDUDRGUVJZZVR4RDE3bk5PNFBod1c2NXFBakRSUlUwdUhGZlNBaDV3ayt2dDR5UXp0T0UrK3NUZDFHOU9CTHpBOEhPOTlxRG1DQXhiM3p3K0dRREVnUGp6Z3l6R1ozQUFBQUZRQ0JtRTF2Uk9QOElhUGtVbWhNNXhMRnRhL3hId0FBQUlFQTNFd1JmYWVPUExMN1RLRGdHWDY3TGJrZjlVdGRscENkQzRkb01qR2dzem5ZTXdXSDZhN0xqM3ZpNC9LbWVaWmRpeDZGTWRGcXErMnZyZlQxRFJxeDBSUzBYWWRHeG5rZ1MrMmczMzNXWUNyVWtEQ242UlBVV1IvMVRnR01QSENqN0xXQ2ExWndKd0xXUzJLWDI4OFBhMmdMT1d1aFptMlZZS1NReDZORURPSUFBQUNCQU54SWZwclNkQmRibzRFenJoNi9YNkhTdnJoanRaN01vdVN0V2FFNzE0QnlPNWJTMmNvTTlDeWFDd1l5ckU1cXpZaXlJZmIrMUJHM081blZkRHVOOTVzUS8wYkFkQktsa3FMRnZGcUZqVmJFVEYwcmkzdjk3dzZNcFVhd2ZGNzVvdURyUTR4ZGFVT0xMRVdUc282VkZKY002Smc5YkRsMEZBMHVMWlVTREVITA==',
114
+ 'type' => 'ssh-dss',
115
+ 'bits' => '1024'
116
+ },
117
+
118
+ {
119
+ 'fingerprint' => '203d2d44622ab05a9db5b30514c2a6b2',
120
+ 'key' => 'QUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQkFRQzZhZm9vVFo5bVZVR0ZORWhrTW9SUjFCdHp1NjRYWHdFbGhDc0h3L3pWbEl4L0hYeWxOYmI5KzExZG0yVmdKUTIxcHhrV0RzK0w2K0ViWXlEbnZSVVJUck1UZ0hMMHhzZUIwRWtOcWV4czloWVpTaXF0TXg0anRHTnRIdnNNeFpuYnh2VlVrMmRhc1d2dEJrbjhKNUphZ1NieldUUW80aGpLTU9JMVNVbFh0aUt4QXMyRjh3aXEyRWRTdUt3L0tOazhHZklwMVRBKzhjY0dlQXRuc1ZwdFRKNEQvOE1oQVdzUk9rUXpPb3dRdm5CQnoyLzhlY0V2b01TY2FmK2tEZk5Rb3dLM2dFTnRTU09xWXc5SkxPemE2WUpCUEwvYVl1UVEwbko3NFJyNXZMNDRhTklsckdJOWpKYzJ4MGJWN0JlTkE1a1Z1WHNtaHlmV2Jia0I4eUdk',
121
+ 'type' => 'ssh-rsa',
122
+ 'bits' => '2048'
123
+ },
124
+
125
+ {
126
+ 'fingerprint' => '9602bb5e57541c4e452f564c4a24b257',
127
+ 'key' => 'QUFBQUUyVmpaSE5oTFhOb1lUSXRibWx6ZEhBeU5UWUFBQUFJYm1semRIQXlOVFlBQUFCQkJNRDQ2ZzY3eDZ5V05qalFKblhoaXovVHNrSHJxUTB1UGNPc3BGcklZVzM4MnVPR3ptV0RaQ0ZWOEZiRndReUg5MHUrajBRcjFTR05BeEJaTWhPUThwYz0=',
128
+ 'type' => 'ecdsa-sha2-nistp256',
129
+ 'bits' => '256'
130
+ }
131
+ ]
132
+ )
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,19 @@
1
+ require 'rspec'
2
+ require 'nmap/xml/script'
3
+
4
+ shared_examples_for "#scripts" do
5
+ describe "#scripts" do
6
+ subject { super().scripts }
7
+
8
+ it { is_expected.to be_kind_of(Hash) }
9
+ it { is_expected.not_to be_empty }
10
+
11
+ it "should contain String keys" do
12
+ expect(subject.keys).to all(be_kind_of(String))
13
+ end
14
+
15
+ it "should contain Nmap::XML::Script values" do
16
+ expect(subject.values).to all(be_kind_of(Nmap::XML::Script))
17
+ end
18
+ end
19
+ end
@@ -7,6 +7,7 @@ shared_examples_for "Sequence" do
7
7
  it 'has 6 items' do
8
8
  expect(subject.size).to eq(6)
9
9
  end
10
+
10
11
  it { is_expected.to all(be_between(0,0xFFFFFFFF)) }
11
12
  end
12
13
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
- require 'cpe_examples'
2
+ require 'xml/cpe_examples'
3
3
 
4
4
  require 'nmap/xml'
5
- require 'nmap/service'
5
+ require 'nmap/xml/service'
6
6
 
7
- describe Service do
7
+ describe Nmap::XML::Service do
8
8
  let(:port) { @xml.host.open_ports.find { |port| port.number == 80 } }
9
9
 
10
10
  subject { port.service }
@@ -16,8 +16,18 @@ describe Service do
16
16
  end
17
17
 
18
18
  describe "#ssl?" do
19
- it "should check the tunnel attribute" do
20
- skip "need a service that uses SSL"
19
+ context "when the tunnel attribute equals 'ssl'" do
20
+ let(:port) { @xml.host.open_ports.find { |port| port.number == 31337 } }
21
+
22
+ it "must return true" do
23
+ expect(subject.ssl?).to be(true)
24
+ end
25
+ end
26
+
27
+ context "otherwise" do
28
+ it "must return false" do
29
+ expect(subject.ssl?).to be(false)
30
+ end
21
31
  end
22
32
  end
23
33
 
@@ -69,6 +79,14 @@ describe Service do
69
79
  end
70
80
  end
71
81
 
82
+ describe "#fingerprint" do
83
+ let(:port) { @xml.host.open_ports.find { |port| port.number == 22 } }
84
+
85
+ it "should parse the servicefp attribute" do
86
+ expect(subject.fingerprint).to eq("SF-Port22-TCP:V=6.45%I=7%D=4/17%Time=55316FE1%P=x86_64-redhat-linux-gnu%r(NULL,29,\"SSH-2\\.0-OpenSSH_6\\.6\\.1p1\\x20Ubuntu-2ubuntu2\\r\\n\");")
87
+ end
88
+ end
89
+
72
90
  describe "#confidence" do
73
91
  it "should parse the conf attribute" do
74
92
  expect(subject.confidence).to be_between(0,10)
@@ -81,6 +99,14 @@ describe Service do
81
99
  expect(subject.to_s).to be == "#{subject.product} #{subject.version}"
82
100
  end
83
101
  end
102
+
103
+ context "when #product and #version are nil" do
104
+ let(:port) { @xml.host.ports.find { |port| port.number == 68 } }
105
+
106
+ it "must return #name" do
107
+ expect(subject.to_s).to eq(subject.name)
108
+ end
109
+ end
84
110
  end
85
111
 
86
112
  it_should_behave_like "CPE"
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/status'
2
+ require 'nmap/xml/status'
3
3
 
4
- describe Status do
4
+ describe Nmap::XML::Status do
5
5
  describe "#to_s" do
6
6
  let(:state) { :up }
7
7
  let(:reason) { 'syn-ack' }
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'sequence_examples'
2
+ require 'xml/sequence_examples'
3
3
 
4
- require 'nmap/tcp_sequence'
4
+ require 'nmap/xml/tcp_sequence'
5
5
 
6
- describe TcpSequence do
6
+ describe Nmap::XML::TcpSequence do
7
7
  subject { @xml.hosts.first.tcp_sequence }
8
8
 
9
9
  describe "#index" do
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'sequence_examples'
2
+ require 'xml/sequence_examples'
3
3
 
4
- require 'nmap/tcp_ts_sequence'
4
+ require 'nmap/xml/tcp_ts_sequence'
5
5
 
6
- describe TcpTsSequence do
6
+ describe Nmap::XML::TcpTsSequence do
7
7
  subject { @xml.hosts.first.tcp_ts_sequence }
8
8
 
9
9
  describe "#description" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/traceroute'
2
+ require 'nmap/xml/traceroute'
3
3
 
4
- describe Traceroute do
4
+ describe Nmap::XML::Traceroute do
5
5
  subject { @xml.hosts.first.traceroute }
6
6
 
7
7
  describe "#port" do
@@ -22,7 +22,7 @@ describe Traceroute do
22
22
  describe "#each" do
23
23
  subject { super().each.first }
24
24
 
25
- it { is_expected.to be_kind_of(Hop) }
25
+ it { is_expected.to be_kind_of(Nmap::XML::Hop) }
26
26
 
27
27
  describe '#addr' do
28
28
  subject { super().addr }
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'nmap/uptime'
2
+ require 'nmap/xml/uptime'
3
3
 
4
- describe Uptime do
4
+ describe Nmap::XML::Uptime do
5
5
  describe "#to_s" do
6
6
  let(:seconds) { 920430 }
7
7
  let(:last_boot) { Time.parse("2013-07-10 08:34:03 -0700") }