听雨:来,跟我做个Python黑客吧!(1)端口扫描
0 黑帽子、灰帽子、白帽子、脚本小子
0.1 黑帽子
代表人物:欧阳锋
特点:武艺高强,阴狠手辣,专做恶事。
主要事迹:流毒无穷,毒死海上所有的鲨鱼(制造病毒);入侵皇宫,盗取武穆遗书(入侵行为,数据窃取);
0.2 灰帽子
代表人物:黄药师
特点:武艺高强,亦正亦邪,游走在法律边缘。
主要事迹:诡计骗取周伯通的《九阴真经》(网络钓鱼),精通五行术数(密码学),杀人报仇、劫富济贫(合情不合法)
0.3 白帽子
代表人物:洪七公
特点:武艺高强,惩恶扬善。
主要事迹:多次与欧阳锋斗争(对抗黑帽黑客),用药饼子驱蛇(反病毒)。
0.4 脚本小子
代表人物:杨康
特点:武艺低端,主要靠取巧和利用工具,做不了大恶
主要事迹:铁枪头杀残疾的欧阳克(漏洞攻击,利用工具),一掌拍在黄蓉的软猬甲上坑死自己(攻击时误入蜜罐)
1 端口扫描
1.1 什么是端口
端口,英文:PORT的中文翻译,是计算机与外部通信的途径在网络技术中,端口大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。
1.2 常见的端口号
1 TCPMUX 主要在SGI Irix机器
5 REMOTE JOB ENTRY(RJE) 远程作业
7 ECHO 回声
18 Message Send Protocol(MSP) 报文发送协议
20 FTP-Data 文件传输协议
21 FTP-Control 文件传输协议
22 SSH Remote Login Protocol 远程登陆
23 Telnet 远程登陆
25 Simple Mail Transfer Protocol SMTP简单邮件传输协议
29 MSG ICP
37 TIME 时间
43 Host Name Server(NAMESERV) 主机名称服务
49 Login Host Protocol TACACS登录主机协议
53 Domain Name System(DNS) 域名系统
69 Trivial File Transfer Protocol 小型文件传输协议
70 Gopher Services 信息检索协议
79 Finger 查询远程主机在线用户等信息
80 HTTP 超文本传输协议
92 npp 网络打印协议
93 dcp 设备控制协议
103 X.400 Standard 电子邮件标准
108 SNA Gateway Access Server
109 POP2 邮件服务
110 POP3 客户端访问服务器端的邮件服务
115 Simple File Transfer Protocol SFTP简单文件传输协议
118 SQL Services
119 Newsgroup NNTP
137 NetBISO Name Service NetBIOS 名称解析
139 NetBIOS Datagram Service NetBIOS 会话服务
143 Interim Mail Access Protocol IMAP
150 NetBIOS Session Service
156 SQL Server
161 SNMP 简单网络管理协议
179 Border Gatewat Protocol(BGP) 边界网关协议
190 Gateway Access Control Protocol GACP
194 Internet Relay Chat IRC
197 Directory Location Service DLS
389 Lightweight Directory Access Protocol LDAP
396 Novell Netware over IP
443 HTTPS 安全超文本传输协议
444 Simple Network Paging Protocol SNPP
445 Microsoft-DS
458 Apple QuickTime
546 DHCP Client 动态主机配置协议 – 客户端
547 DHCP Server 动态主机跑配置协议 – 服务器端
563 SNEWS
569 MSN
1080 Socks
1.3 端口扫描的意义
扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息(比如:是否能用匿名登陆!是否有可写的FTP目录,是否能用TELNET)
2 python端口扫描器
2.1 代码
import socket, time, _thread
socket.setdefaulttimeout(2)
def socket_port(ip, port):
try:
if port >= 65535:
print('端口扫描结束')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex((ip, port))
if result == 0:
lock.acquire()
print(ip, ':', port, '端口开放')
lock.release()
s.close()
except:
print('端口扫描异常')
def ip_scan(ip):
try:
print('开始扫描 %s' % ip)
start_time = time.time()
for i in range(0, 65534):
_thread.start_new_thread(socket_port, (ip, int(i)))
print('扫描端口完成,总共用时 :%.2f' % (time.time() - start_time))
input("Press Enter to Exit")
except:
print('扫描ip出错')
if __name__ == '__main__':
url = input('Input the ip you want to scan:\n')
lock = _thread.allocate_lock()
ip_scan(url)
2.2 重点讲解
(1)
import socket, time, _thread
socket 模块实现了到 socket 通讯层的接口. 你可以使用该模块创建 客户端或是服务器的 socket .
time 实现与时间有关功能
_thread 实现多线程,提高程序运行效率(本次不做详细解释)
(2)
socket.setdefaulttimeout(2)
设定默认超时时间,用于减少等待提高效率
(3)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建socket对象。调用socket构造函数。格式:
socket = socket.socket( family, type )
family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
(4)
result = s.connect_ex((ip, port))
s.connect() 主动初始化TCP 服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛异常
(5)
lock.acquire()
lock.release()
多线程用,这节课不做明确解释
(6)
s.close()
s.close() 关闭套接字
(7)
__name__ == '__main__':
在cmd 中直接运行.py文件,则__name__
的值是'__main__'
而在import 一个.py文件后,__name__
的值就不是'__main__'
了;
从而用if __name__ == '__main__'
来判断是否是在直接运行该.py文件
(8)
_thread.start_new_thread(socket_port, (ip, int(i)))
多线程用,不做详细解释。
想上手实战的小白看过来,这里有网易云课堂上最畅销的 Python 课程:Python 实战:四周学会爬虫系统