ruby-nmap 0.10.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +122 -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 +12 -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") }