这是我通过学习书籍《Python绝技——运用Python成为顶级黑客》一书中的学习笔记。
学习Python这一门语言,我觉得是需要大家一起分享,一起进步的,尤其是做安全工作的同志。
通过学习第二章有关扫描器的部分,自己试着模仿程序并且有自己的心得和体会。
网络嗅探是网络攻击开始的第一步,而获取目标使用的操作系统、开放的服务和端口等信息对于攻击者来说是十分有用的,攻击者可以通过获取得到的这些信息对下一步进行的攻击做铺垫。
通过书籍后发现,该章节使用了TCP全连接、nmap对端口进行扫描,且均对固定的端口进行扫描,现如今使用固定端口扫描的场景大多是在互联网上抓取肉鸡,我将程序稍作改动,改成了对同一个IP地址主机的所有端口进行扫描,这样做是可以针对某个IP地址的主机进行网络嗅探。
下面是我使用简单的SOCKET编程实现的针对单一主机进行攻击的python代码:
# -- coding: utf-8 --
#输入目标IP地址对0-65535端口进行扫描
#输入方式:python scanner_SingleHost.py -H 127.0.0.1
import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)
def portscan(tgtHost,tgtPort):
try:
skt = socket(AF_INET,SOCK_STREAM)
skt.settimeout(2)
skt.connect((tgtHost,tgtPort))
skt.send("Hello,I'm uruz!\r\n")
response = skt.recv(4096)
screenLock.acquire()
print "[+] %s/tcp open and the address is %s" %(tgtPort,tgtHost)
print "[+] banner is %s\n" %response
except:
screenLock.acquire()
#print "[-] %s/tcp closed and the address is %s" %(tgtPort,tgtHost)
finally:
screenLock.release()
skt.close()
def main():
parser = optparse.OptionParser('usage%prog '+'-H <target host>')
parser.add_option('-H', dest = 'tgtHost', type = 'string', help = 'plese specify the host')
(options,args) = parser.parse_args()
tgtHost = options.tgtHost
for i in range(0,65536):
t = Thread(target = portscan, args=(tgtHost,i))
t.start()
if __name__=="__main__":
main()
当然,对单一主机进行扫描所有端口你可能没有那么多时间,仅仅想要扫描该主机的某个端口,那么下面这段代码可能就比较适合你:
# -- coding: utf-8 --
#输入目标IP地址和端口进行扫描
#输入方式:python scanner_normal.py -H 127.0.0.1 -p 22
import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)
def portscan(tgtHost,tgtPort):
try:
skt = socket(AF_INET,SOCK_STREAM)
skt.settimeout(2)
skt.connect((tgtHost,tgtPort))
skt.send("Hello,I'm uruz!\r\n")
response = skt.recv(4096)
screenLock.acquire()
print "[+] %d/tcp open and the address is %s" %(tgtPort,tgtHost)
print "[+] banner is %s\n" %response
except:
screenLock.acquire()
print "[-] %d/tcp closed and the address is %s" %(tgtPort,tgtHost)
finally:
screenLock.release()
skt.close()
def main():
parser = optparse.OptionParser('usage%prog '+'-H <target host> '+ '-p <target port>')
parser.add_option('-H', dest = 'tgtHost', type = 'string', help = 'please specify the host')
parser.add_option('-p', dest = 'tgtPort', type = 'int', help = 'please specify the port')
(options,args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPort = options.tgtPort
portscan(tgtHost,tgtPort)
if __name__ == '__main__':
main()
根据该书所说,如果目标主机设置了防火墙等相关的防护措施,普通的SOCKET编程可能对这样的主机无法进行很好的嗅探,那么怎么办呢?书上提及,使用NMAP对端口进行扫描。使用NMAP之前,必须先把python-nmap这个包安装上,使用pip进行安装,如果你还没有pip,你就得先安装pip。我使用的是kali操作系统,理论上debian和ubuntu也可以使用同样的方式进行安装,安装如下:
sudo apt-get install pip
sudo pip install python-nmap
安装完成后,在你所使用的编辑器中设置一下环境即可使用。
nmap扫描器的代码如下:
# -- coding: utf-8 --
#输入目标IP地址和端口进行扫描
#输入方式:python scanner_nmap.py -H 127.0.0.1 -p 22,80
import optparse
import nmap
def nmapScan(tgtHost,tgtPort):
nmScan = nmap.PortScanner()
nmScan.scan(tgtHost,tgtPort)
state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
print"[*] " + tgtHost + " tcp/" + tgtPort + " " + state
def main():
parser = optparse.OptionParser('usage%prog '+'-H <target host> '+ '-p <target port>')
parser.add_option('-H', dest = 'tgtHost', type = 'string', help = 'please specify the host')
parser.add_option('-p', dest = 'tgtPort', type = 'string', help = 'please specify the port')
(options,args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPorts = str(options.tgtPort).split(',')
if (tgtHost == None) | (tgtPorts[0] == None):
print parser.usage
exit(0)
for tgtPort in tgtPorts:
nmapScan(tgtHost,tgtPort)
if __name__ == "__main__":
main()
有些人可能对Python不是很熟悉,改代码段中的
tgtPorts = str(options.tgtPort).split(',')
意思是将这个字符串以‘,’分开,并将分开的部分存入列表(在C/C++中我们更加习惯叫数组,这是两种类似的数据结构)中,比如
options.tgtPort = '22,80'
那么tgtPorts中存储的内容就是(22,80)
以上就是我对扫描器这一章节进行的学习。
学习过程中我发现,该书介绍的使用optparse模块对参数的处理十分有意思,是我学习C/C++不曾使用过的方式
另外,大学本科学习过程中老师并没有教会我使用SOCKET编程,从这个章节中我了解到了如何进行SOCKET客户端编程(TCP连接方式):
第一步,创建套接字实例
第二步,套接字与目标主机通过(IP地址,端口号)进行连接
第三步,发送、接收数据
第四步,关闭连接
各位有何高见希望能和我联系,我们共同进步。
看完后觉得有帮助希望能够在左方点一个赞~