分享一个可以生成各种进制格式IP的小工具实例代码


Posted in Python onJuly 28, 2017

前言

在开始本文之前,先来介绍一下相关内容,大家都知道一些防护SSRF漏洞的代码一般使用正则来判断访问IP是否为内部IP,比如下面这段网上比较常见的正则:

if re.match(r"^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$", ip_address) or \
 
 re.match(r"^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$", ip_address) or \
 re.match(r"^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$", ip_address):
 raise Execption("inner ip")

很明显这个正则有很多问题,可以有多种方式绕过,比如

      1. 利用八进制IP地址绕过

      2. 利用十六进制IP地址绕过

      3. 利用十进制的IP地址绕过

      4. 各种进制组合形成的IP绕过

一般我们常见都是10进制表示的IP,其实系统是可以识别其他进制表示的IP,比如8进制,16进制,或者它们的组合,更多详情可以参考:总结一些你可能不知道的ip地址

所以,我们在测试系统是否有SSRF漏洞的时候,有时候需要尝试各种进制的IP组合,看看是否能绕过系统的防护,于是就有了本文的这个小程序,用于自动生成各种进制形式的IP,以帮助我们进行安全测试,下面话不多说了,来一起看看详细的介绍:

实例源码

程序代码

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""
各种进制的IP表示及其它们的组合
"""
import socket
import struct
import itertools
def ip_split_by_comma_oct(ip):
 """
 :param ip:
 :return:
 """
 parsed_result = set()
 ip_split = str(ip).split('.')
 ip_split_oct = [oct(int(_)) for _ in ip_split]
 parsed_result.add('.'.join(ip_split_oct))
 return parsed_result
def ip_split_by_comma_hex(ip):
 """
 :param ip:
 :return:
 """
 parsed_result = set()
 ip_split = str(ip).split('.')
 ip_split_hex = [hex(int(_)) for _ in ip_split]
 parsed_result.add('.'.join(ip_split_hex))
 return parsed_result
def combination_oct_int_ip(ip):
 """
 :param ip:
 :return:
 """
 result = set()
 parsed_result = set()
 ip_split = str(ip).split('.')
 oct_2 = list(itertools.combinations([0, 1, 2, 3], 2))
 oct_3 = list(itertools.combinations([0, 1, 2, 3], 3))
 for n, _ in enumerate(ip_split):
 _tmp = oct(int(_))
 _delete = ip_split[:n] + ip_split[n+1:]
 _delete.insert(n, _tmp)
 result.add(tuple(_delete))
 for _ in oct_2:
 _tmp_ip = ip_split[:]
 _tmp1 = oct(int(ip_split[_[0]]))
 _tmp2 = oct(int(ip_split[_[1]]))
 del _tmp_ip[_[0]]
 del _tmp_ip[_[1] - 1]
 _tmp_ip.insert(_[0], _tmp1)
 _tmp_ip.insert(_[1], _tmp2)
 result.add(tuple(_tmp_ip))
 for _ in oct_3:
 _tmp_ip = ip_split[:]
 _tmp1 = oct(int(ip_split[_[0]]))
 _tmp2 = oct(int(ip_split[_[1]]))
 _tmp3 = oct(int(ip_split[_[2]]))
 del _tmp_ip[_[0]]
 del _tmp_ip[_[1] - 1]
 del _tmp_ip[_[2] - 2]
 _tmp_ip.insert(_[0], _tmp1)
 _tmp_ip.insert(_[1], _tmp2)
 _tmp_ip.insert(_[2], _tmp3)
 result.add(tuple(_tmp_ip))
 for _ in result:
 parsed_result.add('.'.join(_))
 return parsed_result
def combination_hex_int_ip(ip):
 """
 :param ip:
 :return:
 """
 result = set()
 parsed_result = set()
 ip_split = str(ip).split('.')
 hex_2 = list(itertools.combinations([0, 1, 2, 3], 2))
 hex_3 = list(itertools.combinations([0, 1, 2, 3], 3))
 for n, _ in enumerate(ip_split):
 _tmp = hex(int(_))
 _delete = ip_split[:n] + ip_split[n+1:]
 _delete.insert(n, _tmp)
 result.add(tuple(_delete))
 for _ in hex_2:
 _tmp_ip = ip_split[:]
 _tmp1 = hex(int(ip_split[_[0]]))
 _tmp2 = hex(int(ip_split[_[1]]))
 del _tmp_ip[_[0]]
 del _tmp_ip[_[1] - 1]
 _tmp_ip.insert(_[0], _tmp1)
 _tmp_ip.insert(_[1], _tmp2)
 result.add(tuple(_tmp_ip))
 for _ in hex_3:
 _tmp_ip = ip_split[:]
 _tmp1 = hex(int(ip_split[_[0]]))
 _tmp2 = hex(int(ip_split[_[1]]))
 _tmp3 = hex(int(ip_split[_[2]]))
 del _tmp_ip[_[0]]
 del _tmp_ip[_[1] - 1]
 del _tmp_ip[_[2] - 2]
 _tmp_ip.insert(_[0], _tmp1)
 _tmp_ip.insert(_[1], _tmp2)
 _tmp_ip.insert(_[2], _tmp3)
 result.add(tuple(_tmp_ip))
 for _ in result:
 parsed_result.add('.'.join(_))
 return parsed_result
def combination_hex_int_oct_ip(ip):
 """
 :param ip:
 :return:
 """
 result = set()
 parsed_result = set()
 ip_split = str(ip).split('.')
 hex_3 = list(itertools.combinations([0, 1, 2, 3], 3))
 for n1, n2, n3 in hex_3:
 _tmp_ip = ip_split[:]
 _tmp_2 = oct(int(_tmp_ip[n2]))
 _tmp_3 = hex(int(_tmp_ip[n3]))
 del _tmp_ip[n2]
 del _tmp_ip[n3 - 1]
 _tmp_ip.insert(n2, _tmp_2)
 _tmp_ip.insert(n3, _tmp_3)
 result.add(tuple(_tmp_ip))
 for _ in result:
 parsed_result.add('.'.join(_))
 return parsed_result
if __name__ == '__main__':
 ip = '10.1.100.1'
 ip_int = struct.unpack('!L', socket.inet_aton(ip))[0]
 ip_oct_no_comma = oct(ip_int)
 ip_hex_no_comma = hex(ip_int)
 ip_oct_by_comma = ip_split_by_comma_oct(ip)
 ip_hex_by_comma = ip_split_by_comma_hex(ip)
 all_result = ip_oct_by_comma | ip_hex_by_comma | combination_oct_int_ip(ip) | combination_hex_int_ip(ip) | combination_hex_int_oct_ip(ip)
 for _ip in all_result:
 print _ip

代码很容易看懂,首先生成纯8进制表示的IP、纯16进制表示的IP,然后在分别生成10进制和8进制混合组成的IP,16进制和10进制混合组成的IP, 16进制8进制10进制混合组成的IP,最后输出各种组合的结果

在使用其他脚本或者工具遍历测试这个脚本的结果,看看是否能绕过SSRF的防护

部分截图:

比如生成10.1.100.1 这个IP的其他各种进制形式:

分享一个可以生成各种进制格式IP的小工具实例代码

分享一个可以生成各种进制格式IP的小工具实例代码

总结

工具虽然简单,但却能给我们的渗透测试带来方便,其实工作中有很多可以总结沉淀的地方,都可以形成工具化,不仅能方便以后工作,还能有助于我们知识的沉淀,加快我们自身实力提升。也希望大家以后也能多多分享。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中index()和seek()的用法(详解)
Apr 27 Python
Django中使用Celery的方法示例
Nov 29 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
Python编写打字训练小程序
Sep 26 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
python3将变量写入SQL语句的实现方式
Mar 02 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
七个非常实用的Python工具包总结
Jun 15 Python
Python使用sorted排序的方法小结
Jul 28 #Python
python发送邮件实例分享
Jul 28 #Python
Python分治法定义与应用实例详解
Jul 28 #Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 #Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 #Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 #Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 #Python
You might like
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
js导出txt示例代码
2014/01/14 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
js简易版购物车功能
2017/06/17 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Python实现微信机器人的方法
2019/09/06 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
python实现取余操作的简单实例
2020/08/16 Python
python 制作网站小说下载器
2021/02/20 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
教学质量评估实施方案
2014/03/17 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
初中英语教学反思范文
2016/02/15 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
golang import自定义包方式
2021/04/29 Golang
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python