从admin到system

在渗透测试中,某些情况下需要用到system权限,例如操作注册表 HKEY_LOCAL_MACHINE\SAM\SAM,或者本地测试时需要system权限

前提

已经获得系统的管理员权限(administrator)
参考链接:

https://3gstudent.github.io/3gstudent.github.io/渗透技巧-从Admin权限切换到System权限/ https://blog.xpnsec.com/becoming-system/

目录

  • 通过创建服务获得System权限的方法
  • 利用MSIExec获得System权限的方法
  • 利用token复制获得System权限的方法
  • 利用Capcom.sys获得System权限的方法

    创建服务的方法

    SC

    1. sc create testServ binPath= "cmd /c start" type= own type= interact
    2. sc start testServ
  • 适用于XP

  • win7、win8不好用

扩展 - 图1

计划任务

  • at (高版本被弃用)

    1. at 11:06 /interactive calc

    扩展 - 图2

  • schtasks

    1. # 创建服务
    2. schtasks /Create /TN testServ /SC DAILY /ST 11:10 /TR calc.exe /RU SYSTEM
    3. # 查看服务状态
    4. schtasks /Query /TN testServ
    5. # 删除服务:
    6. schtasks /Delete /TN testServ /F

    利用工具 psExec

    下载地址 https://docs.microsoft.com/en-gb/sysinternals/downloads/psexec

使用psexec会创建 PSEXESVC 服务(测试的时候没找到这个服务),产生日志Event 4697、Event 7045、Event 4624和Event 4652
以system权限启动:

  1. psexec.exe -accepteula -s -d notepad.exe

默认情况下,system权限的进程不会在用户桌面显示,如果需要显示进程界面,可以加/i参数,命令如下:

  1. psexec.exe -accepteula -s -i -d notepad.exe

参数解释

  • -accepteula
    隐藏psexec第一次运行时弹出的提示是否许可执行的窗口
  • -s
    system权限运行
  • -i
    交互式
  • -d
    执行命令后返回,不等待命令结束

扩展 - 图3

其他的

https://3gstudent.github.io/3gstudent.github.io/渗透技巧-从Admin权限切换到System权限/

cat的一个缺陷

说明

  • cat有一个缺陷,如果内容中存在 \r 回车符,那么在cat直接查看的时候会首先输出\r后的内容,如果\r后的内容长度小于 \r 前的内容长度,那么就会输出 \r 后的内容在加上 \r 前的长度差的后几位。
  • 利用这个可以隐藏在一些脚本里面,比如 crontab, 直接 cat file 的查看方式会让运维不能发现问题。但是可以通过 vim less 查看到。

    举例

    看了上面的说明,可能还是不是很清楚,举个例子说明一下就很明白了。
    1. # 示例代码
    2. with open("result.sh", "w") as f:
    3. hiding_content = "1234567"
    4. output = hiding_content + "\r11111"
    5. f.write(output)
    扩展 - 图4
    会先输出 \r 后的 11111 ,由于 len(""1234567"") - len("11111)" = 2 ,所有最后会输出 1234567 的最后两位
    扩展 - 图5

    实操

    因为 cat 输出空文件和输出空格,肉眼看起来是一样的,所以可以利用空格来隐藏我们要执行的命令
    扩展 - 图6

    1. 直接隐藏

    1. with open("result.sh", "w") as f:
    2. hiding_content = "echo I am hidden content"
    3. output = hiding_content + "\r" + " " * len(hiding_content)
    4. f.write(output)
    扩展 - 图7

    2. 隐藏在正常的脚本里面

    1. original_content = "echo I am normal content"
    2. with open("result.sh", "w") as f:
    3. hiding_content = "echo I am hidden content;"
    4. output = hiding_content + "\r" + original_content + " " * len(hiding_content)
    5. f.write(output)
    扩展 - 图8

    总结

    只要是可能会用cat看的地方,都可以做一下手脚,结合权限维持还不错。
    有些说得不太准确的地方,望大佬们指正。