WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 042c825

Browse files
committed
store the open port in the kb
1 parent d76458e commit 042c825

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

rust/src/nasl/builtin/network/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ impl From<Port> for u16 {
149149
}
150150
}
151151

152+
impl From<u16> for Port {
153+
fn from(value: u16) -> Self {
154+
Port(value)
155+
}
156+
}
157+
152158
impl FromNaslValue<'_> for Port {
153159
fn from_nasl_value(value: &NaslValue) -> Result<Self, FnError> {
154160
let port = i64::from_nasl_value(value)?;

rust/src/nasl/builtin/network/network.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ fn islocalnet(context: &ScanCtx) -> Result<bool, SocketError> {
132132
Ok(false)
133133
}
134134

135+
135136
/// Declares an open port on the target host
136-
#[nasl_function(named(port, proto))]
137-
fn scanner_add_port(context: &ScanCtx, port: Port, proto: Option<&str>) -> Result<(), FnError> {
137+
pub fn scanner_add_port_shared(context: &ScanCtx, port: Port, proto: Option<&str>) -> Result<(), FnError> {
138138
let kb_key = match proto {
139139
Some("udp") => KbKey::Port(kb::Port::Udp(port.0.to_string())),
140140
_ => KbKey::Port(kb::Port::Tcp(port.0.to_string())),
@@ -145,6 +145,12 @@ fn scanner_add_port(context: &ScanCtx, port: Port, proto: Option<&str>) -> Resul
145145
Ok(())
146146
}
147147

148+
/// Declares an open port on the target host
149+
#[nasl_function(named(port, proto))]
150+
fn scanner_add_port(context: &ScanCtx, port: Port, proto: Option<&str>) -> Result<(), FnError> {
151+
scanner_add_port_shared(context, port, proto)
152+
}
153+
148154
#[nasl_function]
149155
fn scanner_get_port(context: &ScanCtx, idx: u16) -> Result<NaslValue, FnError> {
150156
let ports = context.target().ports_tcp().iter().collect::<Vec<&u16>>();

rust/src/nasl/builtin/raw_ip/synscan.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use pcap::{Active, Capture, Inactive, PacketCodec, PacketStream};
88
use pnet::packet::{ip::IpNextHeaderProtocols, ipv4::Ipv4Packet, ipv6::Ipv6Packet, tcp::TcpPacket};
99

1010
use super::SynScanError;
11-
use crate::nasl::NaslValue;
11+
use crate::nasl::builtin::network::network::scanner_add_port_shared;
12+
use crate::nasl::builtin::network::Port;
1213
use crate::nasl::prelude::*;
1314
use crate::nasl::raw_ip_utils::{
1415
raw_ip_utils::{FIX_IPV6_HEADER_LENGTH, send_v4_packet, send_v6_packet},
@@ -17,7 +18,7 @@ use crate::nasl::raw_ip_utils::{
1718
use crate::nasl::utils::function::utils::DEFAULT_TIMEOUT;
1819
use futures::StreamExt;
1920
use std::collections::BTreeSet;
20-
use std::{collections::HashSet, net::IpAddr, time::Duration};
21+
use std::{net::IpAddr, time::Duration};
2122
use tokio::sync::mpsc::{self, Receiver, Sender};
2223
use tokio::time::sleep;
2324

@@ -134,8 +135,8 @@ async fn capture_task(
134135
loop {
135136
tokio::select! {
136137
packet = stream.next() => { // packet is Option<Result<Box>>
137-
if let Some(Ok(data)) = packet && let Ok(Some(alive_host)) = process_packet(&data) {
138-
tx_msg.send(alive_host).await.unwrap()
138+
if let Some(Ok(data)) = packet && let Ok(Some(open_port)) = process_packet(&data) {
139+
tx_msg.send(open_port).await.unwrap()
139140
}
140141
},
141142
ctl = rx_ctl.recv() => {
@@ -149,6 +150,19 @@ async fn capture_task(
149150
Ok(())
150151
}
151152

153+
async fn reset_connection (target: IpAddr, port: &u16) -> Result<(), FnError> {
154+
match target {
155+
IpAddr::V4(ipv4) => {
156+
let tcp = forge_tcp_ping_ipv4(ipv4, port, pnet::packet::tcp::TcpFlags::RST)?;
157+
send_v4_packet(tcp)?;
158+
}
159+
IpAddr::V6(ipv6) => {
160+
let tcp = forge_tcp_ping_ipv6(ipv6, port, pnet::packet::tcp::TcpFlags::RST)?;
161+
send_v6_packet(tcp)?;
162+
}
163+
};
164+
Ok(())
165+
}
152166
async fn send_task(
153167
target: IpAddr,
154168
ports: BTreeSet<u16>,
@@ -162,7 +176,6 @@ async fn send_task(
162176
match target {
163177
IpAddr::V4(ipv4) => {
164178
let tcp = forge_tcp_ping_ipv4(ipv4, port, pnet::packet::tcp::TcpFlags::SYN)?;
165-
dbg!(&tcp);
166179
send_v4_packet(tcp)?;
167180
}
168181
IpAddr::V6(ipv6) => {
@@ -180,9 +193,9 @@ async fn send_task(
180193
}
181194

182195
#[nasl_function]
183-
async fn plugin_run_synscan(configs: &ScanCtx<'_>) -> Result<NaslValue, FnError> {
196+
async fn plugin_run_synscan(configs: &ScanCtx<'_>) -> Result<(), FnError> {
184197
let target_ip = configs.target().ip_addr().clone();
185-
let mut open_ports = HashSet::<u16>::new();
198+
let mut open_ports = BTreeSet::<u16>::new();
186199

187200
let capture_inactive =
188201
Capture::from_device("any").map_err(|e| SynScanError::NoValidInterface(e.to_string()))?;
@@ -193,7 +206,6 @@ async fn plugin_run_synscan(configs: &ScanCtx<'_>) -> Result<NaslValue, FnError>
193206
let capture_handle = tokio::spawn(capture_task(capture_inactive, rx_ctl, tx_msg));
194207

195208
let ports = configs.target().ports_tcp();
196-
dbg!(ports);
197209
let send_handle = tokio::spawn(send_task(
198210
target_ip,
199211
ports.clone(),
@@ -203,17 +215,17 @@ async fn plugin_run_synscan(configs: &ScanCtx<'_>) -> Result<NaslValue, FnError>
203215

204216
while let Some(open_port) = rx_msg.recv().await {
205217
if ports.contains(&open_port) && !open_ports.contains(&open_port) {
218+
scanner_add_port_shared(&configs, Port::from(open_port), Some("tcp"))?;
206219
open_ports.insert(open_port);
207-
println!("{} is open", &open_port);
220+
reset_connection(target_ip, &open_port).await?;
221+
tracing::debug!("{} is open", open_port);
208222
}
209223
}
210224

211225
send_handle.await.unwrap().unwrap();
212226
capture_handle.await.unwrap().unwrap();
213227

214-
Ok(NaslValue::Array(Vec::from_iter(
215-
open_ports.iter().map(|p| NaslValue::Number(*p as i64)),
216-
)))
228+
Ok(())
217229
}
218230

219231
pub struct SynScan;

0 commit comments

Comments
 (0)