Skip to content
This repository was archived by the owner on Jan 31, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
language: php

php:
- 5.3
- 5.4
- 5.5
- 5.6
- 7.0

before_script:
- composer install
Expand Down
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
"symfony/process": "~2.0|~3.0"
},
"require-dev": {
"phpunit/phpunit": "~3.7"
"phpunit/phpunit": "~3.7",
"mockery/mockery": "^1.0-dev"
},
"autoload": {
"psr-0": { "Nmap": "src/" }
Expand Down
12 changes: 11 additions & 1 deletion src/Nmap/Nmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ class Nmap

private $timeout = 60;

private $extraOptions = [];

/**
* @return Nmap
*/
Expand Down Expand Up @@ -79,7 +81,7 @@ public function scan(array $targets, array $ports = array())
return ProcessUtils::escapeArgument($target);
}, $targets));

$options = array();
$options = $this->extraOptions;
if (true === $this->enableOsDetection) {
$options[] = '-O';
}
Expand Down Expand Up @@ -147,6 +149,14 @@ public function enableServiceInfo($enable = true)
return $this;
}

/**
* Extra options to pass to NMAP (e.g. [ "-e eth0", "--min-hostgroup 4" ] )
* @param array $options
*/
public function setExtraOptions(array $options) {
$this->extraOptions = $options;
}

