gpt4 book ai didi

python - 使用外部工具、subprocess.Popen 和线程进行多端口扫描

转载 作者:行者123 更新时间:2023-12-01 06:13:44 26 4
gpt4 key购买 nike

我正在使用端口扫描仪来扫描我的子网。不幸的是,端口扫描器一次只能扫描一台主机的一个端口。此外,扫描仪对于无法访问的主机有 1 秒的超时时间。扫描仪(作为外部程序)必须从 subprocess.Popen() 运行并加快速度 - 这样我就可以在以前的一些探针等待回复时发送多个探针 - 我使用线程。对于具有大量线程的完整/24 子网扫描,会出现问题。一些实际打开的端口显示为关闭。我怀疑输出会出现乱码。请注意,如果我扫描较少的主机或一次扫描一台主机,则不会发生这种情况

以下代码是我尝试创建一个线程池,该线程池采用 IP 地址并对定义的端口运行“顺序”端口扫描。扫描完所有指定端口后,它会从列表中选取下一个 IP。

        while True:
if not thread_queue.empty():
try:
hst = ip_iter.next()
except StopIteration:
break
m=thread_queue.get()
l=ThreadWork(self,hst,m)
l.start()
while open_threads != 0:
pass

该片段设置线程队列的位置

        thread_list = [x for x in range(num_threads)]
for t in thread_list:
thread_queue.put(str(t))
ip_iter=iter(self.final_target)

在 ThreadWork 函数中,我保留了打开线程的选项卡(因为 thread_queue.empty 被证明是不可靠的,所以我不得不使用这种粗暴的方式)

class ThreadWork(threading.Thread):
def __init__(self,i,hst,thread_no):
global open_threads
threading.Thread.__init__(self)
self.host = hst
self.ptr = i
self.t = thread_no
lock.acquire()
open_threads = open_threads + 1
lock.release()

def run(self):
global thread_queue
global open_threads
global lock
user_log.info("Executing sinfp for IP Address : %s"%self.host)
self.ptr.result.append(SinFpRes(self.host,self.ptr.init_ports,self.ptr.all_ports,self.ptr.options,self.ptr.cf))
lock.acquire()
open_threads = open_threads - 1
lock.release()
thread_queue.put(self.t)

对 SinFpRes 的调用会为一个 IP 创建一个结果对象,并仅为该 IP 启动端口的顺序扫描。每个端口实际扫描如图

        com_string = '/usr/local/sinfp/bin/sinfp.pl '+self.options+' -ai '+str(self.ip)+' -p '+str(p)
args = shlex.split(com_string)
self.result=subprocess.Popen(args,stdout=subprocess.PIPE).communicate()[0]
self.parse(p)

然后,解析函数利用 self.result 中存储的结果来存储该 PORT 的输出。所有端口的聚合构成了 IP 的扫描结果。

使用 10 个线程调用此代码可提供准确的 O/P(与 nmap 输出相比)。在提供 15 个线程时,偶尔会错过打开的端口。如果提供 20 个线程,则会错过更多开放端口。提供 50 个线程后,许多端口都会丢失。

附注- 作为初学者,这段代码非常复杂。向清教徒道歉。

P.P.S。 - 对于整个 C 类子网,即使是线程端口扫描也需要 15 分钟,扫描的端口几乎没有 20 个。我想知道是否应该将此代码移至另一种语言并使用 Python 仅解析结果。有人可以建议我一门语言吗?注意 - 我正在探索 S.Lott 所示的 Shell 选项,但在将其转储到文件之前需要手动处理。

最佳答案

使用外壳

 for h in host1 host2 host3
do
scan $h >$h.scan &
done
cat *.scan >all.scan

这将同时扫描整个主机列表,每个主机都在一个单独的进程中。没有线程。

每次扫描都会生成一个 .scan 文件。然后,您可以将所有 .scan 文件合并到一个庞大的 all.scan 文件中,以便进一步处理或执行您正在执行的任何操作。

关于python - 使用外部工具、subprocess.Popen 和线程进行多端口扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4460109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com