分享一个可以生成各种进制格式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程序代码的几种方法总结
Apr 28 Python
python版本单链表实现代码
Sep 28 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
python3中rank函数的用法
Nov 27 Python
python3 实现调用串口功能
Dec 26 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
Python实现简单的猜单词小游戏
Oct 28 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 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
Yii2框架使用计划任务的方法
2016/05/25 PHP
PDO::errorCode讲解
2019/01/28 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
用python实现刷点击率的示例代码
2019/02/21 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Python异常处理机制结构实例解析
2020/07/23 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
Why do we need Unit test
2013/01/03 面试题
商业街策划方案
2014/05/31 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
销售人员求职信
2014/07/22 职场文书
刑事附带民事代理词
2015/05/25 职场文书
大学生入党自传2015
2015/06/26 职场文书
转变工作作风心得体会
2016/01/23 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python