Compare commits

...
Author SHA1 Message Date
Brandon 67726cc490 1.6 2020-08-04 23:30:52 +01:00
Brandon d5d39cacd3 Merge pull request #117 from RustScan/ba-implement-multi-ip
Support multiple IPs
2020-08-04 23:21:17 +01:00
Bernardo Chaves 52cbbeeac6 Adjust messages taking into account quiet mode 2020-08-04 17:40:23 -04:00
Bernardo Chaves 23c049413b Support multiple IPs
IPs should be provided in a comma separated list.

Right now every IP will be scanned sequentially and NMAP will run before
the next IP scan starts. This will change on the long term once we
provide randomized scans in order to not overwhelm hosts or trigger
detection systems in place.
2020-08-04 16:17:27 -04:00
Brandon 9858406271 fixing cargo.toml issue 2020-08-04 16:43:14 +01:00
Brandon 6abb3737ec cargo updates 2020-08-04 16:40:32 +01:00
Brandon 65b9cb1659 cargo update 2020-08-04 16:36:48 +01:00
Brandon d2684baead 1.5 2020-08-04 16:36:24 +01:00
Brandon 5a40bc4182 Merge pull request #116 from RustScan/bee-add-section-deb
Bee add section deb #114
2020-08-04 15:09:40 +01:00
Brandon f03f15a6d0 Merge branch 'master' into bee-add-section-deb 2020-08-04 13:30:34 +01:00
Brandon 9740d54912 Merge pull request #112 from RustScan/all-contributors/add-Atul9
docs: add Atul9 as a contributor
2020-08-04 12:55:46 +01:00
Brandon f577cd23bd Merge branch 'master' into all-contributors/add-Atul9 2020-08-04 12:49:57 +01:00
Brandon f16d704c86 Update README.md 2020-08-04 12:45:50 +01:00
Brandon e5368a31db Made it new line 2020-08-04 12:44:50 +01:00
Brandon 01c2580672 Made Docker command shorter 2020-08-04 12:44:14 +01:00
Brandon 200382a731 Update README.md 2020-08-04 12:42:03 +01:00
Brandon 6a000762a5 Merge branch 'master' into all-contributors/add-Atul9 2020-08-04 12:38:56 +01:00
Brandon e9b21338ef Added Docker to README 2020-08-04 12:28:49 +01:00
Brandon bd436221ca Merge branch 'master' into all-contributors/add-Atul9 2020-08-04 12:18:04 +01:00
Brandon 5d16af21f1 Updated 404 links & added emojis 2020-08-04 11:51:15 +01:00
Brandon e331789598 Merge pull request #105 from Atul9/cleanup-readme
Clean up the README file
2020-08-04 11:44:02 +01:00
Brandon bf56b10ff4 Merge branch 'master' into all-contributors/add-Atul9 2020-08-04 11:29:57 +01:00
Brandon 719c38bd32 Update README.md 2020-08-04 11:29:05 +01:00
Atul Bhosale a08fe2456d Rename Community section heading to Contributing [ci skip] 2020-08-04 08:09:49 +05:30
Atul Bhosale db1831c4b8 Replace Homebrew in Readme table with Docker [ci skip] 2020-08-04 08:09:49 +05:30
Atul Bhosale 74e2ff026a Move table of contents higher up [ci skip] 2020-08-04 08:09:49 +05:30
Atul Bhosale 897c1c4091 Move important links under features [ci skip] 2020-08-04 08:09:49 +05:30
Brandon a9340bb622 Merge pull request #108 from RustScan/bee-fix-mac-os-ulimit
Bee fix mac os ulimit
2020-08-03 23:48:00 +01:00
allcontributors[bot] 137f8669fe docs: update .all-contributorsrc [skip ci] 2020-08-03 17:55:15 +00:00
allcontributors[bot] c658b0ea70 docs: update README.md [skip ci] 2020-08-03 17:55:14 +00:00
6 changed files with 148 additions and 101 deletions

