网站首页 > 资源文章 正文
[dependencies]
thiserror = "1.0"
anyhow = "1.0"
rayon = "1.7"
trust-dns-resolver = "0.22"
reqwest = { version = "0.11", default-features = false, features = ["json", "blocking", "rustls-tls"] }
serde = { version = "1", features = ["derive"] }
src\common_ports.rs
pub const MOST_COMMON_PORTS_100: &[u16] = &[
80, 23, 443, 21, 22, 25, 3389, 110, 445, 139, 143, 53, 135, 3306, 8080, 1723, 111, 995, 993,
5900, 1025, 587, 8888, 199, 1720, 465, 548, 113, 81, 6001, 10000, 514, 5060, 179, 1026, 2000,
8443, 8000, 32768, 554, 26, 1433, 49152, 2001, 515, 8008, 49154, 1027, 5666, 646, 5000, 5631,
631, 49153, 8081, 2049, 88, 79, 5800, 106, 2121, 1110, 49155, 6000, 513, 990, 5357, 427, 49156,
543, 544, 5101, 144, 7, 389, 8009, 3128, 444, 9999, 5009, 7070, 5190, 3000, 5432, 1900, 3986,
13, 1029, 9, 5051, 6646, 49157, 1028, 873, 1755, 2717, 4899, 9100, 119, 37,
];
src\error.rs
use thiserror::Error;
#[derive(Error, Debug, Clone)]
pub enum Error {
#[error("Usage: tricoder <kerkour.com>")]
CliUsage,
#[error("Reqwest: {0}")]
Reqwest(String),
}
impl std::convert::From<reqwest::Error> for Error {
fn from(err: reqwest::Error) -> Self {
Error::Reqwest(err.to_string())
}
}
src\main.rs
use rayon::prelude::*;
use reqwest::{blocking::Client, redirect};
use std::{env, time::Duration};
mod error;
pub use error::Error;
mod model;
mod ports;
mod subdomains;
use model::Subdomain;
mod common_ports;
fn main() -> Result<(), anyhow::Error> {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
return Err(Error::CliUsage.into());
}
let target = args[1].as_str();
let http_timeout = Duration::from_secs(5);
let http_client = Client::builder()
.redirect(redirect::Policy::limited(4))
.timeout(http_timeout)
.build()?;
// we use a custom threadpool to improve speed
let pool = rayon::ThreadPoolBuilder::new()
.num_threads(256)
.build()
.unwrap();
// pool.install is required to use our custom threadpool, instead of rayon's default one
pool.install(|| {
let scan_result: Vec<Subdomain> = subdomains::enumerate(&http_client, target)
.unwrap()
.into_par_iter()
.map(ports::scan_ports)
.collect();
for subdomain in scan_result {
println!("{}:", &subdomain.domain);
for port in &subdomain.open_ports {
println!(" {}", port.port);
}
println!();
}
});
Ok(())
}
src\model.rs
use serde::Deserialize;
#[derive(Debug, Clone)]
pub struct Subdomain {
pub domain: String,
pub open_ports: Vec<Port>,
}
#[derive(Debug, Clone)]
pub struct Port {
pub port: u16,
pub is_open: bool,
}
#[derive(Debug, Deserialize, Clone)]
pub struct CrtShEntry {
pub name_value: String,
}
src\ports.rs
use crate::{
common_ports::MOST_COMMON_PORTS_100,
model::{Port, Subdomain},
};
use rayon::prelude::*;
use std::net::{SocketAddr, ToSocketAddrs};
use std::{net::TcpStream, time::Duration};
pub fn scan_ports(mut subdomain: Subdomain) -> Subdomain {
let socket_addresses: Vec<SocketAddr> = format!("{}:1024", subdomain.domain)
.to_socket_addrs()
.expect("port scanner: Creating socket address")
.collect();
if socket_addresses.is_empty() {
return subdomain;
}
subdomain.open_ports = MOST_COMMON_PORTS_100
.into_par_iter()
.map(|port| scan_port(socket_addresses[0], *port))
.filter(|port| port.is_open) // filter closed ports
.collect();
subdomain
}
fn scan_port(mut socket_address: SocketAddr, port: u16) -> Port {
let timeout = Duration::from_secs(3);
socket_address.set_port(port);
let is_open = TcpStream::connect_timeout(&socket_address, timeout).is_ok();
Port { port, is_open }
}
src\subdomains.rs
use crate::{
model::{CrtShEntry, Subdomain},
Error,
};
use reqwest::blocking::Client;
use std::{collections::HashSet, time::Duration};
use trust_dns_resolver::{
config::{ResolverConfig, ResolverOpts},
Resolver,
};
pub fn enumerate(http_client: &Client, target: &str) -> Result<Vec<Subdomain>, Error> {
let entries: Vec<CrtShEntry> = http_client
//.get(&format!("https://crt.sh/?q=%25.{}&output=json", target))
.get(&format!("https://crt.sh/?q=*.{}&output=json", target))
.send()?
.json()?;
// clean and dedup results
let mut subdomains: HashSet<String> = entries
.into_iter()
.flat_map(|entry| {
entry
.name_value
.split('\n')
.map(|subdomain| subdomain.trim().to_string())
.collect::<Vec<String>>()
})
.filter(|subdomain: &String| subdomain != target)
.filter(|subdomain: &String| !subdomain.contains('*'))
.collect();
subdomains.insert(target.to_string());
let subdomains: Vec<Subdomain> = subdomains
.into_iter()
.map(|domain| Subdomain {
domain,
open_ports: Vec::new(),
})
.filter(resolves)
.collect();
Ok(subdomains)
}
pub fn resolves(domain: &Subdomain) -> bool {
let mut opts = ResolverOpts::default();
opts.timeout = Duration::from_secs(4);
let dns_resolver = Resolver::new(
ResolverConfig::default(),
opts,
)
.expect("subdomain resolver: building DNS client");
dns_resolver.lookup_ip(domain.domain.as_str()).is_ok()
}
猜你喜欢
- 2024-10-04 「web渗透测试」常用端口利用解析集合
- 2024-10-04 小白客带你走进黑客世界13之我是一个脚本小子
- 2024-10-04 最全的网站渗透测试详细检测方法(网站渗透测试实战入门)
- 2024-10-04 goby指纹提取与yara逆向.md(指纹识别特征提取)
- 2024-10-04 网络安全方向-“黑客”渗透测试如何学习?
- 2024-10-04 收到网站漏洞风险通报,怎么应对?
- 2024-10-04 BlueKeep已被大规模利用于植入挖矿软件
- 2024-10-04 针对校园某服务器的一次渗透测试(针对校园某服务器的一次渗透测试研究)
- 2024-10-04 针对单个网站的渗透思路(精)(如何对网站进行渗透)
- 2024-10-04 被黑客经常利用的端口为何物?让我们一探究竟
你 发表评论:
欢迎- 07-03win7去掉桌面图标小箭头怎么操作 win7桌面快捷方式箭头怎么去除
- 07-03win7声音图标不见了怎么办(windows7声音没了怎么办)
- 07-03男生勿入:Win10/Win7/Win8.1女生图标下载
- 07-03桌面只有回收站图标,给Win7/10系统在桌面添加“计算机”图标
- 07-03经典windows桌面图标手机壁纸(经典windows桌面背景)
- 07-03如何在Win10启用Win7/Win8.1通知区域图标设置?
- 07-03win7声音图标不见了解决步骤(win7旗舰版声音图标不显示)
- 07-03为什么回收站图标没了?win11/win10/win7电脑如何显示回收站图标
- 最近发表
-
- win7去掉桌面图标小箭头怎么操作 win7桌面快捷方式箭头怎么去除
- win7声音图标不见了怎么办(windows7声音没了怎么办)
- 男生勿入:Win10/Win7/Win8.1女生图标下载
- 桌面只有回收站图标,给Win7/10系统在桌面添加“计算机”图标
- 经典windows桌面图标手机壁纸(经典windows桌面背景)
- 如何在Win10启用Win7/Win8.1通知区域图标设置?
- win7声音图标不见了解决步骤(win7旗舰版声音图标不显示)
- 为什么回收站图标没了?win11/win10/win7电脑如何显示回收站图标
- Win7怎么更换本地磁盘图标?(win7桌面改d盘)
- Win7桌面图标消失怎么办?(win7桌面图标全没了怎么办)
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)