Скрипт Python CGI для сканирования удаленного HTTP-клиента

У меня возникли проблемы с запуском этого веб-скрипта Python и распечаткой результатов на веб-странице. Это небольшой проект, над которым я работаю, который будет работать на маршрутизаторе OpenWRT.

Когда беспроводной клиент подключается к точке доступа, CGI-скрипт будет работать с IP-адресом устройства, полученным из сеансов HTTP, и отображать, открыты ли какие-либо порты, которые могут оставить человека открытым для какой-либо атаки в общедоступной сети.

Я могу подтвердить, что сканирование портов работает правильно из захвата пакетов wireshark.

В ту минуту я продолжаю получать ошибку CGI о том, что есть ошибка с синтаксисом Nmap, хотя я знаю, что это работает в оболочке Python.

ошибка, которую я получаю, -

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
 /Applications/XAMPP/xamppfiles/cgi-bin/test.py in ()
     20 for client in nm.scan():
     21         print('----------------------------------------------------')
=>   22         print('Host : %i' % (nm[client].all_protocols().keys))
     23 """
     24 
nm = <nmap.nmap.PortScanner object>, client = 'nmap', ].all_protocols undefined
 /Applications/XAMPP/xamppfiles/cgi-bin/build/bdist.macosx-10.8-intel/egg/nmap/nmap.py in __getitem__(self=<nmap.nmap.PortScanner object>, host='nmap')

<type 'exceptions.KeyError'>: 'nmap'
      args = ('nmap',)
      message = 'nmap' 

Вот мой код

#!/usr/bin/env python2.7
import cgi
import os
import nmap
import cgitb; cgitb.enable()  # for troubleshooting

print "Content-type: text/html"
print
print """
<html>
<head><title>Sample CGI Script</title></head>
<body>
<h3> Sample CGI Script </h3>
"""
client = cgi.escape(os.environ["REMOTE_ADDR"])
print ('your IP Address is: ' + client)
nm = nmap.PortScanner()
nm.scan(client, '21')

for client in nm.scan():
    print('----------------------------------------------------')
    print('Host : %i' % (nm[client].all_protocols().keys))
"""

</body> 
</html>
 """

person Br1nary    schedule 11.03.2014    source источник


Ответы (1)


#!/usr/bin/env python

""" Nmap CGI """

import cgi
import os
from libnmap.process import NmapProcess
from libnmap.parser import NmapParser

print 'Content-Type: text/html'
print # Blank line marking end of HTTP headers

def main(target):
    """ I'm a lumberjack and i'm ok """
    nmap = NmapProcess(target, options="-T5 -p 21")
    nmap.run()
    nmap_report = NmapParser.parse(nmap.stdout)

    for host in nmap_report.hosts:
        address = host.address
        hostname = host.hostnames[0]
        ports = host.get_ports()
        ports = '<br/>'.join(["Port: %s Proto: %s<br/>" % (_id, name)
                            for (_id, name) in host.get_ports()])

        print """
        <center><hr style='margin-top:5%'>
        Hostname: {hostname} <br/> Address: {address} <br>
        Open ports: {ports}
        <hr>
        </center>
        """.format(address=address, ports=ports, hostname=hostname)

main(cgi.escape(os.environ["REMOTE_ADDR"]))

Вывод

Content-Type: text/html


        <center><hr style='margin-top:5%'>
        Hostname: localhost <br/> Address: 127.0.0.1 <br>
        Open ports: Port: 21 Proto: tcp<br/>
        <hr>
        </center>
person Ricky Wilson    schedule 05.06.2014