国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

分享一個可以生成各種進制格式IP的小工具實例代碼

2020-01-04 17:05:16
字體:
來源:轉載
供稿:網友

前言

在開始本文之前,先來介紹一下相關內容,大家都知道一些防護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 socketimport structimport itertoolsdef 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_resultdef 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_resultdef 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_resultdef 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_resultdef 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_resultif __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地址轉16進制工具,ip地址二進制轉換工具,ip地址格式轉換工具

ip地址轉16進制工具,ip地址二進制轉換工具,ip地址格式轉換工具

總結

工具雖然簡單,但卻能給我們的滲透測試帶來方便,其實工作中有很多可以總結沉淀的地方,都可以形成工具化,不僅能方便以后工作,還能有助于我們知識的沉淀,加快我們自身實力提升。也希望大家以后也能多多分享。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大厂| 通海县| 南阳市| 临澧县| 津南区| 昌江| 江油市| 乡宁县| 桦川县| 乌兰浩特市| 莱州市| 阜康市| 锦州市| 宜兴市| 金寨县| 栾城县| 湟源县| 新兴县| 茌平县| 河北区| 鹤山市| 昌都县| 枞阳县| 汝城县| 鹿邑县| 彭泽县| 石楼县| 黄大仙区| 黑龙江省| 陈巴尔虎旗| 凌云县| 和田市| 大埔县| 绥化市| 郎溪县| 明星| 通山县| 洞头县| 东乡县| 郸城县| 汾西县|