Python网络编程基础
0x00 简介
首先说一下我为什么要写这个,我并没有系统的去学过Python,学校也只教了一点C。很久之前自己就有学python,但也只是学了一点点,和没学一样的。
认真审视一下我的编程技术,真的很菜,必须要专注学习一门语言了。所以在这里就把以前学过的杂乱知识汇总一下,以便查阅。
备注:以下代码均为Python 3.7
0x01 socket()函数
在Python 中,我们经常使用 socket()函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
参数:
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0
使用方法举例:固定IP端口探测
import socket
s=socket.socket() #初始化
try:
s.connect(('43.225.100.88', 22))
except:pass
message='hello word!\n'
message=message.encode()
s.send(message)
banner=s.recv(1024)
print(banner)
1.1 简单的端口扫描器
import socket
import sys
name=sys.argv[0]
ip=sys.argv[1]
s=socket.socket()
message='hello word!\n'
message=message.encode()
for port in range(20, 40):
try:
print("[+] Attempting to connect to:" + ip + ":" + str(port) + "...")
s.connect((ip, port))
s.send(message)
banner = s.recv(1024)
if banner:
print("[-] Port " + str(port) + " is open:", end="")
print(banner)
except:pass
s.close()
1.2 简单的服务扫描器
import socket
hosts = ['127.0.0.1', '192.168.1.5', '10.0.0.1']
ports = [22,445,80,443,3389]
s=socket.socket()
messages='hello word\n'
messages=messages.encode()
for host in hosts:
for port in ports:
try:
print("[+] Connecting to "+host+":"+str(port))
s.connect((host,port))
s.send(messages)
banner=s.recv(1024)
if banner:
print("[-] Port "+str(port)+" is open:",end="")
print(banner)
except:pass
s.close()
1.3 C段扫描
import socket
import re
host='192.168.83.130/24'
#自定义要扫描的端口
ports=['22','1433','3306']
#设置超时时间2秒
socket.setdefaulttimeout(2)
def scan(host):
for port in ports:
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,int(port)))
print("[*]%s port %s is open"%(host,port))
s.close()
if '21' in port: #如果21端口开放,尝试爆破FTP弱口令
print("[*] Try to crack FTP pass")
__import__('ftp_check').check(host)
elif '3306' in port: #如果3306端口开放,尝试爆破Mysql弱口令
print("[*]Try to crack Mysql pass")
__import__('mysql_check').check(host)
except:
continue
#检查用户输入是否为有效IP地址,如果用户输入中带有/24,则扫描整个C段,否则扫描单个IP
if '/24' in host:
print(host)
for x in range(130,140,1): #这里并没有真正扫描C段,节约时间,扫描了10个IP
ip=re.sub(r'.\d+/24','.'+str(x),host) #表示将最后的地址替换成1到255的数字
print(ip)
scan(ip)
else:
ip=host
scan(ip)
__import__
函数:
- 函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。
__import__(module)
相当于import module
0x02 Urllib库
2.1 urllib.request.urlopen()
import urllib.request
response=urllib.request.urlopen('https://www.cnblogs.com') #请求站点获得一个HTTP Response对象
print(response.read().decode('utf-8')) #返回网页内容
print(response.getheader('server')) #返回响应头中的server值
print(response.getheaders()) #以列表元祖对的形式返回响应头信息
print(response.fileno()) #返回文件描述符
print(response.version) #返回版本信息
print(response.status) #返回状态码200,404代表网页未找到
print(response.debuglevel) #返回调试等级
print(response.closed) #返回对象是否关闭布尔值
print(response.geturl()) #返回检索的URL
print(response.info()) #返回网页的头信息
print(response.getcode()) #返回响应的HTTP状态码
print(response.msg) #访问成功则返回ok
print(response.reason) #返回状态信息
2.2 urlopen()
参数:
url:网站地址,str类型,也可以是一个request对象
data:data参数是可选的,内容为字节流编码格式的即bytes类型,如果传递data参数,urlopen将使用Post方式请求
timeout:用于设置超时时间,单位为秒,如果请求超出了设置时间还未得到响应则抛出异常,支持HTTP,HTTPS,FTP请求
context:她必须是ssl.SSLContext类型,用来指定SSL设置,此外,cafile和capath这两个参数分别指定CA证书和它的路径,会在https链接时用到。
2.3 urllib.request.Requset()
参数:
url:请求的URL,必须传递的参数,其他都是可选参数
data:上传的数据,必须传bytes字节流类型的数据,如果它是字典,可以先用urllib.parse模块里的urlencode()编码
headers:它是一个字典,传递的是请求头数据,可以通过它构造请求头,也可以通过调用请求实例的方法add_header()来添加
origin_req_host:指请求方的host名称或者IP地址
unverifiable:表示这个请求是否是无法验证的,默认为False,如我们请求一张图片如果没有权限获取图片那它的值就是true
method:是一个字符串,用来指示请求使用的方法,如:GET,POST,PUT等
from urllib import request,parse
url='http://httpbin.org/post'
headers={
'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)',
'Host':'httpbin.org'
} #定义头信息
dict={'name':'germey'}
data = bytes(parse.urlencode(dict),encoding='utf-8')
#data需要字节类型的参数,使用bytes()函数转换为字节,使用urllib.parse模块里的urlencode()方法来讲参数字典转换为字符串并指定编码
req = request.Request(url=url,data=data,headers=headers,method='POST')
#req.add_header('User-Agent','Mozilla/5.0 (compatible; MSIE 8.4; Windows NT') #也可以request的方法来添加
response = request.urlopen(req)
print(response.read())
2.4 Get/Post获取网页
from urllib import request,parse
values ={"id":"2"}
params="?" #这里是GET传参需要的
for key in values:
params = (params + key + "=" + values[key] )
url="http://43.247.91.228:84/Less-1/index.php"
headers = {
# heard部分直接通过chrome部分request header部分
# 'Accept': 'application/json, text/plain, */*',
# 'Accept-Encoding': 'gzip, deflate',
# 'Accept-Language': 'zh-CN,zh;q=0.8',
# 'Connection': 'keep-alive',
# 'Content-Type': 'application/x-www-form-urlencoded',
'Referer': url,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}
data = bytes(parse.urlencode(values),encoding='utf-8')
#req = request.Request(url=url, headers=headers, data=data) #POST方法
req = request.Request(url+params) #GET方法
response =request.urlopen(req)
print (response.read().decode('utf-8'))
2.5 捕获http异常
from urllib import parse,request
import urllib.error
url='http://43.247.91.228:80/Less-1/index.php'
headers={
'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)',
'Host':'43.247.91.228:80'
} #定义头信息
data={'id':'1'}
params='?'
for key in data:
params = (params + key + "=" + data[key] )
data = bytes(parse.urlencode(data),encoding='utf-8')
req = urllib.request.Request(url+params)
try:
respose=urllib.request.urlopen(req)
print(respose.read().decode('utf-8'))
except urllib.error.HTTPError as e:
print(e.code)
print(e.read().decode("utf-8"))
2.6 设置代理
import urllib.request
proxy_support = urllib.request.ProxyHandler({"http" : "39.80.118.178:8060"})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
a = urllib.request.urlopen("http://43.247.91.228:84/Less-1/?id=1").read().decode("utf-8")
print(a)
0x03 Requests库
3.1 简单的请求
import requests
r = requests.get('http://43.247.91.228:84/Less-1/?id=1')
print r.headers
print r.status_code
print r.url
print r.text
print r.content
3.2 GET方式
import requests
payload ={'id':1}
r = requests.get('http://43.247.91.228:84/Less-1/',params=payload)
print(r.url)
print(r.content.decode("utf-8"))
3.3 POST方式
import requests
payload ={'id':1}
r = requests.post('http://43.247.91.228:84/Less-1/',data=payload)
print(r.url)
print(r.content.decode("utf-8"))
3.4 设置headers
import requests
url='http://43.247.91.228:84/Less-1/?id=1'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0'}
r= requests.get(url,headers=headers)
print(r.text)
3.5 用cookie进行登录
import requests
raw_cookies="PHPSESSID=d7kkojg82otnh9c53ao1m87pq3; security=low"
cookies={}
for line in raw_cookies.split(';'):
key,value=line.split('=',1)
cookies[key]=value
testurl='http://43.247.91.228:81/'
s=requests.get(testurl,cookies=cookies)
print(s.text)
3.6 模拟表单登录
import requests
data = {'username':'admin','password':'password','Login':'Login'}
r=requests.post('http://43.247.91.228:81/login.php',data=data);
print(r.url)
print(r.content.decode("utf-8"))
3.7 SSL证书验证问题
result=requests.get('https://www.v2ex.com', verify=False)
忽略验证SSL证书,不然会报错
0x04 参考链接
----------------------------------------------------------------------------
作者:肖洋肖恩、
----------------------------------------------------------------------------
文中可能会存在纰漏,若发现请联系与我。
本文所有代码仅可用于站长自我检测与学习,如用于非法攻击一切后果自负。