pythonip扫描
1. python 爬虫如何实现cnki 的自动ip登录
自己做个代理服务器。例如618爬虫代理,再指向次一级代理。或者是直接让爬虫通过http proxy的参数设置去先把一个代理。 代理池通常是租来的,或者是扫描出来的。扫描出来的往往大部分都不可用。 爬虫的实现有几百种方案。通常建议直接从SCRAPY入手。
2. 如何使用Python工具分析风险数据
1、引入工具–加载数据分析包
启动IPython notebook,加载运行环境:
%matplotlib inline
import pandas as pd
from datetime import timedelta, datetime
import matplotlib.pyplot as plt
import numpy as np
2、数据准备
俗话说: 巧妇难为无米之炊。小安分析的数据主要是用户使用代理IP访问日志记录信息,要分析的原始数据以CSV的形式存储。这里首先要介绍到pandas.read_csv这个常用的方法,它将数据读入DataFrame
analysis_data = pd.read_csv('./honeypot_data.csv')
对的, 一行代码就可以将全部数据读到一个二维的表结构DataFrame变量,感觉很简单有木有啊!!!当然了用Pandas提供的IO工具你也可以将大文件分块读取,再此小安测试了一下性能,完整加载约21530000万条数据也大概只需要90秒左右,性能还是相当不错。
3、数据管窥
一般来讲,分析数据之前我们首先要对数据有一个大体上的了解,比如数据总量有多少,数据有哪些变量,数据变量的分布情况,数据重复情况,数据缺失情况,数据中异常值初步观测等等。下面小安带小伙伴们一起来管窥管窥这些数据。
使用shape方法查看数据行数及列数
analysis_data.shape
Out: (21524530, 22) #这是有22个维度,共计21524530条数据记的DataFrame
使用head()方法默认查看前5行数据,另外还有tail()方法是默认查看后5行,当然可以输入参数来查看自定义行数
analysis_data.head(10)
这里可以了解到我们数据记录有用户使用代理IP日期,代理header信息,代理访问域名,代理方法,源ip以及蜜罐节点信息等等。在此小安一定一定要告诉你,小安每次做数据分析时必定使用的方法–describe方法。pandas的describe()函数能对数据进行快速统计汇总:
对于数值类型数据,它会计算出每个变量: 总个数,平均值,最大值,最小值,标准差,50%分位数等等;
非数值类型数据,该方法会给出变量的: 非空值数量、unique数量(等同于数据库中distinct方法)、最大频数变量和最大频数。
由head()方法我们可以发现数据中包含了数值变量、非数值变量,我们首先可以利用dtypes方法查看DataFrame中各列的数据类型,用select_dtypes方法将数据按数据类型进行分类。然后,利用describe方法返回的统计值对数据有个初步的了解:
df.select_dtypes(include=['O']).describe()
df.select_dtypes(include=['float64']).describe()
简单的观察上面变量每一维度统计结果,我们可以了解到大家获取代理数据的长度平均1670个字节左右。同时,也能发现字段scanossubfp,scanscan_mode等存在空值等等信息。这样我们能对数据整体上有了一个大概了解。
4、数据清洗
由于源数据通常包含一些空值甚至空列,会影响数据分析的时间和效率,在预览了数据摘要后,需要对这些无效数据进行处理。
一般来说,移除一些空值数据可以使用dropna方法, 当你使用该方法后,检查时发现 dropna() 之后几乎移除了所有行的数据,一查Pandas用户手册,原来不加参数的情况下, dropna() 会移除所有包含空值的行。
如果你只想移除全部为空值的列,需要加上 axis 和 how 两个参数:
analysis_data.dropna(axis=1, how='all')
另外,也可以通过dropna的参数subset移除指定列为空的数据,和设置thresh值取移除每非None数据个数小于thresh的行。
analysis_data.dropna(subset=['proxy_host', 'srcip'])
#移除proxy_host字段或srcip字段没有值的行
analysis_data.dropna(thresh=10)
#移除所有行字段中有值属性小于10的行
5、统计分析
再对数据中的一些信息有了初步了解过后,原始数据有22个变量。从分析目的出发,我将从原始数据中挑选出局部变量进行分析。这里就要给大家介绍pandas的数据切片方法loc。
loc([startrowindex:endrowindex,[‘timestampe’, ‘proxy_host’, ‘srcip’]])是pandas重要的切片方法,逗号前面是对行进行切片;逗号后的为列切片,也就是挑选要分析的变量。
如下,我这里选出日期,host和源IP字段——
analysis_data = analysis_data.loc([:, [‘timestampe’,'proxy_host','srcip']])
首先让我们来看看蜜罐代理每日使用数据量,我们将数据按日统计,了解每日数据量PV,并将结果画出趋势图。
daily_proxy_data = analysis_data[analysis_data.mole=='proxy']
daily_proxy_visited_count = daily_proxy_data.timestamp.value_counts().sort_index()
daily_proxy_visited_count.plot()
对数据列的丢弃,除无效值和需求规定之外,一些表自身的冗余列也需要在这个环节清理,比如说DataFrame中的index号、类型描述等,通过对这些数据的丢弃,从而生成新的数据,能使数据容量得到有效的缩减,进而提高计算效率。
由上图分析可知蜜罐代理使用量在6月5号,19-22号和25号这几天呈爆炸式增长。那么这几天数据有情况,不正常,具体是神马情况,不急,后面小安带大家一起来慢慢揪出来到底是那些人(源ip) 干了什么“坏事”。
进一步分析, 数据有异常后,再让我们来看看每天去重IP数据后量及其增长量。可以按天groupby后通过nunique()方法直接算出来每日去重IP数据量。
daily_proxy_data = analysis_data[analysis_data.mole=='proxy']
daily_proxy_visited_count = daily_proxy_data.groupby(['proxy_host']).srcip.nunique()
daily_proxy_visited_count.plot()
究竟大部分人(源ip)在干神马?干神马?干神马?让我们来看看被访问次数最多host的哪些,即同一个host关联的IP个数,为了方便我们只查看前10名热门host。
先选出host和ip字段,能过groupby方法来group 每个域名(host),再对每个域名的ip访问里unique统计。
host_associate_ip = proxy_data.loc[:, ['proxy_host', 'srcip']]
grouped_host_ip = host_associate_ip.groupby(['proxy_host']).srcip.nunique()
print(grouped_host_ip.sort_values(ascending=False).head(10))
再细细去看大家到底做了啥——查看日志数据发现原来在收集像二手车价格,工人招聘等等信息。从热门host来看,总得来说大家使用代理主要还是获取网络,qq,Google,Bing这类妇孺皆知网站的信息。
下面再让我们来看看是谁用代理IP“干事”最多,也就是看看谁的IP访问不同host的个数最多。
host_associate_ip = proxy_data.loc[:, ['proxy_host', 'srcip']]
grouped_host_ip = host_associate_ip.groupby(['srcip'_host']).proxy_host.nunique()
print(grouped_host_ip.sort_values(ascending=False).head(10))
哦,发现目标IP为123..*.155的小伙子有大量访问记录, 进而查看日志,原来他在大量收集酒店信息。 好了,这样我们就大概能知道谁在干什么了,再让我们来看看他们使用proxy持续时长,谁在长时间里使用proxy。 代码如下——
这里不给大家细说代码了,只给出如下伪代码。
date_ip = analysis_data.loc[:,['timestamp','srcip']]
grouped_date_ip = date_ip.groupby(['timestamp', 'srcip'])
#计算每个源ip(srcip)的访问日期
all_srcip_ration_times = ...
#算出最长连续日期天数
ration_date_cnt = count_date(all_srcip_ration_times)
好了,到此我也就初略的知道那些人做什么,谁用代理时长最长等等问题额。取出ip = 80...38的用户使用代理ip访问数据日志,发现原来这个小伙子在长时间获取搜狐images。
蜜罐在全国各地部署多个节点,再让我们来看看每个源ip扫描蜜罐节点总个数,了解IP扫描节点覆盖率。结果见如下:
# 每个IP扫描的IP扫描节点总个数
node = df[df.mole=='scan']
node = node.loc[:,['srcip','origin_details']]
grouped_node_count = node.groupby(['srcip']).count()
print grouped_node_count.sort_values(['origin_details'], ascending=False).head(10)
由上述两表初步可知,一些结论:如源ip为182...205的用户长时间对蜜罐节点进行扫描,mark危险用户等等。
3. python3 获取title的编写
水平有限,不会造轮子,只为学习。
在原来写端口扫描的基础上进一步爬取web服务的title信息,方便收集信息。
适用于在外网收集资产形成IP字典后去批量获取title,意在最快地寻找脆弱点。
自行安装BeautifulSoup4、requests库。
V1.0
python3 写的单线程爬取web系统的title信息。
注解
1.使用BeautifulSoup4库来解析HTML,爬取title信息;
2.打印title时,带有颜色的输出;
3.在开放443、4433、8443端口时,采用https进行访问;
4.解决SSL认证问题;
V1.0.1
python3 单线程写的爬取网站title信息。增加了OptionParser模块,运行时看起来比较舒服。
注解
1.依然是从IP字典里爬取,实际运行脚本时,即使没有获取title,也应该手动访问开放的端口,往往有意外惊喜;
2.端口内置在脚本里,可自行修改;
V1.1
python3写的多线程爬取web系统的title。
注解
1.只是使用threading模块,没有添加到队列,也没有加锁;本身port_list也不多;
V1.2
python3 写的多线程加队列的来爬取web系统的title信息。
注解
1.增加了queue队列,和多线程配合使用。更加实用;
V1.3
python3 写的多线程加队列的来爬取web系统的title信息。
增加result输出结果到文本,适应于内外网端口扫描并获取title
python3 编写扫描IP网段如192.168.1.0/24某些指定应用端口爬取title信息。 在代理进行内网渗透时内网资产不容易找到。
适用于内网、外网环境。
自行安装BeautifulSoup4、requests库。
V2.0
python3写的扫描IP段并爬取title信息,收集资产。
注解
1.使用ipaddress模块获取C段地址,也可以是B段;
2.只使用threading模块,没有添加队列queue;
V2.1
python3 写的多线程扫描IP段爬取title。在一定线程下,代理探测内网资产title的非常使用。
注解
1.port_list列表移动到scan方法里;
2.将IP添加到queue队列,而不是端口;
V2.2
python3 写的多线程扫描IP段爬取title。
注解
1.只是增加了result_out方法,将结果输出到指定文件;
https://github.com/aedoo/WebServiceScanner/blob/master/webservicescanner.py
4. 如何使用多线程python扫描二级子域名
日站没什么好办法了往往也会想到其二级域名,于是写了一个比较简陋的扫描二级域名的程序
速度一般般,不过如果线程开多了还是可以的
源程序(subdomain.py):
#! /usr/bin/env python
#coding=utf-8
import threading , Queue, optparse, os
import pycurl, StringIO, msvcrt, socket
queue = Queue.Queue()
class ScanThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while 1:
p = self.queue.get()
if p is None:
break
try:
sub_domain = p+'.'+domain
crl = pycurl.Curl()
crl.fa = StringIO.StringIO()
crl.setopt(pycurl.URL,sub_domain)
crl.setopt(pycurl.VERBOSE,0)
crl.setopt(pycurl.FOLLOWLOCATION,1)
crl.setopt(pycurl.MAXREDIRS,5)
crl.setopt(pycurl.CONNECTTIMEOUT, 60)
crl.setopt(pycurl.TIMEOUT, 300)
crl.setopt(crl.WRITEFUNCTION,crl.fa.write)
try:
crl.perform()
ip=socket.gethostbyname(sub_domain)
print sub_domain, ip
content = sub_domain+' '+ip+'\n'
self.writefile(wfile, 'a+', content)
except:
pass
except:
print "error"
self.writefile('F:/py/Domain/log.txt', 'a+', p+'\n')
queue.task_done()
def writefile(self, path, type, content):
f = open(path, type)
f.write(content)
f.close
class ThreadGetKey(threading.Thread):
def run(self):
while 1:
try:
chr = msvcrt.getch()
if chr == 'q':
print "stopped by your action ( q )"
os._exit(1)
else:
continue
except:
os._exit(1)
# now starting...
def main():
parser = optparse.OptionParser('Usages: %prog -d <domain> -r <read> -w <write> -t <thread(s)>')
parser.add_option('-d',dest='domain',type='string',help='the url to query')
parser.add_option('-r',dest='read',type='string',help='the dic file to read default=F:/py/Domain/dic.txt', default='F:/py/Domain/dic.txt')
parser.add_option('-w',dest='write',type='string',help='save the reasults to the catalogue \
default=F:/py/Domain/results.txt', default='F:/py/Domain/results.txt')
parser.add_option('-t',dest='threads',type='int',help='set the thread(s) default=10',default=10)
(options,args) = parser.parse_args()
if options.domain == None:
使用方法:
python subdomain.py -d .com -r dic.txt -w results.txt -t 50
主要影响速度的是这一块代码:
try:
crl.perform()
ip=socket.gethostbyname(sub_domain)
print sub_domain, ip
content = sub_domain+' '+ip+'\n'
self.writefile(wfile, 'a+', content)
except:
pass
主要是一开始理解错了,以为二级域名不存在和某个网页不存在一样会返回404代码,于是想到用返回码来判断。
结果后来程序一直出错,才发现当二级域名不存在的时候返回的是“未找到服务器”,根本不存在返回码,于是只能使用一个try来调试错误,主要速度也就被这里影响了。当然线程开多了也是可以看到刷屏效果的~~
5. Python网络编程4--实现IP分片与网络路径MTU探测
实验拓扑如下,linux向R2发送IP分片,并在R2接口上抓包。
ICMP包校验和是连通头部信息加数据本身一起进行校验(ip包只需要校验头部信息)而Scapy自动添加ICMP校验和时只会计算第一分片的数据,当三个分片到达目标主机进行重组后校验不通过,将重组后的数据包丢弃;因此在手动设置IP分片时,需要手动将校验和添加入ICMP首部中。
由于手动计算校验和过程较复杂,可通过wireshark抓包,可以获取到正确的校验和。
抓包结果如下,由于单个数据包长度超过MTU,系统自动将ICMP request包分片发送,同样的ICMP reply系统也进行了分片。
当主机发送分组的长度超过MTU又不可以分片(IP flags位DF置1),则这个分组丢弃,并用ICMP差错报文向主机报告。
参考:( https://fasionchan.com/network/ip/fragmentation/ )
6. Python 实现端口扫描
一、常见端口扫描的原理
0、秘密扫描
秘密扫描是一种不被审计工具所检测的扫描技术。
它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己。
秘密扫描能躲避IDS、防火墙、包过滤器和日志审计,从而获取目标端口的开放或关闭的信息。由于没有包含TCP 3次握手协议的任何部分,所以无法被记录下来,比半连接扫描更为隐蔽。
但是这种扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包。现有的秘密扫描有TCP FIN扫描、TCP ACK扫描、NULL扫描、XMAS扫描和SYN/ACK扫描等。
1、Connect()扫描
此扫描试图与每一个TCP端口进行“三次握手”通信。如果能够成功建立接连,则证明端口开发,否则为关闭。准确度很高,但是最容易被防火墙和IDS检测到,并且在目标主机的日志中会记录大量的连接请求以及错误信息。
TCP connect端口扫描服务端与客户端建立连接成功(目标端口开放)的过程:
① Client端发送SYN;
② Server端返回SYN/ACK,表明端口开放;
③ Client端返回ACK,表明连接已建立;
④ Client端主动断开连接。
建立连接成功(目标端口开放)
TCP connect端口扫描服务端与客户端未建立连接成功(目标端口关闭)过程:
① Client端发送SYN;
② Server端返回RST/ACK,表明端口未开放。
优点:实现简单,对操作者的权限没有严格要求(有些类型的端口扫描需要操作者具有root权限),系统中的任何用户都有权力使用这个调用,而且如果想要得到从目标端口返回banners信息,也只能采用这一方法。
另一优点是扫描速度快。如果对每个目标端口以线性的方式,使用单独的connect()调用,可以通过同时打开多个套接字,从而加速扫描。
缺点:是会在目标主机的日志记录中留下痕迹,易被发现,并且数据包会被过滤掉。目标主机的logs文件会显示一连串的连接和连接出错的服务信息,并且能很快地使它关闭。
2、SYN扫描
扫描器向目标主机的一个端口发送请求连接的SYN包,扫描器在收到SYN/ACK后,不是发送的ACK应答而是发送RST包请求断开连接。这样,三次握手就没有完成,无法建立正常的TCP连接,因此,这次扫描就不会被记录到系统日志中。这种扫描技术一般不会在目标主机上留下扫描痕迹。但是,这种扫描需要有root权限。
·端口开放:(1)Client发送SYN;(2)Server端发送SYN/ACK;(3)Client发送RST断开(只需要前两步就可以判断端口开放)
·端口关闭:(1)Client发送SYN;(2)Server端回复RST(表示端口关闭)
优点:SYN扫描要比TCP Connect()扫描隐蔽一些,SYN仅仅需要发送初始的SYN数据包给目标主机,如果端口开放,则相应SYN-ACK数据包;如果关闭,则响应RST数据包;
3、NULL扫描
反向扫描—-原理是将一个没有设置任何标志位的数据包发送给TCP端口,在正常的通信中至少要设置一个标志位,根据FRC 793的要求,在端口关闭的情况下,若收到一个没有设置标志位的数据字段,那么主机应该舍弃这个分段,并发送一个RST数据包,否则不会响应发起扫描的客户端计算机。也就是说,如果TCP端口处于关闭则响应一个RST数据包,若处于开放则无相应。但是应该知道理由NULL扫描要求所有的主机都符合RFC 793规定,但是windows系统主机不遵从RFC 793标准,且只要收到没有设置任何标志位的数据包时,不管端口是处于开放还是关闭都响应一个RST数据包。但是基于Unix(*nix,如Linux)遵从RFC 793标准,所以可以用NULL扫描。 经过上面的分析,我们知道NULL可以辨别某台主机运行的操作系统是什么操作系统。
端口开放:Client发送Null,server没有响应
端口关闭:(1)Client发送NUll;(2)Server回复RST
说明:Null扫描和前面的TCP Connect()和SYN的判断条件正好相反。在前两种扫描中,有响应数据包的表示端口开放,但在NUll扫描中,收到响应数据包表示端口关闭。反向扫描比前两种隐蔽性高些,当精确度也相对低一些。
用途:判断是否为Windows系统还是Linux。
4、FIN扫描
与NULL有点类似,只是FIN为指示TCP会话结束,在FIN扫描中一个设置了FIN位的数据包被发送后,若响应RST数据包,则表示端口关闭,没有响应则表示开放。此类扫描同样不能准确判断windows系统上端口开发情况。
·端口开放:发送FIN,没有响应
·端口关闭:(1)发送FIN;(2)回复RST
5、ACK扫描
扫描主机向目标主机发送ACK数据包。根据返回的RST数据包有两种方法可以得到端口的信息。方法一是: 若返回的RST数据包的TTL值小于或等于64,则端口开放,反之端口关闭。
6、Xmas-Tree扫描
通过发送带有下列标志位的tcp数据包。
·URG:指示数据时紧急数据,应立即处理。
·PSH:强制将数据压入缓冲区。
·FIN:在结束TCP会话时使用。
正常情况下,三个标志位不能被同时设置,但在此种扫描中可以用来判断哪些端口关闭还是开放,与上面的反向扫描情况相同,依然不能判断windows平台上的端口。
·端口开放:发送URG/PSH/FIN,没有响应
·端口关闭:(1)发送URG/PSH/FIN,没有响应;(2)响应RST
XMAS扫描原理和NULL扫描的类似,将TCP数据包中的ACK、FIN、RST、SYN、URG、PSH标志位置1后发送给目标主机。在目标端口开放的情况下,目标主机将不返回任何信息。
7、Dump扫描
也被称为Idle扫描或反向扫描,在扫描主机时应用了第三方僵尸计算机扫描。由僵尸主机向目标主机发送SYN包。目标主机端口开发时回应SYN|ACK,关闭时返回RST,僵尸主机对SYN|ACK回应RST,对RST不做回应。从僵尸主机上进行扫描时,进行的是一个从本地计算机到僵尸主机的、连续的ping操作。查看僵尸主机返回的Echo响应的ID字段,能确定目标主机上哪些端口是开放的还是关闭的。
二、Python 代码实现
1、利用Python的Socket包中的connect方法,直接对目标IP和端口进行连接并且尝试返回结果,而无需自己构建SYN包。
2、对IP端口进行多线程扫描,注意的是不同的电脑不同的CPU每次最多创建的线程是不一样的,如果创建过多可能会报错,需要根据自己电脑情况修改每次扫描的个数或者将seelp的时间加长都可以。
看完了吗?感觉动手操作一下把!
python学习网,免费的在线学习python平台,欢迎关注!
本文转自:https://www.jianshu.com/p/243bb7cfc40f
7. python 爬虫 ip池怎么做
无论是爬取IP,都能在本地设计动态代理IP池。这样既方便使用,又可以提升工作效率。那么怎么在本地设计一个代理IP池呢?IPIDEA为大家简述本地代理IP池的设计和日常维护。
代理IP获取接口,如果是普通代理IP,使用ProxyGetter接口,从代理源网站抓取最新代理IP;如果是需耗费代理IP,一般都有提供获取IP的API,会有一定的限制,比如每次提取多少个,提取间隔多少秒。
代理IP数据库,用以存放在动态VPS上获取到的代理IP,建议选择SSDB。SSDB的性能很突出,与Redis基本相当了,Redis是内存型,容量问题是弱项,并且内存成本太高,SSDB针对这个弱点,使用硬盘存储,使用Google高性能的存储引擎LevelDB,适合大数据量处理并把性能优化到Redis级别。
代理IP检验计划,代理IP具备时效性,过有效期就会失效,因此 需要去检验有效性。设置一个定时检验计划,检验代理IP有效性,删除无效IP、高延时IP,同时预警,当IP池里的IP少于某个阈值时,根据代理IP获取接口获取新的IP。
代理IP池外部接口除代理拨号服务器获取的代理IP池,还需要设计一个外部接口,通过这个接口调用IP池里的IP给爬虫使用。代理IP池功能比较简单,使用Flask就可以搞定。功能可以是给爬虫提供get/delete/refresh等接口,方便爬虫直接使用。
8. 如何用python实现访问外网
你的题目要详细一些,具体要干什么。例如利用python进行IP地址端口扫描等等
9. python怎样获取连接的IP的设备信息
以前是有这样的工具,它会通过常用协议去刺探设备类型。比如windows的版本,计算机名等。现在不知道还有没有这样的工具,搜索一下看。
哦。这个应该相当容易了。因为相机是专业设备。所以通常会有一个控制协议。因为是专业的,所以这个socket应该是加密的。 你只需要连接上后,随便发一个命令,如果被断开。很可能就是这个相机了。
另外相机通常都是有MAC地址的。如果你发现它在你预计的MAC地址范围内,也可以知道是它。 相机是专业抓拍的。通常不会放在互联网上,应该是局域网。你可以排除局域网上的其它计算机,自然了也就知道哪些是相机了。
这些都不是难题。你首先扫描所有的IP地址。再扫描它们的端口数量。如果端口数量多通常是计算机,如果端口只有1-2个就是专业设备。扫描不到的,应该就是计算机啦。
试试,并不难。
10. python查询公网IP地址、IP地理位置
利用Python查询本机公网的IP地址、以及查询IP的地理位置,使用简单的爬虫实现其功能。