-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
116 lines (100 loc) · 3.5 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const { spawn } = require('child_process');
const fs = require('fs');
const PDFDocument = require('pdfkit');
const path = require('path');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
app.use(express.static(path.join(__dirname, 'public')));
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
socket.on('startScan', ({ url, type, nmapScanType }) => {
const sessionId = Date.now();
socket.emit('sessionStarted', { sessionId });
if (type === 'all' || type === 'sqlmap') {
const sqlmap = spawn('sqlmap', ['-u', url, '--batch']);
sqlmap.stdout.on('data', (data) => {
socket.emit('toolOutput', { tool: 'sqlmap', data: data.toString() });
});
sqlmap.stderr.on('data', (data) => {
socket.emit('toolOutput', { tool: 'sqlmap', data: data.toString() });
});
sqlmap.on('close', () => {
socket.emit('toolFinished', { tool: 'sqlmap' });
});
}
if (type === 'all' || type === 'nmap') {
let nmapArgs;
switch (nmapScanType) {
case 'no-ping':
nmapArgs = ['-Pn', url];
break;
case 'aggressive':
nmapArgs = ['-A', url];
break;
case 'script':
nmapArgs = ['-sC', url];
break;
case 'service':
nmapArgs = ['-sV', url];
break;
default:
nmapArgs = [url];
}
const nmap = spawn('nmap', nmapArgs);
nmap.stdout.on('data', (data) => {
socket.emit('toolOutput', { tool: 'nmap', data: data.toString() });
});
nmap.stderr.on('data', (data) => {
socket.emit('toolOutput', { tool: 'nmap', data: data.toString() });
});
nmap.on('close', () => {
socket.emit('toolFinished', { tool: 'nmap' });
});
}
if (type === 'all' || type === 'nuclei') {
const nuclei = spawn('nuclei', ['-u', url]);
nuclei.stdout.on('data', (data) => {
socket.emit('toolOutput', { tool: 'nuclei', data: data.toString() });
});
nuclei.stderr.on('data', (data) => {
socket.emit('toolOutput', { tool: 'nuclei', data: data.toString() });
});
nuclei.on('close', () => {
socket.emit('toolFinished', { tool: 'nuclei' });
});
}
});
socket.on('generatePDF', ({ sessionId, sqlmapData, nmapData, nucleiData }) => {
const doc = new PDFDocument();
const filePath = `reports/report_${sessionId}.pdf`;
doc.pipe(fs.createWriteStream(filePath));
doc.fontSize(25).text('Vulnerability Scan Report', { align: 'center' });
doc.image('public/logo.png', { fit: [150, 150], align: 'center' });
doc.moveDown();
doc.fontSize(18).text('SQLmap Output', { underline: true });
doc.fontSize(12).text(sqlmapData);
doc.addPage();
doc.fontSize(18).text('Nmap Output', { underline: true });
doc.fontSize(12).text(nmapData);
doc.addPage();
doc.fontSize(18).text('Nuclei Output', { underline: true });
doc.fontSize(12).text(nucleiData);
doc.end();
socket.emit('pdfGenerated', { filePath: `report_${sessionId}.pdf` });
});
});
app.get('/download/:file', (req, res) => {
const file = req.params.file;
const filePath = path.join(__dirname, 'reports', file);
res.download(filePath);
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});