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

用Python進行滲透測試

編寫一個端口掃描器構建一個SSH殭屍網絡通過FTP批量抓取肉機重現蠕蟲病毒構建攻擊腳本

蠕蟲歷史

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

編寫一個端口掃描器

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。

抓取目標主機上的應用的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()