1
0

pcdu.bat 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. @echo off
  2. setlocal EnableExtensions EnableDelayedExpansion
  3. REM =====================================================
  4. REM ____ _ ____ ____ _ _
  5. REM | _ \ __ _ _ ____ _( )___ / ___| _ \| | | |
  6. REM | |_) / _` | '__\ \ / /|// __|| | | | | | | | |
  7. REM | __/ (_| | | \ V / \__ \| |___| |_| | |_| |
  8. REM |_| \__,_|_| \_/ |___(_)____|____/ \___/
  9. REM
  10. REM Parv's Case Download Utility (PCDU)
  11. REM Downloads case files from analysis server
  12. REM =====================================================
  13. REM Check for pscp.exe (PuTTY SCP) or scp.exe
  14. set "SCP_TOOL="
  15. where pscp.exe >nul 2>&1
  16. if !ERRORLEVEL! EQU 0 (
  17. set "SCP_TOOL=pscp.exe"
  18. set "SCP_TYPE=PSCP"
  19. ) else (
  20. where scp.exe >nul 2>&1
  21. if !ERRORLEVEL! EQU 0 (
  22. set "SCP_TOOL=scp.exe"
  23. set "SCP_TYPE=SCP"
  24. )
  25. )
  26. if "%SCP_TOOL%"=="" (
  27. echo ERROR: Neither pscp.exe nor scp.exe found in PATH.
  28. echo.
  29. echo Please install one of the following:
  30. echo - PuTTY ^(includes pscp.exe^) - https://www.putty.org/
  31. echo - OpenSSH Client ^(includes scp.exe^) - Built into Windows 10/11
  32. echo.
  33. pause
  34. exit /b 1
  35. )
  36. REM =====================================================
  37. REM Configuration
  38. REM =====================================================
  39. set "REMOTE_SERVER=sjanalysis.citrite.net"
  40. set "REMOTE_BASE_PATH=/upload/ftp"
  41. REM Prompt for case number if not provided
  42. if "%~1"=="" (
  43. set /p CASENO=Enter Case Number:
  44. ) else (
  45. set "CASENO=%~1"
  46. )
  47. if "%CASENO%"=="" (
  48. echo ERROR: Case number cannot be empty.
  49. exit /b 1
  50. )
  51. REM Prompt for credentials if not provided
  52. if "%~2"=="" (
  53. set /p USERNAME=Enter SSH Username:
  54. ) else (
  55. set "USERNAME=%~2"
  56. )
  57. if "%USERNAME%"=="" (
  58. echo ERROR: Username cannot be empty.
  59. exit /b 1
  60. )
  61. if "%~3"=="" (
  62. echo Enter SSH Password for %USERNAME%@%REMOTE_SERVER%:
  63. set /p PASSWORD=
  64. ) else (
  65. set "PASSWORD=%~3"
  66. )
  67. REM =====================================================
  68. REM Paths
  69. REM =====================================================
  70. set "REMOTE_CASE_PATH=%REMOTE_BASE_PATH%/%CASENO%"
  71. set "DEST=%USERPROFILE%\Downloads\SJLNT\%CASENO%"
  72. set "LOGFILE=%DEST%\download_%CASENO%.log"
  73. set "TEMP_LIST=%TEMP%\caselist_%CASENO%.txt"
  74. set "TEMP_FILTERED=%TEMP%\filtered_%CASENO%.txt"
  75. set "COLLECTOR_LIST=%TEMP%\collectors_%CASENO%.txt"
  76. set "ALL_FILES_LIST=%TEMP%\allfiles_%CASENO%.txt"
  77. echo.
  78. echo ============================================================
  79. echo ^|^> Parv's Case Download Utility ^(PCDU^) v1.0
  80. echo ============================================================
  81. echo Case Number : %CASENO%
  82. echo Remote Server : %REMOTE_SERVER%
  83. echo Remote Path : %REMOTE_CASE_PATH%
  84. echo Local Dest : %DEST%
  85. echo SCP Tool : %SCP_TYPE%
  86. echo User : %USERNAME%
  87. echo ============================================================
  88. echo.
  89. REM Create destination if missing
  90. if not exist "%DEST%" (
  91. mkdir "%DEST%" 2>nul || (
  92. echo ERROR: Failed to create destination folder: %DEST%
  93. exit /b 1
  94. )
  95. echo Created destination folder.
  96. )
  97. REM Create subdirectories for organization
  98. if not exist "%DEST%\configs" mkdir "%DEST%\configs"
  99. if not exist "%DEST%\captures" mkdir "%DEST%\captures"
  100. if not exist "%DEST%\media" mkdir "%DEST%\media"
  101. REM Initialize log file
  102. echo ============================================================ > "%LOGFILE%"
  103. echo Parv's Case Download Utility ^(PCDU^) - Download Log >> "%LOGFILE%"
  104. echo ============================================================ >> "%LOGFILE%"
  105. echo Case Number : %CASENO% >> "%LOGFILE%"
  106. echo Date/Time : %DATE% %TIME% >> "%LOGFILE%"
  107. echo Remote Server: %REMOTE_SERVER% >> "%LOGFILE%"
  108. echo User : %USERNAME% >> "%LOGFILE%"
  109. echo ============================================================ >> "%LOGFILE%"
  110. echo. >> "%LOGFILE%"
  111. REM =====================================================
  112. REM Test SSH connection and verify case directory
  113. REM =====================================================
  114. echo [1/5] Testing SSH connection...
  115. echo [1/5] Testing SSH connection... >> "%LOGFILE%"
  116. if "%SCP_TYPE%"=="PSCP" (
  117. echo y | plink.exe -batch -pw "%PASSWORD%" %USERNAME%@%REMOTE_SERVER% "test -d %REMOTE_CASE_PATH% && echo OK || echo NOTFOUND" 2>nul | findstr /V /C:"Keyboard" /C:"prompts from server" > "%TEMP_LIST%"
  118. ) else (
  119. sshpass -p "%PASSWORD%" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL %USERNAME%@%REMOTE_SERVER% "test -d %REMOTE_CASE_PATH% && echo OK || echo NOTFOUND" > "%TEMP_LIST%" 2>&1
  120. )
  121. if !ERRORLEVEL! NEQ 0 (
  122. echo ERROR: SSH connection failed. >> "%LOGFILE%"
  123. type "%TEMP_LIST%" >> "%LOGFILE%"
  124. echo ERROR: SSH connection failed.
  125. echo Check credentials and network connectivity.
  126. echo See log: %LOGFILE%
  127. del "%TEMP_LIST%" 2>nul
  128. pause
  129. exit /b 1
  130. )
  131. findstr /C:"OK" "%TEMP_LIST%" >nul
  132. if !ERRORLEVEL! NEQ 0 (
  133. echo ERROR: Case directory not found on server: %REMOTE_CASE_PATH% >> "%LOGFILE%"
  134. echo ERROR: Case directory not found on server.
  135. echo Path: %REMOTE_CASE_PATH%
  136. echo Please verify the case number.
  137. del "%TEMP_LIST%" 2>nul
  138. pause
  139. exit /b 1
  140. )
  141. echo Connection successful.
  142. echo Connection successful. >> "%LOGFILE%"
  143. REM =====================================================
  144. REM Single SSH call to get all required info
  145. REM Collectors + All files in case root
  146. REM =====================================================
  147. echo.
  148. echo [2/5] Scanning case directory...
  149. echo [2/5] Scanning case directory... >> "%LOGFILE%"
  150. if "%SCP_TYPE%"=="PSCP" (
  151. plink.exe -batch -pw "%PASSWORD%" %USERNAME%@%REMOTE_SERVER% "echo '===COLLECTORS==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type d -name 'collector_*' 2>/dev/null; echo '===FILES==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type f \( -name '*.cap' -o -name '*.pcap' -o -name '*.pcapng' -o -name '*.sslkeys' -o -name '*.keys' -o -name '*.har' -o -name '*.xml' -o -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.gif' -o -name '*.bmp' -o -name '*.webp' -o -name '*.tiff' -o -name '*.svg' -o -name '*.txt' -o -name '*.log' -o -name '*.csv' -o -name '*.json' \) 2>/dev/null" 2>nul | findstr /V /C:"Keyboard" /C:"prompts from server" > "%ALL_FILES_LIST%"
  152. ) else (
  153. sshpass -p "%PASSWORD%" ssh -o StrictHostKeyChecking=no %USERNAME%@%REMOTE_SERVER% "echo '===COLLECTORS==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type d -name 'collector_*' 2>/dev/null; echo '===FILES==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type f \( -name '*.cap' -o -name '*.pcap' -o -name '*.pcapng' -o -name '*.sslkeys' -o -name '*.keys' -o -name '*.har' -o -name '*.xml' -o -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.gif' -o -name '*.bmp' -o -name '*.webp' -o -name '*.tiff' -o -name '*.svg' -o -name '*.txt' -o -name '*.log' -o -name '*.csv' -o -name '*.json' \) 2>/dev/null" > "%ALL_FILES_LIST%"
  154. )
  155. REM Parse collectors from combined output
  156. set "IN_COLLECTORS=0"
  157. set "IN_FILES=0"
  158. echo. > "%COLLECTOR_LIST%"
  159. echo. > "%TEMP_LIST%"
  160. for /f "usebackq delims=" %%A in ("%ALL_FILES_LIST%") do (
  161. set "LINE=%%A"
  162. REM Check for section markers
  163. echo !LINE! | findstr /C:"===COLLECTORS===" >nul
  164. if !ERRORLEVEL! EQU 0 (
  165. set "IN_COLLECTORS=1"
  166. set "IN_FILES=0"
  167. ) else (
  168. echo !LINE! | findstr /C:"===FILES===" >nul
  169. if !ERRORLEVEL! EQU 0 (
  170. set "IN_COLLECTORS=0"
  171. set "IN_FILES=1"
  172. ) else (
  173. REM Skip empty lines and filter noise
  174. if not "!LINE!"=="" (
  175. echo !LINE! | findstr /C:"Keyboard" /C:"prompts" /C:"authentication" >nul
  176. if !ERRORLEVEL! NEQ 0 (
  177. if !IN_COLLECTORS! EQU 1 (
  178. echo !LINE!>> "%COLLECTOR_LIST%"
  179. )
  180. if !IN_FILES! EQU 1 (
  181. echo !LINE!>> "%TEMP_LIST%"
  182. )
  183. )
  184. )
  185. )
  186. )
  187. )
  188. REM Count collectors
  189. set "COLLECTOR_COUNT=0"
  190. for /f "usebackq delims=" %%A in ("%COLLECTOR_LIST%") do (
  191. set "LINE=%%A"
  192. if not "!LINE!"=="" (
  193. echo !LINE! | findstr /C:"collector_" >nul
  194. if !ERRORLEVEL! EQU 0 (
  195. set /a COLLECTOR_COUNT+=1
  196. for %%B in ("!LINE!") do echo Found: %%~nxB
  197. echo Found collector: !LINE! >> "%LOGFILE%"
  198. )
  199. )
  200. )
  201. if %COLLECTOR_COUNT% EQU 0 (
  202. echo No collector bundles found.
  203. echo No collector bundles found. >> "%LOGFILE%"
  204. ) else (
  205. echo Total collectors found: %COLLECTOR_COUNT%
  206. )
  207. REM =====================================================
  208. REM Download Saved Config (ns.conf from nsconfig folder)
  209. REM Inside collector bundles only
  210. REM =====================================================
  211. echo.
  212. echo [3/5] Downloading saved configurations ^(ns.conf^)...
  213. echo [3/5] Downloading saved configurations... >> "%LOGFILE%"
  214. set "CONFIG_COUNT=0"
  215. for /f "usebackq delims=" %%C in ("%COLLECTOR_LIST%") do (
  216. set "COLLECTOR_PATH=%%C"
  217. REM Skip empty lines and filter noise
  218. if not "!COLLECTOR_PATH!"=="" (
  219. echo !COLLECTOR_PATH! | findstr /C:"collector_" >nul
  220. if !ERRORLEVEL! EQU 0 (
  221. for %%D in ("!COLLECTOR_PATH!") do set "COLLECTOR_NAME=%%~nxD"
  222. echo Checking !COLLECTOR_NAME!...
  223. set "DEST_FILENAME=ns.conf_!COLLECTOR_NAME!"
  224. if "%SCP_TYPE%"=="PSCP" (
  225. pscp.exe -batch -pw "%PASSWORD%" -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/nsconfig/ns.conf" "%DEST%\configs\!DEST_FILENAME!" >nul 2>&1
  226. ) else (
  227. scp -o StrictHostKeyChecking=no -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/nsconfig/ns.conf" "%DEST%\configs\!DEST_FILENAME!" 2>nul
  228. )
  229. if exist "%DEST%\configs\!DEST_FILENAME!" (
  230. echo [OK] !DEST_FILENAME!
  231. echo [OK] Downloaded: !DEST_FILENAME! >> "%LOGFILE%"
  232. set /a CONFIG_COUNT+=1
  233. ) else (
  234. echo [--] ns.conf not found
  235. )
  236. )
  237. )
  238. )
  239. echo Saved configs downloaded: %CONFIG_COUNT%
  240. REM =====================================================
  241. REM Download Running Config (ns_running_config.conf)
  242. REM Inside collector bundles only
  243. REM =====================================================
  244. echo.
  245. echo [4/5] Downloading running configurations...
  246. echo [4/5] Downloading running configurations... >> "%LOGFILE%"
  247. set "RUNNING_COUNT=0"
  248. for /f "usebackq delims=" %%C in ("%COLLECTOR_LIST%") do (
  249. set "COLLECTOR_PATH=%%C"
  250. REM Skip empty lines and filter noise
  251. if not "!COLLECTOR_PATH!"=="" (
  252. echo !COLLECTOR_PATH! | findstr /C:"collector_" >nul
  253. if !ERRORLEVEL! EQU 0 (
  254. for %%D in ("!COLLECTOR_PATH!") do set "COLLECTOR_NAME=%%~nxD"
  255. echo Checking !COLLECTOR_NAME!...
  256. set "DEST_FILENAME=ns_running_config.conf_!COLLECTOR_NAME!"
  257. if "%SCP_TYPE%"=="PSCP" (
  258. pscp.exe -batch -pw "%PASSWORD%" -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/shell/ns_running_config.conf" "%DEST%\configs\!DEST_FILENAME!" >nul 2>&1
  259. ) else (
  260. scp -o StrictHostKeyChecking=no -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/shell/ns_running_config.conf" "%DEST%\configs\!DEST_FILENAME!" 2>nul
  261. )
  262. if exist "%DEST%\configs\!DEST_FILENAME!" (
  263. echo [OK] !DEST_FILENAME!
  264. echo [OK] Downloaded: !DEST_FILENAME! >> "%LOGFILE%"
  265. set /a RUNNING_COUNT+=1
  266. ) else (
  267. echo [--] Running config not found
  268. )
  269. )
  270. )
  271. )
  272. echo Running configs downloaded: %RUNNING_COUNT%
  273. REM =====================================================
  274. REM Download Capture and Media Files
  275. REM OUTSIDE collector bundles only (case root level)
  276. REM Using pre-fetched file list
  277. REM =====================================================
  278. echo.
  279. echo [5/5] Downloading files from case directory...
  280. echo [5/5] Downloading files from case root... >> "%LOGFILE%"
  281. set "CAPTURE_COUNT=0"
  282. set "MEDIA_COUNT=0"
  283. set "OTHER_COUNT=0"
  284. for /f "usebackq delims=" %%F in ("%TEMP_LIST%") do (
  285. set "REMOTE_FILE=%%F"
  286. REM Skip empty lines and filter noise
  287. if not "!REMOTE_FILE!"=="" (
  288. echo !REMOTE_FILE! | findstr /C:"Keyboard" /C:"prompts" /C:"authentication" >nul
  289. if !ERRORLEVEL! NEQ 0 (
  290. for %%G in ("!REMOTE_FILE!") do (
  291. set "FILENAME=%%~nxG"
  292. set "FILEEXT=%%~xG"
  293. )
  294. if not "!FILENAME!"=="" (
  295. REM Determine file type and destination
  296. set "FILE_DEST="
  297. set "FILE_TYPE="
  298. REM Check if capture file
  299. echo !FILEEXT! | findstr /I /C:".cap" /C:".pcap" /C:".pcapng" /C:".sslkeys" /C:".keys" /C:".har" >nul
  300. if !ERRORLEVEL! EQU 0 (
  301. set "FILE_DEST=%DEST%\captures\!FILENAME!"
  302. set "FILE_TYPE=capture"
  303. )
  304. REM Check if image file
  305. echo !FILEEXT! | findstr /I /C:".jpg" /C:".jpeg" /C:".png" /C:".gif" /C:".bmp" /C:".webp" /C:".tiff" /C:".svg" >nul
  306. if !ERRORLEVEL! EQU 0 (
  307. set "FILE_DEST=%DEST%\media\!FILENAME!"
  308. set "FILE_TYPE=media"
  309. )
  310. REM Check if other file (txt, log, xml, json, csv)
  311. echo !FILEEXT! | findstr /I /C:".txt" /C:".log" /C:".xml" /C:".json" /C:".csv" >nul
  312. if !ERRORLEVEL! EQU 0 (
  313. set "FILE_DEST=%DEST%\!FILENAME!"
  314. set "FILE_TYPE=other"
  315. )
  316. REM Download the file
  317. if defined FILE_DEST (
  318. echo Downloading: !FILENAME!
  319. if "%SCP_TYPE%"=="PSCP" (
  320. pscp.exe -batch -pw "%PASSWORD%" -q "%USERNAME%@%REMOTE_SERVER%:!REMOTE_FILE!" "!FILE_DEST!" >nul 2>&1
  321. ) else (
  322. scp -o StrictHostKeyChecking=no -q "%USERNAME%@%REMOTE_SERVER%:!REMOTE_FILE!" "!FILE_DEST!" 2>nul
  323. )
  324. if exist "!FILE_DEST!" (
  325. echo [OK] !FILENAME!
  326. echo [OK] Downloaded !FILE_TYPE!: !FILENAME! >> "%LOGFILE%"
  327. if "!FILE_TYPE!"=="capture" set /a CAPTURE_COUNT+=1
  328. if "!FILE_TYPE!"=="media" set /a MEDIA_COUNT+=1
  329. if "!FILE_TYPE!"=="other" set /a OTHER_COUNT+=1
  330. )
  331. )
  332. )
  333. )
  334. )
  335. )
  336. echo.
  337. echo Capture files downloaded: %CAPTURE_COUNT%
  338. echo Media files downloaded : %MEDIA_COUNT%
  339. echo Other files downloaded : %OTHER_COUNT%
  340. REM =====================================================
  341. REM Cleanup and Summary
  342. REM =====================================================
  343. del "%TEMP_LIST%" 2>nul
  344. del "%TEMP_FILTERED%" 2>nul
  345. del "%COLLECTOR_LIST%" 2>nul
  346. del "%ALL_FILES_LIST%" 2>nul
  347. REM Remove empty directories
  348. for %%D in (configs captures media) do (
  349. dir /b "%DEST%\%%D" 2>nul | findstr "." >nul || rmdir "%DEST%\%%D" 2>nul
  350. )
  351. echo.
  352. echo ============================================================
  353. echo ^|^> Download Complete - Summary
  354. echo ============================================================
  355. echo.
  356. echo FROM COLLECTOR BUNDLES:
  357. echo Collector bundles found : %COLLECTOR_COUNT%
  358. echo Saved configs ^(ns.conf^) : %CONFIG_COUNT%
  359. echo Running configs : %RUNNING_COUNT%
  360. echo.
  361. echo FROM CASE ROOT DIRECTORY:
  362. echo Capture files ^(pcap,har^) : %CAPTURE_COUNT%
  363. echo Media files ^(images^) : %MEDIA_COUNT%
  364. echo Other files ^(xml,txt^) : %OTHER_COUNT%
  365. echo.
  366. echo Destination : %DEST%
  367. echo Log file : %LOGFILE%
  368. echo.
  369. REM Write summary to log
  370. echo. >> "%LOGFILE%"
  371. echo ============================================================ >> "%LOGFILE%"
  372. echo SUMMARY >> "%LOGFILE%"
  373. echo ============================================================ >> "%LOGFILE%"
  374. echo FROM COLLECTOR BUNDLES: >> "%LOGFILE%"
  375. echo Collector bundles found : %COLLECTOR_COUNT% >> "%LOGFILE%"
  376. echo Saved configs : %CONFIG_COUNT% >> "%LOGFILE%"
  377. echo Running configs : %RUNNING_COUNT% >> "%LOGFILE%"
  378. echo. >> "%LOGFILE%"
  379. echo FROM CASE ROOT DIRECTORY: >> "%LOGFILE%"
  380. echo Capture files : %CAPTURE_COUNT% >> "%LOGFILE%"
  381. echo Media files : %MEDIA_COUNT% >> "%LOGFILE%"
  382. echo Other files : %OTHER_COUNT% >> "%LOGFILE%"
  383. echo ============================================================ >> "%LOGFILE%"
  384. echo ============================================================
  385. echo.
  386. REM Open destination folder
  387. choice /C YN /M "Open destination folder now?"
  388. if !ERRORLEVEL! EQU 1 explorer "%DEST%"
  389. endlocal
  390. exit /b 0