程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

DAY10:Python-nmap模塊學習及 socket 模塊編寫簡單腳本

編輯:Python

DAY10:Python-nmap及 socket 模塊編寫簡單腳本

1、Nmap 四大功能:

主機發現
端口掃描
服務版本偵測
操作系統偵測

2、基本掃描策略

2.1、無任何附加參數

分情況:如果是超級用戶,無參數掃描等價於 sS 參數掃描(SYN,半連接否則,無參數掃描等價於 sT 參數掃描(TCP,完整連接)

nmap xxx.xxx.x.x

2.2、冗余

按照基本法,v 參數通常表示冗余。我們使用兩個 v 參數表示將偵測過程原原本本的打印輸出出來。

nmap -vv xxx.xxx.x.x

2.3、指定端口號

這裡 p 參數表示端口,標准寫法後面跟的端口號之間沒有空格。但是如果寫一個空格也並無妨。4

nmap -p22 xxx.xxx.x.x
nmap -p 1-200 xxx.xxx.x.1 #-p參數 #規定端口范圍掃描

2.4、操作系統偵測

操作系統偵測有兩個參數選項,其一是參數 O,其二是參數 A,後者乃前者的冗余版本。更多的使用 A 參數,以得到更多的信息。

nmap -O xxx.xxx.x.x
nmap -A xxx.xxx.x.x

2.5、只進行主機發現

主機發現的手段不下幾十種,但是最常用的卻是 sn 參數,它表示 “使用 ping 掃描來偵測存活的主機,而不進行端口掃描”。

[email protected]:~# nmap -sn xxx.xxx.x.x
Nmap scan report for xxx.xxx.x.x
Host is up (0.00034s latency).
MAC Address: xx:xx:xx:xx

2.6、跳過主機發現

有時候對方主機開啟了防火牆(這是很自然的事情),可能過濾掉了你發送的 ICMP 協議數據包,這樣如果想要使用 sn 參數來進行主機發現就不管用了,產生的結果也不可靠。於是你不得不使用 Pn 參數,它假設所有的目標 IP 均為存活,並一個一個主機的進行端口掃描,你懂的這樣會犧牲一些時間作為代價。

nmap -Pn xxx.xxx.x.x

2.7、掃描和版本號偵測

該選項通過偵測開放的端口來判斷開放的服務,並試圖檢測它的版本。雖然 A 選項也能做到,但是要檢測開放的服務版本,sV 一定是最合適的。

nmap -sV xxx.xxx.x.x

2.8、UDP掃描

之前我們的掃描都是針對 TCP 的,而有些服務卻是建立在 UDP 協議上的。比如 NTP(123端口)、SNMP(161端口)等服務,就必須使用 UDP 協議進行掃描。

nmap -sU xxx.xxx.x.x

3、python-nmap

​ 兩個常用類

3.1、PortScanner() 類

實現了一個 nmap 工具的端口掃描功能的封裝

Class PortScanner(object):
def get_nmap_last_output #返回文本輸出(可用於調試)
def nmap_version(self) #檢查nmap的版本信息
def listenscan(self,host='127.0.0.1') #不進行掃描,但解析一個目標主機並返回一個列表
import nmap
nm=nmap.PortScanner()
nm.scan('www.baidu.com','22,80,443,8080','-sV')
def all_hosts(self) #以列表形式返回目標ip
nm.all_hosts()
def command_line(self) #返回輸入的命令行
def scaninfo() #返回nmap掃描信息,格式為字典類型
nmscaninfo()
def scanstats() #以結構體形式返回掃描狀態
def has_host(self,host) #若主機有回應就返回true
nm['14.215.177.38'].all_tcp() #返回掃描TCP協議端口的信息
nm['14.215.177.38'].hostname() #返回域名
nm['14.215.177.38'].state() #返回目標主機狀態
nm['14.215.177.38'].all_protocols() #返回掃描協議

3.2、PortScannerHostDict() 類

實現了存儲與訪問主機的掃描結果

Class PortScannerHostDict(object):
hostname(self)
hostname()
tcp()
all_protocols()
hostname(self) #返回掃描對象的主機名 
nm['192.168.1.22'].hostname()
u'SN2013-08-022'
state(self) #返回掃描對象的狀態,包括4種狀態(up、down、unknown、skipped)
nm['192.168.1.22'].state()
u'up'
all_protocols(self) #返回掃描的協議
nm['192.168.1.22'].all_prococols()
[u'tcp']
all_tcp(self) #返回TCP協議掃描的端口
nm['192.168.1.22'].all_tcp()
[22,80]
tcp(self,port) #返回掃描TCP掃描協議port(端口)的信息
nm['192.168.1.22'].tcp(22)
{
'state': u'open','reason':u'syn-ack','name':u'ssh'}

4、socket 模塊

4.1、socket()

套接字,應用程序通常通過套接字,來向網絡發出請求或者應答網絡請求,使主機間或者一台計算機上的進程間可以通訊

語法:

socket.socket([family[, type[, proto]]])
family #套接字家族可以使 AF_UNIX 或者 AF_INET。
type #套接字類型可以根據是面向連接的還是非連接分為 SOCK_STREAM 或 SOCK_DGRAM。
protocol #一般不填默認為 0。

4.2、Socket 對象(內建)方法

'''客戶端套接字'''
s.connect() #主動初始化TCP服務器連接,。一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤
'''服務器端套接字'''
s.listen() #開始TCP監聽.backlog指定在拒絕連接前,操作系統可以掛起的最大連接數量.該值至少為1,大部分應用程序設為5就可以
s.accept() #被動接受TCP客戶端連接,(阻塞式)等待連接的到來
s.bind() #綁定地址(host,port)到套接字, 在 AF_INET下,以元組(host,port)的形式表示地址
'''公共用途的套接字函數'''
s.close() #關閉套接字
s.recv() #接收 TCP 數據,數據以字符串形式返回,bufsize 指定要接收的最大數據量
s.send() #發送 TCP 數據,將 string 中的數據發送到連接的套接字
s.close() #關閉套接字
s.getsockname() #返回套接字自己的地址。通常是一個元組(ip,port)
s.gettimeout() #返回當前超時期的值,單位(秒),如果沒有設置超時期,則返回None

4.3、Internet 模塊

'''網絡協議 功能用處 端口 python模塊'''
HTTP 網頁訪問 80 httplib, urllib, xmlrpclib
NNTP 閱讀和張貼文章 119 nntplib
FTP 文件傳輸 20 ftplib, urllib
SMTP 發送郵件 25 smtplib
POP3 接收郵件 110 poplib
IMAP4 獲取郵件 143 imaplib
Telnet 命令行 23 telnetlib
Gopher 信息查找 70 gopherlib, urllib

示例:

1、判斷主機是否存活

import nmap
nm = nmap.PortScanner()
nm.scan(hosts = '172.17.2.0/24', arguments='-n -sP -PE')
up_hosts = nm.all_hosts() # 獲取存活主機列表
print(up_hosts)

2、單個IP掃描

import nmap # 導入 nmap.py 模塊
nm = nmap.PortScanner() # 獲取 PortScanner 對象
nm.scan('127.0.0.1', '22-443') # 掃描主機 127.0.0.1 端口號 22-443
nm.command_line() # 獲取用於掃描的命令行:nmap -oX - -p 22-443 127.0.0.1
nm.scaninfo() # 獲取本次掃描的信息 {'tcp': {'services': '22-443', 'method': 'connect'}}
nm.all_hosts() # 獲取所有掃描到的主機
nm['127.0.0.1'].hostname() # 獲取 127.0.0.1 的主機名
nm['127.0.0.1'].hostnames() #獲取list格式的主機名dict 127.0.0.1 #如[{'name':'hostname1', 'type':'PTR'}, {'name':'hostname2', 'type':'user'}]
nm['127.0.0.1'].state() # 獲取主機 127.0.0.1 的狀態 (up|down|unknown|skipped)
nm['127.0.0.1']['tcp'].keys() # 獲取所有tcp端口
nm['127.0.0.1'].all_tcp() # 獲取所有tcp端口 (已排序)
nm['127.0.0.1'].all_udp() #獲取所有tcp端口
nm['127.0.0.1'].all_ip() #獲取所有tcp端口
nm['127.0.0.1'].all_sctp() #獲取所有tcp端口
nm['127.0.0.1'].has_tcp(22) # 是否含有主機 127.0.0.1 的 22 端口的信息
nm['127.0.0.1']['tcp'][22] # 獲取主機 127.0.0.1 22 端口(tcp)的所有信息
nm['127.0.0.1'].tcp(22) # 獲取主機 127.0.0.1 22 端口的所有信息

3、主機存活掃描與幫助手冊

import nmap
import optparse
def NmapScan(targetIP):
nm=nmap.PortScanner() # 實例化 PortScanner 對象
try:
result=nm.scan(hosts=targetIP,arguments='-sn -PE ') #hostse為目標IP地址,arguments為nmap掃描參數 -sn:使用ping進行掃描 -PE:使用icmp的echo請求包
state=result['scan'][targetIP]['status']['state'] #對掃描結果進行切片 提取主機掃描信息
print("[{}] is [{}]".format(targetIP,state))
except Exception as e:
pass
if __name__=="__main__":
parser=optparse.OptionParser('usage:python %prog -i ip \n\n'
'Example:python %porg -i 172.16.0.172[172.16.0.1-200]\n')
parser.add_option('-i','--ip',dest='targetIP',default='172.16.0.1',type='string',help='target ip address')
options,args=parser.parse_args() #添加目標ip參數 -i
if '-' in options.targetIP:
for i in range(int(options.targetIP.split('-')[0].split('.')[3]),int(options.targetIP.split('-')[1])+1):
NmapScan(options.targetIP.split('-')[0] + '.' + options.targetIP.split('.')[1] + '.' + options.targetIP.split('.')[2]) + '.' + str(i)
else:
NmapScan(options.targetIP)
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(("127.0.0.1", 80))
if result == 0:
flag = True
else:
flag = False

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved