CTF实战4 HTTP协议及嗅探抓包

我们这节开始讲解HTTP协议和BurpSuite工具的使用 HTTP协议

HTTP(Hypertext Transfer Protocol)中文<超文本传输协议>,是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Internet上目前使用最广泛的应用层协议

它基于传输层的TCP协议进行通信,HTTP协议是通用的、无状态的协议,主要用于在服务器和客户机之间传输超文本文件

HTTP发展过程

HTTP/0.9

1990年就已经用来作为www的传输协议,当时非常简单,只支持GET方法,响应中携带的消息必须HTML文件

HTTP/1.0

1996发布RFC194590年代后期,基于0.9的各种客户端和服务端的扩展层出不穷,把这些扩展进行综合推出新标准HTTP/1.0

HTTP/1.1

1997推出RFC2068HTTP/1.1的标准

HTTP/1.1

1999推出RFC2616,废弃了RFC2068标准

HTTP/2

2015作为互联网标准正式发布

注意一点:HTTP是比TCP高级的传输协议~

建立HTTP连接

建立HTTP连接的步骤:

1. 客户端与服务器端建立连接

2. 客户端向服务器端发送请求

3. 服务器端向客户端回复响应

4. 断开连接

HTTP请求方法

HTTP/1.1协议中共定义了八种方法(也叫<动作>)来以不同方式操作指定的资源

GET

向指定的资源发出<显示>请求,使用GET方法应该只用在读取数据,而不应当被用于产生<副作用>的操作中,其中一个原因是,例如在一个Web Application中,GET可能会被网络蜘蛛等随意访问

HEAD

GET方法一样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分

它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中<关于该资源的信息>(元信息或称元数据)

POST

向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)

数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有

PUT

向指定资源位置上传其最新内容

DELETE

请求服务器删除Request-URI所标识的资源

TRACE

回显服务器收到的请求,主要用于测试或诊断

OPTIONS

这个方法可使服务器传回该资源所支持的所有HTTP请求方法,用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)

HTTP服务器至少应该实现GETHEAD方法,其他方法都是可选的,当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法

例如:

PATCH(由 RFC 5789 指定的方法)

用于将局部修改应用到资源

HTTP消息组成

主要分成两大类

请求(Request)消息

Request由客户端发给服务器的消息。其组成包括

请求行(Request-Line)

请求头(Request header fields)

空行(Empty Line)

消息体(Message Body)

其中

请求行和标题必须以<CR><LF>作为结尾,空行内必须只有<CR><LF>而无其他空格

HTTP/1.1协议中,所有的请求头,除Host外,都是可选的

我们来看个请求的例子

GET / HTTP/1.1

Host: www.google.com

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0

