成為頂級黑客--python絕技 閱讀筆記(四)

用Python進行滲透測試

  1. 編寫一個端口掃描器
  2. 構建一個SSH殭屍網絡
  3. 通過FTP批量抓取肉機
  4. 重現蠕蟲病毒
  5. 構建攻擊腳本
成為頂級黑客--python絕技 閱讀筆記(四)

蠕蟲歷史

22年,Morris蠕蟲病毒使用了一個三管齊下的攻擊方式入侵系統,首先利用了UNIX郵件發送程序中的漏洞,其次利用UNIX系統的finger守護進程中的一個獨立的漏洞。最後,它會利用一些常見的用戶名/密碼,嘗試連接那些使用RSH(遠程shell)協議目標主機,只要三個攻擊中的任何一個成功,蠕蟲就會執行一個小程序,下載並執行病毒的剩餘部分。Morris中的大部分攻擊代碼都是用C語言寫的,我們將用Python重現Morris蠕蟲的部分功能及現代的攻擊方法。

編寫一個端口掃描器

成為頂級黑客--python絕技 閱讀筆記(四)

TCP三次握手協議

Python提供了訪問BSD套接字的接口,BSD套接字提供了一個應用編程接口(API),能編寫在主機之間進行網絡通信的應用程序,通過一系列的套接字API函數,我們可以創建,綁定,監聽,連接或在TCP/IP套接字上發送數據。TCP連接掃描是實用完整的三次握手來確定服務器或端口是否使用。

輸入一個主機名和逗號分隔的端口列表,並予以掃描。

我們在程序中使用optparse庫解析命令行參數,調用optparse.OptionPaser([usage message])會生成一個參數解析器(option parser)類的實例。接著,在parser.add_option中指定這個腳本具體要解析哪個命令行參數。下面是快速解析掃描的目標主機和端口的方法。

import optparse

parser = optparse.OptionParser('usage %prog -H  -p ')
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port')

(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPort = options.tgtPort
if tgtHost == None or tgtPort == None:
 print(parser.usage)
 exit(0)
else:
 print(tgtHost)
 print(tgtPort)

將主機名轉換成IPv4互聯網地址,對列表每個端口,我們都會連接目標地址與該端口。

嘗試建立與掃描出來的目標主機和端口進行連接。

from socket import *


def connScan(tgtHost, tgtPort):
 try:
 connSkt = socket(AF_INET, SOCK_STREAM)
 connSkt.connect((tgtHost, tgtPort))
 print('[+] %d/tcp open' % tgtPort)
 connSkt.close()
 except Exception:
 print('[-] %d/tcp closed' % tgtPort)


def portScan(tgtHost, tgtPorts):
 try:
 tgtIP = gethostbyname(tgtHost)
 except:
 print("[-] Cannot resolve '%s': Unknown host" % tgtHost)
 return

 try:
 tgtName = gethostbyaddr(tgtHost)
 print("\n[+] Scan Results for: " + tgtName[0])
 except:
 print("\n[-] Scan Results for: " + tgtIP)

 setdefaulttimeout(1)
 for tgtPost in tgtPorts:
 print("Scannint port " + tgtPost)
 connScan(tgtHost, tgtPost)

發送垃圾數據並讀取具體應用返回的Banner。

成為頂級黑客--python絕技 閱讀筆記(四)

抓取目標主機上的應用的Banner,找到開放的端口發送數據串並等待響應,收集響應判斷出在目標主機和端口上運行的應用。

from socket import *


def connScan(tgtHost, tgtPort):
 try:
 connSkt = socket(AF_INET, SOCK_STREAM)
 connSkt.connect((tgtHost, tgtPort))
 connSkt.send('Hello Python\r\n')
 results = connSkt.recv(1024)
 print('[+] {}/tcp open'.format(tgtPort))
 print('[+] ' + str(results))
 connSkt.close()
 except:
 print('[-] {}/tcp closed'.format(tgtPort))


def portScan(tgtHost, tgtPorts):
 try:
 tgtIP = gethostbyname(tgtHost)
 except:
 print("[-] Cannot resolve '{}': Unknown host".format(tgtHost))
 return

 try:
 #通過主機名獲取地址
 In [6]: socket.gethostbyaddr('www.baidu.com')
Out[6]: ('127.0.0.1', [], ['119.75.216.20'])
 主機名 別名 IP
 tgtName = gethostbyaddr(tgtIP)
 print("\n[+] Scan Results for: " + tgtName[0])
 except:
 print('\n[+] Scan Results for: ' + tgtIP)

 setdefaulttimeout(1)
 for tgtPort in tgtPorts:
 print('Scanning port ' + tgtPort)
 connScan(tgtHost, tgtPort)


def main():
 import optparse
 parser = optparse.OptionParser('usage %prog -H  -p ')
 parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
 parser.add_option('-p', dest='tgtPort', type='string', help='specify target port')

 (options, args) = parser.parse_args()
 tgtHost = options.tgtHost
 tgtPorts = (options.tgtPort).split(' ')
 if tgtPorts[0] == None or tgtHost == None:
 print('[-] You must specify a target host and port[s].')
 exit(0)
 portScan(tgtHost, tgtPorts)


if __name__ == '__main__':
 main()


分享到:


相關文章: