《Python绝技 运用Python成为顶级黑客》
《Python绝技 运用Python成为顶级黑客》
目录
用Python进行渗透测试
知识点
Morris蠕虫
- 历史
- 略
- 攻击方式:三管齐下,任何一个成功就会执行一个小程序,下载并执行病毒的其余部分
- UNIX邮件发送程序的漏洞
- UNIX系统fnger守护进程中的一个独立的漏洞
- 用一些常见的用户名/密码,尝试连接那些使用RSH(remote shell,远程shell)协议的目标主机
端口扫描
为了与TCP端口(TCP 80、TCP 25、TCP 21等)进行交互,一般先建立TCP套接字
可用通过BSD套接字的API来实现
原理(两种常用的)
- TCP端口扫描:向一系列常用的端口发送
TCP SYN
数据报,并等待TCP ACK
响应 - TCP连接扫描:使用完整的三次握手来确定服务器或端口是否可用
socket手写实现版本
- 知识点:
optparse模块
、socket模块
、threading模块的Thread类与信号量屏幕锁
- demo(
portscanner.py
)(已经实验,代码有效,但测试时端口均未打开)
# coding=utf-8 # 防止Linux编码失败
import optparse # 命令行参数解析模块
from socket import * # 网络模块,这里导入了全部...于是代码看起来有点...
def connScan(tgtHost, tgtPort): # 连接扫描
try:
connSkt = socket(AF_INET, SOCK_STREAM) # 创建socket实例
connSkt.connect((tgtHost, tgtPort)) # 连接指定ip和端口
connSkt.send('ViolentPython\r\n') # 发送一些字符串过去
results = connSkt.recv(100) # 读取接下来的信息(Banner信息)
print '[+]%d/tcp open'% tgtPort # 连接成功则打印端口名和Banner并关闭端口,否则就打印端口没有打开
print '[+] '+str(rusults)
connSkt.close()
except:
print '[-]%d/tcp closed'% tgtPort
def portScan(tgtHost, tgtPorts): # 端口扫描
try:
tgtIP = gethostbyname(tgtHost) # 尝试寻找主机(socket函数?)
except:
print "[-] Cannot resolve '%s': Unkown host"%tgtHost
return
try:
tgtName = gethostbyaddr(tgtIP) # 尝试通过ip获取主机名(socket函数?)
print '\n[+] Scan Results for: '+tgtName[0]
except:
print '\n[+] Scan Results for: '+tgtIP
setdefaulttimeout(1) # 设置超时(socket函数)
for tgtPort in tgtPorts: # 遍历端口字典并调用`连接扫描`
print 'Scanning port '+tgtPort
connScan(tgtHost, int(tgtPort)) # 调用连接扫描
def main(): # 入口函数
parser = optparse.OptionParser('usage %prog '+'-H <target host> -p <target port>') # 传入主机名和端口
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost # 目标主机
tgtPorts = str(options.tgtPort).split(',') # 目标端口
if(tgtHost==None)|(tgtPorts[0]==None): # 参数检查
print '[-] You must specify a target host and port[s].'
print parser.usage
exit(0)
portScan(tgtHost, tgtPorts) # 调用连接扫描
if __name__ == '__main__': # 启动入口函数
main()
'''
$ python portscanner.py -H 192.168.1.37 -p 21,22,80
[+] Scan Results for: 192.168.1.37
Scanning port 21
[+] 21/tcp oprn
[+] 220 FreeFloat Ftp Server (Version 1.00)
'''
改进(线程扫描,把connScan函数作为线程来调用)
但注意这里的多线程有一个缺点:connScan()函数有输出,如果多个线程同时输出,有可能会出现乱码和失序
为了让一个函数获得完整的屏幕控制权,需要使用一个
信号量
(semaphore)
for tgtPort in tgtPorts:
t = Thread(tgrget=connScan, args=(tgtHost, int(tgtPort)))
t.start()
- 改进2:屏幕锁
screen Lock = semaphore(value=1) # 信号量(threading模块的函数)
def connScan(tgtHost, tgtPort):
try:
connSkt = socket(AF_INET, SOCK_STREAM)
connSkt.connect((tgtHost, tgtPort))
connSkt.send('ViolentPython\r\n')
results = connSkt.recv(100)
screenLock.qcquire() # 输出前进行屏幕锁
print '[+]%d/tcp open'% tgtPort
print '[+] '+str(rusults)
# 解除连接放后面了
except:
screenLock.qcquire() # 输出前进行屏幕锁
print '[-]%d/tcp closed'% tgtPort
finally: # 输出完解除屏幕锁
screenLock.release()
connSkt.close()
- finaly(线程调用好像有点问题,不能用......先不管了)
# coding=utf-8 # 防止Linux编码失败
import optparse # 命令行参数解析模块
from socket import * # 网络模块,这里导入了全部...于是代码看起来有点...
from threading import * # 多线程模块
screen Lock = semaphore(value=1) # 信号量(threading模块的函数)
def connScan(tgtHost, tgtPort): # 连接扫描
try:
connSkt = socket(AF_INET, SOCK_STREAM) # 创建socket实例
connSkt.connect((tgtHost, tgtPort)) # 连接指定ip和端口
connSkt.send('ViolentPython\r\n') # 发送一些字符串过去
results = connSkt.recv(100) # 读取接下来的信息(Banner信息)
screenLock.qcquire() # 输出前进行屏幕锁
print '[+]%d/tcp open'% tgtPort # 连接成功则打印端口名和Banner并关闭端口,否则就打印端口没有打开
print '[+] '+str(rusults)
except:
screenLock.qcquire() # 输出前进行屏幕锁
print '[-]%d/tcp closed'% tgtPort
finally:
screenLock.release() # 输出完解除屏幕锁
connSkt.close()
def portScan(tgtHost, tgtPorts): # 端口扫描
try:
tgtIP = gethostbyname(tgtHost) # 尝试寻找主机(socket函数?)
except:
print "[-] Cannot resolve '%s': Unkown host"%tgtHost
return
try:
tgtName = gethostbyaddr(tgtIP) # 尝试通过ip获取主机名(socket函数?)
print '\n[+] Scan Results for: '+tgtName[0]
except:
print '\n[+] Scan Results for: '+tgtIP
setdefaulttimeout(1) # 设置超时(socket函数)
for tgtPort in tgtPorts: # 遍历端口字典并调用`连接扫描`
t = Thread(tgrget=connScan, args=(tgtHost, int(tgtPort))) # 线程方式调用连接扫描
t.start()
def main(): # 入口函数
parser = optparse.OptionParser('usage %prog '+'-H <target host> -p <target port>') # 传入主机名和端口
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost # 目标主机
tgtPorts = str(options.tgtPort).split(',') # 目标端口
if(tgtHost==None)|(tgtPorts[0]==None): # 参数检查
print '[-] You must specify a target host and port[s].'
print parser.usage # 打印格式(最刚开始设置那串)
exit(0)
portScan(tgtHost, tgtPorts) # 调用连接扫描
if __name__ == '__main__': # 启动入口函数
main()
namp版本
- 知识点:
optparse模块
、nmap模块工具包
- demo
import nmap
import optparse
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='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] separated by comma')
(options, args)=parser.parse_atgs()
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) # 使用nmapScan扫描端口(相当于原来的连接扫描+端口扫描)
if __name__=='__main__':
main()
'''
$ python nmapScan.py -H 10.50.60.125 -p 21,1720
[*] 10.50.60.125 tcp/21 open
[*] 10.50.60.125 tcp/1720 filtered # 能扫描出防火墙的访问请求过滤,而单一的TCP连接扫描做不到这点
'''
SSH僵尸网络
前提知识
RSH
(Remote Shell,远程shell)协议,1988年问世- 为系统管理员提供了一种很棒的远程连接方法,并能在主机上运行一系列终端命令对它进行管理
- 尽管并不安全(是Morris蠕虫使用的三种攻击方式之一)
SSH
(Secure Shell,安全shell)协议- 在
RSH
中增加了一个公钥加密算法(不过并不能防范暴力破解) - 最终
SSH
取代了RSH
- 在
知识点:
Pexpect
模块
用Pexpect
与SSH交互
用Pxssh
暴力破解SSH密码
利用SSH中的弱私钥
构建SSH僵尸网络
利用FTP与Web批量抓 “肉鸡”
用Python构建匿名FTP扫描器
使用Ftplib
暴力破解FTP用户口令
在FTP服务器上搜索网页
在网页中加入恶意注入代码
整合全部的攻击
Conficker,为什么努力做就够了
Conficker蠕虫
使用Metasploit
攻击Windows SMB
服务
The Metasploit Framework
,Metasploit 框架
,简称MSF
编写Python脚本与Metasploit
交互
暴力破解口令,远程执行一个进程
把所有的代码放在一起,构成我们自己的Conficker
编写你自己的0day概念验证代码
基于栈的缓冲区溢出攻击
添加攻击的关键元素
发送漏洞利用代码
汇总得到完整的漏洞利用脚本
链接到当前文件 0
没有文件链接到当前文件