vulntarget-n

分析攻击事件是如何发生的,请给出攻击画像
解密勒索
恢复原来的index.jsp页面,恢复正常的web服务
找到隐藏在其中的3个flag

入侵事件,先备份命令历史

cat .bash_history >> bash_hi.bak

image.png

第一个flag

flag{vulntarget_very_G00d}

但没够继续翻日志

image.png

跟踪log可以看到服务器这里是tomcat的服务端位于/opt/tomcat/root这里在备份index后又新建了一个,接着跟踪

image.png

在根目录创建了一个.vulntarget文件夹,用python生成了一对密钥对,然后拷贝了公钥到根目录用py脚本进行了加密,跟踪来到生成密钥的位置

image.png

可以看到私钥没有删除,根据log文件信息也只做了rsa,那只需要写一个脚本解密就好,然后截至到这里遇到了卡住我的第一个点

image.png

flag解密是正常的,但相对较长的index与404文件无法正常解密,后续是使用python解决的

import base64
import os
import rsa

# 定义目标后缀
TARGET_EXTENSIONS = ['.vulntarget']

def load_private_key(key_path):
    """加载RSA私钥"""
    with open(key_path, mode="rb") as file:
        priv_key = file.read()
    return rsa.PrivateKey.load_pkcs1(priv_key)

def rsa_decrypt(file_name, priv_key):
    """对文件进行RSA解密"""
    with open(file_name, mode="rb") as file:
        encoded_data = file.read()
    
    try:xin xi
        data = base64.b64decode(encoded_data)
    except Exception as e:
        print(f"Base64 decode error for file {file_name}: {e}")
        return

    # 打印解密前的数据块信息
    print(f"Decrypting file: {file_name}")
    print(f"Encoded data length: {len(encoded_data)}")
    print(f"Decoded data length: {len(data)}")

    # 存储解密后的数据块
    res = []
    # 设置每次解密的数据块大小为128字节
    chunk_size = 128  # 128大小 关键flag{https://github.com/crow821/vulntarget}
    for i in range(0, len(data), chunk_size):
        chunk = data[i:i + chunk_size]
        print(f"Decrypting chunk {i // chunk_size}: {chunk.hex()[:60]}...")
        try:
            decrypted_chunk = rsa.decrypt(chunk, priv_key)
            res.append(decrypted_chunk)
        except rsa.pkcs1.DecryptionError as e:
            # 如果解密过程中出现错误,则打印错误信息并跳过当前数据块
            print(f"Decryption failed for chunk {i // chunk_size}: {e}")
            continue  # 跳过失败的块
    
    decrypted_data = b''.join(res)
    
    os.remove(file_name)
    # 去掉后缀
    new_file_name = file_name.replace(".vulntarget", "")
    with open(new_file_name, mode="wb") as file:
        file.write(decrypted_data)
        print(f"[+] Decrypt success: {new_file_name}")

def decrypt_files_in_directory(directory_path, priv_key):
    """递归解密目录下的所有文件"""
    for root, _, files in os.walk(directory_path):
        for file in files:
            file_path = os.path.join(root, file)
            if any(file_path.endswith(ext) for ext in TARGET_EXTENSIONS):
                rsa_decrypt(file_path, priv_key)

def main(target_path, key_path):
    """主函数"""
    priv_key = load_private_key(key_path)
    
    if os.path.isdir(target_path):
        decrypt_files_in_directory(target_path, priv_key)
    else:
        if any(target_path.endswith(ext) for ext in TARGET_EXTENSIONS):
            rsa_decrypt(target_path, priv_key)

if __name__ == '__main__':
    target_path = './'  # 替换为实际路径
    key_path = './key.pem'         # 替换为私钥路径
    main(target_path, key_path)

使用了分块解密

image.png

完成解密之后web服务也就恢复正常了

image.png

根目录下存放着第二个flag

image.png

flag{https://github.com/crow821/vulntarget}

在根据前面的命令历史不难跟踪到404这个文件,cat内容为

image.png

非常明显的木马密码为vulntarget

之后便是要弄清楚攻击画像,tomcat的log位置位于/opt/tomcat/logs

image.png

flag{Welcome_t0_join_Us}

image.png

这个文件,还是根据前面的命令历史可以看到原始的webshell文件vulntargetn.jsp,在日志中过滤关键字导出

image.png

image.png

到这里就可以做总结了

分析攻击事件是如何发生的,请给出攻击画像
解密勒索
恢复原来的index.jsp页面,恢复正常的web服务
找到隐藏在其中的3个flag

1.攻击分析

黑客通过put漏洞获取基础权限而后获得shell,找到tomcat的根目录写入了密钥对在利用python脚本加密了网站根目录下的所有文件

漏洞通过搜索可以确定CVE-2017-12615这个漏洞具体利用方式可以看https://www.cnblogs.com/Junglezt/p/18123082

2.勒索解密,恢复服务

用留下的rsa私钥以128分块进行解密即可,解密文件替换黑页文件

3.找到隐藏在其中的3个flag

分别位于.bash_historylocalhost.2024-06-04.log和网页根目录的加密文件中

flag{Welcome_t0_join_Us}

flag{https://github.com/crow821/vulntarget}

flag{vulntarget_very_G00d}