mirror of
https://github.com/bee-san/RustScan.git
synced 2026-11-07 09:46:04 -10:00
Compare commits
50
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7695a97bb | ||
|
|
11d4d6250e | ||
|
|
26be07b7cd | ||
|
|
d9c4134657 | ||
|
|
44fb76da7f | ||
|
|
b609f40bd2 | ||
|
|
bc1a33b327 | ||
|
|
4b29527051 | ||
|
|
fa4ee5d750 | ||
|
|
74677c5f4d | ||
|
|
6c2c845812 | ||
|
|
b2c3dfa7e3 | ||
|
|
028799e5cd | ||
|
|
a86959158d | ||
|
|
6b941ce10f | ||
|
|
64acfd1f00 | ||
|
|
27d1e84b95 | ||
|
|
f13cebce4b | ||
|
|
ae46a75253 | ||
|
|
8641021134 | ||
|
|
b5d43dd23a | ||
|
|
b39c907b1a | ||
|
|
237afacb44 | ||
|
|
9e10d07a53 | ||
|
|
79e716cff7 | ||
|
|
fa5b081602 | ||
|
|
226d2d4686 | ||
|
|
18eb55f1a4 | ||
|
|
5d1318c52a | ||
|
|
574cd3fee3 | ||
|
|
ffca404263 | ||
|
|
1d958bbb89 | ||
|
|
1e404d8c3d | ||
|
|
3c57d384d7 | ||
|
|
834b6a4110 | ||
|
|
d579b827b8 | ||
|
|
6f76265a73 | ||
|
|
bf76e91c55 | ||
|
|
6e8647dac8 | ||
|
|
5b58677134 | ||
|
|
ad6b0045e4 | ||
|
|
281202402e | ||
|
|
d820de0d7f | ||
|
|
4dd58a6efa | ||
|
|
81e82e6fc8 | ||
|
|
a6561fb96a | ||
|
|
553baf91bb | ||
|
|
fa337fbe33 | ||
|
|
bd0af601bf | ||
|
|
96052b1531 |
No files matched your search
@@ -1,14 +1,12 @@
|
||||
pkgbase = rustscan-bin
|
||||
pkgdesc = Faster Nmap Scanning with Rust
|
||||
pkgver = 1.0.1
|
||||
pkgver = 1.1.0
|
||||
pkgrel = 1
|
||||
url = https://github.com/brandonskerritt/rustscan
|
||||
arch = x86_64
|
||||
license = MIT
|
||||
depends = rustup
|
||||
provides = rustscan
|
||||
options = strip
|
||||
source = https://github.com/brandonskerritt/rustscan/releases/download/v1.0.1/rustscan-1.0.1-x86_64.tar.gz
|
||||
sha256sums = 63f8386a20044843bf3f70cf963971a4c413382c20c0c9d8343e1423b28bec77
|
||||
|
||||
pkgname = rustscan-bin
|
||||
|
||||
@@ -16,6 +16,26 @@
|
||||
"code",
|
||||
"design"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "SakiiR",
|
||||
"name": "SakiiR",
|
||||
"avatar_url": "https://avatars1.githubusercontent.com/u/9950578?v=4",
|
||||
"profile": "https://sakiir.ovh",
|
||||
"contributions": [
|
||||
"code",
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "smackhack",
|
||||
"name": "smackhack",
|
||||
"avatar_url": "https://avatars2.githubusercontent.com/u/48143394?v=4",
|
||||
"profile": "https://github.com/smackhack",
|
||||
"contributions": [
|
||||
"ideas",
|
||||
"example"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
todo:
|
||||
keyword: "TODO"
|
||||
@@ -1,6 +1,7 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
/rustscan-debbuilder/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
|
||||
|
||||
+2
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "rustscan"
|
||||
version = "1.1.0"
|
||||
version = "1.2.0"
|
||||
authors = ["Bee <[email protected]>"]
|
||||
edition = "2018"
|
||||
description = "Faster Nmap Scanning with Rust"
|
||||
@@ -19,6 +19,7 @@ clap = "2.33.0"
|
||||
rayon = "1.3.1"
|
||||
async-std = "1.6.2"
|
||||
futures = "0.3"
|
||||
rlimit = "0.3.0"
|
||||
|
||||
[package.metadata.deb]
|
||||
depends = "$auto, nmap"
|
||||
@@ -1,16 +1,14 @@
|
||||
# Maintainer: Bee <[email protected]>
|
||||
pkgname=rustscan-bin
|
||||
pkgver=1.0.1
|
||||
pkgver=1.1.0
|
||||
pkgrel=1
|
||||
pkgdesc="Faster Nmap Scanning with Rust"
|
||||
url="https://github.com/brandonskerritt/rustscan"
|
||||
license=("MIT")
|
||||
arch=("x86_64")
|
||||
provides=("rustscan")
|
||||
options=("strip")
|
||||
source=("https://github.com/brandonskerritt/rustscan/releases/download/v$pkgver/rustscan-$pkgver-x86_64.tar.gz")
|
||||
sha256sums=("63f8386a20044843bf3f70cf963971a4c413382c20c0c9d8343e1423b28bec77")
|
||||
depends=('rustup')
|
||||
|
||||
package() {
|
||||
install -Dm755 rustscan -t "$pkgdir/usr/bin/"
|
||||
rustup toolchain install stable && cargo install rustscan
|
||||
}
|
||||
@@ -3,7 +3,6 @@
|
||||
<u><b> Turns a 17 minutes Nmap scan into 19 seconds. </b></u><br> Find all open ports <b>fast</b> with Rustscan, automatically pipe them into Nmap.
|
||||
</p>
|
||||
<p align="center">
|
||||
<img alt="Crates.io" src="https://img.shields.io/crates/d/rust_scan">
|
||||
<img alt="AUR version" src="https://img.shields.io/aur/version/rustscan-bin">
|
||||
<img src="https://img.shields.io/badge/Built%20with-Rust-Purple">
|
||||
<img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/w/brandonskerritt/rustscan">
|
||||
@@ -14,10 +13,8 @@
|
||||
| <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"><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> |
|
||||
| **Version 1.1.0** | Version 1.0.0 | Version 1.0.0 | Version 1.0.0 |
|
||||
| `cargo install rustscan` | `yay 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) |
|
||||
| `cargo install rustscan` | `yay -S rustscan-bin` | `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) |
|
||||
|
||||
**Note**: Version 1.1 runs in 8 seconds with batch size 10,000, version 1 runs in ~26 seconds on 1k threads, or average 1 - 2 minutes. I am updating the other package, but for maximum speed and latest support please use Cargo.
|
||||
<hr>
|
||||
|
||||
# 🤔 What is this?
|
||||
@@ -96,9 +93,20 @@ If you face any issues at all, please leave a GitHub issue. I have only tested t
|
||||
## 🖥️ Debian / Kali
|
||||
|
||||
Download the .deb file from the releases page:
|
||||
[https://github.com/brandonskerritt/RustScan/releases/tag/1.0.1](https://github.com/brandonskerritt/RustScan/releases/tag/1.0.1)
|
||||
[https://github.com/brandonskerritt/RustScan/releases](https://github.com/brandonskerritt/RustScan/releases)
|
||||
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!
|
||||
|
||||
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/`
|
||||
|
||||
## 🍺 HomeBrew
|
||||
|
||||
Tap the brew:
|
||||
@@ -113,18 +121,120 @@ Install it:
|
||||
brew install rustscan
|
||||
```
|
||||
|
||||
## 🔧 Building it yourself
|
||||
|
||||
1. Git clone the repo.
|
||||
2. 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
|
||||
3. cd into the Git repo, and run `cargo build --release`
|
||||
4. The binary is located at `target/release/rustscan`
|
||||
5. Symlink to the binary or something. Whatever you want!
|
||||
|
||||
# 🤸 Usage
|
||||
|
||||
```
|
||||
rustscan -h
|
||||
```
|
||||
|
||||
The format is `rustcan -b 500 -T 1500 192.168.0.1` to scan 192.168.0.1 with 500 batch size with a timeout of 1500ms. The timeout is how long RustScan waits for a response until it assumes the port is closed.
|
||||
```
|
||||
RustScan 1.2.0
|
||||
Bee https://github.com/brandonskerritt
|
||||
Fast Port Scanner built in Rust
|
||||
|
||||
USAGE:
|
||||
rustscan [OPTIONS] <ip> [command]...
|
||||
|
||||
FLAGS:
|
||||
-h, --help Prints help information
|
||||
-V, --version Prints version information
|
||||
|
||||
OPTIONS:
|
||||
-T, --timeout <T> The timeout before a port is assumed to be close. In MS. [default: 1500]
|
||||
-b, --batch <b> Increases speed of scanning. The batch size for port scanning. Depends on your open file limit
|
||||
of OS. If you do 65535 it will do every port at the same time. Although, your OS may not
|
||||
support this. [default: 4500]
|
||||
|
||||
ARGS:
|
||||
<ip> The IP address to scan
|
||||
<command>... The Nmap arguments to run. To use the argument -A, end RustScan's args with '-- -A'. To run
|
||||
EXAMPLE: 'rustscan -T 1500 127.0.0.1 -- -A -sC'. This argument auto runs nmap {your commands}
|
||||
-vvv -p $PORTS
|
||||
```
|
||||
|
||||
The format is `rustscan -b 500 -T 1500 192.168.0.1` to scan 192.168.0.1 with 500 batch size with a timeout of 1500ms. The timeout is how long RustScan waits for a response until it assumes the port is closed.
|
||||
|
||||
The batch size determines how fast RustScan is. Set it to 65k, and it will scan all 65k ports at the same time. This means at at 65k batch size, RustScan will take TIMEOUT long to scan all ports. Essentially, if timeout is 1000ms, **RustScan can scan in 1 second**.
|
||||
|
||||
Your operating system may not support this, but it is worth it to play around and see where your open file limit is. Shortly I will be releasing a dockerised version with a much larger open file limit, so this will be possible.
|
||||
## 🔌 Nmap
|
||||
|
||||
## ⚠️ WARNING
|
||||
|
||||
This program, by default, scans 5000 ports at a time (5000 per second).
|
||||
|
||||
This may cause damage to a server, or may make it incredibly obvious you are scanning the server.
|
||||
|
||||
There are 2 ways to deal with this;
|
||||
1. Decrease batch size
|
||||
`rustscan -b 10` will run 10 port scans for 1 second, and then another 10 for 1 second and so on.
|
||||
2. Increase timeout
|
||||
`rustscan -T 5000` will mean RustScan waits 5 seconds until it scans the next ports.
|
||||
|
||||
You can also use both of these at the same time, to make it as slow or as fast as you want. A fun favourite is 65535 batch size with 1 second timeout. Theoretically, this scans all 65535 ports in 1 second.
|
||||
|
||||
**Please** do not use this tool against sensitive servers. It is designed mainly for Capture the Flag events, not real world servers with sensitive data.
|
||||
|
||||
## 🚨 Thread Paniced at Main: Too Many Open Files
|
||||
This is the most common error found in RustScan.
|
||||
|
||||
The open file limit is how many open sockets you can have at any given time.
|
||||
|
||||
This limit changes from OS to OS.
|
||||
|
||||
RustScan does not automatically create defaults (other than 5000) like Nmap does with their -T1, -T2 system.
|
||||
|
||||
By figuring out for yourself the optimal batch size, you will know that RustScan is the most optimised port scanner for your system.
|
||||
|
||||
There are 2 things you can do:
|
||||
1. Decrease batch size
|
||||
2. Increase open file limit
|
||||
|
||||
Decreasing batch size slows down the program, so as long as it isn't too drastic, this is a good option.
|
||||
|
||||
Run these 3 commands:
|
||||
|
||||
```
|
||||
ulimit -a
|
||||
ulimit -Hn
|
||||
ulimit -Sn
|
||||
```
|
||||
|
||||
They will give you an idea on the open file limit of your OS.
|
||||
|
||||
If it says "250", run `rustscan -b 240` for a batch size of 240.
|
||||
|
||||
Increasing the open file limit increases speed, but poses danger. Although, **opening more file sockets on the specified IP address may damage it**.
|
||||
|
||||
To open more, set the ulimit to a higher number:
|
||||
|
||||
```
|
||||
ulimit -n 5000
|
||||
```
|
||||
|
||||
**Mac OS**
|
||||
Mac OS has, from what I can tell, a naturally very low open file descriptor limit. The limit for Ubuntu is 8800. The limit for Mac OS is 255!
|
||||
|
||||
In this case, I would say it is safe to increase the open file limit. As most Linux based OS' have limits in the thousands.
|
||||
|
||||
Although, if this breaks anything, please don't blame me.
|
||||
|
||||
**Windows Subsystem for Linux**
|
||||
Windows Subsystem for Linux does not support ulimt (see issue #39).
|
||||
|
||||
The best way is to use it on a host computer, in Docker, or in a VM that isn't WSL.
|
||||
|
||||
**Automatic Ulimit updating**
|
||||
We are currently working on automatic Ulimit updating. If it is too high, it will lower itself. If it is too low, it will suggest a higher Ulimit. Watch [this issue](https://github.com/brandonskerritt/RustScan/issues/25) for more.
|
||||
|
||||
## 🔌 Nmap Custom Flags
|
||||
To run your own nmap commands, end the RustScan command with `-- -A` where `--` indicates "end of RustScan flags, please do not parse anything further" and any flags after that will be entered into nmap.
|
||||
|
||||
RustScan automatically runs `nmap -vvv -p $PORTS $IP`. To make it run `-A`, execute the command `rustscan 127.0.0.1 -- -A`.
|
||||
@@ -133,10 +243,13 @@ RustScan automatically runs `nmap -vvv -p $PORTS $IP`. To make it run `-A`, exec
|
||||
|
||||
## 🎯 Increasing speed / accuracy
|
||||
* Batch size
|
||||
This increases speed, by allowing us to process more at once. Something experimental I am working on is changing the open file limit. You can do this manually with `ulimit -n 70000` and then running rustscan with `-B 65535`. This _should_ scan all 65535 ports at the exact same time. But this is extremely experimental.
|
||||
|
||||
This increases speed, by allowing us to process more at once. Something experimental I am working on is changing the open file limit. You can do this manually with `ulimit -n 70000` and then running rustscan with `-b 65535`. This _should_ scan all 65535 ports at the exact same time. But this is extremely experimental.
|
||||
|
||||
For non-experimental speed increases, slowly increase the batch size until it no longer gets open ports, or it breaks.
|
||||
|
||||
* Accuracy (and some speed)
|
||||
|
||||
To increase accuracy, the easiest way is to increase the timeout. The default is 1.5 seconds, by setting it to 4 seconds (4000) we are telling RustScan "if we do not hear back from a port in 4 seconds, assume it is closed".
|
||||
|
||||
Decreasing accuracy gives some speed bonus, but my testing found that batch size dramatically changed the speed whereas timeout did, but not so much.
|
||||
@@ -150,7 +263,7 @@ Ciphey is an automated decryption tool using artifical intelligence & natural la
|
||||
[Check it out here!](https://github.com/ciphey/ciphey)
|
||||
## Contributors ✨
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||
[](#contributors-)
|
||||
[](#contributors-)
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
|
||||
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
@@ -161,6 +274,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<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>
|
||||
<td align="center"><a href="https://sakiir.ovh"><img src="https://avatars1.githubusercontent.com/u/9950578?v=4" width="100px;" alt=""/><br /><sub><b>SakiiR</b></sub></a><br /><a href="https://github.com/brandonskerritt/RustScan/commits?author=SakiiR" title="Code">💻</a> <a href="https://github.com/brandonskerritt/RustScan/issues?q=author%3ASakiiR" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="https://github.com/smackhack"><img src="https://avatars2.githubusercontent.com/u/48143394?v=4" width="100px;" alt=""/><br /><sub><b>smackhack</b></sub></a><br /><a href="#ideas-smackhack" title="Ideas, Planning, & Feedback">🤔</a> <a href="#example-smackhack" title="Examples">💡</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
Binary file not shown.
@@ -1,13 +0,0 @@
|
||||
# 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
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,11 @@
|
||||
# Test builder. Rename to something else (like docker-compose.override.yml.bak)
|
||||
# to use the normal builder.
|
||||
version: '3'
|
||||
services:
|
||||
rustscan-builder:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: rustscan-debbuilder/testing/Dockerfile
|
||||
image: rustscan-builder-dev
|
||||
volumes:
|
||||
- ./target:/sourcefiles/target
|
||||
@@ -0,0 +1,7 @@
|
||||
version: '3'
|
||||
services:
|
||||
rustscan-builder:
|
||||
build: ./dockerstuff
|
||||
image: rustscan-builder
|
||||
volumes:
|
||||
- ./debs:/debs
|
||||
@@ -0,0 +1,20 @@
|
||||
FROM rust:latest
|
||||
|
||||
RUN git clone https://github.com/brandonskerritt/RustScan
|
||||
WORKDIR "/RustScan"
|
||||
RUN git pull --force
|
||||
RUN cargo install cargo-deb
|
||||
|
||||
RUN apt update -y && apt upgrade -y
|
||||
RUN apt install libc6-dev-i386 -y
|
||||
RUN git clone --depth=1 https://github.com/raspberrypi/tools /raspberrypi-tools
|
||||
ENV PATH=/raspberrypi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/:$PATH
|
||||
ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
|
||||
RUN mkdir /root/.cargo
|
||||
RUN echo "[target.arm-unknown-linux-gnueabihf]" >> /root/.cargo/config
|
||||
RUN echo "strip = { path = \"arm-linux-gnueabihf-strip\" }" >> /root/.cargo/config
|
||||
RUN echo "objcopy = { path = \"arm-linux-gnueabihf-objcopy\" }" >> /root/.cargo/config
|
||||
|
||||
COPY ./entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd /RustScan
|
||||
git pull --force
|
||||
|
||||
#amd64
|
||||
cargo deb
|
||||
|
||||
#arm64
|
||||
rustup target add arm-unknown-linux-gnueabihf
|
||||
cargo deb --target=arm-unknown-linux-gnueabihf
|
||||
|
||||
#i386
|
||||
rustup target add i686-unknown-linux-gnu
|
||||
cargo deb --target=i686-unknown-linux-gnu
|
||||
|
||||
find target/ -name \*.deb -exec cp {} /debs \;
|
||||
@@ -0,0 +1,18 @@
|
||||
FROM rust:latest
|
||||
|
||||
COPY . /sourcefiles
|
||||
WORKDIR "/sourcefiles"
|
||||
|
||||
RUN apt update -y && apt upgrade -y
|
||||
RUN apt install libc6-dev-i386 -y
|
||||
RUN git clone --depth=1 https://github.com/raspberrypi/tools /raspberrypi-tools
|
||||
ENV PATH=/raspberrypi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/:$PATH
|
||||
ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
|
||||
RUN mkdir /root/.cargo
|
||||
RUN echo "[target.arm-unknown-linux-gnueabihf]" >> /root/.cargo/config
|
||||
RUN echo "strip = { path = \"arm-linux-gnueabihf-strip\" }" >> /root/.cargo/config
|
||||
RUN echo "objcopy = { path = \"arm-linux-gnueabihf-objcopy\" }" >> /root/.cargo/config
|
||||
|
||||
COPY rustscan-debbuilder/testing/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd /sourcefiles
|
||||
|
||||
#amd64
|
||||
cargo build --release
|
||||
|
||||
#arm64
|
||||
rustup target add arm-unknown-linux-gnueabihf
|
||||
cargo build --release --target=arm-unknown-linux-gnueabihf
|
||||
|
||||
#i386
|
||||
rustup target add i686-unknown-linux-gnu
|
||||
cargo build --release --target=i686-unknown-linux-gnu
|
||||
+98
-20
@@ -6,19 +6,18 @@ use std::process::{exit, Command};
|
||||
use std::time::Duration;
|
||||
use std::{
|
||||
net::{SocketAddr, Shutdown},
|
||||
io::ErrorKind,
|
||||
io::ErrorKind, convert::TryInto,
|
||||
};
|
||||
use async_std::prelude::*;
|
||||
use futures::stream::FuturesUnordered;
|
||||
use futures::executor::block_on;
|
||||
use rlimit::Resource;
|
||||
use rlimit::{setrlimit, getrlimit};
|
||||
/// Faster Nmap scanning with Rust
|
||||
fn main() {
|
||||
// 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("Bee https://github.com/brandonskerritt")
|
||||
.about("Fast Port Scanner built in Rust")
|
||||
.about("Fast Port Scanner built in Rust\nWARNING Do not use this program against sensitive infrastructure. The specified server may not be able to handle this many socket connections at once.")
|
||||
.version("1.2.0")
|
||||
.setting(AppSettings::TrailingVarArg)
|
||||
|
||||
@@ -40,6 +39,16 @@ fn main() {
|
||||
.takes_value(true)
|
||||
.default_value("1500")
|
||||
.help("The timeout before a port is assumed to be close. In MS."))
|
||||
.arg(Arg::with_name("q")
|
||||
.short("-q")
|
||||
.long("quiet")
|
||||
.takes_value(false)
|
||||
.help("Quiet mode. Only output the ports. No Nmap. Useful for grep or outputting to a file."))
|
||||
.arg(Arg::with_name("u")
|
||||
.short("u")
|
||||
.long("ulimit")
|
||||
.help("Automatically ups the ULIMIT with the value you provided.")
|
||||
.takes_value(true))
|
||||
.arg(
|
||||
Arg::with_name("command")
|
||||
.help("The Nmap arguments to run. To use the argument -A, end RustScan's args with '-- -A'. To run EXAMPLE: 'rustscan -T 1500 127.0.0.1 -- -A -sC'. This argument auto runs nmap {your commands} -vvv -p $PORTS ")
|
||||
@@ -48,9 +57,10 @@ fn main() {
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
print_opening();
|
||||
|
||||
|
||||
let ip = matches.value_of("ip").unwrap_or("None");
|
||||
let ulimit_arg = matches.value_of("u").unwrap_or("None");
|
||||
let quiet = if matches.is_present("q") { true } else { false };
|
||||
let command_matches= matches.values_of("command");
|
||||
let command_run: String = match command_matches {
|
||||
// We use the user supplied args
|
||||
@@ -63,11 +73,63 @@ fn main() {
|
||||
|
||||
};
|
||||
|
||||
let batch_size: u32 = matches
|
||||
let mut batch_size: u64 = matches
|
||||
.value_of("b")
|
||||
.unwrap_or("None")
|
||||
.parse::<u32>()
|
||||
.parse::<u64>()
|
||||
.unwrap();
|
||||
|
||||
if !quiet {
|
||||
print_opening();
|
||||
}
|
||||
|
||||
// checks ulimit
|
||||
|
||||
// change ulimit size
|
||||
if !(ulimit_arg == "None") {
|
||||
let limit = ulimit_arg.parse::<u64>().unwrap();
|
||||
if !quiet{
|
||||
println!("Automatically upping ulimit to {}", ulimit_arg);
|
||||
}
|
||||
setrlimit(Resource::NOFILE, limit, limit);
|
||||
}
|
||||
|
||||
let (x, _) = getrlimit(Resource::NOFILE).unwrap();
|
||||
|
||||
// if maximum limit is lower than batch size
|
||||
// automatically re-adjust the batch size
|
||||
if x < batch_size.into() {
|
||||
if !quiet{
|
||||
println!("{}", "WARNING: Your file description limit is lower than selected batch size. Please considering upping this (how to is on the README). NOTE: this may be dangerous and may cause harm to sensitive servers. Automatically reducing Batch Size to match your limit, this process isn't harmful but reduces speed.".red());
|
||||
// TODO this is a joke please fix
|
||||
|
||||
// if the OS supports high file limits like 8000
|
||||
// but the user selected a batch size higher than this
|
||||
// reduce to a lower number
|
||||
// basically, ubuntu is 8000
|
||||
// but i can only get it to work on < 5k in testing
|
||||
// 5k is default, so 3000 seems safe
|
||||
if x > 8000{
|
||||
batch_size = 3000
|
||||
}
|
||||
else {
|
||||
let ten: u64 = 100;
|
||||
batch_size = x - ten;
|
||||
}
|
||||
}
|
||||
}
|
||||
// else if the ulimit is higher than batch size
|
||||
// tell the user they can increase batch size
|
||||
// if the user set ulimit arg they probably know what they are doing so don't print this
|
||||
else if x + 2 > batch_size.into() && (ulimit_arg == "None"){
|
||||
if !quiet{
|
||||
// TODO this is a joke please fix
|
||||
let one: u64 = 1;
|
||||
println!("Your file description limit is higher than the batch size. You can potentially increase the speed by increasing the batch size, but this may cause harm to sensitive servers. Your limit is {}, try batch size {}.", x, x - one);
|
||||
}
|
||||
}
|
||||
// the user has asked to automatically up the ulimit
|
||||
|
||||
|
||||
// gets timeout
|
||||
let duration_timeout =
|
||||
@@ -78,8 +140,9 @@ fn main() {
|
||||
.unwrap();
|
||||
|
||||
|
||||
|
||||
// 65535 + 1 because of 0 indexing
|
||||
let test = run_batched(ip.to_string(), 1, 65536, Duration::from_millis(duration_timeout), batch_size);
|
||||
let test = run_batched(ip.to_string(), 1, 65536, Duration::from_millis(duration_timeout,), batch_size.try_into().unwrap(), quiet);
|
||||
let reports_fullsult = block_on(test);
|
||||
|
||||
|
||||
@@ -100,13 +163,23 @@ fn main() {
|
||||
}
|
||||
|
||||
// Tells the user we are now switching to Nmap
|
||||
println!(
|
||||
"{}",
|
||||
"Starting nmap.".blue(),
|
||||
);
|
||||
if !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 quiet{
|
||||
println!("{:?}", ports_str);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
let string_format = format!("{} {} {} {} {}", command_run, "-vvv", "-p", &ports_str, ip);
|
||||
let command_list = string_format.split_whitespace();
|
||||
let vec = command_list.collect::<Vec<&str>>();
|
||||
@@ -124,6 +197,7 @@ pub async fn run_batched(
|
||||
port_end: u32,
|
||||
timeout: Duration,
|
||||
batch: u32,
|
||||
quiet: bool,
|
||||
) -> Vec<u32> {
|
||||
// run the scans in batches
|
||||
let mut begin = port_start;
|
||||
@@ -131,7 +205,7 @@ pub async fn run_batched(
|
||||
let mut all_addrs: std::vec::Vec<u32> = Vec::new();
|
||||
|
||||
while end <= port_end {
|
||||
let mut batch_addrs = execute(host.clone(), begin, end, timeout).await;
|
||||
let mut batch_addrs = execute(host.clone(), begin, end, timeout, quiet).await;
|
||||
all_addrs.append(&mut batch_addrs);
|
||||
begin = end+1;
|
||||
end += batch;
|
||||
@@ -143,12 +217,13 @@ async fn execute(
|
||||
port_start: u32,
|
||||
port_end: u32,
|
||||
timeout: Duration,
|
||||
quiet: bool,
|
||||
) -> Vec<u32> {
|
||||
// runs a scan against a range of ports
|
||||
let mut ftrs = FuturesUnordered::new();
|
||||
// TODO can I make this async?
|
||||
for port in port_start..port_end {
|
||||
ftrs.push(try_connect(host.clone(), port, timeout));
|
||||
ftrs.push(try_connect(host.clone(), port, timeout, quiet));
|
||||
}
|
||||
|
||||
let mut open_addrs: Vec<u32> = Vec::new();
|
||||
@@ -162,7 +237,7 @@ async fn execute(
|
||||
open_addrs
|
||||
}
|
||||
|
||||
async fn try_connect(host: String, port: u32, timeout: Duration) -> io::Result<u32> {
|
||||
async fn try_connect(host: String, port: u32, timeout: Duration, quiet: bool) -> io::Result<u32> {
|
||||
let addr = host.to_string() + ":" + &port.to_string();
|
||||
match addr.parse() {
|
||||
Ok(sock_addr) => match connect(sock_addr, timeout).await {
|
||||
@@ -170,13 +245,16 @@ async fn try_connect(host: String, port: u32, timeout: Duration) -> io::Result<u
|
||||
match stream_result.shutdown(Shutdown::Both) {
|
||||
_ => {}
|
||||
}
|
||||
println!("Open {}", port.to_string().purple());
|
||||
if !quiet {
|
||||
println!("Open {}", port.to_string().purple());
|
||||
}
|
||||
|
||||
Ok(port)
|
||||
}
|
||||
Err(e) => match e.kind() {
|
||||
ErrorKind::Other => {
|
||||
eprintln!("{:?}", e); // in case we get too many open files
|
||||
panic!("Too many open files. Please reduce batch size. The default is 5000. Try -B 2500.");
|
||||
panic!("Too many open files. Please reduce batch size. The default is 5000. Try -b 2500.");
|
||||
Err(e)
|
||||
}
|
||||
_ => Err(io::Error::new(io::ErrorKind::Other, e.to_string())),
|
||||
@@ -208,7 +286,7 @@ fn print_opening() {
|
||||
println!(
|
||||
"{} \n {} \n {}",
|
||||
s.green(),
|
||||
"Automated Decryption Tool - https://github.com/ciphey/ciphey".red(),
|
||||
"Automated Decryption Tool - https://github.com/ciphey/ciphey".green(),
|
||||
"Creator https://github.com/brandonskerritt".green()
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user