Accept: */*

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

Accept-Encoding: gzip, deflate

Cache-Control: no-cache

Pragma: no-cache

Connection: close

第一行的GET请求行

第二行的Host1.1版里必带的一个header,用于指定主机

响应(Response)消息

Response服务端回复客户端请求的消息,其组成包括

状态行(Status Line)

响应头 (Response Header Field)

空行(Empty Line)

消息体(Message Body)

这里呢

状态行和其他标题字段必须全部以<CR><LF>结尾

空行必须只包含<CR><LF>,而不能包含其他空格

<CR><LF>的这种严格要求在邮件正文中有所放宽,以便一致地使用其他系统断行,例如单独<CR><LF>

这里我们看一个例子,是上面那个请求的Response

HTTP/1.1 200 OK

Date: Mon, 23 May 2018 22:38:34 GMT

Content-Type: text/html; charset=UTF-8

Content-Encoding: UTF-8

Content-Length: 138

Last-Modified: Wed, 08 Jan 2018 23:11:55 GMT

Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)

ETag: "3f80f-1b6-3e1cb03b"

Accept-Ranges: bytes

Connection: close

<html>

<head>

<title>An Example Page</title>

</head>

<body>

Hello World, this is a very simple HTML document.

</body>

</html>

状态码(Status code)

所有HTTP Response的第一行都是状态行,然后依次是当前HTTP版本号

状态码由3位数字组成的,还有描述状态的短语,彼此由空格分隔

状态代码的第一个数字代表当前响应的类型:

1xx 消息 --- 请求已被服务器接收,继续处理

2xx 成功 --- 请求已成功被服务器接收、理解、并接受

3xx 重定向 --- 需要后续操作才能完成这一请求

4xx 请求错误 --- 请求含有词法错误或者无法被执行

5xx 服务器错误 --- 服务器在处理某个正确请求时发生错误

虽然<RFC 2616>中已经推荐了描述状态的短语,例如<200 OK>,<404 Not Found>,但是Web开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息

现在我们稍微解释一下上面那个RequestResponse的意思

Connection

Connection:close

这句话是在告知服务器本浏览器不想使用永久连接方式,其中,HTTP/1.0使用默认非永久连接,而HTTP/1.1默认使用永久连接

User-agent

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0

这句话是用来指定用户浏览器的类型,有时候我们要绕过一些服务器的浏览器限制,可以通过编辑这个段来实现

Accept-Encoding

Accept-Encoding: gzip, deflate

其中,gzip, deflate指出发送此请求的浏览器支持哪些压缩编码方式

Accept-language

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

这个段是指出客户浏览器支持的语言是中文或者台湾中文或者香港中文(zh-CN and zh-TW and zh-HK

Date

Date: Mon, 23 May 2018 22:38:34 GMT

指出服务器创建并发送本响应消息的日期和时间

HTTP允许下面三种不同格式的日期/时间,但必须是格林尼治标准时间

Server

Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)

这里的Apache/1.3.3.7 (Unix) (Red-Hat/Linux)指出本消息是由Apache服务器产生的,并且服务器版本为1.3.3.7

为什么漏扫可以查看目标站的服务器版本,就是通过这里

Last-Nodified

Last-Modified: Wed, 08 Jan 2018 23:11:55 GMT

这个字段是指出对象本身的创建或最后修改日期或时间,这主要是为了方便你在第二次访问一个网站的时候,网站会使用以前的浏览器缓存,如果浏览器缓存超过了一个时间,就会重新更新网页内容,有些黑客可以通过修改这个字段来让浏览器做一些事情

OK,下面我们加入实操与理论的结合

说了这么多理论的,现在我们介绍一个工具,叫

BurpSuite

这个工具呢有免费版的和付费版的,我们用免费的社区版就行啦~

工具的下载地址

https://portswigger.net/burp/communitydownload

kali中已经自带了这个

windows的安装过程中注意要安装和配置JDK

这里稍微解释一下BurpSuite(以下就简称BS了)

Burp Suite是一个集成平台,用于执行Web应用程序的安全测试

它被设计成供动手测试人员用来支持测试过程, 只需付出一点努力,任何人都可以开始使用Burp Suite的核心功能来测试其应用程序的安全性

Burp Suite的一些更高级的功能将需要进一步的学习和经验才能掌握。 所有这些投资都是非常值得的

Burp Suite的用户驱动工作流程是迄今为止执行Web安全测试最有效的方式,并且将超越任何传统的点击式扫描器的功能

我们先看看这个软件的大概有哪些功能

Proxy

Burp Suite带有一个代理,通过默认端口8080上运行,使用这个代理,我们可以截获并修改从客户端到Web应用程序的数据包

Spider

Burp Suite的蜘蛛功能是用来抓取Web应用程序的链接和内容等,它会自动提交登陆表单(通过用户自定义输入)

Burp Suite的蜘蛛可以爬行扫描出网站上所有的链接,通过对这些链接的详细扫描来发现Web应用程序的漏洞 。

Scanner

它是用来扫描Web应用程序漏洞的

在测试的过程中可能会出现一些误报,但是各位要记住,自动扫描器扫描的结果不可能完全100%准确.

Intruder

这个单词的翻译是<入侵>,这个功能可用于多种用途,如漏洞的利用Web应用程序模糊测试,进行暴力猜解等.

Repeater

这个翻译过来呢就是<中继器>,此功能用于根据不同的情况修改和发送相同的请求次数并分析

也就是我们截获了一个流量包很重要,要对他进行分析和测试,就可以发送给Repeater来进行重复的测试了

Sequencer

此功能主要用来检查Web应用程序提供的会话令牌的随机性,并执行各种测试

Decoder

翻译过来呢就是<解码>,此功能可用于解码数据找回原来的数据形式,或者进行编码和加密数据

一般用的比较多的还是解码,比如base64或者URL解码

Comparer

此功能用来执行任意的两个请求,响应或任何其它形式的数据之间的比较

高级的功能我们就不一一介绍了,等用到的时候再说,现在我们先进行基础的配置,最起码先能用嘛

说这么多概念性的,休息一下

配置Proxy

这里我们就直接跳过安装了,我们使用的浏览器优先选择火狐

首先我们打开社区版BS

长这样的,后面

这里选择<Next>就行啦

点击<Start Burp>开始我们的旅程

整个界面长这样

我们点开第二个<Proxy>

打开<Option>

在这里确保这个选项被勾上

当然,这里我有个习惯

默认的设置里面是只截Request的,但是我喜欢这里把Response也一起截了

下面的这个是截Request

下面的这个是截Response

注意我圈出来的地方,这里打上勾就是截Response

为啥要截Response呢,因为有时候网站会存在本地验证的漏洞,我们修改服务器返回的Response就可以看到一些我们不应该看到的东西~

到这里好好消化一下~~~

使用BurpSuite

设置好BS之后,我们打开火狐

点击<选项>

在最下面的这里选择<设置>(我这里是最新的火狐)

选择<手动代理配置>,之后填上我们的BS的地址和端口之后就可以了

这里是<127.0.0.1>和<8080>

然后我们就会看到BS里面已经有包过来了

注意那个圈出来的,那个是开关

如果我们先重复这个流量包,我们点击旁边的<Action>

选择<Send to Repeater>就可以重复重复的发送这个包

这里还有一些<Send ...>的选项,以后用到我们再说

解码编码

如果我们要解码一个base64编码,我们可以点这里

这里有三个我们用的比较多的的按钮

一个是

<Decode as ...>

这个是解码的意思

一个是

<Encode as ...>

这个是编码的意思

还有一个是

<Hash ...>

这个是计算Hash的意思

把要<解码/编码>的字符串放在上面的框框里面,点击<解码/编码>之后就可以在下面的框框里面得到结果

暴力破解

我们点击这个<Intruder>

这里的<Target>是目标的信息,<Positions>是攻击载荷在流量包中的位置,比如是在User字段呢还是在Passwd字段

<Payloads>是我们的字典的位置,或者你的攻击脚本的位置,我们可以在这里加载字典

<Options>是设置的地方

这里我们一般在CTF中用不到,但是对于渗透测试来说用处还是比较大的

>>> 下面的内容很重要:

>>> 该技术是面向有CTF比赛或者有合法授权的渗透测试,如若用户自己用于非法途径造成后果,与作者无关

原文发布于微信公众号 - 玄魂工作室(xuanhun521)

原文发表时间:2018-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

了解这15条命令,你将掌握 Linux 文件传输的所有内容

lprm 命令 Linux lprm命令用于将一个工作由打印机贮列中移除 尚未完成的打印机工作会被放在打印机贮列之中,这个命令可用来将常未送到打印机的工作取消。...

3758
来自专栏Debian社区

HAProxy用法详解 最详细中文文档

(1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案...

3333
来自专栏后端技术探索

有赞延迟队列设计

延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢?

1442
来自专栏听雨堂

VPC下访问FTP的问题

        最近用VPC一直用的很爽,用来调试安装包,实在太好用了。但是,最近却遇到一个问题,FTP总是无法正常工作,经过漫长而痛苦的跟踪定位,找到原因: ...

2548
来自专栏后端技术探索

有赞延迟队列设计

延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢?

1741
来自专栏用户2442861的专栏

accept()返回的套接字绑定哪个端口 新旧套接字的联系

摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的。它从内核中取出已经建立的客户连接,然后把...

2523
来自专栏大内老A

使命必达: 深入剖析WCF的可靠会话[协议篇](上)

在《实例篇》中,我通过可靠会话实现了对图片的可靠、有序的传输;在《概念篇》中,我们对可靠消息涉及到的可靠消息传输(RM)的相关概念进行了讲述。在WS-*大家庭中...

19910
来自专栏腾讯Bugly的专栏

dex分包变形记

一、背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败。这一问题意...

43111
来自专栏信安之路

记一次审计 xiaocms 的过程

周末在家刚吃完晚饭,基友 DM 叫我一起来审计 xiaocms 系统,也不知道他是受到啥刺激了。正好,除了 Code Review 公司项目代码及框架代码,未审...

7490
来自专栏大数据和云计算技术

HBase运维实践-聊聊RIT的那点事

相信长时间运维HBase集群的童鞋肯定都会对RIT(Region-In-Transition,很多参考资料误解为Region-In-Transaction,需要...

2624

扫码关注云+社区

领取腾讯云代金券