使用Python和Shell实现内网IP及端口扫描

介绍

原视频来自油管的up主“ TheCyber Mentor”的Full Ethical Hacking Course - Network Penetration Testing for Beginners (2019)课程,以下为视频内容前4个小时(共14h)整理的个人笔记和个人理解。其中一些很基础的东西未整理(如Linux基本命令和Python基础知识)。本节内容的结果其实nmap已经实现了,但是个人觉得这次过程更重要,可以学到很多东西,适合shell和socket新人。

Shell实现内网IP及端口扫描

1.首先来看看如何用Shell来实现,建个.sh文件nano ipsweep.sh
写入以下代码

#!/bin/bash
for ip in $(seq 1 254);do
ping -c 1 $1.$ip | grep '64 bytes' | cut -d " " -f 4 | tr -d ":" &
done

注释{
大体思路是先ping一下这个IP能不能通,能通在返回的信息里截取IP。
只ping一次一个IP地址ping -c 1 192.168.3.1,结果如下

root@kali:~# ping -c 1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=0.812 ms

--- 192.168.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.812/0.812/0.812/0.000 ms

grep '64 bytes'截取第二行
seq 1 254意思为从1-254中依次取整数
$1命令行参数,这里指C类IP地址前24位。也就是第2个步骤的“192.168.3”参数
cut -d " " -f 4剪切碎片,以“ ”为分隔符,截取第4个碎片,也就是IP地址+“:”。例如:192.168.1.1:。注意IP地址后面的冒号

tr -d ":"将后面的冒号剔除
}

2.写完之后保存,并给个执行权限chmod +x ipsweep.sh,运行

root@kali:~# ./ipsweep.sh  192.168.3
192.168.3.1
192.168.3.72
192.168.3.85
192.168.3.82
192.168.3.64
192.168.3.79

结果为本机所在C类内网网段联网的主机地址。
将结果保存在ip.txt文件中./ipsweep.sh 192.168.3 > ip.txt

3.使用nmap对ip.txt的ip地址进行80端口扫描

for ip in $(cat ip.txt);do nmap -p 80 $ip & done

可以直接在命令窗口运行,也可以新建一个.sh文件把上面命令写进去再运行。

4.其他人性化设置
可以将ipsweep.sh的文件内容更改如下,用来提醒用户未加参数

#!/bin/bash

if [ $1=="" ]
then
echo "error"
echo "Missing IP address"
echo "example:./ipsweep.sh 192.168.1"

else
for ip in $(seq 1 254);do
ping -c 1 $1.$ip | grep '64 bytes' | cut -d " " -f 4 | tr -d ":" &
done
fi

快速建立HTTP Server

虽然和标题没关系,单个人觉得这个功能很有趣,十分方便下载东西,需使用python3启动http.server,且其路径为当前“pwd”路径。
想二次开发可以参考以下内容
http.server说明http.server源码(有很详细的注释)

python3 -m http.server 80

启动
效果
可以使用该方法快速下载系统内的文件(图中为/root下文件)

使用Python实现内网IP及端口扫描

1.首先导入所需的包

import sys #允许用户使用命令行参数,具体见“相关文献1”
import socket
from datetime import datetime #当前系统时间

相关文献1:sys.argv

2.选择要扫描的目标IP地址

if len(sys.argv) == 2:
	#返回的是主机名的IPV4地址
	target = socket.gethostbyname(sys.argv[1])
else:
	#若用户没有输入命令行参数,则提示用户
	print("Invalid amount of arguments.")
	print("example:python3 scanner.py <ip or hostname>")
	sys.exit()
#分隔符,输出目标IP和当前时间,准备开始扫描所选IP的端口
print("-"*50)
print("Scanner target:"+target)
print("Time started:"+str(datetime.now()))
print("-"*50)

3.扫描所选目标IP的端口

try:
	#所选端口范围为50~85,这里可以进行进一步优化
	#可使用sys.argv让用户来选定端口范围
	for port in range(50,85):
		#获取tcp/ip套接字
		s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		#超时时间阈值
		socket.setdefaulttimeout(1)
		print("Check port:{}".format(port))
		#若连接成功返回0,失败返回其他数字
		result=s.connect_ex((target,port)) 
		if result==0:
			print("Port is open:{}".format(port))
		s.close()
#用户ctrl+c中断程序
except KeyboardInterrupt:
	print("\nExiting progarm")
	sys.exit()
#未解析到主机名,所以能用IP尽量用IP
except socket.gaierror:
	print("Hostname could not be resolved.")
	sys.exit()
#IP地址输入错误或未连接网络
except socket.error:
	print("Couldn't connect to server.")
	sys.exit()

4.执行命令,结果如下
若想扫描所有内网IP的端口,只需读取ip.txt里的地址进行逐一扫描即可。
结果

发布了5 篇原创文章 · 获赞 2 · 访问量 334

猜你喜欢

转载自blog.csdn.net/sdihvai/article/details/103871380
今日推荐