Compare commits

..
16 Commits
Author SHA1 Message Date
Brandon e0d1fbb860 readme updates 2020-07-19 12:51:25 +01:00
Brandon f330b7b3e6 Merge branch 'master' of github.com:brandonskerritt/RustScan 2020-07-19 12:46:38 +01:00
Brandon 617e77e428 making public 2020-07-19 12:46:26 +01:00
Brandon a86b6ffbae Update README.md 2020-07-19 10:56:32 +01:00
Brandon 22abe4ddda Update README.md 2020-07-19 10:49:48 +01:00
Brandon 80d066abfd Update README.md 2020-07-19 10:48:13 +01:00
Brandon 88fba17fc5 cleaning up 2020-07-19 10:44:22 +01:00
Brandon b7874574ec fixed tables 2020-07-19 10:30:20 +01:00
Brandon 548d76591b fixed tables 2020-07-19 10:28:42 +01:00
Brandon 2fedb1ccf8 fixed alignment issues 2020-07-19 10:26:41 +01:00
Brandon a5fbdd9441 made gifs 2020-07-19 10:24:37 +01:00
Brandon 176ec018d5 merge 2020-07-19 00:55:15 +01:00
Brandon d0b71449d0 Merge pull request #8 from brandonskerritt/all-contributors/add-brandonskerritt
docs: add brandonskerritt as a contributor
2020-07-18 22:20:10 +01:00
allcontributors[bot] fb93c454b1 docs: create .all-contributorsrc [skip ci] 2020-07-18 21:17:01 +00:00
allcontributors[bot] accc28b82f docs: update README.md [skip ci] 2020-07-18 21:17:00 +00:00
Brandon 55fb5a5547 Merge pull request #7 from brandonskerritt/mutex
mutex
2020-07-18 22:15:32 +01:00
11 changed files with 174 additions and 128 deletions

No files matched your search