No files matched your search

+6
View File
@@ -68,6 +68,12 @@
]
},
{
"login": "Atul9",
"name": "Atul Bhosale",
"avatar_url": "https://avatars1.githubusercontent.com/u/3390330?v=4",
"profile": "https://github.com/Atul9",
"contributions": [
"doc"
"login": "royharoush",
"name": "royharoush",
"avatar_url": "https://avatars3.githubusercontent.com/u/8113056?v=4",
Generated
+5 -5
View File
@@ -182,9 +182,9 @@ dependencies = [
[[package]]
name = "concurrent-queue"
version = "1.2.0"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e296417c8154304ac70aceda41f05318f986f7c0c767bcb0a2366fbb890e78e1"
checksum = "39ff9c66992ebea984b9446b2a45b300947216c17544ec9d7f045afe24333cd0"
dependencies = [
"cache-padded",
]
@@ -617,7 +617,7 @@ dependencies = [
[[package]]
name = "rustscan"
version = "1.4.1"
version = "1.6.0"
dependencies = [
"async-std",
"colored",
@@ -713,9 +713,9 @@ dependencies = [
[[package]]
name = "syn"
version = "1.0.36"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cdb98bcb1f9d81d07b536179c269ea15999b5d14ea958196413869445bb5250"
checksum = "e69abc24912995b3038597a7a593be5053eb0fb44f3cc5beec0deb421790c1f4"
dependencies = [
"proc-macro2",
"quote",
+1 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "rustscan"
version = "1.4.1"
version = "1.6.0"
authors = ["Bee <[email protected]>"]
edition = "2018"
description = "Faster Nmap Scanning with Rust"
@@ -26,5 +26,4 @@ dirs = "3.0.1"
[package.metadata.deb]
depends = "$auto, nmap"
authors = ["Bee <[email protected]>"]
section = "rust"
+54 -27
View File
@@ -21,11 +21,10 @@
</p>
<hr>
| <p align="center"><a href="https://crates.io/crates/rustscan">🔧 Cargo (Universal) </a></p> | <p align="center"><a href="https://crates.io/crates/rust_scan"> Arch </a></p> | <p align="center"><a href="https://crates.io/crates/rust_scan"> HomeBrew </a></p> | <p align="center"><a href="https://crates.io/crates/rust_scan"> Kali / Debian </p> |
| <p align="center"><a href="https://hub.docker.com/r/cmnatic/rustscan">🐋 Docker (Recommended) </a></p> | <p align="center"><a href="https://github.com/RustScan/RustScan/releases">👩‍💻 Kali / Debian </p> | <p align="center"><a href="https://aur.archlinux.org/packages/rustscan/">🏗️ Arch </a></p> | <p align="center"><a href="https://crates.io/crates/rustscan">🔧 Cargo (Universal) </a></p> |
| ---- | ---- | ---- | --- |
| <p align="center"><img src="pictures/rust.png" /></p> | <p align="center"><img src="pictures/arch.png" /></p> | <p align="center"><img src="pictures/apple.png" /></p> | <p align="center"><img src="pictures/kali.png" /></p> |
| `cargo install rustscan` | `yay -S rustscan` | `brew tap brandonskerritt/rustscan && brew install rustscan` | [Read the install guide](https://github.com/brandonskerritt/RustScan/blob/master/README.md#%EF%B8%8F-debian--kali) |
| <p align="center"><img src="pictures/docker.png" /></p> | <p align="center"><img src="pictures/kali.png" /></p> | <p align="center"><img src="pictures/arch.png" /></p> | <p align="center"><img src="pictures/rust.png" /></p>
| `docker pull cmnatic/rustscan:debian-buster` <p>[Usage](https://github.com/RustScan/RustScan#docker-whale) | [Read the install guide](https://github.com/brandonskerritt/RustScan/blob/master/README.md#%EF%B8%8F-debian--kali) | `yay -S rustscan` | `cargo install rustscan`
<hr>
@@ -64,6 +63,19 @@ RustScans **only** job is to reduce the friction between finding open ports and
* Let's you choose what Nmap commands to run, or uses the default.
* IPv6 Support
## ‼️ Important Links
| Installation Guide | Documentation | Discord |
| ------------------ | ------------- | ------- |
| 📖 [Installation Guide](https://github.com/RustScan/RustScan#-full-installation-guide) | 📚 [Documentation](https://github.com/RustScan/RustScan/issues/89) | 🦜 [Discord](https://discord.gg/GFrQsGy)
## 🙋 Table of Contents
* 📖 [Installation Guide](https://github.com/RustScan/RustScan#-full-installation-guide)
* 🐋 [Docker Usage](https://github.com/RustScan/RustScan#docker-whale)
* 🦜 [Discord](https://discord.gg/GFrQsGy)
* 🤸 [Usage](https://github.com/RustScan/RustScan#-usage)
* 🎪 [Community](https://github.com/RustScan/RustScan#-community)
# 🔭 Why RustScan?
Why spend time running fast scans and manually copying the ports, or waiting for a 20 minute scan to finish when you can just do all 65k ports in less than a minute?
@@ -79,19 +91,6 @@ Why spend time running fast scans and manually copying the ports, or waiting for
| Actually useful | ❌ | ✅ | ❌ |
| Realises it's not useful, and pipes the only useful data into the only useful port scanner | ✅ | ❌ | ❌ |
## ‼️ Important Links
| Installation Guide | Documentation | Discord |
| ------------------ | ------------- | ------- |
| 📖 [Installation Guide](https://github.com/RustScan/RustScan#-full-installation-guide) | 📚 [Documentation](https://github.com/RustScan/RustScan/issues/89) | 🦜 [Discord](https://discord.gg/GFrQsGy)
## 🙋 Table of Contents
* 📖 [Installation Guide](https://github.com/RustScan/RustScan#-full-installation-guide)
* 🦜 [Discord](https://discord.gg/GFrQsGy)
* 🤸 [Usage](https://github.com/RustScan/RustScan#-usage)
* 🎪 [Contributing](https://github.com/RustScan/RustScan#-contributing)
# 📖 Full Installation Guide
**You need Nmap**. If you have Kali Linux or Parrot OS installed, you already have Nmap. If not, [follow the nmap install guide](https://nmap.org/download.html).
@@ -113,19 +112,44 @@ Run the commpand `dpkg -i` on the file.
Note: sometimes you can double click the file to achieve the same result.
### 🥧 .deb file not working?
The .deb file only works on AMD64 CPUs. If yours is different (such as a Raspberry Pi) or the .deb file doesn't work, it is easy to build the .deb file yourself.
**Note**: It is easier to install Rust and install via Cargo, then it is to build the .deb file. But this is just in case!
## Docker :whale:
1. Install Rust You can do this with `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh` which I took from the Rust website https://www.rust-lang.org/tools/install
2. `cargo install rustscan` if you want the easiest method possible. Otherwise, to build the .deb file `cargo install cargo-deb`
3. Git clone this repo `git clone https://github.com/brandonskerritt/RustScan`
4. cd RustScan (into the git cloned repo) `cd RustScan`
5. Run `cargo deb`
6. Your .deb file is now located in `target/releases/Debian/`
Docker is the recommended way of installing RustScan. This is because:
* It has a high open file descriptor limit, which is one of the [main problems](https://github.com/RustScan/RustScan/issues/40) with RustScan. Now you don't have to fiddle around trying to understand your OS.
* It works on all systems, regardless of OS. Even Windows, which we don't officially support.
* The Docker image uses the latest build from Cargo, our main source-of-truth package. This means that you will always be using the latest version.
* No need to install Rust, Cargo, or Nmap.
To install Docker, [follow their guide](https://docs.docker.com/engine/install/).
**Once Docker is installed, run this command against the IP you want to target.**
```
docker run -it --rm --name rustscan cmnatic/rustscan:debian-buster rustscan 127.0.0.1
```
Note: this will scan the Docker's localhost, not your own.
This will download the Docker image.
Once done, you will no longer need to re-download the image (except when RustScan updates) and can use RustScan like a normal application.
You will have to run this command every time, so we suggest aliasing it to something memorable.
```
alias rustscan='docker run -it --rm --name rustscan cmnatic/rustscan:debian-buster rustscan'
```
Then we can:
```
rustscan 127.0.0.1 -t 500 -b 1500 -- -A
```
## 🍺 HomeBrew
**Note for Mac users** Mac OS has a very, very small ulimit size. This will negatively impact RustScan by a significant amount. Please use the Docker container, or tell RustScan to up the ulimit size on every run.
Tap the brew:
```
@@ -147,7 +171,9 @@ brew install rustscan
5. Symlink to the binary or something. Whatever you want!
## 🦊 Community Distributions
Here are all of RustScan's distributions, along with some community ones.
Here are all of RustScan's community distributions.
If you maintain a community distribution and want it listed here, leave an issue / pull request / Discord message or however you want to let us know.
* [OpenSuse](https://software.opensuse.org/package/rustscan?search_term=rustscan)
@@ -339,6 +365,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center"><a href="http://bernardoamc.github.io/"><img src="https://avatars0.githubusercontent.com/u/428984?v=4" width="100px;" alt=""/><br /><sub><b>Bernardo Araujo</b></sub></a><br /><a href="https://github.com/RustScan/RustScan/commits?author=bernardoamc" title="Code">💻</a> <a href="https://github.com/RustScan/RustScan/issues?q=author%3Abernardoamc" title="Bug reports">🐛</a> <a href="#design-bernardoamc" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/Isona"><img src="https://avatars2.githubusercontent.com/u/11759523?v=4" width="100px;" alt=""/><br /><sub><b>Izzy Whistlecroft</b></sub></a><br /><a href="https://github.com/RustScan/RustScan/issues?q=author%3AIsona" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://imlonghao.com"><img src="https://avatars1.githubusercontent.com/u/4951333?v=4" width="100px;" alt=""/><br /><sub><b>imlonghao</b></sub></a><br /><a href="https://github.com/RustScan/RustScan/issues?q=author%3Aimlonghao" title="Bug reports">🐛</a> <a href="#maintenance-imlonghao" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://github.com/Atul9"><img src="https://avatars1.githubusercontent.com/u/3390330?v=4" width="100px;" alt=""/><br /><sub><b>Atul Bhosale</b></sub></a><br /><a href="https://github.com/RustScan/RustScan/commits?author=Atul9" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/royharoush"><img src="https://avatars3.githubusercontent.com/u/8113056?v=4" width="100px;" alt=""/><br /><sub><b>royharoush</b></sub></a><br /><a href="#ideas-royharoush" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-royharoush" title="Design">🎨</a></td>
</tr>
</table>
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

+82 -67
View File
@@ -7,7 +7,7 @@ use colored::*;
use futures::executor::block_on;
use rlimit::Resource;
use rlimit::{getrlimit, setrlimit};
use std::process::{exit, Command};
use std::process::Command;
use std::{net::IpAddr, time::Duration};
use structopt::StructOpt;
@@ -28,9 +28,9 @@ extern crate log;
/// - Discord https://discord.gg/GFrQsGy
/// - GitHub https://github.com/RustScan/RustScan
struct Opts {
/// The IP address to scan
#[structopt(parse(try_from_str))]
ip: IpAddr,
/// A list of comma separated IP addresses to be scanned.
#[structopt(use_delimiter = true, parse(try_from_str), required = true)]
ips: Vec<IpAddr>,
///Quiet mode. Only output the ports. No Nmap. Useful for grep or outputting to a file.
#[structopt(short, long)]
@@ -56,6 +56,7 @@ struct Opts {
/// Example: 'rustscan -T 1500 127.0.0.1 -- -A -sC'.
/// This command adds -Pn -vvv -p $PORTS automatically to nmap.
/// For things like --script '(safe and vuln)' enclose it in quotations marks \"'(safe and vuln)'\"")
#[structopt(last = true)]
command: Vec<String>,
}
@@ -63,7 +64,6 @@ struct Opts {
/// Faster Nmap scanning with Rust
/// If you're looking for the actual scanning, check out the module Scanner
fn main() {
// logger
env_logger::init();
info!("Starting up");
@@ -77,63 +77,75 @@ fn main() {
let ulimit: rlimit::rlim = adjust_ulimit_size(&opts);
let batch_size: u32 = infer_batch_size(&opts, ulimit);
// 65535 + 1 because of 0 indexing
let scanner = Scanner::new(
opts.ip,
1,
65535,
batch_size,
Duration::from_millis(opts.timeout.into()),
opts.quiet,
);
let scan_result = block_on(scanner.run());
for ip in opts.ips {
println!("{} {}\n", "\nScanning ports from".green(), ip);
// prints ports and places them into nmap string
let nmap_str_ports: Vec<String> = scan_result
.into_iter()
.map(|port| port.to_string())
.collect();
let scanner = Scanner::new(
ip,
1,
65535,
batch_size,
Duration::from_millis(opts.timeout.into()),
opts.quiet,
);
// if no ports are found, suggest running with less
if nmap_str_ports.is_empty() {
panic!("{} Looks like I didn't find any open ports. This is usually caused by a high batch size.
\n*I used {} batch size, consider lowering to {} with {} or a comfortable number for your system.
\n Alternatively, increase the timeout if your ping is high. Rustscan -T 2000 for 2000 second timeout.", "ERROR".red(),
opts.batch_size,
(opts.batch_size / 2).to_string().green(),
"'rustscan -b <batch_size> <ip address>'".green());
let scan_result = block_on(scanner.run());
// prints ports and places them into nmap string
let nmap_str_ports: Vec<String> = scan_result
.into_iter()
.map(|port| port.to_string())
.collect();
// if no ports are found, suggest running with less
if nmap_str_ports.is_empty() {
if opts.quiet {
println!("{}", "No ports found.".red());
} else {
println!("{} Looks like I didn't find any open ports for {:?}. This is usually caused by a high batch size.
\n*I used {} batch size, consider lowering to {} with {} or a comfortable number for your system.
\n Alternatively, increase the timeout if your ping is high. Rustscan -T 2000 for 2000 second timeout.\n",
"ERROR".red(),
ip,
opts.batch_size,
(opts.batch_size / 2).to_string().green(),
"'rustscan -b <batch_size> <ip address>'".green());
}
continue;
}
// Tells the user we are now switching to Nmap
if !opts.quiet {
println!("\n{}", "Starting nmap.".blue(),);
}
// nmap port style is 80,443. Comma seperated with no spaces.
let ports_str = nmap_str_ports.join(",");
// if quiet mode is on, return ports and exit
if opts.quiet {
println!("Ports: {:?}", ports_str);
continue;
}
let addr = ip.to_string();
let user_nmap_args =
shell_words::split(&opts.command.join(" ")).expect("failed to parse nmap arguments");
let nmap_args = build_nmap_arguments(&addr, &ports_str, &user_nmap_args, ip.is_ipv6());
if !opts.quiet {
println!("The Nmap command to be run is {}", &nmap_args.join(" "));
}
// Runs the nmap command and spawns it as a process.
let mut child = Command::new("nmap")
.args(&nmap_args)
.spawn()
.expect("failed to execute nmap process");
child.wait().expect("failed to wait on nmap process");
}
// Tells the user we are now switching to Nmap
if !opts.quiet {
println!("{}", "Starting nmap.".blue(),);
}
// nmap port style is 80,443. Comma seperated with no spaces.
let ports_str = nmap_str_ports.join(",");
// if quiet mode is on, return ports and exit
if opts.quiet {
println!("{}", ports_str);
exit(1);
}
let addr = opts.ip.to_string();
let user_nmap_args =
shell_words::split(&opts.command.join(" ")).expect("failed to parse nmap arguments");
let nmap_args = build_nmap_arguments(&addr, &ports_str, &user_nmap_args, opts.ip.is_ipv6());
if !opts.quiet {
println!("The Nmap command to be run is {}", &nmap_args.join(" "));
}
// Runs the nmap command and spawns it as a process.
let mut child = Command::new("nmap")
.args(&nmap_args)
.spawn()
.expect("failed to execute nmap process");
child.wait().expect("failed to wait on nmap process");
}
/// Prints the opening title of RustScan
@@ -243,7 +255,9 @@ fn infer_batch_size(opts: &Opts, ulimit: rlimit::rlim) -> u32 {
}
}
println!("The batch size is {}", batch_size);
if !opts.quiet {
println!("The batch size is {}", batch_size);
}
batch_size as u32
}
@@ -251,7 +265,7 @@ fn infer_batch_size(opts: &Opts, ulimit: rlimit::rlim) -> u32 {
#[cfg(test)]
mod tests {
use super::Scanner;
use crate::{adjust_ulimit_size, build_nmap_arguments, infer_batch_size, print_opening, Opts};
use crate::{adjust_ulimit_size, infer_batch_size, print_opening, Opts};
use async_std::task::block_on;
use std::{net::IpAddr, str::FromStr, time::Duration};
@@ -334,7 +348,7 @@ mod tests {
#[test]
fn batch_size_lowered() {
let opts = Opts {
ip: IpAddr::from_str("127.0.0.1").unwrap(),
ips: vec![IpAddr::from_str("127.0.0.1").unwrap()],
quiet: true,
batch_size: 50_000,
timeout: 1000,
@@ -349,7 +363,7 @@ mod tests {
#[test]
fn batch_size_lowered_average_size() {
let opts = Opts {
ip: IpAddr::from_str("127.0.0.1").unwrap(),
ips: vec![IpAddr::from_str("127.0.0.1").unwrap()],
quiet: true,
batch_size: 50_000,
timeout: 1000,
@@ -365,7 +379,7 @@ mod tests {
// because ulimit and batch size are same size, batch size is lowered
// to ULIMIT - 100
let opts = Opts {
ip: IpAddr::from_str("127.0.0.1").unwrap(),
ips: vec![IpAddr::from_str("127.0.0.1").unwrap()],
quiet: true,
batch_size: 50_000,
timeout: 1000,
@@ -380,7 +394,7 @@ mod tests {
fn batch_size_adjusted_2000() {
// ulimit == batch_size
let opts = Opts {
ip: IpAddr::from_str("127.0.0.1").unwrap(),
ips: vec![IpAddr::from_str("127.0.0.1").unwrap()],
quiet: true,
batch_size: 50_000,
timeout: 1000,
@@ -400,14 +414,15 @@ mod tests {
#[test]
fn test_high_ulimit_no_quiet_mode() {
let opts = Opts {
ip: IpAddr::from_str("127.0.0.1").unwrap(),
ips: vec![IpAddr::from_str("127.0.0.1").unwrap()],
quiet: false,
batch_size: 10,
timeout: 1000,
ulimit: None,
command: Vec::new(),
};
let batch_size = infer_batch_size(&opts, 1000000);
infer_batch_size(&opts, 1000000);
assert!(1 == 1);
}