/**
* @param boolean $enable
*
Expand Down
26 changes: 26 additions & 0 deletions tests/Nmap/Tests/Fixtures/test_extra_options.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="file:///usr/share/nmap/nmap.xsl" type="text/xsl"?>
<!DOCTYPE nmaprun>
<!-- Nmap 7.40 scan initiated Thu Sep 21 16:41:03 2017 as: nmap -e eth0 -&#45;min-hostgroup 3 -oX /home/david/src/nmap/tests/Nmap/Tests/Fixtures/test_extra_options.xml 127.0.0.1 -->
<nmaprun scanner="nmap" args="nmap -e eth0 -&#45;min-hostgroup 3 -oX /path/to/Nmap/Tests/Fixtures/test_extra_options.xml 127.0.0.1" start="1506008463" startstr="Thu Sep 21 16:41:03 2017" version="7.40" xmloutputversion="1.04">
<scaninfo type="connect" 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"/>
<verbose level="0"/>
<debugging level="0"/>
<host starttime="1506008463" endtime="1506008463"><status state="up" reason="syn-ack" reason_ttl="0"/>
<address addr="127.0.0.1" addrtype="ipv4"/>
<hostnames>
<hostname name="localhost" type="PTR"/>
</hostnames>
<ports><extraports state="closed" count="991">
<extrareasons reason="conn-refused" count="991"/>
</extraports>
<port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="ssh" method="table" conf="3"/></port>
<port protocol="tcp" portid="25"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="smtp" method="table" conf="3"/></port>
<port protocol="tcp" portid="53"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="domain" method="table" conf="3"/></port>
<port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="http" method="table" conf="3"/></port>
</ports>
<times srtt="47" rttvar="41" to="100000"/>
</host>
<runstats><finished time="1506008463" timestr="Thu Sep 21 16:41:03 2017" elapsed="0.04" summary="Nmap done at Thu Sep 21 16:41:03 2017; 1 IP address (1 host up) scanned in 0.04 seconds" exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>
58 changes: 43 additions & 15 deletions tests/Nmap/Tests/NmapTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,23 @@

namespace Nmap\Tests;

use Mockery as m;
use Nmap\Address;
use Nmap\Host;
use Nmap\Nmap;
use Nmap\Port;

class NmapTest extends TestCase
{
public function tearDown()
{
m::close();
parent::tearDown();
}

public function testScan()
{
$outputFile = __DIR__ . '/Fixtures/test_scan.xml';
$outputFile = __DIR__ . '/Fixtures/test_scan.xml';
$expectedCommand = sprintf("nmap -oX '%s' 'williamdurand.fr'", $outputFile);

$executor = $this->getProcessExecutorMock();
Expand All @@ -21,7 +28,7 @@ public function testScan()
->with($this->equalTo($expectedCommand))
->will($this->returnValue(0));

$nmap = new Nmap($executor, $outputFile);
$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap->scan(array('williamdurand.fr'));
$this->assertCount(1, $hosts);

Expand Down Expand Up @@ -62,7 +69,7 @@ public function testScan()

public function testScanSpecifyingPorts()
{
$outputFile = __DIR__ . '/Fixtures/test_scan_specifying_ports.xml';
$outputFile = __DIR__ . '/Fixtures/test_scan_specifying_ports.xml';
$expectedCommand = sprintf("nmap -p 21,22,80 -oX '%s' 'williamdurand.fr'", $outputFile);

$executor = $this->getProcessExecutorMock();
Expand All @@ -72,8 +79,8 @@ public function testScanSpecifyingPorts()
->with($this->equalTo($expectedCommand))
->will($this->returnValue(0));

$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap->scan(array('williamdurand.fr'), array(21,22,80));
$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap->scan(array('williamdurand.fr'), array(21, 22, 80));
$this->assertCount(1, $hosts);

$host = current($hosts);
Expand Down Expand Up @@ -106,7 +113,7 @@ public function testScanSpecifyingPorts()

public function testScanWithOsDetection()
{
$outputFile = __DIR__ . '/Fixtures/test_scan_with_os_detection.xml';
$outputFile = __DIR__ . '/Fixtures/test_scan_with_os_detection.xml';
$expectedCommand = sprintf("nmap -O -oX '%s' 'williamdurand.fr'", $outputFile);

$executor = $this->getProcessExecutorMock();
Expand All @@ -116,15 +123,15 @@ public function testScanWithOsDetection()
->with($this->equalTo($expectedCommand))
->will($this->returnValue(0));

$nmap = new Nmap($executor, $outputFile);
$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap
->enableOsDetection()
->scan(array('williamdurand.fr'));
}

public function testScanWithServiceInfo()
{
$outputFile = __DIR__ . '/Fixtures/test_scan_with_service_info.xml';
$outputFile = __DIR__ . '/Fixtures/test_scan_with_service_info.xml';
$expectedCommand = sprintf("nmap -sV -oX '%s' 'williamdurand.fr'", $outputFile);

$executor = $this->getProcessExecutorMock();
Expand All @@ -134,7 +141,7 @@ public function testScanWithServiceInfo()
->with($this->equalTo($expectedCommand))
->will($this->returnValue(0));

$nmap = new Nmap($executor, $outputFile);
$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap
->enableServiceInfo()
->scan(array('williamdurand.fr'));
Expand All @@ -154,7 +161,7 @@ public function testScanWithServiceInfo()

public function testScanWithVerbose()
{
$outputFile = __DIR__ . '/Fixtures/test_scan_with_verbose.xml';
$outputFile = __DIR__ . '/Fixtures/test_scan_with_verbose.xml';
$expectedCommand = sprintf("nmap -v -oX '%s' 'williamdurand.fr'", $outputFile);

$executor = $this->getProcessExecutorMock();
Expand All @@ -164,15 +171,15 @@ public function testScanWithVerbose()
->with($this->equalTo($expectedCommand))
->will($this->returnValue(0));

$nmap = new Nmap($executor, $outputFile);
$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap
->enableVerbose()
->scan(array('williamdurand.fr'));
}

public function testPingScan()
{
$outputFile = __DIR__ . '/Fixtures/test_ping_scan.xml';
$outputFile = __DIR__ . '/Fixtures/test_ping_scan.xml';
$expectedCommand = sprintf("nmap -sn -oX '%s' 'williamdurand.fr'", $outputFile);

$executor = $this->getProcessExecutorMock();
Expand All @@ -182,15 +189,15 @@ public function testPingScan()
->with($this->equalTo($expectedCommand))
->will($this->returnValue(0));

$nmap = new Nmap($executor, $outputFile);
$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap
->disablePortScan()
->scan(array('williamdurand.fr'));
}

public function testScanWithoutReverseDNS()
{
$outputFile = __DIR__ . '/Fixtures/test_ping_without_reverse_dns.xml';
$outputFile = __DIR__ . '/Fixtures/test_ping_without_reverse_dns.xml';
$expectedCommand = sprintf("nmap -n -oX '%s' 'williamdurand.fr'", $outputFile);

$executor = $this->getProcessExecutorMock();
Expand All @@ -200,7 +207,7 @@ public function testScanWithoutReverseDNS()
->with($this->equalTo($expectedCommand))
->will($this->returnValue(0));

$nmap = new Nmap($executor, $outputFile);
$nmap = new Nmap($executor, $outputFile);
$hosts = $nmap
->disableReverseDNS()
->scan(array('williamdurand.fr'));
Expand Down Expand Up @@ -267,6 +274,27 @@ public function testExecutableNotExecutable()
new Nmap($executor);
}

public function testRawOptions()
{
$mockExecutor = m::mock(\Nmap\Util\ProcessExecutor::class);
$mockExecutor->shouldReceive('execute')->once()->withArgs(function ($command) {
$this->assertEquals('nmap -h', $command);
return true;
})->andReturn(0);

$mockExecutor->shouldReceive('execute')->once()->withArgs(function ($command, $timeout = 60) {
// Passing [ -e eth0, --min-hostgroup 3 ] ... should produce a command string a bit like ...
$this->assertRegExp("/^nmap -e eth0 --min-hostgroup 3.*127\.0\.0\.1'$/", $command);
return true;
})->andReturn(0);

$nmap = new Nmap($mockExecutor, dirname(__FILE__) . '/Fixtures/test_extra_options.xml');
$nmap->setExtraOptions(['-e eth0', '--min-hostgroup 3']);
$output = $nmap->scan(['127.0.0.1']);

$this->assertNotEmpty($output);
}

/**
* @return \PHPUnit_Framework_MockObject_MockObject | \Nmap\Util\ProcessExecutor
*/
Expand Down