nmap地址段下的ip_安服福音——花式nmap扫描整理结果(文末重磅消息)
0x01應用背景
安全服務的工作,日常掃掃掃、日常的工作一次性讓人掃描多個網段,經驗充足的老師傅會使用xml轉excel,但是新入門的安服小伙伴們,是否也經歷過一段手工一個個整理的時期呢,我是的。后來,隨著需求的復雜化,輸出的形式也各種各樣,不得不使整個過程自動化,不然真的會做到我是誰我在哪我在做什么,所以本文我用以下三種場景,由最初簡單的需求到最終復雜化的,step by step教大家如何將python和安服結合在一起,為自己節省更多的時間和體力,并投入時間到學習中,有效地增值自己。
需求1為掃描地址211.191.233.175的21,22,23,25,443,80,8080是否開放,按ip地址-端口-狀態-服務整理成excel。
需求2為掃描地址A部門211.191.233.0-211.191.235.0和B部門21.1.1.0-21.1.3.0兩個地址段(實際有100多個部門,平均每個部門有十來個地址段)的21,22,23,25,443,80,8080是否開放,按每個部門整理成一個excel(也就是要整理100多個excel,手工做真的夭壽了)格式是ip地址-端口-狀態-服務。
需求3為excel里面已經給出了各單位部門和起始的IP和終止的IP,需要掃描excel所有地址段,(實際有100多個部門,平均每個部門有十來個地址段)的21,22,23,25,443,80,8080是否開放,按每個部門整理成一個excel,大概要整理100多次,一次7個端口
0x02 文章結構簡介
掃描需求與nmap參數
前言
需求1介紹與應用腳本編寫
需求2介紹與應用腳本編寫
需求3介紹與應用腳本編寫
延伸—掃描效率優化
0x03掃描需求與nmap參數
前言:
本文相關的ip地址已經替換過個別數字進行脫敏處理,所以本文中出現過的ip不合理或者掃不到也是正常的。
在很久以前我還是一個滲透實習生,那時候還需要兼做挺多一些安全服務的工作,做下掃描、整理下報告。第一次的時候任務是這樣的,需要我一次性掃描十幾個ip地址段然后整理成 ip地址-端口-狀態-服務 格式一一對應地用excel整理出來。這個第一次做的時候我真的手工一個一個去整理出來,手工做了整整一天。
附版式圖(已替換個別數字脫敏)
后來學會了python,一秒出結果了。
現成的工具網上有一個xml轉xls,但是在長期的掃描過程這種方式不算很方便。
如果我掃描命令是nmap -n -Pn -v 8.8.8.8 >result.txt ?輸出將會重定向到一個txt文件,掃描到一半的時候還可以打開txt來看掃描的進度等等。本文就是基于輸出重定向的結果進行結果處理。
前期準備
1.地址段需要準確,比如要掃192.168.1.0到192.168.2.255;需要整理成192.168.1-2.0-255這種格式,(excel直接復制下來可能會出現"和空格個別有些未換行,需要檢查整理替換一下)
2.nmap.exe添加到環境變量
3.python2.74.python安裝模塊xlwt(pip install?xlwt)?
5.運行時命令:python pl-nmscan.py +?地址段txt的所在文件夾路徑
需求1:
需求為掃描地址211.191.233.175的21,22,23,25,443,80,8080是否開放,按ip地址-端口-狀態-服務整理成excel。
由需求得知,需要知道指定端口是否開放即可了。所以對應掃描參數如下:
nmap-n -Pn -p 21,22,23,25,443,80,8080 211.191.233.175 >result.txt
-n是不做地址解析
-Pn是繞過防火墻探測端口(結果更準確一點)
-p是指定端口
>result.txt是指定輸出的文件和路徑
掃描的結果大致如下
使用(下章節我會附上代碼)工具后,會在當前目錄下輸出一個excel。
命令是:pythonF:\cybersec\poc\Selftools\myPythontools\nmapScan.pyC:\Users\lenovo\Desktop\result.txt
輸出結果是這樣的:(ip已替換數字脫敏處理)
所以可以發現上面txt中端口是開放的地址,都被輸出到這個excel里面。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# made by 3s_NwGeekimport xlwt,re,sys,osclass FILE:def __init__(self, FILEPATH):self.filepath=FILEPATH?????????????????????????????? #文件完整路徑self.filename = (FILEPATH.split("\\")[-1])?????????# 有后綴文件名self.dirpath = FILEPATH.replace(self.filename,"")? # 文件所在文件夾路徑self.filename_noformat = self.filename.split(".")[0]? # 無后綴文件名self.fileformat = "." + self.filename.split(".")[-1]? # 文件名后綴def rename(self,NEWNAME):
??????? newname = self.dirpath + NEWNAME + self.fileformat? #文件重命名新路經os.rename(self.filepath,newname)def copy(self,targpath):
??????? os.system("copy %s %s" % (self.filepath, targpath))if __name__ == '__main__':print "usage:nmapScan.pyC:\\Users\\PortResult.txt"f=FILE(sys.argv[1])
??? items=open(sys.argv[1],"r+").read().splitlines()?#讀取txt
??? line=0file = xlwt.Workbook(encoding = 'utf-8')
??? table = file.add_sheet('NmapResult')
??? table.col(0).width=220*20vaule=['ip地址','端口','狀態','協議']? #寫入excel首行for columnin range(0,len(vaule)):
??????? table.write(0,column, vaule[column])for item in items:?????????????????????? #每行往下讀取掃描結果if "Nmap" in item :
??????????????? ip=item.replace("Nmap scan report for ","")#獲取ipif "open" in item :??????????????????????????? #獲取ip對應的端口if "Discovered" not in item:
??????????????? result=ip+" "+item
??????????????? line=line+1vaule= re.sub(r"\s{2,}","",result).split(" ")#nmap掃描結果bug有時候會有多個空格,使用正則多個空格替換成一個for column in range(0,4):???? #寫入結果
???????????????????table.write(line,column,vaule[column])
??? p=f.dirpath+'NmapReport.xls'file.save(p)
使用方法如下
usage:nmapScan.py C:\\Users\\PortResult.txt
需求2:
需求為掃描地址A部門211.191.233.0-211.191.235.0和B部門21.1.1.0-21.1.3.0兩個地址段(實際有50多個部門,每個部門有十來個地址段)的21,22,23,25,443,80,8080是否開放,按每個部門整理成一個excel(也就是要整理50多個excel,手工做真的夭壽了)格式是ip地址-端口-狀態-服務。
由需求得知,需要知道指定地址段中的ip端口是否開放即可了。所以對應掃描參數如下:
每個部門的掃描參數命令是:
nmap -n -Pn -iL A單位.txt -p 21,22,23,25,443,80,8080? >A單位result.txt
-iL是按每行讀取字典作為掃描目標
因為涉及多個地址段,所以需要把資產地址段保存為txt文件進行讀取,而且有規定的格式。所以ip地址段的格式比如說是這樣的211.191.233.0-211.191.235.0這樣nmap不能識別,所以正確寫法要改成這樣的211.191.233-235.0-255
然后使用python用個for循環調用nmap每個單位掃一次就可以了,再使用需求1的腳本循環輸出即可。
掃描前的準備txt
腳本運行如下圖:
Python nmap_scan_pl.py 所有txt文件所在的文件夾路徑
輸出結果有多個excel,一個部門一個excel,每個都是這樣的(ip已脫敏)
使用python編寫腳本如下
#!/usr/bin/python# -*- coding: UTF-8 -*-
# made by 3s_NwGeekimport xlwt,re,glob,os,sysclass FILE:def __init__(self, FILEPATH):self.filepath=FILEPATH?????????????????????????????? #文件完整路徑self.filename = (FILEPATH.split("\\")[-1])????????? # 有后綴文件名self.dirpath = FILEPATH.replace(self.filename, "")? # 文件所在文件夾路徑def main(paths):
??? f=FILE(paths)
??? items=open(paths,"r+").read().splitlines()# items=open("C:\Users\lenovo\Desktop\\1.txt","r+").read().splitlines()line=0file = xlwt.Workbook(encoding = 'utf-8')? # 注意這里的Workbook首字母是大寫table = file.add_sheet('NmapResult') #新建一個sheettable.col(0).width=220*20vaule=['ip地址','端口','狀態','協議號']for column in range(0, 4):
??????? table.write(line, column, vaule[column])for item in items:if "Nmap" in item :if "Discovered" not in item:
??????????????? ip=item.replace("Nmap scan report for ","")if "open" in item :if "Discovered" not in item:
??????????????? result=ip+" "+item
??????????????? line=line+1vaule= re.sub(r"\s{2,}"," ",result).split(" ")for column in range(0,6):try:
??????????????????????? table.write(line,column,vaule[column])except:passsavepath = path + '\\scan_result'try:
??????? os.mkdir(savepath)except:passfile.save(r'%s.xls'%(savepath+'\\'+f.filename_noformat))print "done"def cmdgen (paths):#命令生成cmd=[]
??? savepath=path+'\\nmap_result'try:
??????? os.mkdir(savepath)except:pass
??? for filepath in glob.glob(paths):#讀取所有資產準備生成命令.txtf=FILE(filepath)
?? ?????cmd.append('nmap -v -n -Pn -p 80,8080,443 -iL %s > %s'%(f.filepath,savepath+'\\'+f.filename))#生成命令數組return cmddef excute(cmd):??? #調用nmap函數for c in cmd:print 'scaning :%s\nwait..'%c
??????? res = str(os.popen(c).read())?? #讀取回顯print resdef resoutput():
??? nmap_resultpath=path+'\\nmap_result\*.txt'for filepath in glob.glob(nmap_resultpath):#讀取所有掃描結果main(filepath)#輸出if __name__ == '__main__':if len(sys.argv) <2:
??????? usage = "\n####################################\nusage: python nmap_Scans_output.py C:\\\\Desktop\\dir\\\n文件夾是掃描的地址段\n####################################"print usage
??????? sys.exit()
??? path=sys.argv[1]
??? tpath=path+'\*.txt' #拼接掃描路徑cmd=cmdgen(tpath)#生成掃描命令參數
??? excute(cmd)?? #調用nmap掃描
??? resoutput()?? #輸出nmap結果
需求3:
需求為excel里面已經給出了單位部門和起始的IP和終止的IP,需要掃描excel所有地址段,(這次實際有100多個部門,每個部門有十來個地址段)的21,22,23,25,443,80,8080是否開放,按每個部門整理成一個excel,也是一個很要命的需求了如果手工做的話。(IP已做替換數字脫敏處理,所以出現了255以上的數字)
我是這樣處理的,先把每行excel讀取下來,處理成一數組,然后數組的第二第三位是起始和終止ip,整理為nmap掃描的格式,然后每個部門分類生成一個掃描的txt,使用python用for循環調用nmap去掃描生成txt的結果,然后使用需求1的腳本去生成掃描結果excel。最終實現從運行腳本到掃描最后輸出結果,一鍵完成。
結果生成100多個端口掃描結果的excel。
是在2基礎上增加個讀取excel整理成多個txt。讀取excel并整理成nmap掃描格式代碼如下,新增了一個函數,其余的跟需求2一樣,就不冗余粘貼了,貼出了新增函數的代碼。
不過值得注意的是:
按之前給出來的nmap格式掃描會出現問題,比如說要掃192.1.1.20到192.1.2.21的地址。如果拼接成192.1.1-2.20-21,那么nmap掃描的就只有4個地址:
分別是192.1.1.20、192.1.1.21、192.1.2.20、192.1.2.21
所以以下代碼已經做好了調整,自動生成為
192.1.1.20-255
192.1.2.0-21
所以使用本函數是可以正常進行掃描的
defip_xls(filename):??? data = xlrd.open_workbook(filename)
??? table = data.sheets()[0]
??? nrows = table.nrows? # 獲取該sheet中的有效行數ncols = table.ncols? # 獲取列表的有效列數for? num in range(1, nrows):?? #循環次數row = table.row_values(num)# print rowstart_ip=row[2].encode("unicode_escape").replace(' ','').split('.')
??????? stop_ip = row[3].encode("unicode_escape").replace(' ','').split('.')
??????? c_start_ip=start_ip[2]
??????? d_start_ip=start_ip[3]
??????? c_stop_ip=stop_ip[2]
??????? d_stop_ip=stop_ip[3].replace('\n','')
??????? department=row[1]+row[5].replace('\n','')
??????? f = codecs.open('%s.txt' % (path+'\\'+department), 'a','utf-8')if start_ip[0] == stop_ip[0] and start_ip[1] ==stop_ip[1] and c_start_ip == c_stop_ip:????? #192.168.1.0-99if? int(d_start_ip) <= int(d_stop_ip) :
??????????????? nmapip = (start_ip[0]+'.'+start_ip[1]+'.'+c_start_ip+'.'+d_start_ip+'-'+d_stop_ip).replace('\\n','')
??????????????? output= nmapip.replace('\n','')
??????????????? f.write(output+'\n')elif start_ip[0] == stop_ip[0] and start_ip[1] ==stop_ip[1] and int(c_start_ip) <int(c_stop_ip):??? ##192.168.1-3.0-99if int(c_stop_ip)-int(c_start_ip)>1:
??????????????? nmapip = start_ip[0]+'.'+start_ip[1]+'.'+c_start_ip+'.'+d_start_ip+'-'+'254'??????? ##192.168.1.9-255output= nmapip.replace('\n','')
??????????????? f.write(output+'\n')
??????????????? nmapip = (start_ip[0] + '.' + start_ip[1] +'.' + str(int(c_start_ip) + 1) + '-' +str(int(c_stop_ip) - 1) +'.' + '1' + '-' + '254').replace('--','-') ##192.168.2.0-255output= nmapip.replace('\n','')
??????????????? f.write(output+'\n')
??????????????? nmapip = start_ip[0]+'.'+start_ip[1]+'.'+c_stop_ip+'.'+'0'+'-'+d_stop_ip??????????? ##192.168.3.0-99output= nmapip.replace('\n','')
??????????????? f.write(output+'\n')else:print '\n\nerror for start_ip:%s - stop_ip:%s'%(row[2],row[3])print '\n\n IP format success!!\n\nbegin scanning:'
輸出多個結果:
每個部門輸出格式:
0x04延伸—掃描效率優化
經過長期掃描經驗總結,個人覺得有多個可以提高掃描效率的地方。所以寫了個掃描器進行端口掃描。
我一般進行nmap掃描的參數是這樣的:
nmap -v -Pn -n -p21,22,23,3389,161,443,445,3306,1521,5901,1143,5900,80,7001,8000-8080,2181,111,11211--max-retries 2 --initial-rtt-timeout 5 ?--min-hostgroup50 --min-parallelism 50 -iL target.txt >PortResult.txt
但是我覺得nmap已經滿足不了我的效率要求了,就算加了以上幾個參數。
因為長期比較多需求是做全端口的掃描,會發現nmap的全端口掃描實在是太慢了,有一次任務掃800多個ip的全端口,整整掃了一個月才掃完,因為nmap多了比較多的判斷,不只是在單純地判斷端口是否開放。所以,python可以幫到你,使用socket快速判斷端口是否開放。
個人覺得可以從多方面進行優化
使用有線網絡的時候超時時間可以縮短到5秒,無線的話需要10秒才能比較準確。
多線程與多協程
邏輯上的優化,比較少的服務器是單單開放20000端口到30000端口以上的。所以我們可以從端口1掃到20000端口然后判斷是否有開放的端口,沒有開放的端口就不繼續掃下去,有開放的端口繼續掃下去,那么可以算出來,使用了這個邏輯判斷就可以提高了35535/65535也就是提升大概二分之一的效率了,如果覺得20000個端口不夠保險,那可以改成30000或者到40000,再繼續掃,那也提高了很可觀的效率。
最后:重磅消息,我們字節脈搏為了上線與眾位大佬交流,積極準備了上千份禮物,將于兩周內開始舉辦活動,具體時間呢還未定,因為某一些獎品還沒到,請大家敬請期待,同時掃一下關注我們吧!第一時間參加活動
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的nmap地址段下的ip_安服福音——花式nmap扫描整理结果(文末重磅消息)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本字符分析python_Python实
- 下一篇: element ui input视图没刷