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)

配置

你可以在~/.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 编译