mirror of
https://github.com/bee-san/RustScan.git
synced 2026-11-07 17:02:04 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4b24eb2ae | ||
|
|
e941869316 | ||
|
|
366c628b39 | ||
|
|
affa6b3ee4 | ||
|
|
9a843c99fd | ||
|
|
f0c4163f0b | ||
|
|
2594f40596 | ||
|
|
232c34da4e | ||
|
|
bcccca3785 | ||
|
|
7a4cc771c3 | ||
|
|
62c4b09268 | ||
|
|
acb13f44d2 | ||
|
|
f229c9a2ac | ||
|
|
bf6b70dc78 | ||
|
|
8b42d5d09d | ||
|
|
07aea167ca |
No files matched your search
+9
-3
@@ -1,8 +1,15 @@
|
||||
[package]
|
||||
name = "RustScan"
|
||||
version = "0.1.0"
|
||||
name = "rust_scan"
|
||||
version = "1.0.0"
|
||||
authors = ["Bee <[email protected]>"]
|
||||
edition = "2018"
|
||||
description = "Faster Nmap Scanning with Rust"
|
||||
homepage = "https://github.com/brandonskerritt/rustscan"
|
||||
repository = "https://github.com/brandonskerritt/rustscan"
|
||||
license = "MIT"
|
||||
keywords = ["port", "scanning", "nmap"]
|
||||
categories = ["command-line-utilities"]
|
||||
readme="README.md"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
@@ -10,4 +17,3 @@ edition = "2018"
|
||||
colored = "1.9.3"
|
||||
clap = "2.33.0"
|
||||
rayon = "1.3.1"
|
||||
arrayvec = "0.5.1"
|
||||
@@ -1,24 +1,16 @@
|
||||
# Maintainer: Ciphey <[email protected]>
|
||||
pkgname=Ciphey
|
||||
pkgver='5.0.0rc2'
|
||||
# Maintainer: Bee <[email protected]>
|
||||
pkgname=RustScan-bin
|
||||
pkgver=0.1.0
|
||||
pkgrel=1
|
||||
pkgdesc="Automated Description Tool"
|
||||
arch=('any')
|
||||
url="https://github.com/ciphey/ciphey"
|
||||
license=('MIT')
|
||||
depends=('python>=3.7')
|
||||
makedepends=('python>=3.7')
|
||||
install=
|
||||
changelog=
|
||||
#source=("$pkgname-$pkgver.tar.gz"
|
||||
#"$pkgname-$pkgver.patch")
|
||||
noextract=()
|
||||
md5sums=()
|
||||
validpgpkeys=()
|
||||
pkgdesc="Faster Nmap Scanning with Rust"
|
||||
url="https://github.com/brandonskerritt/rustscan"
|
||||
license=("GNU")
|
||||
arch=("x86_64")
|
||||
provides=("RustScan")
|
||||
options=("strip")
|
||||
source=("https://github.com/brandonskerritt/rustscan/releases/download/v$pkgver/RustScan-$pkgver-x86_64.tar.gz")
|
||||
sha256sums=("0ab268ae43a79cad6e9f75b650629208061590b3311780d55b8a03d35a8d90b0")
|
||||
|
||||
prepare() {
|
||||
python3 -m pip install --upgrade pip
|
||||
}
|
||||
package() {
|
||||
python3 -m pip install ciphey
|
||||
install -Dm755 RustScan -t "$pkgdir/usr/bin/"
|
||||
}
|
||||
@@ -1,25 +1,45 @@
|
||||
<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>
|
||||
<img alt="Crates.io" src="https://img.shields.io/crates/d/rust_scan">
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
| General Linux | Cargo | Arch |
|
||||
| ------------- | ------------- | ------------ |
|
||||
| img1 | img2 | img3 |
|
||||
| Binaries | Cargo install | yay rustscan |
|
||||
|
||||
| <p align="center"><a href="https://crates.io/crates/rust_scan">🔧 Cargo (Universal) </a></p> | <p align="center"><a href="https://pypi.org/project/ciphey"> Arch </a></p> | <p align="center"><a href="https://pypi.org/project/ciphey"> HomeBrew </a></p> | <p align="center"><a href="https://pypi.org/project/ciphey"> Kali / Debian </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 rust_scan` | `yay rustscan` | `brew install rustscan` | `dpkg -i rustscan.deb` |
|
||||
|
||||
**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.
|
||||
1. Find ports quickly using Rustscan (**27 seconds on average**).
|
||||
2. Automatically runs `nmap -A -sV -p $ports -vvv` on those ports.
|
||||
3. Profit???
|
||||
|
||||
[ GIFS HERE ]
|
||||
|
||||
Rustscans **only** job is to reduce the friction between finding open ports and inputting them into nmap.
|
||||
|
||||
# RustScan vs Nmap vs MassScan
|
||||
# ✨ Features
|
||||
* Scans all 64k ports in 27 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?
|
||||
|
||||
## 🔬 Without RustScan
|
||||
* Gif here comparison
|
||||
|
||||
## 📊 RustScan vs Nmap vs MassScan
|
||||
|
||||
| **Name** | RustScan | Nmap | Masscan |
|
||||
| ------------------------------------------------------------------------------------------ | -------- | ---- | ------- |
|
||||
@@ -28,9 +48,9 @@ Rustscans **only** job is to reduce the friction between finding open ports and
|
||||
| Realises it's not useful, and pipes the only useful data into the only useful port scanner | ✅ | ❌ | ❌ |
|
||||
|
||||
|
||||
## FAQ
|
||||
## 🙋 FAQ
|
||||
> I think this would be a great port scanner on its own without Nmap!
|
||||
>
|
||||
|
||||
No. If you want a fast port scanner, use Masscan.
|
||||
> I have this great idea for a script to get information on ports / hosts
|
||||
|
||||
@@ -41,18 +61,22 @@ If you're a pentester, then yes, you have Nmap installed.
|
||||
|
||||
> I want to contribute!
|
||||
|
||||
The only contributions RustScan are accecpting is:
|
||||
* User Experience
|
||||
* Making port scanning faster
|
||||
Great! I'd love some help with this. Read the [contributing.md file](contributing.md) file for more information!
|
||||
|
||||
# Other Hacking Projects
|
||||
## Ciphey
|
||||
# 📖 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).
|
||||
|
||||
The easiest way to install RustScan is to use one of the packages provided for your system, such as HomeBrew or Yay for Arch Linux.
|
||||
|
||||
The most universal way is to use `cargo`, Rust's built in package manager (think Pip but for Rust). [Follow this guide to installing Rust & Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html).
|
||||
|
||||
# Ideas
|
||||
If you face any issues at all, please leave a GitHub issue. I have only tested this on Linux, so there may be issues for Mac OS or Windows.
|
||||
|
||||
# 🎪 Contributing
|
||||
Please read the [contributing.md file](contributing.md)
|
||||
|
||||
# 💻 Other Hacking Projects By This Author
|
||||
## 🧮 Ciphey
|
||||
Ciphey is an automated decryption tool using artifical intelligence & natural language processing.
|
||||
[Check it out here!](https://github.com/ciphey/ciphey)
|
||||
|
||||
- [ ] Do popular ports first (80, 445, 8080, 21, 22)
|
||||
- [ ] Option for top 1k ports
|
||||
- [ ] Affter 1k ports print the nmap command to scan the first 1k so user can run while rustscanner finishes
|
||||
- [ ] Tar pit prevention (look for different sized payloads)
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,8 @@
|
||||
This is my first Rust project! As such, I expect there are many, many bugs involved or things that can be sped up.
|
||||
|
||||
In particular, here is my roadmap:
|
||||
* Tokio async
|
||||
* Better UX
|
||||
* Optimised code
|
||||
|
||||
Please leave issues / pull requests, I'd love to learn more about this amazing language :)
|
||||
@@ -0,0 +1,72 @@
|
||||
#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: 4.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
File diff suppressed because it is too large.
Load diff
Binary file not shown.
@@ -0,0 +1,13 @@
|
||||
# Generated by makepkg 5.2.1
|
||||
# using fakeroot version 1.24
|
||||
pkgname = RustScan-bin
|
||||
pkgbase = RustScan-bin
|
||||
pkgver = 0.1.0-1
|
||||
pkgdesc = Faster Nmap Scanning with Rust
|
||||
url = https://github.com/brandonskerritt/rustscan
|
||||
builddate = 1594732664
|
||||
packager = Unknown Packager
|
||||
size = 911768
|
||||
arch = x86_64
|
||||
license = GNU
|
||||
provides = RustScan
|
||||
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Symlink
+1
@@ -0,0 +1 @@
|
||||
/home/bee/Documents/RustScan/RustScan-0.1.0-x86_64.tar.gz
|
||||
+89
-58
@@ -1,91 +1,122 @@
|
||||
use colored::*;
|
||||
use clap::{App, crate_authors, Arg};
|
||||
use std::{str::FromStr, net::{IpAddr, TcpStream, SocketAddr}, ops::Range, u16, io};
|
||||
use rayon::{current_num_threads, prelude::*};
|
||||
use arrayvec::ArrayVec;
|
||||
use std::{sync::Mutex, time::Duration};
|
||||
|
||||
use clap::{App, Arg};
|
||||
use std::{str::FromStr, net::{IpAddr, TcpStream, SocketAddr}};
|
||||
use rayon::prelude::*;
|
||||
use std::time::Duration;
|
||||
use std::process::Command;
|
||||
/// Faster Nmap scanning with Rust
|
||||
///
|
||||
|
||||
fn main() {
|
||||
let vals = 0..100;
|
||||
// NMAP top 1k ports
|
||||
// let NMAP_1000 = vec!(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,6
Line truncated
|
||||
|
||||
let matches = App::new("RustScan")
|
||||
.author(crate_authors!())
|
||||
.author("Bee https://github.com/brandonskerritt")
|
||||
.about("Fast Port Scanner built in Rust")
|
||||
.version("0.01")
|
||||
|
||||
// IP address is a required argument
|
||||
.arg(Arg::with_name("i")
|
||||
.required(true)
|
||||
.index(1)
|
||||
.long("--ip-address")
|
||||
.long("ip-address")
|
||||
.help("The IP address to scan"))
|
||||
.arg(Arg::with_name("p")
|
||||
.index(2)
|
||||
.long("--ports")
|
||||
.help("The port range you want to scan"))
|
||||
.arg(Arg::with_name("t")
|
||||
.short("t")
|
||||
.long("threads")
|
||||
.takes_value(true)
|
||||
.default_value("1000")
|
||||
.help("How many threads do you want to use? Default 1000"))
|
||||
.arg(Arg::with_name("T")
|
||||
.short("T")
|
||||
.long("timeout")
|
||||
.takes_value(true)
|
||||
.default_value("250")
|
||||
.help("The timeout before a port is assumed to be close. Default 250, but can go up to 1000."))
|
||||
/*.arg(Arg::with_name("n")
|
||||
.short("n")
|
||||
.long("nmap-1000")
|
||||
.takes_value(true)
|
||||
.help("Use the nmap top 1k ports"))*/
|
||||
.get_matches();
|
||||
|
||||
print_opening();
|
||||
|
||||
let ip = matches.value_of("i").unwrap_or("None");
|
||||
if ip == "None"{
|
||||
println!("{}", "Error: No input was given.".red());
|
||||
return ();
|
||||
}
|
||||
|
||||
// validatses the IP address and turns it into an IpAddr type
|
||||
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 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");
|
||||
|
||||
println!("IP is {}", addr);
|
||||
|
||||
rayon::ThreadPoolBuilder::new().num_threads(1000).build_global().unwrap();
|
||||
thread_scan(addr);
|
||||
|
||||
// let _nmap: &str = "nmap -A -sV -vvv -p $ports $ipaddr"
|
||||
}
|
||||
|
||||
/// Runs Rayon to paralleise the scan
|
||||
|
||||
fn thread_scan(addr: IpAddr){
|
||||
|
||||
// timeout in miliseconds
|
||||
// TODO set this to ping
|
||||
let duration_timeout = Duration::from_millis(600);
|
||||
|
||||
let mut arr = Mutex::new(Vec::new());
|
||||
// increases thread pool
|
||||
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
|
||||
(1..100).into_par_iter().for_each(|x: i32| {
|
||||
// if valid port,
|
||||
let result = scan(addr, x, duration_timeout);
|
||||
if result.0 == true{
|
||||
arr.push(result.2);
|
||||
// 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);
|
||||
|
||||
// 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{
|
||||
// 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{
|
||||
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);
|
||||
|
||||
// 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");*/
|
||||
}
|
||||
|
||||
|
||||
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");
|
||||
|
||||
fn scan(addr: IpAddr, port_num: i32, duration_timeout: Duration) -> (bool, IpAddr, String){
|
||||
// pings it to see if its open
|
||||
let string_list = vec![addr.to_string(), ].join(":");
|
||||
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 and send to main thread
|
||||
println!("{}", server.to_string().green());
|
||||
return (true, addr, port_num.to_string());
|
||||
}
|
||||
Err(_) => {
|
||||
return (false, addr, port_num.to_string());
|
||||
// Found open port, indicate progress
|
||||
println!("{} open", port.to_string().green());
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
Err(_) => {return false;}
|
||||
|
||||
}
|
||||
}
|
||||
fn print_opening(){
|
||||
|
||||
Reference in new issue
Block a user