Hi guys. I am using OpenVAS 23.11.0 and I want it to work automatically whenever a new device joins in out network range. I’ve already configured a script in a file called openvas_auto_scan.py:
import os
import time
from gvm.connections import TLSConnection
from gvm.protocols.gmp import Gmp
from gvm.transforms import EtreeTransform
import subprocess
Cau hinh OpenVAS
OPENVAS_IP = “192.168.63.130”
OPENVAS_PORT = 9392
USERNAME = “admin”
PASSWORD = “quocphong07”
NETWORK_RANGE = “192.168.63.0/24”
SCANNED_DEVICES_FILE = “scanned_devices.txt”
Quet mang va lay thiet bi moi
def scan_network():
print(“Dang quet thiet bi moi”)
result = subprocess.run([“arp-scan”, “-l”], capture_output=True, tex>
devices =
for line in result.stdout.split(“\n”):
parts = line.split(“\t”)
if len(parts) > 1:
ip = parts[0].strip()
if ip.startswith(“192.168.”):
devices.append(ip)
return devices
Doc danh sach cac thiet bi da quet
def load_scanned_devices():
if os.path.exists(SCANNED_DEVICES_FILE):
with open(SCANNED_DEVICES_FILE, “r”) as f:
return set(f.read().splitlines())
return set()
Luu thiet bi da quet
def save_scanned_devices(scanned_devices):
with open(SCANNED_DEVICES_FILE, “w”) as f:
for device in scanned_devices:
f.write(f"{device}\n")
Tao target
def create_target(gmp, target_name, target_ip):
response = gmp.create_target(name=target_name, hosts=[target_ip], po>
return response.findtext(“id”)
Tao task
def create_task(gmp, task_name, target_id):
config_id = gmp.get_scan_configs().find(".//config[@name='Full and f>
response = gmp.create_task(name=task_name, config_id=config_id, targ>
return response.findtext(“id”)
Bat dau quet
def start_scan(gmp, task_id):
gmp.start_task(task_id=task_id)
Lay bao cao
def get_report(gmp, task_id):
time.sleep(30)
task_response = gmp.get_task(task_id=task_id)
report_id = task_response.findtext(“.//report/@id”)
formats_response = gmp.get_report_formats()
xml_format_id = formats_response.find(".//format[@name='XML']").get(>
return gmp.get_report(report_id=report_id, report_format_id=xml_form>
def main():
print(“Bat dau”)
scanned_devices = load_scanned_devices()
while True:
devices = scan_network()
new_devices = [ip for ip in devices if ip not in scanned_devices]
if new_devices:
print(f"Phat hien {len(new_devices)} thiet bi moi: ", new_devices)
connection = TLSConnection(hostname=OPENVAS_IP, port=OPENVAS_PORT)
with Gmp(connection=connection, transform=EtreeTransform()) as gmp:
connection.connect()
gmp.authenticate(USERNAME, PASSWORD)
for ip in new_devices:
target_id = create_target(gmp, f"Target-{ip}", ip)
task_id = create_task(gmp, f"Scan-{ip}", target_id)
start_scan(gmp, task_id)
print(f"Dang quet {ip}")
report = get_report(gmp, task_id)
scanned_devices.add(ip)
scanned_devices.update(new_devices)
save_scanned_devices(scanned_devices)
else:
print("Khong co thiet bi moi")
time.sleep(60)
if name == “main”:
main()
But when I run this, using the following command: sudo python3 openvas_auto_scan.py
It returns:
Bat dau
Dang quet thiet bi moi
Phat hien 4 thiet bi moi: [‘192.168.63.1’, ‘192.168.63.2’, ‘192.168.63.20’, ‘192.168.63.254’]
Traceback (most recent call last):
File “/home/phong/openvas_auto_scan.py”, line 93, in
main()
File “/home/phong/openvas_auto_scan.py”, line 77, in main
with Gmp(connection=connection, transform=EtreeTransform()) as gmp:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/gvm/protocols/gmp/_gmp.py”, line 104, in enter
self._gmp = self.determine_supported_gmp()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/gvm/protocols/gmp/_gmp.py”, line 84, in determine_supported_gmp
version_str = self.determine_remote_gmp_version().split(“.”, 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/gvm/protocols/gmp/_gmp.py”, line 68, in determine_remote_gmp_version
resp = self._send_command(Version.get_version())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/gvm/protocols/_protocol.py”, line 133, in _send_command
raise e
File “/usr/lib/python3/dist-packages/gvm/protocols/_protocol.py”, line 128, in _send_command
received_data = self._read()
^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/gvm/protocols/_protocol.py”, line 65, in _read
return self._connection.read()
^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/gvm/connections/_connection.py”, line 101, in read
data = self._read()
^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/gvm/connections/_connection.py”, line 73, in _read
return self._socket.recv(BUF_SIZE)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.12/ssl.py”, line 1232, in recv
return self.read(buflen)
^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.12/ssl.py”, line 1105, in read
return self._sslobj.read(len)
^^^^^^^^^^^^^^^^^^^^^^
TimeoutError: The read operation timed out
Could you please help me to fix this problem? Thank you so much.