package Ġcom . postman . security scanner . core Ċ Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . z aproxy . client api . core . ApiResponse Ċ import Ġorg . z aproxy . client api . core . ApiResponse Element Ċ import Ġorg . z aproxy . client api . core . Client Api Ċ import Ġorg . z aproxy . client api . core . Client ApiException Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ object ĠScanner Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġactive Connection : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġconst Ġval ĠPORT Ġ= Ġ 8 0 9 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠADDRESS Ġ= Ġ" 0 . 0 . 0 . 0 " ĊĠĠĠ Ġprivate Ġval Ġclient Api Ġ= ĠClient Api ( ADDRESS , ĠPORT , Ġtrue ) ĊĊĠĠĠ Ġfun Ġscan ( zap Path : ĠString , Ġzap Dir : ĠString , Ġseed Url : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! active Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ zap Path Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- dir Ġ$ zap Dir Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- daemon Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- host Ġ 0 . 0 . 0 . 0 Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- port Ġ 8 0 9 0 Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- config Ġapi . addrs . addr . name = .* Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- config Ġapi . addrs . addr . regex = true Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- config Ġapi . disable key = true " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Api . waitFor Successful Connection To Z ap ( 5 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Connection Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠClient ApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Response : ĠApiResponse Ġ= Ġclient Api . spider . scan ( seed Url , Ġnull , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġscan Ġnow Ġreturns Ġa Ġscan Ġid Ġto Ġsupport Ġconcurrent Ġscanning ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscan id Ġ= Ġ( api Response Ġas ĠApiResponse Element ). value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPoll Ġthe Ġstatus Ġuntil Ġit Ġcompletes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( client Api . spider . status ( scan id ) Ġas ĠApiResponse Element ). value . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Spider Ġprogress Ġ: Ġ$ progress % ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ>= Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Spider Ġcomplete ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Urls Ġ= Ġclient Api . spider . all Urls () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPoll Ġthe Ġnumber Ġof Ġrecords Ġthe Ġpassive Ġscanner Ġstill Ġhas Ġto Ġscan Ġuntil Ġit Ġcompletes ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( client Api . p scan . records To Scan () Ġas ĠApiResponse Element ). value . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Pass ive ĠScan Ġprogress Ġ: Ġ$ progress Ġrecords Ġleft ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Pass ive ĠScan Ġcomplete ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġclient Api . as can . scan ( seed Url , Ġ" True ", Ġ" False ", Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġscan Ġnow Ġreturns Ġa Ġscan Ġid Ġto Ġsupport Ġconcurrent Ġscanning ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan id Ġ= Ġ( resp Ġas ĠApiResponse Element ). value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPoll Ġthe Ġstatus Ġuntil Ġit Ġcompletes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( client Api . as can . status ( scan id ) Ġas ĠApiResponse Element ). value . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Active ĠScan Ġprogress Ġ: Ġ$ progress % ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ>= Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Active ĠScan Ġcomplete ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Alerts :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġclient Api . reports . generate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ju ice ĠBox ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" trad itional - json ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (( report Ġas ĠApiResponse Element ). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( report . toString ()). inputStream (). read All Bytes (). decode ToString () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Exception Ġ: Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Couldn 't Ġscan " ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġexec ( ĊĠĠĠĠĠĠĠ Ġcmd : ĠString , ĊĠĠĠĠĠĠĠ Ġworking Dir : ĠFile Ġ= ĠFile (".") ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Builder (* cmd . split ("\\ s ". to Regex ()). to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. directory ( working Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. redirect Output ( Process Builder . Redirect . IN HER IT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. redirect Error ( Process Builder . Redirect . IN HER IT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }