《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
没有文件链接到当前文件