@@ -8,7 +8,8 @@ use pcap::{Active, Capture, Inactive, PacketCodec, PacketStream};
88use pnet:: packet:: { ip:: IpNextHeaderProtocols , ipv4:: Ipv4Packet , ipv6:: Ipv6Packet , tcp:: TcpPacket } ;
99
1010use 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 ;
1213use crate :: nasl:: prelude:: * ;
1314use 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::{
1718use crate :: nasl:: utils:: function:: utils:: DEFAULT_TIMEOUT ;
1819use futures:: StreamExt ;
1920use std:: collections:: BTreeSet ;
20- use std:: { collections :: HashSet , net:: IpAddr , time:: Duration } ;
21+ use std:: { net:: IpAddr , time:: Duration } ;
2122use tokio:: sync:: mpsc:: { self , Receiver , Sender } ;
2223use 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+ }
152166async 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
219231pub struct SynScan ;
0 commit comments