badtouch是一个可编写脚本的网络身份验证破解程序。虽然如今市面上关于常见服务爆破的程序已经接近于饱和的状态,但在实际Web应用凭据测试时,你仍可能最终会自己手动来编写自己的Python脚本。
badtouch的范围是定制服务破解。这是通过编写被加载到lua运行的脚本来完成的。这些脚本代表单个服务,并提供返回true或false的verify(user, password)功能。badtouch运行当中会为我们提供并发性,进度指示和报告信息。
视频演示:base64_decode
解码base64字符串。
base64_decode("ww==") base64_encode用base64编码一个二进制数组。
base64_encode("\x00\xff") execve执行一个外部程序。返回退出代码。
execve("myprog", {"arg1", "arg2", "--arg", "3"}) hex十六进制编码一个字节列表。
hex("\x6F\x68\x61\x69\x0A\x00") hmac_md5用md5计算hmac。返回一个二进制数组。
hmac_md5("secret", "my authenticated message") hmac_sha1用sha1计算hmac。返回一个二进制数组。
hmac_sha1("secret", "my authenticated message") hmac_sha2_256用sha2_256计算hmac。返回一个二进制数组。
hmac_sha2_256("secret", "my authenticated message") hmac_sha2_512用sha2_512计算hmac。返回一个二进制数组。
hmac_sha2_512("secret", "my authenticated message") hmac_sha3_256用sha3_256计算hmac。 返回一个二进制数组。
hmac_sha3_256("secret", "my authenticated message") hmac_sha3_512用sha3_512计算hmac。 返回一个二进制数组。
hmac_sha3_512("secret", "my authenticated message") html_select解析一个html文档并返回匹配CSS选择器的第一个元素。返回值是一个表格,其中text为内部文本,attrs是元素属性的表格。
csrf = html_select(html, 'input[name="csrf"]') token = csrf["attrs"]["value"] html_select_list与html_select相同,但返回所有匹配,而不是第一个匹配。
html_select_list(html, 'input[name="csrf"]') http_basic_auth使用基本身份验证发送GET请求。如果没有设置WWW-Authenticate头并且状态码不是401,则返回true。
http_basic_auth("https://httpbin.org/basic-auth/foo/buzz", user, password) http_mksession创建一个session对象。这与python-request中的requests.Session类似,并且会跟踪cookie。
session = http_mksession() http_request准备一个http请求。第一个参数是从该会话被复制到请求中的会话引用和cookies。发送请求后,响应中的cookie将被复制回会话中。
下一个参数是method,url和其他选项。请注意,即使没有设置选项,你仍然需要指定一个空表{}。有以下选项可用:
query - 应该在url上设置的查询参数的映射
headers - 应该设置的头映射
basic_auth - (未实现)使用{“user, “password”}配置基本auth标头}
user_agent - 用字符串覆盖默认的用户代理
json - 应该被json编码的请求体
form - 应该进行表单编码的请求体
body - 作为字符串的原始请求体
req = http_request(session, 'POST', 'https://httpbin.org/post', { json={ user=user, password=password, } }) resp = http_send(req) if last_err() then return end if resp["status"] ~= 200 then return "invalid status code" end http_send发送使用http_request构建的请求。使用以下键返回表格:
status - http状态码
headers - 表格头
text - 响应体作为字符串
req = http_request(session, 'POST', 'https://httpbin.org/post', { json={ user=user, password=password, } }) resp = http_send(req) if last_err() then return end if resp["status"] ~= 200 then return "invalid status code" end json_decode从json字符串解码lua值。
json_decode("{\"data\":{\"password\":\"fizz\",\"user\":\"bar\"},\"list\":[1,3,3,7]}") json_encode将lua值编码为json字符串。请注意,空表格被编码为空对象{}而不是空列表[]。
x = json_encode({ hello="world", almost_one=0.9999, list={1,3,3,7}, data={ user=user, password=password, empty=nil } }) last_err如果未记录错误,则返回nil,否则返回字符串。
if last_err() then return end ldap_bind连接到ldap服务器并尝试使用给定的用户进行身份验证。
ldap_bind("ldaps://ldap.example.com/", "cn=\"" .. ldap_escape(user) .. "\",ou=users,dc=example,dc=com", password) ldap_escape以相对专有名称转义属性值。
ldap_escape(user) ldap_search_bind连接到ldap服务器,登录到用户搜索,搜索目标用户并尝试使用搜索返回的第一个DN进行身份验证。
ldap_search_bind("ldaps://ldap.example.com/", -- the user we use to find the correct DN "cn=search_user,ou=users,dc=example,dc=com", "searchpw", -- base DN we search in "dc=example,dc=com", -- the user we test user, password) md5使用md5对字节数组哈希,并将返回结果作为字节。
hex(md5("\x00\xff")) mysql_connect连接到一个MySQL数据库,并尝试使用提供的凭据进行身份验证。成功时返回true。
mysql_connect("127.0.0.1", 3306, user, password) print打印一个变量的值。请注意为了避免带来不必要的麻烦,建议仅在调试时使用。
print({ data={ user=user, password=password } }) rand返回具有最小和最大约束的随机u32。返回值可以大于或等于最小边界,并始终低于最大边界。此功能尚未经过密码安全审查。
rand(0, 256) randombytes生成指定数量的随机字节。
randombytes(16) sha1使用sha1对一个字节数组哈希,并将返回结果作为字节。
hex(sha1("\x00\xff")) sha2_256使用sha2_256对一个字节数组哈希,并将返回结果作为字节。
hex(sha2_256("\x00\xff")) sha2_512使用sha2_512对一个字节数组哈希,并将返回结果作为字节。
hex(sha2_512("\x00\xff")) sha3_256使用sha3_256对一个字节数组哈希,并将返回结果作为字节。
hex(sha3_256("\x00\xff")) sha3_512使用sha3_512对一个字节数组哈希,并将返回结果作为字节。
hex(sha3_512("\x00\xff")) sleep暂停该线程指定秒数。这主要用于调试并发性。
sleep(3) 配置 #p#分页标题#e#你可以在~/.config/badtouch.toml中放置一个配置文件来设置一些默认值。
Global user agent [runtime] user_agent = "w3m/0.5.3+git20180125" RLIMIT_NOFILE [runtime] # requires CAP_SYS_RESOURCE # sudo setcap 'CAP_SYS_RESOURCE=+ep' /usr/bin/badtouch rlimit_nofile = 64000 编译python脚本badtouch运行时仍然非常的简陋,因此你可能需要对常规Python脚本进行编译。你的wrapper可能是这样的:
descr = "example.com" function verify(user, password) ret = execve("./docs/test.sh", {user, password}) if last_err() then return end if ret == 2 then return "script signaled an exception" end return ret == 0 end你的python脚本可能是这样的:
import sys try: if sys.argv[1] == "foo" and sys.argv[2] == "bar": # correct credentials exit(0) else: # incorrect credentials exit(1) except: # signal an exception # this requeues the attempt instead of discarding it exit(2)*参考来源:github,FB小编 secist 编译,转载请注明来自FreeBuf.COM
上一篇: 巡风风险扫描开源系统的一些演变
下一篇: 招商银行招聘安全管理岗位