分享一个可以生成各种进制格式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 相关文章推荐
使用setup.py安装python包和卸载python包的方法
Nov 27 Python
用map函数来完成Python并行任务的简单示例
Apr 02 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
Python中编写ORM框架的入门指引
Apr 29 Python
Python学习小技巧之列表项的排序
May 20 Python
Python使用numpy实现BP神经网络
Mar 10 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
Flask-Mail用法实例分析
Jul 21 Python
Flask框架工厂函数用法实例分析
May 25 Python
python pandas写入excel文件的方法示例
Jun 25 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
python输出数学符号实例
May 11 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防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python