前言:
虽然在实战中很少遇到这些提取方式,但是遇到了也是很吃香的,所以写一篇,供大家一起学习。
正文:
DLL劫持+令牌窃取提权:
这个提权方式比较鸡肋,这个需要目标主机的管理员有使用一些特定的软件(比如ftp,远程访问控制和notepad++等等软件),并且还要经常使用它,因为这样当我们劫持的对方的dll的时候才会启动这个是需要对方配合的。说到这个dll,我们就说一下这个DLL。
DLL为动态链接库文件(他的本质实际上是将可执行文件与库文件分离)。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。而这个DLL劫持就是我们把程序原有会运行的DLL文件替换成我们的后门木马(要配合免杀技术),或者把我们的后门放在他原有会执行的DLL文件前面,让他先执行,为什么要放前面其实在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Windows会尝试去按照顺序搜索这些特定目录时下查找这个DLL,只要黑客能够将恶意的DLL放在优先于正常DLL所在的目录,就能先运行我们的后门或木马。如果要查找程序运行了那些DLL文件可以用火绒自带的火绒剑,或者用微软的process explorer检查加载的dll文件。下载地址:Process Explorer - Windows Sysinternals | Microsoft Docs
执行顺序:
1.进程对应的应用程序所在目录(可理解为程序安装目录比如C:ProgramFilesuTorrent); 2.系统目录(即%windir%system32) 3.16位系统目录(即%windir%system) 4.Windows目录(即%windir%) 5.当前目录(运行的某个文件所在目录,比如C:DocumentsandSettingsAdministratorDesktoptest) 6.PATH环境变量中的各个目录;
这个是网上说的,但是现在肯定都会有写变化,如果哪位师傅知道,可以说一下。
现在就实操下:
查看进程
我们要找未知文件或者数字签名文件等,才可以劫持。
这里我们进行替换原有DLL文件进行劫持。
一:msfvenom 生成window木马
通过webshell上传,然后替换原有文件。
记住替换的成我们的dll要和对方发的文件名相同。
进行监听,并设置参数。
就等对方管理员起用他被我们植入后门的常用软件了。
对方管理员启用软件,收到会话。
查看权限,并用令牌窃取提权。
令牌窃取命令(三条):
use incognito
list_tokens -u
impersonate_token "NT AUTHORITY\SYSTEM"
可以看到为system权限。
不带引号路径提权:
当Windows服务运行时,如果给出了可执行文件,并且引用了完整路径,则系统会按字面解释它并执行。但是,如果服务的路径里面包含空格而且还没有双引号来包含的话,那么就会执行前面的文件。
举个例子:
可以看到他这里运行进行了双引号处理,而下面一个就没有
这个就是window是自带的防护机制。
但是如果没有引号而且又空格的话就会有安全隐患。我们可以通过webshell执行这条命令来查看服务器里面有没有满足这两个条件的。
命令:service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\" |findstr /i /v """
可以看到本机还是有很多满足条件的。
我们来利用一下。
可以看到这个满足了,当计算机重启的时候他就会运行这条系统程序,他的执行顺序是这样的。
c:\program.exe c:\program files.exe c:\program files (x86)\grasssoft\macro.exe c:\program files (x86)\grasssoft\macro expert\MacroService.exe
这样我们可以上传一个木马或者后面=门,更或者是一条创建管理员账号的命令的program.exe程序到c盘根目录下。或者上传一个macro.exe到c:\program files (x86)\grasssoft目录下。之后就是重启,执行的问题了,要服务器重启方法有很多,ddos等等,
我们只要在kali进行监听就可以了。
我们可以在上传的程序里面写一个可以执行ipconfig(windows)的脚本,并保存为1.txt。
package main
import (
"fmt"
"io/ioutil"
"log"
"os/exec"
)
func main() {
cmdOutput, err := exec.Command("ipconfig").Output()
if err != nil {
log.Fatal(err)
}
err1 := ioutil.WriteFile("1.txt", cmdOutput, 0644)
if err1 != nil {
panic(err)
}
fmt.Printf("%s", cmdOutput)
}