分享一個(gè)可以生成各種進(jìn)制格式IP的小工具實(shí)例代碼
前言
在開始本文之前,先來介紹一下相關(guān)內(nèi)容,大家都知道一些防護(hù)SSRF漏洞的代碼一般使用正則來判斷訪問IP是否為內(nèi)部IP,比如下面這段網(wǎng)上比較常見的正則:
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")
很明顯這個(gè)正則有很多問題,可以有多種方式繞過,比如
1. 利用八進(jìn)制IP地址繞過
2. 利用十六進(jìn)制IP地址繞過
3. 利用十進(jìn)制的IP地址繞過
4. 各種進(jìn)制組合形成的IP繞過
一般我們常見都是10進(jìn)制表示的IP,其實(shí)系統(tǒng)是可以識(shí)別其他進(jìn)制表示的IP,比如8進(jìn)制,16進(jìn)制,或者它們的組合,更多詳情可以參考:總結(jié)一些你可能不知道的ip地址
所以,我們?cè)跍y(cè)試系統(tǒng)是否有SSRF漏洞的時(shí)候,有時(shí)候需要嘗試各種進(jìn)制的IP組合,看看是否能繞過系統(tǒng)的防護(hù),于是就有了本文的這個(gè)小程序,用于自動(dòng)生成各種進(jìn)制形式的IP,以幫助我們進(jìn)行安全測(cè)試,下面話不多說了,來一起看看詳細(xì)的介紹:
實(shí)例源碼
程序代碼
#!/usr/bin/env python # -*- coding:utf8 -*- """ 各種進(jìn)制的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進(jìn)制表示的IP、純16進(jìn)制表示的IP,然后在分別生成10進(jìn)制和8進(jìn)制混合組成的IP,16進(jìn)制和10進(jìn)制混合組成的IP, 16進(jìn)制8進(jìn)制10進(jìn)制混合組成的IP,最后輸出各種組合的結(jié)果
在使用其他腳本或者工具遍歷測(cè)試這個(gè)腳本的結(jié)果,看看是否能繞過SSRF的防護(hù)
部分截圖:
比如生成10.1.100.1 這個(gè)IP的其他各種進(jìn)制形式:
總結(jié)
工具雖然簡單,但卻能給我們的滲透測(cè)試帶來方便,其實(shí)工作中有很多可以總結(jié)沉淀的地方,都可以形成工具化,不僅能方便以后工作,還能有助于我們知識(shí)的沉淀,加快我們自身實(shí)力提升。也希望大家以后也能多多分享。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python tkinter GUI繪制,以及點(diǎn)擊更新顯示圖片代碼
這篇文章主要介紹了python tkinter GUI繪制,以及點(diǎn)擊更新顯示圖片代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03python 數(shù)據(jù)類(dataclass)的具體使用
本文主要介紹了python 數(shù)據(jù)類(dataclass)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python辦公自動(dòng)化之操控遠(yuǎn)程桌面和文件版本控制
這篇文章主要為大家詳細(xì)介紹了Python辦公自動(dòng)化中操控遠(yuǎn)程桌面和文件版本控制的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-01-01python 獲取sqlite3數(shù)據(jù)庫的表名和表字段名的實(shí)例
今天小編就為大家分享一篇python 獲取sqlite3數(shù)據(jù)庫的表名和表字段名的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python實(shí)現(xiàn)圖像壓縮和圖像處理詳解
隨著現(xiàn)在短視頻類越來越火,隨之而來的就是大量的視頻圖像的處理。這篇文章主要為大家介紹了Python如何一鍵實(shí)現(xiàn)圖像壓縮和圖像處理,希望對(duì)你們有所幫助2022-07-07Keras:Unet網(wǎng)絡(luò)實(shí)現(xiàn)多類語義分割方式
本文主要利用U-Net網(wǎng)絡(luò)結(jié)構(gòu)實(shí)現(xiàn)了多類的語義分割,并展示了部分測(cè)試效果,希望對(duì)你有用!2020-06-06基于Python實(shí)現(xiàn)文件的壓縮與解壓縮
在日常工作中,除了會(huì)涉及到使用Python處理文本文件,有時(shí)候還會(huì)涉及對(duì)壓縮文件的處理。本文為大家總結(jié)了利用Python可以實(shí)現(xiàn)的幾種文件壓縮與解壓縮實(shí)現(xiàn)代碼,需要的可以參考一下2022-03-03Python?asyncore?socket客戶端開發(fā)基本使用教程
asyncore庫是python的一個(gè)標(biāo)準(zhǔn)庫,提供了以異步的方式寫入套接字服務(wù)的客戶端和服務(wù)器的基礎(chǔ)結(jié)構(gòu),這篇文章主要介紹了Python?asyncore?socket客戶端開發(fā)基本使用,需要的朋友可以參考下2022-12-12