python - Scapy Port Scanner - 在命令行中设置详细模式
问题描述
我有以下脚本扫描主机的端口。
详细模式最初设置为 off verbose=0
。
我希望用户能够在命令行中添加“-verbose”以启用详细程度。
这应该怎么做?
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
import sys
from scapy.all import *
# Define end host and TCP port range
hostInput = input("Enter a remote host to scan: ")
host = socket.gethostbyname(hostInput)
port_range = [21,22,23,25,53,80,110,135,137,138,139,443,1433,1434,8080]
# Send SYN with random Src Port for each Dst port
for dst_port in port_range:
src_port = random.randint(1025,65534)
resp = sr1(
IP(dst=host)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=1,
verbose=0,
)
if resp is None:
print(f"{host}:{dst_port} is filtered (silently dropped).")
elif(resp.haslayer(TCP)):
if(resp.getlayer(TCP).flags == 0x12):
# Send a gratuitous RST to close the connection
send_rst = sr(
IP(dst=host)/TCP(sport=src_port,dport=dst_port,flags='R'),
timeout=1,
verbose=1,
)
print(f"{host}:{dst_port} is open.")
elif (resp.getlayer(TCP).flags == 0x14):
print(f"{host}:{dst_port} is closed.")
elif(resp.haslayer(ICMP)):
if(
int(resp.getlayer(ICMP).type) == 3 and
int(resp.getlayer(ICMP).code) in [1,2,3,9,10,13]
):
print(f"{host}:{dst_port} is filtered (silently dropped).")
解决方案
Argparse模块使编写用户友好的命令行界面变得容易。该程序定义了它需要的参数,而 argparse 将弄清楚如何从 sys.argv 中解析出这些参数。argparse 模块还自动生成帮助和使用消息,并在用户给程序无效参数时发出错误。
在终端/cmd 中运行它的示例:
python3 logger.py --remote_host 127.0.0.1 --verbose 0
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
import sys
from scapy.all import *
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--remote_host")
parser.add_argument("--verbose")
args = parser.parse_args()
# Define end host and TCP port range
hostInput = args.remote_host
host = socket.gethostbyname(hostInput)
port_range = [21,22,23,25,53,80,110,135,137,138,139,443,1433,1434,8080]
# Send SYN with random Src Port for each Dst port
for dst_port in port_range:
src_port = random.randint(1025,65534)
resp = sr1(
IP(dst=host)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=1,
verbose=int(args.verbose),
)
if resp is None:
print(f"{host}:{dst_port} is filtered (silently dropped).")
elif(resp.haslayer(TCP)):
if(resp.getlayer(TCP).flags == 0x12):
# Send a gratuitous RST to close the connection
send_rst = sr(
IP(dst=host)/TCP(sport=src_port,dport=dst_port,flags='R'),
timeout=1,
verbose=int(args.verbose),
)
print(f"{host}:{dst_port} is open.")
elif (resp.getlayer(TCP).flags == 0x14):
print(f"{host}:{dst_port} is closed.")
elif(resp.haslayer(ICMP)):
if(
int(resp.getlayer(ICMP).type) == 3 and
int(resp.getlayer(ICMP).code) in [1,2,3,9,10,13]
):
print(f"{host}:{dst_port} is filtered (silently dropped).")
推荐阅读
- python - 如何在字符串中找到所有可能的连续三元组?
- javascript - 需要正则表达式来比较字符串中的最后一个数字
- php - 基于 Cookie 的身份验证 - 客户端
- github - 使用 github webhooks 配置成功/失败通知
- android - 如何在 Android 上实现应用内购买并处理一些逻辑以增加我的服务器上的积分?
- c - 在 while 循环中使用 scanf() 读取分段错误字符串
- android - 在 Jenkins 上上传 android 构建(.apk 文件)只是为了运行自动化套件而不是构建 android apk
- c++ - 当我对 std::vector 使用自定义排序时,为什么要使用 const 引用?
- python - Google Ads API:创建 IpBlockInfo 实例
- r - ggplot geom_smooth 对象中最陡峭的回归线的颜色代码