+27
View File
@@ -0,0 +1,27 @@
{
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"contributors": [
{
"login": "brandonskerritt",
"name": "Brandon",
"avatar_url": "https://avatars3.githubusercontent.com/u/10378052?v=4",
"profile": "https://skerritt.blog",
"contributions": [
"infra",
"test",
"code",
"design"
]
}
],
"contributorsPerLine": 7,
"projectName": "RustScan",
"projectOwner": "brandonskerritt",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true
}
+32
View File
@@ -13,3 +13,35 @@ Cargo.lock
#Added by cargo
/target
# Created by https://www.toptal.com/developers/gitignore/api/rust,archlinuxpackages
# Edit at https://www.toptal.com/developers/gitignore?templates=rust,archlinuxpackages
### ArchLinuxPackages ###
*.tar
*.tar.*
*.jar
*.exe
*.msi
*.zip
*.tgz
*.log
*.log.*
*.sig
pkg/
src/
### Rust ###
# Generated by Cargo
# will have compiled files and executables
/target/
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock
# These are backup files generated by rustfmt
**/*.rs.bk
# End of https://www.toptal.com/developers/gitignore/api/rust,archlinuxpackages
+5 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "rust_scan"
version = "1.0.0"
name = "rustscan"
version = "1.0.1"
authors = ["Bee <[email protected]>"]
edition = "2018"
description = "Faster Nmap Scanning with Rust"
@@ -17,3 +17,6 @@ readme="README.md"
colored = "1.9.3"
clap = "2.33.0"
rayon = "1.3.1"
[package.metadata.deb]
depends = "$auto, nmap"
+52 -12
View File
@@ -1,7 +1,8 @@
<p align="center">
<img src="pictures/rustscan.png"><br>
Find all open ports <b>fast</b> with Rustscan, automatically pipe them into Nmap. Built with Rust.
<br>
</p>
<p align="center">
<img alt="Crates.io" src="https://img.shields.io/crates/d/rust_scan">
</p>
<hr>
@@ -15,29 +16,48 @@ Find all open ports <b>fast</b> with Rustscan, automatically pipe them into Nmap
**Note**: You must have Nmap installed.
<hr>
# TODO
* debian package
* terminal gifs
# 🤔 What is this?
If you are a competitive CTF player and often find yourself running masscan / a basic nmap scan before running a more comprehensive scan, this tool is for you.
1. Find ports quickly using Rustscan (**27 seconds on average**).
2. Automatically runs `nmap -A -sV -p $ports -vvv` on those ports.
1. Find ports quickly using Rustscan (**26 seconds**).
2. Automatically runs `nmap -A -p $ports -vvv` on those ports.
3. Profit???
[ GIFS HERE ]
![gif](/pictures/intro.gif)
Rustscans **only** job is to reduce the friction between finding open ports and inputting them into nmap.
# ✨ Features
* Scans all 64k ports in 27 seconds (on 1k threads).
* Scans all 64k ports in 26 seconds (on 1k threads).
* Saves you time by automatically piping it into Nmap. No more manual copying and pasting!
* Does one thing and does it well. **Only** purpose is to improve Nmap, not replace it!
# 🔭 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 64k ports in less than a minute?
## 🔬 Nmap with and without RustScan
## 🔬 Without RustScan
* Gif here comparison
<table>
<tr>
<th>Name</th>
<th>⚡ Nmap with RustScan ⚡ </th>
<th>🐢 Nmap 🐢</th>
</tr>
<tr>
<th>Gif</th>
<td><img src="pictures/with_rustscan.gif" alt="The guy she tells you not to worry about"></td>
<td><img src="pictures/without_rustscan.gif" alt="You"></td>
</tr>
<tr>
<th>Time</th>
<td>39 seconds</td>
<td>17 minutes and 41 seconds</td>
</tr>
<tr>
<th>Setup</th>
<td><ul><li>Set threads to 1000</li></ul></td>
<td><ul><li>Run nmap with -A for all scripts</li><li>Run Nmap with -p- for all ports</li></ul></td>
</tr>
</table>
<sub><b>Note</b> The nmap command used was the same for both of them. Nmap -A.</sub><br>
## 📊 RustScan vs Nmap vs MassScan
@@ -79,4 +99,24 @@ Please read the [contributing.md file](contributing.md)
## 🧮 Ciphey
Ciphey is an automated decryption tool using artifical intelligence & natural language processing.
[Check it out here!](https://github.com/ciphey/ciphey)
## Contributors ✨
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://skerritt.blog"><img src="https://avatars3.githubusercontent.com/u/10378052?v=4" width="100px;" alt=""/><br /><sub><b>Brandon</b></sub></a><br /><a href="#infra-brandonskerritt" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/brandonskerritt/RustScan/commits?author=brandonskerritt" title="Tests">⚠️</a> <a href="https://github.com/brandonskerritt/RustScan/commits?author=brandonskerritt" title="Code">💻</a> <a href="#design-brandonskerritt" title="Design">🎨</a></td>
</tr>
</table>
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
Binary file not shown.
Binary file not shown.
-72
View File
@@ -1,72 +0,0 @@
#include <boost/asio.hpp>
#include <boost/asio/post.hpp>
#include <memory>
#include <sys/resource.h>
#include <chrono>
#include <thread>
#include <set>
#include <iostream>
int main() {
auto timeout = std::chrono::milliseconds{500};
auto inter = std::chrono::microseconds{5};
boost::asio::io_context io_ctx;
boost::asio::thread_pool threads;
// Max out fds
::rlimit rl;
::getrlimit(RLIMIT_NOFILE, &rl);
rl.rlim_cur = rl.rlim_max;
::setrlimit(RLIMIT_NOFILE, &rl);
std::vector<bool> open(65536, false);
std::vector<std::atomic<bool>> done(65536);
std::vector<boost::asio::ip::tcp::socket> socks;
socks.reserve(65536);
auto target_ip = boost::asio::ip::make_address("45.33.32.156");
std::set top_ports{1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26,30,32,33,37,42,43,49,53,70,79,80,81,82,83,84,85,88,89,90,99,100,106,109,110,111,113,119,125,135,139,143,144,146,161,163,179,199,211,212,222,254,255,256,259,264,280,301,306,311,340,366,389,406,407,416,417,425,427,443,444,445,458,464,465,481,497,500,512,513,514,515,524,541,543,544,545,548,554,555,563,587,593,616,617,625,631,636,646,648,666,667,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,901,902,903,911,912,981,987,990,992,993,995,999,1000,1001,1002,1007,1009,1010,1011,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1102,1104,1105,1106,1107,1108,1110,1111,1112,1113,1114,1117,1119,1121,1122,1123,1124,1126,1130,1131,1132,1137,1138,1141,1145,1147,1148,1149,1151,1152,1154,1163,1164,1165,1166,1169,1174,1175,1183,1185,1186,1187,1192,1198,1199,1201,1213,1216,1217,1218,1233,1234,1236,1244,1247,1248,1259,1271,1272,1277,1287,1296,1300,1301,1309,1310,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,1718,1719,1720,1721,1723,1755,1761,1782,1783,1801,1805,1812,1839,1840,1862,1863,1864,1875,1900,1914,1935,1947,1971,1972,1974,1984,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2013,2020,2021,2022,2030,2033,2034,2035,2038,2040,2041,2042,2043,2045,2046,2047,2048,2049,2065,2068,2099,2100,2103,2105,2106,2107,2111,2119,2121,2126,2135,2144,2160,2161,2170,2179,2190,2191,2196,2200,2222,2251,2260,2288,2301,2323,2366,2381,2382,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,3006,3007,3011,3013,3017,3030,3031,3052,3071,3077,3128,3168,3211,3221,3260,3261,3268,3269,3283,3300,3301,3306,3322,3323,3324,3325,3333,3351,3367,3369,3370,3371,3372,3389,3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,3689,3690,3703,3737,3766,3784,3800,3801,3809,3814,3826,3827,3828,3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,4000,4001,4002,4003,4004,4005,4006,4045,4111,4125,4126,4129,4224,4242,4279,4321,4343,4443,4444,4445,4446,4449,4550,4567,4662,4848,4899,4900,4998,5000,5001,5002,5003,5004,5009,5030,5033,5050,5051,5054,5060,5061,5080,5087,5100,5101,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,5801,5802,5810,5811,5815,5822,5825,5850,5859,5862,5877,5900,5901,5902,5903,5904,5906,5907,5910,5911,5915,5922,5925,5950,5952,5959,5960,5961,5962,5963,5987,5988,5989,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6009,6025,6059,6100,6101,6106,6112,6123,6129,6156,6346,6389,6502,6510,6543,6547,6565,6566,6567,6580,6646,6666,6667,6668,6669,6689,6692,6699,6779,6788,6789,6792,6839,6881,6901,6969,7000,7001,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,8000,8001,8002,8007,8008,8009,8010,8011,8021,8022,8031,8042,8045,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8093,8099,8100,8180,8181,8192,8193,8194,8200,8222,8254,8290,8291,8292,8300,8333,8383,8400,8402,8443,8500,8600,8649,8651,8652,8654,8701,8800,8873,8888,8899,8994,9000,9001,9002,9003,9009,9010,9011,9040,9050,9071,9080,9081,9090,9091,9099,9100,9101,9102,9103,9110,9111,9200,9207,9220,9290,9415,9418,9485,9500,9502,9503,9535,9575,9593,9594,9595,9618,9666,9876,9877,9878,9898,9900,9917,9929,9943,9944,9968,9998,9999,10000,10001,10002,10003,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,15003,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,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,33354,33899,34571,34572,34573,35500,38292,40193,40911,41511,42510,44176,44442,44443,44501,45100,48080,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49163,49165,49167,49175,49176,49400,49999,50000,50001,50002,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,65Line truncated
for (uint16_t port = 1; port != 0; ++port) {
if (!top_ports.count(port))
done[port] = true;
}
for (size_t i = 0; i < 2; ++i) {
for (uint16_t port = 1; port != 0; ++port) {
if (done[port])
continue;
socks.emplace_back(io_ctx);
auto& sock = socks.back();
sock.async_connect(boost::asio::ip::tcp::endpoint{target_ip, port},
[&open, &done, port](boost::system::error_code err) {
if (!err || err.value() == boost::asio::error::connection_refused)
// Check to see if some bastard thread has broken our stuff
if (!done[port].exchange(true))
open[port] = !err.failed();
});
if (port % 128) {
boost::asio::post(threads, [&]() {
io_ctx.run();
});
std::this_thread::sleep_for(inter);
}
}
}
io_ctx.run_for(timeout);
io_ctx.stop();
for (uint16_t i = 1; i != 0; ++i)
if (open[i])
std::cout << i << std::endl;
return 0;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

+58 -42
View File
@@ -1,9 +1,12 @@
use colored::*;
use clap::{App, Arg};
use std::{str::FromStr, net::{IpAddr, TcpStream, SocketAddr}};
use colored::*;
use rayon::prelude::*;
use std::time::Duration;
use std::process::Command;
use std::time::Duration;
use std::{
net::{IpAddr, SocketAddr, TcpStream},
str::FromStr,
};
/// Faster Nmap scanning with Rust
fn main() {
@@ -24,7 +27,7 @@ fn main() {
.short("t")
.long("threads")
.takes_value(true)
.default_value("1000")
.default_value("250")
.help("How many threads do you want to use? Default 1000"))
.arg(Arg::with_name("T")
.short("T")
@@ -42,84 +45,94 @@ fn main() {
print_opening();
let ip = matches.value_of("i").unwrap_or("None");
let threads_str: &str = matches.value_of("t").unwrap_or("None");
let threads_str: &str = matches.value_of("t").unwrap_or("None");
// let nmap_arg = matches.value_of("n").unwrap_or("None");
let threads: usize = threads_str.parse::<usize>().unwrap();
// gets timeout duration
let duration_timeout= Duration::from_millis(matches.value_of("T").unwrap_or("None").parse::<u64>().unwrap());
let duration_timeout = Duration::from_millis(
matches
.value_of("T")
.unwrap_or("None")
.parse::<u64>()
.unwrap(),
);
// let ports = if !(nmap_arg == "None") { NMAP_1000.iter() } else {(1..65536)};
// validates the IP address and turns it into an IpAddr type
let addr = IpAddr::from_str(&ip)
.expect("IPADDR must be a valid IPv4 or IPv6 address");
// validates the IP address and turns it into an IpAddr type
let addr = IpAddr::from_str(&ip).expect("IPADDR must be a valid IPv4 or IPv6 address");
// increases thread pool
rayon::ThreadPoolBuilder::new().num_threads(threads).build_global().unwrap();
rayon::ThreadPoolBuilder::new()
.num_threads(threads)
.build_global()
.unwrap();
// collect_into_vec is faster than into_vec
let mut ports_full: Vec<bool> = vec![false; 65536];
// performs the scan using rayon
// 65535 + 1 because of 0 indexing
// TODO let the user decide max port number
(1..65536).into_par_iter()
.map(|x: i32| scan(addr, x, duration_timeout))
.collect_into_vec(&mut ports_full);
(1..65536)
.into_par_iter()
.map(|x: i32| scan(addr, x, duration_timeout))
.collect_into_vec(&mut ports_full);
// prints ports and places them into nmap string
let mut nmap_str_ports = Vec::new();
// makes vector of open ports
for (i, item) in ports_full.iter().enumerate(){
if item == &true{
for (i, item) in ports_full.iter().enumerate() {
if item == &true {
// appends it to port
nmap_str_ports.push((i + 1).to_string());
}
}
// if no ports are found, suggest running with less threads
if nmap_str_ports.len() == 0{
if nmap_str_ports.is_empty() {
panic!("{} Looks like I didn't find any open ports. This is usually caused by too many threads. \n*I used {} threads, consider lowering to {} with {} or a comfortable number lfor your system. \n Alternatively, increase the timeout if your ping is high. Rustscan -T 1500 for 1.5 second timeout.", "ERROR".red(), threads_str, (threads / 2).to_string().green(), "'rustscan -t <thread_nums> <ip address>'".green());
}
// Tells the user we are now switching to Nmap
println!("{} -A -p {:?} -vvv {}", "Starting nmap".blue(), nmap_str_ports, ip);
println!(
"{} -A -p {:?} -vvv {}",
"Starting nmap".blue(),
nmap_str_ports,
ip
);
// nmap port style is 80,443. Comma seperated with no spaces.
let ports_str = nmap_str_ports.join(",");
// Runs the nmap command and spawns it as a process.
/*Command::new("nmap")
.arg("-A")
.arg("-p")
.arg(ports_str)
.arg("-vvv")
.arg(ip)
.spawn()
.expect("failed to execute process");*/
Command::new("nmap")
.arg("-A")
.arg("-p")
.arg(ports_str)
.arg("-vvv")
.arg(ip)
.spawn()
.expect("failed to execute process");
}
fn scan(addr: IpAddr, port: i32, duration_timeout: Duration) -> bool {
let string_list = vec![addr.to_string(), port.to_string()].join(":");
let server: SocketAddr = string_list
.parse()
.expect("Unable to parse socket address");
let server: SocketAddr = string_list.parse().expect("Unable to parse socket address");
match TcpStream::connect_timeout(&server,duration_timeout) {
match TcpStream::connect_timeout(&server, duration_timeout) {
Ok(_) => {
// Found open port, indicate progress
println!("{} open", port.to_string().green());
return true;
true
}
Err(_) => {
false
}
Err(_) => {return false;}
}
}
fn print_opening(){
fn print_opening() {
let s = "
_____ _ _____
| __ \\ | | / ____|
@@ -127,8 +140,11 @@ fn print_opening(){
| _ / | | / __| __|\\___ \\ / __/ _` | '_ \\
| | \\ \\ |_| \\__ \\ |_ ____) | (_| (_| | | | |
|_| \\_\\__,_|___/\\__|_____/ \\___\\__,_|_| |_|
Faster nmap scanning with rust.";
println!("{} \n {} \n {}", s.green(), "Automated Decryption Tool - https://github.com/ciphey/ciphey".red(),"Creator https://github.com/brandonskerritt".green());
Faster nmap scanning with rust.";
println!(
"{} \n {} \n {}",
s.green(),
"Automated Decryption Tool - https://github.com/ciphey/ciphey".red(),
"Creator https://github.com/brandonskerritt".green()
);
}