介绍
原视频来自油管的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里的地址进行逐一扫描即可。